]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
SDK 5.10 / 6.2 baikal/aarch64 baikal/aarch64/sdk5.10 baikal/aarch64/sdk6.2
authorBaikal Electronics <support@baikalelectronics.ru>
Tue, 27 Jun 2023 22:10:00 +0000 (01:10 +0300)
committerBaikal Electronics <support@baikalelectronics.ru>
Mon, 17 Jul 2023 12:21:01 +0000 (15:21 +0300)
113 files changed:
plat/baikal/bm1000/bm1000_bl1_logo.c [deleted symlink]
plat/baikal/bm1000/bm1000_bl1_logo_v1.c [deleted file]
plat/baikal/bm1000/bm1000_bl1_logo_v2.c [deleted file]
plat/baikal/bm1000/bm1000_bl1_logo_v3.c [deleted file]
plat/baikal/bm1000/bm1000_bl1_logo_v4.c [deleted file]
plat/baikal/bm1000/bm1000_bl1_setup.c
plat/baikal/bm1000/bm1000_bl2_setup.c
plat/baikal/bm1000/bm1000_bl31_sdk_version_logo.c [deleted file]
plat/baikal/bm1000/bm1000_bl31_setup.c
plat/baikal/bm1000/bm1000_font.c [new file with mode: 0644]
plat/baikal/bm1000/bm1000_font.h [new file with mode: 0644]
plat/baikal/bm1000/bm1000_hdmi.h
plat/baikal/bm1000/bm1000_mmavlsp.c
plat/baikal/bm1000/bm1000_mmca57.c
plat/baikal/bm1000/bm1000_mmca57.h
plat/baikal/bm1000/bm1000_mmmali.c
plat/baikal/bm1000/bm1000_mmpcie.c
plat/baikal/bm1000/bm1000_mmusb.c
plat/baikal/bm1000/bm1000_mmvdec.c
plat/baikal/bm1000/bm1000_mmxgbe.c
plat/baikal/bm1000/bm1000_pm.c
plat/baikal/bm1000/bm1000_sip_svc.c
plat/baikal/bm1000/bm1000_splash.c
plat/baikal/bm1000/bm1000_splash.h
plat/baikal/bm1000/bm1000_vdu.h
plat/baikal/bm1000/drivers/bm1000_cmu.c
plat/baikal/bm1000/drivers/bm1000_cmu.h
plat/baikal/bm1000/drivers/bm1000_efuse.c [new file with mode: 0644]
plat/baikal/bm1000/drivers/bm1000_efuse.h [new file with mode: 0644]
plat/baikal/bm1000/drivers/bm1000_scp.c
plat/baikal/bm1000/drivers/bm1000_scp_flash.c
plat/baikal/bm1000/drivers/bm1000_scp_flash.h
plat/baikal/bm1000/drivers/bm1000_smbus.c
plat/baikal/bm1000/drivers/bm1000_smbus.h
plat/baikal/bm1000/drivers/ddr/ddr_baikal.h
plat/baikal/bm1000/drivers/ddr/ddr_init.c
plat/baikal/bm1000/drivers/ddr/ddr_lcru.c
plat/baikal/bm1000/drivers/ddr/ddr_main.c
plat/baikal/bm1000/drivers/ddr/ddr_main.h
plat/baikal/bm1000/drivers/ddr/ddr_master.c
plat/baikal/bm1000/drivers/ddr/ddr_master.h
plat/baikal/bm1000/drivers/ddr/ddr_odt_settings.c
plat/baikal/bm1000/drivers/ddr/ddr_spd.c
plat/baikal/bm1000/drivers/ddr/ddr_spd.h
plat/baikal/bm1000/drivers/mbm_bmc.c [new file with mode: 0644]
plat/baikal/bm1000/drivers/mbm_bmc.h [new file with mode: 0644]
plat/baikal/bm1000/dt.c
plat/baikal/bm1000/include/baikal_def.h
plat/baikal/bm1000/include/bm1000_def.h
plat/baikal/bm1000/include/platform_def.h
plat/baikal/bm1000/platform.mk
plat/baikal/bs1000/bs1000_bl1_setup.c
plat/baikal/bs1000/bs1000_bl2_setup.c
plat/baikal/bs1000/bs1000_bl31_setup.c
plat/baikal/bs1000/bs1000_ca75.c
plat/baikal/bs1000/bs1000_dimm_spd.c
plat/baikal/bs1000/bs1000_dt.c
plat/baikal/bs1000/bs1000_pcie.c
plat/baikal/bs1000/bs1000_pm.c
plat/baikal/bs1000/bs1000_sip_svc.c
plat/baikal/bs1000/drivers/bs1000_cmu.c
plat/baikal/bs1000/drivers/bs1000_gmac.c
plat/baikal/bs1000/drivers/ddr/ddr_bs1000_ctrl.h
plat/baikal/bs1000/drivers/ddr/ddr_ctrl.c
plat/baikal/bs1000/drivers/ddr/ddr_io.c
plat/baikal/bs1000/drivers/ddr/ddr_main.c
plat/baikal/bs1000/drivers/ddr/ddr_main.h
plat/baikal/bs1000/drivers/ddr/ddr_master.c
plat/baikal/bs1000/drivers/ddr/ddr_master.h
plat/baikal/bs1000/drivers/ddr/ddr_misc.c
plat/baikal/bs1000/drivers/ddr/ddr_odt_settings.c
plat/baikal/bs1000/drivers/ddr/ddr_spd.h
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_calc.c
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_init.c
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_load.c
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_main.c
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_main.h
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_misc.c
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_misc.h
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_msgb.c
plat/baikal/bs1000/drivers/ddr/phy/ddr_phy_train_struct.h
plat/baikal/bs1000/include/baikal_def.h
plat/baikal/bs1000/include/bs1000_def.h
plat/baikal/bs1000/include/bs1000_dimm_spd.h
plat/baikal/bs1000/include/platform_def.h
plat/baikal/bs1000/platform.mk
plat/baikal/common/baikal_bl1_stack.c
plat/baikal/common/baikal_bl2_mem_params_desc.c
plat/baikal/common/baikal_bootflash.c
plat/baikal/common/baikal_fdt.c
plat/baikal/common/baikal_gicv3.c
plat/baikal/common/baikal_io_storage.c
plat/baikal/common/baikal_mshc.c [new file with mode: 0644]
plat/baikal/common/baikal_pvt.c
plat/baikal/common/baikal_sip_svc_flash.c
plat/baikal/common/bl1.ld.S
plat/baikal/common/crc.c
plat/baikal/common/dw_gpio.c
plat/baikal/common/dw_i2c.c
plat/baikal/common/dw_spi_flash.c
plat/baikal/common/include/baikal_bootflash.h
plat/baikal/common/include/baikal_fdt.h
plat/baikal/common/include/baikal_mshc.h [new file with mode: 0644]
plat/baikal/common/include/baikal_pvt.h
plat/baikal/common/include/baikal_sip_svc.h
plat/baikal/common/include/dw_gpio.h
plat/baikal/common/include/dw_i2c.h
plat/baikal/common/include/dw_spi_flash.h
plat/baikal/common/include/memtest.h
plat/baikal/common/include/spd.h
plat/baikal/common/memtest.c
plat/baikal/common/ndelay.c
plat/baikal/common/spd.c

diff --git a/plat/baikal/bm1000/bm1000_bl1_logo.c b/plat/baikal/bm1000/bm1000_bl1_logo.c
deleted file mode 120000 (symlink)
index 42e728e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-bm1000_bl1_logo_v4.c
\ No newline at end of file
diff --git a/plat/baikal/bm1000/bm1000_bl1_logo_v1.c b/plat/baikal/bm1000/bm1000_bl1_logo_v1.c
deleted file mode 100644 (file)
index 6d27b58..0000000
+++ /dev/null
@@ -1,888 +0,0 @@
-/*
- * Copyright (c) 2020, Baikal Electronics, JSC. All rights reserved.
- *
- * Author: Pavel Parkhomenko <pavel.parkhomenko@baikalelectronics.ru>
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/*
- * To change a logo, replace array contents below with a BMP file dump.
- * Source BMP file have to be of 16-bpp color format (RGB565).
- * Optimal size is 72x72 pixels (or 64x84 pixels for wide displays).
- */
-
-#if !DEBUG
-const unsigned char bl1_logo[] = {
-  0x42, 0x4d, 0xc6, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00,
-  0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x00,
-  0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x80, 0x28,
-  0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xe0, 0x07,
-  0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x62, 0x08, 0xe4, 0x10, 0x86, 0x21, 0x6a, 0x2a,
-  0xab, 0x32, 0xc7, 0x21, 0xc3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x82, 0x08, 0x27, 0x2a, 0x6c, 0x43, 0xad, 0x43, 0x6d, 0x43,
-  0x2c, 0x3b, 0xeb, 0x3a, 0x8a, 0x32, 0xe8, 0x21, 0x25, 0x19, 0x41, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x41, 0x08,
-  0x82, 0x08, 0x82, 0x08, 0x82, 0x08, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0xe3, 0x10, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x66, 0x19,
-  0x49, 0x2a, 0x0d, 0x3b, 0x8f, 0x43, 0x6f, 0x43, 0x0d, 0x3b, 0xac, 0x32,
-  0x8c, 0x32, 0x6b, 0x2a, 0x4b, 0x2a, 0xad, 0x32, 0x2b, 0x2a, 0x05, 0x11,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x67, 0x32, 0x2a, 0x3b, 0xed, 0x4b,
-  0x6e, 0x54, 0x4e, 0x54, 0x0e, 0x4c, 0xee, 0x4b, 0xee, 0x4b, 0xce, 0x4b,
-  0xce, 0x4b, 0xef, 0x4b, 0xef, 0x4b, 0x6d, 0x43, 0xab, 0x32, 0xc7, 0x21,
-  0xc3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x11,
-  0x6a, 0x43, 0x87, 0x32, 0x84, 0x19, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x08,
-  0x45, 0x19, 0x09, 0x2a, 0xcc, 0x32, 0x2e, 0x3b, 0x90, 0x43, 0xd1, 0x43,
-  0xd2, 0x4b, 0xb1, 0x43, 0xd2, 0x43, 0x92, 0x43, 0x51, 0x3b, 0x10, 0x3b,
-  0x8d, 0x32, 0xea, 0x21, 0x47, 0x19, 0xa3, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x08,
-  0x23, 0x19, 0x06, 0x2a, 0x09, 0x3b, 0x2d, 0x54, 0xf0, 0x64, 0x4e, 0x54,
-  0x8c, 0x43, 0x2b, 0x3b, 0xea, 0x3a, 0x89, 0x32, 0x89, 0x32, 0x89, 0x32,
-  0xca, 0x32, 0xeb, 0x3a, 0x4d, 0x43, 0xcf, 0x4b, 0x10, 0x4c, 0x2d, 0x3b,
-  0x49, 0x2a, 0x66, 0x19, 0xa3, 0x10, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
-  0x83, 0x08, 0x06, 0x11, 0xa9, 0x21, 0x6d, 0x2a, 0x12, 0x3b, 0xeb, 0x21,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc5, 0x21, 0x0b, 0x54, 0x6a, 0x43, 0xc8, 0x3a,
-  0x06, 0x2a, 0x23, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xa2, 0x10, 0x04, 0x11, 0x65, 0x19, 0x85, 0x21, 0x85, 0x21, 0x86, 0x21,
-  0x24, 0x19, 0x04, 0x11, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x08, 0x25, 0x11, 0xc8, 0x21, 0x4a, 0x2a, 0xac, 0x32, 0xcd, 0x32,
-  0xcd, 0x32, 0xcd, 0x32, 0xad, 0x32, 0xad, 0x32, 0x6c, 0x2a, 0x0a, 0x22,
-  0x88, 0x21, 0x05, 0x11, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x84, 0x21, 0x84, 0x21, 0xe5, 0x21, 0x67, 0x32,
-  0x09, 0x3b, 0x0c, 0x4c, 0x0f, 0x65, 0xef, 0x5c, 0xcc, 0x4b, 0x0a, 0x3b,
-  0x68, 0x2a, 0xe6, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x19, 0xf0, 0x4b,
-  0xb0, 0x43, 0xcc, 0x32, 0x09, 0x2a, 0x87, 0x21, 0x25, 0x19, 0xe4, 0x10,
-  0xe4, 0x10, 0xe4, 0x10, 0xe4, 0x10, 0xc4, 0x10, 0x26, 0x11, 0x67, 0x19,
-  0xc9, 0x21, 0x6c, 0x2a, 0xf0, 0x3a, 0x73, 0x3b, 0xaf, 0x32, 0x2c, 0x2a,
-  0xaa, 0x21, 0x68, 0x19, 0x07, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00,
-  0x08, 0x3b, 0xe8, 0x3a, 0xc7, 0x3a, 0x67, 0x32, 0x06, 0x2a, 0x64, 0x19,
-  0xa2, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x19, 0x06, 0x22,
-  0x68, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x21, 0x00, 0xe4, 0x10, 0x46, 0x19, 0xa7, 0x21, 0xc8, 0x21,
-  0xe9, 0x21, 0xe9, 0x21, 0xe9, 0x21, 0xa8, 0x21, 0x87, 0x19, 0x26, 0x19,
-  0xa3, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x08, 0x06, 0x11,
-  0x68, 0x19, 0xaa, 0x21, 0xec, 0x21, 0x48, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x43,
-  0x48, 0x43, 0x28, 0x43, 0x28, 0x43, 0x69, 0x43, 0xca, 0x4b, 0x6c, 0x54,
-  0x2f, 0x65, 0x50, 0x6d, 0x8e, 0x5c, 0x6b, 0x43, 0xa9, 0x32, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x8b, 0x32, 0x0d, 0x3b, 0x8c, 0x32, 0x4a, 0x2a,
-  0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2a, 0x6c, 0x2a, 0xae, 0x32,
-  0x10, 0x3b, 0x93, 0x43, 0x32, 0x3b, 0x8e, 0x2a, 0xca, 0x21, 0x47, 0x19,
-  0xc5, 0x10, 0x83, 0x08, 0x41, 0x00, 0x42, 0x08, 0x21, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x63, 0x19, 0x43, 0x19,
-  0xa4, 0x21, 0x84, 0x21, 0x23, 0x19, 0x03, 0x11, 0xa2, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x03, 0x11, 0x27, 0x2a, 0xe6, 0x21, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x08, 0xe4, 0x10,
-  0xe4, 0x10, 0x05, 0x11, 0xe4, 0x10, 0xc4, 0x10, 0x83, 0x08, 0x21, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x62, 0x08, 0x06, 0x11, 0xa9, 0x21, 0x2d, 0x2a,
-  0x8f, 0x32, 0xd1, 0x32, 0xf2, 0x32, 0xf3, 0x3a, 0xf3, 0x32, 0xb2, 0x32,
-  0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc2, 0x10, 0xee, 0x75, 0xae, 0x75, 0x4d, 0x6d,
-  0x4d, 0x65, 0x2d, 0x65, 0x2e, 0x65, 0x8f, 0x6d, 0x6f, 0x6d, 0x4f, 0x6d,
-  0x2f, 0x65, 0x4d, 0x54, 0x2a, 0x3b, 0x85, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0xcd, 0x32,
-  0x91, 0x43, 0x71, 0x43, 0x71, 0x43, 0x92, 0x43, 0x92, 0x43, 0x92, 0x43,
-  0x72, 0x43, 0x10, 0x3b, 0x4d, 0x2a, 0xa9, 0x21, 0xe5, 0x10, 0x62, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xe3, 0x10, 0xe6, 0x21, 0x2a, 0x3b, 0xe3, 0x10, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x62, 0x08, 0xe5, 0x10, 0xa9, 0x21, 0x4d, 0x2a, 0xf1, 0x32, 0x33, 0x3b,
-  0x13, 0x3b, 0x13, 0x3b, 0x13, 0x3b, 0xb1, 0x32, 0xb2, 0x32, 0xb2, 0x32,
-  0xd3, 0x32, 0x71, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x8a, 0x5c, 0x6d, 0x6d, 0xce, 0x75, 0xae, 0x75, 0xae, 0x6d,
-  0xae, 0x6d, 0x8e, 0x6d, 0x6f, 0x6d, 0x6f, 0x6d, 0x4f, 0x6d, 0xad, 0x5c,
-  0xcb, 0x4b, 0xe9, 0x3a, 0x44, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x62, 0x08, 0x2f, 0x3b, 0xb2, 0x43, 0x92, 0x43, 0x51, 0x3b,
-  0xae, 0x32, 0x2c, 0x2a, 0x68, 0x19, 0xa4, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x62, 0x08, 0x84, 0x08, 0xa4, 0x08, 0x84, 0x08, 0x84, 0x08,
-  0x84, 0x08, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x45, 0x32, 0x07, 0x3b, 0x04, 0x2a, 0x43, 0x19, 0x02, 0x11, 0xa1, 0x08,
-  0xa2, 0x08, 0xa2, 0x08, 0xc2, 0x10, 0x03, 0x11, 0x84, 0x21, 0x26, 0x2a,
-  0xe9, 0x3a, 0x0c, 0x4c, 0x06, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x10, 0x05, 0x11, 0x46, 0x19,
-  0xa9, 0x21, 0x4c, 0x2a, 0xd0, 0x32, 0x52, 0x3b, 0x32, 0x3b, 0x12, 0x3b,
-  0xb0, 0x32, 0x6f, 0x2a, 0x2d, 0x2a, 0x0d, 0x22, 0x0d, 0x22, 0x0d, 0x22,
-  0x0d, 0x22, 0x2f, 0x2a, 0x71, 0x2a, 0x4a, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x10,
-  0x45, 0x32, 0x47, 0x43, 0x09, 0x4c, 0x8b, 0x5c, 0xcc, 0x5c, 0x2d, 0x65,
-  0x2d, 0x65, 0x0d, 0x65, 0xcd, 0x5c, 0x6c, 0x54, 0xeb, 0x4b, 0x49, 0x43,
-  0x67, 0x32, 0x64, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x4c, 0x2a,
-  0xea, 0x21, 0x26, 0x19, 0x83, 0x08, 0x00, 0x00, 0x42, 0x08, 0xe5, 0x10,
-  0x47, 0x19, 0x89, 0x19, 0xaa, 0x21, 0xaa, 0x21, 0xab, 0x21, 0x8a, 0x19,
-  0x8a, 0x19, 0x49, 0x19, 0x07, 0x11, 0xc5, 0x10, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0d, 0x7e,
-  0xed, 0x75, 0xeb, 0x64, 0x29, 0x54, 0x68, 0x43, 0x07, 0x3b, 0xa7, 0x32,
-  0xa7, 0x32, 0xa7, 0x32, 0xc8, 0x3a, 0x08, 0x3b, 0x8a, 0x43, 0x2c, 0x54,
-  0xee, 0x5c, 0x50, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x0b, 0x22, 0x72, 0x43, 0x52, 0x3b, 0x32, 0x3b, 0xf1, 0x32, 0x6e, 0x2a,
-  0xeb, 0x21, 0xaa, 0x21, 0x69, 0x19, 0x48, 0x19, 0x27, 0x19, 0x49, 0x19,
-  0x49, 0x19, 0x8a, 0x19, 0xac, 0x21, 0x0f, 0x22, 0x51, 0x2a, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x08, 0xe2, 0x10,
-  0xe2, 0x10, 0xc4, 0x21, 0x86, 0x32, 0x07, 0x3b, 0x88, 0x43, 0x89, 0x43,
-  0xea, 0x4b, 0x89, 0x43, 0x69, 0x43, 0x08, 0x3b, 0x87, 0x32, 0xc5, 0x21,
-  0xe3, 0x10, 0xa2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x83, 0x08, 0x05, 0x11, 0x89, 0x19, 0x0c, 0x22,
-  0x6e, 0x2a, 0xb0, 0x32, 0xb1, 0x32, 0xb1, 0x32, 0xd2, 0x32, 0x91, 0x32,
-  0x91, 0x2a, 0x2f, 0x2a, 0xee, 0x21, 0x8b, 0x19, 0x08, 0x11, 0x21, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x19, 0xac, 0x75, 0xec, 0x75,
-  0xcd, 0x75, 0xcd, 0x75, 0xad, 0x6d, 0x8d, 0x6d, 0x2c, 0x65, 0xcc, 0x5c,
-  0xac, 0x5c, 0x8c, 0x5c, 0xed, 0x64, 0x0e, 0x65, 0x2e, 0x65, 0x0f, 0x65,
-  0x2f, 0x65, 0x0c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc1, 0x10, 0x49, 0x6d, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x0b, 0x22, 0x2c, 0x2a, 0x89, 0x19,
-  0x26, 0x11, 0xc5, 0x10, 0xa4, 0x08, 0x83, 0x08, 0x83, 0x08, 0x83, 0x08,
-  0xa4, 0x08, 0xc5, 0x10, 0x07, 0x11, 0x6a, 0x19, 0xcd, 0x21, 0x72, 0x2a,
-  0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x54, 0xa7, 0x4b, 0x45, 0x2a,
-  0x63, 0x21, 0x83, 0x21, 0x84, 0x21, 0xa4, 0x21, 0x05, 0x2a, 0x25, 0x2a,
-  0x25, 0x2a, 0x25, 0x2a, 0xe5, 0x29, 0x84, 0x21, 0x64, 0x19, 0x64, 0x19,
-  0x64, 0x19, 0x44, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x4a, 0x7e, 0xeb, 0x75, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x11, 0x12, 0x3b,
-  0x12, 0x3b, 0xf2, 0x32, 0xf2, 0x32, 0xd2, 0x32, 0xd2, 0x32, 0xb2, 0x32,
-  0xb2, 0x32, 0x92, 0x32, 0x92, 0x32, 0x72, 0x2a, 0xee, 0x21, 0x6a, 0x19,
-  0x84, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xe2, 0x10, 0xc6, 0x3a, 0xe8, 0x4b, 0x2b, 0x6d,
-  0xcc, 0x75, 0xad, 0x6d, 0x8d, 0x6d, 0x8d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d,
-  0x4d, 0x6d, 0x4e, 0x6d, 0x2e, 0x65, 0x2e, 0x65, 0x2e, 0x65, 0x0e, 0x65,
-  0x0f, 0x65, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0xac, 0x6d, 0x0a, 0x4c, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x83, 0x08, 0xe6, 0x10, 0xa4, 0x08, 0xe6, 0x10, 0xe6, 0x10, 0xc5, 0x10,
-  0xc5, 0x10, 0xa5, 0x10, 0xa5, 0x10, 0xc5, 0x10, 0x29, 0x19, 0xad, 0x21,
-  0x52, 0x2a, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xe9, 0x64, 0xec, 0x75, 0xac, 0x75, 0x49, 0x54,
-  0x07, 0x3b, 0x25, 0x2a, 0x45, 0x2a, 0x25, 0x2a, 0x25, 0x2a, 0x45, 0x2a,
-  0x05, 0x2a, 0x25, 0x2a, 0x05, 0x2a, 0x06, 0x2a, 0x06, 0x2a, 0x06, 0x2a,
-  0xc8, 0x32, 0xe9, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x0d, 0x65,
-  0x44, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x89, 0x19, 0x13, 0x3b, 0xd2, 0x32, 0xb2, 0x32, 0xb2, 0x32,
-  0xb2, 0x32, 0x92, 0x32, 0x92, 0x32, 0x72, 0x2a, 0x72, 0x2a, 0x31, 0x2a,
-  0xad, 0x21, 0xa5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xa5, 0x32, 0x65, 0x32, 0x85, 0x32, 0xa8, 0x4b,
-  0xea, 0x64, 0xad, 0x75, 0x8d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x4d, 0x6d,
-  0x4d, 0x6d, 0x2d, 0x65, 0x2e, 0x65, 0x2e, 0x65, 0x0e, 0x65, 0x0e, 0x65,
-  0x2c, 0x54, 0x88, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0x0f, 0x65, 0xe9, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc4, 0x10, 0xab, 0x21, 0x89, 0x19, 0x69, 0x19,
-  0x48, 0x19, 0x07, 0x11, 0x07, 0x11, 0x07, 0x11, 0xe7, 0x10, 0x08, 0x11,
-  0x8c, 0x21, 0x11, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x87, 0x4b, 0x0c, 0x7e, 0xcb, 0x75, 0xcc, 0x75, 0xcc, 0x75,
-  0x4b, 0x6d, 0x29, 0x54, 0x68, 0x43, 0xc7, 0x3a, 0xe7, 0x3a, 0xc7, 0x3a,
-  0x66, 0x32, 0xc7, 0x3a, 0xa7, 0x32, 0xa7, 0x32, 0x29, 0x43, 0xeb, 0x4b,
-  0xce, 0x5c, 0xec, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x8e, 0x5c, 0x2e, 0x54, 0xa2, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0x90, 0x2a, 0x70, 0x2a,
-  0x70, 0x2a, 0x92, 0x32, 0x92, 0x2a, 0x72, 0x2a, 0x52, 0x2a, 0x52, 0x2a,
-  0x52, 0x2a, 0x11, 0x2a, 0xa6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xe7, 0x4b, 0x26, 0x43, 0x06, 0x3b, 0x06, 0x3b, 0xe6, 0x3a,
-  0x67, 0x43, 0x69, 0x54, 0x0b, 0x65, 0x6d, 0x6d, 0x4d, 0x6d, 0x4d, 0x6d,
-  0x4d, 0x6d, 0x2d, 0x65, 0x2d, 0x65, 0x0e, 0x65, 0x6c, 0x54, 0xab, 0x4b,
-  0xc8, 0x3a, 0x06, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x54, 0x4e, 0x54, 0x70, 0x54, 0x28, 0x2a, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x10, 0x91, 0x2a,
-  0x2f, 0x2a, 0xed, 0x21, 0x8b, 0x21, 0x49, 0x19, 0x49, 0x19, 0x29, 0x19,
-  0x29, 0x19, 0x6b, 0x19, 0x8d, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x22, 0x19, 0x4a, 0x6d, 0xcb, 0x75, 0xcb, 0x75, 0xab, 0x6d, 0x8b, 0x6d,
-  0x6c, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0xce, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0x10, 0x4c, 0x4e, 0x43,
-  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x10,
-  0xcc, 0x21, 0xed, 0x21, 0x2f, 0x2a, 0x72, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x46, 0x43, 0xcb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0xd1, 0x4b, 0x66, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xe7, 0x10, 0x00, 0x00, 0x00, 0x00,
-  0x09, 0x65, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x43,
-  0x6f, 0x43, 0x71, 0x43, 0x8d, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x49, 0x19, 0x71, 0x32, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x6c, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x2b, 0x7e, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0x70, 0x43, 0x50, 0x43, 0x30, 0x3b, 0x11, 0x3b, 0xc5, 0x10, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x92, 0x32, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xf1, 0x29, 0x00, 0x00, 0x02, 0x19,
-  0x0b, 0x7e, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0x70, 0x43, 0x50, 0x43, 0x10, 0x3b, 0xf0, 0x3a, 0xf2, 0x3a, 0xcb, 0x21,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x2f, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0x21, 0x00, 0x44, 0x2a,
-  0xea, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0x70, 0x43, 0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0xb0, 0x32, 0x91, 0x32,
-  0x50, 0x32, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x8a, 0x19, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x12, 0x2a, 0x84, 0x08, 0x25, 0x43,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0x70, 0x43, 0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0xb0, 0x32, 0x90, 0x32,
-  0x71, 0x32, 0x52, 0x2a, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x28, 0x19, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xc7, 0x10, 0xc7, 0x4b,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0x70, 0x43, 0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0xb0, 0x32, 0x90, 0x32,
-  0x51, 0x32, 0x52, 0x2a, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x07, 0x11, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x09, 0x19, 0x48, 0x54,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0x70, 0x43, 0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0xb0, 0x32, 0x90, 0x32,
-  0x92, 0x32, 0x6a, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x28, 0x19, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x4b, 0x19, 0xa8, 0x5c,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0x70, 0x43, 0x50, 0x43, 0x10, 0x3b, 0xf0, 0x3a, 0xd1, 0x3a, 0x4f, 0x2a,
-  0x63, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xac, 0x21, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x6c, 0x19, 0xa8, 0x5c,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x4b,
-  0x6f, 0x43, 0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0x06, 0x11, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x8d, 0x21, 0xa8, 0x5c,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xaf, 0x43,
-  0x90, 0x43, 0x91, 0x43, 0xc9, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x84, 0x08, 0x92, 0x32, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x8d, 0x21, 0xc8, 0x5c,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xef, 0x4b, 0xf1, 0x4b,
-  0xac, 0x32, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xed, 0x21, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x6c, 0x19, 0x48, 0x54,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x6e, 0x54, 0x4e, 0x54, 0x4f, 0x54, 0x8e, 0x43, 0xa3, 0x10,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x08,
-  0xb2, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x4b, 0x19, 0xc7, 0x4b,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xad, 0x5c, 0x8e, 0x5c, 0x6f, 0x54, 0x85, 0x21, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x2a, 0x19, 0x26, 0x43,
-  0xca, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0x0f, 0x65, 0x88, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x2a, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xe7, 0x10, 0x64, 0x32,
-  0xea, 0x75, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0x8b, 0x6d, 0x6c, 0x6d, 0x8d, 0x6d, 0xaa, 0x4b,
-  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x2a, 0xb1, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x12, 0x2a, 0x85, 0x08, 0x22, 0x19,
-  0x0b, 0x7e, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x2a, 0x7e, 0xeb, 0x75, 0xea, 0x64, 0x02, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x21, 0x00, 0x90, 0x2a, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x12, 0x2a, 0x21, 0x00, 0x00, 0x00,
-  0x4b, 0x7e, 0xaa, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x19, 0x4b, 0x7e, 0x24, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x48, 0x19, 0xf2, 0x32, 0xb1, 0x32, 0x90, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x12, 0x2a, 0x00, 0x00, 0x00, 0x00,
-  0x09, 0x65, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x81, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x10, 0xb0, 0x32,
-  0xd1, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x8d, 0x21, 0x00, 0x00, 0x00, 0x00,
-  0x46, 0x43, 0xcb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0x6d, 0x2a, 0x11, 0x3b, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00,
-  0x62, 0x19, 0xeb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xea, 0x21, 0x32, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xcb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x19,
-  0x31, 0x3b, 0x11, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0xf0, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x87, 0x4b, 0xab, 0x75, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x10, 0x10, 0x3b, 0x31, 0x3b,
-  0x10, 0x3b, 0x10, 0x33, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x31, 0x2a, 0x09, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xc1, 0x10, 0x0b, 0x76, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x61, 0x08, 0xad, 0x32, 0x71, 0x43, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x52, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc9, 0x64, 0x8b, 0x6d, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x2a, 0x2a, 0x91, 0x43, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x8c, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc3, 0x21, 0xcb, 0x75, 0x6b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x19, 0x91, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x52, 0x2a, 0x63, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x64, 0x8b, 0x6d, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xe4, 0x10, 0x6f, 0x43, 0x90, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a,
-  0xad, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x19, 0xec, 0x75, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x08, 0xed, 0x3a, 0xd1, 0x4b, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x52, 0x2a,
-  0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x54, 0x6b, 0x6d,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x2a,
-  0x11, 0x4c, 0xb0, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x6b, 0x19,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xcc, 0x75,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x21, 0xf0, 0x4b, 0xd0, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2a,
-  0xac, 0x75, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x04, 0x11, 0xae, 0x43, 0x10, 0x4c, 0xcf, 0x4b, 0xaf, 0x43,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x92, 0x32, 0x84, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x09, 0x54, 0x6c, 0x6d, 0x2c, 0x65, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x71, 0x54, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x71, 0x32, 0x6a, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x0b, 0x65, 0x4c, 0x6d, 0x2c, 0x65, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x71, 0x2a, 0x0f, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x40, 0x08, 0x6c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x71, 0x2a, 0x70, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xa1, 0x08, 0x6d, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x10, 0x4d, 0x6d, 0x0c, 0x65,
-  0x0c, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x32,
-  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x08, 0x2d, 0x65,
-  0x0d, 0x65, 0xed, 0x64, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x90, 0x32, 0x21, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
-  0xac, 0x5c, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x4f, 0x2a, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xa9, 0x4b, 0x2e, 0x65, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xf2, 0x32, 0xab, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc5, 0x21, 0x2e, 0x65, 0xcd, 0x5c, 0xad, 0x5c,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd1, 0x32,
-  0xd1, 0x32, 0xc5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x8a, 0x43, 0x0e, 0x65,
-  0xae, 0x5c, 0xab, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0x12, 0x3b, 0xeb, 0x21,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x19,
-  0x2c, 0x54, 0xec, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0x31, 0x3b, 0x8e, 0x2a, 0x62, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x03, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x52, 0x3b, 0x6d, 0x2a, 0xa4, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x4c, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x71, 0x43, 0x10, 0x3b, 0xc9, 0x21,
-  0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0x30, 0x54, 0xef, 0x4b, 0xef, 0x4b, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x43, 0xb0, 0x43, 0xb0, 0x43, 0x90, 0x43, 0x90, 0x43, 0xb1, 0x43,
-  0xb1, 0x43, 0xcd, 0x32, 0xc9, 0x21, 0xa3, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x62, 0x08, 0xaa, 0x32, 0xcb, 0x32, 0x0c, 0x3b, 0x0c, 0x3b, 0x0c, 0x3b,
-  0xec, 0x3a, 0xab, 0x32, 0x4a, 0x2a, 0xe8, 0x21, 0x46, 0x19, 0x83, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-#endif
diff --git a/plat/baikal/bm1000/bm1000_bl1_logo_v2.c b/plat/baikal/bm1000/bm1000_bl1_logo_v2.c
deleted file mode 100644 (file)
index 1e37b08..0000000
+++ /dev/null
@@ -1,920 +0,0 @@
-/*
- * Copyright (c) 2020, Baikal Electronics, JSC. All rights reserved.
- *
- * Author: Pavel Parkhomenko <pavel.parkhomenko@baikalelectronics.ru>
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/*
- * To change a logo, replace array contents below with a BMP file dump.
- * Source BMP file have to be of 16-bpp color format (RGB565).
- * Optimal size is 72x72 pixels (or 64x84 pixels for wide displays).
- */
-
-#if !DEBUG
-const unsigned char bl1_logo[] = {
-  0x42, 0x4d, 0x46, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00,
-  0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x54, 0x00,
-  0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x2a,
-  0x00, 0x00, 0x46, 0x5c, 0x00, 0x00, 0x46, 0x5c, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xe0, 0x07,
-  0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x82, 0x08,
-  0xe4, 0x10, 0xa7, 0x21, 0x29, 0x2a, 0x45, 0x19, 0x61, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x27, 0x2a, 0x0e, 0x4c, 0x2f, 0x4c,
-  0x0f, 0x4c, 0xef, 0x4b, 0xef, 0x4b, 0x8e, 0x43, 0x69, 0x2a, 0xe3, 0x10,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x41, 0x08, 0x41, 0x08, 0x41, 0x08, 0x41, 0x08, 0x21, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x86, 0x21,
-  0xab, 0x32, 0x0e, 0x3b, 0x2e, 0x3b, 0x2f, 0x3b, 0x2f, 0x3b, 0x2f, 0x3b,
-  0xce, 0x32, 0x47, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x85, 0x19, 0x6b, 0x43, 0xe9, 0x3a, 0x27, 0x2a, 0xa5, 0x21, 0x44, 0x19,
-  0x44, 0x19, 0x24, 0x19, 0x24, 0x19, 0x45, 0x19, 0xa6, 0x21, 0x29, 0x2a,
-  0xeb, 0x3a, 0x6e, 0x43, 0x0c, 0x3b, 0x29, 0x2a, 0x66, 0x19, 0xe4, 0x10,
-  0x83, 0x08, 0x62, 0x08, 0x41, 0x08, 0x41, 0x08, 0x83, 0x08, 0xc4, 0x10,
-  0x83, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08,
-  0x85, 0x21, 0xa9, 0x32, 0x4b, 0x43, 0xad, 0x43, 0xad, 0x4b, 0xad, 0x43,
-  0x8d, 0x43, 0x4c, 0x43, 0xaa, 0x32, 0xc7, 0x21, 0xa3, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x62, 0x08, 0x82, 0x08, 0x82, 0x08,
-  0x83, 0x08, 0x83, 0x08, 0x62, 0x08, 0x62, 0x08, 0x41, 0x08, 0x20, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x2a,
-  0xae, 0x5c, 0xec, 0x4b, 0x27, 0x2a, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x19, 0xab, 0x32, 0x8f, 0x43,
-  0x8f, 0x43, 0x90, 0x43, 0x90, 0x43, 0x70, 0x43, 0x0e, 0x3b, 0x30, 0x3b,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x8e, 0x32, 0x88, 0x19,
-  0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x08, 0xe3, 0x10, 0x85, 0x21,
-  0xc9, 0x3a, 0x4d, 0x54, 0x6e, 0x54, 0xed, 0x4b, 0x8c, 0x43, 0x4b, 0x43,
-  0x0b, 0x3b, 0x0b, 0x3b, 0x0b, 0x3b, 0x2c, 0x3b, 0x6d, 0x43, 0xcf, 0x4b,
-  0xcf, 0x4b, 0xab, 0x32, 0x66, 0x19, 0xc3, 0x10, 0x62, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x00, 0x83, 0x08, 0x05, 0x11, 0xca, 0x21, 0xaf, 0x32, 0x0c, 0x22,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x10, 0x08, 0x3b,
-  0xc8, 0x32, 0xe5, 0x21, 0x44, 0x19, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x03, 0x11, 0x85, 0x21, 0xc6, 0x21, 0x07, 0x2a, 0x07, 0x2a,
-  0xe7, 0x21, 0x85, 0x19, 0x04, 0x11, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0xe4, 0x10, 0x66, 0x19, 0xe9, 0x21, 0x6b, 0x2a, 0x6b, 0x2a,
-  0x6b, 0x2a, 0x4b, 0x2a, 0x4b, 0x2a, 0xc9, 0x21, 0x47, 0x19, 0xc4, 0x10,
-  0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x46, 0x2a, 0x29, 0x3b, 0xaa, 0x4b, 0x6d, 0x54,
-  0x8d, 0x5c, 0xae, 0x5c, 0x6e, 0x54, 0x2a, 0x3b, 0xc5, 0x21, 0x82, 0x08,
-  0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x08, 0x2a, 0x8f, 0x43, 0xaf, 0x43, 0x8f, 0x43,
-  0x4e, 0x3b, 0xac, 0x32, 0x2a, 0x2a, 0x09, 0x22, 0xe9, 0x21, 0xe9, 0x21,
-  0xea, 0x21, 0x6c, 0x2a, 0xcf, 0x32, 0xf0, 0x3a, 0xf0, 0x3a, 0xf0, 0x3a,
-  0x0c, 0x2a, 0x26, 0x11, 0x63, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00,
-  0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08,
-  0x24, 0x19, 0xa8, 0x32, 0x0d, 0x4c, 0x8f, 0x5c, 0x24, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x82, 0x08, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xa4, 0x10, 0xa9, 0x21, 0x6e, 0x2a,
-  0xf2, 0x32, 0xf2, 0x32, 0x2d, 0x22, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xc2, 0x10, 0x2a, 0x54, 0x8e, 0x6d, 0x6e, 0x6d, 0x4e, 0x6d,
-  0xee, 0x64, 0x4c, 0x54, 0x4a, 0x43, 0x67, 0x2a, 0x44, 0x19, 0x20, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x46, 0x19, 0x4e, 0x3b, 0x90, 0x43, 0xd1, 0x43, 0xb1, 0x43,
-  0xb1, 0x43, 0x91, 0x43, 0x91, 0x43, 0x51, 0x3b, 0xcf, 0x32, 0x2c, 0x2a,
-  0x88, 0x19, 0xe5, 0x10, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x42, 0x08, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08,
-  0xe2, 0x10, 0xc2, 0x10, 0xa2, 0x10, 0x03, 0x11, 0xa4, 0x21, 0x87, 0x32,
-  0xab, 0x4b, 0x2d, 0x54, 0x8e, 0x5c, 0xef, 0x5c, 0x85, 0x21, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
-  0x25, 0x11, 0x45, 0x19, 0xa3, 0x08, 0x82, 0x08, 0x82, 0x08, 0x82, 0x08,
-  0xa3, 0x08, 0x05, 0x11, 0xa9, 0x21, 0x6c, 0x2a, 0xae, 0x32, 0xf0, 0x32,
-  0x11, 0x3b, 0xd0, 0x32, 0x2c, 0x2a, 0xaa, 0x21, 0x68, 0x19, 0x28, 0x19,
-  0xc5, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x84, 0x21, 0xe7, 0x3a, 0x28, 0x43, 0x89, 0x4b,
-  0x08, 0x3b, 0xa7, 0x32, 0x06, 0x2a, 0x03, 0x11, 0x00, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x81, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x10,
-  0xe8, 0x21, 0x2a, 0x2a, 0x6b, 0x2a, 0x0a, 0x22, 0xc9, 0x21, 0x67, 0x19,
-  0xa3, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x08, 0x68, 0x19,
-  0x0c, 0x22, 0x6f, 0x2a, 0xb1, 0x32, 0xb1, 0x32, 0xb2, 0x32, 0x07, 0x11,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x21,
-  0xad, 0x75, 0x4d, 0x6d, 0xec, 0x64, 0xed, 0x64, 0xcd, 0x64, 0x2e, 0x65,
-  0x2e, 0x65, 0x0e, 0x65, 0xce, 0x5c, 0x2c, 0x54, 0x09, 0x3b, 0xc2, 0x10,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x21, 0x2f, 0x3b,
-  0x50, 0x3b, 0x30, 0x3b, 0x71, 0x43, 0x71, 0x43, 0x51, 0x3b, 0x31, 0x3b,
-  0xae, 0x32, 0x2c, 0x2a, 0x68, 0x19, 0xa4, 0x10, 0x21, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x10,
-  0xc5, 0x21, 0x09, 0x3b, 0xa8, 0x32, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x62, 0x08, 0x26, 0x19, 0xea, 0x21, 0x6d, 0x2a,
-  0xd0, 0x32, 0x12, 0x3b, 0xf2, 0x3a, 0xf2, 0x32, 0xb1, 0x32, 0x90, 0x32,
-  0x90, 0x32, 0xb2, 0x32, 0x2f, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xa6, 0x3a, 0xcb, 0x64, 0x4d, 0x6d, 0x4d, 0x65, 0x2d, 0x65, 0x2d, 0x65,
-  0x0d, 0x65, 0x0d, 0x65, 0xee, 0x64, 0xeb, 0x4b, 0x67, 0x32, 0xc2, 0x10,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xe4, 0x10, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b,
-  0xae, 0x32, 0xa9, 0x21, 0x83, 0x08, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08,
-  0xe5, 0x10, 0x48, 0x19, 0x8a, 0x21, 0x8a, 0x19, 0x8a, 0x19, 0x6a, 0x19,
-  0x28, 0x11, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x21, 0x8c, 0x6d, 0x0b, 0x65,
-  0x09, 0x54, 0x68, 0x43, 0x08, 0x3b, 0x08, 0x3b, 0x28, 0x3b, 0x89, 0x43,
-  0x2b, 0x54, 0xee, 0x64, 0xef, 0x64, 0x4d, 0x54, 0x44, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x82, 0x08, 0x6c, 0x2a, 0xae, 0x32, 0x31, 0x3b, 0x31, 0x3b,
-  0x11, 0x3b, 0xd0, 0x32, 0x8f, 0x32, 0x4d, 0x2a, 0xca, 0x21, 0x48, 0x19,
-  0x06, 0x11, 0xe6, 0x10, 0xe6, 0x10, 0x07, 0x11, 0x29, 0x19, 0x8b, 0x19,
-  0x63, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x61, 0x08, 0x61, 0x08, 0xc2, 0x10, 0x63, 0x19, 0xc4, 0x21,
-  0x05, 0x2a, 0x05, 0x2a, 0xc5, 0x21, 0x84, 0x21, 0x03, 0x11, 0x81, 0x08,
-  0x81, 0x08, 0x03, 0x11, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x42, 0x08, 0x62, 0x08, 0x42, 0x08, 0xc4, 0x10, 0x89, 0x19,
-  0x2d, 0x2a, 0xaf, 0x32, 0xf1, 0x32, 0xf2, 0x32, 0xd2, 0x32, 0xd2, 0x32,
-  0xb2, 0x32, 0xb2, 0x32, 0x92, 0x32, 0x71, 0x2a, 0x8b, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x21, 0x0b, 0x65,
-  0x8c, 0x6d, 0x6c, 0x6d, 0x4d, 0x6d, 0x4d, 0x6d, 0x2d, 0x65, 0x0d, 0x65,
-  0x0d, 0x65, 0x0d, 0x65, 0xee, 0x64, 0xee, 0x64, 0xce, 0x5c, 0xc9, 0x3a,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x08,
-  0xae, 0x32, 0x31, 0x3b, 0x6d, 0x2a, 0x26, 0x19, 0x62, 0x08, 0x21, 0x00,
-  0x00, 0x00, 0x42, 0x08, 0x63, 0x08, 0x62, 0x08, 0x63, 0x08, 0x63, 0x08,
-  0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x41, 0x08, 0x49, 0x54, 0x8c, 0x6d, 0x29, 0x54, 0xc6, 0x3a,
-  0xc4, 0x21, 0x43, 0x19, 0xc2, 0x10, 0xc2, 0x10, 0x03, 0x11, 0x84, 0x21,
-  0x46, 0x2a, 0x49, 0x43, 0x8d, 0x54, 0x2a, 0x3b, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0x4c, 0x2a,
-  0x31, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0x90, 0x32,
-  0x90, 0x32, 0x70, 0x2a, 0x70, 0x2a, 0x70, 0x2a, 0x50, 0x2a, 0x50, 0x2a,
-  0x51, 0x2a, 0xac, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
-  0xa1, 0x10, 0x83, 0x21, 0xc6, 0x3a, 0x88, 0x4b, 0xe9, 0x4b, 0x0a, 0x54,
-  0x2a, 0x54, 0x2b, 0x54, 0xea, 0x4b, 0xca, 0x4b, 0x69, 0x43, 0xa8, 0x32,
-  0x85, 0x21, 0xa2, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x83, 0x08,
-  0x26, 0x19, 0xeb, 0x21, 0x4e, 0x2a, 0x8f, 0x32, 0xb0, 0x32, 0xb1, 0x32,
-  0x91, 0x32, 0x70, 0x2a, 0x2f, 0x2a, 0xcc, 0x21, 0x29, 0x19, 0x84, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x67, 0x43, 0xac, 0x75, 0xac, 0x75,
-  0x8c, 0x6d, 0x6c, 0x6d, 0x4c, 0x6d, 0x0c, 0x65, 0xcc, 0x5c, 0xac, 0x5c,
-  0xcd, 0x5c, 0xed, 0x64, 0xee, 0x64, 0xee, 0x5c, 0xce, 0x5c, 0xa8, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x25, 0x43, 0xa3, 0x21, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0xca, 0x21, 0xea, 0x21, 0x26, 0x11,
-  0xa4, 0x08, 0x83, 0x08, 0x62, 0x08, 0x42, 0x08, 0x42, 0x08, 0x63, 0x08,
-  0x83, 0x08, 0xc5, 0x10, 0x29, 0x19, 0xce, 0x21, 0x6a, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x83, 0x21, 0xea, 0x64, 0x2b, 0x6d, 0x88, 0x4b, 0xe4, 0x29, 0xa1, 0x08,
-  0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x84, 0x21, 0xc8, 0x3a, 0x26, 0x2a, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xeb, 0x75, 0x63, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xeb, 0x21, 0xd0, 0x32, 0xd1, 0x32, 0xb1, 0x32,
-  0xb1, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0xcd, 0x21, 0x63, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x83, 0x21,
-  0x06, 0x3b, 0x69, 0x54, 0xcb, 0x5c, 0x0b, 0x65, 0x2c, 0x65, 0x2c, 0x65,
-  0x2d, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0x8d, 0x5c, 0x4c, 0x54,
-  0xcb, 0x4b, 0xc5, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6c, 0x6d, 0x04, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xa4, 0x08, 0x48, 0x19, 0x89, 0x19, 0xab, 0x21, 0xec, 0x21,
-  0xab, 0x21, 0x8a, 0x19, 0x28, 0x19, 0xa5, 0x10, 0x42, 0x08, 0x84, 0x08,
-  0x4a, 0x19, 0xc6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xc1, 0x10, 0x69, 0x5c, 0xec, 0x75, 0x8c, 0x6d, 0x8c, 0x6d,
-  0x6c, 0x6d, 0xab, 0x5c, 0x2a, 0x54, 0xa9, 0x4b, 0x69, 0x43, 0x69, 0x43,
-  0x89, 0x4b, 0xca, 0x4b, 0x4c, 0x54, 0xee, 0x5c, 0xce, 0x5c, 0x88, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x4d, 0x6d, 0x66, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x83, 0x08, 0xcb, 0x21, 0xaa, 0x19, 0x8a, 0x19, 0x8a, 0x19, 0x8a, 0x19,
-  0xac, 0x21, 0xee, 0x21, 0x51, 0x2a, 0x52, 0x2a, 0x52, 0x2a, 0x8c, 0x21,
-  0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x19,
-  0x2a, 0x6d, 0x89, 0x5c, 0x47, 0x43, 0xc4, 0x21, 0xe2, 0x10, 0x04, 0x2a,
-  0xa6, 0x32, 0x28, 0x43, 0x89, 0x4b, 0x89, 0x43, 0x08, 0x3b, 0x87, 0x32,
-  0xc5, 0x21, 0xc2, 0x10, 0x84, 0x21, 0x44, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xc8, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x10,
-  0xb1, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x50, 0x2a,
-  0x2f, 0x2a, 0xee, 0x21, 0x6b, 0x19, 0xc6, 0x10, 0x21, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x10, 0xe6, 0x3a, 0xa9, 0x5c,
-  0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x2c, 0x65,
-  0x0d, 0x65, 0xed, 0x64, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x6d, 0x54, 0x67, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x09, 0x3b,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x08, 0xc5, 0x10,
-  0xa4, 0x08, 0x63, 0x08, 0x21, 0x00, 0x84, 0x08, 0x28, 0x11, 0xcd, 0x21,
-  0x31, 0x2a, 0x32, 0x2a, 0xc7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x81, 0x08, 0x68, 0x5c, 0xcb, 0x75, 0xab, 0x75, 0xac, 0x75, 0x4b, 0x6d,
-  0xe9, 0x4b, 0xc6, 0x3a, 0x45, 0x2a, 0x45, 0x2a, 0xe5, 0x29, 0x05, 0x2a,
-  0x26, 0x2a, 0x26, 0x2a, 0xa8, 0x32, 0xab, 0x4b, 0x8d, 0x5c, 0x88, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54, 0xea, 0x3a, 0x41, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x19, 0x90, 0x2a, 0x70, 0x2a,
-  0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x52, 0x2a, 0x31, 0x2a,
-  0x09, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x08, 0x68, 0x5c,
-  0x08, 0x54, 0x67, 0x43, 0x85, 0x32, 0xc6, 0x3a, 0x09, 0x54, 0xeb, 0x64,
-  0x6d, 0x6d, 0x4d, 0x6d, 0x4d, 0x6d, 0x4d, 0x6d, 0x2e, 0x65, 0x0e, 0x65,
-  0x6c, 0x54, 0x4a, 0x43, 0x26, 0x2a, 0x03, 0x11, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xae, 0x5c, 0x6e, 0x54, 0x6f, 0x54, 0xca, 0x3a, 0x61, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x83, 0x08, 0x2e, 0x22, 0x50, 0x2a, 0x2f, 0x2a, 0xed, 0x21,
-  0xac, 0x21, 0x6b, 0x19, 0x08, 0x19, 0x08, 0x11, 0x6b, 0x19, 0x21, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x63, 0x19, 0x09, 0x65, 0xab, 0x75, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54,
-  0x2e, 0x54, 0x0f, 0x4c, 0x0c, 0x3b, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x63, 0x08, 0x28, 0x19, 0x8a, 0x19, 0xee, 0x21, 0x51, 0x2a, 0x51, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0x64, 0x08, 0x00, 0x00, 0x20, 0x00,
-  0x26, 0x43, 0xeb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c,
-  0xd0, 0x4b, 0x2e, 0x3b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0x4f, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x32, 0x2a, 0xe7, 0x10, 0x00, 0x00, 0x20, 0x00, 0x68, 0x5c, 0xcb, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43,
-  0x2f, 0x3b, 0xa3, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x21, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x31, 0x2a, 0x4b, 0x19,
-  0x00, 0x00, 0x20, 0x00, 0x8a, 0x6d, 0xab, 0x75, 0x8b, 0x6d, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54,
-  0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43, 0x50, 0x43, 0x10, 0x3b,
-  0xa4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xc5, 0x10, 0x50, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xae, 0x21, 0x00, 0x00, 0xa1, 0x10,
-  0x0b, 0x76, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c,
-  0xcf, 0x4b, 0x90, 0x43, 0x50, 0x43, 0x30, 0x3b, 0xcf, 0x32, 0x06, 0x19,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x50, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x11, 0x2a, 0x11, 0x2a, 0x82, 0x10, 0x83, 0x21, 0xeb, 0x75, 0xaa, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43,
-  0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0x90, 0x32, 0x27, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x21, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x12, 0x2a,
-  0xc5, 0x18, 0x64, 0x32, 0xeb, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54,
-  0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43, 0x50, 0x43, 0x30, 0x3b,
-  0xf0, 0x3a, 0xb0, 0x32, 0x70, 0x32, 0x07, 0x11, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x6a, 0x19, 0x71, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x12, 0x2a, 0x27, 0x19, 0x05, 0x3b,
-  0xeb, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c,
-  0xcf, 0x4b, 0x90, 0x43, 0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0xb0, 0x32,
-  0x91, 0x32, 0x51, 0x2a, 0xa5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x28, 0x11, 0x71, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x11, 0x2a, 0x11, 0x2a, 0x49, 0x21, 0xa6, 0x4b, 0xca, 0x75, 0xaa, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43,
-  0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0xb0, 0x32, 0x70, 0x32, 0x51, 0x32,
-  0x6b, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x11, 0x71, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a,
-  0x8b, 0x21, 0x47, 0x54, 0xca, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54,
-  0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43, 0x50, 0x43, 0x30, 0x3b,
-  0xf0, 0x3a, 0xb0, 0x32, 0x71, 0x32, 0x51, 0x32, 0xe7, 0x10, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x07, 0x11, 0x71, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xac, 0x29, 0x68, 0x5c,
-  0xca, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c,
-  0xcf, 0x4b, 0x90, 0x43, 0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0xb0, 0x32,
-  0x91, 0x32, 0x29, 0x19, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x49, 0x19, 0x71, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x11, 0x2a, 0x11, 0x2a, 0xcd, 0x29, 0xc8, 0x5c, 0xca, 0x75, 0xaa, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43,
-  0x50, 0x43, 0x30, 0x3b, 0xf0, 0x3a, 0x8f, 0x32, 0x06, 0x11, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x21, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xf1, 0x29,
-  0xee, 0x29, 0xc8, 0x5c, 0xca, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54,
-  0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43, 0x50, 0x43, 0x30, 0x3b,
-  0x8d, 0x32, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x2f, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xf1, 0x29, 0x0f, 0x32, 0xc8, 0x5c,
-  0xca, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c,
-  0xcf, 0x4b, 0x90, 0x43, 0x70, 0x43, 0x0a, 0x2a, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x08,
-  0x50, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x11, 0x2a, 0xf1, 0x29, 0x0f, 0x32, 0xc8, 0x5c, 0xca, 0x75, 0xaa, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xae, 0x5c, 0x6e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43,
-  0xe4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x19, 0x70, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xf1, 0x29,
-  0xee, 0x29, 0x68, 0x5c, 0xca, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54,
-  0x2e, 0x54, 0x30, 0x4c, 0xec, 0x3a, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x2e, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xf1, 0x29, 0xcd, 0x29, 0x47, 0x54,
-  0xca, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x2c, 0x65, 0xed, 0x64, 0xae, 0x5c, 0x6e, 0x54, 0x2f, 0x54, 0x69, 0x2a,
-  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x11, 0x70, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x11, 0x2a, 0x11, 0x2a, 0xac, 0x29, 0xa6, 0x4b, 0xca, 0x75, 0xaa, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64,
-  0xae, 0x5c, 0x2d, 0x54, 0xa6, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x21, 0x00, 0x0d, 0x22, 0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a,
-  0x8b, 0x29, 0x26, 0x43, 0xeb, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xcb, 0x75, 0x6b, 0x6d, 0x2c, 0x65, 0xed, 0x64, 0x0c, 0x54, 0x81, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x19,
-  0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x69, 0x21, 0x84, 0x32,
-  0xeb, 0x75, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54, 0xcb, 0x75, 0x6b, 0x6d,
-  0x6d, 0x6d, 0xe8, 0x3a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xe6, 0x10, 0x90, 0x32, 0x91, 0x32, 0x71, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x11, 0x2a, 0x12, 0x2a, 0x28, 0x19, 0xa3, 0x21, 0xeb, 0x75, 0xaa, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0x27, 0x54, 0xeb, 0x75, 0x4b, 0x65, 0xe4, 0x21, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x10,
-  0x90, 0x32, 0xb1, 0x32, 0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x12, 0x2a,
-  0xe5, 0x18, 0xc1, 0x10, 0x0b, 0x76, 0xaa, 0x75, 0x8b, 0x6d, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x27, 0x54,
-  0xe9, 0x64, 0xa1, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc5, 0x10, 0xb1, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x12, 0x2a, 0x83, 0x10, 0x20, 0x00,
-  0xaa, 0x6d, 0xab, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x81, 0x08, 0x83, 0x21, 0x61, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x21,
-  0xd1, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x11, 0x2a, 0xcf, 0x21, 0x00, 0x00, 0x20, 0x00, 0x68, 0x5c, 0xcb, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x62, 0x08, 0x6d, 0x2a, 0xf1, 0x32, 0xd0, 0x32, 0xb0, 0x32,
-  0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x6c, 0x19,
-  0x00, 0x00, 0x20, 0x00, 0x46, 0x43, 0xeb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x11, 0xd0, 0x32,
-  0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0xe8, 0x10, 0x00, 0x00, 0x00, 0x00,
-  0xe4, 0x21, 0xeb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xca, 0x21, 0x10, 0x33, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x11, 0x2a,
-  0x32, 0x2a, 0x84, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0xab, 0x75,
-  0x8b, 0x6d, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x08, 0x8d, 0x2a, 0x11, 0x3b,
-  0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32,
-  0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0xf0, 0x21, 0x22, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x81, 0x08, 0x68, 0x5c, 0xab, 0x75, 0x8b, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x05, 0x11, 0x0f, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32,
-  0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x31, 0x2a, 0x6c, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0xe5, 0x3a, 0xcb, 0x75, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x21, 0x51, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x32, 0x2a,
-  0xe7, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x21,
-  0xab, 0x75, 0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x08,
-  0xcd, 0x32, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b,
-  0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32,
-  0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x10, 0x2a, 0x84, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x69, 0x5c, 0xab, 0x6d,
-  0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x46, 0x19, 0x2f, 0x3b, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32,
-  0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x31, 0x2a, 0x8c, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0xe6, 0x3a, 0xab, 0x75, 0x6b, 0x6d, 0x4b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x09, 0x22,
-  0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x51, 0x2a, 0x08, 0x11,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x83, 0x21, 0x0a, 0x65, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x82, 0x08, 0xcc, 0x32, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b,
-  0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32,
-  0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x51, 0x2a, 0xef, 0x21, 0x84, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0xe8, 0x4b,
-  0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x19, 0x6f, 0x43,
-  0xb0, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32,
-  0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a,
-  0x6b, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x2a, 0x4b, 0x6d, 0x6b, 0x6d,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x08, 0x22, 0xf0, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43,
-  0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x0f, 0x2a, 0xc6, 0x10, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x81, 0x08, 0x49, 0x54, 0x6c, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x4d, 0x43, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b,
-  0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32,
-  0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0xad, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x85, 0x32, 0x2b, 0x65, 0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x86, 0x19, 0x8e, 0x43, 0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43,
-  0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32,
-  0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x30, 0x2a, 0xe6, 0x10,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x5c,
-  0x4c, 0x6d, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x2a, 0xef, 0x4b, 0xef, 0x4b,
-  0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43,
-  0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a,
-  0x71, 0x2a, 0x51, 0x2a, 0xcd, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x21, 0x2b, 0x65, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b,
-  0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32,
-  0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x50, 0x2a,
-  0x84, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xa8, 0x4b, 0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32,
-  0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43,
-  0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32,
-  0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x71, 0x2a, 0x6a, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x61, 0x08, 0xeb, 0x64, 0x2c, 0x65, 0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b,
-  0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43,
-  0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x91, 0x2a,
-  0x2f, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x21,
-  0x4c, 0x6d, 0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b,
-  0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32,
-  0xb0, 0x32, 0x91, 0x32, 0x91, 0x32, 0x91, 0x32, 0x83, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x3a, 0x4d, 0x6d,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32,
-  0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43,
-  0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32,
-  0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32,
-  0xb1, 0x32, 0x07, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x88, 0x43, 0x4d, 0x6d, 0x0d, 0x65,
-  0xed, 0x64, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b,
-  0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43,
-  0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x8a, 0x21, 0x21, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xa2, 0x10, 0x0a, 0x54, 0x2d, 0x65, 0xed, 0x64, 0xcd, 0x5c,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b,
-  0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32,
-  0xb1, 0x32, 0xec, 0x21, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x03, 0x11, 0x2b, 0x54, 0x0d, 0x65, 0xcd, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32,
-  0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43,
-  0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32,
-  0xd0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb1, 0x32, 0x2d, 0x2a, 0x63, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x19,
-  0x4b, 0x54, 0xed, 0x64, 0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b,
-  0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43,
-  0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd1, 0x32, 0x4e, 0x2a, 0x63, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x10, 0x4c, 0x54,
-  0xcd, 0x5c, 0xad, 0x5c, 0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b,
-  0xf0, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0x4e, 0x2a, 0x42, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xaa, 0x4b, 0xce, 0x5c,
-  0x8d, 0x5c, 0x67, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32,
-  0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43,
-  0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xf0, 0x32,
-  0xf1, 0x32, 0x0c, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0x32, 0x8d, 0x5c, 0x67, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b,
-  0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43,
-  0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b,
-  0x10, 0x3b, 0x10, 0x3b, 0x10, 0x33, 0xf1, 0x32, 0x47, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xe3, 0x10, 0xc5, 0x21, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x31, 0x3b,
-  0x6d, 0x2a, 0x83, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32,
-  0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43,
-  0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x31, 0x3b, 0xcf, 0x32, 0x47, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b,
-  0xcf, 0x4b, 0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43,
-  0x70, 0x43, 0x70, 0x43, 0x50, 0x43, 0x50, 0x3b, 0xce, 0x32, 0x88, 0x19,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x08, 0xca, 0x32, 0x0f, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x90, 0x43, 0x70, 0x43,
-  0x2a, 0x2a, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x65, 0x19,
-  0x69, 0x2a, 0xaa, 0x32, 0xcb, 0x32, 0xcb, 0x32, 0x8b, 0x32, 0x29, 0x2a,
-  0xa7, 0x21, 0x04, 0x11, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-#endif
diff --git a/plat/baikal/bm1000/bm1000_bl1_logo_v3.c b/plat/baikal/bm1000/bm1000_bl1_logo_v3.c
deleted file mode 100644 (file)
index 2b32a79..0000000
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
- * Copyright (c) 2020, Baikal Electronics, JSC. All rights reserved.
- *
- * Author: Pavel Parkhomenko <pavel.parkhomenko@baikalelectronics.ru>
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/*
- * To change a logo, replace array contents below with a BMP file dump.
- * Source BMP file have to be of 16-bpp color format (RGB565).
- * Optimal size is 54x54 pixels (or 48x63 pixels for wide displays).
- */
-
-#if !DEBUG
-const unsigned char bl1_logo[] = {
-  0x42, 0x4d, 0x52, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00,
-  0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00,
-  0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0xc8, 0x16,
-  0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xe0, 0x07,
-  0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x47,
-  0x52, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08,
-  0x82, 0x08, 0x82, 0x08, 0x62, 0x08, 0x62, 0x08, 0xe4, 0x10, 0x66, 0x21,
-  0x29, 0x2a, 0x08, 0x22, 0xc3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x10,
-  0xc6, 0x21, 0xc7, 0x21, 0x86, 0x21, 0x65, 0x19, 0x04, 0x11, 0xa3, 0x10,
-  0xc3, 0x10, 0x66, 0x19, 0xe8, 0x21, 0xe8, 0x21, 0xa7, 0x21, 0xa8, 0x21,
-  0xa7, 0x19, 0xa8, 0x21, 0x47, 0x19, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x24, 0x19, 0xe9, 0x3a, 0xcc, 0x4b, 0x2d, 0x4c, 0xcd, 0x4b,
-  0xad, 0x43, 0x8d, 0x43, 0x8d, 0x43, 0xae, 0x43, 0x6d, 0x43, 0xab, 0x32,
-  0xa7, 0x21, 0x82, 0x08, 0x41, 0x08, 0x41, 0x08, 0x21, 0x00, 0x20, 0x00,
-  0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x09, 0x3b,
-  0x87, 0x32, 0x43, 0x19, 0x82, 0x08, 0x41, 0x08, 0x21, 0x00, 0x20, 0x00,
-  0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x41, 0x08, 0x61, 0x08,
-  0xc4, 0x10, 0xc7, 0x21, 0xab, 0x32, 0x0d, 0x3b, 0x6f, 0x3b, 0x91, 0x43,
-  0x70, 0x3b, 0x71, 0x43, 0x10, 0x3b, 0xcf, 0x32, 0x2b, 0x2a, 0x88, 0x21,
-  0xc4, 0x08, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc2, 0x10, 0x46, 0x2a, 0xc5, 0x21, 0x64, 0x21,
-  0x64, 0x21, 0xa5, 0x21, 0x88, 0x32, 0x47, 0x2a, 0x28, 0x2a, 0x68, 0x32,
-  0x48, 0x32, 0x48, 0x32, 0x48, 0x2a, 0x28, 0x2a, 0x28, 0x2a, 0x49, 0x2a,
-  0x66, 0x19, 0x24, 0x11, 0x05, 0x19, 0x05, 0x11, 0x46, 0x19, 0x46, 0x19,
-  0x46, 0x19, 0x46, 0x19, 0x25, 0x11, 0xe4, 0x10, 0xe5, 0x10, 0xc5, 0x10,
-  0x26, 0x11, 0x48, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x43, 0x19, 0xe5, 0x29, 0x46, 0x2a, 0xe9, 0x3a,
-  0x0c, 0x4c, 0xce, 0x5c, 0x8b, 0x4b, 0x89, 0x32, 0x27, 0x22, 0x61, 0x08,
-  0x21, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x24, 0x11,
-  0xd0, 0x4b, 0x2e, 0x3b, 0x2a, 0x2a, 0xa7, 0x21, 0x25, 0x19, 0x05, 0x11,
-  0x05, 0x11, 0x05, 0x11, 0x47, 0x11, 0x88, 0x19, 0x2a, 0x22, 0xaf, 0x32,
-  0x11, 0x33, 0x2c, 0x2a, 0x89, 0x21, 0x27, 0x11, 0x63, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x03, 0x11, 0x69, 0x43, 0xe8, 0x42, 0x87, 0x32, 0x06, 0x2a, 0x44, 0x11,
-  0x61, 0x08, 0x20, 0x00, 0x04, 0x19, 0xe5, 0x21, 0x03, 0x11, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xe4, 0x10, 0x87, 0x21, 0xe8, 0x21, 0x09, 0x22,
-  0x09, 0x22, 0xe9, 0x21, 0xc8, 0x21, 0x47, 0x19, 0xa3, 0x08, 0x41, 0x08,
-  0x21, 0x00, 0xc4, 0x08, 0x47, 0x19, 0x89, 0x21, 0x8a, 0x19, 0x21, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
-  0x46, 0x32, 0x45, 0x32, 0xe5, 0x29, 0x05, 0x22, 0x05, 0x22, 0x87, 0x32,
-  0xc8, 0x3a, 0x09, 0x3b, 0xa9, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x25, 0x19, 0xa7, 0x21, 0xa7, 0x19, 0x66, 0x19,
-  0x67, 0x19, 0x66, 0x19, 0x47, 0x19, 0x47, 0x19, 0xa9, 0x21, 0xea, 0x21,
-  0xeb, 0x21, 0xea, 0x21, 0xcb, 0x21, 0xcb, 0x21, 0xab, 0x21, 0xcb, 0x21,
-  0x49, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x43, 0x8e, 0x75,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x64, 0x4e, 0x65, 0x0e, 0x65, 0xce, 0x5c,
-  0xab, 0x4b, 0x47, 0x2a, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x19, 0x50, 0x43,
-  0x51, 0x43, 0x51, 0x43, 0x51, 0x43, 0x51, 0x3b, 0xf0, 0x3a, 0x2c, 0x2a,
-  0x68, 0x19, 0xa3, 0x08, 0x21, 0x00, 0x21, 0x00, 0x41, 0x00, 0x41, 0x00,
-  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x08, 0x81, 0x08, 0x61, 0x08,
-  0x61, 0x08, 0x61, 0x08, 0x61, 0x08, 0x61, 0x08, 0x41, 0x08, 0xe3, 0x10,
-  0x07, 0x22, 0xe6, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x41, 0x08, 0x41, 0x08, 0x41, 0x00, 0xa4, 0x10, 0x88, 0x21,
-  0x2d, 0x2a, 0xd1, 0x32, 0xd2, 0x3a, 0xf2, 0x3a, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0xb2, 0x2a, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc2, 0x10, 0x29, 0x54, 0xc9, 0x4b, 0x88, 0x43,
-  0x28, 0x3b, 0x28, 0x3b, 0x29, 0x43, 0x69, 0x43, 0xaa, 0x4b, 0x8a, 0x4b,
-  0x8b, 0x43, 0xa2, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x62, 0x08, 0x4b, 0x2a, 0x8d, 0x32, 0x6c, 0x2a, 0x6d, 0x2a, 0x4d, 0x2a,
-  0x0b, 0x22, 0x89, 0x21, 0x48, 0x19, 0x48, 0x19, 0x48, 0x11, 0x28, 0x11,
-  0x28, 0x11, 0x28, 0x19, 0x49, 0x19, 0x84, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0xe4, 0x29, 0x47, 0x43, 0x09, 0x4c, 0x6b, 0x54,
-  0xcc, 0x5c, 0xac, 0x5c, 0x6c, 0x54, 0x0b, 0x4c, 0x49, 0x43, 0x67, 0x32,
-  0x44, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x6c, 0x2a, 0x88, 0x21, 0xc4, 0x08,
-  0x41, 0x08, 0xc5, 0x10, 0x68, 0x19, 0xaa, 0x19, 0xca, 0x21, 0xcb, 0x21,
-  0xaa, 0x19, 0x8a, 0x19, 0x49, 0x11, 0xa4, 0x10, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xe6, 0x3a, 0x8c, 0x6d, 0x8a, 0x5c, 0x88, 0x4b, 0x07, 0x3b,
-  0xa7, 0x32, 0xa7, 0x32, 0xa8, 0x3a, 0xe8, 0x3a, 0xaa, 0x4b, 0x6d, 0x54,
-  0x6d, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x32, 0x31, 0x3b,
-  0x11, 0x3b, 0xb0, 0x2a, 0x2c, 0x22, 0xcb, 0x21, 0x8a, 0x19, 0x48, 0x19,
-  0x6a, 0x19, 0x8a, 0x19, 0xcc, 0x21, 0x30, 0x22, 0x29, 0x11, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xc1, 0x10, 0x87, 0x43, 0x47, 0x43, 0xe9, 0x4b, 0x6a, 0x54, 0x8a, 0x5c,
-  0x6b, 0x54, 0x6b, 0x54, 0x6c, 0x54, 0x4c, 0x54, 0xcb, 0x4b, 0x29, 0x3b,
-  0xe6, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x64, 0x32, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xa9, 0x19, 0xca, 0x21, 0xa9, 0x19, 0xaa, 0x21, 0x8a, 0x19, 0xaa, 0x19,
-  0x8a, 0x19, 0x8a, 0x19, 0x6a, 0x19, 0x6a, 0x19, 0x6b, 0x19, 0x22, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x28, 0x54, 0x47, 0x43, 0xc4, 0x29, 0xe4, 0x29, 0xe5, 0x29, 0x25, 0x2a,
-  0x45, 0x2a, 0x45, 0x2a, 0x25, 0x2a, 0xc5, 0x21, 0xa5, 0x21, 0xc5, 0x21,
-  0x44, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6a, 0x7e, 0x67, 0x43, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x62, 0x08, 0x4d, 0x2a, 0xf2, 0x3a, 0xb1, 0x32, 0xb1, 0x32, 0xb1, 0x2a,
-  0x91, 0x2a, 0x91, 0x32, 0x71, 0x32, 0x71, 0x2a, 0xcd, 0x21, 0x84, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x19,
-  0x47, 0x43, 0xca, 0x5c, 0xac, 0x75, 0x6d, 0x65, 0x4d, 0x6d, 0x2c, 0x65,
-  0x2c, 0x65, 0x0d, 0x6d, 0xed, 0x64, 0x0d, 0x65, 0xed, 0x64, 0x0f, 0x65,
-  0x2a, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x4b, 0x7e, 0xac, 0x6d, 0xcc, 0x5c,
-  0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xe6, 0x10, 0xe6, 0x10, 0x07, 0x11,
-  0xe6, 0x10, 0xc6, 0x10, 0xc6, 0x10, 0xe6, 0x10, 0x8c, 0x21, 0x73, 0x2a,
-  0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x43,
-  0x29, 0x54, 0xe8, 0x4b, 0xc8, 0x4b, 0xc9, 0x4b, 0xc9, 0x4b, 0xc9, 0x4b,
-  0xc9, 0x4b, 0xa9, 0x4b, 0x89, 0x43, 0x8a, 0x43, 0x6a, 0x43, 0x4a, 0x43,
-  0x47, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6b, 0x6d, 0x4c, 0x65,
-  0x0d, 0x65, 0x47, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0x6f, 0x2a, 0x2e, 0x2a,
-  0x0e, 0x2a, 0xed, 0x21, 0xcd, 0x21, 0xcd, 0x19, 0x8c, 0x19, 0x8c, 0x21,
-  0x2a, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x21, 0x8b, 0x75,
-  0x6a, 0x6d, 0xac, 0x75, 0x6b, 0x6d, 0x49, 0x54, 0x48, 0x43, 0x08, 0x43,
-  0xe7, 0x3a, 0xc7, 0x3a, 0xe8, 0x3a, 0xe8, 0x3a, 0xaa, 0x4b, 0xce, 0x5c,
-  0x4a, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0xad, 0x5c, 0xed, 0x4b, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0x4e, 0x22,
-  0x4f, 0x2a, 0x50, 0x2a, 0x71, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x52, 0x2a,
-  0xf0, 0x29, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2a, 0x66, 0x4b,
-  0x26, 0x3b, 0x06, 0x3b, 0x67, 0x43, 0xaa, 0x5c, 0x6c, 0x6d, 0x6d, 0x6d,
-  0x6d, 0x6d, 0x4d, 0x6d, 0x4d, 0x65, 0x0e, 0x65, 0x2c, 0x54, 0x09, 0x43,
-  0xc5, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x54, 0x4e, 0x54, 0x70, 0x54, 0x65, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x08,
-  0x70, 0x2a, 0x0e, 0x22, 0xab, 0x21, 0x49, 0x19, 0x49, 0x19, 0x29, 0x19,
-  0x8c, 0x19, 0xe7, 0x10, 0x00, 0x00, 0x40, 0x08, 0x08, 0x54, 0xcb, 0x75,
-  0xcb, 0x75, 0xab, 0x6d, 0x8c, 0x6d, 0x4c, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xee, 0x5c,
-  0x4a, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0x10, 0x4c, 0x4a, 0x2a,
-  0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x83, 0x08, 0x50, 0x2a, 0x50, 0x2a, 0x72, 0x2a, 0x52, 0x2a, 0x52, 0x2a,
-  0x32, 0x2a, 0x6b, 0x19, 0x00, 0x00, 0x81, 0x08, 0x8a, 0x6d, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x8f, 0x43,
-  0x0f, 0x3b, 0xe5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x0e, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0xcf, 0x21, 0x21, 0x00, 0xe2, 0x10, 0x4b, 0x7e, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x70, 0x43,
-  0x50, 0x43, 0x52, 0x43, 0x69, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x49, 0x19, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x32, 0x2a, 0x42, 0x08, 0x24, 0x2a, 0x0b, 0x76, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x70, 0x43,
-  0x50, 0x43, 0xf0, 0x3a, 0xf2, 0x3a, 0x2e, 0x2a, 0x84, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xe6, 0x10, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x33, 0x2a, 0x84, 0x08, 0x65, 0x43, 0xea, 0x75, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x70, 0x43,
-  0x50, 0x43, 0x10, 0x3b, 0xb0, 0x32, 0x90, 0x32, 0x72, 0x32, 0x43, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x84, 0x08, 0x50, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x32, 0x2a, 0xe8, 0x10, 0x28, 0x54, 0xca, 0x75, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x70, 0x43,
-  0x50, 0x43, 0x10, 0x3b, 0xb0, 0x32, 0x90, 0x32, 0x72, 0x32, 0x09, 0x11,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x63, 0x08, 0x50, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x32, 0x2a, 0x2a, 0x19, 0xa8, 0x5c, 0xca, 0x75, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x70, 0x43,
-  0x50, 0x43, 0x10, 0x3b, 0xd1, 0x3a, 0x70, 0x2a, 0x08, 0x11, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xa4, 0x10, 0x50, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x11, 0x2a, 0x6c, 0x19, 0xc8, 0x5c, 0xca, 0x75, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x6f, 0x43,
-  0x50, 0x43, 0x51, 0x43, 0x89, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x28, 0x11, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x11, 0x2a, 0xad, 0x21, 0xc8, 0x5c, 0xca, 0x75, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x0f, 0x4c, 0xcf, 0x4b, 0x90, 0x43,
-  0xee, 0x3a, 0x83, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xac, 0x21, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x11, 0x2a, 0xad, 0x21, 0xc8, 0x5c, 0xca, 0x75, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0x8d, 0x5c, 0x4e, 0x54, 0x50, 0x54, 0x2d, 0x3b, 0x87, 0x19,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x63, 0x08, 0x92, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x11, 0x2a, 0x6c, 0x19, 0x28, 0x54, 0xca, 0x75, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x2c, 0x65,
-  0xed, 0x64, 0xad, 0x5c, 0xd0, 0x5c, 0xa5, 0x21, 0x21, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x70, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x31, 0x2a, 0x4b, 0x19, 0x66, 0x4b, 0xea, 0x75, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x7e, 0x6c, 0x6d, 0x4c, 0x65,
-  0xcd, 0x64, 0x6b, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x2a,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x32, 0x2a, 0x08, 0x11, 0x44, 0x32, 0x0b, 0x76, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x6b, 0x86, 0xcc, 0x75, 0xa8, 0x4b,
-  0x64, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x22, 0xb1, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x32, 0x2a, 0x85, 0x08, 0xe2, 0x10, 0x6b, 0x7e, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc1, 0x10, 0x8b, 0x7e, 0x63, 0x19, 0x20, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc5, 0x10, 0xb1, 0x2a, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x33, 0x2a, 0x42, 0x08, 0x81, 0x08, 0x8a, 0x6d, 0x8b, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x62, 0x08, 0x0c, 0x2a, 0xf2, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0xcf, 0x29, 0x21, 0x00, 0x40, 0x08, 0x48, 0x54, 0xab, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xa9, 0x21,
-  0xf0, 0x32, 0xf1, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x6c, 0x19, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3b, 0xab, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x19, 0xf0, 0x3a, 0xf1, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x11, 0x2a, 0x08, 0x11, 0x00, 0x00, 0x00, 0x00, 0x63, 0x21, 0x6a, 0x6d,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xa3, 0x08, 0x10, 0x3b, 0x31, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0x10, 0x2a, 0x63, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x65,
-  0x8b, 0x6d, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x10,
-  0x2a, 0x2a, 0x71, 0x43, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a,
-  0xce, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x21,
-  0xeb, 0x75, 0x6b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x2a, 0x4f, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x73, 0x2a,
-  0x63, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xea, 0x64, 0x8b, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x05, 0x11, 0xd1, 0x4b, 0x90, 0x43, 0x50, 0x3b,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x32, 0x2a, 0xad, 0x21,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x22, 0x11, 0xab, 0x6d, 0x4b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x45, 0x19, 0xed, 0x3a, 0xd1, 0x4b, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x31, 0x2a, 0x42, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x67, 0x43, 0x6b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x2d, 0x3b,
-  0xaf, 0x4b, 0xaf, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x51, 0x2a, 0x4a, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x81, 0x08, 0x2b, 0x6d, 0x4b, 0x6d, 0x4c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x21, 0x30, 0x4c, 0xcf, 0x4b,
-  0xaf, 0x43, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a, 0x30, 0x2a, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x83, 0x21, 0xad, 0x75, 0x2c, 0x65, 0x2c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0xb2, 0x54, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x71, 0x2a, 0x92, 0x32, 0x63, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x21, 0xad, 0x6d, 0x0c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x51, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb1, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0xb2, 0x2a, 0x84, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x32, 0x4c, 0x65,
-  0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x51, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32,
-  0x91, 0x32, 0x27, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x32,
-  0x8e, 0x6d, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x51, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb0, 0x32, 0xd2, 0x32,
-  0x27, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x43, 0x19, 0x4e, 0x6d, 0xed, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x51, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0xb2, 0x32, 0xa4, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x43, 0x19, 0xac, 0x5c, 0xed, 0x5c, 0xcd, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x51, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32, 0x90, 0x2a, 0x84, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x08, 0x3b, 0xed, 0x5c, 0xce, 0x5c,
-  0x29, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x51, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32,
-  0xf0, 0x32, 0xd1, 0x32, 0xaa, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0x10, 0x2c, 0x54,
-  0x8b, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x51, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x10, 0x3b, 0x52, 0x3b,
-  0x8e, 0x2a, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0xa2, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x51, 0x4c, 0xcf, 0x4b, 0xcf, 0x4b,
-  0xaf, 0x4b, 0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x70, 0x43,
-  0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, 0x0f, 0x3b, 0xae, 0x2a, 0xa4, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x71, 0x54, 0xef, 0x4b, 0xcf, 0x4b,
-  0xcf, 0x4b, 0xaf, 0x43, 0xb0, 0x43, 0xb1, 0x43, 0xb1, 0x43, 0xd2, 0x4b,
-  0x2f, 0x3b, 0x6c, 0x2a, 0xa9, 0x21, 0xa3, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x0b, 0x3b, 0x0c, 0x3b, 0x2c, 0x3b,
-  0x2c, 0x3b, 0xec, 0x3a, 0x8b, 0x2a, 0x09, 0x22, 0x26, 0x19, 0x82, 0x08,
-  0x41, 0x08, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-#endif
diff --git a/plat/baikal/bm1000/bm1000_bl1_logo_v4.c b/plat/baikal/bm1000/bm1000_bl1_logo_v4.c
deleted file mode 100644 (file)
index f66be65..0000000
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * Copyright (c) 2020, Baikal Electronics, JSC. All rights reserved.
- *
- * Author: Pavel Parkhomenko <pavel.parkhomenko@baikalelectronics.ru>
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-/*
- * To change a logo, replace array contents below with a BMP file dump.
- * Source BMP file have to be of 16-bpp color format (RGB565).
- * Optimal size is 72x72 pixels (or 64x84 pixels for wide displays).
- */
-#if !DEBUG
-const unsigned char bl1_logo[] = {
-  0x42, 0x4d, 0xe6, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00,
-  0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3f, 0x00,
-  0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa0, 0x17,
-  0x00, 0x00, 0x46, 0x5c, 0x00, 0x00, 0x46, 0x5c, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xe0, 0x07,
-  0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08,
-  0x82, 0x08, 0x82, 0x08, 0x82, 0x08, 0xc3, 0x10, 0x04, 0x11, 0xa7, 0x21,
-  0x86, 0x21, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x21,
-  0x89, 0x32, 0x69, 0x2a, 0x29, 0x2a, 0x08, 0x2a, 0x45, 0x19, 0x00, 0x00,
-  0x21, 0x08, 0x45, 0x19, 0xa8, 0x21, 0xc8, 0x21, 0xc8, 0x21, 0xc8, 0x21,
-  0x26, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x24, 0x11, 0x2a, 0x43, 0x47, 0x2a, 0x64, 0x19, 0xe3, 0x10,
-  0xe3, 0x10, 0xc3, 0x10, 0x04, 0x11, 0xa6, 0x21, 0x8a, 0x32, 0x2d, 0x43,
-  0x8a, 0x32, 0xc7, 0x21, 0x25, 0x19, 0xc4, 0x10, 0xa3, 0x10, 0xa3, 0x10,
-  0xe5, 0x10, 0x83, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08,
-  0xa2, 0x08, 0x41, 0x00, 0x21, 0x08, 0xc6, 0x21, 0xc9, 0x3a, 0x4c, 0x3b,
-  0x4c, 0x43, 0x4c, 0x3b, 0xeb, 0x3a, 0x08, 0x22, 0x83, 0x08, 0x00, 0x00,
-  0x41, 0x00, 0x82, 0x10, 0xc4, 0x10, 0xe4, 0x10, 0xe4, 0x10, 0xe5, 0x10,
-  0xc4, 0x10, 0xa3, 0x10, 0x82, 0x08, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x21,
-  0x2a, 0x3b, 0xc9, 0x3a, 0xa8, 0x32, 0x27, 0x2a, 0xc6, 0x21, 0x85, 0x21,
-  0x65, 0x19, 0x65, 0x19, 0x86, 0x19, 0xe7, 0x21, 0x08, 0x2a, 0x49, 0x2a,
-  0x4a, 0x2a, 0x29, 0x2a, 0xc8, 0x21, 0xc8, 0x21, 0x87, 0x21, 0xa8, 0x21,
-  0xa8, 0x21, 0xc9, 0x21, 0xeb, 0x21, 0xea, 0x21, 0xaa, 0x21, 0x06, 0x11,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x21, 0x87, 0x2a, 0x84, 0x19,
-  0xa2, 0x08, 0x20, 0x00, 0x61, 0x08, 0x03, 0x11, 0xe6, 0x29, 0x27, 0x2a,
-  0x48, 0x32, 0x48, 0x2a, 0xc6, 0x21, 0x04, 0x19, 0x62, 0x08, 0x20, 0x00,
-  0x82, 0x08, 0x04, 0x11, 0xa8, 0x21, 0x2a, 0x22, 0x2a, 0x22, 0x0a, 0x22,
-  0xc9, 0x21, 0x26, 0x19, 0x83, 0x08, 0x21, 0x00, 0x41, 0x00, 0x41, 0x00,
-  0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x87, 0x2a, 0x29, 0x43, 0x0c, 0x4c,
-  0x4c, 0x54, 0x6e, 0x54, 0x2a, 0x3b, 0xa5, 0x21, 0x41, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x21, 0x6f, 0x43,
-  0x6e, 0x43, 0x0d, 0x3b, 0x4a, 0x2a, 0xc8, 0x21, 0xa8, 0x19, 0xa8, 0x19,
-  0xe9, 0x21, 0x6d, 0x2a, 0xaf, 0x3a, 0xcf, 0x3a, 0x4d, 0x32, 0x47, 0x11,
-  0x84, 0x08, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x05, 0x2a, 0x48, 0x3b, 0xc7, 0x3a, 0x87, 0x32, 0xe5, 0x21,
-  0x23, 0x19, 0xc3, 0x10, 0x23, 0x19, 0x88, 0x32, 0xe3, 0x10, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x66, 0x19, 0xc8, 0x21, 0x09, 0x22, 0x09, 0x22, 0xe9, 0x21,
-  0xc9, 0x21, 0x67, 0x19, 0xe5, 0x10, 0x83, 0x08, 0xa4, 0x08, 0x27, 0x11,
-  0x8a, 0x19, 0x69, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x22, 0x11, 0x43, 0x19, 0x44, 0x19, 0x05, 0x2a, 0x09, 0x3b,
-  0x0d, 0x54, 0x6d, 0x5c, 0x2d, 0x4c, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x66, 0x11, 0x86, 0x21, 0xe4, 0x10, 0xc3, 0x10, 0xc4, 0x10,
-  0x25, 0x11, 0xca, 0x21, 0xad, 0x2a, 0xcf, 0x32, 0xd0, 0x32, 0x6e, 0x2a,
-  0xa9, 0x21, 0x47, 0x19, 0xe6, 0x10, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08,
-  0xe7, 0x3a, 0x89, 0x4b, 0xea, 0x53, 0x49, 0x43, 0xa8, 0x32, 0x44, 0x19,
-  0x41, 0x08, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc3, 0x10, 0x4a, 0x2a, 0xac, 0x32, 0x4b, 0x2a,
-  0xea, 0x21, 0x05, 0x11, 0x41, 0x00, 0x20, 0x00, 0x62, 0x08, 0x48, 0x19,
-  0x0c, 0x22, 0x6f, 0x2a, 0x70, 0x2a, 0xcc, 0x21, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x19,
-  0xc6, 0x3a, 0x45, 0x32, 0x46, 0x2a, 0x46, 0x32, 0x87, 0x32, 0x08, 0x3b,
-  0xeb, 0x4b, 0x6a, 0x43, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x19, 0xa8, 0x21, 0x67, 0x19,
-  0xa8, 0x21, 0xc9, 0x21, 0x6d, 0x2a, 0xae, 0x32, 0x6d, 0x2a, 0xeb, 0x29,
-  0x69, 0x19, 0x48, 0x19, 0x27, 0x19, 0x48, 0x19, 0x49, 0x19, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x29, 0x6a, 0x5c,
-  0xac, 0x5c, 0xac, 0x5c, 0xac, 0x5c, 0x8c, 0x5c, 0x6c, 0x5c, 0x29, 0x3b,
-  0x64, 0x21, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x2f, 0x3b,
-  0xce, 0x32, 0x6d, 0x2a, 0x47, 0x19, 0x41, 0x00, 0x21, 0x00, 0xa3, 0x10,
-  0x48, 0x19, 0xcb, 0x21, 0xcb, 0x21, 0xab, 0x21, 0x6a, 0x19, 0x01, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x08, 0xaa, 0x5c, 0x69, 0x54,
-  0x47, 0x43, 0xc7, 0x3a, 0xc7, 0x32, 0xe8, 0x3a, 0xa9, 0x4b, 0x6d, 0x5c,
-  0x8e, 0x5c, 0xa5, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x08,
-  0x4c, 0x2a, 0xcf, 0x32, 0xf0, 0x32, 0xd0, 0x32, 0xb0, 0x32, 0x6e, 0x2a,
-  0xca, 0x21, 0x48, 0x11, 0x27, 0x11, 0x28, 0x11, 0x4a, 0x19, 0xac, 0x19,
-  0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x21, 0xa6, 0x32, 0x07, 0x3b,
-  0x89, 0x4b, 0xc9, 0x4b, 0xa9, 0x4b, 0x89, 0x43, 0x09, 0x3b, 0x87, 0x32,
-  0x26, 0x2a, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x67, 0x19, 0x89, 0x21, 0x47, 0x19, 0x26, 0x19, 0x47, 0x19,
-  0x89, 0x19, 0x8a, 0x19, 0x8a, 0x21, 0x8b, 0x21, 0x49, 0x19, 0x08, 0x11,
-  0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc2, 0x10, 0x4b, 0x65, 0xca, 0x5c, 0xe6, 0x3a,
-  0xe4, 0x21, 0x23, 0x19, 0x23, 0x19, 0xa4, 0x21, 0x66, 0x2a, 0xca, 0x4b,
-  0x4d, 0x54, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x63, 0x08, 0xcf, 0x32, 0x11, 0x3b, 0xaf, 0x2a, 0x8e, 0x2a,
-  0x4e, 0x2a, 0x4e, 0x2a, 0x2e, 0x22, 0x2e, 0x22, 0x0e, 0x22, 0x0e, 0x22,
-  0xee, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x81, 0x08, 0x63, 0x21, 0xe6, 0x3a, 0xe9, 0x53,
-  0x4a, 0x54, 0x8b, 0x5c, 0x6c, 0x5c, 0x2b, 0x54, 0xca, 0x4b, 0xc8, 0x32,
-  0x44, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0x05, 0x19, 0xca, 0x21,
-  0x2d, 0x2a, 0x6e, 0x2a, 0x6f, 0x2a, 0x2f, 0x2a, 0x0d, 0x22, 0x8a, 0x21,
-  0xc7, 0x10, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xa1, 0x10, 0xea, 0x64, 0x6c, 0x75, 0xe8, 0x4b, 0xc6, 0x32,
-  0x65, 0x32, 0x45, 0x2a, 0x25, 0x2a, 0x46, 0x2a, 0x67, 0x32, 0x49, 0x43,
-  0x6a, 0x43, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x27, 0x54, 0x44, 0x2a, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x08, 0x0b, 0x22, 0x0b, 0x22,
-  0xaa, 0x19, 0x69, 0x19, 0x69, 0x19, 0x69, 0x19, 0x6a, 0x19, 0xac, 0x21,
-  0x10, 0x2a, 0xed, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x04, 0x2a, 0xc8, 0x4b, 0x6a, 0x54, 0x8a, 0x5c,
-  0x8b, 0x5c, 0xab, 0x5c, 0x8c, 0x5c, 0x4c, 0x54, 0x0c, 0x54, 0xeb, 0x4b,
-  0xc8, 0x3a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0xa8, 0x5c, 0xac, 0x75, 0x24, 0x2a, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x07, 0x11,
-  0xaa, 0x21, 0xcc, 0x21, 0x0d, 0x22, 0xcc, 0x21, 0x69, 0x19, 0xa5, 0x10,
-  0x63, 0x08, 0x4a, 0x19, 0x84, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x20, 0x00, 0x49, 0x5c, 0x0c, 0x76, 0x4b, 0x65, 0xeb, 0x64, 0x2a, 0x54,
-  0xa9, 0x4b, 0x49, 0x43, 0x49, 0x43, 0x69, 0x4b, 0xeb, 0x4b, 0x6d, 0x54,
-  0x8b, 0x43, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x8d, 0x75, 0x66, 0x32,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x07, 0x11, 0xcb, 0x21, 0xab, 0x19, 0xab, 0x19, 0xcd, 0x21, 0x2f, 0x22,
-  0x72, 0x2a, 0x52, 0x2a, 0x4a, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x41, 0x00, 0x87, 0x4b, 0x69, 0x5c, 0xa8, 0x4b, 0xe6, 0x3a, 0xc8, 0x4b,
-  0x2a, 0x54, 0x8b, 0x5c, 0x6b, 0x54, 0xeb, 0x4b, 0x69, 0x43, 0x87, 0x32,
-  0x67, 0x2a, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0xa8, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x00, 0x6a, 0x19, 0xcb, 0x21, 0x8a, 0x19, 0x28, 0x11, 0x6a, 0x19,
-  0xac, 0x21, 0xcd, 0x21, 0x4b, 0x19, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x24, 0x2a, 0x4a, 0x6d, 0xab, 0x75, 0xcc, 0x75, 0x4a, 0x54, 0xe6, 0x3a,
-  0x85, 0x2a, 0x25, 0x2a, 0x46, 0x2a, 0x46, 0x2a, 0xa8, 0x32, 0x0c, 0x54,
-  0xec, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0xca, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xab, 0x19, 0x4f, 0x2a, 0x4f, 0x22, 0x30, 0x22,
-  0x50, 0x2a, 0x72, 0x2a, 0x31, 0x2a, 0x64, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0xa5, 0x32, 0x48, 0x5c, 0x67, 0x43, 0xa5, 0x3a, 0x09, 0x54, 0x2c, 0x6d,
-  0x8d, 0x6d, 0x6d, 0x6d, 0x6e, 0x6d, 0x4e, 0x65, 0xad, 0x5c, 0x4a, 0x43,
-  0xa5, 0x21, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x8f, 0x54, 0xaa, 0x3a, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x2e, 0x22, 0x0e, 0x2a, 0xed, 0x21,
-  0xac, 0x21, 0x29, 0x19, 0x29, 0x11, 0xe7, 0x10, 0x00, 0x00, 0x40, 0x08,
-  0x08, 0x54, 0xab, 0x75, 0xab, 0x6d, 0x8b, 0x6d, 0x6c, 0x6d, 0x4c, 0x6d,
-  0x0c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xcd, 0x5c, 0xcd, 0x5c, 0xcd, 0x5c,
-  0xcb, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xcc, 0x32, 0x20, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x10, 0xed, 0x21, 0x30, 0x2a,
-  0x52, 0x2a, 0x52, 0x2a, 0x32, 0x2a, 0x8c, 0x19, 0x00, 0x00, 0xa1, 0x08,
-  0x4a, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xb0, 0x4b, 0x0e, 0x3b, 0x41, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x10, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0xce, 0x21, 0x21, 0x00, 0xe1, 0x10,
-  0x0b, 0x76, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xaf, 0x4b, 0x50, 0x43, 0xf0, 0x3a,
-  0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x2f, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x42, 0x08, 0xa3, 0x21,
-  0x2b, 0x7e, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xb0, 0x4b, 0x50, 0x43, 0x30, 0x3b,
-  0x8e, 0x32, 0xa4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x21, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0xc5, 0x18, 0xa5, 0x3a,
-  0x0b, 0x7e, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xb0, 0x4b, 0x50, 0x43, 0x30, 0x3b,
-  0xd0, 0x3a, 0x70, 0x32, 0xa4, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x19, 0x71, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0x28, 0x19, 0x66, 0x43,
-  0xeb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xb0, 0x4b, 0x50, 0x43, 0x30, 0x3b,
-  0xd0, 0x3a, 0x91, 0x32, 0x30, 0x2a, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x08, 0x92, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x12, 0x2a, 0x6a, 0x21, 0x27, 0x54,
-  0xca, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xb0, 0x4b, 0x50, 0x43, 0x30, 0x3b,
-  0xd0, 0x3a, 0x70, 0x32, 0x51, 0x32, 0xa5, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x08, 0x92, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xac, 0x21, 0x88, 0x5c,
-  0xca, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xb0, 0x4b, 0x50, 0x43, 0x30, 0x3b,
-  0xd0, 0x32, 0xb2, 0x32, 0x29, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x11, 0x92, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xcd, 0x29, 0xe8, 0x5c,
-  0xca, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xb0, 0x4b, 0x50, 0x43, 0x30, 0x3b,
-  0xaf, 0x32, 0x06, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x21, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xee, 0x29, 0xe8, 0x5c,
-  0xca, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xaf, 0x4b, 0x91, 0x4b, 0x8d, 0x32,
-  0x83, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x22, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x0f, 0x32, 0xe8, 0x5c,
-  0xca, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x2e, 0x54, 0x0f, 0x4c, 0xf1, 0x4b, 0xa7, 0x21, 0x21, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x08, 0x4f, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xee, 0x29, 0x88, 0x5c,
-  0xca, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0x8e, 0x54, 0x4e, 0x54, 0xcf, 0x43, 0x45, 0x19, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x19, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xcd, 0x29, 0x27, 0x54,
-  0xca, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0xed, 0x64,
-  0xae, 0x5c, 0x4c, 0x43, 0xe3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x2e, 0x22, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0xac, 0x29, 0x87, 0x4b,
-  0xeb, 0x75, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0x88, 0x5c, 0xab, 0x75, 0x2c, 0x65, 0x0d, 0x65,
-  0xa8, 0x32, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x69, 0x19, 0x91, 0x32, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x12, 0x2a, 0x8a, 0x21, 0xc5, 0x3a,
-  0x0b, 0x7e, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0xa8, 0x5c, 0xcb, 0x75, 0x4c, 0x6d, 0x06, 0x2a,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xe6, 0x10, 0xb1, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0x29, 0x19, 0xc3, 0x21,
-  0x2b, 0x7e, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x20, 0x00, 0xc8, 0x5c, 0x89, 0x5c, 0x02, 0x11, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x06, 0x11, 0xb1, 0x32, 0xb1, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x32, 0x2a, 0xe6, 0x18, 0xe1, 0x10,
-  0x0b, 0x76, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x61, 0x08, 0xe4, 0x29, 0x61, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x21,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x11, 0x2a, 0x42, 0x08, 0xa1, 0x08,
-  0x4a, 0x6d, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x6d, 0x2a, 0xf1, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0xcf, 0x21, 0x21, 0x00, 0x60, 0x08,
-  0x68, 0x54, 0xab, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x06, 0x11, 0xae, 0x2a, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0x8d, 0x19, 0x01, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x8b, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0xea, 0x21, 0xf1, 0x3a, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x31, 0x2a, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00,
-  0x44, 0x2a, 0x8b, 0x75, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x08,
-  0x6c, 0x2a, 0x30, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x11, 0x2a, 0xa6, 0x08, 0x00, 0x00, 0x00, 0x00,
-  0xe1, 0x10, 0x6a, 0x6d, 0x8b, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x11, 0xee, 0x32,
-  0x51, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x10, 0x2a, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x20, 0x08, 0x28, 0x54, 0xab, 0x6d, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x21, 0x30, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x31, 0x2a, 0x6b, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x24, 0x2a, 0xcb, 0x75, 0x4b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x41, 0x00, 0xac, 0x2a, 0x91, 0x4b, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x51, 0x2a, 0xc6, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x81, 0x10, 0xea, 0x5c, 0x6b, 0x6d, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x25, 0x19, 0x2e, 0x3b, 0xb1, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x71, 0x2a, 0xee, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x07, 0x3b, 0x8b, 0x75, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x22,
-  0xaf, 0x4b, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x51, 0x2a, 0x08, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc2, 0x10, 0xeb, 0x64, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x2d, 0x43, 0xcf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x0f, 0x2a, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x3b, 0x4c, 0x6d, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x45, 0x19, 0x8d, 0x43, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x51, 0x2a,
-  0x49, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x10, 0xea, 0x5c, 0x4c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x71, 0x2a, 0x2f, 0x2a,
-  0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0x3a, 0x6c, 0x6d,
-  0x2c, 0x65, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x91, 0x2a, 0x91, 0x2a, 0x07, 0x11,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x4b,
-  0x6d, 0x6d, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0xb2, 0x32, 0xab, 0x21, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x08,
-  0x8b, 0x5c, 0x2c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x91, 0x32, 0x0e, 0x22, 0x21, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x63, 0x19, 0x0c, 0x65, 0x0d, 0x65, 0xed, 0x5c, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xb0, 0x32, 0xb0, 0x32, 0x70, 0x2a, 0xa4, 0x10, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x25, 0x2a, 0x0d, 0x65, 0xed, 0x64, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd0, 0x32, 0xb0, 0x32, 0xe6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xe5, 0x29, 0x0d, 0x65, 0xcd, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xd0, 0x32,
-  0xd1, 0x32, 0xe6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x2a, 0xad, 0x5c, 0xad, 0x5c,
-  0xaa, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0xf0, 0x32, 0xd0, 0x32, 0xaf, 0x32,
-  0x06, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x21, 0x2c, 0x4c,
-  0xcb, 0x4b, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x10, 0x3b, 0x11, 0x33, 0x6d, 0x2a, 0xc5, 0x08,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08,
-  0xe6, 0x21, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x30, 0x3b, 0x10, 0x3b, 0x31, 0x3b, 0xca, 0x21, 0x21, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x0b, 0x3b, 0x0f, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0x8f, 0x43, 0x8f, 0x43, 0x90, 0x43, 0x70, 0x43, 0x50, 0x3b, 0x50, 0x3b,
-  0x10, 0x3b, 0xae, 0x2a, 0xc4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x08, 0x2b, 0x3b, 0x10, 0x4c, 0xcf, 0x4b, 0xaf, 0x4b,
-  0xaf, 0x43, 0xaf, 0x43, 0xb1, 0x43, 0xb1, 0x4b, 0x0e, 0x3b, 0xc9, 0x21,
-  0x05, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0xc6, 0x21, 0xca, 0x32, 0xeb, 0x32, 0xeb, 0x32,
-  0x8b, 0x32, 0x08, 0x2a, 0x45, 0x11, 0xa3, 0x08, 0x41, 0x08, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-#endif
index a9879f0e08d17069001499a98ad95fc61cb1017a..f36b2d0c6f8b084b99436ccb71fddbe608e311b0 100644 (file)
 
 #include "bm1000_splash.h"
 
+#include <baikal_bootflash.h>
+#include <baikal_mshc.h>
+#include <baikal_def.h>
+
 static uint64_t trusted_mailbox[1 + PLATFORM_CORE_COUNT]
-       __attribute__ ((used, section(".trusted_mailbox")));
+       __section(".trusted_mailbox") __used;
 CASSERT(sizeof(trusted_mailbox) == BAIKAL_TRUSTED_MAILBOX_SIZE,
        assert_trusted_mailbox_size);
 
 /* Allocate space in static memory for DDR SPD content */
 const struct spd_container spd_content = {0};
 
+#if !DEBUG
+static char msg_buf[300];
+#endif
+
 /*
  * Cannot use default weak implementation in bl1_main.c because BL1 RW and BL2
  * data size exceeds Mailbox SRAM.
@@ -74,12 +82,10 @@ int bl1_plat_handle_post_image_load(unsigned int image_id)
 
 static void ccn_hnf_sam_setup(void)
 {
-       unsigned i;
+       unsigned int i;
        uintptr_t pccn = PLAT_ARM_CCN_BASE + CCN_HNF_OFFSET + 8;
        uint64_t snf0 = 0, snf1 = 0;
 
-       INFO("%s...\n", __func__);
-
        if (cmu_pll_is_enabled(MMDDR0_CMU0_BASE)) {
                snf0 = 4;
        }
@@ -138,14 +144,12 @@ void bl1_early_platform_setup(void)
 #endif
        write_cntfrq_el0(plat_get_syscnt_freq2());
        generic_delay_timer_init();
-#ifndef BAIKAL_QEMU
+
        dram_init();
-#endif
        ccn_hnf_sam_setup();
-
        err  = memtest_rand64(BL1_XLAT_BASE, BL1_XLAT_SIZE, sizeof(uint64_t), read_cntpct_el0());
 #if DEBUG
-       err |= memtest_rand8( BL1_XLAT_BASE, BL1_XLAT_SIZE, sizeof(uint8_t), read_cntpct_el0());
+       err |= memtest_rand8(BL1_XLAT_BASE, BL1_XLAT_SIZE, sizeof(uint8_t), read_cntpct_el0());
 #endif
        if (err) {
                ERROR("%s: DRAM error\n", __func__);
@@ -184,18 +188,16 @@ void bl1_plat_arch_setup(void)
 
 void bl1_platform_setup(void)
 {
-#if !DEBUG
-       extern uint8_t bl1_logo[];
-#endif
        uint8_t *spd_ptr = (uint8_t *)PLAT_DDR_SPD_BASE;
-       memcpy(spd_ptr, &spd_content, sizeof(struct spd_container));
 
+       memcpy(spd_ptr, &spd_content, sizeof(struct spd_container));
        plat_baikal_io_setup();
-       bootflash_init();
-       mmxgbe_init();
+       generic_delay_timer_init();
+       mmavlsp_init();
 #if !DEBUG
-       hdmi_early_splash(bl1_logo);
-#else
-       hdmi_early_splash(NULL);
+       snprintf(msg_buf, sizeof(msg_buf), "BE-M1000\nBL1: %s\nBL1: %s\n", version_string, build_message);
+       lvds_early_splash(msg_buf);
+       mmxgbe_init();
+       hdmi_early_splash(msg_buf);
 #endif
 }
index 32d5d6ad756b9c1daa271ae7cdfaa41ae57c8d60..bfbe04afd8d3ee479c89e048b448ec26cc5f1ff5 100644 (file)
@@ -11,6 +11,7 @@
 #include <common/bl_common.h>
 #include <common/debug.h>
 #include <common/desc_image_load.h>
+#include <lib/mmio.h>
 #include <lib/utils.h>
 #include <libfdt.h>
 #ifdef SPD_opteed
@@ -47,6 +48,7 @@ void bl2_early_platform_setup2(u_register_t arg0,
                               u_register_t arg3)
 {
        meminfo_t *mem_layout = (meminfo_t *)arg1;
+
        baikal_console_boot_init();
 
        /* Setup the BL2 memory layout */
@@ -61,7 +63,7 @@ void bl2_platform_setup(void)
 
        ret = fdt_open_into(fdt, fdt, BAIKAL_DTB_MAX_SIZE);
        if (ret >= 0) {
-               unsigned dimm_idx;
+               unsigned int dimm_idx;
                /*
                 * DBM has 4 DIMM slots with the following SPD addresses:
                 * 0x50, 0x51, 0x52, 0x53. But only 0x50 and 0x52 are used by SCP FW.
@@ -75,18 +77,21 @@ void bl2_platform_setup(void)
                for (dimm_idx = 0; dimm_idx < ARRAY_SIZE(dimm_spd_addrs); ++dimm_idx) {
                        if (spd_ptr->content[dimm_idx].mem_type == SPD_MEMTYPE_DDR4) {
                                unsigned int half_bus_shift = 0;
+
                                if (dimm_idx) {
-                                       if ((*(volatile uint32_t*)(MMDDR1_CTRL_BASE)) & 1 << 12) {
+                                       if (mmio_read_32(MMDDR1_CTRL_BASE) & BIT(12)) {
                                                half_bus_shift = 1;
                                        }
                                } else {
-                                       if ((*(volatile uint32_t*)(MMDDR0_CTRL_BASE)) & 1 << 12) {
+                                       if (mmio_read_32(MMDDR0_CTRL_BASE) & BIT(12)) {
                                                half_bus_shift = 1;
                                        }
                                }
-                               const unsigned long long dimm_capacity = \
-                                       spd_get_baseconf_dimm_capacity(&spd_ptr->content[dimm_idx]) \
+
+                               const unsigned long long dimm_capacity =
+                                       spd_get_baseconf_dimm_capacity(&spd_ptr->content[dimm_idx])
                                                >> half_bus_shift;
+
                                if (dimm_capacity > 0) {
 #ifdef BAIKAL_DUAL_CHANNEL_MODE
                                        if (spd_ptr->dual_channel[dimm_idx] == 'y') {
@@ -111,7 +116,7 @@ void bl2_platform_setup(void)
 
                if (total_capacity > 0) {
                        uint64_t region_descs[3][2];
-                       unsigned region_num;
+                       unsigned int region_num;
 
                        region_descs[0][0] = REGION_DRAM0_BASE;
                        region_descs[1][0] = REGION_DRAM1_BASE;
diff --git a/plat/baikal/bm1000/bm1000_bl31_sdk_version_logo.c b/plat/baikal/bm1000/bm1000_bl31_sdk_version_logo.c
deleted file mode 100644 (file)
index 69c2a41..0000000
+++ /dev/null
@@ -1,614 +0,0 @@
-const unsigned char bl31_sdk_version_logo[] = {
-  0x42, 0x4d, 0xaa, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00,
-  0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x14, 0x00,
-  0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x1c,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
-  0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x42, 0x47,
-  0x52, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0xa0, 0xa0, 0xa0, 0xff, 0x82, 0x82, 0x82, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x1b, 0x1b, 0x1b, 0xff, 0x91, 0x91, 0x91, 0xff, 0x8b, 0x8b,
-  0x8b, 0xff, 0x96, 0x96, 0x96, 0xff, 0x4b, 0x4b, 0x4b, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x02, 0x02, 0x02, 0xff, 0xd3, 0xd3, 0xd3, 0xff, 0xa7, 0xa7,
-  0xa7, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x21, 0x21,
-  0x21, 0xff, 0x9b, 0x9b, 0x9b, 0xff, 0x90, 0x90, 0x90, 0xff, 0x8a, 0x8a,
-  0x8a, 0xff, 0x04, 0x04, 0x04, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x26, 0x26,
-  0x26, 0xff, 0x6e, 0x6e, 0x6e, 0xff, 0x82, 0x82, 0x82, 0xff, 0x09, 0x09,
-  0x09, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x5b, 0x5b, 0x5b, 0xff, 0x10, 0x10, 0x10, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x84, 0x84, 0x84, 0xff, 0x1b, 0x1b,
-  0x1b, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0x82, 0x82,
-  0x82, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x8a, 0x8a,
-  0x8a, 0xff, 0x05, 0x05, 0x05, 0xff, 0x00, 0x00, 0x00, 0xff, 0x2c, 0x2c,
-  0x2c, 0xff, 0x68, 0x68, 0x68, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x25, 0x25, 0x25, 0xff, 0x93, 0x93, 0x93, 0xff, 0x94, 0x94,
-  0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x94, 0x94,
-  0x94, 0xff, 0x90, 0x90, 0x90, 0xff, 0x0a, 0x0a, 0x0a, 0xff, 0x25, 0x25,
-  0x25, 0xff, 0x93, 0x93, 0x93, 0xff, 0x94, 0x94, 0x94, 0xff, 0x94, 0x94,
-  0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x90, 0x90,
-  0x90, 0xff, 0x0a, 0x0a, 0x0a, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x83, 0x83,
-  0x83, 0xff, 0x11, 0x11, 0x11, 0xff, 0x2e, 0x2e, 0x2e, 0xff, 0x5d, 0x5d,
-  0x5d, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x25, 0x25, 0x25, 0xff, 0x62, 0x62,
-  0x62, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x14, 0x14, 0x14, 0xff, 0x7c, 0x7c,
-  0x7c, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x87, 0x87, 0x87, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x25, 0x25, 0x25, 0xff, 0x93, 0x93,
-  0x93, 0xff, 0x94, 0x94, 0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x94, 0x94,
-  0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x90, 0x90, 0x90, 0xff, 0x0a, 0x0a,
-  0x0a, 0xff, 0x25, 0x25, 0x25, 0xff, 0x93, 0x93, 0x93, 0xff, 0x94, 0x94,
-  0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x94, 0x94,
-  0x94, 0xff, 0x90, 0x90, 0x90, 0xff, 0x0a, 0x0a, 0x0a, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x06, 0x06, 0x06, 0xff, 0x8d, 0x8d,
-  0x8d, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x8d, 0x8d,
-  0x8d, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0xff, 0x6e, 0x6e,
-  0x6e, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x33, 0x33, 0x33, 0xff, 0xb5, 0xb5,
-  0xb5, 0xff, 0x28, 0x28, 0x28, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4f, 0x4f,
-  0x4f, 0xff, 0x53, 0x53, 0x53, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x24, 0x24, 0x24, 0xff, 0x8f, 0x8f, 0x8f, 0xff, 0x90, 0x90,
-  0x90, 0xff, 0x90, 0x90, 0x90, 0xff, 0x90, 0x90, 0x90, 0xff, 0x90, 0x90,
-  0x90, 0xff, 0x8c, 0x8c, 0x8c, 0xff, 0x0a, 0x0a, 0x0a, 0xff, 0x24, 0x24,
-  0x24, 0xff, 0x8f, 0x8f, 0x8f, 0xff, 0x90, 0x90, 0x90, 0xff, 0x90, 0x90,
-  0x90, 0xff, 0x90, 0x90, 0x90, 0xff, 0x90, 0x90, 0x90, 0xff, 0x8c, 0x8c,
-  0x8c, 0xff, 0x0a, 0x0a, 0x0a, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x59, 0x59, 0x59, 0xff, 0x3b, 0x3b,
-  0x3b, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x65, 0x65,
-  0x65, 0xff, 0x29, 0x29, 0x29, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0d, 0x0d, 0x0d, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x69, 0x69, 0x69, 0xff, 0x30, 0x30,
-  0x30, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x2b, 0x2b, 0x2b, 0xff, 0x60, 0x60,
-  0x60, 0xff, 0x7c, 0x7c, 0x7c, 0xff, 0x92, 0x92, 0x92, 0xff, 0x68, 0x68,
-  0x68, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x24, 0x24, 0x24, 0xff, 0x8f, 0x8f,
-  0x8f, 0xff, 0x90, 0x90, 0x90, 0xff, 0x90, 0x90, 0x90, 0xff, 0x90, 0x90,
-  0x90, 0xff, 0x90, 0x90, 0x90, 0xff, 0x8c, 0x8c, 0x8c, 0xff, 0x0a, 0x0a,
-  0x0a, 0xff, 0x24, 0x24, 0x24, 0xff, 0x8f, 0x8f, 0x8f, 0xff, 0x90, 0x90,
-  0x90, 0xff, 0x90, 0x90, 0x90, 0xff, 0x90, 0x90, 0x90, 0xff, 0x90, 0x90,
-  0x90, 0xff, 0x8c, 0x8c, 0x8c, 0xff, 0x0a, 0x0a, 0x0a, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x4b, 0x4b, 0x4b, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0x8a, 0x8a,
-  0x8a, 0xff, 0x02, 0x02, 0x02, 0xff, 0x1a, 0x1a, 0x1a, 0xff, 0x9c, 0x9c,
-  0x9c, 0xff, 0xc1, 0xc1, 0xc1, 0xff, 0x2e, 0x2e, 0x2e, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0xca, 0xca, 0xca, 0xff, 0x94, 0x94,
-  0x94, 0xff, 0x97, 0x97, 0x97, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x03, 0x03, 0x03, 0xff, 0x95, 0x95,
-  0x95, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x10, 0x10, 0x10, 0xff, 0x78, 0x78, 0x78, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5d, 0x5d,
-  0x5d, 0xff, 0x72, 0x72, 0x72, 0xff, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x10, 0x10, 0x10, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x94, 0x94,
-  0x94, 0xff, 0x94, 0x94, 0x94, 0xff, 0x82, 0x82, 0x82, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x56, 0x56, 0x56, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0x97, 0x97,
-  0x97, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
-  0x00, 0xff, 0x00, 0x00, 0x00, 0xff
-};
index 846e3f01c376237c1685dfa266c79e945cf320bf..b6b0a0606a8507b078633fd7d5def92307dced84 100644 (file)
@@ -1,11 +1,10 @@
 /*
- * Copyright (c) 2018-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2018-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
 #include <common/bl_common.h>
-#include <common/debug.h>
 #include <drivers/generic_delay_timer.h>
 #include <plat/arm/common/plat_arm.h>
 #include <plat/common/platform.h>
@@ -18,7 +17,9 @@
 
 #include "bm1000_mmca57.h"
 #include "bm1000_splash.h"
-#include "bm1000_vdu.h"
+
+#define XSTR(x) STR(x)
+#define STR(x) #x
 
 /*
  * The next 3 constants identify the extents of the code, RO data region and the
 #define BL31_END (unsigned long)(&__BL31_END__)
 
 extern uint8_t bl31_logo[];
-extern uint8_t bl31_sdk_version_logo[];
+
+static void bl31_splash(void)
+{
+       modeline_t old_lvds_mode, new_lvds_mode;
+       int do_lvds_init;
+
+#ifdef SDK_VERSION
+       snprintf(sdk_version, SDK_VERSION_SIZE, "== v%s ==", XSTR(SDK_VERSION));
+#endif
+       display_logo_and_version(MMXGBE_VDU_BASE, FB2_BASE, &hdmi_video_mode, bl31_logo);
+#if DEBUG
+       vdu_init(MMXGBE_VDU_BASE, (uintptr_t)FB2_BASE, &hdmi_video_mode);
+#endif
+       memcpy(&old_lvds_mode, &lvds_video_mode, sizeof(lvds_video_mode));
+       memcpy(&new_lvds_mode, &lvds_video_mode, sizeof(lvds_video_mode));
+       if (!fdt_get_panel(&new_lvds_mode)) {
+               display_logo_and_version(MMAVLSP_VDU_BASE, FB0_BASE, &new_lvds_mode, bl31_logo);
+#if !DEBUG
+               do_lvds_init = memcmp(&old_lvds_mode, &new_lvds_mode, sizeof(old_lvds_mode));
+#else
+               do_lvds_init = 1;
+#endif
+               if (do_lvds_init) {
+                       vdu_init(MMAVLSP_VDU_BASE, (uintptr_t)FB0_BASE,
+                                &new_lvds_mode);
+               }
+       }
+}
 
 void bl31_plat_arch_setup(void)
 {
@@ -46,44 +74,22 @@ void bl31_plat_arch_setup(void)
 
 void bl31_platform_setup(void)
 {
-       int fb_cpp;
-
        generic_delay_timer_init();
-
+#if DEBUG
        INFO("Init AVLSP...\n");
        mmavlsp_init();
-
-#ifndef BAIKAL_QEMU
+#endif
        INFO("Init CA57 PVTs...\n");
        cmu_clkch_enable_by_base(MMCA57_0_PVT_CLKCHCTL, PVT_CLKCH_DIV);
        cmu_clkch_enable_by_base(MMCA57_1_PVT_CLKCHCTL, PVT_CLKCH_DIV);
        cmu_clkch_enable_by_base(MMCA57_2_PVT_CLKCHCTL, PVT_CLKCH_DIV);
        cmu_clkch_enable_by_base(MMCA57_3_PVT_CLKCHCTL, PVT_CLKCH_DIV);
-#endif
 
        INFO("Init XGbE...\n");
-       fb_cpp = bmp_to_fb((uintptr_t)FB2_BASE, &hdmi_video_mode, bl31_logo, 0, 0, 1);
-       if (fb_cpp > 2) { /* we do not support 16-bit and lower color resolutions here */
-               int h1, h2, w1, w2;
-
-               /* Put SDK version just behind the logo, aligned to its right edge */
-               bmp_get_dimensions(bl31_logo, &w1, &h1);
-               bmp_get_dimensions(bl31_sdk_version_logo, &w2, &h2);
-               bmp_to_fb((uintptr_t)FB2_BASE,
-                         &hdmi_video_mode,
-                         bl31_sdk_version_logo,
-                         (w1 - w2) / 2,
-                         (h1 + h2) / 2,
-                         0);
-#ifndef BAIKAL_QEMU
-               wait_for_vblank(MMXGBE_VDU_BASE);
+#if DEBUG
+       mmxgbe_init();
+       hdmi_tx_init();
 #endif
-               vdu_set_fb(MMXGBE_VDU_BASE,
-                          (uintptr_t)FB2_BASE,
-                          &hdmi_video_mode,
-                          fb_cpp);
-       }
-
        mmxgbe_ns_access();
 
        INFO("Init USB...\n");
@@ -101,73 +107,16 @@ void bl31_platform_setup(void)
        INFO("Init VDec...\n");
        mmvdec_init();
 
-       INFO("Init Coresight...\n");
+       INFO("Init CoreSight...\n");
        mmcoresight_init();
 
        baikal_gic_driver_init();
        baikal_gic_init();
+
+       bl31_splash();
 }
 
 void bl31_plat_enable_mmu(uint32_t flags)
 {
        enable_mmu_el3(flags);
 }
-
-void bl31_plat_runtime_setup(void)
-{
-       int fb_cpp;
-       unsigned idx;
-       struct cmu_desc *lvds_vdu_cmu = NULL;
-
-       /* Set frequencies from device tree */
-       for (idx = 0; ; ++idx) {
-               struct cmu_desc *const cmu = cmu_desc_get_by_idx(idx);
-               if (cmu == NULL || !cmu->base) {
-                       break;
-               }
-
-               INFO("%s: base=0x%08lx name=%s rate=%lu\n", __func__, cmu->base, cmu->name, cmu->fpllreq);
-
-               if (cmu->base == MMAVLSP_CMU1_BASE) {
-                       lvds_vdu_cmu = cmu;
-                       continue;
-               }
-
-               cmu_pll_set_rate(cmu->base, cmu->frefclk, cmu->fpllreq);
-       }
-
-       if (!fdt_get_panel(&lvds_video_mode)) {
-               fb_cpp = bmp_to_fb((uintptr_t)FB0_BASE, &lvds_video_mode,
-                                  bl31_logo, 0, 0, 1);
-               if (fb_cpp > 2) { /* we do not support 16-bit and lower color resolutions here */
-                       int h1, h2, w1, w2;
-
-                       vdu_set_fb(MMAVLSP_VDU_BASE,
-                                  (uintptr_t)FB0_BASE,
-                                  &lvds_video_mode,
-                                  fb_cpp);
-
-                       /*
-                        * Put SDK version just behind the logo,
-                        * aligned to its right edge
-                        */
-                       bmp_get_dimensions(bl31_logo, &w1, &h1);
-                       bmp_get_dimensions(bl31_sdk_version_logo, &w2, &h2);
-                       bmp_to_fb((uintptr_t)FB0_BASE,
-                                 &lvds_video_mode,
-                                 bl31_sdk_version_logo,
-                                 (w1 - w2) / 2,
-                                 (h1 + h2) / 2,
-                                 0);
-
-                       if (lvds_vdu_cmu != NULL) {
-                               cmu_pll_set_rate(lvds_vdu_cmu->base,
-                                                lvds_vdu_cmu->frefclk,
-                                                lvds_video_mode.clock * 7);
-                       }
-
-                       vdu_init(MMAVLSP_VDU_BASE, (uintptr_t)FB0_BASE,
-                                &lvds_video_mode);
-               }
-       }
-}
diff --git a/plat/baikal/bm1000/bm1000_font.c b/plat/baikal/bm1000/bm1000_font.c
new file mode 100644 (file)
index 0000000..673e96f
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2023, Baikal Electronics, JSC. All rights reserved.
+ *
+ * This is bitmap data for 8x19 font from UEFI.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdint.h>
+
+const uint8_t font[] = {
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x18, 0x18, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0x06, 0xC6, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC6, 0xC6, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x76, 0xDC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC0, 0x60, 0x60, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x38, 0xFE, 0x38, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x60, 0x60, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC2, 0xFE, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x06, 0x3C, 0x06, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x1C, 0x1C, 0x3C, 0x3C, 0x6C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0x06, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x3C, 0x60, 0xC0, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDE, 0xDE, 0xDE, 0xDC, 0xC0, 0xC0, 0x7E, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x68, 0x78, 0x68, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFE, 0x66, 0x62, 0x60, 0x64, 0x7C, 0x64, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0, 0xDE, 0xC6, 0xC6, 0xC6, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC6, 0xEE, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xF6, 0xF6, 0xDE, 0xCE, 0xCE, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0x7C, 0x1C, 0x0E, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x78, 0x6C, 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x60, 0x38, 0x0C, 0x06, 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFC, 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x6C, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xC0, 0xC0, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7E, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xFE, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x1E, 0x33, 0x30, 0x30, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00,
+       0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x60, 0x7C, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x0C, 0x0C, 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x6C, 0x38, 0x00,
+       0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xEE, 0xFE, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x7C, 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x10, 0x30, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6, 0xFE, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x18, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0xE0, 0x30, 0x30, 0x30, 0x30, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/plat/baikal/bm1000/bm1000_font.h b/plat/baikal/bm1000/bm1000_font.h
new file mode 100644 (file)
index 0000000..6bdf442
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2023, Baikal Electronics, JSC. All rights reserved.
+ *
+ * Font header file
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef BM1000_FONT_H
+#define BM1000_FONT_H
+
+#include <stdint.h>
+
+#define FONT_WIDTH     8       /* witdh > 8 is not supported */
+#define FONT_HEIGHT    19
+#define FONT_FIRST_CHAR        0x20
+#define FONT_LAST_CHAR 0x7f
+
+extern const uint8_t font[];
+
+#endif /* BM1000_FONT_H */
index c03ee31af010db9eb38de8e04366412655229f06..1944432d93bf7efcc12692809770f9b55da139e1 100644 (file)
@@ -5,10 +5,6 @@
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
- * Parts of this file were based on sources as follows:
- *
- * Copyright (c) 2011, ARM Ltd. All rights reserved.<BR>
- * SPDX-License-Identifier: BSD-2-Clause-Patent
  */
 
 #ifndef BM1000_HDMI_H
index 95c7fa6b4e92bc5559f1188a4571d2fe43a7ea8f..26451ee79fb5c6339b84bb660c0dc9bad1c6da32 100644 (file)
@@ -15,7 +15,9 @@
 /* Clock dividers for MMAVLSP CMU0 clock channels, PLL frequency is assumed 1200 MHz */
 #define MMAVLSP_CLK_7361963HZ  163
 #define MMAVLSP_CLK_8MHZ       150
+#define MMAVLSP_CLK_10MHZ      120
 #define MMAVLSP_CLK_25MHZ       48
+#define MMAVLSP_CLK_40MHZ       30
 #define MMAVLSP_CLK_48MHZ       25
 #define MMAVLSP_CLK_50MHZ       24
 #define MMAVLSP_CLK_100MHZ      12
 void mmavlsp_init(void)
 {
        const cmu_pll_ctl_vals_t mmavlsp_cmu0_pll_ctls = {
-               0, 0, 0x6000000000, 0, 0x2c, 0, 0x2c
-       };
-       const cmu_pll_ctl_vals_t mmavlsp_cmu1_pll_ctls = {
-               0x1, 0, 0x9a00000000, 0, 0x2c, 0, 0x2c
+               0, 0, 0x6000000000, 0, -20, 0, -20
        };
 
+#ifdef BAIKAL_LVDS_CLKEN_GPIO_PIN
+       gpio_out_rst(MMAVLSP_GPIO32_BASE, BAIKAL_LVDS_CLKEN_GPIO_PIN);
+       gpio_dir_set(MMAVLSP_GPIO32_BASE, BAIKAL_LVDS_CLKEN_GPIO_PIN);
+#endif
+
        cmu_pll_on(MMAVLSP_CMU0_BASE, &mmavlsp_cmu0_pll_ctls);
 
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_GPIO32,      MMAVLSP_CLK_8MHZ);
@@ -46,7 +50,7 @@ void mmavlsp_init(void)
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_TIMER2,      MMAVLSP_CLK_50MHZ);
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_TIMER3,      MMAVLSP_CLK_50MHZ);
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_TIMER4,      MMAVLSP_CLK_50MHZ);
-       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_DMAC,        MMAVLSP_CLK_200MHZ);
+       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_DMACLSP,     MMAVLSP_CLK_200MHZ);
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_SMBUS1,      MMAVLSP_CLK_50MHZ);
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_SMBUS2,      MMAVLSP_CLK_50MHZ);
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_HDA_SYS,     MMAVLSP_CLK_100MHZ);
@@ -56,13 +60,12 @@ void mmavlsp_init(void)
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_HWA_AXI_MMU, MMAVLSP_CLK_400MHZ);
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_VDU_AXI,     MMAVLSP_CLK_300MHZ);
        cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_SMMU,        MMAVLSP_CLK_300MHZ);
-
-       cmu_pll_on(MMAVLSP_CMU1_BASE, &mmavlsp_cmu1_pll_ctls);
-
-#ifdef BAIKAL_LVDS_CLKEN_GPIO_PIN
-       gpio_out_rst(MMAVLSP_GPIO32_BASE, BAIKAL_LVDS_CLKEN_GPIO_PIN);
-       gpio_dir_set(MMAVLSP_GPIO32_BASE, BAIKAL_LVDS_CLKEN_GPIO_PIN);
-#endif
+       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_MSHC_AXI,    MMAVLSP_CLK_200MHZ);
+       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_MSHC_AHB,    MMAVLSP_CLK_200MHZ);
+       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_MSHC_TX_X2,  MMAVLSP_CLK_400MHZ);
+       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_MSHC_BCLK,   MMAVLSP_CLK_40MHZ);
+       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_MSHC_TMCLK,  MMAVLSP_CLK_10MHZ);
+       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_MSHC_CQETMCLK, MMAVLSP_CLK_10MHZ);
 
        /* Deassert reset signals */
        mmio_clrbits_32(MMAVLSP_GPR_MMRST1,
@@ -70,7 +73,7 @@ void mmavlsp_init(void)
                        MMAVLSP_GPR_MMRST1_NIC_CFG_M_RST  |
                        MMAVLSP_GPR_MMRST1_NIC_S_RST      |
                        MMAVLSP_GPR_MMRST1_NIC_M_RST      |
-                       MMAVLSP_GPR_MMRST1_DMAC_RST       |
+                       MMAVLSP_GPR_MMRST1_DMACLSP_RST    |
                        MMAVLSP_GPR_MMRST1_SMMU_RST       |
                        MMAVLSP_GPR_MMRST1_GPIO_RST       |
                        MMAVLSP_GPR_MMRST1_UART1_RST      |
index 73eb94074f23615056c70ce07e33dbbb33ca568c..3d4fc65cab092b71417fabee883fc524a4053ab0 100644 (file)
@@ -44,7 +44,7 @@ static const uintptr_t mmca57_bases[] = {
 };
 CASSERT(ARRAY_SIZE(mmca57_bases) == PLATFORM_CLUSTER_COUNT, assert_mmca57_bases_size);
 
-unsigned mmca57_get_sclk_div(const uintptr_t base)
+unsigned int mmca57_get_sclk_div(const uintptr_t base)
 {
        uint32_t reg;
 
@@ -61,8 +61,8 @@ unsigned mmca57_get_sclk_div(const uintptr_t base)
 
 void mmca57_enable_core(const u_register_t mpidr)
 {
-       const unsigned cluster = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
-       const unsigned core    = mpidr & 0x3;
+       const unsigned int cluster = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
+       const unsigned int core    = mpidr & 0x3;
        uint32_t reg;
 
        assert(cluster < PLATFORM_CLUSTER_COUNT);
@@ -73,6 +73,7 @@ void mmca57_enable_core(const u_register_t mpidr)
        if (!cmu_pll_is_enabled(base)) {
                int ret;
 
+               cmu_pll_set_gains(base, 0, -20, 0, -20);
                ret = cmu_pll_enable(base);
                if (ret) {
                        return;
@@ -105,7 +106,7 @@ void mmca57_enable_core(const u_register_t mpidr)
        mmio_write_32(base + MMCA57_CFG_RST, reg);
 }
 
-void mmca57_reconf_sclken(const uintptr_t base, const unsigned div)
+void mmca57_reconf_sclken(const uintptr_t base, const unsigned int div)
 {
        uint32_t reg;
 
index 9baea8b3cf7a2aa700a3d37bbd7c94584ea77ec9..3cbd5660ca0a567f55905427263a48546e5719c3 100644 (file)
@@ -9,8 +9,8 @@
 
 #include <stdint.h>
 
-unsigned mmca57_get_sclk_div(const uintptr_t base);
-void    mmca57_enable_core(const u_register_t mpidr);
-void    mmca57_reconf_sclken(const uintptr_t base, const unsigned div);
+unsigned int mmca57_get_sclk_div(const uintptr_t base);
+void        mmca57_enable_core(const u_register_t mpidr);
+void        mmca57_reconf_sclken(const uintptr_t base, const unsigned int div);
 
 #endif /* BM1000_MMCA57_H */
index f400ac544854222e93f6877847da981e3621724e..d0cf056a23168bc567c38ab9ca24cf51ee436469 100644 (file)
@@ -14,7 +14,7 @@
 void mmmali_init(void)
 {
        const cmu_pll_ctl_vals_t mmmali_cmu0_pll_ctls = {
-               0, 0, 0x6800000000, 0, 0x2c, 0, 0x2c
+               0, 0, 0x6800000000, 0, -20, 0, -20
        };
 
        cmu_pll_on(MMMALI_CMU0_BASE, &mmmali_cmu0_pll_ctls);
index 4c57e3147119bff5bcf88101fa7f44bb74d8f0c2..b5c298bfc9e83b431984a3afacc48587a532c460 100644 (file)
@@ -15,7 +15,7 @@ void mmpcie_init(void)
 {
        uint32_t reg;
        const cmu_pll_ctl_vals_t mmpcie_cmu0_pll_ctls = {
-               0, 0, 0x7800000000, 0, 0x2c, 0, 0x2c
+               0, 0, 0x7800000000, 0, -20, 0, -20
        };
 
        cmu_pll_on(MMPCIE_CMU0_BASE, &mmpcie_cmu0_pll_ctls);
index a0c8db1ba15a6ab438d4956435b116014d4b6075..5288a0929d87420e12e32bad30893ca3155b2480 100644 (file)
 #include <bm1000_def.h>
 #include <bm1000_private.h>
 
+#define MMUSB_CLK_50MHZ                 16
+#define MMUSB_CLK_100MHZ         8
+#define MMUSB_CLK_133MHZ         6
+#define MMUSB_CLK_160MHZ         5
+#define MMUSB_CLK_200MHZ         4
+#define MMUSB_CLK_400MHZ         2
+
 void mmusb_init(void)
 {
        uint32_t reg;
        const cmu_pll_ctl_vals_t mmusb_cmu0_pll_ctls = {
-               1, 0, 0x8000000000, 0, 0x2c, 0, 0x2c /* PLL 800 MHz */
+               1, 0, 0x8000000000, 0, -20, 0, -20 /* 800 MHz */
        };
 
        cmu_pll_on(MMUSB_CMU0_BASE, &mmusb_cmu0_pll_ctls);
 
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_SATA_REF,       8); /* 100 MHz axi clk controller #1 (50 - 100 MHz) */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_SATA0_AXI,      8); /* 100 MHz differential reference clock */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_SATA1_AXI,      8); /* 100 MHz axi clk controller #0 (50 - 100 MHz) */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB2_PHY0_REF, 16); /*  50 MHz max reference PHY #0 clock */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB2_PHY1_REF, 16); /*  50 MHz max reference PHY #1 clock */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB2_AXI,      16); /*  50 MHz axi clock */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB2_SOFITP,    8); /* 100 MHz reference clock for SOF and ITP counter (16.129 - 125 MHz) */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_PHY0_REF,  8); /* 100 MHz differential reference clock PHY #0 */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_PHY1_REF,  8); /* 100 MHz differential reference clock PHY #1 */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_PHY2_REF, 16); /*  50 MHz max reference PHY #2 clock */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_PHY3_REF, 16); /*  50 MHz max reference PHY #3 clock */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_AXI,       6); /* 133 MHz axi clock */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_SOFITP,    8); /* 100 MHz reference clock for SOF and ITP counter (16.129 - 125 MHz) */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_SUSPEND,   8); /* 100 MHz suspend clock for low power state (P3) (32 kHz - 125 MHz) */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_SMMU,           2); /* 400 MHz axi clk (200 - 400 MHz) */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_DMAC,           4); /* 200 MHz - temp value (250 MHz axi clk (100 - 250 MHz)) */
-       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_GIC,            5); /* 160 MHz */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_SATA_REF,       MMUSB_CLK_100MHZ); /* 100 MHz axi clk controller #1 (50 - 100 MHz) */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_SATA0_AXI,      MMUSB_CLK_100MHZ); /* 100 MHz differential reference clock */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_SATA1_AXI,      MMUSB_CLK_100MHZ); /* 100 MHz axi clk controller #0 (50 - 100 MHz) */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB2_PHY0_REF,  MMUSB_CLK_50MHZ);  /*  50 MHz max reference PHY #0 clock */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB2_PHY1_REF,  MMUSB_CLK_50MHZ);  /*  50 MHz max reference PHY #1 clock */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB2_AXI,       MMUSB_CLK_50MHZ);  /*  50 MHz axi clock */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB2_SOFITP,    MMUSB_CLK_100MHZ); /* 100 MHz reference clock for SOF and ITP counter (16.129 - 125 MHz) */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_PHY0_REF,  MMUSB_CLK_100MHZ); /* 100 MHz differential reference clock PHY #0 */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_PHY1_REF,  MMUSB_CLK_100MHZ); /* 100 MHz differential reference clock PHY #1 */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_PHY2_REF,  MMUSB_CLK_50MHZ);  /*  50 MHz max reference PHY #2 clock */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_PHY3_REF,  MMUSB_CLK_50MHZ);  /*  50 MHz max reference PHY #3 clock */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_AXI,       MMUSB_CLK_133MHZ); /* 133 MHz axi clock */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_SOFITP,    MMUSB_CLK_100MHZ); /* 100 MHz reference clock for SOF and ITP counter (16.129 - 125 MHz) */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_USB3_SUSPEND,   MMUSB_CLK_100MHZ); /* 100 MHz suspend clock for low power state (P3) (32 kHz - 125 MHz) */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_SMMU,           MMUSB_CLK_400MHZ); /* 400 MHz axi clk (200 - 400 MHz) */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_DMACM2M,        MMUSB_CLK_200MHZ); /* 200 MHz - temp value (250 MHz axi clk (100 - 250 MHz)) */
+       cmu_clkch_enable_by_base(MMUSB_CMU0_CLKCHCTL_GIC,            MMUSB_CLK_160MHZ); /* 160 MHz */
 
        /* SATA clocks */
        reg = mmio_read_32(MMUSB_GPR_SATAPHY_CLK);
@@ -113,13 +120,13 @@ void mmusb_init(void)
        mmio_write_32(MMUSB_GPR_MMRST, reg);
 
        /* Enable non-secure access */
-       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_USB2,  NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_USB3,  NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_SATA0, NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_SATA1, NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_SMMU,  NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_GIC,   NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_DMACN, NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_USB2,     NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_USB3,     NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_SATA0,    NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_SATA1,    NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_SMMU,     NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_GIC,      NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(MMUSB_NIC_CFG_GPV_REGIONSEC_DMACM2MN, NIC_GPV_REGIONSEC_NONSECURE);
 
        /* CHC */
        mmio_write_32(MMUSB_GPR_SATA0_AXI_SB, 0xa0000);  /* ARDOMAIN 2 / AWDOMAIN 2 (0xa0000 = Coherent ReadOnce + WriteUnique) */
index 460270f87c6f0fafcf6f0cdd17a917eccba566d5..79d48b67dbe1e054b0be286a012fa2983cbbe318 100644 (file)
@@ -19,7 +19,7 @@ void mmvdec_init(void)
         * by a clock channel to minimize jitter.
         */
        const cmu_pll_ctl_vals_t mmvdec_cmu0_pll_ctls = {
-               0, 0, 0x6000000000, 0, 0x2c, 0, 0x2c
+               0, 0, 0x6000000000, 0, -20, 0, -20
        };
 
        cmu_pll_on(MMVDEC_CMU0_BASE, &mmvdec_cmu0_pll_ctls);
index 2f4b0ea35d2aeb4e7d606b6f632821c4523f0ed6..d31e51505fe953a4070bba337a2d24c693ed4100 100644 (file)
@@ -14,8 +14,9 @@
 
 void mmxgbe_init(void)
 {
-       const cmu_pll_ctl_vals_t mmxgbe_cmu0_pll_ctls = { 0, 0,    0x6400000000, 0, 0x2c, 0, 0x2c };
-       const cmu_pll_ctl_vals_t mmxgbe_cmu1_pll_ctls = { 0, 0x6b, 0xca00000000, 0, 0x2c, 0, 0x2c }; /* 25.25 MHz */
+       const cmu_pll_ctl_vals_t mmxgbe_cmu0_pll_ctls = {
+               0, 0,    0x6400000000, 0, -20, 0, -20
+       };
 
        mmio_clrbits_32(MMXGBE_GPR_MMRST,
                        MMXGBE_GPR_MMRST_NICCFGS |
@@ -48,9 +49,6 @@ void mmxgbe_init(void)
        cmu_clkch_enable_by_base(MMXGBE_CMU0_CLKCHCTL_HDMI_AUDIO_ACLK, 10); /* 125.0 MHz */
        cmu_clkch_enable_by_base(MMXGBE_CMU0_CLKCHCTL_HDMI_SFR0,       50); /*  25.0 MHz */
 
-       cmu_pll_on(MMXGBE_CMU1_BASE, &mmxgbe_cmu1_pll_ctls);
-       cmu_clkch_enable_by_base(MMXGBE_CMU1_CLKCHCTL_HDMI_SFR1,        1); /* 594.0 MHz */
-
        /* Deassert XGMAC resets */
        mmio_clrbits_32(MMXGBE_GPR_MMRST,
                        MMXGBE_GPR_MMRST_XGBE0PWRON |
index 0cd988551d4fdf312d5bc3be59346053bf78ba7c..bf15174b20fac495f442362113bea0785d996ac8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2018-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -8,7 +8,6 @@
 
 #include <common/debug.h>
 #include <drivers/arm/gicv3.h>
-#include <drivers/delay_timer.h>
 #include <lib/psci/psci.h>
 #include <lib/utils_def.h>
 #include <plat/arm/common/plat_arm.h>
 #include <baikal_gicv3.h>
 #include <bm1000_private.h>
 #if defined(BAIKAL_MBM10) || defined(BAIKAL_MBM20)
-#include <dw_i2c.h>
-#define MBM_BMC_I2C_BUS                        MMAVLSP_I2C1_BASE
-#define MBM_BMC_I2C_ADDR               0x08
-#define MBM_BMC_REG_PWROFF_RQ          0x05
-#define MBM_BMC_REG_PWROFF_RQ_OFF      0x01
-#define MBM_BMC_REG_PWROFF_RQ_RESET    0x02
+#include <mbm_bmc.h>
 #endif
 #include <platform_def.h>
 
@@ -47,8 +41,8 @@
 
 static int bm1000_validate_power_state(unsigned int power_state, psci_power_state_t *req_state)
 {
-       unsigned i;
-       unsigned state_id;
+       unsigned int i;
+       unsigned int state_id;
 
        /*
         *  The table storing the valid idle power states. Ensure that the
@@ -57,21 +51,12 @@ static int bm1000_validate_power_state(unsigned int power_state, psci_power_stat
         *  The table must be terminated by a NULL entry.
         */
        static const unsigned int idle_states[] = {
-               /* state-id - 0x01 */
+               /* state-id - 0x000 0001 */
                bm1000_make_pwrstate_lvl1(PLAT_LOCAL_STATE_RUN,
                                          PLAT_LOCAL_STATE_RET,
                                          MPIDR_AFFLVL0,
                                          PSTATE_TYPE_STANDBY),
-               /* state-id - 0x02 */
-               bm1000_make_pwrstate_lvl1(PLAT_LOCAL_STATE_RUN,
-                                         PLAT_LOCAL_STATE_OFF,
-                                         MPIDR_AFFLVL0,
-                                         PSTATE_TYPE_POWERDOWN),
-               /* state-id - 0x22 */
-               bm1000_make_pwrstate_lvl1(PLAT_LOCAL_STATE_OFF,
-                                         PLAT_LOCAL_STATE_OFF,
-                                         MPIDR_AFFLVL1,
-                                         PSTATE_TYPE_POWERDOWN),
+               /* ending element of idle_states */
                0
        };
 
@@ -105,7 +90,7 @@ static int bm1000_validate_power_state(unsigned int power_state, psci_power_stat
 
 static int bm1000_validate_ns_entrypoint(uintptr_t entrypoint)
 {
-       unsigned region;
+       unsigned int region;
        uint64_t region_descs[3][2];
        int ret;
 
@@ -163,7 +148,7 @@ static void bm1000_cpu_standby(plat_local_state_t cpu_state)
 static int bm1000_pwr_domain_on(u_register_t mpidr)
 {
        volatile uint64_t *const hold_base = (uint64_t *)BAIKAL_HOLD_BASE;
-       const unsigned pos = plat_core_pos_by_mpidr(mpidr);
+       const unsigned int pos = plat_core_pos_by_mpidr(mpidr);
 
        if (hold_base[pos] == BAIKAL_HOLD_STATE_WAIT) {
                /* It is cold boot of a secondary core */
@@ -199,6 +184,11 @@ static void bm1000_pwr_domain_off(const psci_power_state_t *target_state)
 
 static void bm1000_pwr_domain_suspend(const psci_power_state_t *target_state)
 {
+       if (target_state->pwr_domain_state[MPIDR_AFFLVL0] == PLAT_LOCAL_STATE_RET) {
+               return;
+       }
+
+       /* Code shouldn't go futher till there are no idle_states[], containing 0x2 or 0x22 */
        ERROR("%s: operation not supported\n", __func__);
        panic();
 }
@@ -218,6 +208,11 @@ static void bm1000_pwr_domain_on_finish(const psci_power_state_t *target_state)
 
 static void bm1000_pwr_domain_suspend_finish(const psci_power_state_t *target_state)
 {
+       if (target_state->pwr_domain_state[MPIDR_AFFLVL0] == PLAT_LOCAL_STATE_RET) {
+               return;
+       }
+
+       /* Code shouldn't go futher till there are no idle_states[], containing 0x2 or 0x22 */
        ERROR("%s: operation not supported\n", __func__);
        panic();
 }
@@ -226,16 +221,7 @@ static void __dead2 bm1000_system_off(void)
 {
        dsb();
 #if defined(BAIKAL_MBM10) || defined(BAIKAL_MBM20)
-       const uint8_t offreq[] = {
-               MBM_BMC_REG_PWROFF_RQ,
-               MBM_BMC_REG_PWROFF_RQ_OFF
-       };
-
-       INFO("%s\n", __func__);
-       i2c_txrx(MBM_BMC_I2C_BUS,
-                MBM_BMC_I2C_ADDR, &offreq, sizeof(offreq), NULL, 0);
-
-       mdelay(4000);
+       mbm_bmc_pwr_off();
 #endif
        ERROR("%s: operation not supported\n", __func__);
        for (;;) {
@@ -247,16 +233,7 @@ static void __dead2 bm1000_system_reset(void)
 {
        dsb();
 #if defined(BAIKAL_MBM10) || defined(BAIKAL_MBM20)
-       const uint8_t rstreq[] = {
-               MBM_BMC_REG_PWROFF_RQ,
-               MBM_BMC_REG_PWROFF_RQ_RESET
-       };
-
-       INFO("%s\n", __func__);
-       i2c_txrx(MBM_BMC_I2C_BUS,
-                MBM_BMC_I2C_ADDR, &rstreq, sizeof(rstreq), NULL, 0);
-
-       mdelay(4000);
+       mbm_bmc_pwr_rst();
 #endif
        ERROR("%s: operation not supported\n", __func__);
        for (;;) {
index 89f63089d88f3e95d0b1741cb14f44a50f47899c..af169d3b05bb04916faacbb9bf7947b2ce91669d 100644 (file)
@@ -8,12 +8,15 @@
 
 #include <common/debug.h>
 #include <common/runtime_svc.h>
+#include <lib/pmf/pmf.h>
 #include <libfdt.h>
 
 #include <baikal_pvt.h>
 #include <baikal_scp.h>
 #include <baikal_sip_svc.h>
 #include <bm1000_cmu.h>
+#include <bm1000_def.h>
+#include <bm1000_efuse.h>
 #include <bm1000_smmu.h>
 #include <platform_def.h>
 
@@ -33,8 +36,9 @@
 
 static int baikal_get_cmu_descriptors(void *fdt)
 {
-       unsigned cmuidx = 0;
+       unsigned int cmuidx = 0;
        int offset = 0;
+       uint64_t fpllreq;
 
        while (1) {
                offset = fdt_next_node(fdt, offset, NULL);
@@ -58,11 +62,7 @@ static int baikal_get_cmu_descriptors(void *fdt)
 
                        /* clear */
                        cmu->base            = 0;
-                       cmu->name            = NULL;
                        cmu->frefclk         = 0;
-                       cmu->fpllmin         = 0;
-                       cmu->fpllmax         = 0;
-                       cmu->fpllreq         = 0;
                        cmu->deny_pll_reconf = false;
 
                        prop = fdt_getprop(fdt, cmu_offset, "reg", &proplen);
@@ -100,7 +100,7 @@ static int baikal_get_cmu_descriptors(void *fdt)
                                continue;
                        }
 
-                       cmu->fpllreq = fdt32_to_cpu(*prop);
+                       fpllreq = fdt32_to_cpu(*prop);
 
                        prop = fdt_getprop(fdt, cmu_offset, "clock-indices", &proplen);
                        if (prop != NULL) {
@@ -113,16 +113,16 @@ static int baikal_get_cmu_descriptors(void *fdt)
                                cmu->deny_pll_reconf = true;
                        }
 
-                       cmu->name = fdt_getprop(fdt, cmu_offset, "clock-output-names", NULL);
 
-                       INFO("CMU @ base=0x%08lx name=%s clk=%lu freq=%lu reconf=%d min=%lu max=%lu chans=%d\n",
+                       if (cmu->base != MMAVLSP_CMU1_BASE && cmu->base != MMXGBE_CMU1_BASE) {
+                               cmu_pll_set_rate(cmu->base, cmu->frefclk, fpllreq);
+                       }
+
+                       INFO("CMU @ base=0x%08lx clk=%lu freq=%lu reconf=%d chans=%d\n",
                             cmu->base,
-                            cmu->name,
                             cmu->frefclk,
-                            cmu->fpllreq,
+                            fpllreq,
                             cmu->deny_pll_reconf,
-                            cmu->fpllmin,
-                            cmu->fpllmax,
                             num_of_chans);
 
                        ++cmuidx;
@@ -137,6 +137,11 @@ static int baikal_sip_setup(void)
        int ret;
        void *fdt = (void *)(uintptr_t)BAIKAL_SEC_DTB_BASE;
 
+#if ENABLE_PMF
+       if (pmf_setup() != 0) {
+               return 1;
+       }
+#endif
        ret = fdt_open_into(fdt, fdt, BAIKAL_DTB_MAX_SIZE);
        if (ret < 0) {
                ERROR("Invalid Device Tree at %p: error %d\n", fdt, ret);
@@ -155,6 +160,7 @@ static uintptr_t sip_smc_handler(uint32_t smc_fid,
                                 void *handle,
                                 u_register_t flags)
 {
+       uint32_t local_smc_fid = smc_fid;
        uint64_t ret;
        uint64_t data[4];
 
@@ -163,7 +169,22 @@ static uintptr_t sip_smc_handler(uint32_t smc_fid,
                SMC_RET1(handle, SMC_UNK);
        }
 
-       switch (smc_fid) {
+       if (GET_SMC_CC(smc_fid) == SMC_32) {
+               /* 32-bit function, clear top parameter bits */
+               x1 = (uint32_t)x1;
+               x2 = (uint32_t)x2;
+               x3 = (uint32_t)x3;
+               x4 = (uint32_t)x4;
+
+               /*
+                * Convert SMC FID to SMC64 to support SMC32/SMC64.
+                * SMC64 calls are expected to be the 64-bit equivalent
+                * to the 32-bit call, where applicable (ARM DEN 0028E).
+                */
+               local_smc_fid |= SMC_64 << FUNCID_CC_SHIFT;
+       }
+
+       switch (local_smc_fid) {
        case BAIKAL_SMC_FLASH_ERASE:
        case BAIKAL_SMC_FLASH_INIT:
        case BAIKAL_SMC_FLASH_POSITION:
@@ -180,35 +201,17 @@ static uintptr_t sip_smc_handler(uint32_t smc_fid,
                        SMC_RET3(handle, ret, data[0], data[1]);
                }
                break;
-       case BAIKAL_SMC_PVT_ID:
+       case BAIKAL_SMC_PVT_CMD:
                if (x1 == PVT_READ) {
-                       ret = (uint64_t)pvt_read_reg((uint32_t)x2, (uint32_t)x3);
+                       ret = pvt_read_reg(x2, x3);
                } else if (x1 == PVT_WRITE) {
-                       ret = (uint64_t)pvt_write_reg((uint32_t)x2, (uint32_t)x3, (uint32_t)x4);
+                       ret = pvt_write_reg(x2, x3, x4);
                } else {
                        ERROR("%s: unhandled PVT SMC, x1:0x%lx\n", __func__, x1);
                        ret = SMC_UNK;
                }
                break;
-       case BAIKAL_SMC_VDEC_SMMU_SET_CACHE:
-               ret = mmvdec_smmu_set_domain_cache(x1, x2, x3);
-               break;
-       case BAIKAL_SMC_VDEC_SMMU_GET_CACHE:
-               ret = mmvdec_smmu_get_domain_cache();
-               break;
-       case BAIKAL_SMC_VDU_UPDATE:
-               ret = scp_cmd('V', x1, x2);
-               break;
-       case BAIKAL_SMC_SCP_LOG_DISABLE:
-               ret = scp_cmd('T', 0, 0);
-               break;
-       case BAIKAL_SMC_SCP_LOG_ENABLE:
-               ret = scp_cmd('t', 0, 0);
-               break;
-       case BAIKAL_SMC_FLASH_LOCK:
-               ret = scp_cmd('L', x1, 0);
-               break;
-       default:
+       case BAIKAL_SMC_CMU_CMD:
                switch (x2) {
                case BAIKAL_SMC_CMU_PLL_SET_RATE:
                        ret = cmu_pll_set_rate(x1, x4, x3);
@@ -229,29 +232,65 @@ static uintptr_t sip_smc_handler(uint32_t smc_fid,
                        ret = cmu_pll_is_enabled(x1);
                        break;
                case BAIKAL_SMC_CMU_CLKCH_SET_RATE:
-                       ret = cmu_clkch_set_rate((uint32_t)x4, x1, x3);
+                       ret = cmu_clkch_set_rate(x4, x1, x3);
                        break;
                case BAIKAL_SMC_CMU_CLKCH_GET_RATE:
-                       ret = cmu_clkch_get_rate((uint32_t)x4, x1);
+                       ret = cmu_clkch_get_rate(x4, x1);
                        break;
                case BAIKAL_SMC_CMU_CLKCH_ENABLE:
-                       ret = cmu_clkch_enable((uint32_t)x4, x1);
+                       ret = cmu_clkch_enable(x4, x1);
                        break;
                case BAIKAL_SMC_CMU_CLKCH_DISABLE:
-                       ret = cmu_clkch_disable((uint32_t)x4, x1);
+                       ret = cmu_clkch_disable(x4, x1);
                        break;
                case BAIKAL_SMC_CMU_CLKCH_ROUND_RATE:
-                       ret = cmu_clkch_round_rate((uint32_t)x4, x1, x3);
+                       ret = cmu_clkch_round_rate(x4, x1, x3);
                        break;
                case BAIKAL_SMC_CMU_CLKCH_IS_ENABLED:
-                       ret = cmu_clkch_is_enabled((uint32_t)x4, x1);
+                       ret = cmu_clkch_is_enabled(x4, x1);
                        break;
                default:
-                       ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid);
+                       ERROR("%s: unhandled CMU SMC, x2:0x%lx\n", __func__, x2);
                        ret = SMC_UNK;
                        break;
                }
-
+               break;
+       case BAIKAL_SMC_VDEC_SMMU_SET_CACHE:
+               ret = mmvdec_smmu_set_domain_cache(x1, x2, x3);
+               break;
+       case BAIKAL_SMC_VDEC_SMMU_GET_CACHE:
+               ret = mmvdec_smmu_get_domain_cache();
+               break;
+       case BAIKAL_SMC_VDU_UPDATE:
+               ret = scp_cmd('V', x1, x2);
+               break;
+       case BAIKAL_SMC_SCP_LOG_DISABLE:
+               ret = scp_cmd('T', 0, 0);
+               break;
+       case BAIKAL_SMC_SCP_LOG_ENABLE:
+               ret = scp_cmd('t', 0, 0);
+               break;
+       case BAIKAL_SMC_EFUSE_GET_LOT:
+               ret = efuse_get_lot();
+               break;
+       case BAIKAL_SMC_EFUSE_GET_SERIAL:
+               ret = efuse_get_serial();
+               break;
+       case BAIKAL_SMC_EFUSE_GET_MAC:
+               ret = efuse_get_mac();
+               break;
+       case BAIKAL_SMC_FLASH_LOCK:
+               ret = scp_cmd('L', x1, 0);
+               break;
+       default:
+#if ENABLE_PMF
+               /* Dispatch PMF calls to PMF SMC handler and return its return value */
+               if (is_pmf_fid(smc_fid)) {
+                       return pmf_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, flags);
+               }
+#endif
+               ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid);
+               ret = SMC_UNK;
                break;
        }
 
index b6d92267e909faee633e9f0686fc30104822ba14..5509c86231e277e610bddabf640be0440a66ecd8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
- * Author: Pavel Parkhomenko <pavel.parkhomenko@baikalelectronics.ru>
+ * Author: Pavel Parkhomenko <Pavel.Parkhomenko@baikalelectronics.ru>
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 #include <common/debug.h>
 #include <drivers/delay_timer.h>
 #include <lib/mmio.h>
+#include <lib/utils.h>
 #include <libfdt.h>
+#include <stdio.h>
 
 #include <baikal_def.h>
 #include <baikal_fdt.h>
+#include <bm1000_cmu.h>
 #include <bm1000_private.h>
 #include <dw_gpio.h>
 #include <platform_def.h>
 #include "bm1000_splash.h"
 #include "bm1000_vdu.h"
 
-#define BAIKAL_VDU_DEFAULT_BRIGHTNESS  0x7f  /* 50% duty cycle */
+#define VDU_PLL_REF_CLOCK              27000000
+#define LVDS_VDU_AXI_CLOCK             300000000 /* set in accordance with bm1000_mmavlsp.c */
+#define BAIKAL_VDU_DEFAULT_BRIGHTNESS  0x7f      /* 50% duty cycle */
 #define BAIKAL_VDU_DEFAULT_PWM_FREQ    10000
 
-modeline_t lvds_video_mode = {148500000, 2, BAIKAL_LVDS_VESA_24,
-                             1920, 88, 44, 148,
-                             1080, 4, 5, 36};
-modeline_t hdmi_video_mode = {25250000, 0, 0, 640, 16, 96, 48, 480, 10, 2, 33};
-static int gpio_pin = -1;
-static int gpio_polarity = -1;
+const modeline_t lvds_video_mode = {148500000, 1920, 88, 44, 148, 1080, 4, 5, 36, 0, 0, 0,
+                               2, BAIKAL_LVDS_VESA_24, 16, 0, MMAVLSP_CMU1_BASE, VDU_PLL_REF_CLOCK, 1};
+const modeline_t hdmi_video_mode = {25250000, 640, 16, 96, 48, 480, 10, 2, 33, 0, 0, 0,
+                               0, 0, 0, 0, MMXGBE_CMU1_BASE, VDU_PLL_REF_CLOCK, 1};
+
+char sdk_version[SDK_VERSION_SIZE];
+char msg_buf[300];
 
 #define FDT_GET_PANEL_TIMING(name, result)                                     \
        do {                                                                    \
@@ -149,11 +155,11 @@ int fdt_get_panel(modeline_t *modeline)
 
                        prop = fdt_getprop(fdt, node, "enable-gpios", &plen);
                        if (prop && plen == 3 * sizeof(*prop)) {
-                               gpio_pin = fdt32_to_cpu(*(prop + 1));
+                               modeline->gpio_pin = fdt32_to_cpu(*(prop + 1));
                                if (!fdt32_to_cpu(*(prop + 2))) {
-                                       gpio_polarity = 1;
+                                       modeline->gpio_polarity = 1;
                                } else {
-                                       gpio_polarity = 0;
+                                       modeline->gpio_polarity = 0;
                                }
 
                                gpio_found = 1;
@@ -162,22 +168,7 @@ int fdt_get_panel(modeline_t *modeline)
        }
 }
 
-void wait_for_vblank(uint64_t vdu_base)
-{
-       uint32_t irq;
-
-       do {
-               irq = mmio_read_32(vdu_base + BAIKAL_VDU_ISR);
-       } while (!(irq & BAIKAL_VDU_INTR_VCT));
-
-       mmio_write_32(vdu_base + BAIKAL_VDU_ISR, BAIKAL_VDU_INTR_VCT);
-
-       do {
-               irq = mmio_read_32(vdu_base + BAIKAL_VDU_ISR);
-       } while (!(irq & BAIKAL_VDU_INTR_VCT));
-}
-
-void vdu_set_fb(uint64_t vdu_base, uint32_t fb_base, modeline_t *mode, int fb_cpp)
+void vdu_set_fb(uint64_t vdu_base, uint32_t fb_base, const modeline_t *mode, int fb_cpp)
 {
        uint32_t ctl;
        uint32_t fb_end;
@@ -206,9 +197,22 @@ void vdu_set_fb(uint64_t vdu_base, uint32_t fb_base, modeline_t *mode, int fb_cp
        mmio_write_32(vdu_base + BAIKAL_VDU_CR1, ctl);
 }
 
-void vdu_init(uint64_t vdu_base, uint32_t fb_base, modeline_t *mode)
+void vdu_init(uint64_t vdu_base, uint32_t fb_base, const modeline_t *mode)
 {
        uint32_t ctl, pwmfr, gpio, hfp = mode->hfp, hsw = mode->hsync;
+       int gpio_pin = mode->gpio_pin, gpio_polarity = mode->gpio_polarity;
+       uint64_t clock;
+
+       /* Set up PLL */
+       clock = vdu_base == MMAVLSP_VDU_BASE ? mode->clock * 7 : mode->clock;
+       cmu_pll_set_rate(mode->cmu_base, mode->cmu_frefclk, clock);
+       if (!cmu_pll_is_enabled(mode->cmu_base)) {
+               cmu_pll_set_gains(mode->cmu_base, 0, -20, 0, -20);
+               cmu_pll_enable(mode->cmu_base);
+       }
+       if (vdu_base == MMXGBE_VDU_BASE) {
+               cmu_clkch_enable_by_base(MMXGBE_CMU1_CLKCHCTL_HDMI_SFR1, 1);
+       }
 
        /* Set Timings */
        if (vdu_base == MMAVLSP_VDU_BASE && mode->ports == 2) {
@@ -242,7 +246,20 @@ void vdu_init(uint64_t vdu_base, uint32_t fb_base, modeline_t *mode)
        ctl = mmio_read_32(vdu_base + BAIKAL_VDU_CR1) & BAIKAL_VDU_CR1_BPP_MASK;
 
        /* Set flags */
-       ctl |= BAIKAL_VDU_CR1_LCE | BAIKAL_VDU_CR1_DEP | BAIKAL_VDU_CR1_FDW_16_WORDS;
+       ctl |= BAIKAL_VDU_CR1_LCE | BAIKAL_VDU_CR1_FDW_16_WORDS;
+
+       /* Setup polarities for HSYNC, VSYNC and DE */
+       if (mode->hspol_inv) {
+               ctl |= BAIKAL_VDU_CR1_HSP;
+       }
+
+       if (mode->vspol_inv) {
+               ctl |= BAIKAL_VDU_CR1_VSP;
+       }
+
+       if (!mode->depol_inv) {
+               ctl |= BAIKAL_VDU_CR1_DEP;
+       }
 
        /* Set 18 or 24 bit output */
        if (vdu_base == MMAVLSP_VDU_BASE) { /* LVDS VDU */
@@ -258,7 +275,7 @@ void vdu_init(uint64_t vdu_base, uint32_t fb_base, modeline_t *mode)
                /* Hold PWM Clock Domain Reset, disable clocking */
                mmio_write_32(vdu_base + BAIKAL_VDU_PWMFR, 0);
 
-               pwmfr = BAIKAL_VDU_PWMFR_PWMFCD(mode->clock / BAIKAL_VDU_DEFAULT_PWM_FREQ - 1) | BAIKAL_VDU_PWMFR_PWMFCI;
+               pwmfr = BAIKAL_VDU_PWMFR_PWMFCD(LVDS_VDU_AXI_CLOCK / BAIKAL_VDU_DEFAULT_PWM_FREQ - 1);
                mmio_write_32(vdu_base + BAIKAL_VDU_PWMFR, pwmfr);
 
                mmio_write_32(vdu_base + BAIKAL_VDU_PWMDCR, BAIKAL_VDU_DEFAULT_BRIGHTNESS);
@@ -357,7 +374,7 @@ void hdmi_phy_configure(void)
        hdmi_phy_power_on();
 }
 
-void hdmi_init_av_composer(modeline_t *mode)
+void hdmi_init_av_composer(const modeline_t *mode)
 {
        uint32_t val, mask;
 
@@ -399,7 +416,7 @@ void hdmi_init_av_composer(modeline_t *mode)
        mmio_write_32(BAIKAL_HDMI_FC_INVIDCONF, val);
 }
 
-void hdmi_enable_video_path(modeline_t *mode)
+void hdmi_enable_video_path(const modeline_t *mode)
 {
        uint32_t val;
 
@@ -428,7 +445,7 @@ void hdmi_enable_video_path(modeline_t *mode)
        mmio_write_32(BAIKAL_HDMI_FC_VSYNCINWIDTH, (mode->vsync - mode->vfp) & 0xff);
 }
 
-void bmp_get_dimensions(uint8_t *bmp_file, int *width, int *height)
+void bmp_get_dimensions(const uint8_t *bmp_file, int *width, int *height)
 {
        bmp_header_t bmp;
 
@@ -437,7 +454,23 @@ void bmp_get_dimensions(uint8_t *bmp_file, int *width, int *height)
        *height = bmp.height;
 }
 
-int bmp_to_fb(uintptr_t fb, modeline_t *mode, uint8_t *bmp_file, int dx, int dy, int clear_screen)
+int bmp_get_cpp(const uint8_t *bmp_file)
+{
+       bmp_header_t bmp;
+
+       memcpy(&bmp, bmp_file + 2, sizeof(bmp)); /* skip 2-byte BMP signature */
+       if ((bmp.bpp != 16 && bmp.bpp != 24 && bmp.bpp != 32) ||
+               bmp.planes != 1) {
+               return 0;
+       }
+       if (bmp.bpp == 16) {
+               return 2;
+       } else { /* bmp.bpp == 24 or 32 */
+               return 4;
+       }
+}
+
+int bmp_to_fb(uintptr_t fb, const modeline_t *mode, const uint8_t *bmp_file, int dx, int dy, int clear_screen)
 {
        bmp_header_t bmp;
        int fb_cpp;
@@ -449,12 +482,10 @@ int bmp_to_fb(uintptr_t fb, modeline_t *mode, uint8_t *bmp_file, int dx, int dy,
        int x_offs;
        int y_offs;
        int data_size;
-       uint8_t *last_line;
-       uint8_t *first_line;
-       uint8_t *src;
-       uint8_t *dst;
-       uint8_t *s;
-       uint8_t *d;
+       const uint8_t *last_line;
+       const uint8_t *first_line;
+       const uint8_t *src, *s;
+       uint8_t *dst, *d;
 
        memcpy(&bmp, bmp_file + 2, sizeof(bmp)); /* skip 2-byte BMP signature */
        line_width = bmp.width * bmp.bpp / 8;
@@ -495,7 +526,7 @@ int bmp_to_fb(uintptr_t fb, modeline_t *mode, uint8_t *bmp_file, int dx, int dy,
        fb_line_width = fb_width * fb_cpp;
        fb_size = fb_line_width * fb_height;
        if (clear_screen) {
-               memset((void *)fb, 0, fb_size);
+               zero_normalmem((void *)fb, fb_size);
        }
 
        x_offs = (fb_width  - bmp.width)  / 2 + dx;
@@ -519,20 +550,110 @@ int bmp_to_fb(uintptr_t fb, modeline_t *mode, uint8_t *bmp_file, int dx, int dy,
        return fb_cpp;
 }
 
-void hdmi_early_splash(uint8_t *bmp_file)
+void fb_print(void *fb_base, const modeline_t *mode, int fb_cpp, int row, int col, const char *s)
+{
+       int i, j, ch, line_width, char_width, max_cols, max_rows;
+       const uint8_t *f;
+       unsigned int color;
+       uint8_t *pix;
+       int x = col;
+       int y = row;
+
+       if (!fb_base || !mode || !s || (fb_cpp != 2 && fb_cpp != 4) || FONT_WIDTH > 8) {
+               return;
+       }
+
+       line_width = mode->hact * fb_cpp;
+       char_width = FONT_WIDTH * fb_cpp;
+       max_cols = mode->hact / FONT_WIDTH;
+       max_rows = mode->vact / FONT_HEIGHT;
+       while ((ch = *s++) && x < max_cols && y < max_rows) {
+               if (ch == '\n') {
+                       x = 0;
+                       y++;
+               } else if (ch >= FONT_FIRST_CHAR && ch <= FONT_LAST_CHAR) {
+                       pix = fb_base + y * FONT_HEIGHT * line_width + x * char_width;
+                       f = &font[(ch - FONT_FIRST_CHAR) * FONT_HEIGHT];
+                       for (i = 0; i < FONT_HEIGHT; i++) {
+                               for (j = 1 << (FONT_WIDTH - 1); j > 0; j >>= 1) {
+                                       color = (*f & j) ? 0xffffffff : 0;
+                                       if (fb_cpp == 2) {
+                                               *((uint16_t *)pix) = color;
+                                       } else { /* fb_cpp == 4 */
+                                               *((uint32_t *)pix) = color;
+                                       }
+                                       pix += fb_cpp;
+                               }
+                               pix += line_width - char_width;
+                               f++;
+                       }
+                       x++;
+               }
+       }
+       flush_dcache_range((uintptr_t)fb_base, line_width * mode->vact);
+}
+
+void print_sdk_version(uintptr_t fb_base, const modeline_t *mode, int w1, int h1, const char *version)
+{
+       int w2 = strlen(version) * FONT_WIDTH;
+       int h2 = FONT_HEIGHT;
+       int col = ((mode->hact - w1) / 2 + w1 - w2) / FONT_WIDTH;
+       int row = ((mode->vact - h1) / 2 + h1 + h2) / FONT_HEIGHT;
+
+       fb_print((void *) fb_base, mode, 4, row, col, version);
+}
+
+void early_splash(uintptr_t vdu_base, uintptr_t fb_base, const modeline_t *mode, int fb_cpp, const char *msg)
+{
+       zero_normalmem((void *)fb_base, mode->hact * mode->vact * fb_cpp);
+       if (msg) {
+               fb_print((void *) fb_base, mode, fb_cpp, 0, 0, msg);
+       }
+       vdu_set_fb(vdu_base, fb_base, mode, fb_cpp);
+       vdu_init(vdu_base, fb_base, mode);
+}
+
+void hdmi_tx_init(void)
 {
-       int fb_cpp;
-#ifdef BAIKAL_HDMI_CLKEN_GPIO_PIN
-       gpio_out_rst(MMAVLSP_GPIO32_BASE, BAIKAL_HDMI_CLKEN_GPIO_PIN);
-       gpio_dir_set(MMAVLSP_GPIO32_BASE, BAIKAL_HDMI_CLKEN_GPIO_PIN);
-#endif
        hdmi_init_av_composer(&hdmi_video_mode);
        hdmi_phy_configure();
        hdmi_enable_video_path(&hdmi_video_mode);
-       if (bmp_file) {
-               fb_cpp = bmp_to_fb((uintptr_t)FB1_BASE, &hdmi_video_mode, bmp_file, 0, 0, 1);
-               vdu_set_fb(MMXGBE_VDU_BASE, FB1_BASE, &hdmi_video_mode, fb_cpp);
+}
+
+void lvds_early_splash(const char *msg)
+{
+       early_splash(MMAVLSP_VDU_BASE, FB0_BASE, &lvds_video_mode, 4, msg);
+}
+
+void hdmi_early_splash(const char *msg)
+{
+       hdmi_tx_init();
+       early_splash(MMXGBE_VDU_BASE, FB1_BASE, &hdmi_video_mode, 4, msg);
+}
+
+void display_logo_and_version(uintptr_t vdu_base, uintptr_t fb_base, const modeline_t *mode, const uint8_t *logo)
+{
+       int w1 = 0, h1 = 0;
+       uint32_t reg;
+
+       reg = mmio_read_32(vdu_base + BAIKAL_VDU_CR1);
+       reg &= ~BAIKAL_VDU_CR1_LCE;
+       mmio_write_32(vdu_base + BAIKAL_VDU_CR1, reg);
+
+       /* We do not support 16-bit and lower color resolutions here */
+       if (bmp_get_cpp(logo) == 4) {
+               /* Put SDK version just below the logo, aligned to its right edge */
+               bmp_to_fb(fb_base, mode, logo, 0, 0, 1);
+               bmp_get_dimensions(logo, &w1, &h1);
+       } else {
+               zero_normalmem((void *)fb_base, mode->hact * mode->vact * 4);
        }
+#ifdef SDK_VERSION
+       print_sdk_version(fb_base, mode, w1, h1, sdk_version);
+#endif
+       vdu_set_fb(vdu_base, fb_base, mode, 4);
 
-       vdu_init(MMXGBE_VDU_BASE, FB1_BASE, &hdmi_video_mode);
+       reg = mmio_read_32(vdu_base + BAIKAL_VDU_CR1);
+       reg |= BAIKAL_VDU_CR1_LCE;
+       mmio_write_32(vdu_base + BAIKAL_VDU_CR1, reg);
 }
index ab2e84f1b74f8336a6efc9552d9504c28f3c14f1..d130c6335e0d15d1d0463d107c03358d615e4ebf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2020-2021, Baikal Electronics, JSC. All rights reserved.
  *
- * Author: Pavel Parkhomenko <pavel.parkhomenko@baikalelectronics.ru>
+ * Author: Pavel Parkhomenko <Pavel.Parkhomenko@baikalelectronics.ru>
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
 #include <stdint.h>
 
+#include "bm1000_font.h"
+
+#define SDK_VERSION_SIZE       40
+
 typedef enum {
        BAIKAL_LVDS_JEIDA_18,
        BAIKAL_LVDS_VESA_24
@@ -18,8 +22,6 @@ typedef enum {
 
 typedef struct {
        uint32_t clock;
-       int ports;
-       lvds_data_mapping_t data_mapping;
        uint32_t hact;
        uint32_t hfp;
        uint32_t hsync;
@@ -28,11 +30,18 @@ typedef struct {
        uint32_t vfp;
        uint32_t vsync;
        uint32_t vbp;
+       uint32_t hspol_inv;
+       uint32_t vspol_inv;
+       uint32_t depol_inv;
+       int ports;                              /* LVDS only */
+       lvds_data_mapping_t data_mapping;       /* LVDS only */
+       int gpio_pin;                           /* LVDS only */
+       int gpio_polarity;                      /* LVDS only */
+       uintptr_t cmu_base;
+       uint64_t cmu_frefclk;
+       int enabled;
 } modeline_t;
 
-extern modeline_t hdmi_video_mode;
-extern modeline_t lvds_video_mode;
-
 typedef struct {
        /* 2-byte signature is omitted (placed just before file_size) */
        uint32_t file_size;
@@ -45,12 +54,21 @@ typedef struct {
        uint16_t bpp : 16;
 } bmp_header_t;
 
-void hdmi_early_splash(uint8_t *bmp_file);
-void bmp_get_dimensions(uint8_t *bmp_file, int *width, int *height);
-int bmp_to_fb(uintptr_t fb, modeline_t *mode, uint8_t *bmp_file, int dx, int dy, int clear_screen);
-void vdu_init(uint64_t vdu_base, uint32_t fb_base, modeline_t *mode);
-void vdu_set_fb(uint64_t vdu_base, uint32_t fb_base, modeline_t *mode, int fb_cpp);
-void wait_for_vblank(uint64_t vdu_base);
+extern const modeline_t hdmi_video_mode;
+extern const modeline_t lvds_video_mode;
+extern char sdk_version[];
+
+void hdmi_tx_init(void);
+void print_sdk_version(uintptr_t fb_base, const modeline_t *mode, int w1, int h1, const char *version);
+void early_splash(uintptr_t vdu_base, uintptr_t fb_base, const modeline_t *mode, int fb_cpp, const char *msg);
+void lvds_early_splash(const char *msg);
+void hdmi_early_splash(const char *msg);
+void bmp_get_dimensions(const uint8_t *bmp_file, int *width, int *height);
+int bmp_get_cpp(const uint8_t *bmp_file);
+int bmp_to_fb(uintptr_t fb, const modeline_t *mode, const uint8_t *bmp_file, int dx, int dy, int clear_screen);
+void vdu_init(uint64_t vdu_base, uint32_t fb_base, const modeline_t *mode);
+void vdu_set_fb(uint64_t vdu_base, uint32_t fb_base, const modeline_t *mode, int fb_cpp);
 int fdt_get_panel(modeline_t *modeline);
+void display_logo_and_version(uintptr_t vdu_base, uintptr_t fb_base, const modeline_t *mode, const uint8_t *logo);
 
 #endif /* BM1000_SPLASH_H */
index 04ad2479c4310614ea492c4d8e80b4ae65540050..4a84546a8f47468c1afc0ff9537cdfc3718a610f 100644 (file)
@@ -5,9 +5,6 @@
  *
  * SPDX-License-Identifier: BSD-3-Clause
  *
- * Parts of this file were based on sources as follows:
- * Copyright (c) 2011, ARM Ltd. All rights reserved.<BR>
- * SPDX-License-Identifier: BSD-2-Clause-Patent
  */
 
 #ifndef BM1000_VDU_H
 
 /* Register: HTR */
 #define HOR_AXIS_PANEL(hbp, hfp, hsw, hor_res) (uint32_t)      \
-               ((((uint32_t)(hsw) - 1)     << 24) |            \
-               (uint32_t)((hbp)            << 16) |            \
-               ((uint32_t)((hor_res) / 16) <<  8) |            \
-               ((uint32_t)(hfp)            <<  0))
+               (((uint32_t)((hsw) - 1)      << 24) |           \
+                ((uint32_t)(hbp)            << 16) |           \
+                ((uint32_t)((hor_res) / 16) <<  8) |           \
+                ((uint32_t)(hfp)            <<  0))
 
 /* Register: VTR1 */
 #define VER_AXIS_PANEL(vbp, vfp, vsw) (uint32_t)               \
                (((uint32_t)(vbp) << 16) |                      \
-               (uint32_t)(vfp) <<  8) |                      \
-               (uint32_t)(vsw) <<  0))
+                ((uint32_t)(vfp) <<  8) |                      \
+                ((uint32_t)(vsw) <<  0))
 
 /* Register: HVTER */
 #define TIMINGS_EXT(hbp, hfp, hsw, vbp, vfp, vsw) (uint32_t)   \
-               (((uint32_t)(vsw / 256) << 24) |                \
-               ( (uint32_t)(hsw / 256) << 16) |                \
-               ( (uint32_t)(vbp / 256) << 12) |                \
-               ( (uint32_t)(vfp / 256) <<  8) |                \
-               ( (uint32_t)(hbp / 256) <<  4) |                \
-               ( (uint32_t)(hfp / 256) <<  0))
+               (((uint32_t)((vsw) / 256) << 24) |              \
+                ((uint32_t)((hsw) / 256) << 16) |              \
+                ((uint32_t)((vbp) / 256) << 12) |              \
+                ((uint32_t)((vfp) / 256) <<  8) |              \
+                ((uint32_t)((hbp) / 256) <<  4) |              \
+                ((uint32_t)((hfp) / 256) <<  0))
 
 #define BAIKAL_VDU_CR1_FDW_4_WORDS     (0 << 16)
 #define BAIKAL_VDU_CR1_FDW_8_WORDS     (1 << 16)
index 2232e45191e1b265691d64883ded83833e95209e..a2676ecda75f2af1696b8e24a71f4d6ebe596b8a 100644 (file)
@@ -96,11 +96,11 @@ struct plldivs {
 static void cmu_pll_div_get(const uintptr_t base, struct plldivs *const plldivs);
 static int cmu_pll_div_calc(const uint64_t frefclk, const uint64_t fpllreq, struct plldivs *const plldivs);
 static int cmu_pll_div_set(const struct cmu_desc *const cmu, const uint64_t frefclk, const uint64_t fpllreq);
-static int cmu_clkch_div_calc(const struct cmu_desc *const cmu, const unsigned clkch, uint64_t fclkchreq);
-static int cmu_clkch_div_get(const struct cmu_desc *const cmu, const unsigned clkch);
-static uintptr_t cmu_clkch_get_reg(const uintptr_t base, const unsigned clkch);
-static int cmu_clkch_div_set(const struct cmu_desc *const cmu, const unsigned clkch, uint32_t div);
-static struct cmu_desc *const cmu_desc_get_by_base(const uintptr_t base);
+static int cmu_clkch_div_calc(const struct cmu_desc *const cmu, const unsigned int clkch, uint64_t fclkchreq);
+static int cmu_clkch_div_get(const struct cmu_desc *const cmu, const unsigned int clkch);
+static uintptr_t cmu_clkch_get_reg(const uintptr_t base, const unsigned int clkch);
+static int cmu_clkch_div_set(const struct cmu_desc *const cmu, const unsigned int clkch, uint32_t div);
+static struct cmu_desc *cmu_desc_get_by_base(const uintptr_t base);
 static int cmu_pll_lock_debounce(const uintptr_t base);
 static int cmu_set_core_rate(const struct cmu_desc *const cmu, const uint64_t frefclk, const uint64_t fpllreq);
 static int cmu_set_periph_rate(const struct cmu_desc *const cmu, uint64_t frefclk, const uint64_t fpllreq);
@@ -121,7 +121,7 @@ int cmu_pll_is_enabled(const uintptr_t base)
        const int ret = (mmio_read_32(base + CMU_PLL_CTL0) & CMU_PLL_CTL0_CTL_EN) &&
                        (mmio_read_32(base + CMU_PLL_CTL6) & CMU_PLL_CTL6_SWEN);
 
-       INFO("%s: base=0x%08lx %s\n", __func__, base, ret ? "enabled" : "disabled");
+       VERBOSE("%s: base=0x%08lx %s\n", __func__, base, ret ? "enabled" : "disabled");
        return ret;
 }
 
@@ -130,7 +130,7 @@ int cmu_pll_enable(const uintptr_t base)
        int err;
 
        if (cmu_pll_is_enabled(base)) {
-               INFO("%s: base=0x%08lx already enabled\n", __func__, base);
+               VERBOSE("%s: base=0x%08lx already enabled\n", __func__, base);
                return 0;
        }
 
@@ -141,11 +141,10 @@ int cmu_pll_enable(const uintptr_t base)
 
        err = cmu_pll_lock_debounce(base);
        if (err) {
-               ERROR("%s: base=0x%08lx timeout\n", __func__, base);
                return err;
        }
 
-       INFO("%s: base=0x%08lx enable\n", __func__, base);
+       VERBOSE("%s: base=0x%08lx enable\n", __func__, base);
        mmio_setbits_32(base + CMU_PLL_CTL6, CMU_PLL_CTL6_SWEN);
        mmio_clrbits_32(base + CMU_PLL_CTL6, CMU_PLL_CTL6_SWRST);
        return 0;
@@ -153,7 +152,7 @@ int cmu_pll_enable(const uintptr_t base)
 
 int cmu_pll_disable(const uintptr_t base)
 {
-       INFO("%s: base=0x%08lx disable\n", __func__, base);
+       VERBOSE("%s: base=0x%08lx disable\n", __func__, base);
        mmio_clrbits_32(base + CMU_PLL_CTL0, CMU_PLL_CTL0_CTL_EN);
        return 0;
 }
@@ -175,7 +174,7 @@ int64_t cmu_pll_get_rate(const uintptr_t base, uint64_t frefclk)
 
        cmu_pll_div_get(base, &plldivs);
        fpll = (frefclk * plldivs.intnf) / (plldivs.nr * plldivs.od);
-       INFO("%s: base=0x%08lx rate=%lu\n", __func__, base, fpll);
+       VERBOSE("%s: base=0x%08lx rate=%lu\n", __func__, base, fpll);
        return fpll;
 }
 
@@ -201,22 +200,32 @@ int64_t cmu_pll_round_rate(const uintptr_t base, uint64_t frefclk, const uint64_
        }
 
        fpll = (frefclk * plldivs.intnf) / (plldivs.nr * plldivs.od);
-       INFO("%s: base=0x%08lx rate=%lu\n", __func__, base, fpll);
+       VERBOSE("%s: base=0x%08lx rate=%lu\n", __func__, base, fpll);
        return fpll;
 }
 
 int cmu_pll_set_rate(const uintptr_t base, uint64_t frefclk, const uint64_t fpllreq)
 {
        int err;
-       struct cmu_desc *const cmu = cmu_desc_get_by_base(base);
+       struct cmu_desc *cmu;
+       struct cmu_desc  cmu_default;
 
        if (base == MMAVLSP_CMU0_BASE) {
-               INFO("%s: base=0x%08lx skip\n", __func__, base);
+               VERBOSE("%s: base=0x%08lx skip\n", __func__, base);
                return -ENXIO;
        }
 
+       cmu = cmu_desc_get_by_base(base);
        if (!cmu) {
-               return -ENXIO;
+               VERBOSE("%s: base=0x%08lx, descriptor not found\n", __func__, base);
+               cmu = &cmu_default;
+               cmu->base = base;
+               cmu->deny_pll_reconf = false;
+               cmu->frefclk = frefclk;
+               if (cmu->frefclk == 0) {
+                       VERBOSE("%s: base=0x%08lx, frefclk not set\n", __func__, base);
+                       return -ENXIO;
+               }
        }
 
        if (!frefclk) {
@@ -224,7 +233,7 @@ int cmu_pll_set_rate(const uintptr_t base, uint64_t frefclk, const uint64_t fpll
        }
 
        if (fpllreq == cmu_pll_get_rate(base, frefclk)) {
-               INFO("%s: base=0x%08lx rate=%lu already set\n", __func__, base, fpllreq);
+               VERBOSE("%s: base=0x%08lx rate=%lu already set\n", __func__, base, fpllreq);
                return 0;
        }
 
@@ -237,13 +246,13 @@ int cmu_pll_set_rate(const uintptr_t base, uint64_t frefclk, const uint64_t fpll
                err = cmu_set_periph_rate(cmu, frefclk, fpllreq);
        }
 
-       INFO("%s: base=0x%08lx name=%s rate=%lu%s\n",
-               __func__, base, cmu->name, fpllreq, err ? ", fail" : "");
+       VERBOSE("%s: base=0x%08lx rate=%lu%s\n",
+               __func__, base, fpllreq, err ? ", fail" : "");
 
        return err;
 }
 
-int cmu_clkch_is_enabled(const uintptr_t base, const unsigned clkch)
+int cmu_clkch_is_enabled(const uintptr_t base, const unsigned int clkch)
 {
        int ret;
        uintptr_t clkch_reg = cmu_clkch_get_reg(base, clkch);
@@ -253,11 +262,11 @@ int cmu_clkch_is_enabled(const uintptr_t base, const unsigned clkch)
        }
 
        ret = (mmio_read_32(clkch_reg) & CMU_CLKCH_CTL_CLK_EN) && cmu_pll_is_enabled(base);
-       INFO("%s: base=0x%08lx ch=%u %s\n", __func__, base, clkch, ret ? "enabled" : "disabled");
+       VERBOSE("%s: base=0x%08lx ch=%u %s\n", __func__, base, clkch, ret ? "enabled" : "disabled");
        return ret;
 }
 
-int cmu_clkch_enable(const uintptr_t base, const unsigned clkch)
+int cmu_clkch_enable(const uintptr_t base, const unsigned int clkch)
 {
        uintptr_t clkch_reg;
        uint64_t timeout;
@@ -267,7 +276,7 @@ int cmu_clkch_enable(const uintptr_t base, const unsigned clkch)
        }
 
        if (cmu_clkch_is_enabled(base, clkch)) {
-               INFO("%s: base=0x%08lx ch=%u already enabled\n", __func__, base, clkch);
+               VERBOSE("%s: base=0x%08lx ch=%u already enabled\n", __func__, base, clkch);
                return 0;
        }
 
@@ -279,7 +288,7 @@ int cmu_clkch_enable(const uintptr_t base, const unsigned clkch)
        mmio_setbits_32(clkch_reg, CMU_CLKCH_CTL_CLK_EN);
        for (timeout = timeout_init_us(100000); !timeout_elapsed(timeout);) {
                if (mmio_read_32(clkch_reg) & CMU_CLKCH_CTL_CLK_RDY) {
-                       INFO("%s: base=0x%08lx ch=%u enable\n", __func__, base, clkch);
+                       VERBOSE("%s: base=0x%08lx ch=%u enable\n", __func__, base, clkch);
                        mmio_clrbits_32(clkch_reg, CMU_CLKCH_CTL_SWRST);
                        return 0;
                }
@@ -289,7 +298,7 @@ int cmu_clkch_enable(const uintptr_t base, const unsigned clkch)
        return -ETIMEDOUT;
 }
 
-int cmu_clkch_disable(const uintptr_t base, const unsigned clkch)
+int cmu_clkch_disable(const uintptr_t base, const unsigned int clkch)
 {
        uintptr_t clkch_reg = cmu_clkch_get_reg(base, clkch);
 
@@ -297,12 +306,12 @@ int cmu_clkch_disable(const uintptr_t base, const unsigned clkch)
                return -ENXIO;
        }
 
-       INFO("%s: base=0x%08lx ch=%u disable\n", __func__, base, clkch);
+       VERBOSE("%s: base=0x%08lx ch=%u disable\n", __func__, base, clkch);
        mmio_clrbits_32(clkch_reg, CMU_CLKCH_CTL_CLK_EN);
        return 0;
 }
 
-int64_t cmu_clkch_get_rate(const uintptr_t base, const unsigned clkch)
+int64_t cmu_clkch_get_rate(const uintptr_t base, const unsigned int clkch)
 {
        const struct cmu_desc *const cmu = cmu_desc_get_by_base(base);
        uint32_t div;
@@ -324,11 +333,11 @@ int64_t cmu_clkch_get_rate(const uintptr_t base, const unsigned clkch)
        }
 
        rate = fpll / div;
-       INFO("%s: rate=%ld\n", __func__, rate);
+       VERBOSE("%s: rate=%ld\n", __func__, rate);
        return rate;
 }
 
-int64_t cmu_clkch_round_rate(const uintptr_t base, const unsigned clkch, const uint64_t fclkchreq)
+int64_t cmu_clkch_round_rate(const uintptr_t base, const unsigned int clkch, const uint64_t fclkchreq)
 {
        const struct cmu_desc *const cmu = cmu_desc_get_by_base(base);
        int64_t ret;
@@ -356,13 +365,13 @@ int64_t cmu_clkch_round_rate(const uintptr_t base, const unsigned clkch, const u
                ret = cmu_pll_round_rate(base, cmu->frefclk, fclkchreq);
        }
 
-       INFO("%s: base=0x%08lx ch=%u rate=%lu round=%ld\n",
-            __func__, base, clkch, fclkchreq, ret);
+       VERBOSE("%s: base=0x%08lx ch=%u rate=%lu round=%ld\n",
+             __func__, base, clkch, fclkchreq, ret);
 
        return ret;
 }
 
-int cmu_clkch_set_rate(const uintptr_t base, const unsigned clkch, const uint64_t fclkchreq)
+int cmu_clkch_set_rate(const uintptr_t base, const unsigned int clkch, const uint64_t fclkchreq)
 {
        int ret = 0;
        const struct cmu_desc *const cmu = cmu_desc_get_by_base(base);
@@ -372,7 +381,7 @@ int cmu_clkch_set_rate(const uintptr_t base, const unsigned clkch, const uint64_
        }
 
        if (fclkchreq == cmu_clkch_get_rate(base, clkch)) {
-               INFO("%s: base=0x%08lx rate=%lu already set\n", __func__, base, fclkchreq);
+               VERBOSE("%s: base=0x%08lx rate=%lu already set\n", __func__, base, fclkchreq);
                return 0;
        }
 
@@ -405,7 +414,7 @@ int cmu_clkch_set_rate(const uintptr_t base, const unsigned clkch, const uint64_
                ret = cmu_pll_set_rate(base, cmu->frefclk, fclkchreq);
        }
 
-       INFO("%s: base=0x%08lx ch=%u rate=%lu\n", __func__, base, clkch, fclkchreq);
+       VERBOSE("%s: base=0x%08lx ch=%u rate=%lu\n", __func__, base, clkch, fclkchreq);
        return ret;
 }
 
@@ -424,7 +433,7 @@ static void cmu_pll_div_get(const uintptr_t base, struct plldivs *const plldivs)
        clkfhi = mmio_read_32(base + CMU_PLL_CTL2) & CMU_PLL_CTL2_CLKFHI_MASK;
        plldivs->intnf = ((clkfhi << CLKFHI_SHIFT) + (clkflo << CLKFLO_SHIFT)) >> NF_INT_SHIFT;
 
-       INFO("%s: base=0x%08lx nr=%u od=%u nf=%u\n",
+       VERBOSE("%s: base=0x%08lx nr=%u od=%u nf=%u\n",
                __func__, base, plldivs->nr, plldivs->od, plldivs->intnf);
 }
 
@@ -433,7 +442,7 @@ static int cmu_pll_div_calc(const uint64_t frefclk,
                            struct plldivs *const plldivs)
 {
        if (!frefclk || !fpllreq || !plldivs) {
-               return -ENXIO;;
+               return -ENXIO;
        }
 
        uint64_t fout = 0;
@@ -481,7 +490,7 @@ exit:
                plldivs->nr = nr2;
                plldivs->od = od2;
                plldivs->intnf = intnf2;
-               INFO("%s: nr=%u od=%u nf=%u err=%d rate=%lu\n",
+               VERBOSE("%s: nr=%u od=%u nf=%u err=%d rate=%lu\n",
                        __func__, nr2, od2, intnf2, err2, fout);
                return 0;
        } else {
@@ -538,7 +547,7 @@ static int cmu_pll_div_set(const struct cmu_desc *const cmu,
        return 0;
 }
 
-static int cmu_clkch_div_get(const struct cmu_desc *const cmu, const unsigned clkch)
+static int cmu_clkch_div_get(const struct cmu_desc *const cmu, const unsigned int clkch)
 {
        uintptr_t clkch_reg;
        uint32_t div;
@@ -566,14 +575,14 @@ static int cmu_clkch_div_get(const struct cmu_desc *const cmu, const unsigned cl
                return -ENXIO;
        }
 
-       INFO("%s: base=0x%08lx ch=%u rate=%lu div=%u\n",
+       VERBOSE("%s: base=0x%08lx ch=%u rate=%lu div=%u\n",
                __func__, cmu->base, clkch, fpll / div, div);
 
        return div;
 }
 
 static int cmu_clkch_div_calc(const struct cmu_desc *const cmu,
-                             const unsigned clkch,
+                             const unsigned int clkch,
                              uint64_t fclkchreq)
 {
        uintptr_t clkch_reg;
@@ -614,13 +623,13 @@ static int cmu_clkch_div_calc(const struct cmu_desc *const cmu,
                div *= CMU_MSHC_DIV;
        }
 
-       INFO("%s: base=0x%08lx ch=%u rate=%lu div=%d\n",
+       VERBOSE("%s: base=0x%08lx ch=%u rate=%lu div=%d\n",
                __func__, cmu->base, clkch, fclkchreq, div);
 
        return div;
 }
 
-static int cmu_clkch_div_set(const struct cmu_desc *const cmu, const unsigned clkch, uint32_t div)
+static int cmu_clkch_div_set(const struct cmu_desc *const cmu, const unsigned int clkch, uint32_t div)
 {
        uintptr_t clkch_reg;
        uint64_t timeout;
@@ -650,7 +659,7 @@ static int cmu_clkch_div_set(const struct cmu_desc *const cmu, const unsigned cl
 
        for (timeout = timeout_init_us(100000); !timeout_elapsed(timeout);) {
                if (mmio_read_32(clkch_reg) & CMU_CLKCH_CTL_LOCK_CLKDIV) {
-                       INFO("%s: base=0x%08lx ch=%u div=%u\n", __func__, cmu->base, clkch, div);
+                       VERBOSE("%s: base=0x%08lx ch=%u div=%u\n", __func__, cmu->base, clkch, div);
                        return 0;
                }
        }
@@ -667,20 +676,15 @@ static void cmu_pllinit_div_set(const uintptr_t base,
        uint32_t od = pllinit->clkod + 1;
        uint32_t nr = pllinit->clkr + 1;
 
-       INFO("%s: base=0x%08lx nr=%u od=%u nf=%lu\n", __func__, base, nr, od, nf >> NF_INT_SHIFT);
+       VERBOSE("%s: base=0x%08lx nr=%u od=%u nf=%lu\n", __func__, base, nr, od, nf >> NF_INT_SHIFT);
        cmu_pll_set_nr(base, nr);
        cmu_pll_set_od(base, od);
        cmu_pll_set_nf(base, nf);
-
-       mmio_clrsetbits_32(base + CMU_PLL_CTL4,
-                          CMU_PLL_CTL4_IIGAIN_LGMLT_MASK |
-                          CMU_PLL_CTL4_IPGAIN_LGMLT_MASK |
-                          CMU_PLL_CTL4_IGAIN_LGMLT_MASK  |
-                          CMU_PLL_CTL4_PGAIN_LGMLT_MASK,
-                          CMU_PLL_CTL4_IIGAIN_LGMLT_SET(pllinit->iigain) |
-                          CMU_PLL_CTL4_IPGAIN_LGMLT_SET(pllinit->ipgain) |
-                          CMU_PLL_CTL4_IGAIN_LGMLT_SET(pllinit->igain)   |
-                          CMU_PLL_CTL4_PGAIN_LGMLT_SET(pllinit->pgain));
+       cmu_pll_set_gains(base,
+                         pllinit->pgain,
+                         pllinit->igain,
+                         pllinit->ipgain,
+                         pllinit->iigain);
 }
 
 static int cmu_set_core_rate(const struct cmu_desc *const cmu,
@@ -726,41 +730,34 @@ static int cmu_set_periph_rate(const struct cmu_desc *const cmu,
        if (!frefclk) {
                frefclk = cmu->frefclk;
        }
-
-       /*
+#if 0
        if (!cmu_pll_is_enabled(cmu->base)) {
                return cmu_pll_div_set(cmu, frefclk, fpllreq);
        }
-       */
 
-       /*
        mmio_clrbits_32(cmu->base + CMU_PLL_CTL6, CMU_PLL_CTL6_SWEN);
        mmio_setbits_32(cmu->base + CMU_PLL_CTL0, CMU_PLL_CTL0_CTL_EN);
        mmio_clrbits_32(cmu->base + CMU_PLL_CTL0, CMU_PLL_CTL0_BYPASS);
-       */
-
+#endif
        err = cmu_pll_div_set(cmu, frefclk, fpllreq);
        if (err) {
                return err;
        }
 
        mmio_setbits_32(cmu->base + CMU_PLL_CTL0, CMU_PLL_CTL0_RST);
-       /*
+#if 0
        err = cmu_pll_lock_debounce(cmu->base);
        if (err) {
                return err;
        }
-       */
 
-       /*
        mmio_setbits_32(cmu->base + CMU_PLL_CTL6, CMU_PLL_CTL6_SWEN);
        mmio_clrbits_32(cmu->base + CMU_PLL_CTL6, CMU_PLL_CTL6_SWRST);
-       */
-
+#endif
        return 0;
 }
 
-static struct cmu_desc *const cmu_desc_get_by_base(const uintptr_t base)
+static struct cmu_desc *cmu_desc_get_by_base(const uintptr_t base)
 {
        int idx;
 
@@ -780,11 +777,11 @@ static struct cmu_desc *const cmu_desc_get_by_base(const uintptr_t base)
                }
        }
 
-       INFO("%s: base=0x%08lx fail\n", __func__, base);
+       VERBOSE("%s: base=0x%08lx fail\n", __func__, base);
        return NULL;
 }
 
-static uintptr_t cmu_clkch_get_reg(const uintptr_t base, const unsigned clkch)
+static uintptr_t cmu_clkch_get_reg(const uintptr_t base, const unsigned int clkch)
 {
        return base + CMU_CLKCH0_CTL + clkch * 0x10;
 }
@@ -806,9 +803,10 @@ static int cmu_pll_lock_debounce(const uintptr_t base)
        return -ETIMEDOUT;
 }
 
-struct cmu_desc *const cmu_desc_get_by_idx(const unsigned idx)
+struct cmu_desc *cmu_desc_get_by_idx(const unsigned int idx)
 {
-       static struct cmu_desc cmus[20];
+       static struct cmu_desc cmus[60];
+
        if (idx >= ARRAY_SIZE(cmus)) {
                return NULL;
        }
@@ -817,10 +815,18 @@ struct cmu_desc *const cmu_desc_get_by_idx(const unsigned idx)
 }
 
 /* TODO: rework, it is silimar to {cmu_clkch_div_set() + cmu_clkch_enable()} */
-void cmu_clkch_enable_by_base(const uintptr_t base, const unsigned div)
+void cmu_clkch_enable_by_base(const uintptr_t base, const unsigned int div)
 {
        uint64_t timeout;
 
+#ifdef BAIKAL_QEMU
+       if (base == MMCA57_0_PVT_CLKCHCTL ||
+           base == MMCA57_1_PVT_CLKCHCTL ||
+           base == MMCA57_2_PVT_CLKCHCTL ||
+           base == MMCA57_3_PVT_CLKCHCTL) {
+               return;
+       }
+#endif
        mmio_clrbits_32(base, CMU_CLKCH_CTL_CLK_EN);
        mmio_clrsetbits_32(base,
                CMU_CLKCH_CTL_VAL_CLKDIV_MASK,
@@ -844,7 +850,7 @@ void cmu_clkch_enable_by_base(const uintptr_t base, const unsigned div)
                }
        }
 
-       INFO("%s: base=0x%08lx enable\n", __func__, base);
+       VERBOSE("%s: base=0x%08lx enable\n", __func__, base);
        mmio_clrbits_32(base, CMU_CLKCH_CTL_SWRST);
 }
 
@@ -854,7 +860,7 @@ void cmu_pll_on(const uintptr_t base, const cmu_pll_ctl_vals_t *const pllinit)
        int err;
 
        if (base == MMAVLSP_CMU0_BASE) {
-               INFO("%s: base=0x%08lx skip\n", __func__, base);
+               VERBOSE("%s: base=0x%08lx skip\n", __func__, base);
                return;
        }
 
@@ -870,31 +876,31 @@ void cmu_pll_on(const uintptr_t base, const cmu_pll_ctl_vals_t *const pllinit)
                return;
        }
 
-       INFO("%s: base=0x%08lx enable\n", __func__, base);
+       VERBOSE("%s: base=0x%08lx enable\n", __func__, base);
        mmio_setbits_32(base + CMU_PLL_CTL6, CMU_PLL_CTL6_SWEN);
        mmio_clrbits_32(base + CMU_PLL_CTL6, CMU_PLL_CTL6_SWRST);
 }
 
-static void cmu_pll_set_od(const uintptr_t base, const uint32_t od)
-{
-       assert(od >= OD_MIN);
-       assert(od <= OD_MAX);
-
-       mmio_clrsetbits_32(base +
-               CMU_PLL_CTL0,
-               CMU_PLL_CTL0_CLKOD_MASK,
-               CMU_PLL_CTL0_CLKOD_SET(od - 1));
-}
-
-static void cmu_pll_set_nr(const uintptr_t base, const uint32_t nr)
+void cmu_pll_set_gains(const uintptr_t base,
+                      const int8_t pgain,
+                      const int8_t igain,
+                      const int8_t ipgain,
+                      const int8_t iigain)
 {
-       assert(nr >= NR_MIN);
-       assert(nr <= NR_MAX);
+       assert(pgain  >= -32 && pgain  <= 31);
+       assert(igain  >= -32 && igain  <= 31);
+       assert(ipgain >= -32 && ipgain <= 31);
+       assert(iigain >= -32 && iigain <= 31);
 
-       mmio_clrsetbits_32(base +
-               CMU_PLL_CTL0,
-               CMU_PLL_CTL0_CLKR_MASK,
-               CMU_PLL_CTL0_CLKR_SET(nr - 1));
+       mmio_clrsetbits_32(base + CMU_PLL_CTL4,
+                          CMU_PLL_CTL4_PGAIN_LGMLT_MASK  |
+                          CMU_PLL_CTL4_IGAIN_LGMLT_MASK  |
+                          CMU_PLL_CTL4_IPGAIN_LGMLT_MASK |
+                          CMU_PLL_CTL4_IIGAIN_LGMLT_MASK,
+                          CMU_PLL_CTL4_PGAIN_LGMLT_SET(pgain)   |
+                          CMU_PLL_CTL4_IGAIN_LGMLT_SET(igain)   |
+                          CMU_PLL_CTL4_IPGAIN_LGMLT_SET(ipgain) |
+                          CMU_PLL_CTL4_IIGAIN_LGMLT_SET(iigain));
 }
 
 static void cmu_pll_set_nf(const uintptr_t base, const uint64_t nf)
@@ -920,3 +926,25 @@ static void cmu_pll_set_nf(const uintptr_t base, const uint64_t nf)
                mmio_write_32(base + CMU_PLL_CTL3, ctl3);
        }
 }
+
+static void cmu_pll_set_nr(const uintptr_t base, const uint32_t nr)
+{
+       assert(nr >= NR_MIN);
+       assert(nr <= NR_MAX);
+
+       mmio_clrsetbits_32(base +
+               CMU_PLL_CTL0,
+               CMU_PLL_CTL0_CLKR_MASK,
+               CMU_PLL_CTL0_CLKR_SET(nr - 1));
+}
+
+static void cmu_pll_set_od(const uintptr_t base, const uint32_t od)
+{
+       assert(od >= OD_MIN);
+       assert(od <= OD_MAX);
+
+       mmio_clrsetbits_32(base +
+               CMU_PLL_CTL0,
+               CMU_PLL_CTL0_CLKOD_MASK,
+               CMU_PLL_CTL0_CLKOD_SET(od - 1));
+}
index 1dd8741150b5b7fceed41b776aa884c8e9163869..b80f387724babf353363399e40e0edb6adbfecb2 100644 (file)
 #include <stdbool.h>
 #include <stdint.h>
 
-struct cmu_desc {
+struct __attribute__((__packed__)) cmu_desc {
        uintptr_t       base;
-       const char      *name;
        uint64_t        frefclk;
-       uint64_t        fpllmin;
-       uint64_t        fpllmax;
-       uint64_t        fpllreq;
        bool            deny_pll_reconf;
 };
 
-typedef struct cmu_pll_ctl_vals {
+typedef struct __attribute__((__packed__)) {
        uint16_t        clkod;
        uint16_t        clkr;
        uint64_t        clkf;
-       uint8_t         pgain;
-       uint8_t         igain;
-       uint8_t         ipgain;
-       uint8_t         iigain;
+       int8_t          pgain;
+       int8_t          igain;
+       int8_t          ipgain;
+       int8_t          iigain;
 } cmu_pll_ctl_vals_t;
 
-struct cmu_desc *const cmu_desc_get_by_idx(const unsigned idx);
+struct cmu_desc *cmu_desc_get_by_idx(const unsigned int idx);
 
 /* PLL functions */
 int64_t        cmu_pll_get_rate  (const uintptr_t base, uint64_t frefclk);
@@ -40,14 +36,19 @@ int cmu_pll_enable    (const uintptr_t base);
 int    cmu_pll_is_enabled(const uintptr_t base);
 void   cmu_pll_on        (const uintptr_t base, const cmu_pll_ctl_vals_t *const pllinit);
 int64_t        cmu_pll_round_rate(const uintptr_t base, uint64_t frefclk, const uint64_t fpllreq);
+void   cmu_pll_set_gains (const uintptr_t base,
+                          const int8_t pgain,
+                          const int8_t igain,
+                          const int8_t ipgain,
+                          const int8_t iigain);
 
 /* Clock channel functions */
-int64_t        cmu_clkch_get_rate      (const uintptr_t base, const unsigned clkch);
-int    cmu_clkch_set_rate      (const uintptr_t base, const unsigned clkch, const uint64_t fclkchreq);
-int    cmu_clkch_disable       (const uintptr_t base, const unsigned clkch);
-int    cmu_clkch_enable        (const uintptr_t base, const unsigned clkch);
-void   cmu_clkch_enable_by_base(const uintptr_t base, const unsigned div);
-int    cmu_clkch_is_enabled    (const uintptr_t base, const unsigned clkch);
-int64_t        cmu_clkch_round_rate    (const uintptr_t base, const unsigned clkch, const uint64_t fclkchreq);
+int64_t        cmu_clkch_get_rate      (const uintptr_t base, const unsigned int clkch);
+int    cmu_clkch_set_rate      (const uintptr_t base, const unsigned int clkch, const uint64_t fclkchreq);
+int    cmu_clkch_disable       (const uintptr_t base, const unsigned int clkch);
+int    cmu_clkch_enable        (const uintptr_t base, const unsigned int clkch);
+void   cmu_clkch_enable_by_base(const uintptr_t base, const unsigned int div);
+int    cmu_clkch_is_enabled    (const uintptr_t base, const unsigned int clkch);
+int64_t        cmu_clkch_round_rate    (const uintptr_t base, const unsigned int clkch, const uint64_t fclkchreq);
 
 #endif /* BM1000_CMU_H */
diff --git a/plat/baikal/bm1000/drivers/bm1000_efuse.c b/plat/baikal/bm1000/drivers/bm1000_efuse.c
new file mode 100644 (file)
index 0000000..5e56b67
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2023, Baikal Electronics, JSC. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdint.h>
+
+#include <baikal_scp.h>
+#include <bm1000_efuse.h>
+
+int64_t efuse_get_lot(void)
+{
+       int err;
+
+       err = scp_cmd('I', 0, 0);
+       if (err) {
+               return err;
+       }
+
+       return *(uint64_t *)scp_buf();
+}
+
+int32_t efuse_get_mac(void)
+{
+       int err;
+
+       err = scp_cmd('M', 0, 0);
+       if (err) {
+               return err;
+       }
+
+       return *(uint32_t *)scp_buf();
+}
+
+int32_t efuse_get_serial(void)
+{
+       int err;
+
+       err = scp_cmd('N', 0, 0);
+       if (err) {
+               return err;
+       }
+
+       return *(uint32_t *)scp_buf();
+}
diff --git a/plat/baikal/bm1000/drivers/bm1000_efuse.h b/plat/baikal/bm1000/drivers/bm1000_efuse.h
new file mode 100644 (file)
index 0000000..e8ac4a1
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2023, Baikal Electronics, JSC. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef BM1000_EFUSE_H
+#define BM1000_EFUSE_H
+
+#include <stdint.h>
+
+int64_t efuse_get_lot(void);
+int32_t efuse_get_mac(void);
+int32_t efuse_get_serial(void);
+
+#endif /* BM1000_EFUSE_H */
index cd4d96fbcb63af7c8584d48d922c9b1437eae9d0..06f04e4666bbfe035c8d898d606de3a838789167 100644 (file)
@@ -78,6 +78,9 @@ int scp_cmd(uint8_t op, uint32_t arg0, uint32_t arg1)
                scp->offset = arg0 + BAIKAL_SCP_MAX_SIZE;
                scp->size   = (uint16_t)arg1;
                break;
+       case 'I':
+       case 'M':
+       case 'N':
        case 'T':
        case 't':
                scp->op = op;
index 2391a2082e13a61fc90f3feb3e074b3dc2448231..96f2ed704da928f66a1b1ba9e7aaece0c8dc2469 100644 (file)
@@ -15,9 +15,9 @@
 
 #define SCP_FLASH_MAX_CHUNK_SIZE       UL(1024)
 
-void scp_flash_init(void)
+int scp_flash_init(void)
 {
-       scp_cmd('T', 0, 0); /* disable trace */
+       return scp_cmd('T', 0, 0); /* disable trace */
 }
 
 int scp_flash_erase(uint32_t addr, size_t size)
index 4123af843531f6b525268e9652cfff57003ace5f..f4c675703fdc49c2d1571604d06d702e667f5a95 100644 (file)
@@ -10,9 +10,9 @@
 #include <stddef.h>
 #include <stdint.h>
 
-void scp_flash_init(void);
-int  scp_flash_erase(uint32_t addr, size_t size);
-int  scp_flash_read( uint32_t addr, void *buf,  size_t size);
-int  scp_flash_write(uint32_t addr, void *data, size_t size);
+int scp_flash_init(void);
+int scp_flash_erase(uint32_t addr, size_t size);
+int scp_flash_read(uint32_t addr, void *buf, size_t size);
+int scp_flash_write(uint32_t addr, void *data, size_t size);
 
 #endif /* BM1000_SCP_FLASH_H */
index 0ca55ab3b74ff17bb59d6e1a515dd9755caa83d1..7a2b7eb0b24d61395ca369f387612d205bed070d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -57,22 +57,27 @@ struct smbus_regs {
 
 #define FIFO_SIZE      U(16)
 
-#define SCL_CLK_DIV    499
-CASSERT(SCL_CLK_DIV < 1024, assert_smbus_scl_clk_div);
-
-unsigned smbus_txrx(const uintptr_t base,
-                   const unsigned targetaddr,
-                   const void *const txbuf,
-                   const unsigned txbufsize,
-                   void *const rxbuf,
-                   const unsigned rxbufsize)
+unsigned int smbus_txrx(const uintptr_t base,
+                       const unsigned int iclk,
+                       const enum smbus_sht sht,
+                       const unsigned int sclclk,
+                       const unsigned int targetaddr,
+                       const void *const txbuf,
+                       const unsigned int txbufsize,
+                       void *const rxbuf,
+                       const unsigned int rxbufsize)
 {
        volatile struct smbus_regs *const smbusregs = (volatile struct smbus_regs *const)base;
-       unsigned rxedsize = 0;
+       const unsigned int sclclkdiv = iclk / sclclk - 1;
+       unsigned int rxedsize = 0;
        uint8_t *const rxptr = (uint8_t *)rxbuf;
        const uint8_t *const txptr = (uint8_t *)txbuf;
 
        assert(smbusregs != NULL);
+       assert(sclclk >= 10000);
+       assert((sht == SMBUS_SHT_100KHZ && sclclk <= 100000) ||
+              (sht == SMBUS_SHT_400KHZ && sclclk <= 400000));
+       assert(sclclkdiv <= 1023);
        assert(targetaddr <= 0x7f);
        assert(txbuf != NULL || !txbufsize);
        assert(rxbuf != NULL || !rxbufsize);
@@ -80,8 +85,8 @@ unsigned smbus_txrx(const uintptr_t base,
        smbusregs->cr1   = CR1_IRT;
        smbusregs->cr1   = 0;
        smbusregs->cr2   = 0;
-       smbusregs->scd1  = SCL_CLK_DIV & 0xff;
-       smbusregs->scd2  = SCD2_SHT | (SCL_CLK_DIV >> 8);
+       smbusregs->scd1  = (sclclkdiv & 0xff);
+       smbusregs->scd2  = (sclclkdiv >> 8) | (sht == SMBUS_SHT_100KHZ ? SCD2_SHT : 0);
        smbusregs->adr1  = targetaddr;
        smbusregs->imr1  = 0;
        smbusregs->imr2  = 0;
@@ -89,11 +94,11 @@ unsigned smbus_txrx(const uintptr_t base,
        smbusregs->cr1   = CR1_IEB;
 
        if (txbufsize > 0) {
-               unsigned txedsize;
+               unsigned int txedsize;
 
                smbusregs->cr1 |= CR1_TRS;
                for (txedsize = 0; txedsize < txbufsize;) {
-                       unsigned bytecount;
+                       unsigned int bytecount;
                        bool holdbus = false;
 
                        bytecount = txbufsize - txedsize;
@@ -125,7 +130,8 @@ unsigned smbus_txrx(const uintptr_t base,
 
                        while (!(smbusregs->isr1 &
                                 (ISR1_TCS | ISR1_ALD | ISR1_RNK)) &&
-                              !(smbusregs->isr2 & ISR2_MSH));
+                              !(smbusregs->isr2 & ISR2_MSH))
+                               ;
 
                        if (smbusregs->isr1 & (ISR1_ALD | ISR1_RNK)) {
                                goto exit;
@@ -136,7 +142,7 @@ unsigned smbus_txrx(const uintptr_t base,
        }
 
        for (rxedsize = 0; rxedsize < rxbufsize;) {
-               unsigned bytecount = MIN(rxbufsize - rxedsize, FIFO_SIZE);
+               unsigned int bytecount = MIN(rxbufsize - rxedsize, FIFO_SIZE);
 
                smbusregs->isr1  = ISR1_TCS | ISR1_FFE |
                                   ISR1_ALD | ISR1_RNK |
@@ -146,7 +152,8 @@ unsigned smbus_txrx(const uintptr_t base,
                smbusregs->cr2   = CR2_FTE;
 
                while ((smbusregs->cr2 & CR2_FTE) &&
-                      !(smbusregs->isr1 & (ISR1_TCS | ISR1_ALD | ISR1_RNK)));
+                      !(smbusregs->isr1 & (ISR1_TCS | ISR1_ALD | ISR1_RNK)))
+                       ;
 
                if (smbusregs->isr1 & (ISR1_ALD | ISR1_RNK)) {
                        goto exit;
index 7f0cbee6177f1f995635a1ff75f8b865047b4db2..c6292500d42f66d9c5c77540693ac71f084c3507 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -7,11 +7,19 @@
 #ifndef BM1000_SMBUS_H
 #define BM1000_SMBUS_H
 
-unsigned smbus_txrx(const uintptr_t base,
-                   const unsigned targetaddr,
-                   const void *const txbuf,
-                   const unsigned txbufsize,
-                   void *const rxbuf,
-                   const unsigned rxbufsize);
+enum smbus_sht {
+       SMBUS_SHT_400KHZ = 0,
+       SMBUS_SHT_100KHZ = 1
+};
+
+unsigned int smbus_txrx(const uintptr_t base,
+                       const unsigned int iclk,
+                       const enum smbus_sht sht,
+                       const unsigned int sclclk,
+                       const unsigned int targetaddr,
+                       const void *const txbuf,
+                       const unsigned int txbufsize,
+                       void *const rxbuf,
+                       const unsigned int rxbufsize);
 
 #endif /* BM1000_SMBUS_H */
index bf44ceb4e99bb938a3a89b8c4bed9bdb6a91dbae..26ef573f422bead19379e0a0fb05b3af0324a877 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2014-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * Author: Alexey Malahov <Alexey.Malahov@baikalelectronics.com>
  *
@@ -11,6 +11,8 @@
 
 #include <stdint.h>
 
+#include <bm1000_def.h>
+
 #define DDRC_MSTR              0x0     /* Master Register */
 #define DDRC_STAT              0x4     /* Operating Mode Status Register */
 #define DDRC_MRCTRL0           0x10    /* Mode Register Read/Write Control Register 0 */
 #define DDR_SINGLE_MODE                0
 #define DDR_DUAL_MODE          1
 
-#define DDR_CTRL_BASE_PORT0    UL(0x0e200000)
-#define DDR_CTRL_BASE_PORT1    UL(0x22200000)
-#define DDR_CTRL_BASE_OFF      (DDR_CTRL_BASE_PORT1 - DDR_CTRL_BASE_PORT0)
-
-#define DDR_PHY_BASE_PORT0     UL(0x0e210000)
-#define DDR_PHY_BASE_PORT1     UL(0x22210000)
-#define DDR_PHY_BASE_OFF       (DDR_PHY_BASE_PORT1 - DDR_PHY_BASE_PORT0)
-
-#define DDR_CTRL(p)    (DDR_CTRL_BASE_PORT0 + (p) * DDR_CTRL_BASE_OFF)
-#define DDR_PHY(p)     (DDR_PHY_BASE_PORT0 + (p) * DDR_PHY_BASE_OFF)
-
-#define _READ_MEMORY_REG(r)    (*((volatile uint32_t*) (r)))
-#define _WRITE_MEMORY_REG(r, v)        (*((volatile uint32_t*) (r)) = v)
-
-/* Macros to read/write DDR Memory Controller (uMCTL2) registers */
-#define BM_DDRC_WRITE(p, r, v) _WRITE_MEMORY_REG(DDR_CTRL(p) + (r), v)
-#define BM_DDRC_READ(p, r)     _READ_MEMORY_REG(DDR_CTRL(p) + (r))
+#define DDR_CTRL_BASE_OFF      (MMDDR1_CTRL_BASE - MMDDR0_CTRL_BASE)
+#define DDR_PHY_BASE_OFF       (MMDDR1_PHY_BASE  - MMDDR0_PHY_BASE)
 
-/* Macros to read/write DDR4 multiPHY Utility Block (PUB) registers */
-#define BM_DDR_PUB_WRITE(p, r, v)      _WRITE_MEMORY_REG(DDR_PHY(p) + (r), v)
-#define BM_DDR_PUB_READ(p, r)          _READ_MEMORY_REG(DDR_PHY(p) + (r))
+#define DDR_CTRL(p)            (MMDDR0_CTRL_BASE + ((unsigned long)p) * DDR_CTRL_BASE_OFF)
+#define DDR_PHY(p)             (MMDDR0_PHY_BASE  + ((unsigned long)p) * DDR_PHY_BASE_OFF)
 
 /* DCU Command Cache line fields */
 #define DCU_DFIELD_DATA                0  /* field width:  5 */
index 379f84674f9bad04145b86ede76649cf2b783f89..81807ac235ad70ea5b51fbefb143f7be2567eafd 100644 (file)
@@ -1,19 +1,29 @@
 /*
- * Copyright (c) 2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2021-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
 #include <common/debug.h>
 #include <drivers/delay_timer.h>
+#include <lib/mmio.h>
 
 #include <ndelay.h>
 
+#include <baikal_def.h>
 #include "ddr_baikal.h"
 #include "ddr_lcru.h"
 #include "ddr_master.h"
 
-static void baikal_ddrc_set_registers(const unsigned port, struct ctl_content *ddrc)
+/* Macros to read/write DDR Memory Controller (uMCTL2) registers */
+#define BM_DDRC_READ(p, r)             mmio_read_32(DDR_CTRL(p) + (r))
+#define BM_DDRC_WRITE(p, r, v)         mmio_write_32(DDR_CTRL(p) + (r), v)
+
+/* Macros to read/write DDR4 multiPHY Utility Block (PUB) registers */
+#define BM_DDR_PUB_READ(p, r)          mmio_read_32(DDR_PHY(p) + (r))
+#define BM_DDR_PUB_WRITE(p, r, v)      mmio_write_32(DDR_PHY(p) + (r), v)
+
+static void baikal_ddrc_set_registers(const unsigned int port, struct ctl_content *ddrc)
 {
        BM_DDRC_WRITE(port, DDRC_MSTR, ddrc->MSTR_);
 
@@ -94,7 +104,7 @@ static void baikal_ddrc_set_registers(const unsigned port, struct ctl_content *d
        BM_DDRC_WRITE(port, DDRC_DFIUPD2, ddrc->DFIUPD2_);
 }
 
-static void baikal_ddrphy_set_registers(const unsigned port, struct phy_content *phy)
+static void baikal_ddrphy_set_registers(const unsigned int port, struct phy_content *phy)
 {
        BM_DDR_PUB_WRITE(port, DDR_PUB_DCR, phy->DCR_);
 
@@ -150,6 +160,7 @@ static void baikal_ddrphy_set_registers(const unsigned port, struct phy_content
 
        if (phy->dbus_half) {
                uint32_t DXnGCR0_val = BM_DDR_PUB_READ(port, DDR_PUB_DX4GCR0);
+
                DXnGCR0_val &= ~(0x1U);
                BM_DDR_PUB_WRITE(port, DDR_PUB_DX4GCR0, DXnGCR0_val);
                BM_DDR_PUB_WRITE(port, DDR_PUB_DX5GCR0, DXnGCR0_val);
@@ -163,10 +174,11 @@ static void dcu_load_mode_command(int port, int mr_num, int mr_value)
        uint64_t timeout;
        uint32_t tMRD = BM_DDR_PUB_READ(port, DDR_PUB_DTPR1) & 0x1f;
        uint64_t cmu_cmd = 0; /* supposed content of cache */
-       cmu_cmd |= ((uint64_t)tMRD << DCU_DFIELD_DTP) |\
-                       (1ULL << DCU_DFIELD_TAG) |\
-                       (1ULL << DCU_DFIELD_CMD) |\
-                       (mr_num << DCU_DFIELD_BANK) |\
+
+       cmu_cmd |= ((uint64_t)tMRD << DCU_DFIELD_DTP) |
+                       (1ULL << DCU_DFIELD_TAG) |
+                       (1ULL << DCU_DFIELD_CMD) |
+                       (mr_num << DCU_DFIELD_BANK) |
                        (mr_value << DCU_DFIELD_ADDR);
 
        /* initiate write to cache by writing to DCUAR & DCUDR: */
@@ -183,6 +195,7 @@ static void dcu_load_mode_command(int port, int mr_num, int mr_value)
 
        for (timeout = timeout_init_us(10000);;) {
                const uint32_t reg = BM_DDR_PUB_READ(port, DDR_PUB_DCUSR0);
+
                if (reg & 0x1) {
                        break;
                } else if (timeout_elapsed(timeout)) {
@@ -203,7 +216,7 @@ static void run_dram_vref_tarining(int port)
 }
 #endif
 
-static int baikal_ddrphy_pir_training(const unsigned port, uint32_t mode)
+static int baikal_ddrphy_pir_training(const unsigned int port, uint32_t mode)
 {
        int ret = 0;
        uint64_t timeout;
@@ -230,6 +243,7 @@ static int baikal_ddrphy_pir_training(const unsigned port, uint32_t mode)
 
        for (timeout = timeout_init_us(10000);;) {
                const uint32_t reg = BM_DDR_PUB_READ(port, DDR_PUB_PGSR0);
+
                if (reg & 0x1) {
                        break;
                } else if (timeout_elapsed(timeout)) {
@@ -243,15 +257,17 @@ static int baikal_ddrphy_pir_training(const unsigned port, uint32_t mode)
        return ret;
 }
 
-static int baikal_ddrphy_vref_training(const unsigned port, unsigned clock_mhz)
+static int baikal_ddrphy_vref_training(const unsigned int port, unsigned int clock_mhz)
 {
        uint32_t vtcr0_val = BM_DDR_PUB_READ(port, DDR_PUB_VTCR0);
+
        vtcr0_val &= ~GENMASK(31, 29);
        vtcr0_val |= GENMASK(31, 29) & ((3 * clock_mhz / 640) << 29); /* Number of ctl_clk supposed to be (> 150ns) during DRAM VREF training */
        vtcr0_val &= ~GENMASK(5, 0);
        vtcr0_val |= 0x8; /* DRAM Vref initial value (this one is for DDR0 channel speedbin DDR4-2133) */
 #ifdef BAIKAL_DUAL_CHANNEL_MODE
        uint32_t dram_vref_val = BM_DDR_PUB_READ(port, DDR_PUB_MR6) & 0x3f;
+
        if (dram_vref_val) {
                vtcr0_val |= dram_vref_val;
        }
@@ -261,6 +277,7 @@ static int baikal_ddrphy_vref_training(const unsigned port, unsigned clock_mhz)
 
        /* D4MV I/Os with PVREF_DAC settings (PUB DataBook p.353) */
        uint32_t vtcr1_val = BM_DDR_PUB_READ(port, DDR_PUB_VTCR1);
+
        vtcr1_val &= ~GENMASK(7, 5);
        vtcr1_val |= GENMASK(7, 5) & ((clock_mhz / 160) << 5); /* Number of ctl_clk supposed to be (> 200ns) during Host IO VREF training */
        vtcr1_val &= ~(0x1U << 8);
@@ -269,6 +286,7 @@ static int baikal_ddrphy_vref_training(const unsigned port, unsigned clock_mhz)
        /* 4.4.8.6 Steps to Run VREF Training (PUB DataBook p.363) */
        const uint32_t dtcr0_stored = BM_DDR_PUB_READ(port, DDR_PUB_DTCR0);
        uint32_t dtcr0_val = dtcr0_stored;
+
        dtcr0_val &= ~GENMASK(31, 28); /* Disable refresh during training */
        BM_DDR_PUB_WRITE(port, DDR_PUB_DTCR0, dtcr0_val);
 
@@ -287,7 +305,7 @@ static int baikal_ddrphy_vref_training(const unsigned port, unsigned clock_mhz)
        return ret;
 }
 
-static int baikal_ddrphy_dram_init(const unsigned port, unsigned clock_mhz)
+static int baikal_ddrphy_dram_init(const unsigned int port, unsigned int clock_mhz)
 {
        int ret = 0;
        uint64_t timeout;
@@ -307,11 +325,13 @@ static int baikal_ddrphy_dram_init(const unsigned port, unsigned clock_mhz)
        } else {
                ret = baikal_ddrphy_pir_training(port, DDR_PUB_PIR_DRAM_STEP0);
        }
+
        if (ret) {
                return ret;
        }
 #ifdef BAIKAL_DUAL_CHANNEL_MODE
        uint32_t dram_vref_val = BM_DDR_PUB_READ(port, DDR_PUB_MR6) & 0x3f;
+
        if (dram_vref_val) {
                run_dram_vref_tarining(port);
        }
@@ -321,6 +341,7 @@ static int baikal_ddrphy_dram_init(const unsigned port, unsigned clock_mhz)
         * During DDR4 write leveling training rtt_wr in MR2 register must be zeroed.
         */
        const uint16_t mr2_val = BM_DDR_PUB_READ(port, DDR_PUB_MR2);
+
        if (mr2_val & GENMASK(11, 9)) {
                dcu_load_mode_command(port, 2, mr2_val & ~GENMASK(11, 9));
        }
@@ -360,6 +381,7 @@ static int baikal_ddrphy_dram_init(const unsigned port, unsigned clock_mhz)
 
        /* Enable DFI update request */
        uint32_t dsgcr_val = BM_DDR_PUB_READ(port, DDR_PUB_DSGCR);
+
        dsgcr_val |= DDR_PUB_DSGCR_PUREN;
        BM_DDR_PUB_WRITE(port, DDR_PUB_DSGCR, dsgcr_val);
 
@@ -372,6 +394,7 @@ static int baikal_ddrphy_dram_init(const unsigned port, unsigned clock_mhz)
 
        for (timeout = timeout_init_us(10000);;) {
                const uint32_t reg = BM_DDRC_READ(port, DDRC_STAT);
+
                if ((reg & 0x3) == 0x1) {
                        break;
                } else if (timeout_elapsed(timeout)) {
@@ -422,6 +445,7 @@ int ddr_init(int port, bool dual_mode, struct ddr_configuration *info)
        if (!info->ecc_on) {
                /* disable unused 9-th data byte */
                uint32_t tmp = BM_DDR_PUB_READ(port, DDR_PUB_DX8GCR0);
+
                tmp &= ~(1 << 0);
                BM_DDR_PUB_WRITE(port, DDR_PUB_DX8GCR0, tmp);
        }
@@ -430,17 +454,16 @@ int ddr_init(int port, bool dual_mode, struct ddr_configuration *info)
        if (ret) {
                return ret;
        }
-
 #ifdef BAIKAL_DUAL_CHANNEL_MODE
        /* set internal Vref values */
        if (info->PHY_HOST_VREF) {
-               uint32_t DXnGCR5_val = (info->PHY_HOST_VREF << 24) \
-                                       | (info->PHY_HOST_VREF << 16) \
-                                       | (info->PHY_HOST_VREF << 8) \
+               uint32_t DXnGCR5_val = (info->PHY_HOST_VREF << 24)
+                                       | (info->PHY_HOST_VREF << 16)
+                                       | (info->PHY_HOST_VREF << 8)
                                        | (info->PHY_HOST_VREF);
                for (int i = 0; i <= 8; i++) {
                        /* all registers lie at constant offsets from one another: */
-                       BM_DDR_PUB_WRITE(port, DDR_PUB_DX0GCR5 + \
+                       BM_DDR_PUB_WRITE(port, DDR_PUB_DX0GCR5 +
                                        (DDR_PUB_DX1GCR5 - DDR_PUB_DX0GCR5) * i,
                                                 DXnGCR5_val);
                }
index 29571d7284de4ada50eac1da49092d57afc69895..6b9de43cf9dd5d41efb072a787da3f7d6a7082de 100644 (file)
 
 #define LCRU_DDR(port) (MMDDR0_BASE + (port) * (MMDDR1_BASE - MMDDR0_BASE))
 
-static const cmu_pll_ctl_vals_t pll_ddr_1600 = {4, 0, 0xa000000000, 0, 0x2c, 0, 0x2c};
-static const cmu_pll_ctl_vals_t pll_ddr_1866 = {2, 0, 0x7000000000, 0, 0x2c, 0, 0x2c};
-static const cmu_pll_ctl_vals_t pll_ddr_2133 = {2, 0, 0x8000000000, 0, 0x2c, 0, 0x2c};
-static const cmu_pll_ctl_vals_t pll_ddr_2400 = {2, 0, 0x9000000000, 0, 0x2c, 0, 0x2c};
-static const cmu_pll_ctl_vals_t pll_ddr_2666 = {2, 0, 0xa000000000, 0, 0x2c, 0, 0x2c};
+static const cmu_pll_ctl_vals_t pll_ddr_1600 = {4, 0, 0xa000000000, 0, -20, 0, -20};
+static const cmu_pll_ctl_vals_t pll_ddr_1866 = {2, 0, 0x7000000000, 0, -20, 0, -20};
+static const cmu_pll_ctl_vals_t pll_ddr_2133 = {2, 0, 0x8000000000, 0, -20, 0, -20};
+static const cmu_pll_ctl_vals_t pll_ddr_2400 = {2, 0, 0x9000000000, 0, -20, 0, -20};
+static const cmu_pll_ctl_vals_t pll_ddr_2666 = {2, 0, 0xa000000000, 0, -20, 0, -20};
 
 void ddr_lcru_clkch_rst(int port, uint32_t ra, int set)
 {
-       uint32_t reg = mmio_read_32(LCRU_DDR(port) + ra);
-
        if (set) {
-               reg |= LCRU_CMU_SWRST; /* set reset */
+               mmio_setbits_32(LCRU_DDR(port) + ra, LCRU_CMU_SWRST);
        } else {
-               reg &= ~LCRU_CMU_SWRST; /* clear reset */
+               mmio_clrbits_32(LCRU_DDR(port) + ra, LCRU_CMU_SWRST);
        }
-
-       mmio_write_32(LCRU_DDR(port) + ra, reg);
 }
 
 void ddr_lcru_dual_mode(int port, int mode)
index 9dd99fd70d4ad38de3418c60804e2a16d4ff91a9..eee07a471d7f4b34eec66e1d4607c71deaf184fa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2021-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -20,9 +20,9 @@
 #define TZC_RATTRIBUTE_OFS 0x110
 #define TZC_REIDACCESS_OFS 0x114
 
-int ddr_odt_configuration(const unsigned port, const uint16_t crc_val, struct ddr_configuration *const data);
+int ddr_odt_configuration(const unsigned int port, const uint16_t crc_val, struct ddr_configuration *const data);
 
-static void tzc_set_transparent(const unsigned conf)
+static void tzc_set_transparent(const unsigned int conf)
 {
        if (conf & 0x1) {
                mmio_write_32(MMTZC0_TZC400_BASE + TZC_GATEKEEPER_OFS, 0xf);
@@ -52,15 +52,12 @@ static int ddr_port_init(int port, struct spd_container *ctx, bool dual_mode)
        } else {
                data.single_ddr = 1;
        }
-
 #if !ECC_ENABLE
        data.ecc_on = false;
 #endif
-
 #if DBUS_HALF
        data.dbus_half = true;
 #endif
-
        if (ddr_odt_configuration(port, spd_crc, &data)) {
                goto error;
        }
@@ -68,6 +65,7 @@ static int ddr_port_init(int port, struct spd_container *ctx, bool dual_mode)
        if (ddr_lcru_initport(port, data.clock_mhz)) {
                goto failed;
        }
+
        if (ddr_init(port, dual_mode, &data)) {
                goto failed;
        }
@@ -93,9 +91,12 @@ error:
 int dram_init(void)
 {
        int ret = 0;
-       unsigned conf = 0;
+       unsigned int conf = 0;
        extern struct spd_container spd_content;
 
+#ifdef BAIKAL_QEMU
+       return 0;
+#endif
        if (ddr_read_spd(0) != NULL) {
                if (spd_content.content[0].mem_type == SPD_MEMTYPE_DDR4) {
                        INFO("DIMM0: DDR4 SDRAM is detected\n");
@@ -115,7 +116,7 @@ int dram_init(void)
        }
 
        if (conf & 0x1) {
-               ret = ddr_port_init(0, &spd_content, (conf & 0x2));
+               ret = ddr_port_init(0, &spd_content, conf & 0x2);
        } else {
                ddr_lcru_disable(0);
        }
@@ -125,7 +126,7 @@ int dram_init(void)
        }
 
        if (conf & 0x2) {
-               ret = ddr_port_init(1, &spd_content, (conf & 0x1));
+               ret = ddr_port_init(1, &spd_content, conf & 0x1);
        }
 
        if (ret) {
index e30347fccf95589f90cb43ddb1f20f6cca4cdff6..e9964fcdc46eee52a5a0ef59a786c929147e390b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2021-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -10,6 +10,8 @@
 #include <stdbool.h>
 #include <stdint.h>
 
+#include <baikal_def.h>
+
 enum ddr_speed_bin {DDR4_1600, DDR4_1866, DDR4_2133, DDR4_2400, DDR4_2666};
 
 struct ddr_configuration {
@@ -38,57 +40,41 @@ struct ddr_configuration {
        uint32_t tRAS;          /* ACT to PRE command period */
        uint32_t tRC;           /* ACT to ACT or REF command period */
        uint32_t tRCD;          /* ACT to internal read or write delay time */
-       uint32_t tWTR_S;        /* Write to Read time for different bank
-                                  group */
+       uint32_t tWTR_S;        /* Write to Read time for different bank group */
        uint32_t tWTR_L;        /* Write to Read time for same bank group */
-       uint32_t tRRD_S;        /* ACTIVATE to ACTIVATE Command delay to
-                                  different bank group */
-       uint32_t tRRD_L;        /* ACTIVATE to ACTIVATE Command delay to
-                                  same bank group */
+       uint32_t tRRD_S;        /* ACTIVATE to ACTIVATE Command delay to different bank group */
+       uint32_t tRRD_L;        /* ACTIVATE to ACTIVATE Command delay to same bank group */
        uint32_t tFAW;          /* Four Activate Window delay time */
        uint32_t tRFC1;         /* Refresh Cycle time in 1x mode */
        uint32_t tRFC4;         /* Refresh Cycle time in 4x mode */
        uint32_t tREFI;         /* Periodic Refresh Interval */
        uint32_t tRTP;          /* Read to Precharge for autoprecharge */
-       uint32_t tWR_CRC_DM;    /* Write Recovery time when CRC and DM
-                                  are enabled */
-       uint32_t tWTR_S_CRC_DM; /* Write to Read time for different bank group
-                                  with both CRC and DM enabled */
-       uint32_t tWTR_L_CRC_DM; /* Write to Read time for same bank group
-                                  with both CRC and DM enabled */
+       uint32_t tWR_CRC_DM;    /* Write Recovery time when CRC and DM are enabled */
+       uint32_t tWTR_S_CRC_DM; /* Write to Read time for different bank group with both CRC and DM enabled */
+       uint32_t tWTR_L_CRC_DM; /* Write to Read time for same bank group with both CRC and DM enabled */
        uint32_t tDLLK;         /* DLL Locking time */
        uint32_t tXP;           /* Exit Power Down with DLL on */
        uint32_t tMOD;          /* Mode Register Set time */
-       uint32_t tCCD_S;        /* CAS_n to CAS_n command Delay for different
-                                  bank group */
-       uint32_t tCCD_L;        /* CAS_n to CAS_n command Delay for same bank
-                                  group */
-       uint32_t tCKSRX;        /* Valid Clock Requirement before Self Refresh
-                                  Exit or Power-Down Exit or Reset Exit */
+       uint32_t tCCD_S;        /* CAS_n to CAS_n command Delay for different bank group */
+       uint32_t tCCD_L;        /* CAS_n to CAS_n command Delay for same bank group */
+       uint32_t tCKSRX;        /* Valid Clock Requirement before Self Refresh Exit or Power-Down Exit or Reset Exit */
        uint32_t tCKE;          /* CKE minimum pulse width */
-       uint32_t tMRD_PDA;      /* Mode Register Set command cycle time
-                                  in PDA mode */
+       uint32_t tMRD_PDA;      /* Mode Register Set command cycle time in PDA mode */
        uint32_t tRASmax;       /* Maximum ACT to PRE command period */
        uint32_t tMPX_S;        /* CS setup time to CKE */
        uint32_t tMPX_LH;       /* CS_n Low hold time to CKE rising edge */
        uint32_t tCPDED;        /* Command pass disable delay */
-       uint32_t tXS;           /* Exit Self Refresh to commands not requiring
-                                  a locked DLL */
+       uint32_t tXS;           /* Exit Self Refresh to commands not requiring a locked DLL */
        uint32_t tXS_FAST;      /* Exit Self Refresh to ZQCL,ZQCS and MRS */
-       uint32_t tXS_ABORT;     /* SRX to commands not requiring a locked DLL
-                                  in Self Refresh ABORT */
-       uint32_t tXSDLL;        /* Exit Self Refresh to tXSDLL commands
-                                  requiring a locked DLL */
-       uint32_t tXMP;          /* Exit MPSM to commands not requiring
-                                  a locked DLL */
-       uint32_t tXMPDLL;       /* Exit MPSM to commands requiring
-                                  a locked DLL */
+       uint32_t tXS_ABORT;     /* SRX to commands not requiring a locked DLL in Self Refresh ABORT */
+       uint32_t tXSDLL;        /* Exit Self Refresh to tXSDLL commands requiring a locked DLL */
+       uint32_t tXMP;          /* Exit MPSM to commands not requiring a locked DLL */
+       uint32_t tXMPDLL;       /* Exit MPSM to commands requiring a locked DLL */
        uint32_t tCKMPE;        /* Valid clock requirement after MPSM entry */
 
        uint32_t CL;            /* CAS Latency */
        uint32_t CWL;           /* CAS Write Latency */
-       uint32_t WCL;           /* Write Command Latency when CRC and DM
-                                  are both enabled */
+       uint32_t WCL;           /* Write Command Latency when CRC and DM are both enabled */
        uint32_t PL;            /* C/A Parity Latency */
        uint32_t AL;            /* Additive Latency */
        uint32_t RL;            /* Read Latency */
@@ -99,7 +85,7 @@ struct ddr_configuration {
        uint32_t RTT_NOM;       /* NOM pullup impedance */
        uint32_t RTT_WR;        /* WR pullup impedance */
        uint32_t DIC;           /* output driver impedance */
-#if defined(BAIKAL_DUAL_CHANNEL_MODE)
+#ifdef BAIKAL_DUAL_CHANNEL_MODE
        uint32_t PHY_HOST_VREF;
        uint32_t PHY_DRAM_VREF;
 #endif
index 9015aaef34008a7961199bd6636095fbdc67cdc6..2d2c2b73f08a8861a74b42bdd8d1bbd716d4248c 100644 (file)
@@ -193,7 +193,7 @@ int ddrc_config_content(struct ctl_content *ddrc,
 
        if (data->single_ddr) {
                /* for single DDR Controller in SoC we have normal address regions */
-               ddrc->SARBASE0_ *= 2; /* region address 2..4 GiB (UMCTL2_SARMINSIZE=256MB) */
+               ddrc->SARBASE0_ *= 2; /* region address 2..4 GiB (UMCTL2_SARMINSIZE = 256 MiB) */
                ddrc->SARSIZE0_ = (ddrc->SARSIZE0_ + 1) * 2 - 1; /* region size 2 GiB */
                ddrc->SARBASE1_ *= 2; /* region address 34..64 GiB */
                ddrc->SARSIZE1_ = (ddrc->SARSIZE1_ + 1) * 2 - 1; /* region size 30 GiB */
@@ -344,7 +344,7 @@ int ddrc_config_content(struct ctl_content *ddrc,
        ddrc->DFITMG0_ |=  GENMASK(5, 0) & (data->WL - 2 + !!data->registered_dimm);
 
        ddrc->DFITMG0_ &= ~GENMASK(28, 24);
-       ddrc->DFITMG0_ |=  GENMASK(28, 24) & ((2 + 2 + !!data->registered_dimm) << 24); /* see PHY DataBook, Table7-1 (p.648) + 2*DWC_PIPE_DFI2PHY */
+       ddrc->DFITMG0_ |=  GENMASK(28, 24) & ((2 + 2 + !!data->registered_dimm) << 24); /* see PHY DataBook, Table7-1 (p.648) + 2 * DWC_PIPE_DFI2PHY */
 #if DDR_CRC_ENABLE
        ddrc->DRAMTMG0_ &= ~GENMASK(30, 24);
        ddrc->DRAMTMG0_ |=  GENMASK(30, 24) & (((data->WL + 4 + data->tWR_CRC_DM) / 2) << 24); /* WL + BL/2 + WR_CRC_DM (this formula is valid for CRC&DM on) */
@@ -357,7 +357,7 @@ int ddrc_config_content(struct ctl_content *ddrc,
        ddrc->DRAMTMG0_ &= ~GENMASK(5, 0);
        ddrc->DRAMTMG0_ |=  GENMASK(5, 0) & (data->tRAS / 2);
        ddrc->DRAMTMG0_ &= ~GENMASK(14, 8);
-       ddrc->DRAMTMG0_ |=  GENMASK(14, 8) & (((data->tRASmax / 1024 - 1) / 2) << 8); /* (tRAS(max)/1024)-1)/2 */
+       ddrc->DRAMTMG0_ |=  GENMASK(14, 8) & (((data->tRASmax / 1024 - 1) / 2) << 8); /* (tRAS(max) / 1024) - 1) / 2 */
        ddrc->DRAMTMG1_ &= ~GENMASK(20, 16);
        ddrc->DRAMTMG1_ |=  GENMASK(20, 16) & (DIV_ROUND_UP_2EVAL(data->tXP + data->PL, 2) << 16);
        ddrc->DRAMTMG1_ &= ~GENMASK(13, 8);
@@ -380,15 +380,15 @@ int ddrc_config_content(struct ctl_content *ddrc,
        ddrc->DRAMTMG2_ |=  GENMASK(13, 8) & (DIV_ROUND_UP_2EVAL(data->RL + 4 + 1 + 1 - data->WL + rsl, 2) << 8); /* DDR4: RL + BL/2 + 1 + WR_PREAMBLE - WL */
 #if DDR_CRC_ENABLE
        ddrc->DRAMTMG2_ &= ~GENMASK(5, 0);
-       ddrc->DRAMTMG2_ |=  GENMASK(5, 0) & DIV_ROUND_UP_2EVAL(data->CWL + data->PL + 4 + data->tWTR_L_CRC_DM, 2); /* DDR4: CWL + PL + BL/2 + tWTR_L_CRC_DM(tWTR_L+5) (this formula is valid for CRC&DM on) */
+       ddrc->DRAMTMG2_ |=  GENMASK(5, 0) & DIV_ROUND_UP_2EVAL(data->CWL + data->PL + 4 + data->tWTR_L_CRC_DM, 2); /* DDR4: CWL + PL + BL / 2 + tWTR_L_CRC_DM(tWTR_L + 5) (this formula is valid for CRC&DM on) */
 #else
        ddrc->DRAMTMG2_ &= ~GENMASK(5, 0);
        ddrc->DRAMTMG2_ |=  GENMASK(5, 0) & DIV_ROUND_UP_2EVAL(data->CWL + data->PL + 4 + data->tWTR_L, 2); /* DDR4: CWL + PL + BL/2 + tWTR_L */
 #endif
        ddrc->DRAMTMG3_ &= ~GENMASK(17, 12);
-       ddrc->DRAMTMG3_ |=  GENMASK(17, 12) & (DIV_ROUND_UP_2EVAL(data->tMOD + data->PL, 2) << 12); /* tMRD. If C/A parity for DDR4 is used, set to tMRD_PAR(tMOD+PL) instead. */
+       ddrc->DRAMTMG3_ |=  GENMASK(17, 12) & (DIV_ROUND_UP_2EVAL(data->tMOD + data->PL, 2) << 12); /* tMRD. If C/A parity for DDR4 is used, set to tMRD_PAR(tMOD + PL) instead. */
        ddrc->DRAMTMG3_ &= ~GENMASK(9, 0);
-       ddrc->DRAMTMG3_ |=  GENMASK(9, 0) & DIV_ROUND_UP_2EVAL(data->tMOD + data->PL + !!data->registered_dimm, 2); /* tMOD. If C/A parity for DDR4 is used, set to tMOD_PAR(tMOD+PL) instead. */
+       ddrc->DRAMTMG3_ |=  GENMASK(9, 0) & DIV_ROUND_UP_2EVAL(data->tMOD + data->PL + !!data->registered_dimm, 2); /* tMOD. If C/A parity for DDR4 is used, set to tMOD_PAR(tMOD + PL) instead. */
        ddrc->DRAMTMG4_ &= ~GENMASK(28, 24);
        ddrc->DRAMTMG4_ |=  GENMASK(28, 24) & (((data->tRCD > data->AL) ? DIV_ROUND_UP_2EVAL(data->tRCD - data->AL, 2) : 1) << 24); /* tRCD - AL */
        ddrc->DRAMTMG4_ &= ~GENMASK(19, 16);
@@ -402,11 +402,13 @@ int ddrc_config_content(struct ctl_content *ddrc,
        ddrc->DRAMTMG5_ &= ~GENMASK(19, 16);
        ddrc->DRAMTMG5_ |=  GENMASK(19, 16) & (DIV_ROUND_UP_2EVAL(CLOCK_NS(10) + data->PL, 2) << 16); /* DDR4: max (10 ns, 5 tCK) (+ PL(parity latency)(*)) */
        /* NOTICE: Only if CRCPARCTL1_ bit<12> = 0, this register should be increased by PL.
-        * Note: val=9, but S_ Hudchenko example have val=6 */
+        * Note: val=9, but S_ Hudchenko example have val=6
+        */
        ddrc->DRAMTMG5_ &= ~GENMASK(13, 8);
        ddrc->DRAMTMG5_ |=  GENMASK(13, 8) & (DIV_ROUND_UP_2EVAL(data->tCKE + 1 + data->PL, 2) << 8); /* DDR4: tCKE + 1 (+ PL(parity latency)(*)) */
        /* NOTICE: Only if CRCPARCTL1_ bit<12> = 0, this register should be increased by PL.
-        * Note: val=6, but S_Hudchenko example have val=4 */
+        * Note: val=6, but S_Hudchenko example have val=4
+        */
        ddrc->DRAMTMG5_ &= ~GENMASK(4, 0);
        ddrc->DRAMTMG5_ |=  GENMASK(4, 0) & DIV_ROUND_UP_2EVAL(data->tCKE, 2);
        ddrc->DRAMTMG8_ &= ~GENMASK(30, 24);
@@ -537,18 +539,21 @@ int phy_config_content(struct phy_content *phy,
                /* RC03 Command_Address and CS Driver Control */
                uint8_t ca_drv = (data->registered_ca_stren >> 4) & 0x3;
                uint8_t cs_drv = (data->registered_ca_stren >> 6) & 0x3;
+
                phy->RDIMMGCR0_ &= ~GENMASK(15, 12);
                phy->RDIMMGCR0_ |=  GENMASK(15, 12) & (((cs_drv << 2) | ca_drv) << 12);
 
                /* RC04 ODT and CKE Driver Control */
                uint8_t cke_drv = (data->registered_ca_stren) & 0x3;
                uint8_t odt_drv = (data->registered_ca_stren >> 2) & 0x3;
+
                phy->RDIMMGCR0_ &= ~GENMASK(19, 16);
                phy->RDIMMGCR0_ |=  GENMASK(19, 16) & (((cke_drv << 2) | odt_drv) << 16);
 
                /* RC05 Clock Driver Control */
                uint8_t y0y2_drv = (data->registered_clk_stren) & 0x3;
                uint8_t y1y3_drv = (data->registered_clk_stren >> 2) & 0x3;
+
                phy->RDIMMGCR0_ &= ~GENMASK(23, 20);
                phy->RDIMMGCR0_ |=  GENMASK(23, 20) & (((y0y2_drv << 2) | y1y3_drv) << 20);
 
@@ -650,7 +655,6 @@ int phy_config_content(struct phy_content *phy,
 #else
        phy->MR6_ = (data->tCCD_L - 4) << 10;
 #endif
-
        /* data training configuration */
        phy->DTCR0_ |= 1 << 6; /* use MPR for DQS training (DDR4) */
        phy->DTCR0_ &= ~GENMASK(31, 28);
index f6d12355250fbb0b91295a04349537926be2dda3..38215793c23c1b15e6ac7152cf5d5c11c79e7899 100644 (file)
@@ -114,7 +114,7 @@ struct phy_content {
        uint32_t DTCR1_;
        uint32_t DSGCR_;
        uint32_t ZQCR_;
-       unsigned dbus_half;
+       unsigned int dbus_half;
 };
 
 void phy_set_default_vals(struct phy_content *phy);
index 9fa7c8d8f174a29857409e9a348f03004a77f728..4f3f04e0c60bd1ca9b61cad0676f5e866b664f19 100644 (file)
@@ -1,11 +1,12 @@
 /*
- * Copyright (c) 2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2021-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
 #include <stdint.h>
 
+#include <baikal_def.h>
 #include "ddr_main.h"
 
 enum {
@@ -45,7 +46,7 @@ struct odt_settings {
        uint32_t rtt_park;
 };
 
-#if defined(BAIKAL_DBM10) || defined(BAIKAL_DBM20)
+#if defined(BAIKAL_DBM10) || defined(BAIKAL_DBM20) || defined(BAIKAL_QEMU)
 static const struct odt_settings dram_odt_set_0[] = {
        { 0, 1, 2, 4 }, /* 1-rank (default) */
        { 0, 1, 2, 4 }, /* 2-rank (default) */
@@ -107,12 +108,12 @@ static const struct odt_settings dram_odt_set_1[] = {
 };
 #endif
 
-int ddr_odt_configuration(const unsigned port,
+int ddr_odt_configuration(const unsigned int port,
                           const uint16_t crc_val,
                           struct ddr_configuration *const data)
 {
-       unsigned odt_set;
-#if defined(BAIKAL_DUAL_CHANNEL_MODE)
+       unsigned int odt_set;
+#ifdef BAIKAL_DUAL_CHANNEL_MODE
        if (data->dimms == 2) {
                goto dual_channel;
        }
@@ -143,20 +144,20 @@ int ddr_odt_configuration(const unsigned port,
                odt_set = ODT_SET_1RANK;
        }
 
-       if (!port) {
-               data->RTT_PARK   = dram_odt_set_0[odt_set].rtt_park;
-               data->RTT_NOM    = dram_odt_set_0[odt_set].rtt_nom;
-               data->RTT_WR     = dram_odt_set_0[odt_set].rtt_wr;
-               data->DIC        = dram_odt_set_0[odt_set].dic;
+       if (port == 0) {
+               data->RTT_PARK  = dram_odt_set_0[odt_set].rtt_park;
+               data->RTT_NOM   = dram_odt_set_0[odt_set].rtt_nom;
+               data->RTT_WR    = dram_odt_set_0[odt_set].rtt_wr;
+               data->DIC       = dram_odt_set_0[odt_set].dic;
        } else {
-               data->RTT_PARK   = dram_odt_set_1[odt_set].rtt_park;
-               data->RTT_NOM    = dram_odt_set_1[odt_set].rtt_nom;
-               data->RTT_WR     = dram_odt_set_1[odt_set].rtt_wr;
-               data->DIC        = dram_odt_set_1[odt_set].dic;
+               data->RTT_PARK  = dram_odt_set_1[odt_set].rtt_park;
+               data->RTT_NOM   = dram_odt_set_1[odt_set].rtt_nom;
+               data->RTT_WR    = dram_odt_set_1[odt_set].rtt_wr;
+               data->DIC       = dram_odt_set_1[odt_set].dic;
        }
 
        return 0;
-#if defined(BAIKAL_DUAL_CHANNEL_MODE)
+#ifdef BAIKAL_DUAL_CHANNEL_MODE
 dual_channel:
        /***********************************************************************
         * Due to high speed of the DDR4 Standard configuring controllers to
@@ -198,6 +199,7 @@ dual_channel:
                        break;
                }
        }
+
        if (port == 1) {
                switch (crc_val) {
                case 0xd8f1: /* MTA9ASF2G72AZ */
index 658eecfc4696504f10c1581df7549f1fc9f3608d..c500ecde26aafba5b62836fd2df1eb1ca6338651 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2021-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -44,28 +44,26 @@ static const uint8_t spd_static[] = {
 };
 #endif
 
-void* ddr_read_spd(const unsigned dimm_idx)
+void *ddr_read_spd(const unsigned int dimm_idx)
 {
        extern struct spd_container spd_content;
        uint8_t *p = (uint8_t *)&spd_content.content[dimm_idx];
 #ifndef BAIKAL_DIMM_SPD_STATIC
-       unsigned page;
+       unsigned int page;
        int rxsize = 0;
        const uint8_t spd_bus_addrs[] = {DIMM0_SPD_ADDR, DIMM1_SPD_ADDR};
        uint8_t startaddr = 0;
 #ifdef BAIKAL_DUAL_CHANNEL_MODE
        uint8_t channel_bytes[SPD_PAGE_SIZE / 2];
 #endif
-
        assert(dimm_idx < ARRAY_SIZE(spd_bus_addrs));
 
        for (page = 0; page < SPD_FULL_SIZE / SPD_PAGE_SIZE; ++page) {
                int rxpsize;
-               BAIKAL_SPD_BUS_HANDLER(BAIKAL_DIMM_SPD_DEV, SPD_SPA0 + page,
-                          &startaddr, sizeof(startaddr), NULL, 0);
 
-               rxpsize = BAIKAL_SPD_BUS_HANDLER(BAIKAL_DIMM_SPD_DEV, spd_bus_addrs[dimm_idx],
-                                    &startaddr, sizeof(startaddr), p + rxsize, SPD_PAGE_SIZE);
+               BAIKAL_SPD_TXRX(SPD_SPA0 + page, &startaddr, sizeof(startaddr), NULL, 0);
+               rxpsize = BAIKAL_SPD_TXRX(spd_bus_addrs[dimm_idx], &startaddr, sizeof(startaddr),
+                                         p + rxsize, SPD_PAGE_SIZE);
                if (rxpsize != SPD_PAGE_SIZE) {
                        break;
                }
@@ -73,7 +71,7 @@ void* ddr_read_spd(const unsigned dimm_idx)
                rxsize += rxpsize;
        }
 
-       BAIKAL_SPD_BUS_HANDLER(BAIKAL_DIMM_SPD_DEV, SPD_SPA0, &startaddr, sizeof(startaddr), NULL, 0);
+       BAIKAL_SPD_TXRX(SPD_SPA0, &startaddr, sizeof(startaddr), NULL, 0);
 
        if (rxsize != SPD_FULL_SIZE) {
                return NULL;
@@ -86,36 +84,32 @@ void* ddr_read_spd(const unsigned dimm_idx)
                ERROR("DIMM%u: SPD CRC checksum fail\n", dimm_idx);
                return NULL;
        }
-
 #ifdef BAIKAL_DUAL_CHANNEL_MODE
-       /*
-        * Check if 2 DIMMs are inserted into the slots related to a single port
-        */
-       rxsize = BAIKAL_SPD_BUS_HANDLER(BAIKAL_DIMM_SPD_DEV, spd_bus_addrs[dimm_idx] + 1,
-                            &startaddr, sizeof(startaddr), &channel_bytes, SPD_PAGE_SIZE / 2);
+       /* Check if 2 DIMMs are inserted into the slots related to a single port */
+       rxsize = BAIKAL_SPD_TXRX(spd_bus_addrs[dimm_idx] + 1, &startaddr, sizeof(startaddr),
+                                &channel_bytes, SPD_PAGE_SIZE / 2);
        if (rxsize != SPD_PAGE_SIZE / 2) {
                goto _exit;
        }
 
        if ((channel_bytes[126] != p[126]) || (channel_bytes[127] != p[127])) {
-               ERROR("DDR PORT%d: can't work in 2-channel mode with DIMMs that differ\n", dimm_idx);
+               ERROR("Can't work in 2-channel mode with DIMMs that differ\n");
                return NULL;
        }
 
        spd_content.dual_channel[dimm_idx] = 'y';
 
-       /*
-        * Read serial and part numbers from second DIMM
-        */
-       BAIKAL_SPD_BUS_HANDLER(BAIKAL_DIMM_SPD_DEV, SPD_SPA0 + 1, &startaddr, sizeof(startaddr), NULL, 0);
+       /* Read serial and part numbers from the second DIMM */
+       BAIKAL_SPD_TXRX(SPD_SPA0 + 1, &startaddr, sizeof(startaddr), NULL, 0);
        startaddr = 69;
-       rxsize = BAIKAL_SPD_BUS_HANDLER(BAIKAL_DIMM_SPD_DEV, spd_bus_addrs[dimm_idx] + 1,
-                            &startaddr, sizeof(startaddr), &channel_bytes, 24);
+       rxsize = BAIKAL_SPD_TXRX(spd_bus_addrs[dimm_idx] + 1, &startaddr, sizeof(startaddr),
+                                &channel_bytes, 24);
        if (rxsize == 24) {
                spd_content.extra[dimm_idx].serial_number = *(uint32_t *)channel_bytes;
                memcpy(spd_content.extra[dimm_idx].part_number, &channel_bytes[4], 20);
        }
-       BAIKAL_SPD_BUS_HANDLER(BAIKAL_DIMM_SPD_DEV, SPD_SPA0, &startaddr, sizeof(startaddr), NULL, 0);
+
+       BAIKAL_SPD_TXRX(SPD_SPA0, &startaddr, sizeof(startaddr), NULL, 0);
 _exit:
 #endif
        return p;
index 3a63ee3ee294675ca8f99355ffeae1383e290962..37f73178de625110f13f1c6d24c84cf8273b8af6 100644 (file)
@@ -83,8 +83,7 @@ struct ddr4_spd_eeprom {
                        uint8_t mod_thickness;
                        /* 130 (Unbuffered) Reference Raw Card Used */
                        uint8_t ref_raw_card;
-                       /* 131 (Unbuffered) Address Mapping from
-                             Edge Connector to DRAM */
+                       /* 131 (Unbuffered) Address Mapping from Edge Connector to DRAM */
                        uint8_t addr_mapping;
                        /* 132~253 (Unbuffered) Reserved */
                        uint8_t res_132[254 - 132];
@@ -252,6 +251,6 @@ struct spd_container {
 #define DDR4_SPD_MODULETYPE_16B_SO_DIMM                0x0c
 #define DDR4_SPD_MODULETYPE_32B_SO_DIMM                0x0d
 
-void* ddr_read_spd(const unsigned dimm_idx);
+void *ddr_read_spd(const unsigned int dimm_idx);
 
 #endif /* DDR_SPD_H */
diff --git a/plat/baikal/bm1000/drivers/mbm_bmc.c b/plat/baikal/bm1000/drivers/mbm_bmc.c
new file mode 100644 (file)
index 0000000..b04f743
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2023, Baikal Electronics, JSC. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdint.h>
+
+#include <common/debug.h>
+#include <drivers/delay_timer.h>
+
+#include <baikal_def.h>
+#include <dw_i2c.h>
+#include <mbm_bmc.h>
+
+#define MBM_BMC_I2C_BUS                        MMAVLSP_I2C1_BASE
+#define MBM_BMC_I2C_ADDR               0x08
+#define MBM_BMC_REG_PWROFF_RQ          0x05
+#define MBM_BMC_REG_PWROFF_RQ_OFF      0x01
+#define MBM_BMC_REG_PWROFF_RQ_RESET    0x02
+
+void mbm_bmc_pwr_off(void)
+{
+       const uint8_t offreq[] = {
+               MBM_BMC_REG_PWROFF_RQ,
+               MBM_BMC_REG_PWROFF_RQ_OFF
+       };
+
+       INFO("BMC: power off\n");
+       i2c_txrx(MBM_BMC_I2C_BUS, BAIKAL_I2C_ICLK_FREQ,
+                MBM_BMC_I2C_ADDR, &offreq, sizeof(offreq), NULL, 0);
+
+       mdelay(4000);
+}
+
+void mbm_bmc_pwr_rst(void)
+{
+       const uint8_t rstreq[] = {
+               MBM_BMC_REG_PWROFF_RQ,
+               MBM_BMC_REG_PWROFF_RQ_RESET
+       };
+
+       INFO("BMC: power reset\n");
+       i2c_txrx(MBM_BMC_I2C_BUS, BAIKAL_I2C_ICLK_FREQ,
+                MBM_BMC_I2C_ADDR, &rstreq, sizeof(rstreq), NULL, 0);
+
+       mdelay(4000);
+}
diff --git a/plat/baikal/bm1000/drivers/mbm_bmc.h b/plat/baikal/bm1000/drivers/mbm_bmc.h
new file mode 100644 (file)
index 0000000..8b7fa6d
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+ * Copyright (c) 2023, Baikal Electronics, JSC. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef MBM_BMC_H
+#define MBM_BMC_H
+
+void mbm_bmc_pwr_off(void);
+void mbm_bmc_pwr_rst(void);
+
+#endif /* MBM_BMC_H */
index caedecc05a3e2299c5aea8d5577ff0e3464cca7d..e79a0dded9842282870d468c207b9829aff52555 100644 (file)
@@ -14,7 +14,7 @@ int fdt_memory_node_read(uint64_t region_descs[3][2])
 {
        void *fdt = (void *)(uintptr_t)BAIKAL_SEC_DTB_BASE;
        int memoff;
-       unsigned region;
+       unsigned int region;
        const uint32_t *prop;
        int proplen;
        int ret;
index 92ab7b51f1f6354524b507f97d45cb72c6bc036b..8a8e53e8870ee481a50fee148799c5197b658411 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2021-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 #define BAIKAL_BOOT_SPI_SUBSECTOR      (4 * 1024)
 #define BAIKAL_BOOT_SPI_SIZE           (32 * 1024 * 1024)
 
+#define BAIKAL_I2C_ICLK_FREQ           100000000
+#define BAIKAL_SMBUS_ICLK_FREQ         50000000
 #define SYS_COUNTER_FREQ_IN_TICKS      ULL(50000000)
 
 #if defined(BAIKAL_DBM10)
 # define BAIKAL_DDR_CUSTOM_CLOCK_FREQ  800
-# define BAIKAL_SPD_BUS_HANDLER                i2c_txrx
-# define BAIKAL_DIMM_SPD_DEV           MMAVLSP_I2C2_BASE
+# define BAIKAL_SPD_TXRX(targetaddr, txbuf, txbufsize, rxbuf, rxbufsize) \
+       i2c_txrx(MMAVLSP_I2C2_BASE, BAIKAL_I2C_ICLK_FREQ,                \
+                targetaddr, txbuf, txbufsize, rxbuf, rxbufsize)
 #elif defined(BAIKAL_DBM20)
+# define BAIKAL_DUAL_CHANNEL_MODE
 # define BAIKAL_DDR_CUSTOM_CLOCK_FREQ  1200
-# define BAIKAL_SPD_BUS_HANDLER                smbus_txrx
-# define BAIKAL_DIMM_SPD_DEV           MMAVLSP_SMBUS1_BASE
+# define BAIKAL_SPD_TXRX(targetaddr, txbuf, txbufsize, rxbuf, rxbufsize) \
+       smbus_txrx(MMAVLSP_SMBUS1_BASE,                                  \
+                  BAIKAL_SMBUS_ICLK_FREQ, SMBUS_SHT_100KHZ, 100000,     \
+                  targetaddr, txbuf, txbufsize, rxbuf, rxbufsize)
 #elif defined(BAIKAL_MBM10) || defined(BAIKAL_MBM20)
 # define BAIKAL_DDR_CUSTOM_CLOCK_FREQ  1200
-# define BAIKAL_SPD_BUS_HANDLER                smbus_txrx
-# define BAIKAL_DIMM_SPD_DEV           MMAVLSP_SMBUS1_BASE
+# define BAIKAL_SPD_TXRX(targetaddr, txbuf, txbufsize, rxbuf, rxbufsize) \
+       smbus_txrx(MMAVLSP_SMBUS1_BASE,                                  \
+                  BAIKAL_SMBUS_ICLK_FREQ, SMBUS_SHT_100KHZ, 100000,     \
+                  targetaddr, txbuf, txbufsize, rxbuf, rxbufsize)
 # define BAIKAL_LVDS_CLKEN_GPIO_PIN    17
 # define BAIKAL_HDMI_CLKEN_GPIO_PIN    18
 #elif defined(BAIKAL_QEMU)
+ #define BAIKAL_DIMM_SPD_STATIC
 # undef  SYS_COUNTER_FREQ_IN_TICKS
 # define SYS_COUNTER_FREQ_IN_TICKS     ULL((1000 * 1000 * 1000) / 16)
 #endif
index ce35ab88db0df7552037d86a7bff572fd7d43fe6..e632c49ae51a1491e8143508fde300fdb4456117 100644 (file)
@@ -49,7 +49,7 @@
 #define MMAVLSP_CMU0_CLKCHCTL_TIMER2           (MMAVLSP_CMU0_BASE + CMU_CLKCHCTL_OFFSET(9))
 #define MMAVLSP_CMU0_CLKCHCTL_TIMER3           (MMAVLSP_CMU0_BASE + CMU_CLKCHCTL_OFFSET(10))
 #define MMAVLSP_CMU0_CLKCHCTL_TIMER4           (MMAVLSP_CMU0_BASE + CMU_CLKCHCTL_OFFSET(11))
-#define MMAVLSP_CMU0_CLKCHCTL_DMAC             (MMAVLSP_CMU0_BASE + CMU_CLKCHCTL_OFFSET(12))
+#define MMAVLSP_CMU0_CLKCHCTL_DMACLSP          (MMAVLSP_CMU0_BASE + CMU_CLKCHCTL_OFFSET(12))
 #define MMAVLSP_CMU0_CLKCHCTL_SMBUS1           (MMAVLSP_CMU0_BASE + CMU_CLKCHCTL_OFFSET(13))
 #define MMAVLSP_CMU0_CLKCHCTL_SMBUS2           (MMAVLSP_CMU0_BASE + CMU_CLKCHCTL_OFFSET(14))
 #define MMAVLSP_CMU0_CLKCHCTL_HDA_SYS          (MMAVLSP_CMU0_BASE + CMU_CLKCHCTL_OFFSET(15))
@@ -73,7 +73,7 @@
 #define MMAVLSP_GPR_MMRST1_NIC_CFG_M_RST       BIT(1)
 #define MMAVLSP_GPR_MMRST1_NIC_S_RST           BIT(2)
 #define MMAVLSP_GPR_MMRST1_NIC_M_RST           BIT(3)
-#define MMAVLSP_GPR_MMRST1_DMAC_RST            BIT(6)
+#define MMAVLSP_GPR_MMRST1_DMACLSP_RST         BIT(6)
 #define MMAVLSP_GPR_MMRST1_SMMU_RST            BIT(7)
 #define MMAVLSP_GPR_MMRST1_GPIO_RST            BIT(10)
 #define MMAVLSP_GPR_MMRST1_UART1_RST           BIT(11)
 #define MMAVLSP_SMBUS1_BASE                    (MMAVLSP_BASE + 0x270000)
 #define MMAVLSP_SMBUS2_BASE                    (MMAVLSP_BASE + 0x280000)
 #define MMAVLSP_VDU_BASE                       (MMAVLSP_BASE + 0x2d0000)
+#define MMAVLSP_EMMC_BASE                      (MMAVLSP_BASE + 0x2e0000)
 
 #define MMCA57_0_BASE                          U(0x28000000)
 #define MMCA57_0_CMU0_BASE                     (MMCA57_0_BASE)
 #define MMDDR0_NIC_CFG_GPV_REGIONSEC_CTRLR     (MMDDR0_NIC_CFG_GPV_BASE + 0x08)
 #define MMDDR0_NIC_CFG_GPV_REGIONSEC_PHY       (MMDDR0_NIC_CFG_GPV_BASE + 0x0c)
 #define MMDDR0_CTRL_BASE                       (MMDDR0_BASE + 0x200000)
+#define MMDDR0_PHY_BASE                                (MMDDR0_BASE + 0x210000)
 
 #define MMDDR1_BASE                            U(0x22000000)
 #define MMDDR1_CMU0_BASE                       (MMDDR1_BASE)
 #define MMDDR1_NIC_CFG_GPV_REGIONSEC_CTRLR     (MMDDR1_NIC_CFG_GPV_BASE + 0x08)
 #define MMDDR1_NIC_CFG_GPV_REGIONSEC_PHY       (MMDDR1_NIC_CFG_GPV_BASE + 0x0c)
 #define MMDDR1_CTRL_BASE                       (MMDDR1_BASE + 0x200000)
+#define MMDDR1_PHY_BASE                                (MMDDR1_BASE + 0x210000)
 
 #define MMMALI_BASE                            U(0x2a000000)
 #define MMMALI_CMU0_BASE                       (MMMALI_BASE)
 #define MMUSB_CMU0_CLKCHCTL_USB3_SOFITP                (MMUSB_CMU0_BASE + CMU_CLKCHCTL_OFFSET(12))
 #define MMUSB_CMU0_CLKCHCTL_USB3_SUSPEND       (MMUSB_CMU0_BASE + CMU_CLKCHCTL_OFFSET(13))
 #define MMUSB_CMU0_CLKCHCTL_SMMU               (MMUSB_CMU0_BASE + CMU_CLKCHCTL_OFFSET(14))
-#define MMUSB_CMU0_CLKCHCTL_DMAC               (MMUSB_CMU0_BASE + CMU_CLKCHCTL_OFFSET(15))
+#define MMUSB_CMU0_CLKCHCTL_DMACM2M            (MMUSB_CMU0_BASE + CMU_CLKCHCTL_OFFSET(15))
 #define MMUSB_CMU0_CLKCHCTL_GIC                        (MMUSB_CMU0_BASE + CMU_CLKCHCTL_OFFSET(16))
 #define MMUSB_GPR_BASE                         (MMUSB_BASE + 0x50000)
 #define MMUSB_GPR_MMRST                                (MMUSB_GPR_BASE + 0x00)
 #define MMUSB_NIC_CFG_GPV_REGIONSEC_SATA1      (MMUSB_NIC_CFG_GPV_BASE + 0x14)
 #define MMUSB_NIC_CFG_GPV_REGIONSEC_SMMU       (MMUSB_NIC_CFG_GPV_BASE + 0x18)
 #define MMUSB_NIC_CFG_GPV_REGIONSEC_GIC                (MMUSB_NIC_CFG_GPV_BASE + 0x1c)
-#define MMUSB_NIC_CFG_GPV_REGIONSEC_DMACS      (MMUSB_NIC_CFG_GPV_BASE + 0x20)
-#define MMUSB_NIC_CFG_GPV_REGIONSEC_DMACN      (MMUSB_NIC_CFG_GPV_BASE + 0x24)
+#define MMUSB_NIC_CFG_GPV_REGIONSEC_DMACM2MS   (MMUSB_NIC_CFG_GPV_BASE + 0x20)
+#define MMUSB_NIC_CFG_GPV_REGIONSEC_DMACM2MN   (MMUSB_NIC_CFG_GPV_BASE + 0x24)
 #define MMUSB_USB2_BASE                                (MMUSB_BASE + 0x400000)
 #define MMUSB_USB3_BASE                                (MMUSB_BASE + 0x500000)
 #define MMUSB_SATA0_BASE                       (MMUSB_BASE + 0x600000)
 /* Input 25 MHz, but recommended freq is 1.19 MHz => 21 is div */
 #define PVT_CLKCH_DIV                          21
 
+#define MMAVLSP_PLL_FREQ                       ULL(1200000000)
+
 #endif /* BM1000_DEF_H */
index c2a6ac9188c30c21280a4dda05d485768ba7cda6..4b77e7b25839b52d39061946dc0c32a4c04ebca5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2018-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -91,6 +91,7 @@
 #define BAIKAL_SEC_DTB_BASE            (SEC_DRAM_BASE + BL1_XLAT_SIZE)
 #define BAIKAL_NS_DTB_BASE             NS_DRAM0_BASE
 #define BAIKAL_NS_IMAGE_OFFSET         NS_DRAM1_BASE
+#define BAIKAL_NS_IMAGE_MAX_SIZE       NS_DRAM1_SIZE
 
 /*
  * BL1 specific defines.
 #define DEV_QOS_OVERRIDE_EN            BIT(2)
 
 /* Parts of the boot image */
+#define BAIKAL_BOOT_OFFSET             0
+#define BAIKAL_BOOT_MAX_SIZE           (8 * 1024 * 1024)
+
 #define BAIKAL_SCP_MAX_SIZE            (512 * 1024)
 #define BAIKAL_BL1_MAX_SIZE            (256 * 1024)
 #define BAIKAL_DTB_MAX_SIZE            (256 * 1024)
 #define BAIKAL_VAR_MAX_SIZE            (768 * 1024)
-#define BAIKAL_FIP_MAX_SIZE            (BAIKAL_FAT_OFFSET - BAIKAL_BL1_MAX_SIZE - BAIKAL_DTB_MAX_SIZE - BAIKAL_VAR_MAX_SIZE)
+#define BAIKAL_FIP_MAX_SIZE            (BAIKAL_BOOT_MAX_SIZE - BAIKAL_FIP_OFFSET)
 
 #define BAIKAL_BL1_OFFSET              0
 #define BAIKAL_DTB_OFFSET              (BAIKAL_BL1_OFFSET + BAIKAL_BL1_MAX_SIZE)
 #define BAIKAL_VAR_OFFSET              (BAIKAL_DTB_OFFSET + BAIKAL_DTB_MAX_SIZE)
 #define BAIKAL_FIP_OFFSET              (BAIKAL_VAR_OFFSET + BAIKAL_VAR_MAX_SIZE)
-#define BAIKAL_FAT_OFFSET              (8 * 1024 * 1024)
+#define BAIKAL_FAT_OFFSET              (BAIKAL_FIP_OFFSET + BAIKAL_FIP_MAX_SIZE)
+
+#define BAIKAL_SD_FIRMWARE
+#define BAIKAL_SD_FIRMWARE_DEBUG
+#define BAIKAL_SD_FIRMWARE_OFFSET      (2048 * 512) /* dev/mmcblk0p1: LBA 2048 */
 
 #endif /* PLATFORM_DEF_H */
index 5594c5447fca99eb832c186ccb0ab1ff313a0191..27738bc434d0b6a5e28be38dfd642275313148b7 100644 (file)
@@ -7,6 +7,8 @@
 include lib/libfdt/libfdt.mk
 include lib/xlat_tables_v2/xlat_tables.mk
 
+$(eval $(call add_define_val,SDK_VERSION,$(SDK_VERSION)))
+
 USE_COHERENT_MEM       :=      1
 
 PLAT_INCLUDES          :=      -Iinclude/plat/arm/common/aarch64       \
@@ -15,14 +17,20 @@ PLAT_INCLUDES               :=      -Iinclude/plat/arm/common/aarch64       \
                                -Iplat/baikal/bm1000/include            \
                                -Iplat/baikal/common/include
 
-PLAT_BL_COMMON_SOURCES :=      drivers/ti/uart/aarch64/16550_console.S         \
+PLAT_BL_COMMON_SOURCES :=      drivers/mmc/mmc.c                               \
+                               drivers/ti/uart/aarch64/16550_console.S         \
                                plat/baikal/bm1000/aarch64/bm1000_helpers.S     \
                                plat/baikal/bm1000/bm1000_common.c              \
+                               plat/baikal/bm1000/bm1000_font.c                \
+                               plat/baikal/bm1000/bm1000_mmavlsp.c             \
+                               plat/baikal/bm1000/bm1000_mmca57.c              \
+                               plat/baikal/bm1000/bm1000_mmxgbe.c              \
                                plat/baikal/bm1000/drivers/bm1000_scp.c         \
                                plat/baikal/bm1000/drivers/bm1000_scp_flash.c   \
                                plat/baikal/common/aarch64/baikal_helpers.S     \
                                plat/baikal/common/baikal_bootflash.c           \
                                plat/baikal/common/baikal_console.c             \
+                               plat/baikal/common/baikal_mshc.c                \
                                plat/baikal/common/dw_gpio.c                    \
                                plat/baikal/common/dw_spi_flash.c               \
                                ${XLAT_TABLES_LIB_SRCS}
@@ -35,7 +43,6 @@ ifeq ($(BAIKAL_TARGET),dbm10)
 $(eval $(call add_define,BAIKAL_DBM10))
 else ifeq ($(BAIKAL_TARGET),dbm20)
 $(eval $(call add_define,BAIKAL_DBM20))
-$(eval $(call add_define,BAIKAL_DUAL_CHANNEL_MODE))
 else ifeq ($(BAIKAL_TARGET),mbm10)
 $(eval $(call add_define,BAIKAL_MBM10))
 else ifeq ($(BAIKAL_TARGET),mbm20)
@@ -49,15 +56,12 @@ endif
 BL1_SOURCES            +=      drivers/arm/ccn/ccn.c                           \
                                drivers/delay_timer/delay_timer.c               \
                                drivers/delay_timer/generic_delay_timer.c       \
-                               drivers/io/io_dummy.c                           \
                                drivers/io/io_fip.c                             \
                                drivers/io/io_memmap.c                          \
                                drivers/io/io_storage.c                         \
                                lib/cpus/aarch64/cortex_a57.S                   \
                                plat/arm/common/arm_ccn.c                       \
-                               plat/baikal/bm1000/bm1000_bl1_logo.c            \
                                plat/baikal/bm1000/bm1000_bl1_setup.c           \
-                               plat/baikal/bm1000/bm1000_mmxgbe.c              \
                                plat/baikal/bm1000/bm1000_splash.c              \
                                plat/baikal/bm1000/drivers/bm1000_cmu.c         \
                                plat/baikal/bm1000/drivers/bm1000_smbus.c       \
@@ -65,6 +69,8 @@ BL1_SOURCES           +=      drivers/arm/ccn/ccn.c                           \
                                plat/baikal/bm1000/drivers/ddr/ddr_lcru.c       \
                                plat/baikal/bm1000/drivers/ddr/ddr_main.c       \
                                plat/baikal/bm1000/drivers/ddr/ddr_master.c     \
+                               plat/baikal/bm1000/drivers/ddr/ddr_odt_settings.c\
+                               plat/baikal/bm1000/drivers/ddr/ddr_spd.c        \
                                plat/baikal/common/baikal_bl1_stack.c           \
                                plat/baikal/common/baikal_common.c              \
                                plat/baikal/common/baikal_io_storage.c          \
@@ -72,15 +78,10 @@ BL1_SOURCES         +=      drivers/arm/ccn/ccn.c                           \
                                plat/baikal/common/dw_i2c.c                     \
                                plat/baikal/common/memtest.c                    \
                                plat/baikal/common/ndelay.c
-ifneq ($(BAIKAL_TARGET),qemu-m)
-BL1_SOURCES            +=      plat/baikal/bm1000/drivers/ddr/ddr_odt_settings.c\
-                               plat/baikal/bm1000/drivers/ddr/ddr_spd.c
-endif
 
-override BL1_LINKERFILE        :=      plat/baikal/common/bl1.ld.S
+override BL1_DEFAULT_LINKER_SCRIPT_SOURCE := plat/baikal/common/bl1.ld.S
 
 BL2_SOURCES            +=      common/desc_image_load.c                        \
-                               drivers/io/io_dummy.c                           \
                                drivers/io/io_fip.c                             \
                                drivers/io/io_memmap.c                          \
                                drivers/io/io_storage.c                         \
@@ -109,22 +110,20 @@ BL31_SOURCES              +=      drivers/arm/ccn/ccn.c                           \
                                lib/cpus/aarch64/cortex_a57.S                   \
                                plat/arm/common/arm_ccn.c                       \
                                plat/baikal/bm1000/bm1000_bl31_logo.c           \
-                               plat/baikal/bm1000/bm1000_bl31_sdk_version_logo.c\
                                plat/baikal/bm1000/bm1000_bl31_setup.c          \
-                               plat/baikal/bm1000/bm1000_mmavlsp.c             \
-                               plat/baikal/bm1000/bm1000_mmca57.c              \
                                plat/baikal/bm1000/bm1000_mmcoresight.c         \
                                plat/baikal/bm1000/bm1000_mmmali.c              \
                                plat/baikal/bm1000/bm1000_mmpcie.c              \
                                plat/baikal/bm1000/bm1000_mmusb.c               \
                                plat/baikal/bm1000/bm1000_mmvdec.c              \
-                               plat/baikal/bm1000/bm1000_mmxgbe.c              \
                                plat/baikal/bm1000/bm1000_pm.c                  \
                                plat/baikal/bm1000/bm1000_sip_svc.c             \
                                plat/baikal/bm1000/bm1000_splash.c              \
                                plat/baikal/bm1000/bm1000_topology.c            \
                                plat/baikal/bm1000/drivers/bm1000_cmu.c         \
+                               plat/baikal/bm1000/drivers/bm1000_efuse.c       \
                                plat/baikal/bm1000/drivers/bm1000_smmu.c        \
+                               plat/baikal/bm1000/drivers/mbm_bmc.c            \
                                plat/baikal/bm1000/dt.c                         \
                                plat/baikal/common/baikal_bl31_setup.c          \
                                plat/baikal/common/baikal_common.c              \
@@ -138,6 +137,10 @@ BL31_SOURCES               +=      drivers/arm/ccn/ccn.c                           \
                                ${GICV3_SOURCES}                                \
                                $(LIBFDT_SRCS)
 
+ifeq (${ENABLE_PMF}, 1)
+BL31_SOURCES           +=      lib/pmf/pmf_smc.c
+endif
+
 ifeq ($(notdir $(CC)),armclang)
 TF_CFLAGS_aarch64      +=      -mcpu=cortex-a57
 else ifneq ($(findstring clang,$(notdir $(CC))),)
@@ -178,3 +181,9 @@ ERRATA_A57_829520   :=      0
 ERRATA_A57_833471      :=      0
 ERRATA_A57_859972      :=      1
 ERRATA_A57_1319537     :=      1
+
+BL1_CPPFLAGS += -march=armv8-a+crc
+BL2_CPPFLAGS += -march=armv8-a+crc
+BL2U_CPPFLAGS += -march=armv8-a+crc
+BL31_CPPFLAGS += -march=armv8-a+crc
+BL32_CPPFLAGS += -march=armv8-a+crc
index e8f1c6e15aa914c5d859bb90b288237d4dae24e4..782642b4f20807f2c3cac2cbd8e7b876f84efd7f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -23,7 +23,7 @@
 int dram_init(void);
 
 static uint64_t trusted_mailbox[1 + PLATFORM_CORE_COUNT]
-       __attribute__ ((used, section(".trusted_mailbox")));
+       __section(".trusted_mailbox") __used;
 CASSERT(sizeof(trusted_mailbox) == BAIKAL_TRUSTED_MAILBOX_SIZE,
        assert_trusted_mailbox_size);
 
@@ -48,7 +48,7 @@ void bl1_early_platform_setup(void)
 
        err  = memtest_rand64(BL1_XLAT_BASE, BL1_XLAT_SIZE, sizeof(uint64_t), read_cntpct_el0());
 #if DEBUG
-       err |= memtest_rand8( BL1_XLAT_BASE, BL1_XLAT_SIZE, sizeof(uint8_t), read_cntpct_el0());
+       err |= memtest_rand8(BL1_XLAT_BASE, BL1_XLAT_SIZE, sizeof(uint8_t), read_cntpct_el0());
 #endif
        if (err) {
                ERROR("%s: DRAM error\n", __func__);
index 58076b61a50d2f64e5e9fe750db05b7aa89b8aa8..3eb930ee3f982b34e92b752c2fdd130a75ca8794 100644 (file)
@@ -24,6 +24,7 @@ void bl2_early_platform_setup2(u_register_t arg0,
                               u_register_t arg3)
 {
        meminfo_t *mem_layout = (meminfo_t *)arg1;
+
        baikal_console_boot_init();
 
        /* Setup the BL2 memory layout */
index b4f05f48f4cec50fd03b813aa8438c973f067ae0..da5be554cf7fd0ceb3b8c39dc60337053e0516f8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 #include <baikal_def.h>
 #include <baikal_gicv3.h>
 #include <bs1000_cmu.h>
+#include <bs1000_coresight.h>
 #include <bs1000_dimm_spd.h>
+#include <bs1000_gmac.h>
 #include <bs1000_scp_lcru.h>
 #include <bs1000_usb.h>
-#include <bs1000_coresight.h>
-#include <bs1000_gmac.h>
 
 #include "bs1000_pcie.h"
 
@@ -134,12 +134,12 @@ void bl31_plat_arch_setup(void)
        mmio_write_32(NIC_LSP_CFG_UART_S,       NIC_GPV_REGIONSEC_NONSECURE);
        mmio_write_32(NIC_LSP_CFG_WDT,          NIC_GPV_REGIONSEC_NONSECURE);
 
-       mmio_write_32(DDR0_NIC_CFG_CTRL, NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(DDR1_NIC_CFG_CTRL, NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(DDR2_NIC_CFG_CTRL, NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(DDR3_NIC_CFG_CTRL, NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(DDR4_NIC_CFG_CTRL, NIC_GPV_REGIONSEC_NONSECURE);
-       mmio_write_32(DDR5_NIC_CFG_CTRL, NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(DDR0_NIC_CFG_CTRL,        NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(DDR1_NIC_CFG_CTRL,        NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(DDR2_NIC_CFG_CTRL,        NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(DDR3_NIC_CFG_CTRL,        NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(DDR4_NIC_CFG_CTRL,        NIC_GPV_REGIONSEC_NONSECURE);
+       mmio_write_32(DDR5_NIC_CFG_CTRL,        NIC_GPV_REGIONSEC_NONSECURE);
 
        bs1000_coresight_init();
        pcie_init();
index c6a54ceb0b9e4a1f8d07d0526955d576ac10ecb4..834c98167375cadfad7a0884853668504c2fb660 100644 (file)
@@ -44,8 +44,8 @@ CASSERT(ARRAY_SIZE(ca75_bases) == PLATFORM_CLUSTER_COUNT, assert_ca75_bases_size
 
 void ca75_core_enable(const u_register_t mpidr)
 {
-       const unsigned cluster = (mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK;
-       const unsigned core    = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
+       const unsigned int cluster = (mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK;
+       const unsigned int core    = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
 
        assert(cluster < PLATFORM_CLUSTER_COUNT);
        assert(core < PLATFORM_MAX_CPUS_PER_CLUSTER);
@@ -60,8 +60,8 @@ void ca75_core_enable(const u_register_t mpidr)
 
 void ca75_core_warm_reset(const u_register_t mpidr)
 {
-       const unsigned cluster = (mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK;
-       const unsigned core    = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
+       const unsigned int cluster = (mpidr >> MPIDR_AFF2_SHIFT) & MPIDR_AFFLVL_MASK;
+       const unsigned int core    = (mpidr >> MPIDR_AFF1_SHIFT) & MPIDR_AFFLVL_MASK;
 
        assert(cluster < PLATFORM_CLUSTER_COUNT);
        assert(core < PLATFORM_MAX_CPUS_PER_CLUSTER);
@@ -77,7 +77,8 @@ void ca75_core_warm_reset(const u_register_t mpidr)
        while ((mmio_read_32(base + CA75_GPR_DSU_CORE0_PMU_STS + 8 * core) &
                                   (CA75_GPR_DSU_CORE_PMU_STS_PACCEPT |
                                    CA75_GPR_DSU_CORE_PMU_STS_PDENY)) !=
-                                   CA75_GPR_DSU_CORE_PMU_STS_PACCEPT);
+                                   CA75_GPR_DSU_CORE_PMU_STS_PACCEPT)
+               ;
 
        /* Deassert PREQ */
        mmio_clrbits_32(base + CA75_GPR_DSU_CORE0_PMU_CTL + 8 * core,
@@ -85,7 +86,8 @@ void ca75_core_warm_reset(const u_register_t mpidr)
 
        /* Wait for PACCEPT == 0 */
        while (mmio_read_32(base + CA75_GPR_DSU_CORE0_PMU_STS + 8 * core) &
-                                  CA75_GPR_DSU_CORE_PMU_STS_PACCEPT);
+                                  CA75_GPR_DSU_CORE_PMU_STS_PACCEPT)
+               ;
 
        /* Assert core warm reset */
        mmio_setbits_32(base + CA75_GPR_RST_CTL,
@@ -104,7 +106,8 @@ void ca75_core_warm_reset(const u_register_t mpidr)
        while ((mmio_read_32(base + CA75_GPR_DSU_CORE0_PMU_STS + 8 * core) &
                                   (CA75_GPR_DSU_CORE_PMU_STS_PACCEPT |
                                    CA75_GPR_DSU_CORE_PMU_STS_PDENY)) !=
-                                   CA75_GPR_DSU_CORE_PMU_STS_PACCEPT);
+                                   CA75_GPR_DSU_CORE_PMU_STS_PACCEPT)
+               ;
 
        /* Deassert PREQ */
        mmio_clrbits_32(base + CA75_GPR_DSU_CORE0_PMU_CTL + 8 * core,
@@ -112,5 +115,6 @@ void ca75_core_warm_reset(const u_register_t mpidr)
 
        /* Wait for PACCEPT == 0 */
        while (mmio_read_32(base + CA75_GPR_DSU_CORE0_PMU_STS + 8 * core) &
-                                  CA75_GPR_DSU_CORE_PMU_STS_PACCEPT);
+                                  CA75_GPR_DSU_CORE_PMU_STS_PACCEPT)
+               ;
 }
index 959553005d9300c4990a0c5eeefccdb225837fb3..8a5240b14f740cb2b9e457058202a0a1a786f3c4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2022-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -8,6 +8,7 @@
 
 #include <lib/utils_def.h>
 
+#include <baikal_def.h>
 #include <bs1000_def.h>
 #include <crc.h>
 #include <dw_i2c.h>
@@ -21,7 +22,7 @@
 
 static uint8_t spd_data[DIMM_NUM][SPD_MAXSIZE];
 
-const void* baikal_dimm_spd_get(const unsigned dimm_idx)
+const void *baikal_dimm_spd_get(const unsigned int dimm_idx)
 {
        if (dimm_idx >= ARRAY_SIZE(spd_data)) {
                return NULL;
@@ -32,48 +33,54 @@ const void* baikal_dimm_spd_get(const unsigned dimm_idx)
 
 void baikal_dimm_spd_read(void)
 {
-       unsigned dimm_idx;
+       unsigned int dimm_idx;
 
        for (dimm_idx = 0; dimm_idx < ARRAY_SIZE(spd_data); ++dimm_idx) {
                const uintptr_t base = dimm_idx < 6 ? I2C2_BASE : I2C3_BASE;
                uint8_t *buf = spd_data[dimm_idx];
                int rxsize;
-               const unsigned spd_addr = 0x50 + dimm_idx % 6;
+               const unsigned int spd_addr = 0x50 + dimm_idx % 6;
                uint8_t startaddr = 0;
 
                memset(buf, 0xff, sizeof(spd_data[0]));
 
-               i2c_txrx(base, SPD_SPA0,
+               i2c_txrx(base, BAIKAL_I2C_ICLK_FREQ,
+                        SPD_SPA0,
                         &startaddr, sizeof(startaddr),
                         NULL, 0);
 
-               rxsize = i2c_txrx(base, spd_addr,
+               rxsize = i2c_txrx(base, BAIKAL_I2C_ICLK_FREQ,
+                                 spd_addr,
                                  &startaddr, sizeof(startaddr),
                                  buf, 128);
 
                if (rxsize == 128 &&
                    crc16(buf, 126, 0) == spd_get_baseconf_crc(buf)) {
-                       const unsigned bytes_used = buf[0] & 0xf;
+                       const unsigned int bytes_used = buf[0] & 0xf;
 
                        if (bytes_used > 1 && bytes_used < 5) {
                                buf += rxsize;
                                startaddr += rxsize;
-                               rxsize = i2c_txrx(base, spd_addr,
+                               rxsize = i2c_txrx(base, BAIKAL_I2C_ICLK_FREQ,
+                                                 spd_addr,
                                                  &startaddr, sizeof(startaddr),
                                                  buf, 128);
 
                                if (rxsize == 128 && bytes_used > 2) {
                                        buf += rxsize;
                                        startaddr = 0;
-                                       i2c_txrx(base, SPD_SPA1,
+                                       i2c_txrx(base, BAIKAL_I2C_ICLK_FREQ,
+                                                SPD_SPA1,
                                                 &startaddr, sizeof(startaddr),
                                                 NULL, 0);
 
-                                       i2c_txrx(base, spd_addr,
+                                       i2c_txrx(base, BAIKAL_I2C_ICLK_FREQ,
+                                                spd_addr,
                                                 &startaddr, sizeof(startaddr),
                                                 buf, bytes_used == 3 ? 128 : 256);
 
-                                       i2c_txrx(base, SPD_SPA0,
+                                       i2c_txrx(base, BAIKAL_I2C_ICLK_FREQ,
+                                                SPD_SPA0,
                                                 &startaddr, sizeof(startaddr),
                                                 NULL, 0);
                                }
index a2f81e432cd7f8e063b8ee43cf8c1de560bc7f46..74513392ba0bf952fd820310bcfacb15b42acb05 100644 (file)
@@ -17,7 +17,7 @@
 
 static uint64_t baikal_detect_sdram_capacity(void)
 {
-       unsigned dimm_idx;
+       unsigned int dimm_idx;
        uint64_t total_capacity = 0;
 
        for (dimm_idx = 0; ; ++dimm_idx) {
@@ -90,7 +90,7 @@ void baikal_fdt_memory_update(void)
 {
        void *fdt = (void *)BAIKAL_SEC_DTB_BASE;
        uint64_t region_descs[4][2];
-       unsigned region_num;
+       unsigned int region_num;
        int ret;
        uint64_t total_capacity;
 
index 3dffdea5b0b25f1bf961c48cb84f8deb8d25a9cc..8f1cdc622c06de4be5171fc9fdac5669f95e0059 100644 (file)
@@ -20,7 +20,7 @@
 void pcie_init(void)
 {
        void *fdt = (void *)(uintptr_t)BAIKAL_SEC_DTB_BASE;
-       unsigned idx;
+       unsigned int idx;
        int node = -1;
 
        const uintptr_t pcie_dbis[14] = {
@@ -74,8 +74,8 @@ void pcie_init(void)
                PCIE4_NIC_SLV_P3
        };
 
-       unsigned pcie_lanes[ARRAY_SIZE(pcie_dbis)];
-       unsigned pcie_types[ARRAY_SIZE(pcie_dbis)];
+       unsigned int pcie_lanes[ARRAY_SIZE(pcie_dbis)];
+       unsigned int pcie_types[ARRAY_SIZE(pcie_dbis)];
 
        if (fdt_open_into(fdt, fdt, BAIKAL_DTB_MAX_SIZE)) {
                return;
@@ -87,7 +87,7 @@ void pcie_init(void)
        /* Configure PCIe in accordance with FDT */
        for (;;) {
                bool endpoint;
-               unsigned lanes = 0;
+               unsigned int lanes = 0;
                const uint32_t *prop;
                int proplen;
                uint64_t reg;
@@ -289,6 +289,7 @@ void pcie_init(void)
                                           0x2);
                } else {
                        ERROR("PCIe3: incorrect subsystem mode\n");
+                       plat_panic_handler();
                }
        } else if (pcie_types[9] > 0) {
                if (pcie_lanes[6] <= 8 &&
@@ -299,6 +300,7 @@ void pcie_init(void)
                                           0x3);
                } else {
                        ERROR("PCIe3: incorrect subsystem mode\n");
+                       plat_panic_handler();
                }
        } else if (pcie_types[8] > 0) {
                if (pcie_lanes[6] <= 8 &&
@@ -308,6 +310,7 @@ void pcie_init(void)
                                           0x1);
                } else {
                        ERROR("PCIe3: incorrect subsystem mode\n");
+                       plat_panic_handler();
                }
        } else if (pcie_types[6] > 0) {
                if (pcie_lanes[6] <= 16) {
@@ -315,6 +318,7 @@ void pcie_init(void)
                                        PCIE_GPR_SS_MODE_CTL_SSMODE_MASK);
                } else {
                        ERROR("PCIe3: incorrect subsystem mode\n");
+                       plat_panic_handler();
                }
        }
 
@@ -328,6 +332,7 @@ void pcie_init(void)
                                           0x2);
                } else {
                        ERROR("PCIe4: incorrect subsystem mode\n");
+                       plat_panic_handler();
                }
        } else if (pcie_types[13] > 0) {
                if (pcie_lanes[10] <= 8 &&
@@ -338,6 +343,7 @@ void pcie_init(void)
                                           0x3);
                } else {
                        ERROR("PCIe4: incorrect subsystem mode\n");
+                       plat_panic_handler();
                }
        } else if (pcie_types[12] > 0) {
                if (pcie_lanes[10] <= 8 &&
@@ -347,6 +353,7 @@ void pcie_init(void)
                                           0x1);
                } else {
                        ERROR("PCIe4: incorrect subsystem mode\n");
+                       plat_panic_handler();
                }
        } else if (pcie_types[10] > 0) {
                if (pcie_lanes[10] <= 16) {
@@ -354,6 +361,53 @@ void pcie_init(void)
                                        PCIE_GPR_SS_MODE_CTL_SSMODE_MASK);
                } else {
                        ERROR("PCIe4: incorrect subsystem mode\n");
+                       plat_panic_handler();
+               }
+       }
+
+       /* Set ITS target address */
+       for (idx = 0; idx < ARRAY_SIZE(pcie_dbis); ++idx) {
+               if (pcie_types[idx] != PCIE_TYPE_RC) {
+                       continue;
+               }
+
+               switch (pcie_dbis[idx]) {
+               case PCIE0_P0_DBI_BASE:
+               case PCIE0_P1_DBI_BASE:
+                       mmio_write_32(PCIE0_GPR_ITS0_TRGTADDR_CTL, GITS0_TRANSLATER >> 16);
+                       break;
+               case PCIE1_P0_DBI_BASE:
+               case PCIE1_P1_DBI_BASE:
+                       mmio_write_32(PCIE1_GPR_ITS0_TRGTADDR_CTL, GITS2_TRANSLATER >> 16);
+                       break;
+               case PCIE2_P0_DBI_BASE:
+               case PCIE2_P1_DBI_BASE:
+                       mmio_write_32(PCIE2_GPR_ITS0_TRGTADDR_CTL, GITS4_TRANSLATER >> 16);
+                       break;
+               case PCIE3_P0_DBI_BASE:
+                       mmio_write_32(PCIE3_GPR_ITS0_TRGTADDR_CTL, GITS6_TRANSLATER >> 16);
+                       break;
+               case PCIE3_P1_DBI_BASE:
+                       mmio_write_32(PCIE3_GPR_ITS1_TRGTADDR_CTL, GITS7_TRANSLATER >> 16);
+                       break;
+               case PCIE3_P2_DBI_BASE:
+                       mmio_write_32(PCIE3_GPR_ITS2_TRGTADDR_CTL, GITS8_TRANSLATER >> 16);
+                       break;
+               case PCIE3_P3_DBI_BASE:
+                       mmio_write_32(PCIE3_GPR_ITS3_TRGTADDR_CTL, GITS9_TRANSLATER >> 16);
+                       break;
+               case PCIE4_P0_DBI_BASE:
+                       mmio_write_32(PCIE4_GPR_ITS0_TRGTADDR_CTL, GITS11_TRANSLATER >> 16);
+                       break;
+               case PCIE4_P1_DBI_BASE:
+                       mmio_write_32(PCIE4_GPR_ITS1_TRGTADDR_CTL, GITS12_TRANSLATER >> 16);
+                       break;
+               case PCIE4_P2_DBI_BASE:
+                       mmio_write_32(PCIE4_GPR_ITS2_TRGTADDR_CTL, GITS13_TRANSLATER >> 16);
+                       break;
+               case PCIE4_P3_DBI_BASE:
+                       mmio_write_32(PCIE4_GPR_ITS3_TRGTADDR_CTL, GITS14_TRANSLATER >> 16);
+                       break;
                }
        }
 
index 9b7a89b4a7e1fb6e0e0f99b1f20a7b5267c1787a..aeace4fa56c97862cec1009d183dbbd7862e7029 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -34,8 +34,8 @@
 
 static int bs1000_validate_power_state(unsigned int power_state, psci_power_state_t *req_state)
 {
-       unsigned i;
-       unsigned state_id;
+       unsigned int i;
+       unsigned int state_id;
 
        /*
         *  The table storing the valid idle power states. Ensure that the
@@ -44,21 +44,12 @@ static int bs1000_validate_power_state(unsigned int power_state, psci_power_stat
         *  The table must be terminated by a NULL entry.
         */
        static const unsigned int idle_states[] = {
-               /* state-id - 0x01 */
+               /* state-id - 0x000 0001 */
                bs1000_make_pwrstate_lvl1(PLAT_LOCAL_STATE_RUN,
                                          PLAT_LOCAL_STATE_RET,
                                          MPIDR_AFFLVL0,
                                          PSTATE_TYPE_STANDBY),
-               /* state-id - 0x02 */
-               bs1000_make_pwrstate_lvl1(PLAT_LOCAL_STATE_RUN,
-                                         PLAT_LOCAL_STATE_OFF,
-                                         MPIDR_AFFLVL0,
-                                         PSTATE_TYPE_POWERDOWN),
-               /* state-id - 0x22 */
-               bs1000_make_pwrstate_lvl1(PLAT_LOCAL_STATE_OFF,
-                                         PLAT_LOCAL_STATE_OFF,
-                                         MPIDR_AFFLVL1,
-                                         PSTATE_TYPE_POWERDOWN),
+               /* Ending element of idle_states */
                0
        };
 
@@ -131,7 +122,7 @@ static void bs1000_cpu_standby(plat_local_state_t cpu_state)
 static int bs1000_pwr_domain_on(u_register_t mpidr)
 {
        volatile uint64_t *const hold_base = (uint64_t *)BAIKAL_HOLD_BASE;
-       const unsigned pos = plat_core_pos_by_mpidr(mpidr);
+       const unsigned int pos = plat_core_pos_by_mpidr(mpidr);
 
        if (hold_base[pos] == BAIKAL_HOLD_STATE_WAIT) {
                /* It is cold boot of a secondary core */
@@ -157,7 +148,6 @@ static void bs1000_pwr_domain_off(const psci_power_state_t *target_state)
 static void bs1000_pwr_domain_suspend(const psci_power_state_t *target_state)
 {
        ERROR("%s: operation not supported\n", __func__);
-       panic();
 }
 
 static void bs1000_pwr_domain_on_finish(const psci_power_state_t *target_state)
@@ -171,7 +161,6 @@ static void bs1000_pwr_domain_on_finish(const psci_power_state_t *target_state)
 static void bs1000_pwr_domain_suspend_finish(const psci_power_state_t *target_state)
 {
        ERROR("%s: operation not supported\n", __func__);
-       panic();
 }
 
 static void __dead2 bs1000_system_off(void)
index 3e59468d6d03f8fe5b9734a0881f7f97d9a3f865..66580d93cb27bb8a9c3da7fab240270aabc1e1b9 100644 (file)
@@ -6,26 +6,22 @@
 
 #include <common/debug.h>
 #include <common/runtime_svc.h>
+#include <lib/pmf/pmf.h>
+
 #include <baikal_pvt.h>
 #include <baikal_sip_svc.h>
 #include <bs1000_cmu.h>
 #include <bs1000_def.h>
 #include <bs1000_scp_lcru.h>
 
-static uint64_t baikal_lsp_mux_handler(uint64_t mode)
+static int baikal_sip_setup(void)
 {
-       uint32_t val;
-       int err;
-
-       err = scp_lcru_read(SCP_GPR_LSP_CTL, &val);
-       if (err)
-               return err;
-
-       val &= ~SCP_GPR_LSP_CTL_SEL_PERIPH_MASK;
-       val |= (uint32_t)mode << SCP_GPR_LSP_CTL_SEL_PERIPH_SHIFT;
-       err = scp_lcru_write(SCP_GPR_LSP_CTL, val);
-
-       return err;
+#if ENABLE_PMF
+       if (pmf_setup() != 0) {
+               return 1;
+       }
+#endif
+       return cmu_desc_init();
 }
 
 static uintptr_t sip_smc_handler(uint32_t smc_fid,
@@ -37,6 +33,7 @@ static uintptr_t sip_smc_handler(uint32_t smc_fid,
                                 void *handle,
                                 u_register_t flags)
 {
+       uint32_t local_smc_fid = smc_fid;
        uint64_t ret;
        uint64_t data[4];
 
@@ -45,7 +42,22 @@ static uintptr_t sip_smc_handler(uint32_t smc_fid,
                SMC_RET1(handle, SMC_UNK);
        }
 
-       switch (smc_fid) {
+       if (GET_SMC_CC(smc_fid) == SMC_32) {
+               /* 32-bit function, clear top parameter bits */
+               x1 = (uint32_t)x1;
+               x2 = (uint32_t)x2;
+               x3 = (uint32_t)x3;
+               x4 = (uint32_t)x4;
+
+               /*
+                * Convert SMC FID to SMC64 to support SMC32/SMC64.
+                * SMC64 calls are expected to be the 64-bit equivalent
+                * to the 32-bit call, where applicable (ARM DEN 0028E).
+                */
+               local_smc_fid |= SMC_64 << FUNCID_CC_SHIFT;
+       }
+
+       switch (local_smc_fid) {
        case BAIKAL_SMC_FLASH_ERASE:
        case BAIKAL_SMC_FLASH_INIT:
        case BAIKAL_SMC_FLASH_POSITION:
@@ -62,11 +74,11 @@ static uintptr_t sip_smc_handler(uint32_t smc_fid,
                        SMC_RET3(handle, ret, data[0], data[1]);
                }
                break;
-       case BAIKAL_SMC_PVT_ID:
+       case BAIKAL_SMC_PVT_CMD:
                if (x1 == PVT_READ) {
-                       ret = (uint64_t)pvt_read_reg((uint32_t)x2, (uint32_t)x3);
+                       ret = pvt_read_reg(x2, x3);
                } else if (x1 == PVT_WRITE) {
-                       ret = (uint64_t)pvt_write_reg((uint32_t)x2, (uint32_t)x3, (uint32_t)x4);
+                       ret = pvt_write_reg(x2, x3, x4);
                } else {
                        ERROR("%s: unhandled PVT SMC, x1:0x%lx\n", __func__, x1);
                        ret = SMC_UNK;
@@ -85,9 +97,17 @@ static uintptr_t sip_smc_handler(uint32_t smc_fid,
                ret = baikal_smc_gmac_handler(smc_fid, x1, x2, x3, x4);
                break;
        case BAIKAL_SMC_LSP_MUX:
-               ret = baikal_lsp_mux_handler(x1);
+               ret = scp_lcru_clrsetbits(SCP_GPR_LSP_CTL,
+                                         SCP_GPR_LSP_CTL_SEL_PERIPH_MASK,
+                                         x1 << SCP_GPR_LSP_CTL_SEL_PERIPH_SHIFT);
                break;
        default:
+#if ENABLE_PMF
+               /* Dispatch PMF calls to PMF SMC handler and return its return value */
+               if (is_pmf_fid(smc_fid)) {
+                       return pmf_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, flags);
+               }
+#endif
                ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid);
                ret = SMC_UNK;
                break;
@@ -101,6 +121,6 @@ DECLARE_RT_SVC(
        OEN_SIP_START,
        OEN_SIP_END,
        SMC_TYPE_FAST,
-       cmu_desc_init,
+       baikal_sip_setup,
        sip_smc_handler
 );
index 6621def08ec75b13bec457abf23155aacf81216d..44e9f0e3c9bb0371505f20de9223aabacddc0d79 100644 (file)
@@ -100,7 +100,7 @@ typedef struct {
 
 #define cmu_clken_t cmu_clkdiv_t
 
-static const char *noname="";
+static const char *noname = "";
 
 static const struct clk_ops ops_clkref = {
        .get            = cmu_clkref_get_rate,
@@ -162,21 +162,24 @@ struct clk_desc *cmu_desc_get_by_base(uintptr_t base)
 {
        struct clk_desc *clk;
        int idx;
+
        for (idx = 0; ; idx++) {
                clk = cmu_desc_get_by_idx(idx);
                if (!clk) {
                        break;
                }
+
                if (clk->base == base) {
                        return clk;
                }
        }
+
        return NULL;
 }
 
 struct clk_desc *cmu_desc_create(void *fdt, int offs, int index)
 {
-       static int next = 0;
+       static int next;
        uintptr_t base = 0;
        const fdt32_t *prop;
        int proplen;
@@ -194,12 +197,15 @@ struct clk_desc *cmu_desc_create(void *fdt, int offs, int index)
        int cnt0 = proplen / sizeof(uint32_t);
        int cnt1 = fdt_stringlist_count(fdt, offs, "clock-output-names");
        int cnt = cnt0 > cnt1 ? cnt0 : cnt1;
+
        if (cnt < 0) {
                cnt = 1;
        }
+
        if (index > cnt - 1) {
                return NULL;
        }
+
        if (cnt0 > 0) {
                base += fdt32_to_cpu(prop[index]) * 0x10;
        } else if (cnt1 > 0) {
@@ -262,10 +268,13 @@ struct clk_desc *cmu_desc_create(void *fdt, int offs, int index)
        if (proplen > 0) {
                int phandle = fdt32_to_cpu(prop[0]);
                int idx = 0;
+
                if (proplen > sizeof(uint32_t)) {
                        idx = fdt32_to_cpu(prop[1]);
                }
+
                int offs2 = fdt_node_offset_by_phandle(fdt, phandle);
+
                clk->parent = cmu_desc_create(fdt, offs2, idx);
                if (clk->parent == NULL) {
                        return NULL;
@@ -276,6 +285,7 @@ struct clk_desc *cmu_desc_create(void *fdt, int offs, int index)
        prop = fdt_getprop(fdt, offs, "clock-frequency", &proplen);
        if (proplen > 0) {
                uint64_t freq = fdt32_to_cpu(*prop);
+
                if (freq != clk->ops->get(base)) {
                        clk->ops->set(base, freq);
                }
@@ -297,31 +307,36 @@ int cmu_desc_init(void)
        int i;
        void *fdt = (void *)(uintptr_t)BAIKAL_NS_DTB_BASE;
        int ret = fdt_open_into(fdt, fdt, BAIKAL_DTB_MAX_SIZE);
+
        if (ret < 0) {
                ERROR("Invalid Device Tree at %p: error %d\n", fdt, ret);
                return -1;
        }
+
        for (;;) {
                offs = fdt_next_node(fdt, offs, NULL);
                if (offs < 0) {
                        break;
                }
+
                if (!fdt_node_check_compatible(fdt, offs, "baikal,bs1000-cmu")) {
                        for (i = 0; ; i++) {
-                               if (NULL == cmu_desc_create(fdt, offs, i)) {
+                               if (cmu_desc_create(fdt, offs, i) == NULL) {
                                        break;
                                }
                        }
                }
        }
+
        return 0;
 }
 
 static int reg_write(uintptr_t addr, uint32_t value)
 {
-       if ((addr > SCP_LCRU_BASE) &&
-           (addr < SCP_LCRU_BASE + SCP_LCRU_SIZE)) {
+       if ((addr >= SCP_LCRU_BASE) &&
+           (addr <  SCP_LCRU_BASE + SCP_LCRU_SIZE)) {
                int ret = scp_lcru_write(addr, value);
+
                if (ret < 0) {
                        return ret;
                }
@@ -337,6 +352,7 @@ static int reg_read(uintptr_t addr, uint32_t *value)
        if ((addr >= SCP_LCRU_BASE) &&
            (addr <  SCP_LCRU_BASE + SCP_LCRU_SIZE)) {
                int ret = scp_lcru_read(addr, value);
+
                if (ret < 0) {
                        return ret;
                }
@@ -350,9 +366,11 @@ static int reg_read(uintptr_t addr, uint32_t *value)
 int cmu_log2(int a)
 {
        int n = 0;
+
        while (a >>= 1) {
                n++;
        }
+
        return n;
 }
 
@@ -385,14 +403,19 @@ int cmu_calc_range(int64_t freq)
 int64_t cmu_get_ref(uintptr_t base)
 {
        struct clk_desc *clk = cmu_desc_get_by_base(base);
+
        if (!clk) {
                return -1;
        }
+
        struct clk_desc *parent = clk->parent;
+
        if (!parent) {
                return -2;
        }
+
        int64_t freq = parent->ops->get(parent->base);
+
        return freq;
 }
 
@@ -401,19 +424,21 @@ int64_t cmu_pll_calc(int64_t fref, void *div)
        /* fout = 2 * (fref * NF) / (NR * OD) */
        int NR, NF, OD;
        cmu_pll_t *pll = div;
+
        NF = pll->divf + 1;
        NR = pll->divr + 1;
        OD = 1 << pll->divq;
        if (!NR || !OD) {
                return -1;
        }
+
        return 2 * (fref * NF) / (NR * OD);
 }
 
 int64_t cmu_pll_div_set(uintptr_t base, void *div)
 {
        uint32_t raw;
-       cmu_pll_t *reg = (void*)&raw;
+       cmu_pll_t *reg = (void *)&raw;
        cmu_pll_t *new = div;
        int ret;
 
@@ -437,10 +462,12 @@ int64_t cmu_pll_div_set(uintptr_t base, void *div)
 int64_t cmu_pll_div_get(uintptr_t base, void *div)
 {
        int ret;
+
        ret = reg_read(base, div);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
@@ -454,7 +481,7 @@ int64_t cmu_pll_div_calc(int64_t freq, int64_t fref, void *div)
                return -1;
        }
 
-       cmu_pll_t *pll = (void*)div;
+       cmu_pll_t *pll = (void *)div;
        int divq; /* [1-7]  ::  {2, 4, 8, 16, 32, 64, 128} */
        int divr; /* [0-63]     */
        int divf; /* [0-511]    */
@@ -508,37 +535,44 @@ int64_t cmu_clkch_calc(int64_t fref, void *div)
        /* fout = fref / (VAL_CLKDIV + 1) */
        cmu_clkch_t *reg = div;
        int dd = reg->val_clkdiv + 1;
+
        if (!dd || reg->val_clkdiv > VAL_CLKDIV_MAX) {
                return -1;
        }
+
        return fref / dd;
 }
 
 int64_t cmu_clkch_div_set(uintptr_t base, void *div)
 {
        uint32_t raw;
-       cmu_clkch_t *reg = (void*)&raw;
+       cmu_clkch_t *reg = (void *)&raw;
        cmu_clkch_t *new = div;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        reg->val_clkdiv = new->val_clkdiv;
        ret = reg_write(base, raw);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
 int64_t cmu_clkch_div_get(uintptr_t base, void *div)
 {
        int ret;
+
        ret = reg_read(base, div);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
@@ -561,6 +595,7 @@ int64_t cmu_clkch_div_calc(int64_t freq, int64_t fref, void *div)
        div0 = fref / freq - 1;
        for (val_clkdiv = div0 - 1; val_clkdiv <= div0 + 1; val_clkdiv++) {
                int dd = val_clkdiv + 1;
+
                if (!dd || dd < 0 || val_clkdiv > VAL_CLKDIV_MAX) {
                        continue;
                }
@@ -586,33 +621,39 @@ int64_t cmu_clkdiv_calc(int64_t fref, void *div)
        /* fout = fref / 2^(DIV_VAL - 1) */
        cmu_clkdiv_t *reg = div;
        int dd = 1 << (reg->div_val - 1);
+
        if (!dd || reg->div_val < 1 || reg->div_val > DIV_VAL_MAX) {
                return -1;
        }
+
        return fref / dd;
 }
 
 int64_t cmu_clkdiv_div_set(uintptr_t base, void *div)
 {
        uint32_t raw;
-       cmu_clkdiv_t *reg = (void*)&raw;
+       cmu_clkdiv_t *reg = (void *)&raw;
        cmu_clkdiv_t *new = div;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        reg->div_val = new->div_val;
        ret = reg_write(base, raw);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
 int64_t cmu_clkdiv_div_get(uintptr_t base, void *div)
 {
        int ret;
+
        ret = reg_read(base, div);
        if (ret < 0) {
                return ret;
@@ -639,6 +680,7 @@ int64_t cmu_clkdiv_div_calc(int64_t freq, int64_t fref, void *div)
        div0 = cmu_log2(fref / freq) + 1;
        for (div_val = div0 - 1; div_val <= div0 + 1; div_val++) {
                int dd = 1 << (div_val - 1);
+
                if (!dd || div_val < 1 || div_val > DIV_VAL_MAX) {
                        continue;
                }
@@ -662,18 +704,21 @@ int64_t cmu_clken_calc(int64_t fref, void *div)
        /* fout = fref / DIV_VAL */
        cmu_clkdiv_t *reg = div;
        int dd = reg->div_val;
+
        if (!dd || reg->div_val > DIV_VAL_MAX) {
                return -1;
        }
+
        return fref / dd;
 }
 
 int64_t cmu_clken_div_set(uintptr_t base, void *div)
 {
        uint32_t raw;
-       cmu_clkdiv_t *reg = (void*)&raw;
+       cmu_clkdiv_t *reg = (void *)&raw;
        cmu_clkdiv_t *new = div;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
@@ -689,6 +734,7 @@ int64_t cmu_clken_div_set(uintptr_t base, void *div)
 int64_t cmu_clken_div_get(uintptr_t base, void *div)
 {
        int ret;
+
        ret = reg_read(base, div);
        if (ret < 0) {
                return ret;
@@ -715,6 +761,7 @@ int64_t cmu_clken_div_calc(int64_t freq, int64_t fref, void *div)
        div0 = fref / freq;
        for (div_val = div0 - 1; div_val <= div0 + 1; div_val++) {
                int dd = div_val;
+
                if (!dd || dd < 0 || div_val > DIV_VAL_MAX) {
                        continue;
                }
@@ -755,6 +802,7 @@ int64_t cmu_clkref_get_rate(uintptr_t base)
         */
        uint32_t raw;
        int ret;
+
        ret = reg_read(SCP_GPR_BOOT_INFO_STS, &raw);
        if (ret < 0) {
                return ret;
@@ -799,12 +847,15 @@ int64_t cmu_pll_get_rate(uintptr_t base)
        int64_t freq;
        cmu_pll_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_pll_div_get(base, &div)) {
                return -1;
        }
+
        freq = cmu_pll_calc(fref, &div);
        return freq;
 }
@@ -812,7 +863,7 @@ int64_t cmu_pll_get_rate(uintptr_t base)
 int64_t cmu_pll_set_rate(uintptr_t base, int64_t freq)
 {
        uint32_t raw;
-       cmu_pll_t *reg = (void*)&raw;
+       cmu_pll_t *reg = (void *)&raw;
        int ret;
 
        /* 1. SWEN = 0 */
@@ -855,12 +906,15 @@ int64_t cmu_pll_set_rate(uintptr_t base, int64_t freq)
        /* 5. set_div */
        cmu_pll_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_pll_div_calc(freq, fref, &div) < 0) {
                return -1;
        }
+
        if (cmu_pll_div_set(base, &div)) {
                return -1;
        }
@@ -880,6 +934,7 @@ int64_t cmu_pll_set_rate(uintptr_t base, int64_t freq)
        /* 8. LOCK? */
 #ifndef BAIKAL_QEMU
        int try = 100;
+
        do {
                ret = reg_read(base, &raw);
                if (ret < 0) {
@@ -920,17 +975,20 @@ int64_t cmu_pll_disable(uintptr_t base)
 {
        /* SWEN = 0 */
        uint32_t raw;
-       cmu_pll_t *reg = (void*)&raw;
+       cmu_pll_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        reg->swen = 0;
        ret = reg_write(base, raw);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
@@ -938,17 +996,20 @@ int64_t cmu_pll_enable(uintptr_t base)
 {
        /* SWEN = 1 */
        uint32_t raw;
-       cmu_pll_t *reg = (void*)&raw;
+       cmu_pll_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        reg->swen = 1;
        ret = reg_write(base, raw);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
@@ -956,7 +1017,7 @@ int64_t cmu_pll_is_enabled(uintptr_t base)
 {
        /* return SWEN */
        uint32_t raw;
-       cmu_pll_t *reg = (void*)&raw;
+       cmu_pll_t *reg = (void *)&raw;
        int ret;
 
        ret = reg_read(base, &raw);
@@ -970,13 +1031,17 @@ int64_t cmu_pll_round_rate(uintptr_t base, int64_t freq)
 {
        cmu_pll_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_pll_div_calc(freq, fref, &div) < 0) {
                return -1;
        }
+
        int64_t calc = cmu_pll_calc(fref, &div);
+
        return calc;
 }
 
@@ -986,9 +1051,11 @@ int64_t cmu_clkch_get_rate(uintptr_t base)
        int64_t freq;
        cmu_clkch_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_clkch_div_get(base, &div)) {
                return -1;
        }
@@ -1000,7 +1067,7 @@ int64_t cmu_clkch_get_rate(uintptr_t base)
 int64_t cmu_clkch_set_rate(uintptr_t base, int64_t freq)
 {
        uint32_t raw;
-       cmu_clkch_t *reg = (void*)&raw;
+       cmu_clkch_t *reg = (void *)&raw;
        int ret;
 
        /* 1. CLKEN = 0 */
@@ -1009,6 +1076,7 @@ int64_t cmu_clkch_set_rate(uintptr_t base, int64_t freq)
        /* 2. wait CLKRDY = 0 */
 #ifndef BAIKAL_QEMU
        int try = 100;
+
        do {
                ret = reg_read(base, &raw);
                if (ret < 0) {
@@ -1023,12 +1091,15 @@ int64_t cmu_clkch_set_rate(uintptr_t base, int64_t freq)
        /* 3. set dividers */
        cmu_clkch_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_clkch_div_calc(freq, fref, &div) < 0) {
                return -1;
        }
+
        if (cmu_clkch_div_set(base, &div)) {
                return -1;
        }
@@ -1093,17 +1164,20 @@ int64_t cmu_clkch_disable(uintptr_t base)
 {
        /* CLKEN = 0 */
        uint32_t raw;
-       cmu_clkch_t *reg = (void*)&raw;
+       cmu_clkch_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        reg->clk_en = 0;
        ret = reg_write(base, raw);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
@@ -1111,17 +1185,20 @@ int64_t cmu_clkch_enable(uintptr_t base)
 {
        /* CLKEN = 1 */
        uint32_t raw;
-       cmu_clkch_t *reg = (void*)&raw;
+       cmu_clkch_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        reg->clk_en = 1;
        ret = reg_write(base, raw);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
@@ -1129,12 +1206,14 @@ int64_t cmu_clkch_is_enabled(uintptr_t base)
 {
        /* return CLKEN */
        uint32_t raw;
-       cmu_clkch_t *reg = (void*)&raw;
+       cmu_clkch_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        return reg->clk_en;
 }
 
@@ -1142,13 +1221,17 @@ int64_t cmu_clkch_round_rate(uintptr_t base, int64_t freq)
 {
        cmu_clkch_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_clkch_div_calc(freq, fref, &div) < 0) {
                return -1;
        }
+
        int64_t calc = cmu_clkch_calc(fref, &div);
+
        return calc;
 }
 
@@ -1158,12 +1241,15 @@ int64_t cmu_clkdiv_get_rate(uintptr_t base)
        int64_t freq;
        cmu_clkdiv_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_clkdiv_div_get(base, &div)) {
                return -1;
        }
+
        freq = cmu_clkdiv_calc(fref, &div);
        return freq;
 }
@@ -1173,7 +1259,7 @@ int64_t cmu_clkdiv_set_rate(uintptr_t base, int64_t freq)
        int ret;
        uint32_t raw;
        int64_t fref;
-       cmu_clkdiv_t *reg = (void*) &raw;
+       cmu_clkdiv_t *reg = (void *)&raw;
        cmu_clkdiv_t cur;
        cmu_clkdiv_t new;
 
@@ -1218,6 +1304,7 @@ int64_t cmu_clkdiv_set_rate(uintptr_t base, int64_t freq)
 #ifndef BAIKAL_QEMU
                /* wait */
                int try = 1000;
+
                do {
                        ret = reg_read(base, &raw);
                        if (ret < 0) {
@@ -1237,17 +1324,20 @@ int64_t cmu_clkdiv_disable(uintptr_t base)
 {
        /* CLKEN = 0 */
        uint32_t raw;
-       cmu_clkdiv_t *reg = (void*)&raw;
+       cmu_clkdiv_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        reg->clk_en = 0;
        ret = reg_write(base, raw);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
@@ -1255,17 +1345,20 @@ int64_t cmu_clkdiv_enable(uintptr_t base)
 {
        /* CLKEN = 1 */
        uint32_t raw;
-       cmu_clkdiv_t *reg = (void*)&raw;
+       cmu_clkdiv_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
        }
+
        reg->clk_en = 1;
        ret = reg_write(base, raw);
        if (ret < 0) {
                return ret;
        }
+
        return 0;
 }
 
@@ -1273,7 +1366,7 @@ int64_t cmu_clkdiv_is_enabled(uintptr_t base)
 {
        /* return CLKEN */
        uint32_t raw;
-       cmu_clkdiv_t *reg = (void*)&raw;
+       cmu_clkdiv_t *reg = (void *)&raw;
        int ret;
 
        ret = reg_read(base, &raw);
@@ -1287,13 +1380,17 @@ int64_t cmu_clkdiv_round_rate(uintptr_t base, int64_t freq)
 {
        cmu_clkdiv_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_clkdiv_div_calc(freq, fref, &div) < 0) {
                return -1;
        }
+
        int64_t calc = cmu_clkdiv_calc(fref, &div);
+
        return calc;
 }
 
@@ -1303,12 +1400,15 @@ int64_t cmu_clken_get_rate(uintptr_t base)
        int64_t freq = 0;
        cmu_clken_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
+
        if (cmu_clken_div_get(base, &div)) {
                return -1;
        }
+
        freq = cmu_clken_calc(fref, &div);
        return freq;
 }
@@ -1316,7 +1416,7 @@ int64_t cmu_clken_get_rate(uintptr_t base)
 int64_t cmu_clken_set_rate(uintptr_t base, int64_t freq)
 {
        uint32_t raw;
-       cmu_clken_t *reg = (void*)&raw;
+       cmu_clken_t *reg = (void *)&raw;
        int ret;
 
        /* 1. CLKEN = 0 */
@@ -1325,6 +1425,7 @@ int64_t cmu_clken_set_rate(uintptr_t base, int64_t freq)
        /* 2. set dividers */
        cmu_clken_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
@@ -1349,6 +1450,7 @@ int64_t cmu_clken_set_rate(uintptr_t base, int64_t freq)
        /* 4. wait LOCK */
 #ifndef BAIKAL_QEMU
        int try;
+
        try = 100;
        do {
                ret = reg_read(base, &raw);
@@ -1371,8 +1473,9 @@ int64_t cmu_clken_disable(uintptr_t base)
 {
        /* CLKEN = 0 */
        uint32_t raw;
-       cmu_clkdiv_t *reg = (void*)&raw;
+       cmu_clkdiv_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
@@ -1389,8 +1492,9 @@ int64_t cmu_clken_enable(uintptr_t base)
 {
        /* CLKEN = 1 */
        uint32_t raw;
-       cmu_clkdiv_t *reg = (void*)&raw;
+       cmu_clkdiv_t *reg = (void *)&raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
@@ -1408,6 +1512,7 @@ int64_t cmu_clken_is_enabled(uintptr_t base)
        /* return CLKEN */
        uint32_t raw;
        int ret;
+
        ret = reg_read(base, &raw);
        if (ret < 0) {
                return ret;
@@ -1419,29 +1524,34 @@ int64_t cmu_clken_round_rate(uintptr_t base, int64_t freq)
 {
        cmu_clken_t div;
        int64_t fref = cmu_get_ref(base);
+
        if (fref < 0) {
                return -1;
        }
        if (cmu_clken_div_calc(freq, fref, &div) < 0) {
                return -1;
        }
+
        int64_t calc = cmu_clken_calc(fref, &div);
+
        return calc;
 }
 
-int64_t baikal_smc_clk_handler(const uint32_t ops,
+int64_t baikal_smc_clk_handler(const uint32_t smc_fid,
                               const uint64_t base,
                               const uint64_t freq,
                               const uint64_t x3,
                               const uint64_t x4)
 {
        struct clk_desc *clk = cmu_desc_get_by_base(base);
+       /* Convert SMC FID to SMC64 to support SMC32/SMC64 */
+       const uint32_t local_smc_fid = BIT(30) | smc_fid;
 
        if (!clk) {
                return -1;
        }
 
-       switch (ops) {
+       switch (local_smc_fid) {
        case BAIKAL_SMC_CLK_GET:
                return clk->ops->get(base);
        case BAIKAL_SMC_CLK_SET:
@@ -1459,7 +1569,7 @@ int64_t baikal_smc_clk_handler(const uint32_t ops,
        }
 }
 
-int64_t baikal_smc_gmac_handler(const uint32_t ops,
+int64_t baikal_smc_gmac_handler(const uint32_t smc_fid,
                                const uint64_t addr,
                                const uint64_t x2,
                                const uint64_t x3,
@@ -1467,6 +1577,8 @@ int64_t baikal_smc_gmac_handler(const uint32_t ops,
 {
        uint32_t mask;
        uint32_t reg;
+       /* Convert SMC FID to SMC64 to support SMC32/SMC64 */
+       const uint32_t local_smc_fid = BIT(30) | smc_fid;
 
        switch (addr) {
        case GMAC0_BASE:
@@ -1479,7 +1591,7 @@ int64_t baikal_smc_gmac_handler(const uint32_t ops,
                return -1;
        }
 
-       switch (ops) {
+       switch (local_smc_fid) {
        case BAIKAL_SMC_GMAC_DIV2_ENABLE:
                reg_read(SCP_GPR_GMAC_DIV_CTL, &reg);
                reg |= mask;
index 0c796b957c44b0aa976cc22b0f281e1c62dd93e2..756ce40365c9f3e084a02b5549f47e246738ca99 100644 (file)
@@ -62,20 +62,21 @@ static void baikal_gmac_memattrs_smmu_fix(void)
        SMMUV3_STE_BYPASS(ste, SMMU_STE_MEMATTR_IWB_OWB, SMMU_STE_MTCFG_REPLACE_MEMATTR,
                          SMMU_STE_ALLOCCFG_RW, SMMU_STE_SHCFG_OUTER, SMMU_STE_NSCFG_NSEC,
                          SMMU_STE_PRIVCFG_USE_INCOMING, SMMU_STE_INSTCFG_USE_INCOMING);
-       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 10*SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
+       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 10 * SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
        ste = BAIKAL_SCMM_SMMU_STRTAB_BASE + SMMU_STE_SIZE;
        SMMUV3_STE_BYPASS(ste, 0, SMMU_STE_MTCFG_USE_INCOMING, SMMU_STE_ALLOCCFG_USE_INCOMING,
                          SMMU_STE_SHCFG_USE_INCOMING, SMMU_STE_NSCFG_USE_INCOMING,
                          SMMU_STE_PRIVCFG_USE_INCOMING, SMMU_STE_INSTCFG_USE_INCOMING);
-       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 2*SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
-       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 3*SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
-       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 4*SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
-       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 8*SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
-       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 12*SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
+       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 2 * SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
+       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 3 * SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
+       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 4 * SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
+       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 8 * SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
+       memcpy((void *)BAIKAL_SCMM_SMMU_STRTAB_BASE + 12 * SMMU_STE_SIZE, (void *)ste, SMMU_STE_SIZE);
        dsb();
        /* Enable SMMU */
-       if (smmuv3_enable(SMMU_BASE, true) != 0)
+       if (smmuv3_enable(SMMU_BASE, true) != 0) {
                ERROR("SCMM SMMU enable failed.\n");
+       }
 }
 
 void bs1000_gmac_init(void)
index 80df6b93bf4d7e2099415324f9b1d4fc84774a86..284d163d894adf0edd1876be4db4b2137f053d79 100644 (file)
@@ -10,7 +10,7 @@
 #define DDR_DEBUG_TEST_MAPPING         0 /* 0 - default; 1 - special debug mapping for 2-rank/2-DIMMs testing */
 #define DDR_CTRL_DFI_INIT_TIMEOUT      50
 #define DDR_CTRL_DONE_TIMEOUT          10 /* small umctl2 timeout for different tasks */
-#define DDR_PHY_TWRDATA_DELAY          16 /* see PHY PUB DataBook, Table5-3 (p.91); (t_ctrl_delay+(6+4)+TxDqsDly)/2 */
+#define DDR_PHY_TWRDATA_DELAY          16 /* see PHY PUB DataBook, Table5-3 (p.91); (t_ctrl_delay + (6 + 4) + TxDqsDly) / 2 */
 
 #define MSTR           (0x0)
 #define STAT           (0x4)
index 5972f2f48a69eb54d5a6285987e597ebcc583b4c..39600009095c81f1fab59c104fcf26dc3532d2d4 100644 (file)
@@ -28,7 +28,6 @@ void umctl2_enter_SR(int port)
        BS_DDRC_WRITE(port, PWRCTL, reg_val);
 }
 
-
 void umctl2_exit_SR(int port)
 {
        uint32_t reg_val;
@@ -48,29 +47,30 @@ void umctl2_exit_SR(int port)
        /* delay 1 us */
        udelay(1);
 }
+
 static void ctrl_set_sar(int port)
 {
-       /* program SAR registers (UMCTL2_SARMINSIZE=256MB) */
+       /* program SAR registers (UMCTL2_SARMINSIZE = 256 MiB) */
        /* configure a SARBASE0 reg. */
-       BS_DDRC_WRITE(port, SARBASE0, 8); /* region 0:  2GB base address */
+       BS_DDRC_WRITE(port, SARBASE0, 8); /* region 0:  2 GiB base address */
        /* configure a SARSIZE0 reg. */
-       BS_DDRC_WRITE(port, SARSIZE0, 8 - 1); /* region 0: 2GB size */
+       BS_DDRC_WRITE(port, SARSIZE0, 8 - 1); /* region 0: 2 GiB size */
 
        /* configure a SARBASE1 reg. */
-       BS_DDRC_WRITE(port, SARBASE1, 34 * 4); /* region 1: 34GB base address */
+       BS_DDRC_WRITE(port, SARBASE1, 34 * 4); /* region 1: 34 GiB base address */
        /* configure a SARSIZE1 reg. */
-       BS_DDRC_WRITE(port, SARSIZE1, 30 * 4 - 1); /* region 1: 30GB size */
+       BS_DDRC_WRITE(port, SARSIZE1, 30 * 4 - 1); /* region 1: 30 GiB size */
 
        /* configure a SARBASE2 reg. */
-       BS_DDRC_WRITE(port, SARBASE2, 544 * 4); /* region 2: 544GB base address */
+       BS_DDRC_WRITE(port, SARBASE2, 544 * 4); /* region 2: 544 GiB base address */
        /* configure a SARSIZE2 reg. */
-       BS_DDRC_WRITE(port, SARSIZE2, 64 * 4 - 1); /* region 2: 64GB size (note: it's a max value for SARSIZE) */
+       BS_DDRC_WRITE(port, SARSIZE2, 64 * 4 - 1); /* region 2: 64 GiB size (note: it's a max value for SARSIZE) */
 
        /* configure a SARBASE3 reg. */
-       /* note: we can't set 8TB region, SARSIZE have a max value 64GB */
-       BS_DDRC_WRITE(port, SARBASE3, 608 * 4); /* region 3: 544+64GB base address */
+       /* note: we can't set 8 TiB region, SARSIZE have a max value 64 GiB */
+       BS_DDRC_WRITE(port, SARBASE3, 608 * 4); /* region 3: 544 + 64 GiB base address */
        /* configure a SARSIZE3 reg. */
-       BS_DDRC_WRITE(port, SARSIZE3, 64 * 4 - 1); /* region 3: 64GB size (note: it's a max value for SARSIZE) */
+       BS_DDRC_WRITE(port, SARSIZE3, 64 * 4 - 1); /* region 3: 64 GiB size (note: it's a max value for SARSIZE) */
 }
 
 /** @brief increments HIF address and strips address by mask in DRAMconfig
@@ -80,8 +80,9 @@ static uint32_t hif_addr_increment(uint32_t hif_addr, struct ddr_configuration *
        /* note: shift input address by -3 for APP_ADDR => HIF_ADDR conversion */
        uint64_t strip_addr_mask = data->addr_strip_bit >> 3;
 
-       /* note: be careful for max HIF_ADDR value 33 bit
-        * (HIF_ADDR width is 34 bits - 128GB address space is maximum!)
+       /*
+        * note: be careful for max HIF_ADDR value 33 bit
+        * (HIF_ADDR width is 34 bits - 128 GiB address space is maximum)
         */
        if (hif_addr > 33) {
                /* max value = 33, but gets incremented once more later */
@@ -113,6 +114,7 @@ static void ctrl_set_addr_map(int port, struct ddr_configuration *data)
        /* COL2  ->HIF A2 */
        /* BG0  ->HIF A3 */
        uint32_t hif_addr = 4; /* next empty HIF address */
+
        map2_val &= ~GENMASK(12, 8);
        map2_val |= GENMASK(12, 8) & ((hif_addr - 3) << 8); /* map COL3->HIF */
        hif_addr = hif_addr_increment(hif_addr, data);
@@ -333,12 +335,13 @@ int ctrl_init(int port, struct ddr_configuration *data)
        /* configure a DFITMG1 reg. */
        regval  = 2; /* see PHY PUB DataBook, Table5-12 (p.97) */
        regval |= (2 << 8); /* see PHY PUB DataBook, Table5-12 (p.97) */
-        /* see PHY PUB DataBook, Table5-3 (p.91) << 16); (t_ctrl_delay+(6+4)+TxDqsDly)/2 */
+        /* see PHY PUB DataBook, Table5-3 (p.91) << 16); (t_ctrl_delay + (6 + 4) + TxDqsDly) / 2 */
        regval |= GENMASK(20, 16) & ((((DDR_PHY_TWRDATA_DELAY + 1) / 2 + 1)) << 16);
        /* add one additional clk for RDIMM (see F0RC0F settings: 1 clk delay for parity by default) */
        regval |= ((data->registered_dimm ? 1 : 0) << 24);
        regval &= ~GENMASK(31, 28); /* note: have to set non-zero value for CAL mode (we don't use CAL mode) */
        const uint32_t dfitmg1_val = regval;
+
        BS_DDRC_WRITE(port, DFITMG1, regval);
 
        /* configure a DFITMG2 reg. */
@@ -347,24 +350,27 @@ int ctrl_init(int port, struct ddr_configuration *data)
        BS_DDRC_WRITE(port, DFITMG2, regval);
 
        /* configure a DRAMTMG0 reg. */
-       unsigned t_ras_min = data->timing_2t ? (data->tRAS + 1) / 2 : data->tRAS / 2;
+       unsigned int t_ras_min = data->timing_2t ? (data->tRAS + 1) / 2 : data->tRAS / 2;
+
        regval  = GENMASK(5, 0) & t_ras_min;
        regval |= GENMASK(14, 8) & (((data->tRASmax / 1024 - 1) / 2) << 8);
        regval |= GENMASK(21, 16) & (((data->tFAW + 1) / 2) << 16);
-       unsigned wr2pre = (data->WL + 4 + data->tWR);
+       unsigned int wr2pre = (data->WL + 4 + data->tWR);
+
        regval |= GENMASK(30, 24) & ((data->timing_2t ? (wr2pre + 1) / 2 : wr2pre / 2) << 24);
        BS_DDRC_WRITE(port, DRAMTMG0, regval);
 
        /* configure a DRAMTMG1 reg. */
        regval  = GENMASK(6, 0) & ((data->tRC + 1) / 2);
-       unsigned rd2pre = ((data->AL + data->tRTP) > (data->RL + 4 - data->tRP)) ?
+       unsigned int rd2pre = ((data->AL + data->tRTP) > (data->RL + 4 - data->tRP)) ?
                                                        (data->AL + data->tRTP) : (data->RL + 4 - data->tRP);
        regval |= GENMASK(13, 8) & ((data->timing_2t ? (rd2pre + 1) / 2 : rd2pre / 2) << 8);
        regval |= GENMASK(20, 16) & (((data->tXP + data->PL + 1) / 2) << 16);
        BS_DDRC_WRITE(port, DRAMTMG1, regval);
 
        /* configure a DRAMTMG2 reg. */
-       unsigned wr2rd = data->CWL + data->PL + 4 + data->tWTR_L; /* CRC off */
+       unsigned int wr2rd = data->CWL + data->PL + 4 + data->tWTR_L; /* CRC off */
+
        regval  = GENMASK(5, 0) & ((wr2rd + 1) / 2);
        /* see umctl2 Databook for "rd2wr" description */
        regval |= GENMASK(13, 8) & (((data->RL + 4 + 1 + (data->wr_preamble_2CK ? 2 : 1) - data->WL + 1) / 2) << 8);
@@ -373,8 +379,8 @@ int ctrl_init(int port, struct ddr_configuration *data)
        BS_DDRC_WRITE(port, DRAMTMG2,  regval);
 
        /* configure a DRAMTMG3 reg. */
-       regval  = GENMASK(9, 0) & ((data->tMOD + data->PL + 1 + data->registered_dimm) / 2);
-       regval |= GENMASK(17, 12) & (((data->tMOD + data->PL + 1) / 2) << 12);
+       regval  = GENMASK(9, 0) & (DIV_ROUND_UP_2EVAL(data->tMOD + data->PL, 2) + !!data->registered_dimm);
+       regval |= GENMASK(17, 12) & (DIV_ROUND_UP_2EVAL(data->tMOD + data->PL, 2) << 12); /* tMRD_PAR */
        BS_DDRC_WRITE(port, DRAMTMG3,  regval);
 
        /* configure a DRAMTMG4 reg. */
@@ -434,8 +440,8 @@ int ctrl_init(int port, struct ddr_configuration *data)
 
        /* program ODT timings */
        /* configure a ODTCFG reg. */
-       unsigned dfi_t_cmd_lat = GENMASK(4, 0) & (dfitmg1_val >> 28);
-       int rd_odt_delay = data->CL - data->CWL - (data->rd_preamble_2CK ? 2 : 1) + \
+       unsigned int dfi_t_cmd_lat = GENMASK(4, 0) & (dfitmg1_val >> 28);
+       int rd_odt_delay = data->CL - data->CWL - (data->rd_preamble_2CK ? 2 : 1) +
                        (data->wr_preamble_2CK ? 2 : 1) + dfi_t_cmd_lat;
        if (rd_odt_delay < 0) {
                rd_odt_delay = 0;
@@ -448,7 +454,7 @@ int ctrl_init(int port, struct ddr_configuration *data)
        BS_DDRC_WRITE(port, ODTCFG, regval); /* cons. using wr_preamble */
 
        /* configure a ODTMAP reg. */
-       if (data->dimms == 1 ) {
+       if (data->dimms == 1) {
                /* ODT signal mapping: single DIMM */
                if (data->ranks == 1) {
                        regval = 0x00000201; /* single DIMM, 1-rank ODT mask */
@@ -550,7 +556,8 @@ void ctrl_complete_phy_init(int port, struct ddr_configuration *data)
 
        /* issue dfi_init_start signal (for DRAM init by PHY) (uMCTL2 DataBook p.1567 Table6-8, step 16)
         * WARNING: this is last step of time critical section for RDIMM
-        * (avoid any delay from PHY training complete to dfi_init_start) */
+        * (avoid any delay from PHY training complete to dfi_init_start)
+        */
        BS_DDRC_WRITE(port, DFIMISC, (1 << 6) | (1 << 5));
 
        /* disable Quazi-Dynamic registers programming (uMCTL2 DataBook p.1567 Table6-8, step 17) */
@@ -584,16 +591,18 @@ void ctrl_complete_phy_init(int port, struct ddr_configuration *data)
        BS_DDRC_WRITE(port, DFIMISC, (1 << 6));
 
        /* (uMCTL2 DataBook p.1567 Table6-8, step 21) */
-       unsigned RWSL; /* Read to Write System Latency (as PHY training result) */
+       unsigned int RWSL; /* Read to Write System Latency (as PHY training result) */
+
        if (data->dimms == 1 && data->ranks == 1) {
                RWSL = data->trn_res.rd2wr_CDD_sr; /* single rank constrain */
        } else {
                RWSL = data->trn_res.rd2wr_CDD_mr; /* multi-ranks constrain */
        }
 
-       unsigned rd2wr = data->RL + 4 + 1 + (data->wr_preamble_2CK ? 2 : 1) - data->WL + RWSL; /* see umctl2 Databook for "rd2wr" description */
+       unsigned int rd2wr = data->RL + 4 + 1 + (data->wr_preamble_2CK ? 2 : 1) - data->WL + RWSL; /* see umctl2 Databook for "rd2wr" description */
+
+       unsigned int WWSL; /* Write to Write System Latency (as PHY training result) */
 
-       unsigned WWSL; /* Write to Write System Latency (as PHY training result) */
        if (data->dimms == 1 && data->ranks == 1) {
                WWSL = 0; /* single rank constrain (see PHY PUB databook "Rank-to-Rank Spacing") */
        } else {
@@ -601,7 +610,8 @@ void ctrl_complete_phy_init(int port, struct ddr_configuration *data)
        }
 
        /* increase wr2rd delay by PHY training CDD_WW: see PUB databook 10.2.1.2.2 */
-       unsigned wr2rd;
+       unsigned int wr2rd;
+
        if (data->crc_on && MR5_DM) {
                wr2rd = data->CWL + data->PL + 4 + data->tWTR_L_CRC_DM + WWSL; /* CRC_&_DM on */
        } else {
@@ -609,6 +619,7 @@ void ctrl_complete_phy_init(int port, struct ddr_configuration *data)
        }
 
        uint32_t val = BS_DDRC_READ(port, DRAMTMG2);
+
        val &= ~GENMASK(13, 8);
        val |= GENMASK(13, 8) & (((rd2wr + 1) / 2) << 8);
        val &= ~GENMASK(5, 0);
@@ -616,17 +627,19 @@ void ctrl_complete_phy_init(int port, struct ddr_configuration *data)
        BS_DDRC_WRITE(port, DRAMTMG2, val);
 
        /* tphy_wrcsgap=4 (see phy pub databook) */
-       unsigned wrcsgap = 4 + (data->wr_preamble_2CK ? 1 : 0) + data->crc_on + WWSL;
+       unsigned int wrcsgap = 4 + (data->wr_preamble_2CK ? 1 : 0) + data->crc_on + WWSL;
+
+       unsigned int RRSL; /* Read to Read System Latency (as PHY training result) */
 
-       unsigned RRSL; /* Read to Read System Latency (as PHY training result) */
        if (data->dimms == 1 && data->ranks == 1) {
                RRSL = 0; /* single rank constrain (see PHY PUB databook "Rank-to-Rank Spacing") */
        } else {
                RRSL = data->trn_res.rd2rd_CDD_mr; /* multi-ranks constrain */
        }
 
-       unsigned rdcsgap = 2 + (data->rd_preamble_2CK ? 1 : 0) + RRSL; /* tphy_rdcsgap=2 (see phy pub databook) */
-       unsigned rdcsgap_odt = 5 + (data->rd_preamble_2CK ? 2 : 1) - 2 + RRSL; /* (rd_odt_hold=(5+RD_PREAMBLE)) - BL/2 */
+       unsigned int rdcsgap = 2 + (data->rd_preamble_2CK ? 1 : 0) + RRSL; /* tphy_rdcsgap = 2 (see phy pub databook) */
+       unsigned int rdcsgap_odt = 5 + (data->rd_preamble_2CK ? 2 : 1) - 2 + RRSL; /* (rd_odt_hold = (5 + RD_PREAMBLE)) - BL / 2 */
+
        if (rdcsgap_odt > rdcsgap) {
                rdcsgap = rdcsgap_odt;
        }
@@ -639,11 +652,12 @@ void ctrl_complete_phy_init(int port, struct ddr_configuration *data)
        BS_DDRC_WRITE(port, RANKCTL, val);
 
        /* update DFITMG1 (DFI timing) */
-       unsigned txdqs_dly = data->trn_res.TxDqsDlyMax;
+       unsigned int txdqs_dly = data->trn_res.TxDqsDlyMax;
+
        val = BS_DDRC_READ(port, DFITMG1);
-       /* see PHY PUB DataBook, Table5-3 (p.91) << 16); (t_ctrl_delay+(6+4)+TxDqsDly)/2 */
+       /* see PHY PUB DataBook, Table5-3 (p.91) << 16); (t_ctrl_delay + (6 + 4) + TxDqsDly) / 2 */
        val &= ~GENMASK(20, 16);
-       val |= GENMASK(20, 16) & (((DDR_PHY_TWRDATA_DELAY + txdqs_dly + 1) / 2 + 1));
+       val |= GENMASK(20, 16) & (((DDR_PHY_TWRDATA_DELAY + txdqs_dly + 1) / 2 + 1) << 16);
        BS_DDRC_WRITE(port, DFITMG1, val);
 
        /*  set dfi_init_complete_en to 1 (uMCTL2 DataBook p.1567 Table6-8, step 22) */
index 3807129a5bc835511676012e77b722b9d484e838..c44cbfbd3f16019f659f3a621784091e894128d4 100644 (file)
 void ddr_io_lcru_write(int port, uint32_t offs, int value)
 {
        if (port < 3) {
-               mmio_write_32(DDR0_CMU0_BASE + \
+               mmio_write_32(DDR0_CMU0_BASE +
                        DDR_CTRL_BASE_OFF * port + offs, value);
        } else {
-               mmio_write_32(DDR3_CMU0_BASE + \
+               mmio_write_32(DDR3_CMU0_BASE +
                        DDR_CTRL_BASE_OFF * (port % 3) + offs, value);
        }
 }
@@ -23,10 +23,10 @@ void ddr_io_lcru_write(int port, uint32_t offs, int value)
 void ddr_io_gpr_write(int port, uint32_t offs, int value)
 {
        if (port < 3) {
-               mmio_write_32(DDR0_GPR_BASE + \
+               mmio_write_32(DDR0_GPR_BASE +
                        DDR_CTRL_BASE_OFF * port + offs, value);
        } else {
-               mmio_write_32(DDR3_GPR_BASE + \
+               mmio_write_32(DDR3_GPR_BASE +
                        DDR_CTRL_BASE_OFF * (port % 3) + offs, value);
        }
 }
@@ -34,22 +34,21 @@ void ddr_io_gpr_write(int port, uint32_t offs, int value)
 void ddr_io_phy_write(int port, uint32_t offs, int value)
 {
        if (port < 3) {
-               mmio_write_32(DDR0_PHY_BASE + \
+               mmio_write_32(DDR0_PHY_BASE +
                        DDR_CTRL_BASE_OFF * port + offs, value);
        } else {
-               mmio_write_32(DDR3_PHY_BASE + \
+               mmio_write_32(DDR3_PHY_BASE +
                        DDR_CTRL_BASE_OFF * (port % 3) + offs, value);
        }
 }
 
-
 void ddr_io_ctrl_write(int port, uint32_t offs, int value)
 {
        if (port < 3) {
-               mmio_write_32(DDR0_CTRL_BASE + \
+               mmio_write_32(DDR0_CTRL_BASE +
                        DDR_CTRL_BASE_OFF * port + offs, value);
        } else {
-               mmio_write_32(DDR3_CTRL_BASE + \
+               mmio_write_32(DDR3_CTRL_BASE +
                        DDR_CTRL_BASE_OFF * (port % 3) + offs, value);
        }
 }
@@ -57,10 +56,10 @@ void ddr_io_ctrl_write(int port, uint32_t offs, int value)
 uint32_t ddr_io_lcru_read(int port, uint32_t offs)
 {
        if (port < 3) {
-               return mmio_read_32(DDR0_CMU0_BASE + \
+               return mmio_read_32(DDR0_CMU0_BASE +
                        DDR_CTRL_BASE_OFF * port + offs);
        } else {
-               return mmio_read_32(DDR3_CMU0_BASE + \
+               return mmio_read_32(DDR3_CMU0_BASE +
                        DDR_CTRL_BASE_OFF * (port % 3) + offs);
        }
 }
@@ -68,10 +67,10 @@ uint32_t ddr_io_lcru_read(int port, uint32_t offs)
 uint32_t ddr_io_gpr_read(int port, uint32_t offs)
 {
        if (port < 3) {
-               return mmio_read_32(DDR0_GPR_BASE + \
+               return mmio_read_32(DDR0_GPR_BASE +
                        DDR_CTRL_BASE_OFF * port + offs);
        } else {
-               return mmio_read_32(DDR3_GPR_BASE + \
+               return mmio_read_32(DDR3_GPR_BASE +
                        DDR_CTRL_BASE_OFF * (port % 3) + offs);
        }
 }
@@ -79,22 +78,21 @@ uint32_t ddr_io_gpr_read(int port, uint32_t offs)
 uint32_t ddr_io_phy_read(int port, uint32_t offs)
 {
        if (port < 3) {
-               return mmio_read_32(DDR0_PHY_BASE + \
+               return mmio_read_32(DDR0_PHY_BASE +
                        DDR_CTRL_BASE_OFF * port + offs);
        } else {
-               return mmio_read_32(DDR3_PHY_BASE + \
+               return mmio_read_32(DDR3_PHY_BASE +
                        DDR_CTRL_BASE_OFF * (port % 3) + offs);
        }
 }
 
-
 uint32_t ddr_io_ctrl_read(int port, uint32_t offs)
 {
        if (port < 3) {
-               return mmio_read_32(DDR0_CTRL_BASE + \
+               return mmio_read_32(DDR0_CTRL_BASE +
                        DDR_CTRL_BASE_OFF * port + offs);
        } else {
-               return mmio_read_32(DDR3_CTRL_BASE + \
+               return mmio_read_32(DDR3_CTRL_BASE +
                        DDR_CTRL_BASE_OFF * (port % 3) + offs);
        }
 }
index 1f9a70bf5e28e4104a98d6dfafeffeb088fd60db..27ac9705e096b8604a302af3bfd3ff25c57117d3 100644 (file)
@@ -25,7 +25,7 @@
 #define BAIKAL_TFW_RDIMM_OFFS  BAIKAL_TFW_UDIMM_SIZE
 
 int ddr_init_ecc_memory(int port);
-int ddr_odt_configuration(const unsigned port,
+int ddr_odt_configuration(const unsigned int port,
                           struct ddr_configuration *const data);
 
 uint8_t firmware_container[55036];
@@ -52,58 +52,58 @@ static uint64_t ddr_get_addr_strip_bit(int channels, const void *spd)
                bytes[2] = 0;
        } else if (channels == 6) {
                int capacity_gb = spd_get_baseconf_dimm_capacity(spd) / 1024 / 1024 / 1024;
+
                switch (capacity_gb) {
                case 1:
-               /*   1GB DRAM size per SN-F addressing */
+               /*   1 GiB DRAM size per SN-F addressing */
                        bytes[0] = 28;
                        bytes[1] = 31;
                        bytes[2] = 35;
                        break;
                case 2:
-               /*   2GB DRAM size per SN-F addressing */
+               /*   2 GiB DRAM size per SN-F addressing */
                        bytes[0] = 28;
                        bytes[1] = 32;
                        bytes[2] = 33;
                        break;
                case 4:
-               /*   4GB DRAM size per SN-F addressing */
+               /*   4 GiB DRAM size per SN-F addressing */
                        bytes[0] = 28;
                        bytes[1] = 33;
                        bytes[2] = 34;
                        break;
                case 8:
-               /*   8GB DRAM size per SN-F addressing */
+               /*   8 GiB DRAM size per SN-F addressing */
                        bytes[0] = 33;
                        bytes[1] = 34;
                        bytes[2] = 39;
                        break;
                case 16:
-               /*  16GB DRAM size per SN-F addressing */
+               /*  16 GiB DRAM size per SN-F addressing */
                        bytes[0] = 28;
                        bytes[1] = 36;
                        bytes[2] = 39;
                        break;
                case 32:
-               /*  32GB DRAM size per SN-F addressing */
+               /*  32 GiB DRAM size per SN-F addressing */
                        bytes[0] = 28;
                        bytes[1] = 36;
                        bytes[2] = 37;
                        break;
                case 64:
-               /*  64GB DRAM size per SN-F addressing */
+               /*  64 GiB DRAM size per SN-F addressing */
                        bytes[0] = 28;
                        bytes[1] = 37;
                        bytes[2] = 38;
                        break;
                case 128:
-               /* 128GB DRAM size per SN-F addressing */
+               /* 128 GiB DRAM size per SN-F addressing */
                        bytes[0] = 37;
                        bytes[1] = 38;
                        bytes[2] = 43;
                        break;
                default:
-                       ERROR("Can't configure CMN"
-                       " - incorrect DRAM size=%dGB\n", capacity_gb);
+                       ERROR("Can't configure CMN - incorrect DRAM size = %d GiB\n", capacity_gb);
                        return -1;
                }
        } else {
@@ -243,6 +243,7 @@ int dram_init(void)
        for (int dimm_idx = 0; dimm_idx < 6; ++dimm_idx) {
                if (conf & (1 << (dimm_idx * 2))) {
                        int dual_channel_mode = (conf & (1 << (dimm_idx * 2 + 1))) ? 1 : 0;
+
                        spd_content = (struct ddr4_spd_eeprom *)baikal_dimm_spd_get(dimm_idx * 2);
                        ret = ddr_port_init(dimm_idx, spd_content, channels, dual_channel_mode);
                        if (ret) {
index 2a3e4930991fca77437ea4d50cbc245d6f6f416f..ab5a7b4b96a1a99190a2000a4ce54025849fc999 100644 (file)
@@ -29,8 +29,9 @@ struct ddr_configuration {
        uint32_t dbus_half;     /* this is user defined flag to turn on/off half DDR data bus mode */
        uint32_t par_on;        /* this is user defined flag to turn on/off CA PARITY support */
        uint32_t crc_on;        /* this is user defined flag to turn on/off CRC support */
-       uint32_t phy_eql;       /* this is user defined flag to turn on/off PHY equalization
-                                                       (0-off; 1-DFE(rx); 2-FFE(tx); 3-(DFE+FFE)) */
+       uint32_t phy_eql;       /* this is user defined flag to turn on/off PHY equalization:
+                                * (0-off; 1-DFE(rx); 2-FFE(tx); 3-(DFE+FFE))
+                                */
        uint32_t clock_mhz;     /* DRAM clock (MHz) (for example 1200 MHz for DDR4-2400) */
 
        uint32_t dimms;
@@ -57,59 +58,43 @@ struct ddr_configuration {
        uint32_t tRAS;          /* ACT to PRE command period */
        uint32_t tRC;           /* ACT to ACT or REF command period */
        uint32_t tRCD;          /* ACT to internal read or write delay time */
-       uint32_t tWTR_S;        /* Write to Read time for different bank
-                                                  group */
+       uint32_t tWTR_S;        /* Write to Read time for different bank group */
        uint32_t tWTR_L;        /* Write to Read time for same bank group */
-       uint32_t tRRD_S;        /* ACTIVATE to ACTIVATE Command delay to
-                                                  different bank group */
-       uint32_t tRRD_L;        /* ACTIVATE to ACTIVATE Command delay to
-                                                  same bank group */
+       uint32_t tRRD_S;        /* ACTIVATE to ACTIVATE Command delay to different bank group */
+       uint32_t tRRD_L;        /* ACTIVATE to ACTIVATE Command delay to same bank group */
        uint32_t tFAW;          /* Four Activate Window delay time */
        uint32_t tRFC1;         /* Refresh Cycle time in 1x mode */
        uint32_t tRFC4;         /* Refresh Cycle time in 4x mode */
        uint32_t tREFI;         /* Periodic Refresh Interval */
        uint32_t tRTP;          /* Read to Precharge for autoprecharge */
-       uint32_t tWR_CRC_DM;    /* Write Recovery time when CRC and DM
-                                                          are enabled */
-       uint32_t tWTR_S_CRC_DM; /* Write to Read time for different bank group
-                                                  with both CRC and DM enabled */
-       uint32_t tWTR_L_CRC_DM; /* Write to Read time for same bank group
-                                                  with both CRC and DM enabled */
+       uint32_t tWR_CRC_DM;    /* Write Recovery time when CRC and DM are enabled */
+       uint32_t tWTR_S_CRC_DM; /* Write to Read time for different bank group with both CRC and DM enabled */
+       uint32_t tWTR_L_CRC_DM; /* Write to Read time for same bank group with both CRC and DM enabled */
        uint32_t tDLLK;         /* DLL Locking time */
        uint32_t tXP;           /* Exit Power Down with DLL on */
        uint32_t tMOD;          /* Mode Register Set time */
-       uint32_t tCCD_S;        /* CAS_n to CAS_n command Delay for different
-                                                  bank group */
-       uint32_t tCCD_L;        /* CAS_n to CAS_n command Delay for same bank
-                                                  group */
-       uint32_t tCKSRX;        /* Valid Clock Requirement before Self Refresh
-                                                  Exit or Power-Down Exit or Reset Exit */
+       uint32_t tCCD_S;        /* CAS_n to CAS_n command Delay for different bank group */
+       uint32_t tCCD_L;        /* CAS_n to CAS_n command Delay for same bank group */
+       uint32_t tCKSRX;        /* Valid Clock Requirement before Self Refresh Exit or Power-Down Exit or Reset Exit */
        uint32_t tCKE;          /* CKE minimum pulse width */
        uint32_t tMRD;          /* MRS command cycle time */
-       uint32_t tMRD_PDA;      /* Mode Register Set command cycle time
-                                                  in PDA mode */
+       uint32_t tMRD_PDA;      /* Mode Register Set command cycle time in PDA mode */
        uint32_t tRASmax;       /* Maximum ACT to PRE command period */
        uint32_t tMPX_S;        /* CS setup time to CKE */
        uint32_t tMPX_LH;       /* CS_n Low hold time to CKE rising edge */
        uint32_t tCPDED;        /* Command pass disable delay */
-       uint32_t tXS;           /* Exit Self Refresh to commands not requiring
-                                                  a locked DLL */
+       uint32_t tXS;           /* Exit Self Refresh to commands not requiring a locked DLL */
        uint32_t tXS_FAST;      /* Exit Self Refresh to ZQCL,ZQCS and MRS */
-       uint32_t tXS_ABORT;     /* SRX to commands not requiring a locked DLL
-                                                  in Self Refresh ABORT */
-       uint32_t tXSDLL;        /* Exit Self Refresh to tXSDLL commands
-                                                  requiring a locked DLL */
-       uint32_t tXMP;          /* Exit MPSM to commands not requiring
-                                                  a locked DLL */
-       uint32_t tXMPDLL;       /* Exit MPSM to commands requiring
-                                                  a locked DLL */
+       uint32_t tXS_ABORT;     /* SRX to commands not requiring a locked DLL in Self Refresh ABORT */
+       uint32_t tXSDLL;        /* Exit Self Refresh to tXSDLL commands requiring a locked DLL */
+       uint32_t tXMP;          /* Exit MPSM to commands not requiring a locked DLL */
+       uint32_t tXMPDLL;       /* Exit MPSM to commands requiring a locked DLL */
        uint32_t tCKMPE;        /* Valid clock requirement after MPSM entry */
 
        uint32_t CL;            /* CAS Latency */
        uint32_t CWL;           /* CAS Write Latency */
        uint32_t CWL_ALT;       /* CWL alternative (when write preamble is 2CK - special PHY training setting) */
-       uint32_t WCL;           /* Write Command Latency when CRC and DM
-                                                  are both enabled */
+       uint32_t WCL;           /* Write Command Latency when CRC and DM are both enabled */
        uint32_t PL;            /* C/A Parity Latency */
        uint32_t AL;            /* Additive Latency */
        uint32_t RL;            /* Read Latency */
index 8bd794aa8b798dfe1b564a9e3ca830e1e60da53d..aca346062f8b436fb59da29cef98a054861c7043 100644 (file)
@@ -56,6 +56,7 @@ uint16_t set_mr0(const uint32_t cl, uint32_t wr)
 uint16_t set_mr1(uint32_t odi, uint32_t rtt_nom)
 {
        uint16_t mr1_reg = 0;
+
        mr1_reg |= (MR1_Q_OFF & 0x1) << 12;
        mr1_reg |= (MR1_TDQS & 0x1) << 11;
        mr1_reg |= (rtt_nom & 0x7) << 8;
@@ -89,6 +90,7 @@ uint16_t set_mr2(uint32_t cwl, uint32_t rtt_wr, uint32_t ddr_crc)
 uint16_t set_mr3(uint32_t wcl, uint32_t fg_rfsh)
 {
        uint16_t mr3_reg = 0;
+
        mr3_reg |= (MR3_MPR_RD_FORMAT & 0x3) << 11;
        /* A10:A9  WCL_CRC_DM: Write CMD Latency when CRC and DM are enabled */
        mr3_reg |= ((wcl - 4) & 0x3) << 9;
@@ -105,6 +107,7 @@ uint16_t set_mr3(uint32_t wcl, uint32_t fg_rfsh)
 uint16_t set_mr4(uint32_t wr_pre_2ck, uint32_t rd_pre_2ck)
 {
        uint16_t mr4_reg = 0;
+
        mr4_reg |= (MR4_HPPR & 0x1) << 13;
        mr4_reg |= (!!wr_pre_2ck) << 12;
        mr4_reg |= (!!rd_pre_2ck) << 11;
@@ -161,11 +164,6 @@ int ddr_config_by_spd(int port,
        uint32_t tmp;
 
        data->dimms = 1;
-#ifdef BAIKAL_DUAL_CHANNEL_MODE
-       if (spd_content.dual_channel[port] == 'y') {
-               data->dimms = 2;
-       }
-#endif
        /*
         * The SPD spec has not the burst length byte, but DDR4 spec has
         * nature BL8 and BC4, BL8 -bit3, BC4 -bit2.
@@ -254,16 +252,6 @@ int ddr_config_by_spd(int port,
                data->tCK = 1000000 / data->clock_mhz;
        }
 #endif
-
-#ifdef BAIKAL_DUAL_CHANNEL_MODE
-#ifdef BAIKAL_DBM20
-       if (spd_content.dual_channel[port] == 'y') {
-               data->clock_mhz = 800; /* 1600 MHz in double rate */
-               data->tCK = 1000000 / data->clock_mhz;
-       }
-#endif
-#endif /* BAIKAL_DUAL_CHANNEL_MODE */
-
        /* Compute CAS Latency (CL) */
        uint64_t lat_mask = ((uint64_t)spd->caslat_b1 << 7)  |
                            ((uint64_t)spd->caslat_b2 << 15) |
index 43e0426f2b7dea7b92d9379e6c64b81929b28dbe..b73884e2310288dc39fce29c24c897f83fc03e4b 100644 (file)
@@ -47,7 +47,6 @@
        (uint32_t)((((uint64_t)(x) * 1000) / data->tCK + 974) / 1000)
 #define CLOCK_NS(x)    CLOCK_PS((uint64_t)(x) * 1000)
 
-
 uint16_t set_mr0(const uint32_t cl, uint32_t wr);
 uint16_t set_mr1(uint32_t odi, uint32_t rtt_nom);
 uint16_t set_mr2(uint32_t cwl, uint32_t rtt_wr, uint32_t ddr_crc);
index 49698b9c1c8e50fad2ac00fbf0c2adf9c48dea3a..27780e167d6a733e9dac274e754ea0e8186b9097 100644 (file)
@@ -31,6 +31,7 @@ void ddrlcru_core_reset_off(int port)
 {
        /* Enable ADB400 */
        uint32_t val = 0x17 << 11;
+
        ddr_io_lcru_write(port, DDRLCRU_GPR_OFFS + ADBFNCCR, val);
 
        /* deassert all resets (Deasserting DDR SS Core and AXI Resets) */
@@ -107,6 +108,7 @@ int ddr_lcpcmd_set_speedbin(int port, int clock_mhz)
        /* send command to LCP */
        uint32_t mode;
        enum cmd_type_t type = CMD_DDRSPEEDBIN_SET;
+
        switch (clock_mhz) {
        case DDRSB_1600:
                mode = CMU_DDR4_1600;
index be04d3d378c9794b91db3bed2e35dab4a791cfbc..632cf62c262cf4c5f1013d0ba18ef5c0ab13527d 100644 (file)
@@ -33,10 +33,10 @@ static const struct odt_settings dram_odt_set[] = {
        { 0, 2, 7, 4, 102, 30, 80, 34 }
 };
 
-int ddr_odt_configuration(const unsigned port,
-                          struct ddr_configuration *const data)
+int ddr_odt_configuration(const unsigned int port,
+                         struct ddr_configuration *const data)
 {
-       unsigned odt_set;
+       unsigned int odt_set;
 
        if (data->dimms == 1) {
                if (data->ranks == 1) {
index 4dfcf59b59183fa8e856d4f745ac6c32e6c6567e..af6fb91bf961029790f3d8d118f3ed0f0953972b 100644 (file)
@@ -83,8 +83,7 @@ struct ddr4_spd_eeprom {
                        uint8_t mod_thickness;
                        /* 130 (Unbuffered) Reference Raw Card Used */
                        uint8_t ref_raw_card;
-                       /* 131 (Unbuffered) Address Mapping from
-                             Edge Connector to DRAM */
+                       /* 131 (Unbuffered) Address Mapping from Edge Connector to DRAM */
                        uint8_t addr_mapping;
                        /* 132~253 (Unbuffered) Reserved */
                        uint8_t res_132[254 - 132];
index 4c319261926a2d3fdf0a36d8a27fcd72a7ef2417..a6f769f96348a1599c72022fe1805fcbf8509033 100644 (file)
@@ -26,6 +26,7 @@
 void phyinit_calcMb(void *mb, struct ddr_configuration *data, int training_2d)
 {
        struct pmu_smb_ddr4_t *pmu_smb_p = (struct pmu_smb_ddr4_t *)mb;
+
        memset(pmu_smb_p, 0, sizeof(struct pmu_smb_ddr4_t));
 
        pmu_smb_p->Pstate = 0x0;
@@ -108,8 +109,10 @@ void phyinit_calcMb(void *mb, struct ddr_configuration *data, int training_2d)
 
        /* If Share2DVrefResult[x] = 1, pstate x will use the per-lane VrefDAC0/1 CSRs which can be trained by 2d training. */
        /* If 2D has not run yet, VrefDAC0/1 will default to pstate 0's 1D phyVref messageBlock setting. */
-       /* If Share2DVrefResult[x] = 0, pstate x will use the per-phy VrefInGlobal CSR,
-        * which are set to pstate x's 1D phyVref messageBlock setting. */
+       /*
+        * If Share2DVrefResult[x] = 0, pstate x will use the per-phy VrefInGlobal CSR,
+        * which are set to pstate x's 1D phyVref messageBlock setting.
+        */
        pmu_smb_p->Share2DVrefResult = 0x1; /* Bitmap that controls which vref generator the phy will use per pstate */;
 
        if (training_2d) {
@@ -142,7 +145,7 @@ void phyinit_calcMb(void *mb, struct ddr_configuration *data, int training_2d)
 
        if (data->registered_dimm) {
                /* Only content of the Control Word is required to be programmed. */
-                uint16_t tmp = 0;
+               uint16_t tmp = 0;
                /* F0RC0D */
                if (data->mirrored_dimm) {
                        pmu_smb_p->F0RC0D_D0 = 0x4 | (pmu_smb_p->CsPresentD0) ? 0x8 : 0x0;
index 342778d6e9529abe203941d974072f53b1992ab2..121fbf2333d6f652ad0774b6a6b1b9a02258a3db 100644 (file)
 #include "ddr_phy_tmp_regs.h"
 
 #define NUMBER_ANIB    12
-/* Enable Write DQS Extension feature of PHY.
- * See "DesignWare Cores LPDDR4 MultiPHY, WDQS Extension Application Note" */
+/*
+ * Enable Write DQS Extension feature of PHY.
+ * See "DesignWare Cores LPDDR4 MultiPHY, WDQS Extension Application Note"
+ */
 #define WDQSEXT                0
 #define SNPS_UMCTLOPT  0
 #define EXTCALRES_VAL  0
 
 void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
 {
-       /* Program TxSlewRate:
+       /*
+        * Program TxSlewRate:
         * - TxSlewRate::TxPreDrvMode is dependent on DramType.
         * - TxSlewRate::TxPreP and TxSlewRate::TxPreN are technology-specific
         * User should consult the "Output Slew Rate" section of HSpice Model App Note
-        * in specific technology for recommended settings */
+        * in specific technology for recommended settings
+        */
        const int TxPreP = 0xf; /* Default to 0xf (max). Optimal setting is technology specific. */
        const int TxPreN = 0xf; /* Default to 0xf (max). Optimal setting is technology specific. */
        const int TxPreDrvMode = 0x2;
-       const int TxSlewRate = (TxPreDrvMode << csr_TxPreDrvMode_LSB) | \
+       const int TxSlewRate = (TxPreDrvMode << csr_TxPreDrvMode_LSB) |
                        (TxPreN << csr_TxPreN_LSB) | (TxPreP << csr_TxPreP_LSB);
 
-       unsigned byte;
+       unsigned int byte;
+
        for (byte = 0; byte < 9; byte++) {
-               for (unsigned lane = 0; lane <= 1; lane++) {
-                        unsigned b_addr = lane << 8;
-                        unsigned c_addr = byte << 12;
-                        DDRPHY_WRITE_REG16(port, (tDBYTE | c_addr | b_addr | csr_TxSlewRate_ADDR), TxSlewRate);
+               for (unsigned int lane = 0; lane <= 1; lane++) {
+                       unsigned int b_addr = lane << 8;
+                       unsigned int c_addr = byte << 12;
+
+                       DDRPHY_WRITE_REG16(port, (tDBYTE | c_addr | b_addr | csr_TxSlewRate_ADDR), TxSlewRate);
                }
        }
 
-       /* Program ATxSlewRate:
+       /*
+        * Program ATxSlewRate:
         * - ATxSlewRate::ATxPreDrvMode is dependent on DramType and whether the ACX4 instance is used for AC or CK
         * - ATxSlewRate::ATxPreP and ATxSlewRate::TxPreN are technology-specific
         * User should consult the "Output Slew Rate" section of HSpice Model App Note
-        * in specific technology for recommended settings */
-       unsigned anib;
+        * in specific technology for recommended settings
+        */
+       unsigned int anib;
+
        for (anib = 0; anib < NUMBER_ANIB; anib++) {
                /* # of ANIBs CK ANIB Instance */
                /* ACX8         ANIB 1 */
@@ -55,7 +64,8 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
                /* ACX13        ANIB 4,5 */
 
                int ATxPreDrvMode;
-               if (anib == 0x4 || anib == 0x5 ) {
+
+               if (anib == 0x4 || anib == 0x5) {
                        /* CK ANIB instance */
                        ATxPreDrvMode = 0x0;
                } else {
@@ -65,11 +75,12 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
 
                const int ATxPreP = 0xf; /* Default to 0xf (max). Optimal setting is technology specific. */
                const int ATxPreN = 0xf; /* Default to 0xf (max). Optimal setting is technology specific. */
-               const int ATxSlewRate = (ATxPreDrvMode << csr_ATxPreDrvMode_LSB) | \
+               const int ATxSlewRate = (ATxPreDrvMode << csr_ATxPreDrvMode_LSB) |
                                (ATxPreN << csr_ATxPreN_LSB) | (ATxPreP << csr_ATxPreP_LSB);
 
-               unsigned c_addr = anib << 12;
-               DDRPHY_WRITE_REG16(port,(tANIB | c_addr | csr_ATxSlewRate_ADDR), ATxSlewRate);
+               unsigned int c_addr = anib << 12;
+
+               DDRPHY_WRITE_REG16(port, (tANIB | c_addr | csr_ATxSlewRate_ADDR), ATxSlewRate);
        }
 
        if (data->registered_dimm) {
@@ -79,6 +90,7 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
 
        /* Program PllCtrl2: Calculate PLL controls per p-state from Frequency */
        int PllCtrl2;
+
        if (data->clock_mhz / 2 < 235) {
                PllCtrl2 = 0x7;
        } else if (data->clock_mhz / 2 < 313) {
@@ -97,7 +109,8 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
 
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_PllCtrl2_ADDR), PllCtrl2);
 
-       /* Program ARdPtrInitVal:
+       /*
+        * Program ARdPtrInitVal:
         * - The values programmed here assume ideal properties of DfiClk and Pclk including:
         * - DfiClk skew
         * - DfiClk jitter
@@ -110,8 +123,10 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
         * - For MemClk frequency < 933MHz, the valid range of ARdPtrInitVal_p0[3:0] is: 1-6
         * - PLL Enabled mode:
         * - For MemClk frequency > 933MHz, the valid range of ARdPtrInitVal_p0[3:0] is: 1-6
-        * - For MemClk frequency < 933MHz, the valid range of ARdPtrInitVal_p0[3:0] is: 0-6 */
+        * - For MemClk frequency < 933MHz, the valid range of ARdPtrInitVal_p0[3:0] is: 0-6
+        */
        int ARdPtrInitVal;
+
        if (data->clock_mhz >= 933) {
                ARdPtrInitVal = 0x2;
        } else {
@@ -120,7 +135,8 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
 
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_ARdPtrInitVal_ADDR), ARdPtrInitVal);
 
-       /* Program DbyteDllModeCntrl:
+       /*
+        * Program DbyteDllModeCntrl:
         * - DllRxPreambleMode
         * Program DqsPreambleControl:
         * - Fields:
@@ -129,26 +145,28 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
         * - PositionDfeInit
         * - LP4TglTwoTckTxDqsPre
         * - LP4PostambleExt
-        * - LP4SttcPreBridgeRxEn */
-       int TwoTckRxDqsPre = (!!data->rd_preamble_2CK);
+        * - LP4SttcPreBridgeRxEn
+        */
+       int TwoTckRxDqsPre = !!data->rd_preamble_2CK;
        const int LP4SttcPreBridgeRxEn = 0x0;
        const int DllRxPreambleMode = 0x1;
-       int TwoTckTxDqsPre = (!!data->wr_preamble_2CK);
+       int TwoTckTxDqsPre = !!data->wr_preamble_2CK;
        const int LP4TglTwoTckTxDqsPre = 0x0;
        const int PositionDfeInit = 0x2;
        const int LP4PostambleExt = 0x0;
 
        const int WDQSEXTENSION = 0;
-       int DqsPreambleControl = (WDQSEXTENSION << csr_WDQSEXTENSION_LSB) | \
-                       (LP4SttcPreBridgeRxEn << csr_LP4SttcPreBridgeRxEn_LSB) | \
-                       (LP4PostambleExt << csr_LP4PostambleExt_LSB) | \
-                       (LP4TglTwoTckTxDqsPre << csr_LP4TglTwoTckTxDqsPre_LSB) | \
-                       (PositionDfeInit << csr_PositionDfeInit_LSB) | \
-                       (TwoTckTxDqsPre << csr_TwoTckTxDqsPre_LSB) | \
+       int DqsPreambleControl = (WDQSEXTENSION << csr_WDQSEXTENSION_LSB) |
+                       (LP4SttcPreBridgeRxEn << csr_LP4SttcPreBridgeRxEn_LSB) |
+                       (LP4PostambleExt << csr_LP4PostambleExt_LSB) |
+                       (LP4TglTwoTckTxDqsPre << csr_LP4TglTwoTckTxDqsPre_LSB) |
+                       (PositionDfeInit << csr_PositionDfeInit_LSB) |
+                       (TwoTckTxDqsPre << csr_TwoTckTxDqsPre_LSB) |
                        (TwoTckRxDqsPre << csr_TwoTckRxDqsPre_LSB);
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_DqsPreambleControl_ADDR), DqsPreambleControl);
 
        int DbyteDllModeCntrl = DllRxPreambleMode << csr_DllRxPreambleMode_LSB;
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_DbyteDllModeCntrl_ADDR), DbyteDllModeCntrl);
 
        const int DllGainIV = 0x1;
@@ -162,9 +180,11 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_DllLockParam_ADDR), DllLockParam);
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_DllGainCtl_ADDR), DllGainCtl);
 
-       /* Program ProcOdtTimeCtl:
+       /*
+        * Program ProcOdtTimeCtl:
         * - POdtStartDelay[3:2]
-        * - POdtTailWidth[1:0] */
+        * - POdtTailWidth[1:0]
+        */
        int ProcOdtTimeCtl;
 
        if (WDQSEXT) {
@@ -182,80 +202,100 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
                /* Memclk Freq > 1200MHz */
        } else {
                if (TwoTckRxDqsPre == 1) {
-                       ProcOdtTimeCtl = 0x3;/* POdtStartDelay = 0x0, POdtTailWidth = 0x3 */
+                       ProcOdtTimeCtl = 0x3; /* POdtStartDelay = 0x0, POdtTailWidth = 0x3 */
                } else {
-                       ProcOdtTimeCtl = 0x7;/* POdtStartDelay = 0x1, POdtTailWidth = 0x3 */
+                       ProcOdtTimeCtl = 0x7; /* POdtStartDelay = 0x1, POdtTailWidth = 0x3 */
                }
        }
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_ProcOdtTimeCtl_ADDR), ProcOdtTimeCtl);
 
-       /* Program TxOdtDrvStren:
+       /*
+        * Program TxOdtDrvStren:
         * - ODTStrenP_px[5:0]
-        * - ODTStrenN_px[11:6] */
+        * - ODTStrenN_px[11:6]
+        */
        int ODTStrenP = phyinit_mapDrvStren(data->PHY_ODT, ODTStrenP_T);
        int ODTStrenN = phyinit_mapDrvStren(data->PHY_ODT, ODTStrenN_T);
        int TxOdtDrvStren = (ODTStrenN << csr_ODTStrenN_LSB) | ODTStrenP;
+
        for (byte = 0; byte < 9; byte++) {
-               for (unsigned lane = 0; lane <= 1; lane++) {
-                       unsigned b_addr = lane << 8;
-                       unsigned c_addr = byte << 12;
+               for (unsigned int lane = 0; lane <= 1; lane++) {
+                       unsigned int b_addr = lane << 8;
+                       unsigned int c_addr = byte << 12;
+
                        DDRPHY_WRITE_REG16(port, (tDBYTE | c_addr | b_addr | csr_TxOdtDrvStren_ADDR), TxOdtDrvStren);
                }
        }
 
-       /* Program TxImpedanceCtrl1:
+       /*
+        * Program TxImpedanceCtrl1:
         * - DrvStrenFSDqP[5:0]
-        * - DrvStrenFSDqN[11:6] */
+        * - DrvStrenFSDqN[11:6]
+        */
        int DrvStrenFSDqP = phyinit_mapDrvStren(data->PHY_ODI, DrvStrenFSDqP_T);
        int DrvStrenFSDqN = phyinit_mapDrvStren(data->PHY_ODI, DrvStrenFSDqN_T);
        int TxImpedanceCtrl1 = (DrvStrenFSDqN << csr_DrvStrenFSDqN_LSB) | (DrvStrenFSDqP << csr_DrvStrenFSDqP_LSB);
+
        for (byte = 0; byte < 9; byte++) {
-               for (unsigned lane = 0; lane <= 1; lane++) {
-                       unsigned b_addr = lane << 8;
-                       unsigned c_addr = byte << 12;
-                       DDRPHY_WRITE_REG16(port, \
-                               (tDBYTE | c_addr | b_addr | csr_TxImpedanceCtrl1_ADDR), \
+               for (unsigned int lane = 0; lane <= 1; lane++) {
+                       unsigned int b_addr = lane << 8;
+                       unsigned int c_addr = byte << 12;
+
+                       DDRPHY_WRITE_REG16(port,
+                               (tDBYTE | c_addr | b_addr | csr_TxImpedanceCtrl1_ADDR),
                                TxImpedanceCtrl1);
                }
        }
 
-       /* Program ATxImpedance:
-       *       - ADrvStrenP[4:0]
-       *       - ADrvStrenN[9:5] */
+       /*
+        * Program ATxImpedance:
+        *      - ADrvStrenP[4:0]
+        *      - ADrvStrenN[9:5]
+        */
        int ATxImpedance_config = 20;
 
        for (anib = 0; anib < NUMBER_ANIB; anib++) {
                const int ADrvStrenP = phyinit_mapDrvStren(ATxImpedance_config, ADrvStrenP_T);
                const int ADrvStrenN = phyinit_mapDrvStren(ATxImpedance_config, ADrvStrenN_T);
                const int ATxImpedance = (ADrvStrenN << csr_ADrvStrenN_LSB) | (ADrvStrenP << csr_ADrvStrenP_LSB);
-               unsigned c_addr = anib << 12;
+               unsigned int c_addr = anib << 12;
+
                DDRPHY_WRITE_REG16(port, (tANIB | c_addr | csr_ATxImpedance_ADDR), ATxImpedance);
        }
 
        /* Program DfiMode */
        int DfiMode = 0x1; /* DFI1 does not physically exists */
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_DfiMode_ADDR), DfiMode);
 
-       /* Program DfiCAMode:
+       /*
+        * Program DfiCAMode:
         * - DfiLp3CAMode
         * - DfiD4CAMode
         * - DfiLp4CAMode
-        * - DfiD4AltCAMode */
+        * - DfiD4AltCAMode
+        */
        int DfiCAMode = 2; /* DDR4 */
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_DfiCAMode_ADDR), DfiCAMode);
 
-       /* Program CalDrvStr0:
+       /*
+        * Program CalDrvStr0:
         * - CalDrvStrPd50[3:0]
-        * - CalDrvStrPu50[7:4] */
+        * - CalDrvStrPu50[7:4]
+        */
        uint16_t CalDrvStrPu50 = EXTCALRES_VAL;
 
        uint16_t CalDrvStrPd50 = CalDrvStrPu50;
        uint16_t CalDrvStr0 = (CalDrvStrPu50 << csr_CalDrvStrPu50_LSB) | CalDrvStrPd50;
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_CalDrvStr0_ADDR), CalDrvStr0);
 
        /* Program CalUclkInfo: Impedance calibration CLK Counter. */
        /* number of DfiClk cycles per 1us - round up */
        uint16_t CalUClkTicksPer1uS = (data->clock_mhz + 1) / 2;
+
        if (CalUClkTicksPer1uS < 24) {
                CalUClkTicksPer1uS = 24; /* Minimum value of CalUClkTicksPer1uS = 24 */
        }
@@ -274,6 +314,7 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
        int CalInterval = 0x9;
        int CalOnce = 0x0;
        int CalRate = (CalOnce << csr_CalOnce_LSB) | (CalInterval << csr_CalInterval_LSB);
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_CalRate_ADDR), CalRate);
 
        /* Program VrefInGlobal:
@@ -297,7 +338,8 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
         *      - MajorModeDbyte
         *      - ExtVrefRange
         *      - DfeCtrl
-        *      - GainCurrAdj */
+        *      - GainCurrAdj
+        */
        int MajorModeDbyte = 3; /* DDR4 */
 
        const int SelAnalogVref = 1; /* Use Global VREF from Master */
@@ -310,6 +352,7 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
        uint8_t GlobalVrefInSel = 0x4;
        /* check range1 first. Only use range0 if customer input maxes out range1 */
        uint8_t GlobalVrefInDAC = (uint8_t)((vref_percentVddq / 500) + 1); /* Min value is 1 */
+
        if (GlobalVrefInDAC > 127) {
                GlobalVrefInDAC = (uint8_t)((vref_percentVddq - 34500) / 500);
                if (GlobalVrefInDAC < 1) {
@@ -322,32 +365,37 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
        }
 
        int VrefInGlobal = (GlobalVrefInDAC << csr_GlobalVrefInDAC_LSB) | GlobalVrefInSel;
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_VrefInGlobal_ADDR), VrefInGlobal);
 
-       int DqDqsRcvCntrl = (GainCurrAdj_defval << csr_GainCurrAdj_LSB) | \
-                       (MajorModeDbyte << csr_MajorModeDbyte_LSB) | \
-                       (DfeCtrl_defval << csr_DfeCtrl_LSB) | \
-                       (ExtVrefRange_defval << csr_ExtVrefRange_LSB) | \
+       int DqDqsRcvCntrl = (GainCurrAdj_defval << csr_GainCurrAdj_LSB) |
+                       (MajorModeDbyte << csr_MajorModeDbyte_LSB) |
+                       (DfeCtrl_defval << csr_DfeCtrl_LSB) |
+                       (ExtVrefRange_defval << csr_ExtVrefRange_LSB) |
                        (SelAnalogVref << csr_SelAnalogVref_LSB);
 
        for (byte = 0; byte < 9; byte++) {
-               for (unsigned lane = 0; lane <= 1; lane++) {
-                       unsigned b_addr = lane << 8;
-                       unsigned c_addr = byte << 12;
-                       DDRPHY_WRITE_REG16(port, \
-                               (tDBYTE | c_addr | b_addr | csr_DqDqsRcvCntrl_ADDR), \
+               for (unsigned int lane = 0; lane <= 1; lane++) {
+                       unsigned int b_addr = lane << 8;
+                       unsigned int c_addr = byte << 12;
+
+                       DDRPHY_WRITE_REG16(port,
+                               (tDBYTE | c_addr | b_addr | csr_DqDqsRcvCntrl_ADDR),
                                DqDqsRcvCntrl);
                }
        }
 
-       /* Program MemAlertControl and MemAlertControl2:
+       /*
+        * Program MemAlertControl and MemAlertControl2:
         * - Fields:
         * - MALERTVrefLevel
         * - MALERTPuStren
         * - MALERTPuEn
         * - MALERTRxEn
         * - MALERTSyncBypass
-        * - MALERTDisableVal */
+        * - MALERTDisableVal
+        */
+
        /* MemAlert applies to DDR4(all DIMM) or DDR3(RDIMM) only */
        const int MALERTPuEn = 1;
        const int MALERTRxEn = 1;
@@ -355,107 +403,131 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data)
        const int MALERTDisableVal_defval = 1;
        int MALERTVrefLevel = 0x29;
 
-       int MemAlertControl = (MALERTDisableVal_defval << 14) | \
-                       (MALERTRxEn << 13) | (MALERTPuEn << 12) | \
+       int MemAlertControl = (MALERTDisableVal_defval << 14) |
+                       (MALERTRxEn << 13) | (MALERTPuEn << 12) |
                        (MALERTPuStren << 8) | MALERTVrefLevel;
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_MemAlertControl_ADDR), MemAlertControl);
 
        int MALERTSyncBypass = 0x0;
        int MemAlertControl2 = (MALERTSyncBypass << csr_MALERTSyncBypass_LSB);
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_MemAlertControl2_ADDR), MemAlertControl2);
 
        /* Program DfiFreqRatio */
        int DfiFreqRatio = 1; /* set 1 for 1:2 DFI clock */
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_DfiFreqRatio_ADDR), DfiFreqRatio);
 
-       /* Program TristateModeCA based on DramType and 2T Timing
+       /*
+        * Program TristateModeCA based on DramType and 2T Timing
         * - Fields:
         * - CkDisVal
         * - DisDynAdrTri
-        * - DDR2TMode  */
+        * - DDR2TMode
+        */
+
        /* CkDisVal depends on DramType */
        int CkDisVal_def = 1;
        int DisDynAdrTri = 0x0;
        int DDR2TMode = data->timing_2t;
-       int TristateModeCA = (CkDisVal_def << csr_CkDisVal_LSB) | \
-                               (DDR2TMode << csr_DDR2TMode_LSB) | \
+       int TristateModeCA = (CkDisVal_def << csr_CkDisVal_LSB) |
+                               (DDR2TMode << csr_DDR2TMode_LSB) |
                                (DisDynAdrTri << csr_DisDynAdrTri_LSB);
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_TristateModeCA_ADDR), TristateModeCA);
 
        /* Program DfiXlat based on Pll Bypass Input */
        uint16_t pllbypass_dat = 0;
+
        pllbypass_dat |= 0x0 << (0);
 
        for (uint16_t loopVector = 0; loopVector < 8; loopVector++) {
-               if (loopVector == 0 ) {
+               if (loopVector == 0) {
                        /* Relock DfiFreq = 00,01,02,03) Use StartVec 5 (pll_enabled) or StartVec 6 (pll_bypassed) */
                        uint16_t dfifreqxlat_dat = pllbypass_dat + 0x5555;
+
                        DDRPHY_WRITE_REG16(port, (tMASTER | (csr_DfiFreqXlat0_ADDR + loopVector)), dfifreqxlat_dat);
                } else if (loopVector == 7) {
                        /* LP3-entry DfiFreq = 1F */
                        DDRPHY_WRITE_REG16(port, (tMASTER | (csr_DfiFreqXlat0_ADDR + loopVector)), 0xf000);
                } else {
-                       /* everything else = skip retrain (could also map to 0000 since retrain code is excluded,
-                        * but this is cleaner) */
+                       /*
+                        * Everything else = skip retrain (could also map to 0000 since retrain code is excluded,
+                        * but this is cleaner)
+                        */
                        DDRPHY_WRITE_REG16(port, (tMASTER | (csr_DfiFreqXlat0_ADDR + loopVector)), 0x5555);
                }
        }
 
-       /* Program DqDqsRcvCntrl1 (Receiver Powerdown) and DbyteMiscMode
+       /*
+        * Program DqDqsRcvCntrl1 (Receiver Powerdown) and DbyteMiscMode
         *      - see function dwc_ddrphy_phyinit_IsDbyteDisabled() to determine
         *       which DBytes are turned off completely based on PHY configuration.
         * - Fields:
         *  - DByteDisable
         *  - PowerDownRcvr
         *  - PowerDownRcvrDqs
-        *  - RxPadStandbyEn    */
+        *  - RxPadStandbyEn
+        */
        /* Implements Section 1.3 of Pub Databook */
        for (int d = 0; d < 9; d++) /* for each dbyte */ {
                if (d == 8 && (!data->ecc_on)) {
                        int c_addr = d * c1;
                        uint16_t regData = 0x1 << csr_DByteDisable_LSB;
+
                        DDRPHY_WRITE_REG16(port, (c_addr | tDBYTE | csr_DbyteMiscMode_ADDR), regData);
 
-                       unsigned regData1 = (0x1ff << csr_PowerDownRcvr_LSB | \
-                               0x1 << csr_PowerDownRcvrDqs_LSB | \
+                       unsigned int regData1 = (0x1ff << csr_PowerDownRcvr_LSB |
+                               0x1 << csr_PowerDownRcvrDqs_LSB |
                                0x1 << csr_RxPadStandbyEn_LSB);
+
                        DDRPHY_WRITE_REG16(port, (c_addr | tDBYTE | csr_DqDqsRcvCntrl1_ADDR), regData1);
                } else {
                        /* disable RDBI lane if not used. */
                        int mr5_rdbi_off = 1;
+
                        if (((data->pocket.MR5 >> 12) & 0x1)) {
                                mr5_rdbi_off = 0;
                        }
-                       if ((data->device_width != 4 ) && mr5_rdbi_off) {
+
+                       if ((data->device_width != 4) && mr5_rdbi_off) {
                                /* turn off Rx of DBI lane */
-                               unsigned regData2 = (0x100 << csr_PowerDownRcvr_LSB | csr_RxPadStandbyEn_MASK);
+                               unsigned int regData2 = (0x100 << csr_PowerDownRcvr_LSB | csr_RxPadStandbyEn_MASK);
                                int c_addr = d * c1;
+
                                DDRPHY_WRITE_REG16(port, (c_addr | tDBYTE | csr_DqDqsRcvCntrl1_ADDR), regData2);
                        }
                }
        }
 
-       /* Program DqDqsRcvCntrl1 (Receiver Powerdown) and DbyteMiscMode
+       /*
+        * Program DqDqsRcvCntrl1 (Receiver Powerdown) and DbyteMiscMode
         * - Fields:
         *  - X4TG
         *  - MasterX4Config
-        * note: PHY does not support mixed dram device data width */
+        * note: PHY does not support mixed dram device data width
+        */
        int X4TG = 0;
+
        if (data->device_width == 4) {
                X4TG = 0xf;
        }
+
        int MasterX4Config = X4TG << csr_X4TG_LSB;
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_MasterX4Config_ADDR), MasterX4Config);
 
        /* Program DMIPinPresent based on DramType and Read-DBI enable
         * - Fields:
-        * - RdDbiEnabled */
+        * - RdDbiEnabled
+        */
        /* For DDR4, Read DBI is enabled in MR5-A12 */
        int DMIPinPresent = (data->pocket.MR5 >> 12) & 0x1;
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_DMIPinPresent_ADDR), DMIPinPresent);
 
        /* note: This feature is BETA and untested. Future PhyInit version will fully enable this feature. */
-       uint16_t Acx4AnibDis= 0x0;
+       uint16_t Acx4AnibDis = 0x0;
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_Acx4AnibDis_ADDR), Acx4AnibDis);
 }
 
@@ -487,6 +559,7 @@ void phyinit_E_setDfiClk(int port)
 
        /* Enable PHY interrupts */
        uint16_t int_enable = (1 << csr_PhyTrngCmpltEn_LSB) | (1 << csr_PhyInitCmpltEn_LSB) | (1 << csr_PhyTrngFailEn_LSB);
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_PhyInterruptEnable_ADDR), int_enable);
        reg = DDRPHY_READ_REG16(port, (tMASTER | csr_PhyInterruptEnable_ADDR));
 
@@ -507,7 +580,8 @@ void phyinit_E_setDfiClk(int port)
  * -# Wait for the training firmware to complete by following the procedure in
  * "uCtrl Initialization and Mailbox Messaging" implemented in
  * dwc_ddrphy_phyinit_userCustom_G_waitFwDone() function.
- * -# Halt the microcontroller. */
+ * -# Halt the microcontroller.
+ */
 int phyinit_G_ExecFW(int port)
 {
        /* 1. Reset the firmware microcontroller by writing the MicroReset CSR to set the StallToMicro and */
@@ -520,8 +594,10 @@ int phyinit_G_ExecFW(int port)
        /* 2. Begin execution of the training firmware by setting the MicroReset CSR to 4\'b0000. */
        DDRPHY_WRITE_REG16(port, (tAPBONLY | csr_MicroReset_ADDR), 0x0);
 
-       /* 3. Wait for the training firmware to complete by following the procedure in
-               uCtrl Initialization and Mailbox Messaging" */
+       /*
+        * 3. Wait for the training firmware to complete by following the procedure in
+        * uCtrl Initialization and Mailbox Messaging"
+        */
        int ret = phyinit_G_WaitFWDone(port);
 
        /* 4. Halt the microcontroller." */
index 089ae5529c301dbd1a214be1b505aaa8fe98c0dc..d9ba1d21d050136888fc4749ea092650ab263420 100644 (file)
@@ -35,8 +35,9 @@ void phyinit_D_LoadIMEM(int port, struct ddr_configuration *data, int training_2
        }
 
        /* select PMU iccm image */
-       unsigned image_offs = 0;
-       unsigned image_size = 0;
+       unsigned int image_offs = 0;
+       unsigned int image_size = 0;
+
        if (data->registered_dimm) {
                if (training_2d) {
                        image_offs = RDIMM_PMUTRAIN_2D_IMEM_OFFS;
@@ -55,12 +56,15 @@ void phyinit_D_LoadIMEM(int port, struct ddr_configuration *data, int training_2
                }
        }
 
-       /* 1. Enable access to the internal CSRs by setting the MicroContMuxSel CSR to 0.
-        * This allows the memory controller unrestricted access to the configuration CSRs. */
+       /*
+        * 1. Enable access to the internal CSRs by setting the MicroContMuxSel CSR to 0.
+        * This allows the memory controller unrestricted access to the configuration CSRs.
+        */
        DDRPHY_WRITE_REG16(port, (tAPBONLY | csr_MicroContMuxSel_ADDR), 0x0);
 
-       const uint16_t *msg = (uint16_t*)(firmware_container + image_offs);
-       unsigned index;
+       const uint16_t *msg = (uint16_t *)(firmware_container + image_offs);
+       unsigned int index;
+
        for (index = 0; index < image_size / sizeof(uint16_t); index++) {
                DDRPHY_WRITE_REG16(port, (DDRPHY_PMU_ICCM_ADDR + index), msg[index]);
        }
@@ -69,8 +73,10 @@ void phyinit_D_LoadIMEM(int port, struct ddr_configuration *data, int training_2
                DDRPHY_WRITE_REG16(port, (DDRPHY_PMU_ICCM_ADDR + index), 0x0);
        }
 
-       /* 2. Isolate the APB access from the internal CSRs by setting the MicroContMuxSel CSR to 1.
-        * This allows the firmware unrestricted access to the configuration CSRs. */
+       /*
+        * 2. Isolate the APB access from the internal CSRs by setting the MicroContMuxSel CSR to 1.
+        * This allows the firmware unrestricted access to the configuration CSRs.
+        */
        DDRPHY_WRITE_REG16(port, (tAPBONLY | csr_MicroContMuxSel_ADDR), 0x1);
 }
 
@@ -79,8 +85,9 @@ void phyinit_D_LoadIMEM(int port, struct ddr_configuration *data, int training_2
  * This function performs the following tasks:
  * -# Load the firmware DMEM segment to initialize the data structures from the
  * DMEM incv file provided in the training firmware package.
- * -# Write the Firmware Message Block with the required contents detailing the training parameters. */
-void phyinit_F_LoadDMEM(int port, struct ddr_configuration *data, const void* mb, int training_2d)
+ * -# Write the Firmware Message Block with the required contents detailing the training parameters.
+ */
+void phyinit_F_LoadDMEM(int port, struct ddr_configuration *data, const void *mb, int training_2d)
 {
        /* 1. Enable access to the internal CSRs by setting the MicroContMuxSel CSR to 0. */
        /*      This allows the memory controller unrestricted access to the configuration CSRs. */
@@ -89,16 +96,17 @@ void phyinit_F_LoadDMEM(int port, struct ddr_configuration *data, const void* mb
        int dccm_index = 0;
 
        /* upload PMU message block */
-       unsigned msg_block_size = sizeof(struct pmu_smb_ddr4_t);
-
+       unsigned int msg_block_size = sizeof(struct pmu_smb_ddr4_t);
        uint16_t *msg = (uint16_t *)mb;
+
        for (; dccm_index < msg_block_size / sizeof(uint16_t); dccm_index++) {
                DDRPHY_WRITE_REG16(port, (DDRPHY_PMU_DCCM_ADDR + dccm_index), msg[dccm_index]);
        }
 
        /* upload PMU dccm image (tail without message block) */
-       unsigned dccm_image_offs = 0;
-       unsigned dccm_image_size = 0;
+       unsigned int dccm_image_offs = 0;
+       unsigned int dccm_image_size = 0;
+
        if (data->registered_dimm) {
                if (training_2d) {
                        dccm_image_offs = RDIMM_PMUTRAIN_2D_DMEM_OFFS;
@@ -128,8 +136,10 @@ void phyinit_F_LoadDMEM(int port, struct ddr_configuration *data, const void* mb
                dccm_index++;
        }
 
-       /* 2. Isolate the APB access from the internal CSRs by setting the MicroContMuxSel CSR to 1.
-        *      This allows the firmware unrestricted access to the configuration CSRs. */
+       /*
+        * 2. Isolate the APB access from the internal CSRs by setting the MicroContMuxSel CSR to 1.
+        *      This allows the firmware unrestricted access to the configuration CSRs.
+        */
        DDRPHY_WRITE_REG16(port, (tAPBONLY | csr_MicroContMuxSel_ADDR), 0x1);
 }
 
@@ -150,25 +160,30 @@ void phyinit_I_LoadPIE(int port, struct ddr_configuration *data)
                phyinit_LoadPieProdCode_udimm(port);
        }
 
-       /* Registers: Seq0BDLY0, Seq0BDLY1, Seq0BDLY2, Seq0BDLY3
-        *      - Program PIE instruction delays */
+       /*
+        * Registers: Seq0BDLY0, Seq0BDLY1, Seq0BDLY2, Seq0BDLY3
+        *      - Program PIE instruction delays
+        */
+
        /* Need delays for 0.5us, 1us, 10us, and 25us. */
        uint16_t psCount[4];
        const int delayScale = 1;
        int DfiFrq = data->clock_mhz / 2;
+
        psCount[0] = DfiFrq * delayScale / 2 / 4;
 
        int LowFreqOpt = 0;
+
        if (data->registered_dimm) {
-               if (data->clock_mhz < 400 ) {
+               if (data->clock_mhz < 400) {
                        LowFreqOpt = 7;
-               } else if (data->clock_mhz < 533 ) {
+               } else if (data->clock_mhz < 533) {
                        LowFreqOpt = 14;
                }
        } else {
-               if (data->clock_mhz < 400 ) {
+               if (data->clock_mhz < 400) {
                        LowFreqOpt = 3;
-               } else if (data->clock_mhz < 533 ) {
+               } else if (data->clock_mhz < 533) {
                        LowFreqOpt = 11;
                }
        }
@@ -177,6 +192,7 @@ void phyinit_I_LoadPIE(int port, struct ddr_configuration *data)
        psCount[2] = DfiFrq * delayScale * 10 / 4;
 
        int dllLock;
+
        if (DfiFrq > 267) {
                dllLock = 176;
        } else if (DfiFrq <= 267 && DfiFrq > 200) {
@@ -192,9 +208,11 @@ void phyinit_I_LoadPIE(int port, struct ddr_configuration *data)
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_Seq0BDLY2_ADDR), psCount[2]);
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_Seq0BDLY3_ADDR), psCount[3]);
 
-       /* Registers: Seq0BDisableFlag0 Seq0BDisableFlag1 Seq0BDisableFlag2
-       * Seq0BDisableFlag3 Seq0BDisableFlag4 Seq0BDisableFlag5
-       *       - Program PIE Instruction Disable Flags */
+       /*
+        * Registers: Seq0BDisableFlag0 Seq0BDisableFlag1 Seq0BDisableFlag2
+        * Seq0BDisableFlag3 Seq0BDisableFlag4 Seq0BDisableFlag5
+        *      - Program PIE Instruction Disable Flags
+        */
        DDRPHY_WRITE_REG16(port, (tINITENG | csr_Seq0BDisableFlag0_ADDR), 0x0000);
        DDRPHY_WRITE_REG16(port, (tINITENG | csr_Seq0BDisableFlag1_ADDR), 0x0173);
        DDRPHY_WRITE_REG16(port, (tINITENG | csr_Seq0BDisableFlag2_ADDR), 0x0060);
@@ -209,25 +227,29 @@ void phyinit_I_LoadPIE(int port, struct ddr_configuration *data)
        DDRPHY_WRITE_REG16(port, (tINITENG | csr_Seq0BDisableFlag7_ADDR), 0x6152);
 
        if (data->registered_dimm) {
-               /* Registers AcsmPlayback*x*
-               * Program Address/Command Sequence Engine (ACSM) registers with required instructions for retraining algorithm. */
-               int acsmplayback[2][4] = {{0,0,0,0}, {0,0,0,0}};
+               /* Registers AcsmPlayback*x* */
+
+               /* Program Address/Command Sequence Engine (ACSM) registers with required instructions for retraining algorithm. */
+               int acsmplayback[2][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
                int NumVec = 0;
 
                /* DIMM Operating Speed */
                uint32_t F0RC0A = 0x0a0 | (0xf & data->pocket.F0RC0A_D0); /* use the RCD register value for 1D training. */
+
                acsmplayback[0][NumVec] = 0x3ff & F0RC0A;
                acsmplayback[1][NumVec] = (0x1c00 & F0RC0A) >> 10;
                NumVec += 1;
 
                /* Fine Granularity RDIMM Operating Speed */
                uint32_t F0RC3x = 0x300 | (0xff & data->pocket.F0RC3x_D0);
+
                acsmplayback[0][NumVec] = 0x3ff & F0RC3x;
                acsmplayback[1][NumVec] = (0x1c00 & F0RC3x) >> 10;
                NumVec += 1;
 
                /* F0RC5x: CW Destination Selection & Write/Read Additional QxODT[1:0] Signal High */
                uint32_t F0RC5x = 0x500 | (0xff & SNPS_UMCTL_F0RC5x);
+
                acsmplayback[0][NumVec] = 0x3ff & F0RC5x;
                acsmplayback[1][NumVec] = (0x1c00 & F0RC5x) >> 10;
                NumVec += 1;
@@ -240,28 +262,35 @@ void phyinit_I_LoadPIE(int port, struct ddr_configuration *data)
                /* Program Training Hardware Registers for mission mode retraining and DRAM drift compensation algorithm. */
                /* Register: AcsmCtrl13 Fields: AcsmCkeEnb */
                uint16_t regData = (0xf << csr_AcsmCkeEnb_LSB);
+
                DDRPHY_WRITE_REG16(port, (tACSM | csr_AcsmCtrl13_ADDR), regData);
                /* Register: AcsmCtrl0  Fields: AcsmParMode, Acsm2TMode */
-               DDRPHY_WRITE_REG16(port, (tACSM | csr_AcsmCtrl0_ADDR), csr_AcsmParMode_MASK | csr_Acsm2TMode_MASK );
+               DDRPHY_WRITE_REG16(port, (tACSM | csr_AcsmCtrl0_ADDR), csr_AcsmParMode_MASK | csr_Acsm2TMode_MASK);
        }
 
        /* - Register: CalZap
         * - Prepare the calibration controller for mission mode.
-        *  Turn on calibration and hold idle until dfi_init_start is asserted sequence is triggered. */
+        *  Turn on calibration and hold idle until dfi_init_start is asserted sequence is triggered.
+        */
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_CalZap_ADDR), 0x1);
 
        /* - Register: CalRate
         * - Fields:
         *  - CalRun
         *  - CalOnce
-        *  - CalInterval */
+        *  - CalInterval
+        */
        int CalInterval = 0x9;
        int CalOnce = 0x0;
        int CalRate = (0x1 << csr_CalRun_LSB) | (CalOnce << csr_CalOnce_LSB) | (CalInterval << csr_CalInterval_LSB);
+
        DDRPHY_WRITE_REG16(port, (tMASTER | csr_CalRate_ADDR), CalRate);
 
-       /* At the end of this function, PHY Clk gating register UcclkHclkEnables is
-        * set for mission mode. Additionally APB access is Isolated by setting MicroContMuxSel. */
+       /*
+        * At the end of this function, PHY Clk gating register UcclkHclkEnables is
+        * set for mission mode. Additionally APB access is Isolated by setting MicroContMuxSel.
+        */
+
        /* Disabling Ucclk (PMU) and Hclk (training hardware) */
        DDRPHY_WRITE_REG16(port, (tDRTUB | csr_UcclkHclkEnables_ADDR), 0x0);
        /* Isolate the APB access from the internal CSRs by setting the MicroContMuxSel CSR to 1. */
index c44dcff887024d51f49cce092b682e7037473fc0..455387fc6513f151eb3fe60ebb2695c89f99f348 100644 (file)
@@ -21,8 +21,11 @@ int phy_main(int port, struct ddr_configuration *data)
        /* (C) Initialize PHY Configuration */
        phyinit_C_PhyConfig(port, data);
 
-       /* Switches between supported phyinit training sequences refer to
-        * "Alternative PHY Training sequence" document for further details. */
+       /*
+        * Switches between supported phyinit training sequences refer to
+        * "Alternative PHY Training sequence" document for further details.
+        */
+
        /* 0x0 | Minimizes number of Imem/Dmem loads (default) */
        /* 0x1 | High frequency P1/P2/P3 support (DDR4/LP4 only) */
 #if (PHYINIT_SEQUENCENUM == 0)
@@ -35,8 +38,8 @@ int phy_main(int port, struct ddr_configuration *data)
        /* Note: this routine implies other items such as DfiFreqRatio, DfiCtlClk are also set properly. */
 
        /* (F) Write the Message Block parameters for the training firmware */
-       /* uint8_t __attribute__((aligned (sizeof(u32)))) msg_block[MSG_BLOCK_1D_SIZE]; */
        struct pmu_smb_ddr4_t msg_block = {0};
+
        phyinit_calcMb((void *)&msg_block, data, false);
 
        phyinit_F_LoadDMEM(port, data, &msg_block, false);
@@ -66,7 +69,6 @@ int phy_main(int port, struct ddr_configuration *data)
                phyinit_D_LoadIMEM(port, data, true); /* 2D image */
 
                /* 2D-F, cont.  Write the Message Block parameters for the training firmware */
-               /* u8 __attribute__((aligned (sizeof(u32)))) msg_block[MSG_BLOCK_2D_SIZE]; */
                phyinit_calcMb((void *)&msg_block, data, true); /* pstate=0 */
 
                phyinit_F_LoadDMEM(port, data, &msg_block, true);
@@ -91,7 +93,8 @@ int phy_main(int port, struct ddr_configuration *data)
 
        /* (F) Write the Message Block parameters for the training firmware */
        struct pmu_smb_ddr4_t msg_block = {0};
-       phyinit_calcMb((void*) &msg_block, data, false);
+
+       phyinit_calcMb((void *)&msg_block, data, false);
 
        phyinit_F_LoadDMEM(port, data, &msg_block, false);
 
@@ -120,7 +123,7 @@ int phy_main(int port, struct ddr_configuration *data)
 
                /* 2D-F, cont.  Write the Message Block parameters for the training firmware */
                msg_block = {0};
-               phyinit_calcMb((void*) &msg_block, data, true); /* pstate=0 */
+               phyinit_calcMb((void *)&msg_block, data, true); /* pstate=0 */
 
                phyinit_F_LoadDMEM(port, data, &msg_block, true);
 
index b1fc951f729e0131ce6fa8701aa348e168aa1f0b..1fb27f9150fcda1548cf4c0bac9dbca5c869a15f 100644 (file)
@@ -15,9 +15,8 @@ void phyinit_C_PhyConfig(int port, struct ddr_configuration *data);
 void phyinit_E_setDfiClk(int port);
 void phyinit_calcMb(void *mb, struct ddr_configuration *data, int training_2d);
 void phyinit_D_LoadIMEM(int port, struct ddr_configuration *data, int training_2d);
-void phyinit_F_LoadDMEM(int port, struct ddr_configuration *data, const voidmb, int training_2d);
+void phyinit_F_LoadDMEM(int port, struct ddr_configuration *data, const void *mb, int training_2d);
 void phyinit_I_LoadPIE(int port, struct ddr_configuration *data);
-
 int phyinit_H_readMsgBlock(int port, struct ddr_configuration *data);
 
 #endif /* DDR_PHY_MAIN_H */
index ff3a4c26ad799eed7b51af9694024754f31f33b9..7e79989ea26cb153454182dfbbbc97f159bf5f7d 100644 (file)
@@ -41,6 +41,7 @@ const struct pmu_msg_info pmu_msg_list[] = {
 static int get_mail_u16(int port, uint16_t *mail, int timeout_us)
 {
        uint64_t timeout;
+
        for (timeout = timeout_init_us(timeout_us);;) {
                if (!(DDRPHY_READ_REG16(port, (tAPBONLY | csr_UctShadowRegs_ADDR)) & csr_UctWriteProtShadow_MASK)) {
                        break;
@@ -66,6 +67,7 @@ static int get_mail_u16(int port, uint16_t *mail, int timeout_us)
 static int get_mail_u32(int port, uint32_t *mail, int timeout_us)
 {
        uint64_t timeout;
+
        for (timeout = timeout_init_us(timeout_us);;) {
                if (!(DDRPHY_READ_REG16(port, (tAPBONLY | csr_UctShadowRegs_ADDR)) & csr_UctWriteProtShadow_MASK)) {
                        break;
@@ -73,8 +75,10 @@ static int get_mail_u32(int port, uint32_t *mail, int timeout_us)
                        return 1;
                }
        }
+
        uint16_t low  = DDRPHY_READ_REG16(port, (tAPBONLY | csr_UctWriteOnlyShadow_ADDR));
        uint16_t high = DDRPHY_READ_REG16(port, (tAPBONLY | csr_UctDatWriteOnlyShadow_ADDR));
+
        *mail = (high << 16) | low;
 
        DDRPHY_WRITE_REG16(port, (tAPBONLY | csr_DctWriteProt_ADDR), 0);
@@ -99,8 +103,10 @@ static int get_pmu_streaming_message(int port, uint32_t *str_index, uint32_t *st
        /* read stream arguments */
        int argc = 0;
        int argc_input = *str_index & 0xffff;
+
        for (int i = 0; i < argc_input; i++) {
                uint32_t arg;
+
                if (get_mail_u32(port, &arg, DDRPHY_MAIL_TIMEOUT) != 0) {
                        break;
                }
@@ -126,14 +132,15 @@ void print_pmu_major_message(uint16_t major)
 {
        /* seek for message in info table */
        int idx = -1;
-       for (int i = 0; i < sizeof(pmu_msg_list) / sizeof(pmu_msg_list[0]); i++) {
+
+       for (int i = 0; i < ARRAY_SIZE(pmu_msg_list); i++) {
                if (pmu_msg_list[i].id == major) {
                        idx = i;
                        break;
                }
        }
        if (idx >= 0) {
-               /* WARNING: avoid any messaging with EOFRW_PASS! (RDIMM time critcal section) */
+               /* WARNING: avoid any messaging with EOFRW_PASS (RDIMM time critcal section) */
                if (idx != PMU_MSG_EOFRW_PASS) {
                        INFO("pmu: ");
                        printf("%s\n", pmu_msg_list[idx].info);
@@ -146,6 +153,7 @@ void print_pmu_major_message(uint16_t major)
 int phyinit_G_WaitFWDone(int port)
 {
        uint16_t major = -1;
+
        do {
                /* process pmu mailbox */
                if (get_mail_u16(port, &major, DDRPHY_TRAINING_TIMEOUT)) {
@@ -158,6 +166,7 @@ int phyinit_G_WaitFWDone(int port)
                        uint32_t str_index;
                        uint32_t str_arg[DDRPHY_MAIL_STRARG_MAX];
                        int argc = get_pmu_streaming_message(port, &str_index, str_arg);
+
                        if (argc >= 0) {
                                print_pmu_streaming_message(str_index, str_arg, argc);
                        } else {
@@ -1016,6 +1025,7 @@ void phyinit_LoadPieProdCode_rdimm(int port)
 int phyinit_mapDrvStren(int DrvStren_ohm, enum drv_stren_t TargetCSR)
 {
        int Stren_setting;
+
        if ((TargetCSR == DrvStrenFSDqP_T) || (TargetCSR == DrvStrenFSDqN_T)) {
                if (DrvStren_ohm == 0) {
                        Stren_setting = 0x00; /* High-impedance */
@@ -1058,7 +1068,8 @@ int phyinit_mapDrvStren(int DrvStren_ohm, enum drv_stren_t TargetCSR)
                }
        } else if (TargetCSR == ODTStrenP_T) {
                /* DDR4 & LPDDR3 - P is non-zero */
-               if (DrvStren_ohm == 0) { Stren_setting = 0x00; /* High-impedance */
+               if (DrvStren_ohm == 0) {
+                       Stren_setting = 0x00; /* High-impedance */
                } else if (DrvStren_ohm < 29) {
                        Stren_setting = 0x3f;
                } else if (DrvStren_ohm < 31) {
@@ -1100,7 +1111,8 @@ int phyinit_mapDrvStren(int DrvStren_ohm, enum drv_stren_t TargetCSR)
                /* DDR4 & LPDDR3 - N is high-Z */
                Stren_setting = 0x00; /* High-impedance */
        } else if ((TargetCSR == ADrvStrenP_T) || (TargetCSR == ADrvStrenN_T)) {
-               if (DrvStren_ohm == 120) { Stren_setting = 0x00;
+               if (DrvStren_ohm == 120) {
+                       Stren_setting = 0x00;
                } else if (DrvStren_ohm == 60) {
                        Stren_setting = 0x01;
                } else if (DrvStren_ohm == 40) {
index 8bdb51bb6f746d9c6cc23dc70022188d7443fb5c..1b5ad583492ee63269cb3de25d86d54599c34bc8 100644 (file)
@@ -39,7 +39,7 @@ enum drv_stren_t {
 
 struct pmu_msg_info {
        int id;
-       const charinfo;
+       const char *info;
 };
 
 int phyinit_G_WaitFWDone(int port);
index 3bc3642705f4c21d56a96ca24267ef3b2e48f9d1..7ebf57c42837af6190a2259d1f408016669f9bbc 100644 (file)
@@ -20,6 +20,7 @@
 static uint8_t getMBdata_u8(int port, size_t offset)
 {
        uint16_t mem = DDRPHY_READ_REG16(port, (DDRPHY_PMU_DCCM_ADDR + (offset / 2)));
+
        return (offset % 2) ? (uint8_t)(mem >> 8) : (uint8_t)mem;
 }
 
@@ -29,32 +30,36 @@ static uint16_t getMBdata_u16(int port, size_t offset)
 }
 
 /* return: PHY training result - TxDqsDly maximum, in PHY clocks */
-static unsigned phy_getTxDqsDlyMax(int port)
+static unsigned int phy_getTxDqsDlyMax(int port)
 {
-       unsigned dly_max = 0;
+       unsigned int dly_max = 0;
        const int pstate = 0;
        const uint32_t TxDqsDlyTgX_addr[4] = {
                csr_TxDqsDlyTg0_ADDR, csr_TxDqsDlyTg1_ADDR,
                csr_TxDqsDlyTg2_ADDR, csr_TxDqsDlyTg3_ADDR
        };
-       for (unsigned byte = 0; byte < 9; byte++) {
-                for (unsigned lane = 0; lane <= 1; lane++) {
-                         unsigned b_addr = lane << 8;
-                         unsigned c_addr = byte << 12;
-                         unsigned p_addr = pstate << 20;
-                         for (int i = 0; i < 4; i++) {
-                                 uint16_t val = DDRPHY_READ_REG16(port,
-                                         (p_addr | tDBYTE | c_addr | b_addr | TxDqsDlyTgX_addr[i]));
-                                 unsigned dly_frac = val & 0x1f;                       /* [4..0] bits for fractional value */
-                                 unsigned dly_int  = (val >> 6) & 0xf; /* [9..6] bits for integer value */
-                                 if (dly_frac != 0) {
-                                         dly_int += 1;
-                                 }
-                                 if (dly_int > dly_max) {
-                                         dly_max = dly_int;
-                                 }
-                         }
-                }
+
+       for (unsigned int byte = 0; byte < 9; byte++) {
+               for (unsigned int lane = 0; lane <= 1; lane++) {
+                       unsigned int b_addr = lane << 8;
+                       unsigned int c_addr = byte << 12;
+                       unsigned int p_addr = pstate << 20;
+
+                       for (int i = 0; i < 4; i++) {
+                               uint16_t val = DDRPHY_READ_REG16(port,
+                                       (p_addr | tDBYTE | c_addr | b_addr | TxDqsDlyTgX_addr[i]));
+                               unsigned int dly_frac = val & 0x1f;       /* [4..0] bits for fractional value */
+                               unsigned int dly_int  = (val >> 6) & 0xf; /* [9..6] bits for integer value */
+
+                               if (dly_frac != 0) {
+                                       dly_int += 1;
+                               }
+
+                               if (dly_int > dly_max) {
+                                       dly_max = dly_int;
+                               }
+                       }
+               }
        }
 
        /* convert result from UI to PHY clk value */
@@ -63,30 +68,37 @@ static unsigned phy_getTxDqsDlyMax(int port)
 
 /* get rd2wr training result for single-rank DDR (just get R0-R0 result) */
 /* see phy pub databook "Rank-to-Rank Spacing" */
-static unsigned phy_getRd2WrCDDsr(int port, unsigned cdd_00_offset)
+static unsigned int phy_getRd2WrCDDsr(int port, unsigned int cdd_00_offset)
 {
        int8_t rd2wr = getMBdata_u8(port, cdd_00_offset);
+
        return (rd2wr >= 0) ? rd2wr : -rd2wr;
 }
 
 /* get rd2wr training result for multi-ranks DDR (seek maximum for all ranks) */
 /* see phy pub databook "Rank-to-Rank Spacing" */
-static unsigned phy_getRd2WrCDDmr(int port, unsigned cdd_33_offset, unsigned cdd_00_offset, unsigned cs_mask)
+static unsigned int phy_getRd2WrCDDmr(int port,
+                                     unsigned int cdd_33_offset,
+                                     unsigned int cdd_00_offset,
+                                     unsigned int cs_mask)
 {
-       unsigned rd2wr_max = 0;
+       unsigned int rd2wr_max = 0;
 
        /* read uint8_t CDD data by uint16_t bus read transaction */
-       unsigned start_offset_u16 = cdd_33_offset & ~0x1;
-       unsigned end_offset_u16 = cdd_00_offset & ~0x1;
+       unsigned int start_offset_u16 = cdd_33_offset & ~0x1;
+       unsigned int end_offset_u16 = cdd_00_offset & ~0x1;
        int cs_high = 3;
        int cs_low = 3;
-       for (unsigned offset = start_offset_u16; offset <= end_offset_u16; offset += 2) {
+
+       for (unsigned int offset = start_offset_u16; offset <= end_offset_u16; offset += 2) {
                uint16_t data = getMBdata_u16(port, offset);
+
                if ((offset + 0) >= cdd_33_offset) {
                        if ((cs_mask & (1 << cs_high)) && (cs_mask & (1 << cs_low))) {
                                /* low byte data process */
                                int8_t rd2wr = data & 0xff;
-                               unsigned rd2wr_abs = (rd2wr >= 0) ? rd2wr : -rd2wr;
+                               unsigned int rd2wr_abs = (rd2wr >= 0) ? rd2wr : -rd2wr;
+
                                if (rd2wr_abs > rd2wr_max) {
                                        rd2wr_max = rd2wr_abs;
                                }
@@ -101,13 +113,17 @@ static unsigned phy_getRd2WrCDDmr(int port, unsigned cdd_33_offset, unsigned cdd
                        if ((cs_mask & (1 << cs_high)) && (cs_mask & (1 << cs_low))) {
                                /* high byte data process */
                                int8_t rd2wr = data >> 8;
-                               unsigned rd2wr_abs = (rd2wr >= 0) ? rd2wr : -rd2wr;
+                               unsigned int rd2wr_abs = (rd2wr >= 0) ? rd2wr : -rd2wr;
+
                                if (rd2wr_abs > rd2wr_max) {
                                        rd2wr_max = rd2wr_abs;
                                }
                        }
                        cs_low -= 1;
-                       if (cs_low < 0) { cs_low = 3; cs_high -= 1; }
+                       if (cs_low < 0) {
+                               cs_low = 3;
+                               cs_high -= 1;
+                       }
                }
        }
 
@@ -116,23 +132,30 @@ static unsigned phy_getRd2WrCDDmr(int port, unsigned cdd_33_offset, unsigned cdd
 
 /* get wr2wr training result for multi-ranks DDR (seek maximum for all ranks) */
 /* see phy pub databook "Rank-to-Rank Spacing" */
-static unsigned phy_getWr2WrCDDmr(int port, unsigned cdd_32_offset, unsigned cdd_01_offset, unsigned cs_mask)
+static unsigned int phy_getWr2WrCDDmr(int port,
+                                     unsigned int cdd_32_offset,
+                                     unsigned int cdd_01_offset,
+                                     unsigned int cs_mask)
 {
        int wr2wr_max = 0;
 
        /* read uint8_t CDD data by uint16_t bus read transaction */
-       unsigned start_offset_u16 = cdd_32_offset & ~0x1;
-       unsigned end_offset_u16 = cdd_01_offset & ~0x1;
+       unsigned int start_offset_u16 = cdd_32_offset & ~0x1;
+       unsigned int end_offset_u16 = cdd_01_offset & ~0x1;
        int cs_high = 3;
        int cs_low = 2;
-       for (unsigned offset = start_offset_u16; offset <= end_offset_u16; offset += 2) {
+
+       for (unsigned int offset = start_offset_u16; offset <= end_offset_u16; offset += 2) {
                uint16_t data = getMBdata_u16(port, offset);
+
                if ((offset + 0) >= cdd_32_offset) {
                        if ((cs_mask & (1 << cs_high)) && (cs_mask & (1 << cs_low))) {
                                /* low byte data process */
                                int8_t wr2wr = data & 0xff;
-                               if (wr2wr > wr2wr_max)
+
+                               if (wr2wr > wr2wr_max) {
                                        wr2wr_max = wr2wr;
+                               }
                        }
                        cs_low -= 1;
                        if (cs_low < 0) {
@@ -147,6 +170,7 @@ static unsigned phy_getWr2WrCDDmr(int port, unsigned cdd_32_offset, unsigned cdd
                        if ((cs_mask & (1 << cs_high)) && (cs_mask & (1 << cs_low))) {
                                /* high byte data process */
                                int8_t wr2wr = data >> 8;
+
                                if (wr2wr > wr2wr_max) {
                                        wr2wr_max = wr2wr;
                                }
@@ -167,21 +191,27 @@ static unsigned phy_getWr2WrCDDmr(int port, unsigned cdd_32_offset, unsigned cdd
 
 /* get rd2rd training result for multi-ranks DDR (seek maximum for all ranks) */
 /* see phy pub databook "Rank-to-Rank Spacing" */
-static unsigned phy_getRd2RdCDDmr(int port, unsigned cdd_32_offset, unsigned cdd_01_offset, unsigned cs_mask)
+static unsigned int phy_getRd2RdCDDmr(int port,
+                                     unsigned int cdd_32_offset,
+                                     unsigned int cdd_01_offset,
+                                     unsigned int cs_mask)
 {
        int rd2rd_max = 0;
 
        /* read uint8_t CDD data by uint16_t bus read transaction */
-       unsigned start_offset_u16 = cdd_32_offset & ~0x1;
-       unsigned end_offset_u16 = cdd_01_offset & ~0x1;
+       unsigned int start_offset_u16 = cdd_32_offset & ~0x1;
+       unsigned int end_offset_u16 = cdd_01_offset & ~0x1;
        int cs_high = 3;
        int cs_low = 2;
-       for (unsigned offset = start_offset_u16; offset <= end_offset_u16; offset += 2) {
+
+       for (unsigned int offset = start_offset_u16; offset <= end_offset_u16; offset += 2) {
                uint16_t data = getMBdata_u16(port, offset);
+
                if ((offset + 0) >= cdd_32_offset) {
                        if ((cs_mask & (1 << cs_high)) && (cs_mask & (1 << cs_low))) {
                                /* low byte data process */
                                int8_t rd2rd = data & 0xff;
+
                                if (rd2rd > rd2rd_max) {
                                        rd2rd_max = rd2rd;
                                }
@@ -199,8 +229,10 @@ static unsigned phy_getRd2RdCDDmr(int port, unsigned cdd_32_offset, unsigned cdd
                        if ((cs_mask & (1 << cs_high)) && (cs_mask & (1 << cs_low))) {
                                /* high byte data process */
                                int8_t rd2rd = data >> 8;
-                               if (rd2rd > rd2rd_max)
+
+                               if (rd2rd > rd2rd_max) {
                                        rd2rd_max = rd2rd;
+                               }
                        }
                        cs_low -= 1;
                        if (cs_low < 0) {
@@ -218,8 +250,10 @@ static unsigned phy_getRd2RdCDDmr(int port, unsigned cdd_32_offset, unsigned cdd
 
 int phyinit_H_readMsgBlock(int port, struct ddr_configuration *data)
 {
-       /* 1. Enable access to the internal CSRs by setting the MicroContMuxSel CSR to 0.
-        * This allows the memory controller unrestricted access to the configuration CSRs. */
+       /*
+        * 1. Enable access to the internal CSRs by setting the MicroContMuxSel CSR to 0.
+        * This allows the memory controller unrestricted access to the configuration CSRs.
+        */
        DDRPHY_WRITE_REG16(port, (tAPBONLY | csr_MicroContMuxSel_ADDR), 0x0);
 
        uint8_t cs_fail = getMBdata_u8(port, 0x14); /* offsetof(pmu_smb_ddr4_t, CsTestFail) */
@@ -233,6 +267,7 @@ int phyinit_H_readMsgBlock(int port, struct ddr_configuration *data)
        data->trn_res.TxDqsDlyMax = phy_getTxDqsDlyMax(port);
 
        uint8_t CsPresent = data->ranks == 1 ? 0x1 : 0x3;
+
        if (data->dimms == 2) {
                CsPresent = CsPresent | (CsPresent << 2);
        }
index 810d087c8543c5ceab1f3188785c506c49284790..3dd28a7fb55fdf543d02d7d8d3c545c8386cc2cd 100644 (file)
@@ -36,7 +36,7 @@ struct pmu_smb_ddr4_t {
        uint8_t  PllBypassEn;
        uint16_t DRAMFreq;
        uint8_t  DfiFreqRatio;
-       uint8_t  BPZNResVal ;
+       uint8_t  BPZNResVal;
        uint8_t  PhyOdtImpedance;
        uint8_t  PhyDrvImpedance;
        uint8_t  PhyVref;
index fe9bffee5b5091cb2ae20d9f9bf45811dc640e1e..b016f2bb42beab704703d8160a8e7cdf08ddea64 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2021-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -36,6 +36,7 @@
 #define BAIKAL_BOOT_SPI_SUBSECTOR      (4 * 1024)
 #define BAIKAL_BOOT_SPI_SIZE           (32 * 1024 * 1024)
 
+#define BAIKAL_I2C_ICLK_FREQ           200000000
 #define SYS_COUNTER_FREQ_IN_TICKS      ULL(25000000)
 
 #if defined(BAIKAL_QEMU)
index 9af6b800e0dc745b8ad8b4a369dc3148382249fd..48b8485465ef289ef3253411a8cf0bccacf7a212 100644 (file)
 #define GIC_BASE                               U(0x1000000)
 #define GIC_SIZE                               U(0x1000000)
 #define GICD_BASE                              (GIC_BASE)
+#define GITS0_BASE                             (GIC_BASE + 0x40000)
+#define GITS0_TRANSLATER                       (GIC_BASE + 0x50040)
+#define GITS1_BASE                             (GIC_BASE + 0x60000)
+#define GITS1_TRANSLATER                       (GIC_BASE + 0x70040)
+#define GITS2_BASE                             (GIC_BASE + 0x80000)
+#define GITS2_TRANSLATER                       (GIC_BASE + 0x90040)
+#define GITS3_BASE                             (GIC_BASE + 0xa0000)
+#define GITS3_TRANSLATER                       (GIC_BASE + 0xb0040)
+#define GITS4_BASE                             (GIC_BASE + 0xc0000)
+#define GITS4_TRANSLATER                       (GIC_BASE + 0xd0040)
+#define GITS5_BASE                             (GIC_BASE + 0xe0000)
+#define GITS5_TRANSLATER                       (GIC_BASE + 0xf0040)
+#define GITS6_BASE                             (GIC_BASE + 0x100000)
+#define GITS6_TRANSLATER                       (GIC_BASE + 0x110040)
+#define GITS7_BASE                             (GIC_BASE + 0x120000)
+#define GITS7_TRANSLATER                       (GIC_BASE + 0x130040)
+#define GITS8_BASE                             (GIC_BASE + 0x140000)
+#define GITS8_TRANSLATER                       (GIC_BASE + 0x150040)
+#define GITS9_BASE                             (GIC_BASE + 0x160000)
+#define GITS9_TRANSLATER                       (GIC_BASE + 0x170040)
+#define GITS10_BASE                            (GIC_BASE + 0x180000)
+#define GITS10_TRANSLATER                      (GIC_BASE + 0x190040)
+#define GITS11_BASE                            (GIC_BASE + 0x1a0000)
+#define GITS11_TRANSLATER                      (GIC_BASE + 0x1b0040)
+#define GITS12_BASE                            (GIC_BASE + 0x1c0000)
+#define GITS12_TRANSLATER                      (GIC_BASE + 0x1d0040)
+#define GITS13_BASE                            (GIC_BASE + 0x1e0000)
+#define GITS13_TRANSLATER                      (GIC_BASE + 0x1f0040)
+#define GITS14_BASE                            (GIC_BASE + 0x200000)
+#define GITS14_TRANSLATER                      (GIC_BASE + 0x210040)
+#define GITS15_BASE                            (GIC_BASE + 0x220000)
+#define GITS15_TRANSLATER                      (GIC_BASE + 0x230040)
 #define GICR_BASE                              (GIC_BASE + 0x240000)
 
 #define CORESIGHT_CFG_BASE                     U(0x2000000)
 #define PCIE0_GPR_BASE                         (PCIE0_BASE + 0x20000)
 #define PCIE0_GPR_SS_MODE_CTL                  (PCIE0_GPR_BASE + 0x10)
 #define PCIE0_GPR_PWRUP_RST_CTL                        (PCIE0_GPR_BASE + 0x18)
+#define PCIE0_GPR_ITS0_TRGTADDR_CTL            (PCIE0_GPR_BASE + 0x88)
+#define PCIE0_GPR_ITS1_TRGTADDR_CTL            (PCIE0_GPR_BASE + 0x90)
 #define PCIE0_PVT_BASE                         (PCIE0_BASE + 0x30000)
 #define PCIE0_NIC_CFG_GPV                      (PCIE0_BASE + 0x200000)
 #define PCIE0_NIC_CFG_P0                       (PCIE0_NIC_CFG_GPV + 0x08)
 #define PCIE1_GPR_BASE                         (PCIE1_BASE + 0x20000)
 #define PCIE1_GPR_SS_MODE_CTL                  (PCIE1_GPR_BASE + 0x10)
 #define PCIE1_GPR_PWRUP_RST_CTL                        (PCIE1_GPR_BASE + 0x18)
+#define PCIE1_GPR_ITS0_TRGTADDR_CTL            (PCIE1_GPR_BASE + 0x88)
+#define PCIE1_GPR_ITS1_TRGTADDR_CTL            (PCIE1_GPR_BASE + 0x90)
 #define PCIE1_PVT_BASE                         (PCIE1_BASE + 0x30000)
 #define PCIE1_NIC_CFG_GPV                      (PCIE1_BASE + 0x200000)
 #define PCIE1_NIC_CFG_P0                       (PCIE1_NIC_CFG_GPV + 0x08)
 #define PCIE2_GPR_BASE                         (PCIE2_BASE + 0x20000)
 #define PCIE2_GPR_SS_MODE_CTL                  (PCIE2_GPR_BASE + 0x10)
 #define PCIE2_GPR_PWRUP_RST_CTL                        (PCIE2_GPR_BASE + 0x18)
+#define PCIE2_GPR_ITS0_TRGTADDR_CTL            (PCIE2_GPR_BASE + 0x88)
+#define PCIE2_GPR_ITS1_TRGTADDR_CTL            (PCIE2_GPR_BASE + 0x90)
 #define PCIE2_PVT_BASE                         (PCIE2_BASE + 0x30000)
 #define PCIE2_NIC_CFG_GPV                      (PCIE2_BASE + 0x200000)
 #define PCIE2_NIC_CFG_P0                       (PCIE2_NIC_CFG_GPV + 0x08)
 #define PCIE3_GPR_BASE                         (PCIE3_BASE + 0x20000)
 #define PCIE3_GPR_SS_MODE_CTL                  (PCIE3_GPR_BASE + 0x10)
 #define PCIE3_GPR_PWRUP_RST_CTL                        (PCIE3_GPR_BASE + 0x18)
+#define PCIE3_GPR_ITS0_TRGTADDR_CTL            (PCIE3_GPR_BASE + 0x120)
+#define PCIE3_GPR_ITS1_TRGTADDR_CTL            (PCIE3_GPR_BASE + 0x128)
+#define PCIE3_GPR_ITS2_TRGTADDR_CTL            (PCIE3_GPR_BASE + 0x130)
+#define PCIE3_GPR_ITS3_TRGTADDR_CTL            (PCIE3_GPR_BASE + 0x138)
+#define PCIE3_GPR_ITS4_TRGTADDR_CTL            (PCIE3_GPR_BASE + 0x140)
 #define PCIE3_PVT_BASE                         (PCIE3_BASE + 0x30000)
 #define PCIE3_NIC_CFG_GPV                      (PCIE3_BASE + 0x200000)
 #define PCIE3_NIC_CFG_P0                       (PCIE3_NIC_CFG_GPV + 0x08)
 #define PCIE4_GPR_BASE                         (PCIE4_BASE + 0x20000)
 #define PCIE4_GPR_SS_MODE_CTL                  (PCIE4_GPR_BASE + 0x10)
 #define PCIE4_GPR_PWRUP_RST_CTL                        (PCIE4_GPR_BASE + 0x18)
+#define PCIE4_GPR_ITS0_TRGTADDR_CTL            (PCIE4_GPR_BASE + 0x120)
+#define PCIE4_GPR_ITS1_TRGTADDR_CTL            (PCIE4_GPR_BASE + 0x128)
+#define PCIE4_GPR_ITS2_TRGTADDR_CTL            (PCIE4_GPR_BASE + 0x130)
+#define PCIE4_GPR_ITS3_TRGTADDR_CTL            (PCIE4_GPR_BASE + 0x138)
+#define PCIE4_GPR_ITS4_TRGTADDR_CTL            (PCIE4_GPR_BASE + 0x140)
 #define PCIE4_PVT_BASE                         (PCIE4_BASE + 0x30000)
 #define PCIE4_NIC_CFG_GPV                      (PCIE4_BASE + 0x200000)
 #define PCIE4_NIC_CFG_P0                       (PCIE4_NIC_CFG_GPV + 0x08)
index 4dd25769f6ae1b5d128a147c7ea9f0955edf76d6..c5cda2599613e78b787e9ac919e835c4970b1c18 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef BS1000_DIMM_SPD_H
 #define BS1000_DIMM_SPD_H
 
-const void* baikal_dimm_spd_get(const unsigned dimm_idx);
+const void *baikal_dimm_spd_get(const unsigned int dimm_idx);
 void       baikal_dimm_spd_read(void);
 
 #endif /* BS1000_DIMM_SPD_H */
index 495ad110843cd840e2f6d9a32fbaf333ffff520c..5bd0aa08fb08e42e0361e6f7e0b67f16b36eaf10 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 #define BAIKAL_SEC_DTB_BASE            (BAIKAL_SCMM_SMMU_BASE + BAIKAL_SCMM_SMMU_SIZE)
 #define BAIKAL_NS_DTB_BASE             NS_DRAM0_BASE
 #define BAIKAL_NS_IMAGE_OFFSET         NS_DRAM1_BASE
+#define BAIKAL_NS_IMAGE_MAX_SIZE       NS_DRAM1_SIZE
 
 /* Parts of the boot image */
 #define BAIKAL_SCP_MAX_SIZE            (512 * 1024)
index aa621debaf3d7b7fca9f7058379472da184a842b..a85091700b07eb6a30ae9a2e86656da168f1c2d7 100644 (file)
@@ -7,6 +7,8 @@
 include lib/libfdt/libfdt.mk
 include lib/xlat_tables_v2/xlat_tables.mk
 
+$(eval $(call add_define_val,SDK_VERSION,$(SDK_VERSION)))
+
 HW_ASSISTED_COHERENCY  :=      1
 USE_COHERENT_MEM       :=      0
 
@@ -67,7 +69,7 @@ BL1_SOURCES           +=      drivers/delay_timer/delay_timer.c               \
                                plat/baikal/common/memtest.c                    \
                                plat/baikal/common/spd.c
 
-override BL1_LINKERFILE        :=      plat/baikal/common/bl1.ld.S
+override BL1_DEFAULT_LINKER_SCRIPT_SOURCE := plat/baikal/common/bl1.ld.S
 
 BL2_SOURCES            +=      common/desc_image_load.c                        \
                                drivers/io/io_fip.c                             \
@@ -112,6 +114,10 @@ BL31_SOURCES               +=      drivers/delay_timer/delay_timer.c               \
                                ${GICV3_SOURCES}                                \
                                $(LIBFDT_SRCS)
 
+ifeq (${ENABLE_PMF}, 1)
+BL31_SOURCES           +=      lib/pmf/pmf_smc.c
+endif
+
 ifeq ($(notdir $(CC)),armclang)
 TF_CFLAGS_aarch64      +=      -mcpu=cortex-a75
 else ifneq ($(findstring clang,$(notdir $(CC))),)
@@ -119,3 +125,9 @@ TF_CFLAGS_aarch64   +=      -mcpu=cortex-a75
 else
 TF_CFLAGS_aarch64      +=      -mtune=cortex-a75
 endif
+
+BL1_CPPFLAGS += -march=armv8-a+crc
+BL2_CPPFLAGS += -march=armv8-a+crc
+BL2U_CPPFLAGS += -march=armv8-a+crc
+BL31_CPPFLAGS += -march=armv8-a+crc
+BL32_CPPFLAGS += -march=armv8-a+crc
index 89c6dab75c119b63da058e3d37ac8d4f7ead61a5..c7dc76dfba7b670fe6d8f68beb890ce660efbefb 100644 (file)
@@ -29,8 +29,9 @@ void bl1_stack_area_check(void)
        }
 
        if (stack_area_ptr != (volatile uint64_t *)STACKS_START) {
-               const unsigned used  = STACKS_END - (uintptr_t)stack_area_ptr;
-               const unsigned total = STACKS_END - STACKS_START;
+               const unsigned int used  = STACKS_END - (uintptr_t)stack_area_ptr;
+               const unsigned int total = STACKS_END - STACKS_START;
+
                INFO("BL1: %u bytes (%u%%) of stack are used\n", used, used * 100 / total);
        } else {
                ERROR("BL1: stack has been overflowed\n");
index c037b41e60381b9b64e9c1d164e48af4472aae0c..eed1b42ef7eb699b42c322e45c28db5c34bab53c 100644 (file)
@@ -128,8 +128,7 @@ static bl_mem_params_node_t bl2_mem_params_descs[] = {
          SET_STATIC_PARAM_HEAD(image_info, PARAM_EP, VERSION_2, image_info_t,
                                0),
          .image_info.image_base = BAIKAL_NS_IMAGE_OFFSET,
-         .image_info.image_max_size = NS_DRAM0_BASE + NS_DRAM0_SIZE -
-                                      BAIKAL_NS_IMAGE_OFFSET,
+         .image_info.image_max_size = BAIKAL_NS_IMAGE_MAX_SIZE,
 # endif /* !PRELOADED_BL33_BASE */
 
          .next_handoff_image_id = INVALID_IMAGE_ID,
index fb686eddea587a63fbcd9a33bc961bcf0c253239..0f03156385509e4809872adfef4615237bdbbde3 100644 (file)
 # include <dw_spi_flash.h>
 #endif
 
-void bootflash_init(void)
+int bootflash_init(void)
 {
 #if defined(BAIKAL_MBM10) || defined(BAIKAL_MBM20)
-       scp_flash_init();
+       return scp_flash_init();
 #else
-       spi_flash_init(BAIKAL_BOOT_SPI_SS_LINE);
+       return spi_flash_init(BAIKAL_BOOT_SPI_SS_LINE);
 #endif
 }
 
index 24d68d01b60ad4fc553739db6af84b56f43ec8ac..b18ee61c74fbfa85b609f82715068aaca2856ba2 100644 (file)
@@ -36,12 +36,12 @@ bool fdt_node_is_enabled(const void *fdt, const int nodeoffset)
 
 void fdt_memory_node_set(void *fdt,
                         const uint64_t region_descs[][2],
-                        const unsigned region_num)
+                        const unsigned int region_num)
 {
        int err;
        uint64_t memregs[4][2];
        int node;
-       unsigned region;
+       unsigned int region;
 
        assert(fdt != NULL);
        assert(region_num >= 1 && region_num <= ARRAY_SIZE(memregs));
index 202aa8ebcd7ecede754e5fdb1bc6da87215f4bb7..6fc052ac1550de70784c258e1eeda8b0324edfa9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -9,6 +9,7 @@
 #include <plat/common/platform.h>
 
 #include <baikal_def.h>
+#include <baikal_gicv3.h>
 #include <platform_def.h>
 
 /* The GICv3 driver only needs to be initialized in EL3 */
index 8a4d2e750e48fb699ac35491b4df63f4a60d88ac..ca42f1cbf8110abfb3b8ca1a08bd801c5076268d 100644 (file)
 #include <crc.h>
 #include <platform_def.h>
 
+#include <drivers/mmc.h>
+#include <baikal_mshc.h>
+#include <baikal_def.h>
+
 /* IO devices */
 static const io_dev_connector_t *fip_dev_con;
 static uintptr_t fip_dev_handle;
@@ -201,81 +205,96 @@ static int open_fip(const uintptr_t spec)
        return local_image_handle;
 }
 
+#ifdef IMAGE_BL1
 /* Return 0 for equal uuids. */
 static inline int compare_uuids(const uuid_t *uuid1, const uuid_t *uuid2)
 {
        return memcmp(uuid1, uuid2, sizeof(uuid_t));
 }
 
-static int read_fdt_from_flash(uint32_t flashaddr)
+size_t bootflash_read_blocks(int lba, uintptr_t buf, size_t size)
+{
+       if (bootflash_read(lba * MMC_BLOCK_SIZE, (void *)buf, size)) {
+               return 0;
+       } else {
+               return size;
+       }
+}
+
+/* TODO: use io_open, io_read */
+static int read_fdt(uintptr_t src, uintptr_t dst, void *func)
 {
-       uint8_t *dst = (void *)BAIKAL_SEC_DTB_BASE;
+       size_t (*read_blocks)(int lba, uintptr_t dst, size_t size) = func;
        int err;
        const struct fdt_header *const fdt_header = (void *)dst;
        uint32_t fdt_totalsize;
 
-       err = bootflash_read(flashaddr, dst, sizeof(struct fdt_header));
-       flush_dcache_range((uintptr_t)dst, sizeof(struct fdt_header));
-       if (err) {
-               return -ENOENT;
+       err = read_blocks((src / MMC_BLOCK_SIZE),
+               ROUND_DOWN(dst),
+               ROUND_UP(sizeof(struct fdt_header)));
+       if (!err) {
+               VERBOSE("%s: -- read_blocks\n", __func__);
+               return -1;
        }
 
        if (be32toh(fdt_header->magic) != FDT_MAGIC) {
                ERROR("%s: FDT header magic is wrong\n", __func__);
-               return -ENOENT;
+               return -1;
        }
 
        fdt_totalsize = be32toh(fdt_header->totalsize);
        if (fdt_totalsize < sizeof(struct fdt_header) ||
            fdt_totalsize > BAIKAL_DTB_MAX_SIZE) {
                ERROR("%s: FDT total size is wrong: %u\n", __func__, fdt_totalsize);
-               return -ENOENT;
+               return -1;
        }
 
-       dst       += sizeof(struct fdt_header);
-       flashaddr += sizeof(struct fdt_header);
-       err = bootflash_read(flashaddr, dst, fdt_totalsize - sizeof(struct fdt_header));
-       flush_dcache_range((uintptr_t)dst, fdt_totalsize - sizeof(struct fdt_header));
-       if (err) {
-               return -ENOENT;
+       err = read_blocks((src / MMC_BLOCK_SIZE),
+               ROUND_DOWN(dst),
+               ROUND_UP(fdt_totalsize));
+       if (!err) {
+               VERBOSE("%s: -- read_blocks\n", __func__);
+               return -1;
        }
 
-       INFO("DTB: crc32:0x%08x size:%u\n",
+       INFO("BL1: DTB crc32:0x%08x size:%u\n",
                crc32((void *)BAIKAL_SEC_DTB_BASE, fdt_totalsize, 0),
                fdt_totalsize);
 
        return 0;
 }
-
-static int read_fip_from_flash(uintptr_t local_image_handle, uint32_t offset)
+static int read_fip(uintptr_t src, uintptr_t dst, uintptr_t local_image_handle, void *func)
 {
+       size_t (*read_blocks)(int lba, uintptr_t dst, size_t size) = func;
        fip_toc_entry_t entry = {0};
        int result, size = 0;
        size_t bytes_read;
-       uint8_t *addr = (uint8_t *)BAIKAL_FIP_BASE;
-       int src = offset;
        static const uuid_t uuid_null = {0};
 
        /* Read FIP Header part */
        result = io_seek(local_image_handle, IO_SEEK_SET, sizeof(fip_toc_header_t));
        if (result != 0) {
-               WARN("fip_file_open: failed to seek\n");
-               result = -ENOENT;
+               VERBOSE("%s: -- io_seek\n", __func__);
+               return -1;
        }
 
-       result = bootflash_read(src, addr, sizeof(fip_toc_header_t));
-       flush_dcache_range((uintptr_t)addr, sizeof(fip_toc_header_t));
-       if (result != 0) {
-               result = -ENOENT;
+       result = read_blocks((src / MMC_BLOCK_SIZE),
+               ROUND_DOWN(dst),
+               ROUND_UP(sizeof(fip_toc_header_t)));
+       if (!result) {
+               VERBOSE("%s: -- read_blocks\n", __func__);
+               return -1;
        }
 
-       src  += sizeof(fip_toc_header_t);
-       addr += sizeof(fip_toc_header_t);
+       src += sizeof(fip_toc_header_t);
+       dst += sizeof(fip_toc_header_t);
        do {
-               result = bootflash_read(src, addr, sizeof(fip_toc_entry_t));
-               flush_dcache_range((uintptr_t)addr, sizeof(fip_toc_entry_t));
-               if (result != 0) {
-                       result = -ENOENT;
+               result = read_blocks((src / MMC_BLOCK_SIZE),
+                       ROUND_DOWN(dst),
+                       ROUND_UP(sizeof(fip_toc_entry_t)));
+               if (!result) {
+                       VERBOSE("%s: -- read_blocks\n", __func__);
+                       return -1;
                }
 
                result = io_read(local_image_handle,
@@ -283,35 +302,137 @@ static int read_fip_from_flash(uintptr_t local_image_handle, uint32_t offset)
                                 sizeof(entry),
                                 &bytes_read);
                if (result != 0) {
-                       WARN("Failed to read FIP (%i)\n", result);
+                       VERBOSE("%s: -- io_read\n", __func__);
+                       return -1;
                }
 
-               src  += sizeof(fip_toc_entry_t);
-               addr += sizeof(fip_toc_entry_t);
+               src += sizeof(fip_toc_entry_t);
+               dst += sizeof(fip_toc_entry_t);
                size += entry.size;
+
        } while (compare_uuids(&entry.uuid, &uuid_null) != 0);
 
-       result = bootflash_read(src, addr, size);
-       flush_dcache_range((uintptr_t)addr, size);
-       if (result != 0) {
-               result = -ENOENT;
+       result = read_blocks((src / MMC_BLOCK_SIZE),
+               ROUND_DOWN(dst),
+               ROUND_UP(size));
+       if (!result) {
+               VERBOSE("%s: -- read_blocks\n", __func__);
+               return -1;
        }
 
-       INFO("FIP: crc32:0x%08x size:%lu\n",
-               crc32((void *)BAIKAL_FIP_BASE, (uintptr_t)addr + size - BAIKAL_FIP_BASE, 0),
-               (uintptr_t)addr + size - BAIKAL_FIP_BASE);
+       INFO("BL1: FIP crc32:0x%08x size:%lu\n",
+               crc32((void *)BAIKAL_FIP_BASE, dst + size - BAIKAL_FIP_BASE, 0),
+               dst + size - BAIKAL_FIP_BASE);
 
-       return result;
+       return 0;
 }
 
-static int read_flash(uintptr_t local_image_handle)
+#ifdef BAIKAL_SD_FIRMWARE_DEBUG
+int mmc_test(uint32_t dst)
 {
-       int result;
+       int i = 0;
+       uint32_t cnt[] = {1, 100, 1000, 0};
 
-       result  = read_fdt_from_flash(BAIKAL_DTB_OFFSET);
-       result |= read_fip_from_flash(local_image_handle, BAIKAL_FIP_OFFSET);
-       return result;
+       while (cnt[i]) {
+               uint32_t size = MMC_BLOCK_SIZE * cnt[i];
+               uintptr_t buf  = BAIKAL_FIP_BASE + 0 * size;
+               uintptr_t bufa = BAIKAL_FIP_BASE + 1 * size;
+               uintptr_t bufb = BAIKAL_FIP_BASE + 2 * size;
+
+               memset((void *)bufa, 0xaa, size);
+               memset((void *)bufb, 0xbb, size);
+
+               mmc_read_blocks(dst     / MMC_BLOCK_SIZE, buf,  size); /* save */
+               mmc_write_blocks(dst    / MMC_BLOCK_SIZE, bufa, size);
+               mmc_read_blocks(dst     / MMC_BLOCK_SIZE, bufb, size);
+               mmc_write_blocks(dst    / MMC_BLOCK_SIZE, buf,  size); /* restore */
+
+               int ret = memcmp((void *)bufa, (void *)bufb, size);
+
+               if (ret) {
+                       VERBOSE("%s: -- mmc fail\n", __func__);
+                       return ret;
+               }
+
+               i++;
+       }
+
+       return 0;
 }
+int mmc_copy(uint32_t dst, uint32_t src, uint32_t size)
+{
+       uintptr_t buf = BAIKAL_FIP_BASE;
+       uint64_t part;
+
+       bootflash_init();
+       while (size) {
+               part = MIN(size, 1024 * MMC_BLOCK_SIZE);
+               bootflash_read(src, (void *)buf, part);
+               mmc_write_blocks(dst / MMC_BLOCK_SIZE, buf, part);
+               src  += part;
+               dst  += part;
+               size -= part;
+       }
+
+       return 0;
+}
+#endif /* BAIKAL_SD_FIRMWARE_DEBUG */
+
+static int read_image(uintptr_t local_image_handle)
+{
+       int ret;
+
+       /* sd */
+#ifdef BAIKAL_SD_FIRMWARE
+       ret = dw_mshc_init();
+       if (ret) {
+               goto skip;
+       }
+
+#ifdef BAIKAL_SD_FIRMWARE_TEST
+       VERBOSE("BL1: test sd/mmc...\n");
+       ret = mmc_test(BAIKAL_SD_FIRMWARE_OFFSET);
+       if (ret) {
+               goto skip;
+       }
+#endif
+
+#ifdef BAIKAL_SD_FIRMWARE_DEBUG
+       VERBOSE("BL1: copy firmware to sd/mmc...\n");
+       ret = mmc_copy(BAIKAL_SD_FIRMWARE_OFFSET, BAIKAL_BOOT_OFFSET, BAIKAL_BOOT_MAX_SIZE);
+       if (ret) {
+               goto skip;
+       }
+#endif /* BAIKAL_SD_FIRMWARE_DEBUG */
+
+       VERBOSE("BL1: read firmware from sd/mmc...\n");
+       ret = read_fdt(BAIKAL_SD_FIRMWARE_OFFSET + BAIKAL_DTB_OFFSET, BAIKAL_SEC_DTB_BASE, (void *)mmc_read_blocks);
+       if (ret) {
+               goto skip;
+       }
+       ret = read_fip(BAIKAL_SD_FIRMWARE_OFFSET + BAIKAL_FIP_OFFSET, BAIKAL_FIP_BASE, local_image_handle, (void *)mmc_read_blocks);
+
+skip:
+       dw_mshc_off();
+       if (ret == 0) {
+               return ret;
+       }
+#endif /* BAIKAL_SD_FIRMWARE */
+
+       /* flash */
+       ret = bootflash_init();
+       if (ret) {
+               return ret;
+       }
+       VERBOSE("BL1: read firmware from spi flash...\n");
+       ret  = read_fdt(BAIKAL_DTB_OFFSET, BAIKAL_SEC_DTB_BASE, (void *)bootflash_read_blocks);
+       if (ret) {
+               return ret;
+       }
+       ret = read_fip(BAIKAL_FIP_OFFSET, BAIKAL_FIP_BASE, local_image_handle, (void *)bootflash_read_blocks);
+       return ret;
+}
+#endif /* IMAGE_BL1 */
 
 static inline int is_valid_header(fip_toc_header_t *header)
 {
@@ -332,13 +453,14 @@ static int open_memmap(const uintptr_t spec)
        if (result == 0) {
                result = io_open(memmap_dev_handle, spec, &local_image_handle);
                if (result == 0) {
-#ifndef IMAGE_BL1
+#ifdef IMAGE_BL1
+                       result = read_image(local_image_handle);
+#endif
                        if (!(is_valid_header((fip_toc_header_t *)BAIKAL_FIP_BASE))) {
-                               result = read_flash(local_image_handle);
+                               VERBOSE("%s: -- broken fip\n", __func__);
+                               result = -1;
                        }
-#else
-                       result = read_flash(local_image_handle);
-#endif
+
                        io_close(local_image_handle);
                }
        }
diff --git a/plat/baikal/common/baikal_mshc.c b/plat/baikal/common/baikal_mshc.c
new file mode 100644 (file)
index 0000000..ff32463
--- /dev/null
@@ -0,0 +1,585 @@
+/*
+ * Copyright (c) 2023, Baikal Electronics, JSC. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+
+#include <arch.h>
+#include <arch_helpers.h>
+#include <common/debug.h>
+#include <drivers/delay_timer.h>
+#include <lib/mmio.h>
+#include <lib/utils_def.h>
+
+#include <baikal_mshc.h>
+#include <baikal_def.h>
+
+/* TODO: rework */
+#if defined(BAIKAL_DBM10) || defined(BAIKAL_DBM20) || \
+    defined(BAIKAL_MBM10) || defined(BAIKAL_MBM20)
+#include <bm1000_cmu.h>
+#endif
+
+static int reg_size(int Reg)
+{
+       int size = 0;
+
+       switch (Reg) {
+       case SDHCI_DMA_ADDRESS:
+       case SDHCI_ARGUMENT:
+       case SDHCI_BUFFER:
+       case SDHCI_PRESENT_STATE:
+       case SDHCI_MSHC_VER:
+       case SDHCI_CAPABILITIES:
+       case SDHCI_CAPABILITIES_1:
+       case SDHCI_MAX_CURRENT:
+       case SDHCI_ADMA_ADDRESS:
+       case SDHCI_ADMA_ADDRESS_HI:
+       case SDHCI_RESPONSE_0:
+       case SDHCI_RESPONSE_1:
+       case SDHCI_RESPONSE_2:
+       case SDHCI_RESPONSE_3:
+               size = 4;
+               break;
+
+       case SDHCI_TRANSFER_MODE:
+       case SDHCI_BLOCK_SIZE:
+       case SDHCI_16BIT_BLK_CNT:
+       case SDHCI_COMMAND:
+       case SDHCI_CLOCK_CONTROL:
+       case SDHCI_INT_STATUS:
+       case SDHCI_ERR_STATUS:
+       case SDHCI_INT_ENABLE:
+       case SDHCI_ERR_ENABLE:
+       case SDHCI_SIGNAL_ENABLE:
+       case SDHCI_ERR_SIGNAL_ENABLE:
+       case SDHCI_AUTO_CMD_STATUS:
+       case SDHCI_HOST_CONTROL2:
+       case SDHCI_SET_INT_ERROR:
+       case SDHCI_SET_ACMD12_ERROR:
+       case SDHCI_PRESET_INIT:
+       case SDHCI_PRESET_DS:
+       case SDHCI_PRESET_HS:
+       case SDHCI_PRESET_FOR_SDR12:
+       case SDHCI_PRESET_FOR_SDR25:
+       case SDHCI_PRESET_FOR_SDR50:
+       case SDHCI_PRESET_FOR_SDR104:
+       case SDHCI_PRESET_FOR_DDR50:
+       case SDHCI_PRESET_FOR_HS400:
+       case SDHCI_SLOT_INT_STATUS:
+       case SDHCI_HOST_VERSION:
+       case SDHCI_EMMC_CONTROL:
+               size = 2;
+               break;
+
+       case SDHCI_TIMEOUT_CONTROL:
+       case SDHCI_SOFTWARE_RESET:
+       case SDHCI_ADMA_ERROR:
+       case SDHCI_MSHC_CTRL:
+       case SDHCI_HOST_CONTROL:
+       case SDHCI_POWER_CONTROL:
+       case SDHCI_BLOCK_GAP_CONTROL:
+       case SDHCI_WAKE_UP_CONTROL:
+               size = 1;
+               break;
+       }
+
+       return size;
+}
+
+static int reg_write(uintptr_t base, int Val, int Reg)
+{
+       switch (reg_size(Reg)) {
+       case 4:
+               *(uint32_t *) (base + Reg) = Val;
+               break;
+       case 2:
+               *(uint16_t *) (base + Reg) = Val;
+               break;
+       case 1:
+               *(uint8_t *)  (base + Reg) = Val;
+               break;
+       }
+
+       return -1;
+}
+
+static int reg_read(uintptr_t base, int Reg)
+{
+       switch (reg_size(Reg)) {
+       case 4:
+               return *(uint32_t *) (base + Reg);
+       case 2:
+               return *(uint16_t *) (base + Reg);
+       case 1:
+               return *(uint8_t *)  (base + Reg);
+       }
+
+       return -1;
+}
+
+static void led_on(uintptr_t base, uint32_t on)
+{
+       int reg = reg_read(base, SDHCI_HOST_CONTROL);
+
+       if (on) {
+               reg &= ~SDHCI_CTRL_LED;
+       } else {
+               reg |=  SDHCI_CTRL_LED;
+       }
+
+       reg_write(base, reg, SDHCI_HOST_CONTROL);
+}
+
+static int speed_mode(uintptr_t base, uint32_t mode)
+{
+       int ctrl1 = reg_read(base, SDHCI_HOST_CONTROL);
+       int ctrl2 = reg_read(base, SDHCI_HOST_CONTROL2);
+
+       switch (mode) {
+       case SD_DEFAULT:
+               ctrl1 &= ~SDHCI_CTRL_HISPD;
+               ctrl2 &= ~SDHCI_CTRL_VDD_180;
+               break;
+       case SD_HIGH:
+               ctrl1 |=  SDHCI_CTRL_HISPD;
+               ctrl2 &= ~SDHCI_CTRL_VDD_180;
+               break;
+       case SD_12:
+               ctrl2 |=  SDHCI_CTRL_UHS_SDR12;
+               ctrl2 |=  SDHCI_CTRL_VDD_180;
+               break;
+       case SD_25:
+               ctrl2 |=  SDHCI_CTRL_UHS_SDR25;
+               ctrl2 |=  SDHCI_CTRL_VDD_180;
+               break;
+       case SD_50:
+               ctrl2 |=  SDHCI_CTRL_UHS_SDR50;
+               ctrl2 |=  SDHCI_CTRL_VDD_180;
+               break;
+       case SD_104:
+               ctrl2 |=  SDHCI_CTRL_UHS_SDR104;
+               ctrl2 |=  SDHCI_CTRL_VDD_180;
+               break;
+       case DD_50:
+               ctrl2 |=  SDHCI_CTRL_UHS_DDR50;
+               ctrl2 |=  SDHCI_CTRL_VDD_180;
+               break;
+       default:
+               return -1;
+       }
+
+       reg_write(base, ctrl1, SDHCI_HOST_CONTROL);
+       reg_write(base, ctrl2, SDHCI_HOST_CONTROL2);
+       return 0;
+}
+
+static int clock_supply(uintptr_t base, uint32_t Freq)
+{
+       int ret;
+       int Reg;
+
+       /* Disable */
+       Reg  = reg_read(base, SDHCI_CLOCK_CONTROL);
+       Reg &= ~SDHCI_CLOCK_PLL_EN;
+       Reg &= ~SDHCI_CLOCK_CARD_EN;
+       reg_write(base, Reg, SDHCI_CLOCK_CONTROL);
+
+       /* TODO: rework */
+       /* Config */
+#if defined(BM1000_CMU_H)
+       int Div = MMAVLSP_PLL_FREQ / (2 * Freq);
+
+       cmu_clkch_enable_by_base(MMAVLSP_CMU0_CLKCHCTL_MSHC_TX_X2, Div);
+#elif defined(BS1000_CMU_H)
+       /* cmu_clkch_set_rate(MMAVLSP_CMU0_CLKCHCTL_MSHC_TX_X2, MMAVLSP_PLL_FREQ); ?? */
+       /* cmu_clkch_enable(MMAVLSP_CMU0_CLKCHCTL_MSHC_TX_X2); ?? */
+       return -1;
+#elif defined(BL1000_CMU_H)
+       return -1;
+#else
+       return -1;
+#endif /* CMU_H */
+
+       /* Wait */
+       ret = WAIT(!(reg_read(base, SDHCI_CLOCK_CONTROL) & SDHCI_CLOCK_STABLE));
+       if (ret) {
+               return -1;
+       }
+
+       /* Enable */
+       Reg  = reg_read(base, SDHCI_CLOCK_CONTROL);
+       Reg |= SDHCI_CLOCK_PLL_EN;
+       Reg |= SDHCI_CLOCK_CARD_EN;
+       reg_write(base, Reg, SDHCI_CLOCK_CONTROL);
+
+       /* Reset */
+       reg_write(base, SDHCI_RESET_CMD,  SDHCI_SOFTWARE_RESET);
+       reg_write(base, SDHCI_RESET_DATA, SDHCI_SOFTWARE_RESET);
+       udelay(1000);
+       ret = WAIT(reg_read(base, SDHCI_SOFTWARE_RESET));
+       if (ret) {
+               return ret;
+       }
+
+       udelay(1000);
+       return ret;
+}
+
+static int config_width(uintptr_t base, uint32_t width)
+{
+       int ctrl = reg_read(base, SDHCI_HOST_CONTROL);
+       reg_ctl1_t *reg = (void *)&ctrl;
+
+       switch (width) {
+       case MMC_BUS_WIDTH_1:
+               reg->width     = 0;
+               reg->ext_width = 0;
+               break;
+       case MMC_BUS_WIDTH_4:
+               reg->width     = 1;
+               reg->ext_width = 0;
+               break;
+       case MMC_BUS_WIDTH_8:
+               reg->width     = 0;
+               reg->ext_width = 1;
+               break;
+       default:
+               return -1;
+       }
+
+       reg_write(base, ctrl, SDHCI_HOST_CONTROL);
+       return 0;
+}
+
+static void reset(uintptr_t base)
+{
+       reg_write(base, SDHCI_POWER_OFF, SDHCI_POWER_CONTROL);
+       udelay(1000);
+
+       /* irq */
+       reg_write(base, 0xffff, SDHCI_INT_STATUS);
+       reg_write(base, 0xffff, SDHCI_ERR_STATUS);
+       reg_write(base, 0xffff, SDHCI_INT_ENABLE);
+       reg_write(base, 0xffff, SDHCI_ERR_ENABLE);
+       reg_write(base, 0x0000, SDHCI_SIGNAL_ENABLE);
+       reg_write(base, 0x0000, SDHCI_ERR_SIGNAL_ENABLE);
+
+       /* config */
+       reg_write(base, 0, SDHCI_HOST_CONTROL);
+       reg_write(base,
+               SDHCI_CTRL_V4_MODE |
+               SDHCI_CTRL_64BIT_ADDR |
+               SDHCI_CTRL_ASYNC,
+               SDHCI_HOST_CONTROL2);
+       reg_write(base, 0, SDHCI_TRANSFER_MODE);
+       reg_write(base, 0, SDHCI_16BIT_BLK_CNT);
+       reg_write(base, 0, SDHCI_32BIT_BLK_CNT);
+       reg_write(base, 0, SDHCI_ARGUMENT);
+       reg_write(base, 0, SDHCI_COMMAND);
+       reg_write(base, SDHCI_DEFAULT_BLOCK_SIZE, SDHCI_BLOCK_SIZE);
+       reg_write(base, SDHCI_TIMEOUT_DEFAULT, SDHCI_TIMEOUT_CONTROL);
+
+       /* clock */
+       int reg;
+
+       reg = reg_read(base, SDHCI_CLOCK_CONTROL);
+       reg &= SDHCI_CLOCK_EN;
+       reg &= SDHCI_CLOCK_CARD_EN;
+       reg &= SDHCI_CLOCK_PLL_EN;
+       reg_write(base, reg, SDHCI_CLOCK_CONTROL);
+       udelay(1000);
+
+       led_on(base, false);
+}
+
+static int init_host(uintptr_t base)
+{
+       reset(base);
+       reg_write(base, SDHCI_POWER_330 | SDHCI_POWER_ON, SDHCI_POWER_CONTROL);
+       reg_write(base, SDHCI_CLOCK_EN, SDHCI_CLOCK_CONTROL);
+       udelay(1000);
+       return 0;
+}
+
+/*
+ * ops
+ */
+static int dw_send_cmd(struct mmc_cmd *cmd)
+{
+       int ret;
+       uintptr_t base = MMAVLSP_EMMC_BASE;
+       uint32_t CmdRaw = 0;
+       reg_cmd_t *Cmd = (void *)&CmdRaw;
+
+       /* busy */
+       ret = WAIT(reg_read(base, SDHCI_PRESENT_STATE) & (SDHCI_CMD_INHIBIT | SDHCI_DATA_INHIBIT));
+       if (ret) {
+               goto exit;
+       }
+
+       /* clean */
+       reg_write(base, 0xffff, SDHCI_INT_STATUS);
+       reg_write(base, 0xffff, SDHCI_ERR_STATUS);
+       reg_write(base, 0x0, SDHCI_RESPONSE_0);
+       reg_write(base, 0x0, SDHCI_RESPONSE_1);
+       reg_write(base, 0x0, SDHCI_RESPONSE_2);
+       reg_write(base, 0x0, SDHCI_RESPONSE_3);
+
+       /* cmd */
+       Cmd->index = cmd->cmd_idx;
+       if (Cmd->index == MMC_CMD(14) ||
+               Cmd->index == MMC_CMD(19) ||
+               Cmd->index == MMC_CMD(17) ||
+               Cmd->index == MMC_CMD(18) ||
+               Cmd->index == MMC_CMD(21) ||
+               Cmd->index == MMC_CMD(24) ||
+               Cmd->index == MMC_CMD(25) ||
+               Cmd->index == MMC_CMD(26) ||
+               Cmd->index == MMC_CMD(27) ||
+               Cmd->index == MMC_CMD(51) ||
+               Cmd->index == MMC_CMD(49)) {
+               Cmd->data_present = 1;   /* 0-nodata, 1-data */
+       }
+
+       /* mode */
+       uint32_t Mode = reg_read(base, SDHCI_TRANSFER_MODE);
+       reg_mode_t *mode = (void *)&Mode;
+
+       if (Cmd->index == MMC_CMD(24) || Cmd->index == MMC_CMD(25)) {
+               mode->xfer_dir = 0;
+       } else {
+               mode->xfer_dir = 1;
+       }
+
+       reg_write(base, Mode, SDHCI_TRANSFER_MODE);
+
+       if (cmd->resp_type & MMC_RSP_136) {
+               Cmd->resp_type = SDHCI_CMD_RESP_LONG;
+       } else if (cmd->resp_type & (MMC_RSP_48 | MMC_RSP_BUSY)) {
+               Cmd->resp_type = SDHCI_CMD_RESP_SHORT_BUSY;
+       } else if (cmd->resp_type & MMC_RSP_48) {
+               Cmd->resp_type = SDHCI_CMD_RESP_SHORT;
+       } else {
+               Cmd->resp_type = SDHCI_CMD_RESP_NONE;
+       }
+       if (cmd->resp_type & MMC_RSP_CRC) {
+               Cmd->crc_chk = 1;
+       }
+       if (cmd->resp_type & MMC_RSP_CMD_IDX) {
+               Cmd->index_chk = 1;
+       }
+
+       /* exec */
+       led_on(base, true);
+       reg_write(base, cmd->cmd_arg, SDHCI_ARGUMENT);
+       reg_write(base, CmdRaw, SDHCI_COMMAND);
+
+       /* resp */
+       ret = WAIT(!(reg_read(base, SDHCI_INT_STATUS) & SDHCI_INT_RESPONSE));
+       reg_write(base, SDHCI_INT_RESPONSE, SDHCI_INT_STATUS);
+       if (ret) {
+               goto exit;
+       }
+
+       cmd->resp_data[0] = reg_read(base, SDHCI_RESPONSE_0);
+       cmd->resp_data[1] = reg_read(base, SDHCI_RESPONSE_1);
+       cmd->resp_data[2] = reg_read(base, SDHCI_RESPONSE_2);
+       cmd->resp_data[3] = reg_read(base, SDHCI_RESPONSE_3);
+
+       /* error */
+       if (reg_read(base, SDHCI_ERR_STATUS)) {
+               reg_write(base, 0xffff, SDHCI_ERR_STATUS);
+               ret = -1;
+               goto exit;
+       }
+
+exit:
+       led_on(base, false);
+       return ret;
+}
+
+static int dw_prepare(int lba, uintptr_t buf, size_t size)
+{
+       int ret;
+       uintptr_t base = MMAVLSP_EMMC_BASE;
+       uint32_t Blocksize = size < SDHCI_DEFAULT_BLOCK_SIZE ? size : SDHCI_DEFAULT_BLOCK_SIZE;
+       uint32_t Blocks = size / Blocksize;
+       uint32_t Mode = 0;
+       reg_mode_t *mode = (void *)&Mode;
+
+       /* busy */
+       ret = WAIT(reg_read(base, SDHCI_PRESENT_STATE) & (SDHCI_CMD_INHIBIT | SDHCI_DATA_INHIBIT));
+       if (ret) {
+               return -3;
+       }
+
+       if (Blocks > 1) {
+               mode->block_cnt_en = 1;
+               mode->multi_block  = 1;
+       }
+
+       reg_write(base, Blocksize, SDHCI_BLOCK_SIZE);
+       reg_write(base, Blocks,    SDHCI_32BIT_BLK_CNT);
+       reg_write(base, Mode,      SDHCI_TRANSFER_MODE);
+
+       return 0;
+}
+
+static int dw_read(int lba, uintptr_t buf, size_t size)
+{
+       int ret;
+       uintptr_t base = MMAVLSP_EMMC_BASE;
+       uint32_t j;
+       uint32_t Iter;
+       uint32_t *P = (void *)buf;
+       uint32_t Blocksize = reg_read(base, SDHCI_BLOCK_SIZE);
+       uint32_t Blocks    = reg_read(base, SDHCI_32BIT_BLK_CNT);
+
+       led_on(base, true);
+       for (j = 0; j < Blocks; j++) {
+               ret = WAIT(!(reg_read(base, SDHCI_INT_STATUS) & SDHCI_INT_DATA_AVAIL));
+               reg_write(base, SDHCI_INT_DATA_AVAIL, SDHCI_INT_STATUS);
+               if (ret) {
+                       goto exit;
+               }
+               for (Iter = 0; Iter < Blocksize / sizeof(uint32_t); Iter++) {
+                       *P++ = *(uint32_t *)(base + SDHCI_BUFFER);
+               }
+       }
+
+       /* end */
+       ret = WAIT(!(reg_read(base, SDHCI_INT_STATUS) & SDHCI_INT_DATA_END));
+       reg_write(base, SDHCI_INT_DATA_END, SDHCI_INT_STATUS);
+       if (ret) {
+               goto exit;
+       }
+
+       /* multi */
+       int mode = reg_read(base, SDHCI_TRANSFER_MODE);
+
+       if (mode & SDHCI_TRNS_MULTI) {
+               if (reg_read(base, SDHCI_32BIT_BLK_CNT)) {
+                       ret = -1;
+                       goto exit;
+               }
+       }
+
+       /* error */
+       if (reg_read(base, SDHCI_ERR_STATUS)) {
+               ret = -1;
+               reg_write(base, 0xffff, SDHCI_ERR_STATUS);
+               goto exit;
+       }
+
+exit:
+       led_on(base, false);
+       return ret;
+}
+
+static int dw_write(int lba, uintptr_t buf, size_t size)
+{
+       int ret;
+       uintptr_t base = MMAVLSP_EMMC_BASE;
+       uint32_t j;
+       uint32_t Iter;
+       uint32_t *P = (void *)buf;
+       uint32_t Blocksize = reg_read(base, SDHCI_BLOCK_SIZE);
+       uint32_t Blocks    = reg_read(base, SDHCI_32BIT_BLK_CNT);
+
+       led_on(base, true);
+       for (j = 0; j < Blocks; j++) {
+               ret = WAIT(!(reg_read(base, SDHCI_INT_STATUS) & SDHCI_INT_SPACE_AVAIL));
+               reg_write(base, SDHCI_INT_SPACE_AVAIL, SDHCI_INT_STATUS);
+               if (ret) {
+                       goto exit;
+               }
+               for (Iter = 0; Iter < Blocksize / sizeof(uint32_t); Iter++) {
+                       *(uint32_t *)(base + SDHCI_BUFFER) = *P++;
+               }
+       }
+
+       /* end */
+       ret = WAIT(!(reg_read(base, SDHCI_INT_STATUS) & SDHCI_INT_DATA_END));
+       reg_write(base, SDHCI_INT_DATA_END, SDHCI_INT_STATUS);
+       if (ret) {
+               goto exit;
+       }
+
+       /* multi */
+       if (reg_read(base, SDHCI_TRANSFER_MODE) & SDHCI_TRNS_MULTI) {
+               ret = WAIT(reg_read(base, SDHCI_32BIT_BLK_CNT));
+               if (ret) {
+                       goto exit;
+               }
+       }
+
+       /* error */
+       if (reg_read(base, SDHCI_ERR_STATUS)) {
+               ret = -1;
+               reg_write(base, 0xffff, SDHCI_ERR_STATUS);
+               goto exit;
+       }
+
+exit:
+       led_on(base, false);
+       return ret;
+}
+
+static int dw_set_ios(unsigned int clk, unsigned int width)
+{
+       uintptr_t base = MMAVLSP_EMMC_BASE;
+
+       clock_supply(base, clk);
+       config_width(base, width);
+       return 0;
+}
+
+static void dw_init(void)
+{
+       uintptr_t base = MMAVLSP_EMMC_BASE;
+
+       init_host(base);
+       clock_supply(base, SDHCI_INIT_CLOCK);
+       speed_mode(base, SD_DEFAULT);
+}
+
+void dw_mshc_off(void)
+{
+       uintptr_t base = MMAVLSP_EMMC_BASE;
+
+       reset(base);
+}
+
+static const struct mmc_ops dw_mmc_ops = {
+       .init           = dw_init,
+       .send_cmd       = dw_send_cmd,
+       .set_ios        = dw_set_ios,
+       .prepare        = dw_prepare,
+       .read           = dw_read,
+       .write          = dw_write,
+};
+
+int dw_mshc_init(void)
+{
+       int err;
+       static struct mmc_device_info info;
+
+       memset(&info, 0, sizeof(info));
+#if 0
+       /* eMMC */
+       info.mmc_dev_type = MMC_IS_EMMC;
+       info.ocr_voltage = OCR_3_2_3_3;
+       err = mmc_init(&dw_mmc_ops, SDHCI_DEFAULT_CLOCK, MMC_BUS_WIDTH_8, MMC_FLAG_CMD23, &info);
+#else
+       /* SD */
+       info.mmc_dev_type = MMC_IS_SD;
+       info.ocr_voltage = OCR_3_2_3_3;
+       err = mmc_init(&dw_mmc_ops, SDHCI_DEFAULT_CLOCK, MMC_BUS_WIDTH_4, 0, &info);
+#endif
+       return err;
+}
index f03645f8972c1ebf5a7b82b1d9ff39ebfac0dfb4..6485fbd9cf5b035728908f894c6d523252dcef97 100644 (file)
@@ -11,9 +11,9 @@
 #include <baikal_def.h>
 #include <baikal_pvt.h>
 
-static uintptr_t pvt_get_reg_addr(const uintptr_t base, const unsigned offset)
+static uintptr_t pvt_get_reg_addr(const uintptr_t base, const unsigned int offset)
 {
-       unsigned i;
+       unsigned int i;
        static const uintptr_t pvt_bases[] = {
 #if defined(MMCA57_0_PVT_BASE)
                MMCA57_0_PVT_BASE,
@@ -62,11 +62,11 @@ static uintptr_t pvt_get_reg_addr(const uintptr_t base, const unsigned offset)
        return 0;
 }
 
-uint32_t pvt_read_reg(const uintptr_t base, const unsigned offset)
+uint32_t pvt_read_reg(const uintptr_t base, const unsigned int offset)
 {
        const uintptr_t reg_addr = pvt_get_reg_addr(base, offset);
 
-       if (!reg_addr) {
+       if (reg_addr == 0) {
                return 1;
        }
 #ifdef BAIKAL_QEMU
@@ -75,11 +75,11 @@ uint32_t pvt_read_reg(const uintptr_t base, const unsigned offset)
        return mmio_read_32(reg_addr);
 }
 
-uint32_t pvt_write_reg(const uintptr_t base, const unsigned offset, const uint32_t val)
+uint32_t pvt_write_reg(const uintptr_t base, const unsigned int offset, const uint32_t val)
 {
        const uintptr_t reg_addr = pvt_get_reg_addr(base, offset);
 
-       if (!reg_addr) {
+       if (reg_addr == 0) {
                return 1;
        }
 #ifndef BAIKAL_QEMU
index 17b0c3bb51d0497268a061685eb979a012c80cf3..c6631ceec75585ec9f855e64a2028264b88556fc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 #include <baikal_sip_svc.h>
 
 static int baikal_smc_flash_init(uint64_t *const data);
-static int baikal_smc_flash_position(const unsigned pos);
+static int baikal_smc_flash_position(const unsigned int pos);
 static int baikal_smc_flash_pull(uint64_t *const data);
 static int baikal_smc_flash_push(const uint64_t data0,
                                 const uint64_t data1,
                                 const uint64_t data2,
                                 const uint64_t data3);
 
-static uint8_t flash_buf[1024] __aligned(8);
-static unsigned        flash_buf_idx;
+static uint8_t flash_buf[1024] __aligned(8);
+static unsigned int flash_buf_idx;
 
 int64_t baikal_smc_flash_handler(const uint32_t smc_fid,
                             const uint64_t x1,
@@ -31,6 +31,11 @@ int64_t baikal_smc_flash_handler(const uint32_t smc_fid,
                             const uint64_t x4,
                             uint64_t *data)
 {
+       if ((smc_fid & BIT(30)) == 0) {
+               ERROR("%s: SMC32 (smc_fid 0x%x) is not supported\n", __func__, smc_fid);
+               return -1;
+       }
+
        switch (smc_fid) {
        case BAIKAL_SMC_FLASH_WRITE:
                return bootflash_write(x1, flash_buf, x2);
@@ -60,7 +65,7 @@ static int baikal_smc_flash_init(uint64_t *const data)
        return 0;
 }
 
-static int baikal_smc_flash_position(const unsigned pos)
+static int baikal_smc_flash_position(const unsigned int pos)
 {
        if (pos > sizeof(flash_buf) - 4 * sizeof(uint64_t)) {
                return -1;
index 990cd5d25927bbc975e958dcf9b1e36bb3d26f45..ba0a139f800799e4bdd8b4cbc0b929f663ebb7a5 100644 (file)
@@ -1,13 +1,12 @@
 /*
- * Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2013-2023, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
 /*
- * The .data section gets copied from ROM to RAM at runtime.
- * Its LMA should be 16-byte aligned to allow efficient copying of 16-bytes
- * aligned regions in it.
+ * The .data section gets copied from ROM to RAM at runtime. Its LMA should be
+ * 16-byte aligned to allow efficient copying of 16-bytes aligned regions in it.
  * Its VMA must be page-aligned as it marks the first read/write page.
  */
 #define DATA_ALIGN     16
@@ -25,76 +24,84 @@ MEMORY {
     DRAM (rwx): ORIGIN = SEC_DRAM_BASE, LENGTH = SEC_DRAM_SIZE
 }
 
-SECTIONS
-{
+SECTIONS {
     . = BL1_RO_BASE;
+
     ASSERT(. == ALIGN(PAGE_SIZE),
-           "BL1_RO_BASE address is not aligned on a page boundary.")
+        "BL1_RO_BASE address is not aligned on a page boundary.")
 
 #if SEPARATE_CODE_AND_RODATA
     .text . : {
         __TEXT_START__ = .;
+
         *bl1_entrypoint.o(.text*)
         *(SORT_BY_ALIGNMENT(.text*))
         *(.vectors)
+
         . = ALIGN(PAGE_SIZE);
+
         __TEXT_END__ = .;
-     } >ROM
+    } >ROM
 
-     /* .ARM.extab and .ARM.exidx are only added because Clang need them */
-     .ARM.extab . : {
+    /* .ARM.extab and .ARM.exidx are only added because Clang needs them */
+    .ARM.extab . : {
         *(.ARM.extab* .gnu.linkonce.armextab.*)
-     } >ROM
+    } >ROM
 
-     .ARM.exidx . : {
+    .ARM.exidx . : {
         *(.ARM.exidx* .gnu.linkonce.armexidx.*)
-     } >ROM
+    } >ROM
 
     .rodata . : {
         __RODATA_START__ = .;
+
         *(SORT_BY_ALIGNMENT(.rodata*))
 
-       RODATA_COMMON
+        RODATA_COMMON
 
         /*
          * No need to pad out the .rodata section to a page boundary. Next is
          * the .data section, which can mapped in ROM with the same memory
          * attributes as the .rodata section.
          *
-         * Pad out to 16 bytes though as .data section needs to be 16 byte
-         * aligned and lld does not align the LMA to the aligment specified
+         * Pad out to 16 bytes though as .data section needs to be 16-byte
+         * aligned and lld does not align the LMA to the alignment specified
          * on the .data section.
          */
         __RODATA_END__ = .;
-         . = ALIGN(16);
+
+        . = ALIGN(16);
     } >ROM
-#else
-    ro . : {
+#else /* SEPARATE_CODE_AND_RODATA */
+    .ro . : {
         __RO_START__ = .;
+
         *bl1_entrypoint.o(.text*)
         *(SORT_BY_ALIGNMENT(.text*))
         *(SORT_BY_ALIGNMENT(.rodata*))
 
-       RODATA_COMMON
+        RODATA_COMMON
 
         *(.vectors)
+
         __RO_END__ = .;
 
         /*
-         * Pad out to 16 bytes as .data section needs to be 16 byte aligned and
-         * lld does not align the LMA to the aligment specified on the .data
-         * section.
+         * Pad out to 16 bytes as the .data section needs to be 16-byte aligned
+         * and lld does not align the LMA to the alignment specified on the
+         * .data section.
          */
-         . = ALIGN(16);
+        . = ALIGN(16);
     } >ROM
-#endif
+#endif /* SEPARATE_CODE_AND_RODATA */
 
     ASSERT(__CPU_OPS_END__ > __CPU_OPS_START__,
-           "cpu_ops not defined for this platform.")
+        "cpu_ops not defined for this platform.")
 
     . = BL1_RW_BASE;
+
     ASSERT(BL1_RW_BASE == ALIGN(PAGE_SIZE),
-           "BL1_RW_BASE address is not aligned on a page boundary.")
+        "BL1_RW_BASE address is not aligned on a page boundary.")
 
     .data . : ALIGN(DATA_ALIGN) {
         __DATA_START__ = .;
@@ -102,6 +109,7 @@ SECTIONS
         *(SORT_BY_ALIGNMENT(.data*))
         __DATA_END__ = .;
     } >RAM AT>ROM
+
     __DATA_RAM_START__ = __DATA_START__;
     __DATA_RAM_END__ = __DATA_END__;
 
@@ -117,28 +125,30 @@ SECTIONS
     } >RAM
 
     ASSERT(__BSS_END__ < SCP_SERVICE_BASE,
-           "BSS section has exceeded its limit.")
+        "BSS section has exceeded its limit.")
 
 #if USE_COHERENT_MEM
     /*
-     * The base address of the coherent memory section must be page-aligned (4K)
-     * to guarantee that the coherent data are stored on their own pages and
-     * are not mixed with normal data.  This is required to set up the correct
-     * memory attributes for the coherent data page tables.
+     * The base address of the coherent memory section must be page-aligned to
+     * guarantee that the coherent data are stored on their own pages and are
+     * not mixed with normal data. This is required to set up the correct memory
+     * attributes for the coherent data page tables.
      */
-    coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
+    .coherent_ram (NOLOAD) : ALIGN(PAGE_SIZE) {
         __COHERENT_RAM_START__ = .;
-        *(tzfw_coherent_mem)
+        *(.tzfw_coherent_mem)
         __COHERENT_RAM_END_UNALIGNED__ = .;
+
         /*
-         * Memory page(s) mapped to this section will be marked
-         * as device memory.  No other unexpected data must creep in.
-         * Ensure the rest of the current memory page is unused.
+         * Memory page(s) mapped to this section will be marked as device
+         * memory. No other unexpected data must creep in. Ensure the rest of
+         * the current memory page is unused.
          */
         . = ALIGN(PAGE_SIZE);
+
         __COHERENT_RAM_END__ = .;
     } >RAM
-#endif
+#endif /* USE_COHERENT_MEM */
 
     __BL1_RAM_START__ = ADDR(.data);
     __BL1_RAM_END__ = .;
@@ -151,15 +161,16 @@ SECTIONS
      * of BL1's actual content in Trusted ROM.
      */
     __BL1_ROM_END__ =  __DATA_ROM_START__ + __DATA_SIZE__;
+
     ASSERT(__BL1_ROM_END__ <= BL1_RO_LIMIT,
-           "BL1's ROM content has exceeded its limit.")
+        "BL1's ROM content has exceeded its limit.")
 
     __BSS_SIZE__ = SIZEOF(.bss);
 
 #if USE_COHERENT_MEM
     __COHERENT_RAM_UNALIGNED_SIZE__ =
         __COHERENT_RAM_END_UNALIGNED__ - __COHERENT_RAM_START__;
-#endif
+#endif /* USE_COHERENT_MEM */
 
     ASSERT(. <= BL1_RW_LIMIT, "BL1's RW section has exceeded its limit.")
 
index 95f40d2d52896b66c41d1ca5857e1c6e4d360ff9..239aa7ce3dc860a97fb12a9730d33c9e33df7f5c 100644 (file)
@@ -1,82 +1,54 @@
 /*
- * Copyright (c) 2020-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
+#include <arm_acle.h>
 #include <crc.h>
 
-static inline uint16_t crc16iter(uint16_t crc) __attribute__((always_inline));
-static inline uint32_t crc32iter(uint32_t crc) __attribute__((always_inline));
-
 uint16_t crc16(const void *data, size_t size, uint16_t crc)
 {
        const uint8_t *ptr = data;
 
-       for (; size >= 8; size -= 8) {
-               crc = crc16iter(crc ^= *ptr++ << 8);
-               crc = crc16iter(crc ^= *ptr++ << 8);
-               crc = crc16iter(crc ^= *ptr++ << 8);
-               crc = crc16iter(crc ^= *ptr++ << 8);
-               crc = crc16iter(crc ^= *ptr++ << 8);
-               crc = crc16iter(crc ^= *ptr++ << 8);
-               crc = crc16iter(crc ^= *ptr++ << 8);
-               crc = crc16iter(crc ^= *ptr++ << 8);
-       }
-
-       for (; size; --size) {
-               crc = crc16iter(crc ^= *ptr++ << 8);
+       while (size--) {
+               unsigned int i = 0;
+
+               crc ^= *ptr++ << 8;
+               while (i++ < 8) {
+                       if (crc & 0x8000) {
+                               crc = crc << 1 ^ 0x1021;
+                       } else {
+                               crc <<= 1;
+                       }
+               }
        }
 
        return crc;
 }
 
-static inline uint16_t crc16iter(uint16_t crc)
-{
-       crc = crc << 1 ^ (0x1021 & ~((crc >> 15) - 1));
-       crc = crc << 1 ^ (0x1021 & ~((crc >> 15) - 1));
-       crc = crc << 1 ^ (0x1021 & ~((crc >> 15) - 1));
-       crc = crc << 1 ^ (0x1021 & ~((crc >> 15) - 1));
-       crc = crc << 1 ^ (0x1021 & ~((crc >> 15) - 1));
-       crc = crc << 1 ^ (0x1021 & ~((crc >> 15) - 1));
-       crc = crc << 1 ^ (0x1021 & ~((crc >> 15) - 1));
-       crc = crc << 1 ^ (0x1021 & ~((crc >> 15) - 1));
-       return crc;
-}
-
+/*
+ * compute CRC-32 using Arm intrinsic function
+ *
+ * This function is similar to tf_crc32() from common/tf_crc32.c.
+ * The main difference is crc32() allows input buffer to start from
+ * address 0 (which is important for checksumming contents of mailbox).
+ *
+ * Make sure to add a compile switch '-march=armv8-a+crc"
+ * for successful compilation of this file.
+ */
 uint32_t crc32(const void *data, size_t size, uint32_t crc)
 {
-       const uint8_t *ptr = data;
-
-       crc = ~crc;
-
-       for (; size >= 8; size -= 8) {
-               crc = crc32iter(crc ^= *ptr++);
-               crc = crc32iter(crc ^= *ptr++);
-               crc = crc32iter(crc ^= *ptr++);
-               crc = crc32iter(crc ^= *ptr++);
-               crc = crc32iter(crc ^= *ptr++);
-               crc = crc32iter(crc ^= *ptr++);
-               crc = crc32iter(crc ^= *ptr++);
-               crc = crc32iter(crc ^= *ptr++);
-       }
-
-       for (; size; --size) {
-               crc = crc32iter(crc ^= *ptr++);
+       uint32_t calc_crc = ~crc;
+       const unsigned char *local_buf = data;
+       size_t local_size = size;
+
+       /* Calculate CRC over byte data */
+       while (local_size != 0UL) {
+               calc_crc = __crc32b(calc_crc, *local_buf);
+               local_buf++;
+               local_size--;
        }
 
-       return ~crc;
-}
-
-static inline uint32_t crc32iter(uint32_t crc)
-{
-       crc = crc >> 1 ^ (0xedb88320 & ~((crc & 1) - 1));
-       crc = crc >> 1 ^ (0xedb88320 & ~((crc & 1) - 1));
-       crc = crc >> 1 ^ (0xedb88320 & ~((crc & 1) - 1));
-       crc = crc >> 1 ^ (0xedb88320 & ~((crc & 1) - 1));
-       crc = crc >> 1 ^ (0xedb88320 & ~((crc & 1) - 1));
-       crc = crc >> 1 ^ (0xedb88320 & ~((crc & 1) - 1));
-       crc = crc >> 1 ^ (0xedb88320 & ~((crc & 1) - 1));
-       crc = crc >> 1 ^ (0xedb88320 & ~((crc & 1) - 1));
-       return crc;
+       return ~calc_crc;
 }
index c4cf9a7f58f64da5188a1bf1fff9c831099b7feb..b2bef41d533f79ad313f14aa6f61d5704def95b4 100644 (file)
 #define SWPORTA_DR     0x00
 #define SWPORTA_DDR    0x04
 
-void gpio_dir_clr(const uintptr_t base, const unsigned pin)
+void gpio_dir_clr(const uintptr_t base, const unsigned int pin)
 {
        assert(pin < 32);
 
        mmio_clrbits_32(base + SWPORTA_DDR, 1 << pin);
 }
 
-void gpio_dir_set(const uintptr_t base, const unsigned pin)
+void gpio_dir_set(const uintptr_t base, const unsigned int pin)
 {
        assert(pin < 32);
 
        mmio_setbits_32(base + SWPORTA_DDR, 1 << pin);
 }
 
-void gpio_out_rst(const uintptr_t base, const unsigned pin)
+void gpio_out_rst(const uintptr_t base, const unsigned int pin)
 {
        assert(pin < 32);
 
        mmio_clrbits_32(base + SWPORTA_DR, 1 << pin);
 }
 
-void gpio_out_set(const uintptr_t base, const unsigned pin)
+void gpio_out_set(const uintptr_t base, const unsigned int pin)
 {
        assert(pin < 32);
 
index 6f3826765dc03a4ab91b7313658f28e5cbecc27f..412ee2f9a6fa825566248875b3464e5b00a531e5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -65,7 +65,6 @@ struct i2c_regs {
 #define IC_DATA_CMD_STOP               BIT(9)
 
 #define IC_RAW_INTR_STAT_TX_ABRT       BIT(6)
-#define IC_RAW_INTR_STAT_STOP_DET      BIT(9)
 
 #define IC_ENABLE_ENABLE               BIT(0)
 
@@ -76,44 +75,45 @@ struct i2c_regs {
 
 #define IC_ENABLE_STATUS_IC_EN         BIT(0)
 
-#define IC_CLK                         166
-#define NANO_TO_MICRO                  1000
 #define MIN_FS_SCL_HIGHTIME            600
 #define MIN_FS_SCL_LOWTIME             1300
 
 int i2c_txrx(const uintptr_t base,
-            const unsigned addr,
+            const unsigned int iclk,
+            const unsigned int targetaddr,
             const void *const txbuf,
-            const unsigned txbufsize,
+            const unsigned int txbufsize,
             void *const rxbuf,
-            const unsigned rxbufsize)
+            const unsigned int rxbufsize)
 {
        uint64_t activity_timeout;
        int err;
        volatile struct i2c_regs *const i2cregs = (volatile struct i2c_regs *const)base;
-       unsigned rxedsize = 0;
+       unsigned int rxedsize = 0;
        uint8_t *const rxptr = (uint8_t *)rxbuf;
-       unsigned txedsize = 0;
+       unsigned int txedsize = 0;
        const uint8_t *const txptr = (uint8_t *)txbuf;
 
        assert(i2cregs != NULL);
-       assert(addr <= 0x7f);
+       assert(targetaddr <= 0x7f);
        assert(txbuf != NULL || !txbufsize);
        assert(rxbuf != NULL || !rxbufsize);
 
        i2cregs->ic_enable      = 0;
        i2cregs->ic_con         = IC_CON_IC_SLAVE_DISABLE | IC_CON_SPEED | IC_CON_MASTER_MODE;
-       i2cregs->ic_tar         = addr;
+       i2cregs->ic_tar         = targetaddr;
        i2cregs->ic_rx_tl       = 0;
        i2cregs->ic_tx_tl       = 0;
        i2cregs->ic_intr_mask   = 0;
-       i2cregs->ic_fs_scl_hcnt = (IC_CLK * MIN_FS_SCL_HIGHTIME) / NANO_TO_MICRO;
-       i2cregs->ic_fs_scl_lcnt = (IC_CLK * MIN_FS_SCL_LOWTIME)  / NANO_TO_MICRO;
+       i2cregs->ic_fs_scl_hcnt = ((uint64_t)iclk * MIN_FS_SCL_HIGHTIME + 1000000000 - 1) / 1000000000;
+       assert(i2cregs->ic_fs_scl_hcnt + 5 > i2cregs->ic_fs_spklen);
+       i2cregs->ic_fs_scl_lcnt = ((uint64_t)iclk * MIN_FS_SCL_LOWTIME  + 1000000000 - 1) / 1000000000;
+       assert(i2cregs->ic_fs_scl_lcnt + 7 > i2cregs->ic_fs_spklen);
        i2cregs->ic_enable      = IC_ENABLE_ENABLE;
        activity_timeout        = timeout_init_us(100000);
 
        for (;;) {
-               const unsigned ic_status = i2cregs->ic_status;
+               const unsigned int ic_status = i2cregs->ic_status;
 
                if (rxedsize < rxbufsize && (ic_status & IC_STATUS_RFNE)) {
                        rxptr[rxedsize++] = i2cregs->ic_data_cmd;
@@ -148,8 +148,8 @@ int i2c_txrx(const uintptr_t base,
                                err = -1;
                                break;
                        }
-               } else if ( (ic_status & IC_STATUS_TFE) &&
-                          !(ic_status & IC_STATUS_MST_ACTIVITY)) {
+               } else if ((ic_status & IC_STATUS_TFE) &&
+                         !(ic_status & IC_STATUS_MST_ACTIVITY)) {
                        err = 0;
                        break;
                }
@@ -157,7 +157,8 @@ int i2c_txrx(const uintptr_t base,
 
        i2cregs->ic_enable = 0;
 
-       while (i2cregs->ic_enable_status & IC_ENABLE_STATUS_IC_EN);
+       while (i2cregs->ic_enable_status & IC_ENABLE_STATUS_IC_EN)
+               ;
 
        if (err) {
                return -1;
index 71e18be29ee0c54c93d6b7c5523d8701194e8363..28a37c4f5e9f644fee97e72ae1c8b407b8be098b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2018-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
 #define SPI_MAX_READ           UL(0x10000)
 #define SPI_MAX_WRITE          UL(256) /* (3, 256) Page Program */
 
-static unsigned adr_mode;
+static unsigned int adr_mode;
 
-static int transfer(const unsigned line,
+static int transfer(const unsigned int line,
                    void *cmd_, uint32_t cmd_len,
                    void *tx_, uint32_t tx_len,
                    void *rx_, uint32_t rx_len)
@@ -267,6 +267,7 @@ static int exec(int line,
        case CMD_FLASH_READ:
                out = buf;
                lenout = lenbuf;
+               /* fallthrough */
        case CMD_FLASH_SSE:
        case CMD_FLASH_SE:
                if (adr_mode == ADR_MODE_4BYTE) {
@@ -520,12 +521,14 @@ int spi_flash_init(int line)
 {
        int err;
 
+#ifndef IMAGE_BL1
        INFO("SPI: default parameters\n");
        INFO("SPI: clock div:  %u\n", BAIKAL_BOOT_SPI_BAUDR);
 #ifdef BAIKAL_BOOT_SPI_CS_GPIO_PIN
        INFO("SPI: flash CS#:  %u\n", BAIKAL_BOOT_SPI_CS_GPIO_PIN);
 #endif
        INFO("SPI: flash size: %u MiB\n", BAIKAL_BOOT_SPI_SIZE / 1024 / 1024);
+#endif
 
        SPI_SPIENR  = SPI_SPIENR_SPI_DE;
        SPI_CTRLR0  = 7 << SPI_DFS_OFFSET;
@@ -542,7 +545,7 @@ int spi_flash_init(int line)
 
        err = spi_flash_detect(line);
        if (err) {
-               ERROR("SPI: flash chip not found\n");
+               ERROR("SPI: not found\n");
                return err;
        }
 
index d9db16c7b207788a8ef42dcef4a96758d19da8fc..e2f92d634b25576040c3f0c83526c9ce72ca911b 100644 (file)
@@ -10,9 +10,9 @@
 #include <stddef.h>
 #include <stdint.h>
 
-void bootflash_init(void);
-int  bootflash_erase(uint32_t addr, size_t size);
-int  bootflash_read( uint32_t addr, void *buf,  size_t size);
-int  bootflash_write(uint32_t addr, void *data, size_t size);
+int bootflash_init(void);
+int bootflash_erase(uint32_t addr, size_t size);
+int bootflash_read(uint32_t addr, void *buf, size_t size);
+int bootflash_write(uint32_t addr, void *data, size_t size);
 
 #endif /* BAIKAL_BOOTFLASH_H */
index cf5643ddea9a2aa790ad34dabf6db1e50c06316c..c15695c2cc491e4c50e01a6b5e2a0e1c792e7e54 100644 (file)
@@ -10,6 +10,6 @@
 bool fdt_node_is_enabled(const void *fdt, const int nodeoffset);
 void fdt_memory_node_set(void *fdt,
                         const uint64_t region_descs[][2],
-                        const unsigned region_num);
+                        const unsigned int region_num);
 
 #endif /* BAIKAL_FDT_H */
diff --git a/plat/baikal/common/include/baikal_mshc.h b/plat/baikal/common/include/baikal_mshc.h
new file mode 100644 (file)
index 0000000..3d9442c
--- /dev/null
@@ -0,0 +1,538 @@
+/*
+ * Copyright (c) 2023, Baikal Electronics, JSC. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef BAIKAL_MSHC_H
+#define BAIKAL_MSHC_H
+
+#include <drivers/mmc.h>
+
+#define SDHCI_INIT_CLOCK                       (300 * 1000)
+#define SDHCI_DEFAULT_CLOCK                    (50 * 1000 * 1000)
+#define SDHCI_DEFAULT_BLOCK_SIZE               512
+
+/* Registers */
+#define SDHCI_DMA_ADDRESS                      0x00
+#define SDHCI_ARGUMENT2                                0x00
+#define SDHCI_32BIT_BLK_CNT                    0x00
+
+#define SDHCI_BLOCK_SIZE                       0x04
+#define  SDHCI_MAKE_BLKSZ(dma, blksz)          ((((dma) & 0x7) << 12) | ((blksz) & 0xfff))
+
+#define SDHCI_16BIT_BLK_CNT                    0x06
+
+#define SDHCI_ARGUMENT                         0x08
+
+#define SDHCI_TRANSFER_MODE                    0x0c
+#define  SDHCI_TRNS_DMA                                (1 << 0)
+#define  SDHCI_TRNS_BLK_CNT_EN                 (1 << 1)
+#define  SDHCI_TRNS_AUTO_CMD12                 (1 << 2)
+#define  SDHCI_TRNS_AUTO_CMD23                 (1 << 3)
+#define  SDHCI_TRNS_AUTO_SEL                   0x0c
+#define  SDHCI_TRNS_READ                       (1 << 4)
+#define  SDHCI_TRNS_MULTI                      (1 << 5)
+
+#define SDHCI_COMMAND                          0x0e
+#define  SDHCI_CMD_RESP_NONE                   0x00
+#define  SDHCI_CMD_RESP_LONG                   0x01
+#define  SDHCI_CMD_RESP_SHORT                  0x02
+#define  SDHCI_CMD_RESP_SHORT_BUSY             0x03
+
+#define SDHCI_RESPONSE                         0x10
+#define SDHCI_RESPONSE_0                       (SDHCI_RESPONSE + 0x4 * 0)
+#define SDHCI_RESPONSE_1                       (SDHCI_RESPONSE + 0x4 * 1)
+#define SDHCI_RESPONSE_2                       (SDHCI_RESPONSE + 0x4 * 2)
+#define SDHCI_RESPONSE_3                       (SDHCI_RESPONSE + 0x4 * 3)
+
+#define SDHCI_BUFFER                           0x20
+
+#define SDHCI_PRESENT_STATE                    0x24
+#define  SDHCI_CMD_INHIBIT                     (1 << 0)
+#define  SDHCI_DATA_INHIBIT                    (1 << 1)
+#define  SDHCI_DATA_74                         0x000000f0
+#define  SDHCI_DOING_WRITE                     (1 << 8)
+#define  SDHCI_DOING_READ                      (1 << 9)
+#define  SDHCI_SPACE_AVAILABLE                 (1 << 10)
+#define  SDHCI_DATA_AVAILABLE                  (1 << 11)
+#define  SDHCI_CARD_PRESENT                    (1 << 16)
+#define  SDHCI_CARD_PRES_SHIFT                 16
+#define  SDHCI_CD_STABLE                       (1 << 17)
+#define  SDHCI_CD_LVL                          (1 << 18)
+#define  SDHCI_CD_LVL_SHIFT                    18
+#define  SDHCI_WRITE_PROTECT                   (1 << 19)
+#define  SDHCI_DATA_30                         0x00f00000
+#define  SDHCI_DATA_LVL_SHIFT                  20
+#define  SDHCI_DATA_0_LVL_MASK                 0x00100000
+#define  SDHCI_CMD_LVL                         (1 << 24)
+#define  SDHCI_VOLTAGE_STABLE                  (1 << 25)
+
+#define SDHCI_HOST_CONTROL                     0x28
+#define  SDHCI_CTRL_LED                                0x01
+#define  SDHCI_CTRL_4BITBUS                    0x02
+#define  SDHCI_CTRL_HISPD                      0x04
+#define  SDHCI_CTRL_DMA_MASK                   0x18
+#define  SDHCI_CTRL_SDMA                       0x00
+#define  SDHCI_CTRL_ADMA1                      0x08
+#define  SDHCI_CTRL_ADMA32                     0x10
+#define  SDHCI_CTRL_ADMA64                     0x18
+#define  SDHCI_CTRL_ADMA3                      0x18
+#define  SDHCI_CTRL_8BITBUS                    0x20
+#define  SDHCI_CTRL_CDTEST_INS                 0x40
+#define  SDHCI_CTRL_CDTEST_EN                  0x80
+
+#define SDHCI_POWER_CONTROL                    0x29
+#define  SDHCI_POWER_OFF                       (0x0 << 0)
+#define  SDHCI_POWER_ON                                (0x1 << 0)
+#define  SDHCI_POWER_180                       (0x5 << 1)
+#define  SDHCI_POWER_300                       (0x6 << 1)
+#define  SDHCI_POWER_330                       (0x7 << 1)
+#define  SDHCI_EMMC_POWER_120                  (0x5 << 1)
+#define  SDHCI_EMMC_POWER_180                  (0x6 << 1)
+#define  SDHCI_EMMC_POWER_300                  (0x7 << 1)
+#define  SDHCI_POWER2_ON                       (0x1 << 4)
+#define  SDHCI_POWER2_120                      (0x4 << 5)
+#define  SDHCI_POWER2_180                      (0x5 << 5)
+
+#define SDHCI_BLOCK_GAP_CONTROL                        0x2a
+
+#define SDHCI_WAKE_UP_CONTROL                  0x2b
+#define  SDHCI_WAKE_ON_INT                     0x01
+#define  SDHCI_WAKE_ON_INSERT                  0x02
+#define  SDHCI_WAKE_ON_REMOVE                  0x04
+
+#define SDHCI_CLOCK_CONTROL                    0x2c
+#define  SDHCI_CLOCK_FREG_SELECT_LOW           (0xff << 8)
+#define  SDHCI_CLOCK_FREG_SELECT_HI            (3 << 6)
+#define  SDHCI_CLOCK_GEN_SELECT                        (1 << 5)
+#define  SDHCI_CLOCK_RESERVED                  (1 << 4)
+#define  SDHCI_CLOCK_PLL_EN                    (1 << 3)
+#define  SDHCI_CLOCK_CARD_EN                   (1 << 2)
+#define  SDHCI_CLOCK_STABLE                    (1 << 1)
+#define  SDHCI_CLOCK_EN                                (1 << 0)
+
+#define SDHCI_TIMEOUT_CONTROL                  0x2e
+#define  SDHCI_TIMEOUT_DEFAULT                 0xe
+
+#define SDHCI_SOFTWARE_RESET                   0x2f
+#define  SDHCI_RESET_ALL                       0x01
+#define  SDHCI_RESET_CMD                       0x02
+#define  SDHCI_RESET_DATA                      0x04
+
+#define SDHCI_INT_STATUS                       0x30
+#define SDHCI_INT_ENABLE                       0x34
+#define SDHCI_SIGNAL_ENABLE                    0x38
+#define  SDHCI_INT_RESPONSE                    (1 << 0)
+#define  SDHCI_INT_DATA_END                    (1 << 1)
+#define  SDHCI_INT_BLK_GAP                     (1 << 2)
+#define  SDHCI_INT_DMA_END                     (1 << 3)
+#define  SDHCI_INT_SPACE_AVAIL                 (1 << 4)
+#define  SDHCI_INT_DATA_AVAIL                  (1 << 5)
+#define  SDHCI_INT_CARD_INSERT                 (1 << 6)
+#define  SDHCI_INT_CARD_REMOVE                 (1 << 7)
+#define  SDHCI_INT_CARD_INT                    (1 << 8)
+#define  SDHCI_INT_RETUNE                      (1 << 12)
+#define  SDHCI_INT_FX                          (1 << 13)
+#define  SDHCI_INT_CQE                         (1 << 14)
+#define  SDHCI_INT_ERROR                       (1 << 15)
+
+#define SDHCI_ERR_STATUS                       0x32
+#define SDHCI_ERR_ENABLE                       0x36
+#define SDHCI_ERR_SIGNAL_ENABLE                        0x3a
+#define  SDHCI_ERR_TIMEOUT                     (1 << 0)
+#define  SDHCI_ERR_CRC                         (1 << 1)
+#define  SDHCI_ERR_END_BIT                     (1 << 2)
+#define  SDHCI_ERR_INDEX                       (1 << 3)
+#define  SDHCI_ERR_DATA_TIMEOUT                        (1 << 4)
+#define  SDHCI_ERR_DATA_CRC                    (1 << 5)
+#define  SDHCI_ERR_DATA_END_BIT                        (1 << 6)
+#define  SDHCI_ERR_BUS_POWER                   (1 << 7)
+#define  SDHCI_ERR_AUTO_CMD_ERR                        (1 << 8)
+#define  SDHCI_ERR_ADMA                                (1 << 9)
+#define  SDHCI_ERR_TUNING                      (1 << 10)
+#define  SDHCI_ERR_RESP                                (1 << 11)
+#define  SDHCI_ERR_BOOT                                (1 << 12)
+
+#define SDHCI_AUTO_CMD_STATUS                  0x3c
+#define  SDHCI_AUTO_CMD_TIMEOUT                        0x00000002
+#define  SDHCI_AUTO_CMD_CRC                    0x00000004
+#define  SDHCI_AUTO_CMD_END_BIT                        0x00000008
+#define  SDHCI_AUTO_CMD_INDEX                  0x00000010
+
+#define SDHCI_HOST_CONTROL2                    0x3e
+#define  SDHCI_CTRL_UHS_MASK                   0x0007
+#define  SDHCI_CTRL_UHS_SDR12                  0x0000
+#define  SDHCI_CTRL_UHS_SDR25                  0x0001
+#define  SDHCI_CTRL_UHS_SDR50                  0x0002
+#define  SDHCI_CTRL_UHS_SDR104                 0x0003
+#define  SDHCI_CTRL_UHS_DDR50                  0x0004
+#define  SDHCI_CTRL_HS400                      0x0007
+#define  SDHCI_CTRL_VDD_180                    0x0008
+#define  SDHCI_CTRL_DRV_TYPE_MASK              0x0030
+#define  SDHCI_CTRL_DRV_TYPE_B                 0x0000
+#define  SDHCI_CTRL_DRV_TYPE_A                 0x0010
+#define  SDHCI_CTRL_DRV_TYPE_C                 0x0020
+#define  SDHCI_CTRL_DRV_TYPE_D                 0x0030
+#define  SDHCI_CTRL_EXEC_TUNING                        0x0040
+#define  SDHCI_CTRL_TUNED_CLK                  0x0080
+#define  SDHCI_CMD23_ENABLE                    0x0800
+#define  SDHCI_CTRL_V4_MODE                    0x1000
+#define  SDHCI_CTRL_64BIT_ADDR                 0x2000
+#define  SDHCI_CTRL_ASYNC                      0x4000
+#define  SDHCI_CTRL_PRESET_VAL_ENABLE          0x8000
+
+#define SDHCI_CAPABILITIES                     0x40
+#define  SDHCI_TIMEOUT_CLK_MASK                        0x0000003f
+#define  SDHCI_TIMEOUT_CLK_SHIFT               0
+#define  SDHCI_TIMEOUT_CLK_UNIT                        0x00000080
+#define  SDHCI_CLOCK_BASE_MASK                 0x00003f00
+#define  SDHCI_CLOCK_V3_BASE_MASK              0x0000ff00
+#define  SDHCI_CLOCK_BASE_SHIFT                        8
+#define  SDHCI_MAX_BLOCK_MASK                  0x00030000
+#define  SDHCI_MAX_BLOCK_SHIFT                 16
+#define  SDHCI_CAN_DO_8BIT                     0x00040000
+#define  SDHCI_CAN_DO_ADMA2                    0x00080000
+#define  SDHCI_CAN_DO_ADMA1                    0x00100000
+#define  SDHCI_CAN_DO_HISPD                    0x00200000
+#define  SDHCI_CAN_DO_SDMA                     0x00400000
+#define  SDHCI_CAN_DO_SUSPEND                  0x00800000
+#define  SDHCI_CAN_VDD_330                     0x01000000
+#define  SDHCI_CAN_VDD_300                     0x02000000
+#define  SDHCI_CAN_VDD_180                     0x04000000
+#define  SDHCI_CAN_64BIT_V4                    0x08000000
+#define  SDHCI_CAN_64BIT                       0x10000000
+#define  SDHCI_SUPPORT_SDR50                   0x00000001
+#define  SDHCI_SUPPORT_SDR104                  0x00000002
+#define  SDHCI_SUPPORT_DDR50                   0x00000004
+#define  SDHCI_SUPPORT_UHS2                    0x00000008
+#define  SDHCI_DRIVER_TYPE_A                   0x00000010
+#define  SDHCI_DRIVER_TYPE_C                   0x00000020
+#define  SDHCI_DRIVER_TYPE_D                   0x00000040
+#define  SDHCI_RETUNING_TIMER_COUNT_MASK       0x00000f00
+#define  SDHCI_RETUNING_TIMER_COUNT_SHIFT      8
+#define  SDHCI_USE_SDR50_TUNING                        0x00002000
+#define  SDHCI_RETUNING_MODE_MASK              0x0000c000
+#define  SDHCI_RETUNING_MODE_SHIFT             14
+#define  SDHCI_CLOCK_MUL_MASK                  0x00ff0000
+#define  SDHCI_CLOCK_MUL_SHIFT                 16
+#define  SDHCI_CAN_DO_ADMA3                    0x08000000
+#define  SDHCI_SUPPORT_VDD2_18                 0x10000000
+#define  SDHCI_SUPPORT_HS400                   0x80000000
+
+#define SDHCI_CAPABILITIES_1                   0x44
+
+#define SDHCI_MAX_CURRENT                      0x48
+#define  SDHCI_MAX_CURRENT_LIMIT               0xff
+#define  SDHCI_MAX_CURRENT_330_MASK            0x0000ff
+#define  SDHCI_MAX_CURRENT_330_SHIFT           0
+#define  SDHCI_MAX_CURRENT_300_MASK            0x00ff00
+#define  SDHCI_MAX_CURRENT_300_SHIFT           8
+#define  SDHCI_MAX_CURRENT_180_MASK            0xff0000
+#define  SDHCI_MAX_CURRENT_180_SHIFT           16
+#define  SDHCI_MAX_CURRENT_MULTIPLIER          4
+
+/* 4c-4f reserved for more max current */
+
+#define SDHCI_SET_ACMD12_ERROR                 0x50
+#define SDHCI_SET_INT_ERROR                    0x52
+
+#define SDHCI_ADMA_ERROR                       0x54
+
+/* 55-57 reserved */
+
+#define SDHCI_ADMA_ADDRESS                     0x58
+#define SDHCI_ADMA_ADDRESS_HI                  0x5c
+
+/* 60-fb reserved */
+
+#define SDHCI_PRESET_INIT                      0x60
+#define SDHCI_PRESET_DS                                0x62
+#define SDHCI_PRESET_HS                                0x64
+#define SDHCI_PRESET_FOR_SDR12                 0x66
+#define SDHCI_PRESET_FOR_SDR25                 0x68
+#define SDHCI_PRESET_FOR_SDR50                 0x6a
+#define SDHCI_PRESET_FOR_SDR104                        0x6c
+#define SDHCI_PRESET_FOR_DDR50                 0x6e
+#define SDHCI_PRESET_FOR_HS400                 0x74
+#define  SDHCI_PRESET_DRV_MASK                 0xc000
+#define  SDHCI_PRESET_DRV_SHIFT                        14
+#define  SDHCI_PRESET_CLKGEN_SEL_MASK          0x400
+#define  SDHCI_PRESET_CLKGEN_SEL_SHIFT         10
+#define  SDHCI_PRESET_SDCLK_FREQ_MASK          0x3ff
+#define  SDHCI_PRESET_SDCLK_FREQ_SHIFT         0
+
+#define SDHCI_SLOT_INT_STATUS                  0xfc
+
+#define SDHCI_HOST_VERSION                     0xfe
+#define  SDHCI_VENDOR_VER_MASK                 0xff00
+#define  SDHCI_VENDOR_VER_SHIFT                        8
+#define  SDHCI_SPEC_VER_MASK                   0x00ff
+#define  SDHCI_SPEC_VER_SHIFT                  0
+#define  SDHCI_SPEC_100                                0
+#define  SDHCI_SPEC_200                                1
+#define  SDHCI_SPEC_300                                2
+#define  SDHCI_SPEC_400                                3
+#define  SDHCI_SPEC_410                                4
+#define  SDHCI_SPEC_420                                5
+
+#define SDHCI_MSHC_VER                         0x504
+#define SDHCI_MSHC_CTRL                                0x508
+#define SDHCI_EMMC_CONTROL                     0x52c
+#define  SDHCI_EMMC_TYPE_MMC                   (1 << 0)
+#define  SDHCI_EMMC_CRC_DISABLE                        (1 << 1)
+#define  SDHCI_EMMC_DONT_RESET                 (1 << 2)
+
+typedef struct {
+       uint32_t size                   :11 - 0 + 1;    /* 11 - 0 */
+       uint32_t boundary               :14 - 12 + 1;   /* 14 - 12 */
+       uint32_t _                      :1;             /* 15 */
+} reg_block_t;
+
+typedef struct {
+       uint32_t dma_en                 :1;             /* 0 */
+       /* 0 - disable */
+       /* 1 - enable */
+       uint32_t block_cnt_en           :1;             /* 1 */
+       /* 0 - disable */
+       /* 1 - enable */
+       uint32_t auto_cmd               :3 - 2 + 1;     /* 3 - 2 */
+       /* 0 - disable */
+       /* 1 - cmd12_enable */
+       /* 2 - cmd23_enable */
+       /* 3 - auto_sel */
+       uint32_t xfer_dir               :1;             /* 4 */
+       /* 0 - write */
+       /* 1 - read */
+       uint32_t multi_block            :1;             /* 5 */
+       /* 0 - single */
+       /* 1 - multi */
+       uint32_t resp_type              :1;             /* 6 */
+       /* 0 - R1, memory */
+       /* 1 - R5, sdio */
+       uint32_t resp_err_chk_en        :1;             /* 7 */
+       /* 0 - disable */
+       /* 1 - enable */
+       uint32_t resp_irq_dis           :1;             /* 8 */
+       /* 0 - enable */
+       /* 1 - disable */
+       uint32_t _                      :15 - 9 + 1;    /* 15 - 9 */
+} reg_mode_t;
+
+typedef struct {
+       uint32_t resp_type              :1 - 0 + 1;     /* 1 - 0 */
+       /* 0 - noresp */
+       /* 1 - len136 */
+       /* 2 - len48 */
+       /* 3 - len48b */
+       uint32_t flag                   :1;             /* 2 */
+       /* 0 - main */
+       /* 1 - sub */
+       uint32_t crc_chk                :1;             /* 3 */
+       /* 0 - no check */
+       /* 1 - check */
+       uint32_t index_chk              :1;             /* 4 */
+       /* 0 - no check */
+       /* 1 - check */
+       uint32_t data_present           :1;             /* 5 */
+       /* 0 - no data */
+       /* 1 - data */
+       uint32_t type                   :7 - 6 + 1;     /* 7 - 6 */
+       /* 0 - normal */
+       /* 1 - suspend */
+       /* 2 - resume */
+       /* 3 - abort */
+       uint32_t index                  :13 - 8 + 1;    /* 13 - 8 */
+       uint32_t _                      :15 - 14 + 1;   /* 15 - 14 */
+} reg_cmd_t;
+
+typedef struct {
+       uint32_t cmd_busy               :1;             /* 0 */
+       uint32_t data_busy              :1;             /* 1 */
+       uint32_t data_active            :1;             /* 2 */
+       uint32_t re_tune                :1;             /* 3 */
+       uint32_t dat_line_7_4           :7 - 4 + 1;     /* 7 - 4 */
+       uint32_t wr_active              :1;             /* 8 */
+       uint32_t rd_active              :1;             /* 9 */
+       uint32_t buf_wr_en              :1;             /* 10 */
+       uint32_t buf_rd_en              :1;             /* 11 */
+       uint32_t _                      :15 - 12 + 1;   /* 15 - 12 */
+       uint32_t card_inserted          :1;             /* 16 */
+       uint32_t card_stable            :1;             /* 17 */
+       uint32_t card_detect            :1;             /* 18 */
+       uint32_t wr_protect             :1;             /* 19 */
+       uint32_t dat_line_3_0           :23 - 20 + 1;   /* 23 - 20 */
+       uint32_t cmd_line               :1;             /* 24 */
+       uint32_t voltage_stable         :1;             /* 25 */
+       uint32_t __                     :1;             /* 26 */
+       uint32_t cmd_err                :1;             /* 27 */
+       uint32_t sub_cmd                :1;             /* 28 */
+       uint32_t dormant                :1;             /* 29 */
+       uint32_t sync                   :1;             /* 30 */
+       uint32_t uhs2                   :1;             /* 31 */
+} reg_state_t;
+
+typedef struct {
+       uint32_t vdd1_on                :1;             /* 0 */
+       uint32_t vdd1                   :3 - 1 + 1;     /* 3 - 1 */
+       uint32_t vdd2_on                :1;             /* 4 */
+       uint32_t vdd2                   :7 - 5 + 1;     /* 7 - 5 */
+} reg_pwr_t;
+
+typedef struct {
+       uint32_t int_en                 :1;             /* 0 */
+       uint32_t int_ready              :1;             /* 1 */
+       uint32_t ext_en                 :1;             /* 2 */
+       uint32_t pll_en                 :1;             /* 3 */
+       uint32_t _                      :1;             /* 4 */
+       uint32_t select                 :1;             /* 5 */
+       uint32_t freq_hi                :7 - 6 + 1;     /* 7 - 6 */
+       uint32_t freq_low               :15 - 8 + 1;    /* 15 - 8 */
+} reg_clk_t;
+
+typedef struct {
+       uint32_t all                    :1;             /* 0 */
+       uint32_t cmd                    :1;             /* 1 */
+       uint32_t data                   :1;             /* 2 */
+       uint32_t _                      :7 - 3 + 1;     /* 7 - 3 */
+} reg_reset_t;
+
+typedef struct {
+       uint32_t cmd                    :1;             /* 0 */
+       uint32_t xfer                   :1;             /* 1 */
+       uint32_t bgap                   :1;             /* 2 */
+       uint32_t dma                    :1;             /* 3 */
+       uint32_t buf_wr                 :1;             /* 4 */
+       uint32_t buf_rd                 :1;             /* 5 */
+       uint32_t card_insert            :1;             /* 6 */
+       uint32_t card_remove            :1;             /* 7 */
+       uint32_t card_irq               :1;             /* 8 */
+       uint32_t _                      :11 - 9 + 1;    /* 11 - 9 */
+       uint32_t tune                   :1;             /* 12 */
+       uint32_t fx                     :1;             /* 13 */
+       uint32_t cqe                    :1;             /* 14 */
+       uint32_t err                    :1;             /* 15 */
+} reg_int_t;
+
+typedef struct {
+       uint32_t led                    :1;             /* 0 */
+       /* 0 - off */
+       /* 1 - on */
+       uint32_t width                  :1;             /* 1 */
+       /* 0 - 1-bit */
+       /* 1 - 4-bit */
+       uint32_t speed                  :1;             /* 2 */
+       /* 0 - normal */
+       /* 1 - high */
+       uint32_t dma                    :4 - 3 + 1;     /* 4 - 3 */
+       /* 0 - sdma */
+       /* 2 - adma2 */
+       /* 3 - adma3 */
+       uint32_t ext_width              :1;             /* 5 */
+       /* 0 - default */
+       /* 1 - 8-bit */
+       uint32_t detect_lvl             :1;             /* 6 */
+       uint32_t detect_sig             :1;             /* 7 */
+} reg_ctl1_t;
+
+typedef struct {
+       uint32_t mode                   :2 - 0 + 1;     /* 2 - 0 */
+       /* 0 - sdr12 */
+       /* 1 - sdr25 */
+       /* 2 - sdr50 */
+       /* 3 - sdr104 */
+       /* 4 - ddr50 */
+       /* 7 - uhs2 */
+       uint32_t signal                 :1;             /* 3 */
+       /* 0 - 3.3V */
+       /* 1 - 1.8V */
+       uint32_t strength               :1; /* TODO: 2? 5 - 4 */
+       /* 0 - TypeB */
+       /* 1 - TypeA */
+       /* 2 - TypeC */
+       /* 3 - TypeD */
+       uint32_t tune                   :1;             /* 6 */
+       /* 0 - not */
+       /* 1 - execut */
+       uint32_t sample                 :1;             /* 7 */
+       /* 0 - fixed clock */
+       /* 1 - tuned clock */
+       uint32_t _                      :9 - 8 + 1;     /* 9 - 8 */
+       uint32_t adma2_mode             :1;             /* 10 */
+       /* 0 - 16bit data len */
+       /* 1 - 26bit data len */
+       uint32_t cmd32                  :1;             /* 11 */
+       /* 0 - off */
+       /* 1 - on */
+       uint32_t version                :1;             /* 12 */
+       uint32_t __                     :1;             /* 13 */
+       uint32_t async                  :1;             /* 14 */
+       /* 0 - off */
+       /* 1 - on */
+       uint32_t preset                 :1;             /* 15 */
+} reg_ctl2_t;
+
+#define WAIT(X) ({                     \
+       int Ret = 0;                    \
+       int Try = 100 * 1000;           \
+       while (X) {                     \
+               if (!Try--) {           \
+                       Ret = -1;       \
+                       break;          \
+               }                       \
+               udelay(1);              \
+       };                              \
+       Ret;                            \
+})
+
+enum SpeedMode {
+       SD_DEFAULT,
+       SD_HIGH,
+       SD_12,
+       SD_25,
+       SD_50,
+       SD_104,
+       DD_50
+};
+
+enum CmdType {
+       SdCommandTypeBc,        /* Broadcast commands, no response */
+       SdCommandTypeBcr,       /* Broadcast commands with response */
+       SdCommandTypeAc,        /* Addressed(point-to-point) commands */
+       SdCommandTypeAdtc       /* Addressed(point-to-point) data transfer commands */
+};
+
+enum RespType {
+       SdResponseTypeNo,
+       SdResponseTypeR1,
+       SdResponseTypeR1b,
+       SdResponseTypeR2,
+       SdResponseTypeR3,
+       SdResponseTypeR4,
+       SdResponseTypeR5,
+       SdResponseTypeR5b,
+       SdResponseTypeR6,
+       SdResponseTypeR7
+};
+
+typedef struct dw_mshc_params {
+       uintptr_t               base;
+       int                     clk;
+       int                     width;
+       int                     flags;
+       enum mmc_device_type    mmc_dev_type;
+} dw_mshc_params_t;
+
+int dw_mshc_init(void);
+int dw_mshc_read(uint32_t adr, void *dst, size_t size);
+int dw_mshc_write(uint32_t adr, void *src, size_t size);
+int dw_mshc_erase(uint32_t adr, size_t size);
+void dw_mshc_off(void);
+
+#define DIV_ROUND_UP(n, d)     ((n) / (d) + !!((n) % (d)))
+#define ROUND_UP2(n, d)                (((n) / (d) + !!((n) % (d))) * d)
+#define ROUND_DOWN2(n, d)      (((n) / (d)) * (d))
+#define ROUND_UP(n)            ROUND_UP2((n), MMC_BLOCK_SIZE)
+#define ROUND_DOWN(n)          ROUND_DOWN2((n), MMC_BLOCK_SIZE)
+
+#endif /* BAIKAL_MSHC_H */
index 70a1d4c5095393914115779615a7a3a9718649f8..b28102d9cfedc9955699f7e6bdd7a468743f33f3 100644 (file)
@@ -12,7 +12,7 @@
 #define PVT_READ       0
 #define PVT_WRITE      1
 
-uint32_t pvt_read_reg(const uintptr_t base, const unsigned offset);
-uint32_t pvt_write_reg(const uintptr_t base, const unsigned offset, const uint32_t val);
+uint32_t pvt_read_reg(const uintptr_t base, const unsigned int offset);
+uint32_t pvt_write_reg(const uintptr_t base, const unsigned int offset, const uint32_t val);
 
 #endif /* BAIKAL_PVT_H */
index 4ef9f21ca17d49048ec893d52a6096e5e178376e..a0ce592e22d74b0cc4f5b21ae55cb5817cfc8cd0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2022, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -9,55 +9,52 @@
 
 #include <stdint.h>
 
-#define BAIKAL_SMC_LCRU_ID             0x82000000
-#define BAIKAL_SMC_PVT_ID              (BAIKAL_SMC_LCRU_ID + 0x001)
-#define BAIKAL_SMC_FLASH               (BAIKAL_SMC_LCRU_ID + 0x002)
-#define BAIKAL_SMC_VDU_UPDATE          (BAIKAL_SMC_LCRU_ID + 0x100)
-#define BAIKAL_SMC_SCP_LOG_DISABLE     (BAIKAL_SMC_LCRU_ID + 0x200)
-#define BAIKAL_SMC_SCP_LOG_ENABLE      (BAIKAL_SMC_LCRU_ID + 0x201)
-#define BAIKAL_SMC_VDEC_SMMU_SET_CACHE (BAIKAL_SMC_LCRU_ID + 0x300)
-#define BAIKAL_SMC_VDEC_SMMU_GET_CACHE (BAIKAL_SMC_LCRU_ID + 0x301)
-#define BAIKAL_SMC_CLK                 (BAIKAL_SMC_LCRU_ID + 0x400)
-
-#define BAIKAL_SMC_CLK_ROUND           (BAIKAL_SMC_CLK + 0)
-#define BAIKAL_SMC_CLK_SET             (BAIKAL_SMC_CLK + 1)
-#define BAIKAL_SMC_CLK_GET             (BAIKAL_SMC_CLK + 2)
-#define BAIKAL_SMC_CLK_ENABLE          (BAIKAL_SMC_CLK + 3)
-#define BAIKAL_SMC_CLK_DISABLE         (BAIKAL_SMC_CLK + 4)
-#define BAIKAL_SMC_CLK_IS_ENABLED      (BAIKAL_SMC_CLK + 5)
-
-#define BAIKAL_SMC_FLASH_WRITE         (BAIKAL_SMC_FLASH + 0)
-#define BAIKAL_SMC_FLASH_READ          (BAIKAL_SMC_FLASH + 1)
-#define BAIKAL_SMC_FLASH_ERASE         (BAIKAL_SMC_FLASH + 2)
-#define BAIKAL_SMC_FLASH_PUSH          (BAIKAL_SMC_FLASH + 3)
-#define BAIKAL_SMC_FLASH_PULL          (BAIKAL_SMC_FLASH + 4)
-#define BAIKAL_SMC_FLASH_POSITION      (BAIKAL_SMC_FLASH + 5)
-#define BAIKAL_SMC_FLASH_INIT          (BAIKAL_SMC_FLASH + 6)
-#define BAIKAL_SMC_FLASH_LOCK          (BAIKAL_SMC_FLASH + 7)
-
-#define BAIKAL_SMC_GMAC                        (BAIKAL_SMC_LCRU_ID + 0x500)
-#define BAIKAL_SMC_GMAC_DIV2_ENABLE    (BAIKAL_SMC_GMAC + 0)
-#define BAIKAL_SMC_GMAC_DIV2_DISABLE   (BAIKAL_SMC_GMAC + 1)
-
-#define BAIKAL_SMC_LSP_MUX             (BAIKAL_SMC_LCRU_ID + 0x600)
+/* TODO: TF-A uses [0xc2000000:0xc200001f] range for PMF calls */
+#define BAIKAL_SMC_CMU_CMD             0xc2000000
+#define BAIKAL_SMC_PVT_CMD             0xc2000001
+#define BAIKAL_SMC_FLASH_WRITE         0xc2000002
+#define BAIKAL_SMC_FLASH_READ          0xc2000003
+#define BAIKAL_SMC_FLASH_ERASE         0xc2000004
+#define BAIKAL_SMC_FLASH_PUSH          0xc2000005
+#define BAIKAL_SMC_FLASH_PULL          0xc2000006
+#define BAIKAL_SMC_FLASH_POSITION      0xc2000007
+#define BAIKAL_SMC_FLASH_INIT          0xc2000008
+#define BAIKAL_SMC_FLASH_LOCK          0xc2000009
+#define BAIKAL_SMC_VDU_UPDATE          0xc2000100
+#define BAIKAL_SMC_SCP_LOG_DISABLE     0xc2000200
+#define BAIKAL_SMC_SCP_LOG_ENABLE      0xc2000201
+#define BAIKAL_SMC_EFUSE_GET_LOT       0xc2000202
+#define BAIKAL_SMC_EFUSE_GET_SERIAL    0xc2000203
+#define BAIKAL_SMC_EFUSE_GET_MAC       0xc2000204
+#define BAIKAL_SMC_VDEC_SMMU_SET_CACHE 0xc2000300
+#define BAIKAL_SMC_VDEC_SMMU_GET_CACHE 0xc2000301
+#define BAIKAL_SMC_CLK_ROUND           0xc2000400
+#define BAIKAL_SMC_CLK_SET             0xc2000401
+#define BAIKAL_SMC_CLK_GET             0xc2000402
+#define BAIKAL_SMC_CLK_ENABLE          0xc2000403
+#define BAIKAL_SMC_CLK_DISABLE         0xc2000404
+#define BAIKAL_SMC_CLK_IS_ENABLED      0xc2000405
+#define BAIKAL_SMC_GMAC_DIV2_ENABLE    0xc2000500
+#define BAIKAL_SMC_GMAC_DIV2_DISABLE   0xc2000501
+#define BAIKAL_SMC_LSP_MUX             0xc2000600
 
 int64_t baikal_smc_flash_handler(const uint32_t smc,
-                            const uint64_t x1,
-                            const uint64_t x2,
-                            const uint64_t x3,
-                            const uint64_t x4,
-                            uint64_t *data);
-
-int64_t baikal_smc_clk_handler  (const uint32_t smc,
-                            const uint64_t x1,
-                            const uint64_t x2,
-                            const uint64_t x3,
-                            const uint64_t x4);
+                                const uint64_t x1,
+                                const uint64_t x2,
+                                const uint64_t x3,
+                                const uint64_t x4,
+                                uint64_t *data);
+
+int64_t baikal_smc_clk_handler(const uint32_t smc,
+                              const uint64_t x1,
+                              const uint64_t x2,
+                              const uint64_t x3,
+                              const uint64_t x4);
 
 int64_t baikal_smc_gmac_handler(const uint32_t smc,
-                            const uint64_t x1,
-                            const uint64_t x2,
-                            const uint64_t x3,
-                            const uint64_t x4);
+                               const uint64_t x1,
+                               const uint64_t x2,
+                               const uint64_t x3,
+                               const uint64_t x4);
 
 #endif /* BAIKAL_SIP_SVC_H */
index 0ef966f364d9b411f513272870cdcf6b58d9d862..f511e524aa205b89c0a08e6208fd9f754f999565 100644 (file)
@@ -7,9 +7,9 @@
 #ifndef DW_GPIO_H
 #define DW_GPIO_H
 
-void gpio_dir_clr(const uintptr_t base, const unsigned pin);
-void gpio_dir_set(const uintptr_t base, const unsigned pin);
-void gpio_out_rst(const uintptr_t base, const unsigned pin);
-void gpio_out_set(const uintptr_t base, const unsigned pin);
+void gpio_dir_clr(const uintptr_t base, const unsigned int pin);
+void gpio_dir_set(const uintptr_t base, const unsigned int pin);
+void gpio_out_rst(const uintptr_t base, const unsigned int pin);
+void gpio_out_set(const uintptr_t base, const unsigned int pin);
 
 #endif /* DW_GPIO_H */
index fcaa3f8eeb39ab4296bbbad622336b8542e5e732..f874b10b80e6349f82b7db21cc435d23509bbf34 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020-2021, Baikal Electronics, JSC. All rights reserved.
+ * Copyright (c) 2020-2023, Baikal Electronics, JSC. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -8,10 +8,11 @@
 #define DW_I2C_H
 
 int i2c_txrx(const uintptr_t base,
-            const unsigned addr,
+            const unsigned int iclk,
+            const unsigned int targetaddr,
             const void *const txbuf,
-            const unsigned txbufsize,
+            const unsigned int txbufsize,
             void *const rxbuf,
-            const unsigned rxbufsize);
+            const unsigned int rxbufsize);
 
 #endif /* DW_I2C_H */
index 08d00c461460191d4bb96c7c6322fd914315d158..a446f49be6844cecf87cd333c8280edcea044731 100644 (file)
@@ -10,8 +10,8 @@
 #include <stddef.h>
 #include <stdint.h>
 
-int spi_flash_init( int line);
-int spi_flash_read( int line, uint32_t adr, void *data, size_t size);
+int spi_flash_init(int line);
+int spi_flash_read(int line, uint32_t adr, void *data, size_t size);
 int spi_flash_erase(int line, uint32_t adr, size_t size);
 int spi_flash_write(int line, uint32_t adr, void *data, size_t size);
 
index 2ae99bd0ce639ac11b00c9070d2111683ad76687..8435506332dbed6312b0aa967feb1bf326378004 100644 (file)
 
 int memtest_rand64(const uintptr_t base,
                   const size_t size,
-                  const unsigned incr,
+                  const unsigned int incr,
                   const uint64_t seed);
 
 int memtest_rand8(const uintptr_t base,
                  const size_t size,
-                 const unsigned incr,
+                 const unsigned int incr,
                  const uint64_t seed);
 
 #endif /* MEMTEST_H */
index ef28ea238e6fb62ac82ce2cdee90d3a4433ac797..f8e17c1f066ad0bfff20ec8ab462d8fb82390255 100644 (file)
@@ -7,7 +7,7 @@
 #ifndef SPD_H
 #define SPD_H
 
-unsigned          spd_get_baseconf_crc(const void *const baseconf);
+unsigned int      spd_get_baseconf_crc(const void *const baseconf);
 unsigned long long spd_get_baseconf_dimm_capacity(const void *const baseconf);
 
 #endif /* SPD_H */
index b23cdc570517bd8429d2b4cc6577e7bff199ea5f..3d677c8fb2e0f816e7c210b8efc7090255ab5a25 100644 (file)
@@ -12,7 +12,7 @@
 
 int memtest_rand64(const uintptr_t base,
                   const size_t size,
-                  const unsigned incr,
+                  const unsigned int incr,
                   const uint64_t seed)
 {
        uint64_t *ptr;
@@ -52,7 +52,7 @@ int memtest_rand64(const uintptr_t base,
 
 int memtest_rand8(const uintptr_t base,
                  const size_t size,
-                 const unsigned incr,
+                 const unsigned int incr,
                  const uint64_t seed)
 {
        uint8_t *ptr;
index 494c5dd0fe4fa64f6feab5eb0e3691939452fe62..b75f435d1cd44ad58370dc6f5796556eae3631f6 100644 (file)
@@ -13,8 +13,9 @@
 
 void ndelay(const uint64_t nsec)
 {
-       const unsigned div = 1000000000 / plat_get_syscnt_freq2();
+       const unsigned int div = 1000000000 / plat_get_syscnt_freq2();
        const uint64_t expcnt = read_cntpct_el0() + (nsec + div - 1) / div;
 
-       while (read_cntpct_el0() <= expcnt);
+       while (read_cntpct_el0() <= expcnt)
+               ;
 }
index fb983ab027af5c2ae54e87de52dc6dc6227febe1..d2d3dceac039725996d57fb5d18efa24c7d420a0 100644 (file)
@@ -8,9 +8,10 @@
 
 #include <spd.h>
 
-unsigned spd_get_baseconf_crc(const void *const baseconf)
+unsigned int spd_get_baseconf_crc(const void *const baseconf)
 {
        const uint8_t *const spdbuf = baseconf;
+
        return (spdbuf[127] << 8) | spdbuf[126];
 }
 
@@ -70,6 +71,7 @@ unsigned long long spd_get_baseconf_dimm_capacity(const void *const baseconf)
        }
 
        unsigned long long total;
+
        total  = sdram_capacity_per_die;
        total /= 8;
        total *= primary_bus_width;