]> git.sur5r.net Git - u-boot/commitdiff
Merge branch 'next' of git://git.denx.de/u-boot-video
authorTom Rini <trini@konsulko.com>
Thu, 21 Sep 2017 11:51:20 +0000 (07:51 -0400)
committerTom Rini <trini@konsulko.com>
Thu, 21 Sep 2017 11:51:20 +0000 (07:51 -0400)
547 files changed:
.travis.yml
Makefile
README
arch/arm/Kconfig
arch/arm/cpu/armv7/ls102xa/Kconfig
arch/arm/cpu/armv7/ls102xa/soc.c
arch/arm/cpu/armv8/Kconfig
arch/arm/cpu/armv8/fsl-layerscape/Kconfig
arch/arm/cpu/armv8/fsl-layerscape/Makefile
arch/arm/cpu/armv8/fsl-layerscape/cpu.c
arch/arm/cpu/armv8/fsl-layerscape/doc/README.soc
arch/arm/cpu/armv8/fsl-layerscape/fdt.c
arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch3_serdes.c
arch/arm/cpu/armv8/fsl-layerscape/lowlevel.S
arch/arm/cpu/armv8/fsl-layerscape/ls1088a_serdes.c [new file with mode: 0644]
arch/arm/cpu/armv8/fsl-layerscape/ppa.c
arch/arm/cpu/armv8/fsl-layerscape/soc.c
arch/arm/dts/Makefile
arch/arm/dts/am571x-idk.dts
arch/arm/dts/am572x-idk.dts
arch/arm/dts/am57xx-beagle-x15-common.dtsi
arch/arm/dts/am57xx-beagle-x15-revb1.dts
arch/arm/dts/am57xx-beagle-x15-revc.dts [new file with mode: 0644]
arch/arm/dts/am57xx-beagle-x15.dts
arch/arm/dts/am57xx-cl-som-am57x.dts [new file with mode: 0644]
arch/arm/dts/am57xx-idk-common.dtsi
arch/arm/dts/am57xx-sbc-am57x.dts [new file with mode: 0644]
arch/arm/dts/at91-sama5d27_som1_ek.dts [new file with mode: 0644]
arch/arm/dts/at91-sama5d2_xplained.dts
arch/arm/dts/at91-sama5d4_xplained.dts
arch/arm/dts/dra7-evm-common.dtsi [new file with mode: 0644]
arch/arm/dts/dra7-evm-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/dra7-evm.dts
arch/arm/dts/dra7.dtsi
arch/arm/dts/dra71-evm-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/dra71-evm.dts
arch/arm/dts/dra72-evm-common.dtsi
arch/arm/dts/dra72-evm-revc-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/dra72-evm-revc.dts
arch/arm/dts/dra72-evm-tps65917.dtsi
arch/arm/dts/dra72-evm.dts
arch/arm/dts/dra72x-mmc-iodelay.dtsi [new file with mode: 0644]
arch/arm/dts/dra72x.dtsi
arch/arm/dts/dra74x-mmc-iodelay.dtsi [new file with mode: 0644]
arch/arm/dts/dra74x.dtsi
arch/arm/dts/dra76-evm-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/dra76-evm.dts [new file with mode: 0644]
arch/arm/dts/dra76x.dtsi [new file with mode: 0644]
arch/arm/dts/dra7xx-clocks.dtsi
arch/arm/dts/ethernut5.dts
arch/arm/dts/fsl-ls1088a-qds.dts [new file with mode: 0644]
arch/arm/dts/fsl-ls1088a-rdb.dts [new file with mode: 0644]
arch/arm/dts/fsl-ls1088a.dtsi [new file with mode: 0644]
arch/arm/dts/logicpd-torpedo-37xx-devkit-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/logicpd-torpedo-37xx-devkit.dts
arch/arm/dts/omap3-cpu-thermal.dtsi [new file with mode: 0644]
arch/arm/dts/omap3-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/omap3.dtsi
arch/arm/dts/omap34xx-omap36xx-clocks.dtsi
arch/arm/dts/omap36xx-am35xx-omap3430es2plus-clocks.dtsi
arch/arm/dts/omap36xx-clocks.dtsi
arch/arm/dts/omap36xx-omap3430es2plus-clocks.dtsi
arch/arm/dts/omap36xx-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/omap36xx.dtsi
arch/arm/dts/omap3xxx-clocks.dtsi
arch/arm/dts/omap5-u-boot.dtsi
arch/arm/dts/rk3288-vyasa.dts [new file with mode: 0644]
arch/arm/dts/rk3368-lion-u-boot.dtsi
arch/arm/dts/rk3399-puma.dtsi
arch/arm/dts/rv1108-evb.dts
arch/arm/dts/rv1108.dtsi
arch/arm/dts/sama5d2.dtsi
arch/arm/dts/sama5d27_som1.dtsi [new file with mode: 0644]
arch/arm/dts/sama5d3.dtsi
arch/arm/include/asm/arch-fsl-layerscape/config.h
arch/arm/include/asm/arch-fsl-layerscape/cpu.h
arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h
arch/arm/include/asm/arch-fsl-layerscape/soc.h
arch/arm/include/asm/arch-fsl-layerscape/stream_id_lsch3.h
arch/arm/include/asm/arch-ls102xa/config.h
arch/arm/include/asm/arch-ls102xa/immap_ls102xa.h
arch/arm/include/asm/arch-mx6/sys_proto.h
arch/arm/include/asm/arch-mx7/clock.h
arch/arm/include/asm/arch-omap5/clock.h
arch/arm/include/asm/arch-omap5/mux_dra7xx.h
arch/arm/include/asm/arch-omap5/omap.h
arch/arm/include/asm/arch-rockchip/grf_rk322x.h
arch/arm/include/asm/armv8/mmu.h
arch/arm/include/asm/dma-mapping.h
arch/arm/include/asm/fsl_secure_boot.h
arch/arm/include/asm/omap_common.h
arch/arm/include/asm/omap_mmc.h
arch/arm/mach-at91/Kconfig
arch/arm/mach-at91/armv7/clock.c
arch/arm/mach-at91/armv7/sama5d2_devices.c
arch/arm/mach-at91/atmel_sfr.c
arch/arm/mach-at91/include/mach/at91_common.h
arch/arm/mach-at91/include/mach/at91_pmc.h
arch/arm/mach-at91/include/mach/at91rm9200.h
arch/arm/mach-at91/include/mach/at91sam9260.h
arch/arm/mach-at91/include/mach/at91sam9261.h
arch/arm/mach-at91/include/mach/at91sam9263.h
arch/arm/mach-at91/include/mach/at91sam9g45.h
arch/arm/mach-at91/include/mach/at91sam9rl.h
arch/arm/mach-at91/include/mach/at91sam9x5.h
arch/arm/mach-at91/include/mach/atmel_mpddrc.h
arch/arm/mach-at91/include/mach/sama5_sfr.h
arch/arm/mach-at91/include/mach/sama5d2.h
arch/arm/mach-at91/include/mach/sama5d3.h
arch/arm/mach-at91/include/mach/sama5d4.h
arch/arm/mach-at91/matrix.c
arch/arm/mach-at91/phy.c
arch/arm/mach-at91/spl.c
arch/arm/mach-at91/spl_atmel.c
arch/arm/mach-davinci/Makefile
arch/arm/mach-davinci/da830_pinmux.c [deleted file]
arch/arm/mach-imx/mx7/clock.c
arch/arm/mach-imx/spl.c
arch/arm/mach-omap2/omap3/Kconfig
arch/arm/mach-omap2/omap5/Kconfig
arch/arm/mach-omap2/omap5/hw_data.c
arch/arm/mach-omap2/omap5/hwinit.c
arch/arm/mach-omap2/omap5/sdram.c
arch/arm/mach-omap2/sec-common.c
arch/arm/mach-rockchip/rk322x-board.c
arch/arm/mach-rockchip/rk3288/Kconfig
arch/arm/mach-rockchip/rk3399-board-spl.c
arch/arm/mach-rockchip/rk3399/sdram_rk3399.c
arch/arm/mach-tegra/xusb-padctl-common.c
arch/arm/mach-uniphier/Kconfig
arch/arm/mach-uniphier/clk/clk-ld11.c
arch/arm/mach-uniphier/clk/clk-ld20.c
arch/arm/mach-uniphier/clk/clk-pxs3.c
arch/arm/mach-uniphier/sc64-regs.h
arch/nds32/cpu/n1213/start.S
arch/nds32/dts/ae3xx.dts
arch/nds32/include/asm/bootm.h
arch/nds32/include/asm/dma-mapping.h
arch/nds32/include/asm/io.h
arch/nds32/lib/bootm.c
arch/sandbox/Kconfig
arch/sandbox/dts/test.dts
arch/x86/Kconfig
arch/x86/cpu/Makefile
arch/x86/cpu/braswell/Kconfig [new file with mode: 0644]
arch/x86/cpu/braswell/Makefile [new file with mode: 0644]
arch/x86/cpu/braswell/braswell.c [new file with mode: 0644]
arch/x86/cpu/braswell/cpu.c [new file with mode: 0644]
arch/x86/cpu/braswell/early_uart.c [new file with mode: 0644]
arch/x86/cpu/braswell/fsp_configs.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/northbridge.c
arch/x86/dts/Makefile
arch/x86/dts/cherryhill.dts [new file with mode: 0644]
arch/x86/dts/microcode/m01406c2220.dtsi [new file with mode: 0644]
arch/x86/dts/microcode/m01406c3363.dtsi [new file with mode: 0644]
arch/x86/dts/microcode/m01406c440a.dtsi [new file with mode: 0644]
arch/x86/dts/u-boot.dtsi
arch/x86/include/asm/arch-braswell/fsp/fsp_configs.h [new file with mode: 0644]
arch/x86/include/asm/arch-braswell/fsp/fsp_vpd.h [new file with mode: 0644]
arch/x86/include/asm/arch-braswell/gpio.h [new file with mode: 0644]
arch/x86/include/asm/arch-braswell/iomap.h [new file with mode: 0644]
arch/x86/include/asm/dma-mapping.h
arch/x86/include/asm/fsp/fsp_api.h
arch/x86/include/asm/fsp/fsp_hob.h
arch/x86/include/asm/fsp/fsp_infoheader.h
arch/x86/include/asm/fsp/fsp_support.h
arch/x86/include/asm/global_data.h
arch/x86/lib/fsp/Makefile
arch/x86/lib/fsp/cmd_fsp.c
arch/x86/lib/fsp/fsp_graphics.c [new file with mode: 0644]
arch/x86/lib/fsp/fsp_support.c
board/AndesTech/adp-ae3xx/adp-ae3xx.c
board/amarula/vyasa-rk3288/Kconfig [new file with mode: 0644]
board/amarula/vyasa-rk3288/MAINTAINERS [new file with mode: 0644]
board/amarula/vyasa-rk3288/Makefile [new file with mode: 0644]
board/amarula/vyasa-rk3288/vyasa-rk3288.c [new file with mode: 0644]
board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
board/atmel/at91sam9n12ek/at91sam9n12ek.c
board/atmel/at91sam9x5ek/at91sam9x5ek.c
board/atmel/common/Makefile [new file with mode: 0644]
board/atmel/common/board.c [new file with mode: 0644]
board/atmel/common/mac_eeprom.c [new file with mode: 0644]
board/atmel/common/video_display.c [new file with mode: 0644]
board/atmel/sama5d27_som1_ek/Kconfig [new file with mode: 0644]
board/atmel/sama5d27_som1_ek/MAINTAINERS [new file with mode: 0644]
board/atmel/sama5d27_som1_ek/Makefile [new file with mode: 0644]
board/atmel/sama5d27_som1_ek/sama5d27_som1_ek.c [new file with mode: 0644]
board/atmel/sama5d2_ptc/sama5d2_ptc.c
board/atmel/sama5d2_xplained/sama5d2_xplained.c
board/atmel/sama5d3_xplained/sama5d3_xplained.c
board/atmel/sama5d3xek/sama5d3xek.c
board/atmel/sama5d4_xplained/sama5d4_xplained.c
board/atmel/sama5d4ek/sama5d4ek.c
board/bachmann/ot1200/ot1200_spl.c
board/compulab/cl-som-am57x/mux.c
board/compulab/cm_fx6/spl.c
board/davinci/da8xxevm/Kconfig
board/davinci/da8xxevm/MAINTAINERS
board/davinci/da8xxevm/da850evm.c
board/engicam/common/spl.c
board/freescale/ls1012afrdm/ls1012afrdm.c
board/freescale/ls1012aqds/ls1012aqds.c
board/freescale/ls1012ardb/ls1012ardb.c
board/freescale/ls1021aqds/ls1021aqds.c
board/freescale/ls1088a/Kconfig [new file with mode: 0644]
board/freescale/ls1088a/MAINTAINERS [new file with mode: 0644]
board/freescale/ls1088a/Makefile [new file with mode: 0644]
board/freescale/ls1088a/README [new file with mode: 0644]
board/freescale/ls1088a/ddr.c [new file with mode: 0644]
board/freescale/ls1088a/ddr.h [new file with mode: 0644]
board/freescale/ls1088a/eth_ls1088aqds.c [new file with mode: 0644]
board/freescale/ls1088a/eth_ls1088ardb.c [new file with mode: 0644]
board/freescale/ls1088a/ls1088a.c [new file with mode: 0644]
board/freescale/ls1088a/ls1088a_qixis.h [new file with mode: 0644]
board/freescale/ls2080aqds/ls2080aqds.c
board/freescale/ls2080ardb/MAINTAINERS
board/freescale/ls2080ardb/ls2080ardb.c
board/freescale/mx7dsabresd/mx7dsabresd.c
board/gateworks/gw_ventana/gw_ventana_spl.c
board/ge/bx50v3/Makefile
board/ge/bx50v3/bx50v3.c
board/ge/bx50v3/vpd_reader.c [new file with mode: 0644]
board/ge/bx50v3/vpd_reader.h [new file with mode: 0644]
board/intel/Kconfig
board/intel/cherryhill/Kconfig [new file with mode: 0644]
board/intel/cherryhill/MAINTAINERS [new file with mode: 0644]
board/intel/cherryhill/Makefile [new file with mode: 0644]
board/intel/cherryhill/cherryhill.c [new file with mode: 0644]
board/intel/cherryhill/start.S [new file with mode: 0644]
board/kosagi/novena/novena_spl.c
board/liebherr/mccmon6/spl.c
board/logicpd/am3517evm/Kconfig
board/logicpd/omap3som/omap3logic.c
board/sandbox/README.sandbox
board/solidrun/mx6cuboxi/mx6cuboxi.c
board/technexion/pico-imx7d/README
board/technexion/pico-imx7d/pico-imx7d.c
board/theobroma-systems/lion_rk3368/README
board/theobroma-systems/puma_rk3399/README
board/theobroma-systems/puma_rk3399/puma-rk3399.c
board/ti/am57xx/board.c
board/ti/dra7xx/evm.c
board/ti/dra7xx/mux_data.h
board/ti/ks2_evm/board_k2g.c
board/toradex/apalis_imx6/apalis_imx6.c
board/toradex/colibri_imx6/colibri_imx6.c
board/toradex/colibri_imx7/colibri_imx7.c
board/toradex/common/tdx-cfg-block.c
board/udoo/udoo_spl.c
board/wandboard/spl.c
cmd/blk_common.c
cmd/fdt.c
cmd/mmc.c
cmd/spl.c
cmd/ubi.c
common/Kconfig
common/Makefile
common/board_f.c
common/bootstage.c
common/fdt_support.c
common/image-fdt.c
common/image-fit.c
common/image.c
common/spl/spl.c
common/spl/spl_fit.c
configs/adp-ae3xx_defconfig
configs/am3517_crane_defconfig
configs/am3517_evm_defconfig
configs/am57xx_evm_defconfig
configs/am57xx_hs_evm_defconfig
configs/at91sam9m10g45ek_mmc_defconfig
configs/at91sam9m10g45ek_nandflash_defconfig
configs/at91sam9n12ek_mmc_defconfig
configs/at91sam9n12ek_nandflash_defconfig
configs/at91sam9n12ek_spiflash_defconfig
configs/at91sam9x5ek_dataflash_defconfig
configs/at91sam9x5ek_mmc_defconfig
configs/at91sam9x5ek_nandflash_defconfig
configs/at91sam9x5ek_spiflash_defconfig
configs/cherryhill_defconfig [new file with mode: 0644]
configs/chromebook_link64_defconfig
configs/chromebook_link_defconfig
configs/cm_t3517_defconfig
configs/da850_am18xxevm_defconfig
configs/da850evm_defconfig
configs/da850evm_direct_nor_defconfig
configs/dra7xx_evm_defconfig
configs/dra7xx_hs_evm_defconfig
configs/eco5pk_defconfig
configs/evb-rv1108_defconfig
configs/lion-rk3368_defconfig
configs/ls1088aqds_qspi_defconfig [new file with mode: 0644]
configs/ls1088ardb_qspi_defconfig [new file with mode: 0644]
configs/ls2088ardb_qspi_SECURE_BOOT_defconfig [new file with mode: 0644]
configs/ma5d4evk_defconfig
configs/mcx_defconfig
configs/mt_ventoux_defconfig
configs/mx6sabresd_defconfig
configs/omap3_logic_defconfig
configs/puma-rk3399_defconfig
configs/sama5d27_som1_ek_mmc_defconfig [new file with mode: 0644]
configs/sama5d2_ptc_nandflash_defconfig
configs/sama5d2_ptc_spiflash_defconfig
configs/sama5d2_xplained_mmc_defconfig
configs/sama5d2_xplained_spiflash_defconfig
configs/sama5d36ek_cmp_mmc_defconfig
configs/sama5d36ek_cmp_nandflash_defconfig
configs/sama5d36ek_cmp_spiflash_defconfig
configs/sama5d3_xplained_mmc_defconfig
configs/sama5d3_xplained_nandflash_defconfig
configs/sama5d3xek_mmc_defconfig
configs/sama5d3xek_nandflash_defconfig
configs/sama5d3xek_spiflash_defconfig
configs/sama5d4_xplained_mmc_defconfig
configs/sama5d4_xplained_nandflash_defconfig
configs/sama5d4_xplained_spiflash_defconfig
configs/sama5d4ek_mmc_defconfig
configs/sama5d4ek_nandflash_defconfig
configs/sama5d4ek_spiflash_defconfig
configs/sandbox_defconfig
configs/sandbox_flattree_defconfig
configs/sandbox_noblk_defconfig
configs/sandbox_spl_defconfig
configs/sheep-rk3368_defconfig
configs/twister_defconfig
configs/uniphier_pro4_defconfig [deleted file]
configs/uniphier_pxs2_ld6b_defconfig [deleted file]
configs/uniphier_v7_defconfig [new file with mode: 0644]
configs/vinco_defconfig
configs/vyasa-rk3288_defconfig [new file with mode: 0644]
disk/part.c
doc/README.fdt-overlays [new file with mode: 0644]
doc/README.uniphier
doc/README.x86
doc/bounces [new file with mode: 0644]
doc/driver-model/of-plat.txt
doc/uImage.FIT/command_syntax_extensions.txt
doc/uImage.FIT/multi_spl.its
doc/uImage.FIT/overlay-fdt-boot.txt [new file with mode: 0644]
doc/uImage.FIT/source_file_format.txt
drivers/ata/sata_dwc.c
drivers/ata/sata_dwc.h
drivers/block/blk-uclass.c
drivers/block/blk_legacy.c
drivers/block/sandbox.c
drivers/bootcount/bootcount_davinci.c
drivers/clk/Kconfig
drivers/clk/at91/Kconfig
drivers/clk/at91/clk-utmi.c
drivers/clk/at91/pmc.h
drivers/clk/clk-uclass.c
drivers/clk/rockchip/clk_rk3368.c
drivers/clk/rockchip/clk_rk3399.c
drivers/core/dump.c
drivers/core/ofnode.c
drivers/core/read.c
drivers/core/regmap.c
drivers/core/root.c
drivers/ddr/fsl/util.c
drivers/gpio/rk_gpio.c
drivers/i2c/muxes/pca954x.c
drivers/i2c/rk_i2c.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/cros_ec.c
drivers/misc/i2c_eeprom.c
drivers/misc/rockchip-efuse.c
drivers/mmc/rockchip_dw_mmc.c
drivers/mmc/rockchip_sdhci.c
drivers/mmc/uniphier-sd.c
drivers/mtd/nand/denali.c
drivers/mtd/nand/denali.h
drivers/mtd/nand/denali_dt.c
drivers/mtd/spi/spi_flash_ids.c
drivers/net/designware.c
drivers/net/fm/fm.c
drivers/net/fsl-mc/mc.c
drivers/net/ftmac100.c
drivers/net/ldpaa_eth/Makefile
drivers/net/ldpaa_eth/ldpaa_wriop.c
drivers/net/ldpaa_eth/ls1088a.c [new file with mode: 0644]
drivers/net/phy/cortina.c
drivers/net/phy/micrel_ksz90x1.c
drivers/pinctrl/pinctrl-at91.c
drivers/pinctrl/rockchip/pinctrl_rk3368.c
drivers/power/palmas.c
drivers/power/pmic/pmic-uclass.c
drivers/power/pmic/rk8xx.c
drivers/qe/qe.c
drivers/ram/rockchip/dmc-rk3368.c
drivers/scsi/scsi.c
drivers/serial/Kconfig
drivers/serial/Makefile
drivers/serial/serial_nulldev.c [new file with mode: 0644]
drivers/spi/Kconfig
drivers/spi/Makefile
drivers/spi/nds_ae3xx_spi.c [new file with mode: 0644]
drivers/spi/rk_spi.c
drivers/sysreset/Makefile
drivers/timer/rockchip_timer.c
drivers/timer/timer-uclass.c
drivers/timer/tsc_timer.c
drivers/video/ipu_common.c
examples/api/Makefile
examples/api/glue.c
fs/fat/Makefile
fs/fat/fat.c
fs/fat/fat_write.c
fs/fat/file.c [deleted file]
fs/fs.c
include/atmel_lcd.h
include/blk.h
include/bootstage.h
include/charset.h [new file with mode: 0644]
include/clk.h
include/config_fallbacks.h
include/configs/adp-ae3xx.h
include/configs/adp-ag101p.h
include/configs/advantech_dms-ba16.h
include/configs/am3517_crane.h
include/configs/am3517_evm.h
include/configs/apalis_imx6.h
include/configs/aristainetos-common.h
include/configs/at91-sama5_common.h
include/configs/at91sam9m10g45ek.h
include/configs/at91sam9n12ek.h
include/configs/at91sam9x5ek.h
include/configs/cgtqmx6eval.h
include/configs/cherryhill.h [new file with mode: 0644]
include/configs/cm_fx6.h
include/configs/cm_t35.h
include/configs/cm_t3517.h
include/configs/colibri_imx6.h
include/configs/devkit8000.h
include/configs/embestmx6boards.h
include/configs/ge_bx50v3.h
include/configs/gw_ventana.h
include/configs/imx6-engicam.h
include/configs/k2g_evm.h
include/configs/ls1088a_common.h [new file with mode: 0644]
include/configs/ls1088aqds.h [new file with mode: 0644]
include/configs/ls1088ardb.h [new file with mode: 0644]
include/configs/m53evk.h
include/configs/ma5d4evk.h
include/configs/mcx.h
include/configs/mx51evk.h
include/configs/mx53cx9020.h
include/configs/mx53loco.h
include/configs/mx6cuboxi.h
include/configs/mx6sabre_common.h
include/configs/nitrogen6x.h
include/configs/nokia_rx51.h
include/configs/novena.h
include/configs/omap3_beagle.h
include/configs/omap3_cairo.h
include/configs/omap3_evm.h
include/configs/omap3_logic.h
include/configs/omap3_overo.h
include/configs/omap3_pandora.h
include/configs/omap3_zoom1.h
include/configs/rk3368_common.h
include/configs/rv1108_common.h
include/configs/sama5d27_som1_ek.h [new file with mode: 0644]
include/configs/sama5d2_ptc.h
include/configs/sama5d2_xplained.h
include/configs/sama5d3_xplained.h
include/configs/sama5d3xek.h
include/configs/sama5d4_xplained.h
include/configs/sama5d4ek.h
include/configs/sniper.h
include/configs/tam3517-common.h
include/configs/tao3530.h
include/configs/tbs2910.h
include/configs/ti_omap3_common.h
include/configs/tricorder.h
include/configs/vinco.h
include/configs/vyasa-rk3288.h [new file with mode: 0644]
include/configs/wandboard.h
include/dm/ofnode.h
include/dm/read.h
include/dm/root.h
include/dt-bindings/pinctrl/dra.h
include/dt-structs.h
include/environment/ti/boot.h
include/fat.h
include/fdt_support.h
include/fdtdec.h
include/fs.h
include/fsl-mc/ldpaa_wriop.h
include/fsl_immap.h
include/image.h
include/linux/dma-direction.h [new file with mode: 0644]
include/linux/io.h
include/palmas.h
include/part.h
include/regmap.h
include/syscon.h
lib/Kconfig
lib/Makefile
lib/at91/Makefile [new file with mode: 0644]
lib/at91/at91.c [new file with mode: 0644]
lib/at91/atmel_logo_8bpp.h [new file with mode: 0644]
lib/at91/microchip_logo_8bpp.h [new file with mode: 0644]
lib/charset.c [new file with mode: 0644]
lib/efi_loader/efi_console.c
lib/libfdt/fdt_overlay.c
lib/libfdt/fdt_rw.c
lib/libfdt/fdt_wip.c
lib/libfdt/libfdt.h
lib/libfdt/pylibfdt/libfdt.i
lib/strto.c
lib/vsprintf.c
scripts/Makefile.lib
scripts/Makefile.spl
scripts/checkpatch.pl
scripts/config_whitelist.txt
scripts/const_structs.checkpatch [new file with mode: 0644]
test/dm/blk.c
test/dm/test-main.c
test/overlay/Makefile
test/overlay/cmd_ut_overlay.c
test/overlay/test-fdt-overlay-stacked.dts [new file with mode: 0644]
test/py/tests/test_gpt.py [new file with mode: 0644]
test/py/u_boot_console_base.py
tools/binman/etype/intel_vbt.py [new file with mode: 0644]
tools/binman/func_test.py
tools/binman/test/46_intel-vbt.dts [new file with mode: 0644]
tools/buildman/kconfiglib.py
tools/dtoc/dtb_platdata.py
tools/dtoc/dtoc_test_addr32.dts [new file with mode: 0644]
tools/dtoc/dtoc_test_addr32_64.dts [new file with mode: 0644]
tools/dtoc/dtoc_test_addr64.dts [new file with mode: 0644]
tools/dtoc/dtoc_test_addr64_32.dts [new file with mode: 0644]
tools/dtoc/dtoc_test_phandle.dts
tools/dtoc/dtoc_test_simple.dts
tools/dtoc/fdt.py
tools/dtoc/fdt_util.py
tools/dtoc/test_dtoc.py
tools/genboardscfg.py
tools/logos/microchip.bmp [new file with mode: 0644]
tools/moveconfig.py
tools/patman/README
tools/patman/series.py
tools/patman/settings.py
tools/pblimage.c

index ea560b936007ea8ca6a9114754316a78297e2e46..b81d733695e1c232ff4da7ce51cf094524dc95c0 100644 (file)
@@ -26,12 +26,11 @@ addons:
     - grub-efi-ia32-bin
     - rpm2cpio
     - wget
-    - device-tree-compiler
 
 install:
  # install latest device tree compiler
#- git clone --depth=1 git://git.kernel.org/pub/scm/utils/dtc/dtc.git /tmp/dtc
#- make -j4 -C /tmp/dtc
+ - git clone --depth=1 git://git.kernel.org/pub/scm/utils/dtc/dtc.git /tmp/dtc
+ - make -j4 -C /tmp/dtc
  # Clone uboot-test-hooks
  - git clone --depth=1 git://github.com/swarren/uboot-test-hooks.git /tmp/uboot-test-hooks
  - ln -s travis-ci /tmp/uboot-test-hooks/bin/`hostname`
@@ -52,7 +51,7 @@ install:
 
 env:
   global:
-    - PATH=/tmp/dtc:/tmp/qemu-install/bin:/tmp/uboot-test-hooks/bin:$PATH
+    - PATH=/tmp/dtc:/tmp/qemu-install/bin:/tmp/uboot-test-hooks/bin:/usr/bin:/bin
     - PYTHONPATH=/tmp/uboot-test-hooks/py/travis-ci
     - BUILD_DIR=build
     - HOSTCC="cc"
index 8086f3c93eca4ef3f8d4b71b760dfe7e257a9585..8250b3409a6853e4d304bc40403ecf19a6c16601 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -360,6 +360,7 @@ KBUILD_CPPFLAGS := -D__KERNEL__ -D__UBOOT__
 KBUILD_CFLAGS   := -Wall -Wstrict-prototypes \
                   -Wno-format-security \
                   -fno-builtin -ffreestanding
+KBUILD_CFLAGS  += -fshort-wchar
 KBUILD_AFLAGS   := -D__ASSEMBLY__
 
 # Read UBOOTRELEASE from include/config/uboot.release (if it exists)
diff --git a/README b/README
index a46850c8085d5ced315e54cea8e18269367687a5..ca07f7a3f9109e9139fd6ec4a2513bc6befe262c 100644 (file)
--- a/README
+++ b/README
@@ -312,6 +312,19 @@ Many of the options are named exactly as the corresponding Linux
 kernel configuration options. The intention is to make it easier to
 build a config tool - later.
 
+- ARM Platform Bus Type(CCI):
+               CoreLink Cache Coherent Interconnect (CCI) is ARM BUS which
+               provides full cache coherency between two clusters of multi-core
+               CPUs and I/O coherency for devices and I/O masters
+
+               CONFIG_SYS_FSL_HAS_CCI400
+
+               Defined For SoC that has cache coherent interconnect
+               CCN-400
+
+               CONFIG_SYS_FSL_HAS_CCN504
+
+               Defined for SoC that has cache coherent interconnect CCN-504
 
 The following options need to be configured:
 
index 53eae8953e0bb23bdb76bb58605cef289fbd5b1e..bb64b9c160aeb37fa5fe10bb2e1f89606aacc33e 100644 (file)
@@ -808,6 +808,19 @@ config TARGET_LS2080A_SIMU
          development platform that supports the QorIQ LS2080A
          Layerscape Architecture processor.
 
+config TARGET_LS1088AQDS
+       bool "Support ls1088aqds"
+       select ARCH_LS1088A
+       select ARM64
+       select ARMV8_MULTIENTRY
+       select ARCH_MISC_INIT
+       select BOARD_LATE_INIT
+       help
+         Support for NXP LS1088AQDS platform
+         The LS1088A Development System (QDS) is a high-performance
+         development platform that supports the QorIQ LS1088A
+         Layerscape Architecture processor.
+
 config TARGET_LS2080AQDS
        bool "Support ls2080aqds"
        select ARCH_LS2080A
@@ -909,6 +922,19 @@ config TARGET_LS1012AFRDM
          development platform that supports the QorIQ LS1012A
          Layerscape Architecture processor.
 
+config TARGET_LS1088ARDB
+       bool "Support ls1088ardb"
+       select ARCH_LS1088A
+       select ARM64
+       select ARMV8_MULTIENTRY
+       select ARCH_MISC_INIT
+       select BOARD_LATE_INIT
+       help
+         Support for NXP LS1088ARDB platform.
+         The LS1088A Reference design board (RDB) is a high-performance
+         development platform that supports the QorIQ LS1088A
+         Layerscape Architecture processor.
+
 config TARGET_LS1021AQDS
        bool "Support ls1021aqds"
        select BOARD_LATE_INIT
@@ -1192,6 +1218,7 @@ source "board/creative/xfi3/Kconfig"
 source "board/freescale/ls2080a/Kconfig"
 source "board/freescale/ls2080aqds/Kconfig"
 source "board/freescale/ls2080ardb/Kconfig"
+source "board/freescale/ls1088a/Kconfig"
 source "board/freescale/ls1021aqds/Kconfig"
 source "board/freescale/ls1043aqds/Kconfig"
 source "board/freescale/ls1021atwr/Kconfig"
index fadfce4f05a2e8c1da107a508f7767a3e23bc149..20e2b1a50abf77b614a8c80fbff1297125e5a2b7 100644 (file)
@@ -2,9 +2,14 @@ config ARCH_LS1021A
        bool
        select SYS_FSL_ERRATUM_A008378
        select SYS_FSL_ERRATUM_A008407
+       select SYS_FSL_ERRATUM_A008997
+       select SYS_FSL_ERRATUM_A009007
+       select SYS_FSL_ERRATUM_A009008
        select SYS_FSL_ERRATUM_A009663
+       select SYS_FSL_ERRATUM_A009798
        select SYS_FSL_ERRATUM_A009942
        select SYS_FSL_ERRATUM_A010315
+       select SYS_FSL_HAS_CCI400
        select SYS_FSL_SRDS_1
        select SYS_HAS_SERDES
        select SYS_FSL_DDR_BE if SYS_FSL_DDR
@@ -49,9 +54,40 @@ config SECURE_BOOT
                Enable Freescale Secure Boot feature. Normally selected
                by defconfig. If unsure, do not change.
 
+config SYS_CCI400_OFFSET
+       hex "Offset for CCI400 base"
+       depends on SYS_FSL_HAS_CCI400
+       default 0x180000
+       help
+         Offset for CCI400 base.
+         CCI400 base addr = CCSRBAR + CCI400_OFFSET
+
+config SYS_FSL_ERRATUM_A008997
+       bool
+       help
+         Workaround for USB PHY erratum A008997
+
+config SYS_FSL_ERRATUM_A009007
+       bool
+       help
+         Workaround for USB PHY erratum A009007
+
+config SYS_FSL_ERRATUM_A009008
+       bool
+       help
+         Workaround for USB PHY erratum A009008
+
+config SYS_FSL_ERRATUM_A009798
+       bool
+       help
+         Workaround for USB PHY erratum A009798
+
 config SYS_FSL_ERRATUM_A010315
        bool "Workaround for PCIe erratum A010315"
 
+config SYS_FSL_HAS_CCI400
+       bool
+
 config SYS_FSL_SRDS_1
        bool
 
index b84a1a686a460c845f7ae406f43cd4f47d411858..e10037d71181c04a55f0972458186a4fa7da7feb 100644 (file)
@@ -60,6 +60,50 @@ unsigned int get_soc_major_rev(void)
        return major;
 }
 
+static void erratum_a009008(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A009008
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
+       clrsetbits_be32(scfg + SCFG_USB3PRM1CR / 4,
+                       0xF << 6,
+                       SCFG_USB_TXVREFTUNE << 6);
+#endif /* CONFIG_SYS_FSL_ERRATUM_A009008 */
+}
+
+static void erratum_a009798(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A009798
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
+       clrbits_be32(scfg + SCFG_USB3PRM1CR / 4,
+                       SCFG_USB_SQRXTUNE_MASK << 23);
+#endif /* CONFIG_SYS_FSL_ERRATUM_A009798 */
+}
+
+static void erratum_a008997(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008997
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
+       clrsetbits_be32(scfg + SCFG_USB3PRM2CR / 4,
+                       SCFG_USB_PCSTXSWINGFULL_MASK,
+                       SCFG_USB_PCSTXSWINGFULL_VAL);
+#endif /* CONFIG_SYS_FSL_ERRATUM_A008997 */
+}
+
+static void erratum_a009007(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A009007
+       void __iomem *usb_phy = (void __iomem *)USB_PHY_BASE;
+
+       out_le16(usb_phy + USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_1);
+       out_le16(usb_phy + USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_2);
+       out_le16(usb_phy + USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_3);
+       out_le16(usb_phy + USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_4);
+#endif /* CONFIG_SYS_FSL_ERRATUM_A009007 */
+}
+
 void s_init(void)
 {
 }
@@ -80,7 +124,8 @@ void erratum_a010315(void)
 int arch_soc_init(void)
 {
        struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
-       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
+                                       CONFIG_SYS_CCI400_OFFSET);
        unsigned int major;
 
 #ifdef CONFIG_LAYERSCAPE_NS_ACCESS
@@ -146,6 +191,12 @@ int arch_soc_init(void)
         */
        out_be32(&scfg->eddrtqcfg, 0x63b20042);
 
+       /* Erratum */
+       erratum_a009008();
+       erratum_a009798();
+       erratum_a008997();
+       erratum_a009007();
+
        return 0;
 }
 
index 8e4c3dd8f2ce59237b1f37993261dc52a21ebb2c..12aba9d4e9ccc4f82380e999feb81ccc2b46cb95 100644 (file)
@@ -88,6 +88,7 @@ config PSCI_RESET
        depends on !ARCH_EXYNOS7 && !ARCH_BCM283X && !TARGET_LS2080A_EMU && \
                   !TARGET_LS2080A_SIMU && !TARGET_LS2080AQDS && \
                   !TARGET_LS2080ARDB && !TARGET_LS1012AQDS && \
+                  !TARGET_LS1088ARDB && !TARGET_LS1088AQDS && \
                   !TARGET_LS1012ARDB && !TARGET_LS1012AFRDM && \
                   !TARGET_LS1043ARDB && !TARGET_LS1043AQDS && \
                   !TARGET_LS1046ARDB && !TARGET_LS1046AQDS && \
index cdeef26fe5d4fd27f4ab55bd81070f1ea96232ae..3518d8601d176b0e8e0782973d4deced6c17433a 100644 (file)
@@ -16,8 +16,12 @@ config ARCH_LS1043A
        select SYS_FSL_DDR_BE
        select SYS_FSL_DDR_VER_50
        select SYS_FSL_ERRATUM_A008850
+       select SYS_FSL_ERRATUM_A008997
+       select SYS_FSL_ERRATUM_A009007
+       select SYS_FSL_ERRATUM_A009008
        select SYS_FSL_ERRATUM_A009660
        select SYS_FSL_ERRATUM_A009663
+       select SYS_FSL_ERRATUM_A009798
        select SYS_FSL_ERRATUM_A009929
        select SYS_FSL_ERRATUM_A009942
        select SYS_FSL_ERRATUM_A010315
@@ -39,6 +43,10 @@ config ARCH_LS1046A
        select SYS_FSL_ERRATUM_A008336
        select SYS_FSL_ERRATUM_A008511
        select SYS_FSL_ERRATUM_A008850
+       select SYS_FSL_ERRATUM_A008997
+       select SYS_FSL_ERRATUM_A009007
+       select SYS_FSL_ERRATUM_A009008
+       select SYS_FSL_ERRATUM_A009798
        select SYS_FSL_ERRATUM_A009801
        select SYS_FSL_ERRATUM_A009803
        select SYS_FSL_ERRATUM_A009942
@@ -50,6 +58,32 @@ config ARCH_LS1046A
        select BOARD_EARLY_INIT_F
        imply SCSI
 
+config ARCH_LS1088A
+       bool
+       select ARMV8_SET_SMPEN
+       select FSL_LSCH3
+       select SYS_FSL_DDR
+       select SYS_FSL_DDR_LE
+       select SYS_FSL_DDR_VER_50
+       select SYS_FSL_EC1
+       select SYS_FSL_EC2
+       select SYS_FSL_ERRATUM_A009803
+       select SYS_FSL_ERRATUM_A009942
+       select SYS_FSL_ERRATUM_A010165
+       select SYS_FSL_ERRATUM_A008511
+       select SYS_FSL_ERRATUM_A008850
+       select SYS_FSL_HAS_CCI400
+       select SYS_FSL_HAS_DDR4
+       select SYS_FSL_HAS_RGMII
+       select SYS_FSL_HAS_SEC
+       select SYS_FSL_SEC_COMPAT_5
+       select SYS_FSL_SEC_LE
+       select SYS_FSL_SRDS_1
+       select SYS_FSL_SRDS_2
+       select FSL_TZASC_1
+       select ARCH_EARLY_INIT_R
+       select BOARD_EARLY_INIT_F
+
 config ARCH_LS2080A
        bool
        select ARMV8_SET_SMPEN
@@ -61,6 +95,7 @@ config ARCH_LS2080A
        select SYS_FSL_DDR
        select SYS_FSL_DDR_LE
        select SYS_FSL_DDR_VER_50
+       select SYS_FSL_HAS_CCN504
        select SYS_FSL_HAS_DP_DDR
        select SYS_FSL_HAS_SEC
        select SYS_FSL_HAS_DDR4
@@ -73,8 +108,12 @@ config ARCH_LS2080A
        select SYS_FSL_ERRATUM_A008511
        select SYS_FSL_ERRATUM_A008514
        select SYS_FSL_ERRATUM_A008585
+       select SYS_FSL_ERRATUM_A008997
+       select SYS_FSL_ERRATUM_A009007
+       select SYS_FSL_ERRATUM_A009008
        select SYS_FSL_ERRATUM_A009635
        select SYS_FSL_ERRATUM_A009663
+       select SYS_FSL_ERRATUM_A009798
        select SYS_FSL_ERRATUM_A009801
        select SYS_FSL_ERRATUM_A009803
        select SYS_FSL_ERRATUM_A009942
@@ -85,6 +124,7 @@ config ARCH_LS2080A
 
 config FSL_LSCH2
        bool
+       select SYS_FSL_HAS_CCI400
        select SYS_FSL_HAS_SEC
        select SYS_FSL_SEC_COMPAT_5
        select SYS_FSL_SEC_BE
@@ -98,7 +138,7 @@ config FSL_LSCH3
 
 config FSL_MC_ENET
        bool "Management Complex network"
-       depends on ARCH_LS2080A
+       depends on ARCH_LS2080A || ARCH_LS1088A
        default y
        select RESV_RAM
        help
@@ -114,6 +154,7 @@ config FSL_PCIE_COMPAT
        default "fsl,ls1043a-pcie" if ARCH_LS1043A
        default "fsl,ls1046a-pcie" if ARCH_LS1046A
        default "fsl,ls2080a-pcie" if ARCH_LS2080A
+       default "fsl,ls1088a-pcie" if ARCH_LS1088A
        help
          This compatible is used to find pci controller node in Kernel DT
          to complete fixup.
@@ -182,6 +223,7 @@ config SYS_LS_PPA_FW_ADDR
        default 0x20400000 if SYS_LS_PPA_FW_IN_XIP && QSPI_BOOT && ARCH_LS2080A
        default 0x40400000 if SYS_LS_PPA_FW_IN_XIP && QSPI_BOOT
        default 0x580400000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS2080A
+       default 0x20400000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1088A
        default 0x60400000 if SYS_LS_PPA_FW_IN_XIP
        default 0x400000 if SYS_LS_PPA_FW_IN_MMC
        default 0x400000 if SYS_LS_PPA_FW_IN_NAND
@@ -195,12 +237,13 @@ config SYS_LS_PPA_FW_ADDR
 config SYS_LS_PPA_ESBC_ADDR
        hex "hdr address of PPA firmware loading from"
        depends on FSL_LS_PPA && CHAIN_OF_TRUST
-       default 0x600c0000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1043A
-       default 0x40740000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1046A
-       default 0x40480000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1012A
-       default 0x580c40000 if SYS_LS_PPA_FW_IN_XIP && FSL_LSCH3
-       default 0x700000 if SYS_LS_PPA_FW_IN_MMC
-       default 0x700000 if SYS_LS_PPA_FW_IN_NAND
+       default 0x60680000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1043A
+       default 0x40680000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1046A
+       default 0x40680000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS1012A
+       default 0x20680000 if SYS_LS_PPA_FW_IN_XIP && QSPI_BOOT && ARCH_LS2080A
+       default 0x580680000 if SYS_LS_PPA_FW_IN_XIP && ARCH_LS2080A
+       default 0x680000 if SYS_LS_PPA_FW_IN_MMC
+       default 0x680000 if SYS_LS_PPA_FW_IN_NAND
        help
          If the PPA header firmware locate at XIP flash, such as NOR or
          QSPI flash, this address is a directly memory-mapped.
@@ -217,6 +260,20 @@ config LS_PPA_ESBC_HDR_SIZE
 
 endmenu
 
+config SYS_FSL_ERRATUM_A008997
+       bool "Workaround for USB PHY erratum A008997"
+
+config SYS_FSL_ERRATUM_A009007
+       bool
+       help
+         Workaround for USB PHY erratum A009007
+
+config SYS_FSL_ERRATUM_A009008
+       bool "Workaround for USB PHY erratum A009008"
+
+config SYS_FSL_ERRATUM_A009798
+       bool "Workaround for USB PHY erratum A009798"
+
 config SYS_FSL_ERRATUM_A010315
        bool "Workaround for PCIe erratum A010315"
 
@@ -228,6 +285,7 @@ config MAX_CPUS
        default 4 if ARCH_LS1043A
        default 4 if ARCH_LS1046A
        default 16 if ARCH_LS2080A
+       default 8 if ARCH_LS1088A
        default 1
        help
          Set this number to the maximum number of possible CPUs in the SoC.
@@ -248,12 +306,27 @@ config QSPI_AHB_INIT
          But some QSPI flash size up to 64MBytes, so initialize the QSPI AHB
          bus for those flashes to support the full QSPI flash size.
 
+config SYS_CCI400_OFFSET
+       hex "Offset for CCI400 base"
+       depends on SYS_FSL_HAS_CCI400
+       default 0x3090000 if ARCH_LS1088A
+       default 0x180000 if FSL_LSCH2
+       help
+         Offset for CCI400 base
+         CCI400 base addr = CCSRBAR + CCI400_OFFSET
+
 config SYS_FSL_IFC_BANK_COUNT
        int "Maximum banks of Integrated flash controller"
-       depends on ARCH_LS1043A || ARCH_LS1046A || ARCH_LS2080A
+       depends on ARCH_LS1043A || ARCH_LS1046A || ARCH_LS2080A || ARCH_LS1088A
        default 4 if ARCH_LS1043A
        default 4 if ARCH_LS1046A
-       default 8 if ARCH_LS2080A
+       default 8 if ARCH_LS2080A || ARCH_LS1088A
+
+config SYS_FSL_HAS_CCI400
+       bool
+
+config SYS_FSL_HAS_CCN504
+       bool
 
 config SYS_FSL_HAS_DP_DDR
        bool
@@ -296,6 +369,7 @@ config SYS_FSL_PCLK_DIV
        int "Platform clock divider"
        default 1 if ARCH_LS1043A
        default 1 if ARCH_LS1046A
+       default 1 if ARCH_LS1088A
        default 2
        help
          This is the divider that is used to derive Platform clock from
@@ -362,6 +436,18 @@ config RESV_RAM
          be at the high end of physical memory. The reserve RAM may be
          excluded from memory bank(s) passed to OS, or marked as reserved.
 
+config SYS_FSL_EC1
+       bool
+       help
+         Ethernet controller 1, this is connected to MAC3.
+         Provides DPAA2 capabilities
+
+config SYS_FSL_EC2
+       bool
+       help
+         Ethernet controller 2, this is connected to MAC4.
+         Provides DPAA2 capabilities
+
 config SYS_FSL_ERRATUM_A008336
        bool
 
@@ -386,10 +472,17 @@ config SYS_FSL_ERRATUM_A009660
 config SYS_FSL_ERRATUM_A009929
        bool
 
+
+config SYS_FSL_HAS_RGMII
+       bool
+       depends on SYS_FSL_EC1 || SYS_FSL_EC2
+
+
 config SYS_MC_RSV_MEM_ALIGN
        hex "Management Complex reserved memory alignment"
        depends on RESV_RAM
-       default 0x20000000
+       default 0x20000000 if ARCH_LS2080A
+       default 0x70000000 if ARCH_LS1088A
        help
          Reserved memory needs to be aligned for MC to use. Default value
          is 512MB.
index e3ce0184d8936cb3fefcaed0b0e505ffa0f4a9b6..115c3fc1d14cea112da26201f28bccb2465b1280 100644 (file)
@@ -38,3 +38,7 @@ endif
 ifneq ($(CONFIG_ARCH_LS1046A),)
 obj-$(CONFIG_SYS_HAS_SERDES) += ls1046a_serdes.o
 endif
+
+ifneq ($(CONFIG_ARCH_LS1088A),)
+obj-$(CONFIG_SYS_HAS_SERDES) += ls1088a_serdes.o
+endif
index c6fede31bab73d06aaf36b35aceda16dd915164e..d21a49454e15dd0b9e791a29b5467cfe494547ef 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/arch/soc.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/speed.h>
+#include <fsl_immap.h>
 #include <asm/arch/mp.h>
 #include <efi_loader.h>
 #include <fm_eth.h>
@@ -516,6 +517,10 @@ int arch_early_init_r(void)
                        printf("Did not wake secondary cores\n");
        }
 
+#ifdef CONFIG_SYS_FSL_HAS_RGMII
+       fsl_rgmii_init();
+#endif
+
 #ifdef CONFIG_SYS_HAS_SERDES
        fsl_serdes_init();
 #endif
@@ -614,13 +619,22 @@ void efi_reset_system_init(void)
 
 #endif
 
+/*
+ * Calculate reserved memory with given memory bank
+ * Return aligned memory size on success
+ * Return (ram_size + needed size) for failure
+ */
 phys_size_t board_reserve_ram_top(phys_size_t ram_size)
 {
        phys_size_t ram_top = ram_size;
 
 #if defined(CONFIG_FSL_MC_ENET) && !defined(CONFIG_SPL_BUILD)
+       ram_top = mc_get_dram_block_size();
+       if (ram_top > ram_size)
+               return ram_size + ram_top;
+
+       ram_top = ram_size - ram_top;
        /* The start address of MC reserved memory needs to be aligned. */
-       ram_top -= mc_get_dram_block_size();
        ram_top &= ~(CONFIG_SYS_MC_RSV_MEM_ALIGN - 1);
 #endif
 
@@ -664,8 +678,8 @@ phys_size_t get_effective_memsize(void)
        /* Check if we have enough memory for MC */
        if (rem < board_reserve_ram_top(rem)) {
                /* Not enough memory in high region to reserve */
-               if (ea_size > board_reserve_ram_top(rem))
-                       ea_size -= board_reserve_ram_top(rem);
+               if (ea_size > board_reserve_ram_top(ea_size))
+                       ea_size -= board_reserve_ram_top(ea_size);
                else
                        printf("Error: No enough space for reserved memory.\n");
        }
index 3ae16ae7adf4e1f2a8092b3f28520adc6f53dfc1..276ab9052d3d91094e54f1d92576d7254c11b6cc 100644 (file)
@@ -1,11 +1,12 @@
 SoC overview
 
        1. LS1043A
-       2. LS2080A
-       3. LS1012A
-       4. LS1046A
-       5. LS2088A
-       6. LS2081A
+       2. LS1088A
+       3. LS2080A
+       4. LS1012A
+       5. LS1046A
+       6. LS2088A
+       7. LS2081A
 
 LS1043A
 ---------
@@ -45,6 +46,38 @@ The LS1043A SoC includes the following function and features:
    - Integrated flash controller supporting NAND and NOR flash
  - QorIQ platform's trust architecture 2.1
 
+LS1088A
+--------
+The QorIQ LS1088A processor is built on the Layerscape
+architecture combining eight ARM A53 processor cores
+with advanced, high-performance datapath acceleration
+and networks, peripheral interfaces required for
+networking, wireless infrastructure, and general-purpose
+embedded applications.
+
+LS1088A is compliant with the Layerscape Chassis Generation 3.
+
+Features summary:
+ - 8 32-bit / 64-bit ARM v8 Cortex-A53 CPUs
+ - Cores are in 2 cluster of 4-cores each
+ - 1MB L2 - Cache per cluster
+ - Cache coherent interconnect (CCI-400)
+ - 1 64-bit DDR4 SDRAM memory controller with ECC
+ - Data path acceleration architecture 2.0 (DPAA2)
+ - 4-Lane 10GHz SerDes comprising of WRIOP
+ - 4-Lane 10GHz SerDes comprising of PCI, SATA, uQE(TDM/HLDC/UART)
+ - Ethernet interfaces: SGMIIs, RGMIIs, QSGMIIs, XFIs
+ - QSPI, SPI, IFC2.0 supporting NAND, NOR flash
+ - 3 PCIe3.0 , 1 SATA3.0, 2 USB3.0, 1 SDXC, 2 DUARTs etc
+ - 2 DUARTs
+ - 4 I2C, GPIO
+ - Thermal monitor unit(TMU)
+ - 4 Flextimers and 1 generic timer
+ - Support for hardware virtualization and partitioning enforcement
+ - QorIQ platform's trust architecture 3.0
+ - Service processor (SP) provides pre-boot initialization and secure-boot
+   capabilities
+
 LS2080A
 --------
 The LS2080A integrated multicore processor combines eight ARM Cortex-A57
index c9252751dbcecca85384c18902c5b3e2e2b60439..cae59da803b56c39d701a03ae58be0cf06c5ee37 100644 (file)
@@ -418,7 +418,7 @@ void ft_cpu_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_SYS_DPAA_FMAN
        fdt_fixup_fman_firmware(blob);
 #endif
-#ifndef CONFIG_LS1012A
+#ifndef CONFIG_ARCH_LS1012A
        fsl_fdt_disable_usb(blob);
 #endif
 #ifdef CONFIG_HAS_FEATURE_GIC64K_ALIGN
index ef97556367c1b055120b573bbeafd43b1a5cf378..179cac6e49368690e72b61b2c91eace126ba1b58 100644 (file)
@@ -28,6 +28,20 @@ __weak void wriop_init_dpmac_qsgmii(int sd, int lane_prtcl)
        return;
 }
 
+/*
+ *The return value of this func is the serdes protocol used.
+ *Typically this function is called number of times depending
+ *upon the number of serdes blocks in the Silicon.
+ *Zero is used to denote that no serdes was enabled,
+ *this is the case when golden RCW was used where DPAA2 bring was
+ *intentionally removed to achieve boot to prompt
+*/
+
+__weak int serdes_get_number(int serdes, int cfg)
+{
+       return cfg;
+}
+
 int is_serdes_configured(enum srds_prtcl device)
 {
        int ret = 0;
@@ -73,6 +87,9 @@ int serdes_get_first_lane(u32 sd, enum srds_prtcl device)
                printf("invalid SerDes%d\n", sd);
                break;
        }
+
+       cfg = serdes_get_number(sd, cfg);
+
        /* Is serdes enabled at all? */
        if (cfg == 0)
                return -ENODEV;
@@ -99,6 +116,8 @@ void serdes_init(u32 sd, u32 sd_addr, u32 rcwsr, u32 sd_prctl_mask,
 
        cfg = gur_in32(&gur->rcwsr[rcwsr - 1]) & sd_prctl_mask;
        cfg >>= sd_prctl_shift;
+
+       cfg = serdes_get_number(sd, cfg);
        printf("Using SERDES%d Protocol: %d (0x%x)\n", sd + 1, cfg, cfg);
 
        if (!is_serdes_prtcl_valid(sd, cfg))
index 3136e3f3a2ac52d631b3d6942fbcfc904e823d91..fa93096c688c1ee3d52e02181d76c81580b1e72d 100644 (file)
@@ -76,7 +76,7 @@ ENTRY(lowlevel_init)
        switch_el x1, 1f, 100f, 100f    /* skip if not in EL3 */
 1:
 
-#ifdef CONFIG_FSL_LSCH3
+#if defined (CONFIG_SYS_FSL_HAS_CCN504)
 
        /* Set Wuo bit for RN-I 20 */
 #ifdef CONFIG_ARCH_LS2080A
@@ -171,7 +171,7 @@ ENTRY(lowlevel_init)
        ldr     x0, =CCI_S2_QOS_CONTROL_BASE(20)
        ldr     x1, =0x00FF000C
        bl      ccn504_set_qos
-#endif
+#endif /* CONFIG_SYS_FSL_HAS_CCN504 */
 
 #ifdef SMMU_BASE
        /* Set the SMMU page size in the sACR register */
@@ -338,7 +338,9 @@ get_svr:
        ldr     x1, =FSL_LSCH3_SVR
        ldr     w0, [x1]
        ret
+#endif
 
+#ifdef CONFIG_SYS_FSL_HAS_CCN504
 hnf_pstate_poll:
        /* x0 has the desired status, return 0 for success, 1 for timeout
         * clobber x1, x2, x3, x4, x6, x7
@@ -394,9 +396,6 @@ ENTRY(__asm_flush_l3_dcache)
        mov     x29, lr
        mov     x8, #0
 
-       switch_el x0, 1f, 100f, 100f    /* skip if not in EL3 */
-
-1:
        dsb     sy
        mov     x0, #0x1                /* HNFPSTAT_SFONLY */
        bl      hnf_set_pstate
@@ -414,13 +413,12 @@ ENTRY(__asm_flush_l3_dcache)
        bl      hnf_pstate_poll
        cbz     x0, 1f
        add     x8, x8, #0x2
-100:
 1:
        mov     x0, x8
        mov     lr, x29
        ret
 ENDPROC(__asm_flush_l3_dcache)
-#endif
+#endif /* CONFIG_SYS_FSL_HAS_CCN504 */
 
 #ifdef CONFIG_MP
        /* Keep literals not used by the secondary boot code outside it */
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ls1088a_serdes.c b/arch/arm/cpu/armv8/fsl-layerscape/ls1088a_serdes.c
new file mode 100644 (file)
index 0000000..9f5cdd5
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/fsl_serdes.h>
+
+struct serdes_config {
+       u8 ip_protocol;
+       u8 lanes[SRDS_MAX_LANES];
+       u8 rcw_lanes[SRDS_MAX_LANES];
+};
+
+static struct serdes_config serdes1_cfg_tbl[] = {
+       /* SerDes 1 */
+       {0x12, {SGMII3, SGMII7, SGMII1, SGMII2 }, {3, 3, 3, 3 }  },
+       {0x15, {SGMII3, SGMII7, XFI1, XFI2 }, {3, 3, 1, 1 } },
+       {0x16, {SGMII3, SGMII7, SGMII1, XFI2 }, {3, 3, 3, 1 } },
+       {0x17, {SGMII3, SGMII7, SGMII1, SGMII2 }, {3, 3, 3, 2 } },
+       {0x18, {SGMII3, SGMII7, SGMII1, SGMII2 }, {3, 3, 2, 2 } },
+       {0x19, {SGMII3, QSGMII_B, XFI1, XFI2}, {3, 4, 1, 1 } },
+       {0x1A, {SGMII3, QSGMII_B, SGMII1, XFI2 }, {3, 4, 3, 1 } },
+       {0x1B, {SGMII3, QSGMII_B, SGMII1, SGMII2 }, {3, 4, 3, 2 } },
+       {0x1C, {SGMII3, QSGMII_B, SGMII1, SGMII2 }, {3, 4, 2, 2 } },
+       {0x1D, {QSGMII_A, QSGMII_B, XFI1, XFI2 }, {4, 4, 1, 1 } },
+       {0x1E, {QSGMII_A, QSGMII_B, SGMII1, XFI2  }, {4, 4, 3, 1 } },
+       {0x1F, {QSGMII_A, QSGMII_B, SGMII1, SGMII2  }, {4, 4, 3, 2 } },
+       {0x20, {QSGMII_A, QSGMII_B, SGMII1, SGMII2 }, {4, 4, 2, 2 } },
+       {0x35, {SGMII3, QSGMII_B, SGMII1, SGMII2 }, {3, 4, 3, 3 } },
+       {0x36, {QSGMII_A, QSGMII_B, SGMII1, SGMII2 }, {4, 4, 3, 3 } },
+       {0x3A, {SGMII3, PCIE1, SGMII1, SGMII2 }, {3, 5, 3, 3 } },
+               {}
+};
+static struct serdes_config serdes2_cfg_tbl[] = {
+       /* SerDes 2 */
+       {0x0C, {PCIE1, PCIE1, PCIE1, PCIE1 }, {8, 8, 8, 8 } },
+       {0x0D, {PCIE1, PCIE2, PCIE3, SATA1 }, {5, 5, 5, 9 }  },
+       {0x0E, {PCIE1, PCIE1, PCIE2, SATA1 }, {7, 7, 6, 9 }  },
+       {0x13, {PCIE1, PCIE1, PCIE3, PCIE3 }, {7, 7, 7, 7 }  },
+       {0x14, {PCIE1, PCIE2, PCIE3, PCIE3 }, {5, 5, 7, 7 }  },
+       {0x3C, {NONE, PCIE2, NONE, PCIE3 }, {0, 5, 0, 6 }  },
+       {}
+};
+
+static struct serdes_config *serdes_cfg_tbl[] = {
+       serdes1_cfg_tbl,
+       serdes2_cfg_tbl,
+};
+
+int serdes_get_number(int serdes, int cfg)
+{
+       struct serdes_config *ptr;
+       int i, j, index, lnk;
+       int is_found, max_lane = SRDS_MAX_LANES;
+
+       if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
+               return 0;
+
+       ptr = serdes_cfg_tbl[serdes];
+
+       while (ptr->ip_protocol) {
+               is_found = 1;
+               for (i = 0, j = max_lane - 1; i < max_lane; i++, j--) {
+                       lnk = cfg & (0xf << 4 * i);
+                       lnk = lnk >> (4 * i);
+
+                       index = (serdes == FSL_SRDS_1) ? j : i;
+
+                       if (ptr->rcw_lanes[index] == lnk && is_found)
+                               is_found = 1;
+                       else
+                               is_found = 0;
+               }
+
+               if (is_found)
+                       return ptr->ip_protocol;
+               ptr++;
+       }
+
+       return 0;
+}
+
+enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
+{
+       struct serdes_config *ptr;
+
+       if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
+               return 0;
+
+       ptr = serdes_cfg_tbl[serdes];
+       while (ptr->ip_protocol) {
+               if (ptr->ip_protocol == cfg)
+                       return ptr->lanes[lane];
+               ptr++;
+       }
+
+       return 0;
+}
+
+int is_serdes_prtcl_valid(int serdes, u32 prtcl)
+{
+       int i;
+       struct serdes_config *ptr;
+
+       if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
+               return 0;
+
+       ptr = serdes_cfg_tbl[serdes];
+       while (ptr->ip_protocol) {
+               if (ptr->ip_protocol == prtcl)
+                       break;
+               ptr++;
+       }
+
+       if (!ptr->ip_protocol)
+               return 0;
+
+       for (i = 0; i < SRDS_MAX_LANES; i++) {
+               if (ptr->lanes[i] != NONE)
+                       return 1;
+       }
+
+       return 0;
+}
index 24ddb5d991e3ba9fb2da89908e7fad59dd9f2001..bbf8bba1120d301c2f559ab178bb23598412af0f 100644 (file)
@@ -107,9 +107,6 @@ int ppa_init(void)
                return -EIO;
        }
 
-       /* flush cache after read */
-       flush_cache((ulong)fitp, cnt * 512);
-
        ret = fdt_check_header(fitp);
        if (ret) {
                free(fitp);
@@ -134,9 +131,6 @@ int ppa_init(void)
        }
        debug("Read PPA header to 0x%p\n", ppa_hdr_ddr);
 
-       /* flush cache after read */
-       flush_cache((ulong)ppa_hdr_ddr, cnt * 512);
-
        ppa_esbc_hdr = (uintptr_t)ppa_hdr_ddr;
 #endif
 
@@ -164,9 +158,6 @@ int ppa_init(void)
                return -EIO;
        }
 
-       /* flush cache after read */
-       flush_cache((ulong)ppa_fit_addr, cnt * 512);
-
 #elif defined(CONFIG_SYS_LS_PPA_FW_IN_NAND)
        struct fdt_header fit;
 
@@ -208,9 +199,6 @@ int ppa_init(void)
        }
        debug("Read PPA header to 0x%p\n", ppa_hdr_ddr);
 
-       /* flush cache after read */
-       flush_cache((ulong)ppa_hdr_ddr, fw_length);
-
        ppa_esbc_hdr = (uintptr_t)ppa_hdr_ddr;
 #endif
 
@@ -232,9 +220,6 @@ int ppa_init(void)
                       CONFIG_SYS_LS_PPA_FW_ADDR);
                return -EIO;
        }
-
-       /* flush cache after read */
-       flush_cache((ulong)ppa_fit_addr, fw_length);
 #else
 #error "No CONFIG_SYS_LS_PPA_FW_IN_xxx defined"
 #endif
index 639e9d2ddc8d643904f22872b42fbd21a66d29ff..6698c0467d7c0240f2711b14457b2a7088668367 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <common.h>
+#include <fsl_immap.h>
 #include <fsl_ifc.h>
 #include <ahci.h>
 #include <scsi.h>
@@ -23,6 +24,7 @@
 #ifdef CONFIG_CHAIN_OF_TRUST
 #include <fsl_validate.h>
 #endif
+#include <fsl_immap.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -52,6 +54,109 @@ bool soc_has_aiop(void)
        return false;
 }
 
+static inline void set_usb_txvreftune(u32 __iomem *scfg, u32 offset)
+{
+       scfg_clrsetbits32(scfg + offset / 4,
+                       0xF << 6,
+                       SCFG_USB_TXVREFTUNE << 6);
+}
+
+static void erratum_a009008(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A009008
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+       set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB1);
+       set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB2);
+       set_usb_txvreftune(scfg, SCFG_USB3PRM1CR_USB3);
+#elif defined(CONFIG_ARCH_LS2080A)
+       set_usb_txvreftune(scfg, SCFG_USB3PRM1CR);
+#endif
+#endif /* CONFIG_SYS_FSL_ERRATUM_A009008 */
+}
+
+static inline void set_usb_sqrxtune(u32 __iomem *scfg, u32 offset)
+{
+       scfg_clrbits32(scfg + offset / 4,
+                       SCFG_USB_SQRXTUNE_MASK << 23);
+}
+
+static void erratum_a009798(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A009798
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+       set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB1);
+       set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB2);
+       set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR_USB3);
+#elif defined(CONFIG_ARCH_LS2080A)
+       set_usb_sqrxtune(scfg, SCFG_USB3PRM1CR);
+#endif
+#endif /* CONFIG_SYS_FSL_ERRATUM_A009798 */
+}
+
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+static inline void set_usb_pcstxswingfull(u32 __iomem *scfg, u32 offset)
+{
+       scfg_clrsetbits32(scfg + offset / 4,
+                       0x7F << 9,
+                       SCFG_USB_PCSTXSWINGFULL << 9);
+}
+#endif
+
+static void erratum_a008997(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008997
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
+       set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB1);
+       set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB2);
+       set_usb_pcstxswingfull(scfg, SCFG_USB3PRM2CR_USB3);
+#endif
+#endif /* CONFIG_SYS_FSL_ERRATUM_A008997 */
+}
+
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+
+#define PROGRAM_USB_PHY_RX_OVRD_IN_HI(phy)     \
+       out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_1);      \
+       out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_2);      \
+       out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_3);      \
+       out_be16((phy) + SCFG_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_4)
+
+#elif defined(CONFIG_ARCH_LS2080A)
+
+#define PROGRAM_USB_PHY_RX_OVRD_IN_HI(phy)     \
+       out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_1); \
+       out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_2); \
+       out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_3); \
+       out_le16((phy) + DCSR_USB_PHY_RX_OVRD_IN_HI, USB_PHY_RX_EQ_VAL_4)
+
+#endif
+
+static void erratum_a009007(void)
+{
+#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
+       void __iomem *usb_phy = (void __iomem *)SCFG_USB_PHY1;
+
+       PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
+
+       usb_phy = (void __iomem *)SCFG_USB_PHY2;
+       PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
+
+       usb_phy = (void __iomem *)SCFG_USB_PHY3;
+       PROGRAM_USB_PHY_RX_OVRD_IN_HI(usb_phy);
+#elif defined(CONFIG_ARCH_LS2080A)
+       void __iomem *dcsr = (void __iomem *)DCSR_BASE;
+
+       PROGRAM_USB_PHY_RX_OVRD_IN_HI(dcsr + DCSR_USB_PHY1);
+       PROGRAM_USB_PHY_RX_OVRD_IN_HI(dcsr + DCSR_USB_PHY2);
+#endif /* CONFIG_SYS_FSL_ERRATUM_A009007 */
+}
+
 #if defined(CONFIG_FSL_LSCH3)
 /*
  * This erratum requires setting a value to eddrtqcr1 to
@@ -198,6 +303,10 @@ void fsl_lsch3_early_init_f(void)
 #endif
        erratum_a008514();
        erratum_a008336();
+       erratum_a009008();
+       erratum_a009798();
+       erratum_a008997();
+       erratum_a009007();
 #ifdef CONFIG_CHAIN_OF_TRUST
        /* In case of Secure Boot, the IBR configures the SMMU
        * to allow only Secure transactions.
@@ -285,7 +394,8 @@ static void erratum_a008850_early(void)
 {
 #ifdef CONFIG_SYS_FSL_ERRATUM_A008850
        /* part 1 of 2 */
-       struct ccsr_cci400 __iomem *cci = (void *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 __iomem *cci = (void *)(CONFIG_SYS_IMMR +
+                                               CONFIG_SYS_CCI400_OFFSET);
        struct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;
 
        /* Skip if running at lower exception level */
@@ -304,7 +414,8 @@ void erratum_a008850_post(void)
 {
 #ifdef CONFIG_SYS_FSL_ERRATUM_A008850
        /* part 2 of 2 */
-       struct ccsr_cci400 __iomem *cci = (void *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 __iomem *cci = (void *)(CONFIG_SYS_IMMR +
+                                               CONFIG_SYS_CCI400_OFFSET);
        struct ccsr_ddr __iomem *ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;
        u32 tmp;
 
@@ -439,7 +550,8 @@ int setup_chip_volt(void)
 
 void fsl_lsch2_early_init_f(void)
 {
-       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
+                                       CONFIG_SYS_CCI400_OFFSET);
        struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
 
 #ifdef CONFIG_LAYERSCAPE_NS_ACCESS
@@ -473,6 +585,10 @@ void fsl_lsch2_early_init_f(void)
        erratum_a009929();
        erratum_a009660();
        erratum_a010539();
+       erratum_a009008();
+       erratum_a009798();
+       erratum_a008997();
+       erratum_a009007();
 }
 #endif
 
index 762429c463d1762e32bc52064498cb7bf1359c87..fee468005765dd418e58c773ff0ab14013ff0144 100644 (file)
@@ -41,6 +41,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
        rk3288-veyron-jerry.dtb \
        rk3288-veyron-mickey.dtb \
        rk3288-veyron-minnie.dtb \
+       rk3288-vyasa.dtb \
        rk3328-evb.dtb \
        rk3368-lion.dtb \
        rk3368-sheep.dtb \
@@ -173,9 +174,10 @@ dtb-$(CONFIG_ARCH_SOCFPGA) +=                              \
        socfpga_cyclone5_vining_fpga.dtb
 
 dtb-$(CONFIG_TARGET_DRA7XX_EVM) += dra72-evm.dtb dra7-evm.dtb  \
-       dra72-evm-revc.dtb dra71-evm.dtb
+       dra72-evm-revc.dtb dra71-evm.dtb dra76-evm.dtb
 dtb-$(CONFIG_TARGET_AM57XX_EVM) += am57xx-beagle-x15.dtb \
        am57xx-beagle-x15-revb1.dtb \
+       am57xx-beagle-x15-revc.dtb \
        am572x-idk.dtb  \
        am571x-idk.dtb
 dtb-$(CONFIG_TARGET_STV0991) += stv0991.dtb
@@ -187,7 +189,9 @@ dtb-$(CONFIG_ARCH_LS1021A) += ls1021a-qds-duart.dtb \
 dtb-$(CONFIG_FSL_LSCH3) += fsl-ls2080a-qds.dtb \
        fsl-ls2080a-rdb.dtb \
        fsl-ls2081a-rdb.dtb \
-       fsl-ls2088a-rdb-qspi.dtb
+       fsl-ls2088a-rdb-qspi.dtb \
+       fsl-ls1088a-rdb.dtb \
+       fsl-ls1088a-qds.dtb
 dtb-$(CONFIG_FSL_LSCH2) += fsl-ls1043a-qds-duart.dtb \
        fsl-ls1043a-qds-lpuart.dtb \
        fsl-ls1043a-rdb.dtb \
@@ -417,6 +421,9 @@ dtb-$(CONFIG_TARGET_OMAP3_LOGIC) += \
 dtb-$(CONFIG_TARGET_SAMA5D2_XPLAINED) += \
        at91-sama5d2_xplained.dtb
 
+dtb-$(CONFIG_TARGET_SAMA5D27_SOM1_EK) += \
+       at91-sama5d27_som1_ek.dtb
+
 dtb-$(CONFIG_TARGET_SAMA5D3XEK) += \
        sama5d31ek.dtb \
        sama5d33ek.dtb \
index ac69bb0616586ee784ad6174b4f18e2b9c4cb446..debf9464403ef52a5c4b7e27135b1a5ed5778fd2 100644 (file)
@@ -11,6 +11,7 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include "am57xx-idk-common.dtsi"
+#include "dra72x-mmc-iodelay.dtsi"
 
 / {
        model = "TI AM5718 IDK";
                        linux,default-trigger = "mmc0";
                };
        };
+};
+
+&omap_dwc3_2 {
+       extcon = <&extcon_usb2>;
+};
 
-       extcon_usb2: extcon_usb2 {
-            compatible = "linux,extcon-usb-gpio";
-            id-gpio = <&gpio5 7 GPIO_ACTIVE_HIGH>;
+&extcon_usb2 {
+       id-gpio = <&gpio5 7 GPIO_ACTIVE_HIGH>;
+       vbus-gpio = <&gpio7 22 GPIO_ACTIVE_HIGH>;
+};
+
+&mailbox5 {
+       status = "okay";
+       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+               status = "okay";
+       };
+       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+               status = "okay";
        };
 };
 
-&mmc1 {
+&mailbox6 {
        status = "okay";
-       vmmc-supply = <&ldo1_reg>;
-       bus-width = <4>;
-       cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>; /* gpio 219 */
+       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+               status = "okay";
+       };
 };
 
-&omap_dwc3_2 {
-       extcon = <&extcon_usb2>;
+&pcie1_rc {
+       status = "okay";
+       gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+};
+
+&pcie1_ep {
+       gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+};
+
+&mmc1 {
+       pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+       pinctrl-2 = <&mmc1_pins_sdr12>;
+       pinctrl-3 = <&mmc1_pins_sdr25>;
+       pinctrl-4 = <&mmc1_pins_sdr50>;
+       pinctrl-5 = <&mmc1_pins_ddr50_rev20 &mmc1_iodelay_ddr50_conf>;
+       pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+};
+
+&mmc2 {
+       pinctrl-names = "default", "hs", "ddr_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_rev20 &mmc2_iodelay_ddr_conf>;
 };
index f9adc00a6488309ed647862feee5f5606ecf81c3..a578fe97ba3bd9ec210df3f1827cc936a748d2bd 100644 (file)
@@ -12,6 +12,7 @@
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include "am57xx-idk-common.dtsi"
+#include "dra74x-mmc-iodelay.dtsi"
 
 / {
        model = "TI AM5728 IDK";
                reg = <0x0 0x80000000 0x0 0x80000000>;
        };
 
-       extcon_usb2: extcon_usb2 {
-               compatible = "linux,extcon-usb-gpio";
-               id-gpio = <&gpio3 16 GPIO_ACTIVE_HIGH>;
-       };
-
        status-leds {
                compatible = "gpio-leds";
                cpu0-led {
        };
 };
 
+&mmc1 {
+       pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+       pinctrl-2 = <&mmc1_pins_sdr12>;
+       pinctrl-3 = <&mmc1_pins_sdr25>;
+       pinctrl-4 = <&mmc1_pins_sdr50>;
+       pinctrl-5 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev20_conf>;
+       pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+};
+
+&mmc2 {
+       pinctrl-names = "default", "hs", "ddr_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_rev20>;
+};
+
 &omap_dwc3_2 {
        extcon = <&extcon_usb2>;
 };
 
-&mmc1 {
+&extcon_usb2 {
+       id-gpio = <&gpio3 16 GPIO_ACTIVE_HIGH>;
+       vbus-gpio = <&gpio3 26 GPIO_ACTIVE_HIGH>;
+};
+
+&sn65hvs882 {
+       load-gpios = <&gpio3 19 GPIO_ACTIVE_LOW>;
+};
+
+&pcie1_rc {
        status = "okay";
-       vmmc-supply = <&v3_3d>;
-       vmmc_aux-supply = <&ldo1_reg>;
-       bus-width = <4>;
-       cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>; /* gpio 219 */
+       gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+};
+
+&pcie1_ep {
+       gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+};
+
+&mailbox5 {
+       status = "okay";
+       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+               status = "okay";
+       };
+       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+               status = "okay";
+       };
+};
+
+&mailbox6 {
+       status = "okay";
+       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+               status = "okay";
+       };
+       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
+               status = "okay";
+       };
 };
index 01a9e56bfda4cda31be05c9e11f3ed1c6870131e..49aeecd312b4b10af2cb3badd68a4982fa8a921d 100644 (file)
@@ -9,16 +9,13 @@
 
 #include "dra74x.dtsi"
 #include "am57xx-commercial-grade.dtsi"
+#include "dra74x-mmc-iodelay.dtsi"
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 
 / {
        compatible = "ti,am572x-beagle-x15", "ti,am5728", "ti,dra742", "ti,dra74", "ti,dra7";
 
-       chosen {
-               stdout-path = &uart3;
-       };
-
        aliases {
                rtc0 = &mcp_rtc;
                rtc1 = &tps659038_rtc;
                display0 = &hdmi0;
        };
 
+       chosen {
+               stdout-path = &uart3;
+       };
+
        memory@0 {
                device_type = "memory";
                reg = <0x0 0x80000000 0x0 0x80000000>;
        };
 };
 
-&dra7_pmx_core {
-       mmc1_pins_default: mmc1_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x376c, PIN_INPUT | MUX_MODE14)       /* mmc1sdcd.gpio219 */
-                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
-                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
-                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
-                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
-                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
-                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
-               >;
-       };
-
-       mmc2_pins_default: mmc2_pins_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
-                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
-                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
-                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
-                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
-                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
-                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
-                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
-                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
-                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
-               >;
-       };
-};
 &i2c1 {
        status = "okay";
        clock-frequency = <400000>;
                interrupt-controller;
 
                ti,system-power-controller;
+               ti,palmas-override-powerhold;
 
                tps659038_pmic {
                        compatible = "ti,tps659038-pmic";
        };
 
        eeprom: eeprom@50 {
-               compatible = "at,24c32";
+               compatible = "atmel,24c32";
                reg = <0x50>;
        };
 };
                              <&dra7_pmx_core 0x3f8>;
 };
 
+&davinci_mdio {
+       phy0: ethernet-phy@1 {
+               reg = <1>;
+       };
+
+       phy1: ethernet-phy@2 {
+               reg = <2>;
+       };
+};
+
 &mac {
        status = "okay";
        dual_emac;
 };
 
 &cpsw_emac0 {
-       phy_id = <&davinci_mdio>, <1>;
+       phy-handle = <&phy0>;
        phy-mode = "rgmii";
        dual_emac_res_vlan = <1>;
 };
 
 &cpsw_emac1 {
-       phy_id = <&davinci_mdio>, <2>;
+       phy-handle = <&phy1>;
        phy-mode = "rgmii";
        dual_emac_res_vlan = <2>;
 };
        };
 };
 
-&pcie1 {
+&pcie1_rc {
+       status = "ok";
+       gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
+};
+
+&pcie1_ep {
        gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
 };
 
index ca85570629fd59db591da18c15b6c1a37ac8d007..5a77b334923d051f6943730b8d51849fe6161596 100644 (file)
 };
 
 &mmc1 {
+       pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+       pinctrl-2 = <&mmc1_pins_sdr12>;
+       pinctrl-3 = <&mmc1_pins_sdr25>;
+       pinctrl-4 = <&mmc1_pins_sdr50>;
+       pinctrl-5 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev11_conf>;
+       pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev11_conf>;
        vmmc-supply = <&vdd_3v3>;
-       vmmc-aux-supply = <&ldo1_reg>;
+       vqmmc-supply = <&ldo1_reg>;
+};
+
+&mmc2 {
+       pinctrl-names = "default", "hs", "ddr_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_3_3v_rev11 &mmc2_iodelay_ddr_3_3v_rev11_conf>;
+};
+
+/* errata i880 "Ethernet RGMII2 Limited to 10/100 Mbps" */
+&phy1 {
+       max-speed = <100>;
 };
diff --git a/arch/arm/dts/am57xx-beagle-x15-revc.dts b/arch/arm/dts/am57xx-beagle-x15-revc.dts
new file mode 100644 (file)
index 0000000..17c41da
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2014-2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "am57xx-beagle-x15-common.dtsi"
+
+/ {
+       model = "TI AM5728 BeagleBoard-X15 rev C";
+};
+
+&tpd12s015 {
+       gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>,   /* gpio7_10, CT CP HPD */
+               <&gpio2 30 GPIO_ACTIVE_HIGH>,   /* gpio2_30, LS OE */
+               <&gpio7 12 GPIO_ACTIVE_HIGH>;   /* gpio7_12/sp1_cs2, HPD */
+};
+
+&mmc1 {
+       pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+       pinctrl-2 = <&mmc1_pins_sdr12>;
+       pinctrl-3 = <&mmc1_pins_sdr25>;
+       pinctrl-4 = <&mmc1_pins_sdr50>;
+       pinctrl-5 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev20_conf>;
+       pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+       vmmc-supply = <&vdd_3v3>;
+       vqmmc-supply = <&ldo1_reg>;
+};
+
+&mmc2 {
+       pinctrl-names = "default", "hs", "ddr_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_rev20>;
+};
index 8c66f2efd283b2bcea47c5a219966303e838e915..d6689106d2a83935ea6ac98fd89f42ce06132879 100644 (file)
 };
 
 &mmc1 {
+       pinctrl-names = "default", "hs";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+
        vmmc-supply = <&ldo1_reg>;
 };
+
+&mmc2 {
+       pinctrl-names = "default", "hs", "ddr_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_3_3v_rev11 &mmc2_iodelay_ddr_3_3v_rev11_conf>;
+};
+
+/* errata i880 "Ethernet RGMII2 Limited to 10/100 Mbps" */
+&phy1 {
+       max-speed = <100>;
+};
diff --git a/arch/arm/dts/am57xx-cl-som-am57x.dts b/arch/arm/dts/am57xx-cl-som-am57x.dts
new file mode 100644 (file)
index 0000000..203266f
--- /dev/null
@@ -0,0 +1,617 @@
+/*
+ * Support for CompuLab CL-SOM-AM57x System-on-Module
+ *
+ * Copyright (C) 2015 CompuLab Ltd. - http://www.compulab.co.il/
+ * Author: Dmitry Lifshitz <lifshitz@compulab.co.il>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "dra74x.dtsi"
+
+/ {
+       model = "CompuLab CL-SOM-AM57x";
+       compatible = "compulab,cl-som-am57x", "ti,am5728", "ti,dra742", "ti,dra74", "ti,dra7";
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x80000000 0x0 0x20000000>; /* 512 MB - minimal configuration */
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&leds_pins_default>;
+
+               led0 {
+                       label = "cl-som-am57x:green";
+                       gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+                       default-state = "off";
+               };
+       };
+
+       vdd_3v3: fixedregulator-vdd_3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "vdd_3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       ads7846reg: fixedregulator-ads7846-reg {
+               compatible = "regulator-fixed";
+               regulator-name = "ads7846-reg";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       sound0: sound0 {
+               compatible = "simple-audio-card";
+               simple-audio-card,name = "CL-SOM-AM57x-Sound-Card";
+               simple-audio-card,format = "i2s";
+               simple-audio-card,bitclock-master = <&dailink0_master>;
+               simple-audio-card,frame-master = <&dailink0_master>;
+               simple-audio-card,widgets =
+                                       "Headphone", "Headphone Jack",
+                                       "Microphone", "Microphone Jack",
+                                       "Line", "Line Jack";
+               simple-audio-card,routing =
+                                       "Headphone Jack", "RHPOUT",
+                                       "Headphone Jack", "LHPOUT",
+                                       "LLINEIN", "Line Jack",
+                                       "MICIN", "Mic Bias",
+                                       "Mic Bias", "Microphone Jack";
+
+               dailink0_master: simple-audio-card,cpu {
+                       sound-dai = <&mcasp3>;
+               };
+
+               simple-audio-card,codec {
+                       sound-dai = <&wm8731>;
+                       system-clock-frequency = <12000000>;
+               };
+       };
+};
+
+&dra7_pmx_core {
+       leds_pins_default: leds_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x347c, PIN_OUTPUT | MUX_MODE14)      /* gpmc_a15.gpio2_5 */
+               >;
+       };
+
+       i2c1_pins_default: i2c1_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3800, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c1_sda.sda */
+                       DRA7XX_CORE_IOPAD(0x3804, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c1_scl.scl */
+               >;
+       };
+
+       i2c3_pins_default: i2c3_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x36a4, PIN_INPUT| MUX_MODE10)        /* mcasp1_aclkx.i2c3_sda */
+                       DRA7XX_CORE_IOPAD(0x36a8, PIN_INPUT| MUX_MODE10)        /* mcasp1_fsx.i2c3_scl */
+               >;
+       };
+
+       i2c4_pins_default: i2c4_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x36ac, PIN_INPUT| MUX_MODE10)        /* mcasp1_acl.i2c4_sda */
+                       DRA7XX_CORE_IOPAD(0x36b0, PIN_INPUT| MUX_MODE10)        /* mcasp1_fsr.i2c4_scl */
+               >;
+       };
+
+       tps659038_pins_default: tps659038_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3818, PIN_INPUT_PULLUP | MUX_MODE14) /* wakeup0.gpio1_0 */
+               >;
+       };
+
+       mmc2_pins_default: mmc2_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       qspi1_pins: pinmux_qspi1_pins {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3474, PIN_INPUT | MUX_MODE1)        /* gpmc_a13.qspi1_rtclk */
+                       DRA7XX_CORE_IOPAD(0x3480, PIN_INPUT | MUX_MODE1)        /* gpmc_a16.qspi1_d0 */
+                       DRA7XX_CORE_IOPAD(0x3484, PIN_INPUT | MUX_MODE1)        /* gpmc_a17.qspi1_d1 */
+                       DRA7XX_CORE_IOPAD(0x3488, PIN_INPUT | MUX_MODE1)        /* qpmc_a18.qspi1_sclk */
+                       DRA7XX_CORE_IOPAD(0x34b8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs2.qspi1_cs0 */
+                       DRA7XX_CORE_IOPAD(0x34bc, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs3.qspi1_cs1 */
+               >;
+       };
+
+       cpsw_pins_default: cpsw_pins_default {
+               pinctrl-single,pins = <
+                       /* Slave at addr 0x0 */
+                       DRA7XX_CORE_IOPAD(0x3650, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_tclk */
+                       DRA7XX_CORE_IOPAD(0x3654, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_tctl */
+                       DRA7XX_CORE_IOPAD(0x3658, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td3 */
+                       DRA7XX_CORE_IOPAD(0x365c, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td2 */
+                       DRA7XX_CORE_IOPAD(0x3660, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td1 */
+                       DRA7XX_CORE_IOPAD(0x3664, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td0 */
+                       DRA7XX_CORE_IOPAD(0x3668, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rclk */
+                       DRA7XX_CORE_IOPAD(0x366c, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rctl */
+                       DRA7XX_CORE_IOPAD(0x3670, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rd3 */
+                       DRA7XX_CORE_IOPAD(0x3674, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rd2 */
+                       DRA7XX_CORE_IOPAD(0x3678, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rd1 */
+                       DRA7XX_CORE_IOPAD(0x367c, PIN_INPUT_PULLDOWN | MUX_MODE0) /* rgmii0_rd0 */
+
+                       /* Slave at addr 0x1 */
+                       DRA7XX_CORE_IOPAD(0x3598, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d12.rgmii1_tclk */
+                       DRA7XX_CORE_IOPAD(0x359c, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d13.rgmii1_tctl */
+                       DRA7XX_CORE_IOPAD(0x35a0, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d14.rgmii1_td3 */
+                       DRA7XX_CORE_IOPAD(0x35a4, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d15.rgmii1_td2 */
+                       DRA7XX_CORE_IOPAD(0x35a8, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d16.rgmii1_td1 */
+                       DRA7XX_CORE_IOPAD(0x35ac, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d17.rgmii1_td0 */
+                       DRA7XX_CORE_IOPAD(0x35b0, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d18.rgmii1_rclk */
+                       DRA7XX_CORE_IOPAD(0x35b4, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d19.rgmii1_rctl */
+                       DRA7XX_CORE_IOPAD(0x35b8, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d20.rgmii1_rd3 */
+                       DRA7XX_CORE_IOPAD(0x35bc, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d21.rgmii1_rd2 */
+                       DRA7XX_CORE_IOPAD(0x35c0, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d22.rgmii1_rd1 */
+                       DRA7XX_CORE_IOPAD(0x35c4, PIN_INPUT_PULLDOWN | MUX_MODE3) /* vin2a_d23.rgmii1_rd0 */
+               >;
+       };
+
+       cpsw_pins_sleep: cpsw_pins_sleep {
+               pinctrl-single,pins = <
+                       /* Slave 1 */
+                       DRA7XX_CORE_IOPAD(0x3650, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3654, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3658, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x365c, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3660, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3664, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3668, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x366c, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3670, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3674, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3678, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x367c, PIN_INPUT | MUX_MODE15)
+
+                       /* Slave 2 */
+                       DRA7XX_CORE_IOPAD(0x3598, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x359c, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35a0, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35a4, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35a8, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35ac, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35b0, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35b4, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35b8, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35bc, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35c0, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x35c4, PIN_INPUT | MUX_MODE15)
+               >;
+       };
+
+       davinci_mdio_pins_default: davinci_mdio_pins_default {
+               pinctrl-single,pins = <
+                       /* MDIO */
+                       DRA7XX_CORE_IOPAD(0x3590, PIN_OUTPUT_PULLUP | MUX_MODE3)/* vin2a_d10.mdio_mclk */
+                       DRA7XX_CORE_IOPAD(0x3594, PIN_INPUT_PULLUP | MUX_MODE3) /* vin2a_d11.mdio_d */
+               >;
+       };
+
+       davinci_mdio_pins_sleep: davinci_mdio_pins_sleep {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3590, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3594, PIN_INPUT | MUX_MODE15)
+               >;
+       };
+
+       ads7846_pins: pinmux_ads7846_pins {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3464, PIN_INPUT_PULLDOWN | MUX_MODE14) /* gpmc_a9.gpio1_31 */
+               >;
+       };
+
+       mcasp3_pins_default: mcasp3_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3724, PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp3_aclkx.mcasp3_aclkx */
+                       DRA7XX_CORE_IOPAD(0x3728, PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp3_fsx.mcasp3_fsx */
+                       DRA7XX_CORE_IOPAD(0x372c, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mcasp3_axr0.mcasp3_axr0 */
+                       DRA7XX_CORE_IOPAD(0x3730, PIN_INPUT_PULLDOWN | MUX_MODE0) /* mcasp3_axr1.mcasp3_axr1 */
+               >;
+       };
+
+       mcasp3_pins_sleep: mcasp3_pins_sleep {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3724, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3728, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x372c, PIN_INPUT | MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x3730, PIN_INPUT | MUX_MODE15)
+               >;
+       };
+};
+
+&i2c1 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c1_pins_default>;
+       clock-frequency = <400000>;
+};
+
+&i2c3 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c3_pins_default>;
+       clock-frequency = <400000>;
+};
+
+&i2c4 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c4_pins_default>;
+       clock-frequency = <400000>;
+
+       tps659038: tps659038@58 {
+               compatible = "ti,tps659038";
+               reg = <0x58>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&tps659038_pins_default>;
+
+               #interrupt-cells = <2>;
+               interrupt-controller;
+
+               ti,system-power-controller;
+
+               tps659038_pmic {
+                       compatible = "ti,tps659038-pmic";
+
+                       regulators {
+                               smps12_reg: smps12 {
+                                       /* VDD_MPU */
+                                       regulator-name = "smps12";
+                                       regulator-min-microvolt = < 850000>;
+                                       regulator-max-microvolt = <1250000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               smps3_reg: smps3 {
+                                       /* VDD_DDR */
+                                       regulator-name = "smps3";
+                                       regulator-min-microvolt = <1500000>;
+                                       regulator-max-microvolt = <1500000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               smps45_reg: smps45 {
+                                       /* VDD_DSPEVE */
+                                       regulator-name = "smps45";
+                                       regulator-min-microvolt = < 850000>;
+                                       regulator-max-microvolt = <1250000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               smps6_reg: smps6 {
+                                       /* VDD_GPU */
+                                       regulator-name = "smps6";
+                                       regulator-min-microvolt = < 850000>;
+                                       regulator-max-microvolt = <1250000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               smps7_reg: smps7 {
+                                       /* VDD_CORE */
+                                       regulator-name = "smps7";
+                                       regulator-min-microvolt = < 850000>;
+                                       regulator-max-microvolt = <1160000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               smps8_reg: smps8 {
+                                       /* VDD_IVA */
+                                       regulator-name = "smps8";
+                                       regulator-min-microvolt = < 850000>;
+                                       regulator-max-microvolt = <1250000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               smps9_reg: smps9 {
+                                       /* PMIC_3V3 */
+                                       regulator-name = "smps9";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+
+                               ldo1_reg: ldo1 {
+                                       /* VDD_SD / VDDSHV8  */
+                                       regulator-name = "ldo1";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-boot-on;
+                                       regulator-always-on;
+                               };
+
+                               ldo2_reg: ldo2 {
+                                       /* VDD_1V8 */
+                                       regulator-name = "ldo2";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo3_reg: ldo3 {
+                                       /* VDDA_1V8_PHYA - supplies VDDA_SATA, VDDA_USB1/2/3 */
+                                       regulator-name = "ldo3";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo4_reg: ldo4 {
+                                       /* VDDA_1V8_PHYB - supplies VDDA_HDMI, VDDA_PCIE/0/1 */
+                                       regulator-name = "ldo4";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo9_reg: ldo9 {
+                                       /* VDD_RTC */
+                                       regulator-name = "ldo9";
+                                       regulator-min-microvolt = <1050000>;
+                                       regulator-max-microvolt = <1050000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldoln_reg: ldoln {
+                                       /* VDDA_1V8_PLL */
+                                       regulator-name = "ldoln";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldousb_reg: ldousb {
+                                       /* VDDA_3V_USB: VDDA_USBHS33 */
+                                       regulator-name = "ldousb";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               /* regen1 not used */
+                       };
+               };
+
+               tps659038_pwr_button: tps659038_pwr_button {
+                       compatible = "ti,palmas-pwrbutton";
+                       interrupt-parent = <&tps659038>;
+                       interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
+                       wakeup-source;
+                       ti,palmas-long-press-seconds = <12>;
+               };
+
+               tps659038_gpio: tps659038_gpio {
+                       compatible = "ti,palmas-gpio";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+               };
+       };
+
+       rtc0: rtc@56 {
+               compatible = "emmicro,em3027";
+               reg = <0x56>;
+       };
+
+       eeprom_module: atmel@50 {
+               compatible = "atmel,24c08";
+               reg = <0x50>;
+               pagesize = <16>;
+       };
+
+       wm8731: wm8731@1a {
+               #sound-dai-cells = <0>;
+               compatible = "wlf,wm8731";
+               reg = <0x1a>;
+               status = "okay";
+       };
+};
+
+&cpu0 {
+       cpu0-supply = <&smps12_reg>;
+       voltage-tolerance = <1>;
+};
+
+&sata {
+       status = "okay";
+};
+
+&mailbox5 {
+       status = "okay";
+       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+               status = "okay";
+       };
+       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+               status = "okay";
+       };
+};
+
+&mailbox6 {
+       status = "okay";
+       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+               status = "okay";
+       };
+       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
+               status = "okay";
+       };
+};
+
+&mmc2 {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc2_pins_default>;
+
+       vmmc-supply = <&vdd_3v3>;
+       bus-width = <8>;
+       ti,non-removable;
+       cap-mmc-dual-data-rate;
+};
+
+&qspi {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&qspi1_pins>;
+
+       spi-max-frequency = <48000000>;
+
+       spi_flash: spi_flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spansion,m25p80", "jedec,spi-nor";
+               reg = <0>;                              /* CS0 */
+               spi-max-frequency = <48000000>;
+
+               partition@0 {
+                       label = "uboot";
+                       reg = <0x0 0xc0000>;
+               };
+
+               partition@c0000 {
+                       label = "uboot environment";
+                       reg = <0xc0000 0x40000>;
+               };
+
+               partition@100000 {
+                       label = "reserved";
+                       reg = <0x100000 0x0>;
+               };
+       };
+
+       /* touch controller */
+       ads7846@0 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&ads7846_pins>;
+
+               compatible = "ti,ads7846";
+               vcc-supply = <&ads7846reg>;
+
+               reg = <1>;                              /* CS1 */
+               spi-max-frequency = <1500000>;
+
+               interrupt-parent = <&gpio1>;
+               interrupts = <31 0>;
+               pendown-gpio = <&gpio1 31 0>;
+
+
+               ti,x-min = /bits/ 16 <0x0>;
+               ti,x-max = /bits/ 16 <0x0fff>;
+               ti,y-min = /bits/ 16 <0x0>;
+               ti,y-max = /bits/ 16 <0x0fff>;
+
+               ti,x-plate-ohms = /bits/ 16 <180>;
+               ti,pressure-max = /bits/ 16 <255>;
+
+               ti,debounce-max = /bits/ 16 <30>;
+               ti,debounce-tol = /bits/ 16 <10>;
+               ti,debounce-rep = /bits/ 16 <1>;
+
+               wakeup-source;
+       };
+};
+
+&mac {
+       status = "okay";
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&cpsw_pins_default>;
+       pinctrl-1 = <&cpsw_pins_sleep>;
+       dual_emac;
+};
+
+&cpsw_emac0 {
+       phy_id = <&davinci_mdio>, <0>;
+       phy-mode = "rgmii-txid";
+       dual_emac_res_vlan = <0>;
+};
+
+&cpsw_emac1 {
+       phy_id = <&davinci_mdio>, <1>;
+       phy-mode = "rgmii-txid";
+       dual_emac_res_vlan = <1>;
+};
+
+&davinci_mdio {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&davinci_mdio_pins_default>;
+       pinctrl-1 = <&davinci_mdio_pins_sleep>;
+};
+
+&usb2_phy1 {
+       phy-supply = <&ldousb_reg>;
+};
+
+&usb2_phy2 {
+       phy-supply = <&ldousb_reg>;
+};
+
+&usb1 {
+       dr_mode = "host";
+};
+
+&usb2 {
+       dr_mode = "host";
+};
+
+&mcasp3 {
+       #sound-dai-cells = <0>;
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&mcasp3_pins_default>;
+       pinctrl-1 = <&mcasp3_pins_sleep>;
+       status = "okay";
+
+       op-mode = <0>;  /* MCASP_IIS_MODE */
+       tdm-slots = <2>;
+       /* 4 serializers */
+       serial-dir = <  /* 0: INACTIVE, 1: TX, 2: RX */
+               1 2 0 0
+       >;
+};
+
+&gpio3 {
+       status = "okay";
+       ti,no-reset-on-init;
+};
+
+&gpio2 {
+       status = "okay";
+       ti,no-reset-on-init;
+};
index 30118ed233f8f8c3360930dcd3a9969d26c50f95..97aa8e6a56da8f7c8722f5243e01fca0e944f629 100644 (file)
                regulator-always-on;
                regulator-boot-on;
        };
+
+       leds-iio {
+               status = "disabled";
+               compatible = "gpio-leds";
+               led-out0 {
+                       label = "out0";
+                       gpios = <&tpic2810 0 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-out1 {
+                       label = "out1";
+                       gpios = <&tpic2810 1 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-out2 {
+                       label = "out2";
+                       gpios = <&tpic2810 2 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-out3 {
+                       label = "out3";
+                       gpios = <&tpic2810 3 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-out4 {
+                       label = "out4";
+                       gpios = <&tpic2810 4 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-out5 {
+                       label = "out5";
+                       gpios = <&tpic2810 5 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-out6 {
+                       label = "out6";
+                       gpios = <&tpic2810 6 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+
+               led-out7 {
+                       label = "out7";
+                       gpios = <&tpic2810 7 GPIO_ACTIVE_HIGH>;
+                       default-state = "off";
+               };
+       };
+};
+
+&dra7_pmx_core {
+       dcan1_pins_default: dcan1_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x37d0, PIN_OUTPUT_PULLUP | MUX_MODE0)        /* dcan1_tx */
+                       DRA7XX_CORE_IOPAD(0x37d4, PIN_INPUT_PULLUP | MUX_MODE0)         /* dcan1_rx */
+               >;
+       };
+
+       dcan1_pins_sleep: dcan1_pins_sleep {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x37d0, MUX_MODE15 | PULL_UP) /* dcan1_tx.off */
+                       DRA7XX_CORE_IOPAD(0x37d4, MUX_MODE15 | PULL_UP) /* dcan1_rx.off */
+               >;
+       };
 };
 
 &i2c1 {
                #interrupt-cells = <2>;
                interrupt-controller;
                ti,system-power-controller;
+               ti,palmas-override-powerhold;
 
                tps659038_pmic {
                        compatible = "ti,tps659038-pmic";
                        gpio-controller;
                        #gpio-cells = <2>;
                };
+
+               extcon_usb2: tps659038_usb {
+                       compatible = "ti,palmas-usb-vid";
+                       ti,enable-vbus-detection;
+                       ti,enable-id-detection;
+                       /* ID & VBUS GPIOs provided in board dts */
+               };
+       };
+
+       tpic2810: tpic2810@60 {
+               compatible = "ti,tpic2810";
+               reg = <0x60>;
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+};
+
+&mcspi3 {
+       status = "okay";
+       ti,pindir-d0-out-d1-in;
+
+       sn65hvs882: sn65hvs882@0 {
+               compatible = "pisosr-gpio";
+               gpio-controller;
+               #gpio-cells = <2>;
+
+               reg = <0>;
+               spi-max-frequency = <1000000>;
+               spi-cpol;
        };
 };
 
 };
 
 &usb2 {
-       dr_mode = "otg";
+       dr_mode = "peripheral";
+};
+
+&mmc1 {
+       status = "okay";
+       vmmc-supply = <&v3_3d>;
+       vqmmc-supply = <&ldo1_reg>;
+       bus-width = <4>;
+       cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>; /* gpio 219 */
 };
 
 &mmc2 {
        max-frequency = <96000000>;
 };
 
+&dcan1 {
+       status = "okay";
+       pinctrl-names = "default", "sleep", "active";
+       pinctrl-0 = <&dcan1_pins_sleep>;
+       pinctrl-1 = <&dcan1_pins_sleep>;
+       pinctrl-2 = <&dcan1_pins_default>;
+};
+
 &qspi {
        status = "okay";
 
        spi-max-frequency = <76800000>;
        m25p80@0 {
-               compatible = "s25fl256s1", "spi-flash", "jedec,spi-nor";
+               compatible = "s25fl256s1", "jedec,spi-nor";
                spi-max-frequency = <76800000>;
                reg = <0>;
                spi-tx-bus-width = <1>;
diff --git a/arch/arm/dts/am57xx-sbc-am57x.dts b/arch/arm/dts/am57xx-sbc-am57x.dts
new file mode 100644 (file)
index 0000000..31f9be6
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Support for CompuLab SBC-AM57x single board computer
+ *
+ * Copyright (C) 2015 CompuLab Ltd. - http://www.compulab.co.il/
+ * Author: Dmitry Lifshitz <lifshitz@compulab.co.il>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+
+#include "am57xx-cl-som-am57x.dts"
+#include "compulab-sb-som.dtsi"
+
+/ {
+       model = "CompuLab CL-SOM-AM57x on SB-SOM-AM57x";
+       compatible = "compulab,sbc-am57x", "compulab,cl-som-am57x", "ti,am5728", "ti,dra742", "ti,dra74", "ti,dra7";
+
+       aliases {
+               display0 = &lcd0;
+               display1 = &hdmi;
+       };
+};
+
+&dra7_pmx_core {
+       uart3_pins_default: uart3_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3648, PIN_INPUT_SLEW | MUX_MODE0)   /* uart3_rxd */
+                       DRA7XX_CORE_IOPAD(0x364c, PIN_INPUT_SLEW | MUX_MODE0)   /* uart3_txd */
+               >;
+       };
+
+       mmc1_pins_default: mmc1_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+                       DRA7XX_CORE_IOPAD(0x376c, PIN_INPUT | MUX_MODE14)       /* mmc1_sdcd.gpio6_27 */
+                       DRA7XX_CORE_IOPAD(0x377c, PIN_INPUT | MUX_MODE14)       /* mmc1_sdwp.gpio6_28 */
+               >;
+       };
+
+       usb1_pins: pinmux_usb1_pins {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3680, PIN_INPUT_SLEW | MUX_MODE0) /* usb1_drvvbus */
+               >;
+       };
+
+       i2c5_pins_default: i2c5_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x36b4, PIN_INPUT| MUX_MODE10)        /* mcasp1_axr0.i2c5_sda */
+                       DRA7XX_CORE_IOPAD(0x36b8, PIN_INPUT| MUX_MODE10)        /* mcasp1_axr1.i2c5_scl */
+               >;
+       };
+
+       lcd_pins_default: lcd_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3564, PIN_OUTPUT | MUX_MODE14)      /* vin2a_vsync0.gpio4_0 */
+               >;
+       };
+
+       hdmi_pins: pinmux_hdmi_pins {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3808, PIN_INPUT | MUX_MODE1)        /* i2c2_sda.hdmi1_ddc_scl */
+                       DRA7XX_CORE_IOPAD(0x380c, PIN_INPUT | MUX_MODE1)        /* i2c2_scl.hdmi1_ddc_sda */
+               >;
+       };
+
+       hdmi_conn_pins: pinmux_hdmi_conn_pins {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x37b8, PIN_INPUT | MUX_MODE14)       /* spi1_cs2.gpio7_12 */
+               >;
+       };
+};
+
+&uart3 {
+       status = "okay";
+       interrupts-extended = <&crossbar_mpu GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>,
+                             <&dra7_pmx_core 0x3f8>;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart3_pins_default>;
+};
+
+&mmc1 {
+       status = "okay";
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins_default>;
+
+       vmmc-supply = <&ldo1_reg>;
+       bus-width = <4>;
+       cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>;
+       wp-gpios = <&gpio6 28 GPIO_ACTIVE_HIGH>;
+};
+
+&usb1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&usb1_pins>;
+};
+
+&i2c5 {
+       status = "okay";
+       pinctrl-names = "default";
+       pinctrl-0 = <&i2c5_pins_default>;
+       clock-frequency = <400000>;
+
+       eeprom_base: atmel@54 {
+               compatible = "atmel,24c08";
+               reg = <0x54>;
+               pagesize = <16>;
+       };
+
+       pca9555: pca9555@20 {
+               compatible = "nxp,pca9555";
+               reg = <0x20>;
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+};
+
+&dss {
+       status = "ok";
+
+       vdda_video-supply = <&ldoln_reg>;
+
+       port {
+               dpi_lcd_out: endpoint {
+                       remote-endpoint = <&lcd_in>;
+                       data-lines = <24>;
+               };
+       };
+};
+
+&lcd0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&lcd_pins_default>;
+
+       enable-gpios = <&pca9555 14 GPIO_ACTIVE_HIGH
+                       &gpio4 0 GPIO_ACTIVE_HIGH>;
+
+       port {
+               lcd_in: endpoint {
+                       remote-endpoint = <&dpi_lcd_out>;
+                       data-lines = <24>;
+               };
+       };
+};
+
+&hdmi {
+       status = "ok";
+       vdda-supply = <&ldo4_reg>;
+
+       pinctrl-names = "default";
+       pinctrl-0 = <&hdmi_pins>;
+
+       port {
+               hdmi_out: endpoint {
+                       remote-endpoint = <&hdmi_connector_in>;
+                       lanes = <1 0 3 2 5 4 7 6>;
+               };
+       };
+};
+
+&hdmi_conn {
+       pinctrl-names = "default";
+       pinctrl-0 = <&hdmi_conn_pins>;
+
+       hpd-gpios = <&gpio7 12 GPIO_ACTIVE_HIGH>;
+
+       port {
+               hdmi_connector_in: endpoint {
+                       remote-endpoint = <&hdmi_out>;
+               };
+       };
+};
diff --git a/arch/arm/dts/at91-sama5d27_som1_ek.dts b/arch/arm/dts/at91-sama5d27_som1_ek.dts
new file mode 100644 (file)
index 0000000..5e62d4a
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * at91-sama5d27_som1_ek.dts - Device Tree file for SAMA5D27 SOM1 EK board
+ *
+ *  Copyright (C) 2017 Microchip Corporation
+ *                     Wenyou Yang <wenyou.yang@microchip.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This file is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+/dts-v1/;
+#include "sama5d27_som1.dtsi"
+
+/ {
+       model = "Atmel SAMA5D27 SOM1 EK";
+       compatible = "atmel,sama5d27-som1-ek", "atmel,sama5d2", "atmel,sama5";
+
+       chosen {
+               u-boot,dm-pre-reloc;
+               stdout-path = &uart1;
+       };
+
+       ahb {
+               usb1: ohci@00400000 {
+                       num-ports = <3>;
+                       atmel,vbus-gpio = <&pioA 42 0>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_usb_default>;
+                       status = "okay";
+               };
+
+               usb2: ehci@00500000 {
+                       status = "okay";
+               };
+
+               sdmmc0: sdio-host@a0000000 {
+                       bus-width = <8>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_sdmmc0_cmd_dat_default &pinctrl_sdmmc0_ck_cd_default>;
+                       status = "okay";
+                       u-boot,dm-pre-reloc;
+               };
+
+               sdmmc1: sdio-host@b0000000 {
+                       bus-width = <4>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_sdmmc1_cmd_dat_default &pinctrl_sdmmc1_ck_cd_default>;
+                       status = "okay"; /* conflict with qspi0 */
+                       u-boot,dm-pre-reloc;
+               };
+
+               apb {
+                       hlcdc: hlcdc@f0000000 {
+                               atmel,vl-bpix = <4>;
+                               atmel,guard-time = <1>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_lcd_base &pinctrl_lcd_pwm &pinctrl_lcd_rgb666>;
+                               status = "okay";
+                               u-boot,dm-pre-reloc;
+
+                               display-timings {
+                                       u-boot,dm-pre-reloc;
+                                       480x272 {
+                                               clock-frequency = <9000000>;
+                                               hactive = <480>;
+                                               vactive = <272>;
+                                               hsync-len = <41>;
+                                               hfront-porch = <2>;
+                                               hback-porch = <2>;
+                                               vfront-porch = <2>;
+                                               vback-porch = <2>;
+                                               vsync-len = <11>;
+                                               u-boot,dm-pre-reloc;
+                                       };
+                               };
+                       };
+
+                       uart1: serial@f8020000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart1_default>;
+                               status = "okay";
+                               u-boot,dm-pre-reloc;
+                       };
+
+                       pioA: gpio@fc038000 {
+                               pinctrl {
+                                       pinctrl_lcd_base: pinctrl_lcd_base {
+                                               pinmux = <PIN_PC5__LCDVSYNC>,
+                                                        <PIN_PC6__LCDHSYNC>,
+                                                        <PIN_PC8__LCDDEN>,
+                                                        <PIN_PC7__LCDPCK>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_lcd_pwm: pinctrl_lcd_pwm {
+                                               pinmux = <PIN_PC3__LCDPWM>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_lcd_rgb666: pinctrl_lcd_rgb666 {
+                                               pinmux = <PIN_PB13__LCDDAT2>,
+                                                        <PIN_PB14__LCDDAT3>,
+                                                        <PIN_PB15__LCDDAT4>,
+                                                        <PIN_PB16__LCDDAT5>,
+                                                        <PIN_PB17__LCDDAT6>,
+                                                        <PIN_PB18__LCDDAT7>,
+                                                        <PIN_PB21__LCDDAT10>,
+                                                        <PIN_PB22__LCDDAT11>,
+                                                        <PIN_PB23__LCDDAT12>,
+                                                        <PIN_PB24__LCDDAT13>,
+                                                        <PIN_PB25__LCDDAT14>,
+                                                        <PIN_PB26__LCDDAT15>,
+                                                        <PIN_PB29__LCDDAT18>,
+                                                        <PIN_PB30__LCDDAT19>,
+                                                        <PIN_PB31__LCDDAT20>,
+                                                        <PIN_PC0__LCDDAT21>,
+                                                        <PIN_PC1__LCDDAT22>,
+                                                        <PIN_PC2__LCDDAT23>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_sdmmc0_cmd_dat_default: sdmmc0_cmd_dat_default {
+                                               pinmux = <PIN_PA1__SDMMC0_CMD>,
+                                                        <PIN_PA2__SDMMC0_DAT0>,
+                                                        <PIN_PA3__SDMMC0_DAT1>,
+                                                        <PIN_PA4__SDMMC0_DAT2>,
+                                                        <PIN_PA5__SDMMC0_DAT3>,
+                                                        <PIN_PA6__SDMMC0_DAT4>,
+                                                        <PIN_PA7__SDMMC0_DAT5>,
+                                                        <PIN_PA8__SDMMC0_DAT6>,
+                                                        <PIN_PA9__SDMMC0_DAT7>;
+                                               bias-pull-up;
+                                               u-boot,dm-pre-reloc;
+                                       };
+
+                                       pinctrl_sdmmc0_ck_cd_default: sdmmc0_ck_cd_default {
+                                               pinmux = <PIN_PA0__SDMMC0_CK>,
+                                                        <PIN_PA10__SDMMC0_RSTN>,
+                                                        <PIN_PA13__SDMMC0_CD>;
+                                               bias-disable;
+                                               u-boot,dm-pre-reloc;
+                                       };
+
+                                       pinctrl_sdmmc1_cmd_dat_default: sdmmc1_cmd_dat_default {
+                                               pinmux = <PIN_PA28__SDMMC1_CMD>,
+                                                        <PIN_PA18__SDMMC1_DAT0>,
+                                                        <PIN_PA19__SDMMC1_DAT1>,
+                                                        <PIN_PA20__SDMMC1_DAT2>,
+                                                        <PIN_PA21__SDMMC1_DAT3>;
+                                               bias-pull-up;
+                                               u-boot,dm-pre-reloc;
+                                       };
+
+                                       pinctrl_sdmmc1_ck_cd_default: sdmmc1_ck_cd_default {
+                                               pinmux = <PIN_PA22__SDMMC1_CK>,
+                                                        <PIN_PA30__SDMMC1_CD>;
+                                               bias-disable;
+                                               u-boot,dm-pre-reloc;
+                                       };
+
+                                       pinctrl_uart1_default: uart1_default {
+                                               pinmux = <PIN_PD2__URXD1>,
+                                                        <PIN_PD3__UTXD1>;
+                                               bias-disable;
+                                               u-boot,dm-pre-reloc;
+                                       };
+
+                                       pinctrl_usb_default: usb_default {
+                                               pinmux = <PIN_PB10__GPIO>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_usba_vbus: usba_vbus {
+                                               pinmux = <PIN_PA31__GPIO>;
+                                               bias-disable;
+                                       };
+                               };
+                       };
+               };
+       };
+};
index 3e624f142c6542f14b0b50e4dc0b46f1d13c9498..b00aaa2c79209eed3fd0ac313c4f9793a20b108c 100644 (file)
                                pinctrl-names = "default";
                                pinctrl-0 = <&pinctrl_i2c1_default>;
                                status = "okay";
+
+                               i2c_eeprom: i2c_eeprom@5c {
+                                       compatible = "atmel,24mac402";
+                                       reg = <0x5c>;
+                               };
                        };
 
                        pioA: gpio@fc038000 {
index ca6aff28e58167744dbd38fee76ec06ade5ee3ab..0592b31b91733ef846dacdebc083175dd395b2e0 100644 (file)
 
                        i2c0: i2c@f8014000 {
                                status = "okay";
+
+                               i2c_eeprom: i2c_eeprom@5c {
+                                       compatible = "atmel,24mac402";
+                                       reg = <0x5c>;
+                               };
                        };
 
                        macb0: ethernet@f8020000 {
diff --git a/arch/arm/dts/dra7-evm-common.dtsi b/arch/arm/dts/dra7-evm-common.dtsi
new file mode 100644 (file)
index 0000000..343e95f
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/clk/ti-dra7-atl.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       extcon_usb1: extcon_usb1 {
+               compatible = "linux,extcon-usb-gpio";
+               id-gpio = <&pcf_gpio_21 1 GPIO_ACTIVE_HIGH>;
+       };
+
+       sound0: sound0 {
+               compatible = "simple-audio-card";
+               simple-audio-card,name = "DRA7xx-EVM";
+               simple-audio-card,widgets =
+                       "Headphone", "Headphone Jack",
+                       "Line", "Line Out",
+                       "Microphone", "Mic Jack",
+                       "Line", "Line In";
+               simple-audio-card,routing =
+                       "Headphone Jack",       "HPLOUT",
+                       "Headphone Jack",       "HPROUT",
+                       "Line Out",             "LLOUT",
+                       "Line Out",             "RLOUT",
+                       "MIC3L",                "Mic Jack",
+                       "MIC3R",                "Mic Jack",
+                       "Mic Jack",             "Mic Bias",
+                       "LINE1L",               "Line In",
+                       "LINE1R",               "Line In";
+               simple-audio-card,format = "dsp_b";
+               simple-audio-card,bitclock-master = <&sound0_master>;
+               simple-audio-card,frame-master = <&sound0_master>;
+               simple-audio-card,bitclock-inversion;
+
+               sound0_master: simple-audio-card,cpu {
+                       sound-dai = <&mcasp3>;
+                       system-clock-frequency = <5644800>;
+               };
+
+               simple-audio-card,codec {
+                       sound-dai = <&tlv320aic3106>;
+                       clocks = <&atl_clkin2_ck>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               led0 {
+                       label = "dra7:usr1";
+                       gpios = <&pcf_lcd 4 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               led1 {
+                       label = "dra7:usr2";
+                       gpios = <&pcf_lcd 5 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               led2 {
+                       label = "dra7:usr3";
+                       gpios = <&pcf_lcd 6 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+
+               led3 {
+                       label = "dra7:usr4";
+                       gpios = <&pcf_lcd 7 GPIO_ACTIVE_LOW>;
+                       default-state = "off";
+               };
+       };
+
+       gpio_keys {
+               compatible = "gpio-keys";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               autorepeat;
+
+               USER1 {
+                       label = "btnUser1";
+                       linux,code = <BTN_0>;
+                       gpios = <&pcf_lcd 2 GPIO_ACTIVE_LOW>;
+               };
+
+               USER2 {
+                       label = "btnUser2";
+                       linux,code = <BTN_1>;
+                       gpios = <&pcf_lcd 3 GPIO_ACTIVE_LOW>;
+               };
+       };
+};
+
+&i2c3 {
+       status = "okay";
+       clock-frequency = <400000>;
+};
+
+&mcspi1 {
+       status = "okay";
+};
+
+&mcspi2 {
+       status = "okay";
+};
+
+&uart1 {
+       status = "okay";
+       interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
+                             <&dra7_pmx_core 0x3e0>;
+};
+
+&uart2 {
+       status = "okay";
+};
+
+&uart3 {
+       status = "okay";
+};
+
+&qspi {
+       status = "okay";
+
+       spi-max-frequency = <76800000>;
+       m25p80@0 {
+               compatible = "s25fl256s1";
+               spi-max-frequency = <76800000>;
+               reg = <0>;
+               spi-tx-bus-width = <1>;
+               spi-rx-bus-width = <4>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               /* MTD partition table.
+                * The ROM checks the first four physical blocks
+                * for a valid file to boot and the flash here is
+                * 64KiB block size.
+                */
+               partition@0 {
+                       label = "QSPI.SPL";
+                       reg = <0x00000000 0x000010000>;
+               };
+               partition@1 {
+                       label = "QSPI.SPL.backup1";
+                       reg = <0x00010000 0x00010000>;
+               };
+               partition@2 {
+                       label = "QSPI.SPL.backup2";
+                       reg = <0x00020000 0x00010000>;
+               };
+               partition@3 {
+                       label = "QSPI.SPL.backup3";
+                       reg = <0x00030000 0x00010000>;
+               };
+               partition@4 {
+                       label = "QSPI.u-boot";
+                       reg = <0x00040000 0x00100000>;
+               };
+               partition@5 {
+                       label = "QSPI.u-boot-spl-os";
+                       reg = <0x00140000 0x00080000>;
+               };
+               partition@6 {
+                       label = "QSPI.u-boot-env";
+                       reg = <0x001c0000 0x00010000>;
+               };
+               partition@7 {
+                       label = "QSPI.u-boot-env.backup1";
+                       reg = <0x001d0000 0x0010000>;
+               };
+               partition@8 {
+                       label = "QSPI.kernel";
+                       reg = <0x001e0000 0x0800000>;
+               };
+               partition@9 {
+                       label = "QSPI.file-system";
+                       reg = <0x009e0000 0x01620000>;
+               };
+       };
+};
+
+&omap_dwc3_1 {
+       extcon = <&extcon_usb1>;
+};
+
+&usb1 {
+       dr_mode = "otg";
+       extcon = <&extcon_usb1>;
+};
+
+&usb2 {
+       dr_mode = "host";
+};
+
+&atl {
+       assigned-clocks = <&abe_dpll_sys_clk_mux>,
+                         <&atl_gfclk_mux>,
+                         <&dpll_abe_ck>,
+                         <&dpll_abe_m2x2_ck>,
+                         <&atl_clkin2_ck>;
+       assigned-clock-parents = <&sys_clkin2>, <&dpll_abe_m2_ck>;
+       assigned-clock-rates = <0>, <0>, <180633600>, <361267200>, <5644800>;
+
+       status = "okay";
+
+       atl2 {
+               bws = <DRA7_ATL_WS_MCASP2_FSX>;
+               aws = <DRA7_ATL_WS_MCASP3_FSX>;
+       };
+};
+
+&mcasp3 {
+       #sound-dai-cells = <0>;
+
+       assigned-clocks = <&mcasp3_ahclkx_mux>;
+       assigned-clock-parents = <&atl_clkin2_ck>;
+
+       status = "okay";
+
+       op-mode = <0>;          /* MCASP_IIS_MODE */
+       tdm-slots = <2>;
+       /* 4 serializer */
+       serial-dir = <  /* 0: INACTIVE, 1: TX, 2: RX */
+               1 2 0 0
+       >;
+       tx-num-evt = <32>;
+       rx-num-evt = <32>;
+};
+
+&mailbox5 {
+       status = "okay";
+       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+               status = "okay";
+       };
+       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+               status = "okay";
+       };
+};
+
+&mailbox6 {
+       status = "okay";
+       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+               status = "okay";
+       };
+       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
+               status = "okay";
+       };
+};
diff --git a/arch/arm/dts/dra7-evm-u-boot.dtsi b/arch/arm/dts/dra7-evm-u-boot.dtsi
new file mode 100644 (file)
index 0000000..62ef830
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "omap5-u-boot.dtsi"
+
+&pcf_gpio_21{
+       u-boot,i2c-offset-len = <0>;
+};
+
+&pcf_hdmi{
+       u-boot,i2c-offset-len = <0>;
+};
index 4d882ab338954e8b9f31d0f8fec2be8ca1478ff6..aa426dabb6c349d9f1b5a4a0173ae30ad3b7cc58 100644 (file)
@@ -8,24 +8,26 @@
 /dts-v1/;
 
 #include "dra74x.dtsi"
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/clk/ti-dra7-atl.h>
-#include <dt-bindings/input/input.h>
+#include "dra7-evm-common.dtsi"
+#include "dra74x-mmc-iodelay.dtsi"
 
 / {
        model = "TI DRA742";
        compatible = "ti,dra7-evm", "ti,dra742", "ti,dra74", "ti,dra7";
 
-       chosen {
-               stdout-path = &uart1;
-               tick-timer = &timer2;
-       };
-
        memory@0 {
                device_type = "memory";
                reg = <0x0 0x80000000 0x0 0x60000000>; /* 1536 MB */
        };
 
+       evm_1v8_sw: fixedregulator-evm_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "evm_1v8";
+               vin-supply = <&smps9_reg>;
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+       };
+
        evm_3v3_sd: fixedregulator-sd {
                compatible = "regulator-fixed";
                regulator-name = "evm_3v3_sd";
                regulator-max-microvolt = <1800000>;
        };
 
-       extcon_usb1: extcon_usb1 {
-               compatible = "linux,extcon-usb-gpio";
-               id-gpio = <&pcf_gpio_21 1 GPIO_ACTIVE_HIGH>;
-       };
-
        extcon_usb2: extcon_usb2 {
                compatible = "linux,extcon-usb-gpio";
                id-gpio = <&pcf_gpio_21 2 GPIO_ACTIVE_HIGH>;
                gpio = <&gpio7 11 GPIO_ACTIVE_HIGH>;
        };
 
-       sound0: sound0 {
-               compatible = "simple-audio-card";
-               simple-audio-card,name = "DRA7xx-EVM";
-               simple-audio-card,widgets =
-                       "Headphone", "Headphone Jack",
-                       "Line", "Line Out",
-                       "Microphone", "Mic Jack",
-                       "Line", "Line In";
-               simple-audio-card,routing =
-                       "Headphone Jack",       "HPLOUT",
-                       "Headphone Jack",       "HPROUT",
-                       "Line Out",             "LLOUT",
-                       "Line Out",             "RLOUT",
-                       "MIC3L",                "Mic Jack",
-                       "MIC3R",                "Mic Jack",
-                       "Mic Jack",             "Mic Bias",
-                       "LINE1L",               "Line In",
-                       "LINE1R",               "Line In";
-               simple-audio-card,format = "dsp_b";
-               simple-audio-card,bitclock-master = <&sound0_master>;
-               simple-audio-card,frame-master = <&sound0_master>;
-               simple-audio-card,bitclock-inversion;
-
-               sound0_master: simple-audio-card,cpu {
-                       sound-dai = <&mcasp3>;
-                       system-clock-frequency = <5644800>;
-               };
-
-               simple-audio-card,codec {
-                       sound-dai = <&tlv320aic3106>;
-                       clocks = <&atl_clkin2_ck>;
-               };
-       };
-
-       leds {
-               compatible = "gpio-leds";
-               led0 {
-                       label = "dra7:usr1";
-                       gpios = <&pcf_lcd 4 GPIO_ACTIVE_LOW>;
-                       default-state = "off";
-               };
-
-               led1 {
-                       label = "dra7:usr2";
-                       gpios = <&pcf_lcd 5 GPIO_ACTIVE_LOW>;
-                       default-state = "off";
-               };
-
-               led2 {
-                       label = "dra7:usr3";
-                       gpios = <&pcf_lcd 6 GPIO_ACTIVE_LOW>;
-                       default-state = "off";
-               };
-
-               led3 {
-                       label = "dra7:usr4";
-                       gpios = <&pcf_lcd 7 GPIO_ACTIVE_LOW>;
-                       default-state = "off";
-               };
-       };
-
-       gpio_keys {
-               compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
-               autorepeat;
-
-               USER1 {
-                       label = "btnUser1";
-                       linux,code = <BTN_0>;
-                       gpios = <&pcf_lcd 2 GPIO_ACTIVE_LOW>;
-               };
-
-               USER2 {
-                       label = "btnUser2";
-                       linux,code = <BTN_1>;
-                       gpios = <&pcf_lcd 3 GPIO_ACTIVE_LOW>;
-               };
-       };
 };
 
 &dra7_pmx_core {
-       pinctrl-names = "default";
-       pinctrl-0 = <&vtt_pin>;
-
-       vtt_pin: pinmux_vtt_pin {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x37b4, PIN_OUTPUT | MUX_MODE14) /* spi1_cs1.gpio7_11 */
-               >;
-       };
-
-       i2c1_pins: pinmux_i2c1_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3800, PIN_INPUT | MUX_MODE0) /* i2c1_sda */
-                       DRA7XX_CORE_IOPAD(0x3804, PIN_INPUT | MUX_MODE0) /* i2c1_scl */
-               >;
-       };
-
-       i2c2_pins: pinmux_i2c2_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3808, PIN_INPUT | MUX_MODE0) /* i2c2_sda */
-                       DRA7XX_CORE_IOPAD(0x380c, PIN_INPUT | MUX_MODE0) /* i2c2_scl */
-               >;
-       };
-
-       i2c3_pins: pinmux_i2c3_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3688, PIN_INPUT | MUX_MODE9) /* gpio6_14.i2c3_sda */
-                       DRA7XX_CORE_IOPAD(0x368c, PIN_INPUT | MUX_MODE9) /* gpio6_15.i2c3_scl */
-               >;
-       };
-
-       mcspi1_pins: pinmux_mcspi1_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x37a4, PIN_INPUT | MUX_MODE0) /* spi1_sclk */
-                       DRA7XX_CORE_IOPAD(0x37a8, PIN_INPUT | MUX_MODE0) /* spi1_d1 */
-                       DRA7XX_CORE_IOPAD(0x37ac, PIN_INPUT | MUX_MODE0) /* spi1_d0 */
-                       DRA7XX_CORE_IOPAD(0x37b0, PIN_INPUT_SLEW | MUX_MODE0) /* spi1_cs0 */
-                       DRA7XX_CORE_IOPAD(0x37b8, PIN_INPUT_SLEW | MUX_MODE6) /* spi1_cs2.hdmi1_hpd */
-                       DRA7XX_CORE_IOPAD(0x37bc, PIN_INPUT_SLEW | MUX_MODE6) /* spi1_cs3.hdmi1_cec */
-               >;
-       };
-
-       mcspi2_pins: pinmux_mcspi2_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x37c0, PIN_INPUT | MUX_MODE0) /* spi2_sclk */
-                       DRA7XX_CORE_IOPAD(0x37c4, PIN_INPUT_SLEW | MUX_MODE0) /* spi2_d1 */
-                       DRA7XX_CORE_IOPAD(0x37c8, PIN_INPUT_SLEW | MUX_MODE0) /* spi2_d1 */
-                       DRA7XX_CORE_IOPAD(0x37cc, PIN_INPUT_SLEW | MUX_MODE0) /* spi2_cs0 */
-               >;
-       };
-
-       uart1_pins: pinmux_uart1_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x37e0, PIN_INPUT_SLEW | MUX_MODE0) /* uart1_rxd */
-                       DRA7XX_CORE_IOPAD(0x37e4, PIN_INPUT_SLEW | MUX_MODE0) /* uart1_txd */
-                       DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT | MUX_MODE3) /* uart1_ctsn */
-                       DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT | MUX_MODE3) /* uart1_rtsn */
-               >;
-       };
-
-       uart2_pins: pinmux_uart2_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT | MUX_MODE0) /* uart2_rxd */
-                       DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT | MUX_MODE0) /* uart2_txd */
-                       DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT | MUX_MODE0) /* uart2_ctsn */
-                       DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT | MUX_MODE0) /* uart2_rtsn */
-               >;
-       };
-
-       uart3_pins: pinmux_uart3_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3648, PIN_INPUT_SLEW | MUX_MODE0) /* uart3_rxd */
-                       DRA7XX_CORE_IOPAD(0x364c, PIN_INPUT_SLEW | MUX_MODE0) /* uart3_txd */
-               >;
-       };
-
-       usb1_pins: pinmux_usb1_pins {
-                pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3680, PIN_INPUT_SLEW | MUX_MODE0) /* usb1_drvvbus */
-                >;
-        };
-
-       usb2_pins: pinmux_usb2_pins {
-                pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3684, PIN_INPUT_SLEW | MUX_MODE0) /* usb2_drvvbus */
-                >;
-        };
-
-       nand_flash_x16: nand_flash_x16 {
-               /* On DRA7 EVM, GPMC_WPN and NAND_BOOTn comes from DIP switch
-                * So NAND flash requires following switch settings:
-                * SW5.1 (NAND_BOOTn) = ON (LOW)
-                * SW5.9 (GPMC_WPN) = OFF (HIGH)
-                */
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3400, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad0     */
-                       DRA7XX_CORE_IOPAD(0x3404, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad1     */
-                       DRA7XX_CORE_IOPAD(0x3408, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad2     */
-                       DRA7XX_CORE_IOPAD(0x340c, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad3     */
-                       DRA7XX_CORE_IOPAD(0x3410, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad4     */
-                       DRA7XX_CORE_IOPAD(0x3414, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad5     */
-                       DRA7XX_CORE_IOPAD(0x3418, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad6     */
-                       DRA7XX_CORE_IOPAD(0x341c, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad7     */
-                       DRA7XX_CORE_IOPAD(0x3420, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad8     */
-                       DRA7XX_CORE_IOPAD(0x3424, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad9     */
-                       DRA7XX_CORE_IOPAD(0x3428, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad10    */
-                       DRA7XX_CORE_IOPAD(0x342c, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad11    */
-                       DRA7XX_CORE_IOPAD(0x3430, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad12    */
-                       DRA7XX_CORE_IOPAD(0x3434, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad13    */
-                       DRA7XX_CORE_IOPAD(0x3438, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad14    */
-                       DRA7XX_CORE_IOPAD(0x343c, PIN_INPUT  | MUX_MODE0)       /* gpmc_ad15    */
-                       DRA7XX_CORE_IOPAD(0x34d8, PIN_INPUT_PULLUP  | MUX_MODE0)        /* gpmc_wait0   */
-                       DRA7XX_CORE_IOPAD(0x34cc, PIN_OUTPUT | MUX_MODE0)       /* gpmc_wen     */
-                       DRA7XX_CORE_IOPAD(0x34b4, PIN_OUTPUT_PULLUP | MUX_MODE0)        /* gpmc_csn0    */
-                       DRA7XX_CORE_IOPAD(0x34c4, PIN_OUTPUT | MUX_MODE0)       /* gpmc_advn_ale */
-                       DRA7XX_CORE_IOPAD(0x34c8, PIN_OUTPUT | MUX_MODE0)       /* gpmc_oen_ren  */
-                       DRA7XX_CORE_IOPAD(0x34d0, PIN_OUTPUT | MUX_MODE0)       /* gpmc_be0n_cle */
-               >;
-       };
-
-       cpsw_default: cpsw_default {
-               pinctrl-single,pins = <
-                       /* Slave 1 */
-                       DRA7XX_CORE_IOPAD(0x3650, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_txc.rgmii0_txc */
-                       DRA7XX_CORE_IOPAD(0x3654, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_txctl.rgmii0_txctl */
-                       DRA7XX_CORE_IOPAD(0x3658, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_td3.rgmii0_txd3 */
-                       DRA7XX_CORE_IOPAD(0x365c, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_txd2.rgmii0_txd2 */
-                       DRA7XX_CORE_IOPAD(0x3660, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_txd1.rgmii0_txd1 */
-                       DRA7XX_CORE_IOPAD(0x3664, PIN_OUTPUT | MUX_MODE0)       /* rgmii0_txd0.rgmii0_txd0 */
-                       DRA7XX_CORE_IOPAD(0x3668, PIN_INPUT | MUX_MODE0)        /* rgmii0_rxc.rgmii0_rxc */
-                       DRA7XX_CORE_IOPAD(0x366c, PIN_INPUT | MUX_MODE0)        /* rgmii0_rxctl.rgmii0_rxctl */
-                       DRA7XX_CORE_IOPAD(0x3670, PIN_INPUT | MUX_MODE0)        /* rgmii0_rxd3.rgmii0_rxd3 */
-                       DRA7XX_CORE_IOPAD(0x3674, PIN_INPUT | MUX_MODE0)        /* rgmii0_rxd2.rgmii0_rxd2 */
-                       DRA7XX_CORE_IOPAD(0x3678, PIN_INPUT | MUX_MODE0)        /* rgmii0_rxd1.rgmii0_rxd1 */
-                       DRA7XX_CORE_IOPAD(0x367c, PIN_INPUT | MUX_MODE0)        /* rgmii0_rxd0.rgmii0_rxd0 */
-
-                       /* Slave 2 */
-                       DRA7XX_CORE_IOPAD(0x3598, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d12.rgmii1_txc */
-                       DRA7XX_CORE_IOPAD(0x359c, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d13.rgmii1_tctl */
-                       DRA7XX_CORE_IOPAD(0x35a0, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d14.rgmii1_td3 */
-                       DRA7XX_CORE_IOPAD(0x35a4, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d15.rgmii1_td2 */
-                       DRA7XX_CORE_IOPAD(0x35a8, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d16.rgmii1_td1 */
-                       DRA7XX_CORE_IOPAD(0x35ac, PIN_OUTPUT | MUX_MODE3)       /* vin2a_d17.rgmii1_td0 */
-                       DRA7XX_CORE_IOPAD(0x35b0, PIN_INPUT | MUX_MODE3)        /* vin2a_d18.rgmii1_rclk */
-                       DRA7XX_CORE_IOPAD(0x35b4, PIN_INPUT | MUX_MODE3)        /* vin2a_d19.rgmii1_rctl */
-                       DRA7XX_CORE_IOPAD(0x35b8, PIN_INPUT | MUX_MODE3)        /* vin2a_d20.rgmii1_rd3 */
-                       DRA7XX_CORE_IOPAD(0x35bc, PIN_INPUT | MUX_MODE3)        /* vin2a_d21.rgmii1_rd2 */
-                       DRA7XX_CORE_IOPAD(0x35c0, PIN_INPUT | MUX_MODE3)        /* vin2a_d22.rgmii1_rd1 */
-                       DRA7XX_CORE_IOPAD(0x35c4, PIN_INPUT | MUX_MODE3)        /* vin2a_d23.rgmii1_rd0 */
-               >;
-
-       };
-
-       cpsw_sleep: cpsw_sleep {
-               pinctrl-single,pins = <
-                       /* Slave 1 */
-                       DRA7XX_CORE_IOPAD(0x3650, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3654, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3658, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x365c, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3660, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3664, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3668, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x366c, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3670, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3674, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3678, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x367c, MUX_MODE15)
-
-                       /* Slave 2 */
-                       DRA7XX_CORE_IOPAD(0x3598, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x359c, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35a0, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35a4, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35a8, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35ac, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35b0, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35b4, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35b8, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35bc, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35c0, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x35c4, MUX_MODE15)
-               >;
-       };
-
-       davinci_mdio_default: davinci_mdio_default {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x363c, PIN_OUTPUT_PULLUP | MUX_MODE0)        /* mdio_d.mdio_d */
-                       DRA7XX_CORE_IOPAD(0x3640, PIN_INPUT_PULLUP | MUX_MODE0) /* mdio_clk.mdio_clk */
-               >;
-       };
-
-       davinci_mdio_sleep: davinci_mdio_sleep {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x363c, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3640, MUX_MODE15)
-               >;
-       };
-
        dcan1_pins_default: dcan1_pins_default {
                pinctrl-single,pins = <
                        DRA7XX_CORE_IOPAD(0x37d0, PIN_OUTPUT_PULLUP | MUX_MODE0) /* dcan1_tx */
                >;
        };
 
-       atl_pins: pinmux_atl_pins {
-               pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3698, PIN_OUTPUT | MUX_MODE5)       /* xref_clk1.atl_clk1 */
-                       DRA7XX_CORE_IOPAD(0x369c, PIN_OUTPUT | MUX_MODE5)       /* xref_clk2.atl_clk2 */
-               >;
-       };
-
-       mcasp3_pins: pinmux_mcasp3_pins {
+       mmc1_pins_default: mmc1_pins_default {
                pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3724, PIN_OUTPUT_PULLDOWN | MUX_MODE0)      /* mcasp3_aclkx */
-                       DRA7XX_CORE_IOPAD(0x3728, PIN_OUTPUT_PULLDOWN | MUX_MODE0)      /* mcasp3_fsx */
-                       DRA7XX_CORE_IOPAD(0x372c, PIN_OUTPUT_PULLDOWN | MUX_MODE0)      /* mcasp3_axr0 */
-                       DRA7XX_CORE_IOPAD(0x3730, PIN_INPUT_PULLDOWN | MUX_MODE0)       /* mcasp3_axr1 */
+                       DRA7XX_CORE_IOPAD(0x376c, PIN_INPUT | MUX_MODE14)       /* mmc1sdcd.gpio219 */
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
                >;
        };
 
-       mcasp3_sleep_pins: pinmux_mcasp3_sleep_pins {
+       mmc2_pins_default: mmc2_pins_default {
                pinctrl-single,pins = <
-                       DRA7XX_CORE_IOPAD(0x3724, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3728, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x372c, MUX_MODE15)
-                       DRA7XX_CORE_IOPAD(0x3730, MUX_MODE15)
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
                >;
        };
 };
 
 &i2c1 {
        status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c1_pins>;
        clock-frequency = <400000>;
 
        tps659038: tps659038@58 {
                compatible = "ti,tps659038";
                reg = <0x58>;
+               ti,palmas-override-powerhold;
+               ti,system-power-controller;
 
                tps659038_pmic {
                        compatible = "ti,tps659038-pmic";
                interrupts = <11 IRQ_TYPE_EDGE_FALLING>;
                interrupt-controller;
                #interrupt-cells = <2>;
-               u-boot,i2c-offset-len = <0>;
        };
 
        tlv320aic3106: tlv320aic3106@19 {
 
 &i2c2 {
        status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c2_pins>;
        clock-frequency = <400000>;
 
        pcf_hdmi: gpio@26 {
        };
 };
 
-&i2c3 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&i2c3_pins>;
-       clock-frequency = <400000>;
-};
-
-&mcspi1 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&mcspi1_pins>;
-};
-
-&mcspi2 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&mcspi2_pins>;
-};
-
-&uart1 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&uart1_pins>;
-       interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>,
-                             <&dra7_pmx_core 0x3e0>;
-};
-
-&uart2 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&uart2_pins>;
-};
-
-&uart3 {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&uart3_pins>;
-};
-
 &mmc1 {
        status = "okay";
        vmmc-supply = <&evm_3v3_sd>;
-       vmmc_aux-supply = <&ldo1_reg>;
+       vqmmc-supply = <&ldo1_reg>;
        bus-width = <4>;
        /*
         * SDCD signal is not being used here - using the fact that GPIO mode
         * is always hardwired.
         */
        cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>;
+       pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50-rev11", "sdr104-rev11", "ddr50", "sdr104";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+       pinctrl-2 = <&mmc1_pins_sdr12>;
+       pinctrl-3 = <&mmc1_pins_sdr25>;
+       pinctrl-4 = <&mmc1_pins_sdr50>;
+       pinctrl-5 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev11_conf>;
+       pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev11_conf>;
+       pinctrl-7 = <&mmc1_pins_ddr50 &mmc1_iodelay_ddr_rev20_conf>;
+       pinctrl-8 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
 };
 
 &mmc2 {
        status = "okay";
-       vmmc-supply = <&evm_3v3_sw>;
+       vmmc-supply = <&evm_1v8_sw>;
        bus-width = <8>;
+       pinctrl-names = "default", "hs", "ddr_1_8v-rev11", "ddr_1_8v", "hs200_1_8v-rev11", "hs200_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_1_8v_rev11 &mmc2_iodelay_ddr_1_8v_rev11_conf>;
+       pinctrl-3 = <&mmc2_pins_ddr_rev20>;
+       pinctrl-4 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev11_conf>;
+       pinctrl-5 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev20_conf>;
 };
 
 &cpu0 {
        cpu0-supply = <&smps123_reg>;
 };
 
-&qspi {
-       status = "okay";
-
-       spi-max-frequency = <76800000>;
-       m25p80@0 {
-               compatible = "s25fl256s1", "spi-flash";
-               spi-max-frequency = <76800000>;
-               reg = <0>;
-               spi-tx-bus-width = <1>;
-               spi-rx-bus-width = <4>;
-               #address-cells = <1>;
-               #size-cells = <1>;
-
-               /* MTD partition table.
-                * The ROM checks the first four physical blocks
-                * for a valid file to boot and the flash here is
-                * 64KiB block size.
-                */
-               partition@0 {
-                       label = "QSPI.SPL";
-                       reg = <0x00000000 0x000010000>;
-               };
-               partition@1 {
-                       label = "QSPI.SPL.backup1";
-                       reg = <0x00010000 0x00010000>;
-               };
-               partition@2 {
-                       label = "QSPI.SPL.backup2";
-                       reg = <0x00020000 0x00010000>;
-               };
-               partition@3 {
-                       label = "QSPI.SPL.backup3";
-                       reg = <0x00030000 0x00010000>;
-               };
-               partition@4 {
-                       label = "QSPI.u-boot";
-                       reg = <0x00040000 0x00100000>;
-               };
-               partition@5 {
-                       label = "QSPI.u-boot-spl-os";
-                       reg = <0x00140000 0x00080000>;
-               };
-               partition@6 {
-                       label = "QSPI.u-boot-env";
-                       reg = <0x001c0000 0x00010000>;
-               };
-               partition@7 {
-                       label = "QSPI.u-boot-env.backup1";
-                       reg = <0x001d0000 0x0010000>;
-               };
-               partition@8 {
-                       label = "QSPI.kernel";
-                       reg = <0x001e0000 0x0800000>;
-               };
-               partition@9 {
-                       label = "QSPI.file-system";
-                       reg = <0x009e0000 0x01620000>;
-               };
-       };
-};
-
-&omap_dwc3_1 {
-       extcon = <&extcon_usb1>;
-};
-
 &omap_dwc3_2 {
        extcon = <&extcon_usb2>;
 };
 
-&usb1 {
-       dr_mode = "peripheral";
-       pinctrl-names = "default";
-       pinctrl-0 = <&usb1_pins>;
-};
-
-&usb2 {
-       dr_mode = "host";
-       pinctrl-names = "default";
-       pinctrl-0 = <&usb2_pins>;
-};
-
 &elm {
        status = "okay";
 };
 
 &gpmc {
-       status = "okay";
-       pinctrl-names = "default";
-       pinctrl-0 = <&nand_flash_x16>;
+       /*
+       * For the existing IOdelay configuration via U-Boot we don't
+       * support NAND on dra7-evm. Keep it disabled. Enabling it
+       * requires a different configuration by U-Boot.
+       */
+       status = "disabled";
        ranges = <0 0 0x08000000 0x01000000>;   /* minimum GPMC partition = 16MB */
        nand@0,0 {
                compatible = "ti,omap2-nand";
                interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
                             <1 IRQ_TYPE_NONE>; /* termcount */
                rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 pin */
+               ti,nand-xfer-type = "prefetch-dma";
                ti,nand-ecc-opt = "bch8";
                ti,elm-id = <&elm>;
                nand-bus-width = <16>;
 
 &mac {
        status = "okay";
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&cpsw_default>;
-       pinctrl-1 = <&cpsw_sleep>;
        dual_emac;
 };
 
        dual_emac_res_vlan = <2>;
 };
 
-&davinci_mdio {
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&davinci_mdio_default>;
-       pinctrl-1 = <&davinci_mdio_sleep>;
-};
-
 &dcan1 {
        status = "ok";
        pinctrl-names = "default", "sleep", "active";
        pinctrl-2 = <&dcan1_pins_default>;
 };
 
-&atl {
-       pinctrl-names = "default";
-       pinctrl-0 = <&atl_pins>;
-
-       assigned-clocks = <&abe_dpll_sys_clk_mux>,
-                         <&atl_gfclk_mux>,
-                         <&dpll_abe_ck>,
-                         <&dpll_abe_m2x2_ck>,
-                         <&atl_clkin2_ck>;
-       assigned-clock-parents = <&sys_clkin2>, <&dpll_abe_m2_ck>;
-       assigned-clock-rates = <0>, <0>, <180633600>, <361267200>, <5644800>;
-
+&pcie1_rc {
        status = "okay";
-
-       atl2 {
-               bws = <DRA7_ATL_WS_MCASP2_FSX>;
-               aws = <DRA7_ATL_WS_MCASP3_FSX>;
-       };
-};
-
-&mcasp3 {
-       #sound-dai-cells = <0>;
-       pinctrl-names = "default", "sleep";
-       pinctrl-0 = <&mcasp3_pins>;
-       pinctrl-1 = <&mcasp3_sleep_pins>;
-
-       assigned-clocks = <&mcasp3_ahclkx_mux>;
-       assigned-clock-parents = <&atl_clkin2_ck>;
-
-       status = "okay";
-
-       op-mode = <0>;          /* MCASP_IIS_MODE */
-       tdm-slots = <2>;
-       /* 4 serializer */
-       serial-dir = <  /* 0: INACTIVE, 1: TX, 2: RX */
-               1 2 0 0
-       >;
-       tx-num-evt = <32>;
-       rx-num-evt = <32>;
-};
-
-&mailbox5 {
-       status = "okay";
-       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
-               status = "okay";
-       };
-       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
-               status = "okay";
-       };
-};
-
-&mailbox6 {
-       status = "okay";
-       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
-               status = "okay";
-       };
-       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
-               status = "okay";
-       };
 };
index 5570e30eb3c8b985f35c46f42786c4687c6cc32e..02a136a4661aa1ed172e4926a7a8dabad9e271b9 100644 (file)
@@ -18,6 +18,7 @@
 
        compatible = "ti,dra7xx";
        interrupt-parent = <&crossbar_mpu>;
+       chosen { };
 
        aliases {
                i2c0 = &i2c1;
@@ -56,7 +57,7 @@
                interrupt-controller;
                #interrupt-cells = <3>;
                reg = <0x0 0x48211000 0x0 0x1000>,
-                     <0x0 0x48212000 0x0 0x1000>,
+                     <0x0 0x48212000 0x0 0x2000>,
                      <0x0 0x48214000 0x0 0x2000>,
                      <0x0 0x48216000 0x0 0x2000>;
                interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
                        compatible = "arm,cortex-a15";
                        reg = <0>;
 
-                       operating-points = <
-                               /* kHz    uV */
-                               1000000 1060000
-                               1176000 1160000
-                               >;
+                       operating-points-v2 = <&cpu0_opp_table>;
 
                        clocks = <&dpll_mpu_ck>;
                        clock-names = "cpu";
                };
        };
 
+       cpu0_opp_table: opp-table {
+               compatible = "operating-points-v2-ti-cpu";
+               syscon = <&scm_wkup>;
+
+               opp_nom-1000000000 {
+                       opp-hz = /bits/ 64 <1000000000>;
+                       opp-microvolt = <1060000 850000 1150000>;
+                       opp-supported-hw = <0xFF 0x01>;
+                       opp-suspend;
+               };
+
+               opp_od-1176000000 {
+                       opp-hz = /bits/ 64 <1176000000>;
+                       opp-microvolt = <1160000 885000 1160000>;
+                       opp-supported-hw = <0xFF 0x02>;
+               };
+       };
+
        /*
         * The soc node represents the soc top level view. It is used for IPs
         * that are not memory mapped in the MPU view or for the MPU itself.
                                        reg = <0x1400 0x0468>;
                                        #address-cells = <1>;
                                        #size-cells = <0>;
+                                       #pinctrl-cells = <1>;
                                        #interrupt-cells = <1>;
                                        interrupt-controller;
                                        pinctrl-single,register-width = <32>;
                                scm_conf1: scm_conf@1c04 {
                                        compatible = "syscon";
                                        reg = <0x1c04 0x0020>;
+                                       #syscon-cells = <2>;
                                };
 
                                scm_conf_pcie: scm_conf@1c24 {
                        #address-cells = <1>;
                        ranges = <0x51000000 0x51000000 0x3000
                                  0x0        0x20000000 0x10000000>;
-                       pcie1: pcie@51000000 {
+                       /**
+                        * To enable PCI endpoint mode, disable the pcie1_rc
+                        * node and enable pcie1_ep mode.
+                        */
+                       pcie1_rc: pcie@51000000 {
                                compatible = "ti,dra7-pcie";
                                reg = <0x51000000 0x2000>, <0x51002000 0x14c>, <0x1000 0x2000>;
                                reg-names = "rc_dbics", "ti_conf", "config";
                                device_type = "pci";
                                ranges = <0x81000000 0 0          0x03000 0 0x00010000
                                          0x82000000 0 0x20013000 0x13000 0 0xffed000>;
+                               bus-range = <0x00 0xff>;
                                #interrupt-cells = <1>;
                                num-lanes = <1>;
                                linux,pci-domain = <0>;
                                                <0 0 0 2 &pcie1_intc 2>,
                                                <0 0 0 3 &pcie1_intc 3>,
                                                <0 0 0 4 &pcie1_intc 4>;
+                               status = "disabled";
                                pcie1_intc: interrupt-controller {
                                        interrupt-controller;
                                        #address-cells = <0>;
                                        #interrupt-cells = <1>;
                                };
                        };
+
+                       pcie1_ep: pcie_ep@51000000 {
+                               compatible = "ti,dra7-pcie-ep";
+                               reg = <0x51000000 0x28>, <0x51002000 0x14c>, <0x51001000 0x28>, <0x1000 0x10000000>;
+                               reg-names = "ep_dbics", "ti_conf", "ep_dbics2", "addr_space";
+                               interrupts = <0 232 0x4>;
+                               num-lanes = <1>;
+                               num-ib-windows = <4>;
+                               num-ob-windows = <16>;
+                               ti,hwmods = "pcie1";
+                               phys = <&pcie1_phy>;
+                               phy-names = "pcie-phy0";
+                               ti,syscon-unaligned-access = <&scm_conf1 0x14 2>;
+                               status = "disabled";
+                       };
                };
 
                axi@1 {
                                device_type = "pci";
                                ranges = <0x81000000 0 0          0x03000 0 0x00010000
                                          0x82000000 0 0x30013000 0x13000 0 0xffed000>;
+                               bus-range = <0x00 0xff>;
                                #interrupt-cells = <1>;
                                num-lanes = <1>;
                                linux,pci-domain = <1>;
                        reg = <0x40d00000 0x100>;
                };
 
+               dra7_iodelay_core: padconf@4844a000 {
+                       compatible = "ti,dra7-iodelay";
+                       reg = <0x4844a000 0x0d1c>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       #pinctrl-cells = <2>;
+               };
+
                sdma: dma-controller@4a056000 {
                        compatible = "ti,omap4430-sdma";
                        reg = <0x4a056000 0x1000>;
                uart1: serial@4806a000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x4806a000 0x100>;
-                       reg-shift = <2>;
                        interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart1";
                        clock-frequency = <48000000>;
                uart2: serial@4806c000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x4806c000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart2";
                        clock-frequency = <48000000>;
                uart3: serial@48020000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x48020000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart3";
                        clock-frequency = <48000000>;
                uart4: serial@4806e000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x4806e000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart4";
                        clock-frequency = <48000000>;
                uart5: serial@48066000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x48066000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart5";
                        clock-frequency = <48000000>;
                uart6: serial@48068000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x48068000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart6";
                        clock-frequency = <48000000>;
                uart7: serial@48420000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x48420000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart7";
                        clock-frequency = <48000000>;
                uart8: serial@48422000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x48422000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart8";
                        clock-frequency = <48000000>;
                uart9: serial@48424000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x48424000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart9";
                        clock-frequency = <48000000>;
                uart10: serial@4ae2b000 {
                        compatible = "ti,dra742-uart", "ti,omap4-uart";
                        reg = <0x4ae2b000 0x100>;
-                       reg-shift = <2>;
                        interrupts = <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>;
                        ti,hwmods = "uart10";
                        clock-frequency = <48000000>;
                        dma-names = "tx", "rx";
                        status = "disabled";
                        pbias-supply = <&pbias_mmc_reg>;
+                       max-frequency = <192000000>;
                };
 
                mmc2: mmc@480b4000 {
                        dmas = <&sdma_xbar 47>, <&sdma_xbar 48>;
                        dma-names = "tx", "rx";
                        status = "disabled";
+                       max-frequency = <192000000>;
                };
 
                mmc3: mmc@480ad000 {
                        dmas = <&sdma_xbar 77>, <&sdma_xbar 78>;
                        dma-names = "tx", "rx";
                        status = "disabled";
+                       /* Errata i887 limits max-frequency of MMC3 to 64 MHz */
+                       max-frequency = <64000000>;
                };
 
                mmc4: mmc@480d1000 {
                        dmas = <&sdma_xbar 57>, <&sdma_xbar 58>;
                        dma-names = "tx", "rx";
                        status = "disabled";
+                       max-frequency = <192000000>;
                };
 
                mmu0_dsp1: mmu@40d01000 {
                        phy-names = "sata-phy";
                        clocks = <&sata_ref_clk>;
                        ti,hwmods = "sata";
+                       ports-implemented = <0x1>;
                };
 
                rtc: rtc@48838000 {
                        cpdma_channels = <8>;
                        ale_entries = <1024>;
                        bd_ram_size = <0x2000>;
-                       no_bd_ram = <0>;
                        mac_control = <0x20>;
                        slaves = <2>;
                        active_slave = <0>;
                        cpts_clock_mult = <0x784CFE14>;
                        cpts_clock_shift = <29>;
-                       syscon = <&scm_conf>;
                        reg = <0x48484000 0x1000
                               0x48485200 0x2E00>;
                        #address-cells = <1>;
                                     <GIC_SPI 336 IRQ_TYPE_LEVEL_HIGH>,
                                     <GIC_SPI 337 IRQ_TYPE_LEVEL_HIGH>;
                        ranges;
+                       syscon = <&scm_conf>;
                        status = "disabled";
 
                        davinci_mdio: mdio@48485000 {
 
 &cpu_thermal {
        polling-delay = <500>; /* milliseconds */
+       coefficients = <0 2000>;
+};
+
+&gpu_thermal {
+       coefficients = <0 2000>;
+};
+
+&core_thermal {
+       coefficients = <0 2000>;
+};
+
+&dspeve_thermal {
+       coefficients = <0 2000>;
+};
+
+&iva_thermal {
+       coefficients = <0 2000>;
+};
+
+&cpu_crit {
+       temperature = <120000>; /* milli Celsius */
 };
 
 /include/ "dra7xx-clocks.dtsi"
diff --git a/arch/arm/dts/dra71-evm-u-boot.dtsi b/arch/arm/dts/dra71-evm-u-boot.dtsi
new file mode 100644 (file)
index 0000000..8ae64c0
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "omap5-u-boot.dtsi"
+
+&pcf_gpio_21{
+       u-boot,i2c-offset-len = <0>;
+};
+
+&pcf_hdmi{
+       u-boot,i2c-offset-len = <0>;
+};
+
+&cpsw_emac0 {
+       phy-handle = <&dp83867_0>;
+};
+
+&cpsw_emac1 {
+       phy-handle = <&dp83867_1>;
+};
index 875116c67fdd9e3b4dafe8adffa5584881dfb6cb..41c9132eb550d07dd686a85eda0296bbfad0b6f7 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include "dra72-evm-common.dtsi"
+#include "dra72x-mmc-iodelay.dtsi"
 #include <dt-bindings/net/ti-dp83867.h>
 
 / {
                          3000000 0x1>;
        };
 
+       evm_1v8_sw: fixedregulator-evm_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "evm_1v8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&lp8732_buck0_reg>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
        poweroff: gpio-poweroff {
                compatible = "gpio-poweroff";
                gpios = <&gpio7 30 GPIO_ACTIVE_HIGH>;
        };
 };
 
+&pcf_lcd {
+       interrupt-parent = <&gpio7>;
+       interrupts = <31 IRQ_TYPE_EDGE_FALLING>;
+};
+
 &pcf_gpio_21 {
        interrupt-parent = <&gpio7>;
        interrupts = <31 IRQ_TYPE_EDGE_FALLING>;
 };
 
 &mmc1 {
-       vmmc_aux-supply = <&vpo_sd_1v8_3v3>;
+       pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+       pinctrl-2 = <&mmc1_pins_sdr12>;
+       pinctrl-3 = <&mmc1_pins_sdr25>;
+       pinctrl-4 = <&mmc1_pins_sdr50>;
+       pinctrl-5 = <&mmc1_pins_ddr50_rev20 &mmc1_iodelay_ddr50_conf>;
+       pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+       vqmmc-supply = <&vpo_sd_1v8_3v3>;
+};
+
+&mmc2 {
+       pinctrl-names = "default", "hs", "ddr_1_8v", "hs200_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_rev20 &mmc2_iodelay_ddr_conf>;
+       pinctrl-3 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev20_conf>;
+       vmmc-supply = <&evm_1v8_sw>;
 };
 
 &mac {
 };
 
 &cpsw_emac0 {
-       phy-handle = <&dp83867_0>;
+       phy_id = <&davinci_mdio>, <2>;
        phy-mode = "rgmii-id";
        dual_emac_res_vlan = <1>;
 };
 
 &cpsw_emac1 {
-       phy-handle = <&dp83867_1>;
+       phy_id = <&davinci_mdio>, <3>;
        phy-mode = "rgmii-id";
        dual_emac_res_vlan = <2>;
 };
                ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
                ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
                ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
-               ti,impedance-control = <0x1f>;
+               ti,min-output-impedance;
+               ti,dp83867-rxctrl-strap-quirk;
        };
 
        dp83867_1: ethernet-phy@3 {
                ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
                ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
                ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
-               ti,impedance-control = <0x1f>;
+               ti,min-output-impedance;
+               ti,dp83867-rxctrl-strap-quirk;
        };
 };
 
index c83f87fa79fd065b15d1e9e982c6d1d99435bd29..2e485a13dfd7e1fe470f071022ac4332e1445ea1 100644 (file)
@@ -20,7 +20,6 @@
 
        chosen {
                stdout-path = &uart1;
-               tick-timer = &timer2;
        };
 
        evm_12v0: fixedregulator-evm12v0 {
        status = "okay";
        clock-frequency = <400000>;
 
+       pcf_lcd: gpio@20 {
+               compatible = "nxp,pcf8575";
+               reg = <0x20>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
        pcf_gpio_21: gpio@21 {
                compatible = "ti,pcf8575", "nxp,pcf8575";
-               u-boot,i2c-offset-len = <0>;
                reg = <0x21>;
                lines-initial-states = <0x1408>;
                gpio-controller;
 
        pcf_hdmi: pcf8575@26 {
                compatible = "ti,pcf8575", "nxp,pcf8575";
-               u-boot,i2c-offset-len = <0>;
                reg = <0x26>;
                gpio-controller;
                #gpio-cells = <2>;
 };
 
 &gpmc {
-       status = "okay";
+       /*
+        * For the existing IOdelay configuration via U-Boot we don't
+        * support NAND on dra72-evm. Keep it disabled. Enabling it
+        * requires a different configuration by U-Boot.
+        */
+       status = "disabled";
        ranges = <0 0 0x08000000 0x01000000>;   /* minimum GPMC partition = 16MB */
        nand@0,0 {
                /* To use NAND, DIP switch SW5 must be set like so:
                interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
                             <1 IRQ_TYPE_NONE>; /* termcount */
                rb-gpios = <&gpmc 0 GPIO_ACTIVE_HIGH>; /* gpmc_wait0 pin */
+               ti,nand-xfer-type = "prefetch-dma";
                ti,nand-ecc-opt = "bch8";
                ti,elm-id = <&elm>;
                nand-bus-width = <16>;
 };
 
 &usb1 {
-       dr_mode = "peripheral";
+       dr_mode = "otg";
+       extcon = <&extcon_usb1>;
 };
 
 &usb2 {
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&mmc2_pins_default>;
-
-       vmmc-supply = <&evm_3v3_sw>;
        bus-width = <8>;
        ti,non-removable;
        max-frequency = <192000000>;
 
        spi-max-frequency = <76800000>;
        m25p80@0 {
-               compatible = "s25fl256s1", "spi-flash";
+               compatible = "s25fl256s1";
                spi-max-frequency = <76800000>;
                reg = <0>;
                spi-tx-bus-width = <1>;
                status = "okay";
        };
 };
+
+&pcie1_rc {
+       status = "okay";
+};
diff --git a/arch/arm/dts/dra72-evm-revc-u-boot.dtsi b/arch/arm/dts/dra72-evm-revc-u-boot.dtsi
new file mode 100644 (file)
index 0000000..8ae64c0
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "omap5-u-boot.dtsi"
+
+&pcf_gpio_21{
+       u-boot,i2c-offset-len = <0>;
+};
+
+&pcf_hdmi{
+       u-boot,i2c-offset-len = <0>;
+};
+
+&cpsw_emac0 {
+       phy-handle = <&dp83867_0>;
+};
+
+&cpsw_emac1 {
+       phy-handle = <&dp83867_1>;
+};
index bc814f1b4cad9610252fbbc9c85cc0299527ffde..bf588d00728d1973c3426f09421dc5c2bbb5bbe0 100644 (file)
@@ -6,6 +6,7 @@
  * published by the Free Software Foundation.
  */
 #include "dra72-evm-common.dtsi"
+#include "dra72x-mmc-iodelay.dtsi"
 #include <dt-bindings/net/ti-dp83867.h>
 
 / {
                device_type = "memory";
                reg = <0x0 0x80000000 0x0 0x80000000>; /* 2GB */
        };
+
+       evm_1v8_sw: fixedregulator-evm_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "evm_1v8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&smps4_reg>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
 };
 
 &i2c1 {
 };
 
 &cpsw_emac0 {
-       phy-handle = <&dp83867_0>;
+       phy_id = <&davinci_mdio>, <2>;
        phy-mode = "rgmii-id";
        dual_emac_res_vlan = <1>;
 };
 
 &cpsw_emac1 {
-       phy-handle = <&dp83867_1>;
+       phy_id = <&davinci_mdio>, <3>;
        phy-mode = "rgmii-id";
        dual_emac_res_vlan = <2>;
 };
@@ -68,6 +79,9 @@
                ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
                ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
                ti,min-output-impedance;
+               interrupt-parent = <&gpio6>;
+               interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
+               ti,dp83867-rxctrl-strap-quirk;
        };
 
        dp83867_1: ethernet-phy@3 {
                ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
                ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
                ti,min-output-impedance;
+               interrupt-parent = <&gpio6>;
+               interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
+               ti,dp83867-rxctrl-strap-quirk;
        };
 };
+
+&mmc1 {
+       pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+       pinctrl-2 = <&mmc1_pins_sdr12>;
+       pinctrl-3 = <&mmc1_pins_sdr25>;
+       pinctrl-4 = <&mmc1_pins_sdr50>;
+       pinctrl-5 = <&mmc1_pins_ddr50_rev20 &mmc1_iodelay_ddr50_conf>;
+       pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev20_conf>;
+       vqmmc-supply = <&ldo1_reg>;
+};
+
+&mmc2 {
+       pinctrl-names = "default", "hs", "ddr_1_8v", "hs200_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_rev20 &mmc2_iodelay_ddr_conf>;
+       pinctrl-3 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev20_conf>;
+       vmmc-supply = <&evm_1v8_sw>;
+};
index ee6dac44edf1ada06b65a48d213ec9d8d966119b..57bfe5caf5e4f12c6468575abe646ca78e19a01e 100644 (file)
                ti,palmas-long-press-seconds = <6>;
        };
 };
+
+&usb2_phy1 {
+       phy-supply = <&ldo4_reg>;
+};
+
+&usb2_phy2 {
+       phy-supply = <&ldo4_reg>;
+};
+
+&dss {
+       vdda_video-supply = <&ldo5_reg>;
+};
+
+&mmc1 {
+       vqmmc-supply = <&ldo1_reg>;
+};
index cd9c4ff12654ce00ae443c654a888dc14b4a66c6..c572693b16657b69565b3581ac39c9bd8298cba2 100644 (file)
@@ -6,6 +6,7 @@
  * published by the Free Software Foundation.
  */
 #include "dra72-evm-common.dtsi"
+#include "dra72x-mmc-iodelay.dtsi"
 / {
        model = "TI DRA722";
 
                device_type = "memory";
                reg = <0x0 0x80000000 0x0 0x40000000>; /* 1024 MB */
        };
+
+       evm_1v8_sw: fixedregulator-evm_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "evm_1v8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&smps4_reg>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
 };
 
 &i2c1 {
        phy_id = <&davinci_mdio>, <3>;
        phy-mode = "rgmii";
 };
+
+&mmc1 {
+       pinctrl-names = "default", "hs", "sdr12", "sdr25", "sdr50", "ddr50", "sdr104";
+       pinctrl-0 = <&mmc1_pins_default>;
+       pinctrl-1 = <&mmc1_pins_hs>;
+       pinctrl-2 = <&mmc1_pins_sdr12>;
+       pinctrl-3 = <&mmc1_pins_sdr25>;
+       pinctrl-4 = <&mmc1_pins_sdr50>;
+       pinctrl-5 = <&mmc1_pins_ddr50_rev10>;
+       pinctrl-6 = <&mmc1_pins_sdr104 &mmc1_iodelay_sdr104_rev10_conf>;
+       vqmmc-supply = <&ldo1_reg>;
+};
+
+&mmc2 {
+       pinctrl-names = "default", "hs", "ddr_1_8v", "hs200_1_8v";
+       pinctrl-0 = <&mmc2_pins_default>;
+       pinctrl-1 = <&mmc2_pins_hs>;
+       pinctrl-2 = <&mmc2_pins_ddr_rev10>;
+       pinctrl-3 = <&mmc2_pins_hs200 &mmc2_iodelay_hs200_rev10_conf>;
+       vmmc-supply = <&evm_1v8_sw>;
+};
diff --git a/arch/arm/dts/dra72x-mmc-iodelay.dtsi b/arch/arm/dts/dra72x-mmc-iodelay.dtsi
new file mode 100644 (file)
index 0000000..088013c
--- /dev/null
@@ -0,0 +1,350 @@
+/*
+ * MMC IOdelay values for TI's DRA72x, DRA71x and AM571x SoCs.
+ *
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+/*
+ * Rules for modifying this file:
+ * a) Update of this file should typically correspond to a datamanual revision.
+ *    Datamanual revision that was used should be updated in comment below.
+ *    If there is no update to datamanual, do not update the values. If you
+ *    need to use values different from that recommended by the datamanual
+ *    for your design, then you should consider adding values to the device-
+ *    -tree file for your board directly.
+ * b) We keep the mode names as close to the datamanual as possible. So
+ *    if the manual calls a mode, DDR50, or DDR or DDR 1.8v or DDR 3.3v,
+ *    we follow that in code too.
+ * c) If the values change between multiple revisions of silicon, we add
+ *    a revision tag to both the new and old entry. Use 'rev10' for PG 1.0,
+ *    'rev20' for PG 2.0 and so on.
+ * d) The node name and node label should be the exact same string. This is
+ *    to curb naming creativity and achieve consistency.
+ * e) If in future, DRA71x and DRA72x values differ, then add 'dra71_' and
+ *    'dra72_' tag to entries. Both the new and old entries should gain a tag.
+ *
+ * Datamanual Revisions:
+ *
+ * AM571x Silicon Revision 2.0: SPRS957D, Revised January 2017
+ * AM571x Silicon Revision 1.0: SPRS919M, Revised November 2017
+ * DRA71x : SPRS960B, Revised February 2017
+ */
+
+&dra7_pmx_core {
+       mmc1_pins_default: mmc1_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr12: mmc1_pins_sdr12 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_hs: mmc1_pins_hs {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr25: mmc1_pins_sdr25 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr50: mmc1_pins_sdr50 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0)    /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0)    /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0)    /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0)    /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0)    /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE15 | MUX_MODE0)    /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_ddr50_rev10: mmc1_pins_ddr50_rev10 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0)    /* mmc1_clk.mmc1_clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0)    /* mmc1_cmd.mmc1_cmd */
+                       DRA7XX_CORE_IOPAD(0x375C, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0)    /* mmc1_dat0.mmc1_dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0)    /* mmc1_dat1.mmc1_dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0)    /* mmc1_dat2.mmc1_dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE14 | MUX_MODE0)    /* mmc1_dat3.mmc1_dat3 */
+               >;
+       };
+
+       mmc1_pins_ddr50_rev20: mmc1_pins_ddr50_rev20 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr104: mmc1_pins_sdr104 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc2_pins_default: mmc2_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc2_pins_hs: mmc2_pins_hs {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc2_pins_ddr_rev10: mmc2_pins_ddr_rev10 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+               >;
+       };
+
+       mmc2_pins_ddr_rev20: mmc2_pins_ddr_rev20 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc2_pins_hs200: mmc2_pins_hs200 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+};
+
+&dra7_iodelay_core {
+
+       /* Corresponds to MMC1_MANUAL1 in datamanual */
+       mmc1_iodelay_ddr50_conf: mmc1_iodelay_ddr50_conf {
+               pinctrl-pin-array = <
+                       0x618 A_DELAY_PS(588) G_DELAY_PS(0)     /* CFG_MMC1_CLK_IN */
+                       0x624 A_DELAY_PS(1000) G_DELAY_PS(0)    /* CFG_MMC1_CMD_IN */
+                       0x630 A_DELAY_PS(1375) G_DELAY_PS(0)    /* CFG_MMC1_DAT0_IN */
+                       0x63C A_DELAY_PS(1000) G_DELAY_PS(0)    /* CFG_MMC1_DAT1_IN */
+                       0x648 A_DELAY_PS(1000) G_DELAY_PS(0)    /* CFG_MMC1_DAT2_IN */
+                       0x654 A_DELAY_PS(1000) G_DELAY_PS(0)    /* CFG_MMC1_DAT3_IN */
+                       0x620 A_DELAY_PS(1230) G_DELAY_PS(0)    /* CFG_MMC1_CLK_OUT */
+                       0x62C A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OUT */
+                       0x638 A_DELAY_PS(56) G_DELAY_PS(0)      /* CFG_MMC1_DAT0_OUT */
+                       0x644 A_DELAY_PS(76) G_DELAY_PS(0)      /* CFG_MMC1_DAT1_OUT */
+                       0x650 A_DELAY_PS(91) G_DELAY_PS(0)      /* CFG_MMC1_DAT2_OUT */
+                       0x65C A_DELAY_PS(99) G_DELAY_PS(0)      /* CFG_MMC1_DAT3_OUT */
+                       0x628 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OEN */
+                       0x634 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT0_OEN */
+                       0x640 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OEN */
+                       0x64C A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OEN */
+                       0x658 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OEN */
+               >;
+       };
+
+       /* Corresponds to MMC1_MANUAL2 in datamanual */
+       mmc1_iodelay_sdr104_rev10_conf: mmc1_iodelay_sdr104_rev10_conf {
+               pinctrl-pin-array = <
+                       0x620 A_DELAY_PS(560) G_DELAY_PS(365)   /* CFG_MMC1_CLK_OUT */
+                       0x62c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OUT */
+                       0x638 A_DELAY_PS(29) G_DELAY_PS(0)      /* CFG_MMC1_DAT0_OUT */
+                       0x644 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OUT */
+                       0x650 A_DELAY_PS(47) G_DELAY_PS(0)      /* CFG_MMC1_DAT2_OUT */
+                       0x65c A_DELAY_PS(30) G_DELAY_PS(0)      /* CFG_MMC1_DAT3_OUT */
+                       0x628 A_DELAY_PS(125) G_DELAY_PS(0)     /* CFG_MMC1_CMD_OEN */
+                       0x634 A_DELAY_PS(43) G_DELAY_PS(0)      /* CFG_MMC1_DAT0_OEN */
+                       0x640 A_DELAY_PS(433) G_DELAY_PS(0)     /* CFG_MMC1_DAT1_OEN */
+                       0x64c A_DELAY_PS(287) G_DELAY_PS(0)     /* CFG_MMC1_DAT2_OEN */
+                       0x658 A_DELAY_PS(351) G_DELAY_PS(0)     /* CFG_MMC1_DAT3_OEN */
+               >;
+       };
+
+       /* Corresponds to MMC1_MANUAL2 in datamanual */
+       mmc1_iodelay_sdr104_rev20_conf: mmc1_iodelay_sdr104_rev20_conf {
+               pinctrl-pin-array = <
+                       0x620 A_DELAY_PS(520) G_DELAY_PS(320)   /* CFG_MMC1_CLK_OUT */
+                       0x62c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OUT */
+                       0x638 A_DELAY_PS(40) G_DELAY_PS(0)      /* CFG_MMC1_DAT0_OUT */
+                       0x644 A_DELAY_PS(83) G_DELAY_PS(0)      /* CFG_MMC1_DAT1_OUT */
+                       0x650 A_DELAY_PS(98) G_DELAY_PS(0)      /* CFG_MMC1_DAT2_OUT */
+                       0x65c A_DELAY_PS(106) G_DELAY_PS(0)     /* CFG_MMC1_DAT3_OUT */
+                       0x628 A_DELAY_PS(51) G_DELAY_PS(0)      /* CFG_MMC1_CMD_OEN */
+                       0x634 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT0_OEN */
+                       0x640 A_DELAY_PS(363) G_DELAY_PS(0)     /* CFG_MMC1_DAT1_OEN */
+                       0x64c A_DELAY_PS(199) G_DELAY_PS(0)     /* CFG_MMC1_DAT2_OEN */
+                       0x658 A_DELAY_PS(273) G_DELAY_PS(0)     /* CFG_MMC1_DAT3_OEN */
+               >;
+       };
+
+       /* Corresponds to MMC2_MANUAL1 in datamanual */
+       mmc2_iodelay_ddr_conf: mmc2_iodelay_ddr_conf {
+               pinctrl-pin-array = <
+                       0x18c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A19_IN */
+                       0x1a4 A_DELAY_PS(119) G_DELAY_PS(0)     /* CFG_GPMC_A20_IN */
+                       0x1b0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A21_IN */
+                       0x1bc A_DELAY_PS(18) G_DELAY_PS(0)      /* CFG_GPMC_A22_IN */
+                       0x1c8 A_DELAY_PS(894) G_DELAY_PS(0)     /* CFG_GPMC_A23_IN */
+                       0x1d4 A_DELAY_PS(30) G_DELAY_PS(0)      /* CFG_GPMC_A24_IN */
+                       0x1e0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_IN */
+                       0x1ec A_DELAY_PS(23) G_DELAY_PS(0)      /* CFG_GPMC_A26_IN */
+                       0x1f8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_IN */
+                       0x360 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_CS1_IN */
+                       0x194 A_DELAY_PS(152) G_DELAY_PS(0)     /* CFG_GPMC_A19_OUT */
+                       0x1ac A_DELAY_PS(206) G_DELAY_PS(0)     /* CFG_GPMC_A20_OUT */
+                       0x1b8 A_DELAY_PS(78) G_DELAY_PS(0)      /* CFG_GPMC_A21_OUT */
+                       0x1c4 A_DELAY_PS(2) G_DELAY_PS(0)       /* CFG_GPMC_A22_OUT */
+                       0x1d0 A_DELAY_PS(266) G_DELAY_PS(0)     /* CFG_GPMC_A23_OUT */
+                       0x1dc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A24_OUT */
+                       0x1e8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_OUT */
+                       0x1f4 A_DELAY_PS(43) G_DELAY_PS(0)      /* CFG_GPMC_A26_OUT */
+                       0x200 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OUT */
+                       0x368 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_CS1_OUT */
+                       0x190 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A19_OEN */
+                       0x1a8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A20_OEN */
+                       0x1b4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A21_OEN */
+                       0x1c0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A22_OEN */
+                       0x1d8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A24_OEN */
+                       0x1e4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_OEN */
+                       0x1f0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A26_OEN */
+                       0x1fc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OEN */
+                       0x364 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_CS1_OEN */
+               >;
+       };
+
+       /* Corresponds to MMC2_MANUAL3 in datamanual */
+       mmc2_iodelay_hs200_rev10_conf: mmc2_iodelay_hs200_rev10_conf {
+               pinctrl-pin-array = <
+                       0x194 A_DELAY_PS(150) G_DELAY_PS(95)    /* CFG_GPMC_A19_OUT */
+                       0x1ac A_DELAY_PS(250) G_DELAY_PS(0)     /* CFG_GPMC_A20_OUT */
+                       0x1b8 A_DELAY_PS(125) G_DELAY_PS(0)     /* CFG_GPMC_A21_OUT */
+                       0x1c4 A_DELAY_PS(100) G_DELAY_PS(0)     /* CFG_GPMC_A22_OUT */
+                       0x1d0 A_DELAY_PS(870) G_DELAY_PS(415)   /* CFG_GPMC_A23_OUT */
+                       0x1dc A_DELAY_PS(30) G_DELAY_PS(0)      /* CFG_GPMC_A24_OUT */
+                       0x1e8 A_DELAY_PS(200) G_DELAY_PS(0)     /* CFG_GPMC_A25_OUT */
+                       0x1f4 A_DELAY_PS(200) G_DELAY_PS(0)     /* CFG_GPMC_A26_OUT */
+                       0x200 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OUT */
+                       0x368 A_DELAY_PS(240) G_DELAY_PS(0)     /* CFG_GPMC_CS1_OUT */
+                       0x190 A_DELAY_PS(695) G_DELAY_PS(0)     /* CFG_GPMC_A19_OEN */
+                       0x1a8 A_DELAY_PS(924) G_DELAY_PS(0)     /* CFG_GPMC_A20_OEN */
+                       0x1b4 A_DELAY_PS(719) G_DELAY_PS(0)     /* CFG_GPMC_A21_OEN */
+                       0x1c0 A_DELAY_PS(824) G_DELAY_PS(0)     /* CFG_GPMC_A22_OEN */
+                       0x1d8 A_DELAY_PS(877) G_DELAY_PS(0)     /* CFG_GPMC_A24_OEN */
+                       0x1e4 A_DELAY_PS(446) G_DELAY_PS(0)     /* CFG_GPMC_A25_OEN */
+                       0x1f0 A_DELAY_PS(847) G_DELAY_PS(0)     /* CFG_GPMC_A26_OEN */
+                       0x1fc A_DELAY_PS(586) G_DELAY_PS(0)     /* CFG_GPMC_A27_OEN */
+                       0x364 A_DELAY_PS(1039) G_DELAY_PS(0)    /* CFG_GPMC_CS1_OEN */
+               >;
+       };
+
+       /* Corresponds to MMC2_MANUAL3 in datamanual */
+       mmc2_iodelay_hs200_rev20_conf: mmc2_iodelay_hs200_rev20_conf {
+               pinctrl-pin-array = <
+                       0x194 A_DELAY_PS(285) G_DELAY_PS(0)     /* CFG_GPMC_A19_OUT */
+                       0x1ac A_DELAY_PS(189) G_DELAY_PS(0)     /* CFG_GPMC_A20_OUT */
+                       0x1b8 A_DELAY_PS(0) G_DELAY_PS(120)     /* CFG_GPMC_A21_OUT */
+                       0x1c4 A_DELAY_PS(0) G_DELAY_PS(70)      /* CFG_GPMC_A22_OUT */
+                       0x1d0 A_DELAY_PS(730) G_DELAY_PS(360)   /* CFG_GPMC_A23_OUT */
+                       0x1dc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A24_OUT */
+                       0x1e8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_OUT */
+                       0x1f4 A_DELAY_PS(70) G_DELAY_PS(0)      /* CFG_GPMC_A26_OUT */
+                       0x200 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OUT */
+                       0x368 A_DELAY_PS(0) G_DELAY_PS(120)     /* CFG_GPMC_CS1_OUT */
+                       0x190 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A19_OEN */
+                       0x1a8 A_DELAY_PS(231) G_DELAY_PS(0)     /* CFG_GPMC_A20_OEN */
+                       0x1b4 A_DELAY_PS(39) G_DELAY_PS(0)      /* CFG_GPMC_A21_OEN */
+                       0x1c0 A_DELAY_PS(91) G_DELAY_PS(0)      /* CFG_GPMC_A22_OEN */
+                       0x1d8 A_DELAY_PS(176) G_DELAY_PS(0)     /* CFG_GPMC_A24_OEN */
+                       0x1e4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_OEN */
+                       0x1f0 A_DELAY_PS(101) G_DELAY_PS(0)     /* CFG_GPMC_A26_OEN */
+                       0x1fc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OEN */
+                       0x364 A_DELAY_PS(360) G_DELAY_PS(0)     /* CFG_GPMC_CS1_OEN */
+               >;
+       };
+};
index eaca143faa7750c24c62c4fe6bebf58eed67fa48..67107605fb4c1067ef131073bb94222d7ef5dc9c 100644 (file)
 / {
        compatible = "ti,dra722", "ti,dra72", "ti,dra7";
 
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               cpu0: cpu@0 {
-                       device_type = "cpu";
-                       compatible = "arm,cortex-a15";
-                       reg = <0>;
-
-                       /* cooling options */
-                       cooling-min-level = <0>;
-                       cooling-max-level = <2>;
-                       #cooling-cells = <2>; /* min followed by max */
-               };
-       };
-
        pmu {
                compatible = "arm,cortex-a15-pmu";
                interrupt-parent = <&wakeupgen>;
                 <&dss_video1_clk>;
        clock-names = "fck", "video1_clk";
 };
+
+&mailbox5 {
+       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+               ti,mbox-tx = <6 2 2>;
+               ti,mbox-rx = <4 2 2>;
+               status = "disabled";
+       };
+       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+               ti,mbox-tx = <5 2 2>;
+               ti,mbox-rx = <1 2 2>;
+               status = "disabled";
+       };
+};
+
+&mailbox6 {
+       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+               ti,mbox-tx = <6 2 2>;
+               ti,mbox-rx = <4 2 2>;
+               status = "disabled";
+       };
+};
diff --git a/arch/arm/dts/dra74x-mmc-iodelay.dtsi b/arch/arm/dts/dra74x-mmc-iodelay.dtsi
new file mode 100644 (file)
index 0000000..28ebb4e
--- /dev/null
@@ -0,0 +1,647 @@
+/*
+ * MMC IOdelay values for TI's DRA74x, DRA75x and AM572x SoCs.
+ *
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+/*
+ * Rules for modifying this file:
+ * a) Update of this file should typically correspond to a datamanual revision.
+ *    Datamanual revision that was used should be updated in comment below.
+ *    If there is no update to datamanual, do not update the values. If you
+ *    need to use values different from that recommended by the datamanual
+ *    for your design, then you should consider adding values to the device-
+ *    -tree file for your board directly.
+ * b) We keep the mode names as close to the datamanual as possible. So
+ *    if the manual calls a mode, DDR50, or DDR or DDR 1.8v or DDR 3.3v,
+ *    we follow that in code too.
+ * c) If the values change between multiple revisions of silicon, we add
+ *    a revision tag to both the new and old entry. Use 'rev11' for PG 1.1,
+ *    'rev20' for PG 2.0 and so on.
+ * d) The node name and node label should be the exact same string. This is
+ *    to curb naming creativity and achieve consistency.
+ *
+ * Datamanual Revisions:
+ *
+ * AM572x Silicon Revision 2.0: SPRS953B, Revised November 2016
+ * AM572x Silicon Revision 1.1: SPRS915R, Revised November 2016
+ *
+ */
+
+&dra7_pmx_core {
+       mmc1_pins_default: mmc1_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr12: mmc1_pins_sdr12 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_hs: mmc1_pins_hs {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr25: mmc1_pins_sdr25 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0)    /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0)    /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0)    /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0)    /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0)    /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE11 | MUX_MODE0)    /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr50: mmc1_pins_sdr50 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0)    /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0)    /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0)    /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0)    /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0)    /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_VIRTUAL_MODE10 | MUX_MODE0)    /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_ddr50: mmc1_pins_ddr50 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr104: mmc1_pins_sdr104 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)   /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc2_pins_default: mmc2_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc2_pins_hs: mmc2_pins_hs {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc2_pins_ddr_3_3v_rev11: mmc2_pins_ddr_3_3v_rev11 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc2_pins_ddr_1_8v_rev11: mmc2_pins_ddr_1_8v_rev11 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc2_pins_ddr_rev20: mmc2_pins_ddr_rev20 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc2_pins_hs200: mmc2_pins_hs200 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+
+       mmc4_pins_default: mmc4_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_ctsn.mmc4_clk */
+                       DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_rtsn.mmc4_cmd */
+                       DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rxd.mmc4_dat0 */
+                       DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_txd.mmc4_dat1 */
+                       DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_ctsn.mmc4_dat2 */
+                       DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rtsn.mmc4_dat3 */
+               >;
+       };
+
+       mmc4_pins_hs: mmc4_pins_hs {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_ctsn.mmc4_clk */
+                       DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_rtsn.mmc4_cmd */
+                       DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rxd.mmc4_dat0 */
+                       DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_txd.mmc4_dat1 */
+                       DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_ctsn.mmc4_dat2 */
+                       DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rtsn.mmc4_dat3 */
+               >;
+       };
+
+       mmc3_pins_default: mmc3_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+                       DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+                       DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+                       DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+                       DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+                       DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+               >;
+       };
+
+       mmc3_pins_hs: mmc3_pins_hs {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+                       DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+                       DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+                       DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+                       DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+                       DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+               >;
+       };
+
+       mmc3_pins_sdr12: mmc3_pins_sdr12 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+                       DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+                       DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+                       DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+                       DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+                       DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+               >;
+       };
+
+       mmc3_pins_sdr25: mmc3_pins_sdr25 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+                       DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+                       DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+                       DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+                       DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+                       DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+               >;
+       };
+
+       mmc3_pins_sdr50: mmc3_pins_sdr50 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x377c, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_clk.mmc3_clk */
+                       DRA7XX_CORE_IOPAD(0x3780, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_cmd.mmc3_cmd */
+                       DRA7XX_CORE_IOPAD(0x3784, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_dat0.mmc3_dat0 */
+                       DRA7XX_CORE_IOPAD(0x3788, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_dat1.mmc3_dat1 */
+                       DRA7XX_CORE_IOPAD(0x378c, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_dat2.mmc3_dat2 */
+                       DRA7XX_CORE_IOPAD(0x3790, (PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE0)) /* mmc3_dat3.mmc3_dat3 */
+               >;
+       };
+
+       mmc4_pins_sdr12: mmc4_pins_sdr12 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_ctsn.mmc4_clk */
+                       DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_rtsn.mmc4_cmd */
+                       DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rxd.mmc4_dat0 */
+                       DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_txd.mmc4_dat1 */
+                       DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_ctsn.mmc4_dat2 */
+                       DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rtsn.mmc4_dat3 */
+               >;
+       };
+
+       mmc4_pins_sdr25: mmc4_pins_sdr25 {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x37e8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_ctsn.mmc4_clk */
+                       DRA7XX_CORE_IOPAD(0x37ec, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart1_rtsn.mmc4_cmd */
+                       DRA7XX_CORE_IOPAD(0x37f0, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rxd.mmc4_dat0 */
+                       DRA7XX_CORE_IOPAD(0x37f4, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_txd.mmc4_dat1 */
+                       DRA7XX_CORE_IOPAD(0x37f8, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_ctsn.mmc4_dat2 */
+                       DRA7XX_CORE_IOPAD(0x37fc, PIN_INPUT_PULLUP | MODE_SELECT | MUX_MODE3) /* uart2_rtsn.mmc4_dat3 */
+               >;
+       };
+};
+
+&dra7_iodelay_core {
+
+       /* Corresponds to MMC1_DDR_MANUAL1 in datamanual */
+       mmc1_iodelay_ddr_rev11_conf: mmc1_iodelay_ddr_rev11_conf {
+               pinctrl-pin-array = <
+                       0x618 A_DELAY_PS(572) G_DELAY_PS(540)   /* CFG_MMC1_CLK_IN */
+                       0x620 A_DELAY_PS(1525) G_DELAY_PS(0)    /* CFG_MMC1_CLK_OUT */
+                       0x624 A_DELAY_PS(0) G_DELAY_PS(600)     /* CFG_MMC1_CMD_IN */
+                       0x628 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OEN */
+                       0x62c A_DELAY_PS(55) G_DELAY_PS(0)      /* CFG_MMC1_CMD_OUT */
+                       0x630 A_DELAY_PS(403) G_DELAY_PS(120)   /* CFG_MMC1_DAT0_IN */
+                       0x634 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT0_OEN */
+                       0x638 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT0_OUT */
+                       0x63c A_DELAY_PS(23) G_DELAY_PS(60)     /* CFG_MMC1_DAT1_IN */
+                       0x640 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OEN */
+                       0x644 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OUT */
+                       0x648 A_DELAY_PS(25) G_DELAY_PS(60)     /* CFG_MMC1_DAT2_IN */
+                       0x64c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OEN */
+                       0x650 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OUT */
+                       0x654 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_IN */
+                       0x658 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OEN */
+                       0x65c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC1_DDR_MANUAL1 in datamanual */
+       mmc1_iodelay_ddr_rev20_conf: mmc1_iodelay_ddr50_rev20_conf {
+               pinctrl-pin-array = <
+                       0x618 A_DELAY_PS(1076) G_DELAY_PS(330)  /* CFG_MMC1_CLK_IN */
+                       0x620 A_DELAY_PS(1271) G_DELAY_PS(0)    /* CFG_MMC1_CLK_OUT */
+                       0x624 A_DELAY_PS(722) G_DELAY_PS(0)     /* CFG_MMC1_CMD_IN */
+                       0x628 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OEN */
+                       0x62C A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OUT */
+                       0x630 A_DELAY_PS(751) G_DELAY_PS(0)     /* CFG_MMC1_DAT0_IN */
+                       0x634 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT0_OEN */
+                       0x638 A_DELAY_PS(20) G_DELAY_PS(0)      /* CFG_MMC1_DAT0_OUT */
+                       0x63C A_DELAY_PS(256) G_DELAY_PS(0)     /* CFG_MMC1_DAT1_IN */
+                       0x640 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OEN */
+                       0x644 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OUT */
+                       0x648 A_DELAY_PS(263) G_DELAY_PS(0)     /* CFG_MMC1_DAT2_IN */
+                       0x64C A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OEN */
+                       0x650 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OUT */
+                       0x654 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_IN */
+                       0x658 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OEN */
+                       0x65C A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC1_SDR104_MANUAL1 in datamanual */
+       mmc1_iodelay_sdr104_rev11_conf: mmc1_iodelay_sdr104_rev11_conf {
+               pinctrl-pin-array = <
+                       0x620 A_DELAY_PS(1063) G_DELAY_PS(17)   /* CFG_MMC1_CLK_OUT */
+                       0x628 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OEN */
+                       0x62c A_DELAY_PS(23) G_DELAY_PS(0)      /* CFG_MMC1_CMD_OUT */
+                       0x634 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT0_OEN */
+                       0x638 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT0_OUT */
+                       0x640 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OEN */
+                       0x644 A_DELAY_PS(2) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OUT */
+                       0x64c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OEN */
+                       0x650 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OUT */
+                       0x658 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OEN */
+                       0x65c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC1_SDR104_MANUAL1 in datamanual */
+       mmc1_iodelay_sdr104_rev20_conf: mmc1_iodelay_sdr104_rev20_conf {
+               pinctrl-pin-array = <
+                       0x620 A_DELAY_PS(600) G_DELAY_PS(400)   /* CFG_MMC1_CLK_OUT */
+                       0x628 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OEN */
+                       0x62c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_CMD_OUT */
+                       0x634 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT0_OEN */
+                       0x638 A_DELAY_PS(30) G_DELAY_PS(0)      /* CFG_MMC1_DAT0_OUT */
+                       0x640 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OEN */
+                       0x644 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT1_OUT */
+                       0x64c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OEN */
+                       0x650 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT2_OUT */
+                       0x658 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OEN */
+                       0x65c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC1_DAT3_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC2_HS200_MANUAL1 in datamanual */
+       mmc2_iodelay_hs200_rev11_conf: mmc2_iodelay_hs200_rev11_conf {
+               pinctrl-pin-array = <
+                       0x190 A_DELAY_PS(621) G_DELAY_PS(600)   /* CFG_GPMC_A19_OEN */
+                       0x194 A_DELAY_PS(300) G_DELAY_PS(0)     /* CFG_GPMC_A19_OUT */
+                       0x1a8 A_DELAY_PS(739) G_DELAY_PS(600)   /* CFG_GPMC_A20_OEN */
+                       0x1ac A_DELAY_PS(240) G_DELAY_PS(0)     /* CFG_GPMC_A20_OUT */
+                       0x1b4 A_DELAY_PS(812) G_DELAY_PS(600)   /* CFG_GPMC_A21_OEN */
+                       0x1b8 A_DELAY_PS(240) G_DELAY_PS(0)     /* CFG_GPMC_A21_OUT */
+                       0x1c0 A_DELAY_PS(954) G_DELAY_PS(600)   /* CFG_GPMC_A22_OEN */
+                       0x1c4 A_DELAY_PS(60)  G_DELAY_PS(0)     /* CFG_GPMC_A22_OUT */
+                       0x1d0 A_DELAY_PS(1340) G_DELAY_PS(420)  /* CFG_GPMC_A23_OUT */
+                       0x1d8 A_DELAY_PS(935) G_DELAY_PS(600)   /* CFG_GPMC_A24_OEN */
+                       0x1dc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A24_OUT */
+                       0x1e4 A_DELAY_PS(525) G_DELAY_PS(600)   /* CFG_GPMC_A25_OEN */
+                       0x1e8 A_DELAY_PS(120) G_DELAY_PS(0)     /* CFG_GPMC_A25_OUT */
+                       0x1f0 A_DELAY_PS(767) G_DELAY_PS(600)   /* CFG_GPMC_A26_OEN */
+                       0x1f4 A_DELAY_PS(225) G_DELAY_PS(0)     /* CFG_GPMC_A26_OUT */
+                       0x1fc A_DELAY_PS(565) G_DELAY_PS(600)   /* CFG_GPMC_A27_OEN */
+                       0x200 A_DELAY_PS(60) G_DELAY_PS(0)      /* CFG_GPMC_A27_OUT */
+                       0x364 A_DELAY_PS(969) G_DELAY_PS(600)   /* CFG_GPMC_CS1_OEN */
+                       0x368 A_DELAY_PS(180) G_DELAY_PS(0)     /* CFG_GPMC_CS1_OUT */
+             >;
+       };
+
+       /* Corresponds to MMC2_HS200_MANUAL1 in datamanual */
+       mmc2_iodelay_hs200_rev20_conf: mmc2_iodelay_hs200_rev20_conf {
+               pinctrl-pin-array = <
+                       0x190 A_DELAY_PS(274) G_DELAY_PS(0)       /* CFG_GPMC_A19_OEN */
+                       0x194 A_DELAY_PS(162) G_DELAY_PS(0)       /* CFG_GPMC_A19_OUT */
+                       0x1a8 A_DELAY_PS(401) G_DELAY_PS(0)       /* CFG_GPMC_A20_OEN */
+                       0x1ac A_DELAY_PS(73) G_DELAY_PS(0)        /* CFG_GPMC_A20_OUT */
+                       0x1b4 A_DELAY_PS(465) G_DELAY_PS(0)       /* CFG_GPMC_A21_OEN */
+                       0x1b8 A_DELAY_PS(115) G_DELAY_PS(0)       /* CFG_GPMC_A21_OUT */
+                       0x1c0 A_DELAY_PS(633) G_DELAY_PS(0)       /* CFG_GPMC_A22_OEN */
+                       0x1c4 A_DELAY_PS(47) G_DELAY_PS(0)        /* CFG_GPMC_A22_OUT */
+                       0x1d0 A_DELAY_PS(935) G_DELAY_PS(280)     /* CFG_GPMC_A23_OUT */
+                       0x1d8 A_DELAY_PS(621) G_DELAY_PS(0)       /* CFG_GPMC_A24_OEN */
+                       0x1dc A_DELAY_PS(0) G_DELAY_PS(0)         /* CFG_GPMC_A24_OUT */
+                       0x1e4 A_DELAY_PS(183) G_DELAY_PS(0)       /* CFG_GPMC_A25_OEN */
+                       0x1e8 A_DELAY_PS(0) G_DELAY_PS(0)         /* CFG_GPMC_A25_OUT */
+                       0x1f0 A_DELAY_PS(467) G_DELAY_PS(0)       /* CFG_GPMC_A26_OEN */
+                       0x1f4 A_DELAY_PS(0) G_DELAY_PS(0)         /* CFG_GPMC_A26_OUT */
+                       0x1fc A_DELAY_PS(262) G_DELAY_PS(0)       /* CFG_GPMC_A27_OEN */
+                       0x200 A_DELAY_PS(46) G_DELAY_PS(0)        /* CFG_GPMC_A27_OUT */
+                       0x364 A_DELAY_PS(684) G_DELAY_PS(0)       /* CFG_GPMC_CS1_OEN */
+                       0x368 A_DELAY_PS(76) G_DELAY_PS(0)        /* CFG_GPMC_CS1_OUT */
+             >;
+       };
+
+       /* Correspnds to MMC2_DDR_3V3_MANUAL1 in datamanual */
+       mmc2_iodelay_ddr_3_3v_rev11_conf: mmc2_iodelay_ddr_3_3v_rev11_conf {
+               pinctrl-pin-array = <
+                       0x18c A_DELAY_PS(0) G_DELAY_PS(120)     /* CFG_GPMC_A19_IN */
+                       0x190 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A19_OEN */
+                       0x194 A_DELAY_PS(174) G_DELAY_PS(0)     /* CFG_GPMC_A19_OUT */
+                       0x1a4 A_DELAY_PS(265) G_DELAY_PS(360)   /* CFG_GPMC_A20_IN */
+                       0x1a8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A20_OEN */
+                       0x1ac A_DELAY_PS(168) G_DELAY_PS(0)     /* CFG_GPMC_A20_OUT */
+                       0x1b0 A_DELAY_PS(0) G_DELAY_PS(120)     /* CFG_GPMC_A21_IN */
+                       0x1b4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A21_OEN */
+                       0x1b8 A_DELAY_PS(136) G_DELAY_PS(0)     /* CFG_GPMC_A21_OUT */
+                       0x1bc A_DELAY_PS(0) G_DELAY_PS(120)     /* CFG_GPMC_A22_IN */
+                       0x1c0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A22_OEN */
+                       0x1c4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A22_OUT */
+                       0x1c8 A_DELAY_PS(287) G_DELAY_PS(420)   /* CFG_GPMC_A23_IN */
+                       0x1d0 A_DELAY_PS(879) G_DELAY_PS(0)     /* CFG_GPMC_A23_OUT */
+                       0x1d4 A_DELAY_PS(144) G_DELAY_PS(240)   /* CFG_GPMC_A24_IN */
+                       0x1d8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A24_OEN */
+                       0x1dc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A24_OUT */
+                       0x1e0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_IN */
+                       0x1e4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_OEN */
+                       0x1e8 A_DELAY_PS(34) G_DELAY_PS(0)      /* CFG_GPMC_A25_OUT */
+                       0x1ec A_DELAY_PS(0) G_DELAY_PS(120)     /* CFG_GPMC_A26_IN */
+                       0x1f0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A26_OEN */
+                       0x1f4 A_DELAY_PS(120) G_DELAY_PS(0)     /* CFG_GPMC_A26_OUT */
+                       0x1f8 A_DELAY_PS(120) G_DELAY_PS(180)   /* CFG_GPMC_A27_IN */
+                       0x1fc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OEN */
+                       0x200 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OUT */
+                       0x360 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_CS1_IN */
+                       0x364 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_CS1_OEN */
+                       0x368 A_DELAY_PS(11) G_DELAY_PS(0)      /* CFG_GPMC_CS1_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC2_DDR_1V8_MANUAL1 in datamanual */
+       mmc2_iodelay_ddr_1_8v_rev11_conf: mmc2_iodelay_ddr_1_8v_rev11_conf {
+               pinctrl-pin-array = <
+                       0x18c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A19_IN */
+                       0x190 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A19_OEN */
+                       0x194 A_DELAY_PS(174) G_DELAY_PS(0)     /* CFG_GPMC_A19_OUT */
+                       0x1a4 A_DELAY_PS(274) G_DELAY_PS(240)   /* CFG_GPMC_A20_IN */
+                       0x1a8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A20_OEN */
+                       0x1ac A_DELAY_PS(168) G_DELAY_PS(0)     /* CFG_GPMC_A20_OUT */
+                       0x1b0 A_DELAY_PS(0) G_DELAY_PS(60)      /* CFG_GPMC_A21_IN */
+                       0x1b4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A21_OEN */
+                       0x1b8 A_DELAY_PS(136) G_DELAY_PS(0)     /* CFG_GPMC_A21_OUT */
+                       0x1bc A_DELAY_PS(0) G_DELAY_PS(60)      /* CFG_GPMC_A22_IN */
+                       0x1c0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A22_OEN */
+                       0x1c4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A22_OUT */
+                       0x1c8 A_DELAY_PS(514) G_DELAY_PS(360)   /* CFG_GPMC_A23_IN */
+                       0x1d0 A_DELAY_PS(879) G_DELAY_PS(0)     /* CFG_GPMC_A23_OUT */
+                       0x1d4 A_DELAY_PS(187) G_DELAY_PS(120)   /* CFG_GPMC_A24_IN */
+                       0x1d8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A24_OEN */
+                       0x1dc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A24_OUT */
+                       0x1e0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_IN */
+                       0x1e4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A25_OEN */
+                       0x1e8 A_DELAY_PS(34) G_DELAY_PS(0)      /* CFG_GPMC_A25_OUT */
+                       0x1ec A_DELAY_PS(0) G_DELAY_PS(60)      /* CFG_GPMC_A26_IN */
+                       0x1f0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A26_OEN */
+                       0x1f4 A_DELAY_PS(120) G_DELAY_PS(0)     /* CFG_GPMC_A26_OUT */
+                       0x1f8 A_DELAY_PS(121) G_DELAY_PS(60)    /* CFG_GPMC_A27_IN */
+                       0x1fc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OEN */
+                       0x200 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_A27_OUT */
+                       0x360 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_CS1_IN */
+                       0x364 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_GPMC_CS1_OEN */
+                       0x368 A_DELAY_PS(11) G_DELAY_PS(0)      /* CFG_GPMC_CS1_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC3_MANUAL1 in datamanual */
+       mmc3_iodelay_manual1_rev20_conf: mmc3_iodelay_manual1_conf {
+               pinctrl-pin-array = <
+                       0x678 A_DELAY_PS(0) G_DELAY_PS(386)     /* CFG_MMC3_CLK_IN */
+                       0x680 A_DELAY_PS(605) G_DELAY_PS(0)     /* CFG_MMC3_CLK_OUT */
+                       0x684 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_CMD_IN */
+                       0x688 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_CMD_OEN */
+                       0x68c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_CMD_OUT */
+                       0x690 A_DELAY_PS(171) G_DELAY_PS(0)     /* CFG_MMC3_DAT0_IN */
+                       0x694 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT0_OEN */
+                       0x698 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT0_OUT */
+                       0x69c A_DELAY_PS(221) G_DELAY_PS(0)     /* CFG_MMC3_DAT1_IN */
+                       0x6a0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT1_OEN */
+                       0x6a4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT1_OUT */
+                       0x6a8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT2_IN */
+                       0x6ac A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT2_OEN */
+                       0x6b0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT2_OUT */
+                       0x6b4 A_DELAY_PS(474) G_DELAY_PS(0)     /* CFG_MMC3_DAT3_IN */
+                       0x6b8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT3_OEN */
+                       0x6bc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT3_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC3_MANUAL1 in datamanual */
+       mmc3_iodelay_manual1_rev11_conf: mmc3_iodelay_manual1_conf {
+               pinctrl-pin-array = <
+                       0x678 A_DELAY_PS(406) G_DELAY_PS(0)     /* CFG_MMC3_CLK_IN */
+                       0x680 A_DELAY_PS(659) G_DELAY_PS(0)     /* CFG_MMC3_CLK_OUT */
+                       0x684 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_CMD_IN */
+                       0x688 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_CMD_OEN */
+                       0x68c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_CMD_OUT */
+                       0x690 A_DELAY_PS(130) G_DELAY_PS(0)     /* CFG_MMC3_DAT0_IN */
+                       0x694 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT0_OEN */
+                       0x698 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT0_OUT */
+                       0x69c A_DELAY_PS(169) G_DELAY_PS(0)     /* CFG_MMC3_DAT1_IN */
+                       0x6a0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT1_OEN */
+                       0x6a4 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT1_OUT */
+                       0x6a8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT2_IN */
+                       0x6ac A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT2_OEN */
+                       0x6b0 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT2_OUT */
+                       0x6b4 A_DELAY_PS(457) G_DELAY_PS(0)     /* CFG_MMC3_DAT3_IN */
+                       0x6b8 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT3_OEN */
+                       0x6bc A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_MMC3_DAT3_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC4_DS_MANUAL1 in datamanual */
+       mmc4_iodelay_ds_rev11_conf: mmc4_iodelay_ds_rev11_conf {
+               pinctrl-pin-array = <
+                       0x840 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_CTSN_IN */
+                       0x848 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_CTSN_OUT */
+                       0x84c A_DELAY_PS(96) G_DELAY_PS(0)      /* CFG_UART1_RTSN_IN */
+                       0x850 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_RTSN_OEN */
+                       0x854 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_RTSN_OUT */
+                       0x870 A_DELAY_PS(582) G_DELAY_PS(0)     /* CFG_UART2_CTSN_IN */
+                       0x874 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_CTSN_OEN */
+                       0x878 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_CTSN_OUT */
+                       0x87c A_DELAY_PS(391) G_DELAY_PS(0)     /* CFG_UART2_RTSN_IN */
+                       0x880 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RTSN_OEN */
+                       0x884 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RTSN_OUT */
+                       0x888 A_DELAY_PS(561) G_DELAY_PS(0)     /* CFG_UART2_RXD_IN */
+                       0x88c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RXD_OEN */
+                       0x890 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RXD_OUT */
+                       0x894 A_DELAY_PS(588) G_DELAY_PS(0)     /* CFG_UART2_TXD_IN */
+                       0x898 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_TXD_OEN */
+                       0x89c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_TXD_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC4_DS_MANUAL1 in datamanual */
+       mmc4_iodelay_ds_rev20_conf: mmc4_iodelay_ds_rev20_conf {
+               pinctrl-pin-array = <
+                       0x840 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_CTSN_IN */
+                       0x848 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_CTSN_OUT */
+                       0x84c A_DELAY_PS(307) G_DELAY_PS(0)     /* CFG_UART1_RTSN_IN */
+                       0x850 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_RTSN_OEN */
+                       0x854 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_RTSN_OUT */
+                       0x870 A_DELAY_PS(785) G_DELAY_PS(0)     /* CFG_UART2_CTSN_IN */
+                       0x874 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_CTSN_OEN */
+                       0x878 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_CTSN_OUT */
+                       0x87c A_DELAY_PS(613) G_DELAY_PS(0)     /* CFG_UART2_RTSN_IN */
+                       0x880 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RTSN_OEN */
+                       0x884 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RTSN_OUT */
+                       0x888 A_DELAY_PS(683) G_DELAY_PS(0)     /* CFG_UART2_RXD_IN */
+                       0x88c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RXD_OEN */
+                       0x890 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RXD_OUT */
+                       0x894 A_DELAY_PS(835) G_DELAY_PS(0)     /* CFG_UART2_TXD_IN */
+                       0x898 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_TXD_OEN */
+                       0x89c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_TXD_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC4_MANUAL1 in datamanual */
+       mmc4_iodelay_sdr12_hs_sdr25_rev11_conf: mmc4_iodelay_sdr12_hs_sdr25_rev11_conf {
+               pinctrl-pin-array = <
+                       0x840 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_CTSN_IN */
+                       0x848 A_DELAY_PS(2651) G_DELAY_PS(0)    /* CFG_UART1_CTSN_OUT */
+                       0x84c A_DELAY_PS(1572) G_DELAY_PS(0)    /* CFG_UART1_RTSN_IN */
+                       0x850 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_RTSN_OEN */
+                       0x854 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_RTSN_OUT */
+                       0x870 A_DELAY_PS(1913) G_DELAY_PS(0)    /* CFG_UART2_CTSN_IN */
+                       0x874 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_CTSN_OEN */
+                       0x878 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_CTSN_OUT */
+                       0x87c A_DELAY_PS(1721) G_DELAY_PS(0)    /* CFG_UART2_RTSN_IN */
+                       0x880 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RTSN_OEN */
+                       0x884 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RTSN_OUT */
+                       0x888 A_DELAY_PS(1891) G_DELAY_PS(0)    /* CFG_UART2_RXD_IN */
+                       0x88c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RXD_OEN */
+                       0x890 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RXD_OUT */
+                       0x894 A_DELAY_PS(1919) G_DELAY_PS(0)    /* CFG_UART2_TXD_IN */
+                       0x898 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_TXD_OEN */
+                       0x89c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_TXD_OUT */
+               >;
+       };
+
+       /* Corresponds to MMC4_MANUAL1 in datamanual */
+       mmc4_iodelay_sdr12_hs_sdr25_rev20_conf: mmc4_iodelay_sdr12_hs_sdr25_rev20_conf {
+               pinctrl-pin-array = <
+                       0x840 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_CTSN_IN */
+                       0x848 A_DELAY_PS(1147) G_DELAY_PS(0)    /* CFG_UART1_CTSN_OUT */
+                       0x84c A_DELAY_PS(1834) G_DELAY_PS(0)    /* CFG_UART1_RTSN_IN */
+                       0x850 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_RTSN_OEN */
+                       0x854 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART1_RTSN_OUT */
+                       0x870 A_DELAY_PS(2165) G_DELAY_PS(0)    /* CFG_UART2_CTSN_IN */
+                       0x874 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_CTSN_OEN */
+                       0x878 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_CTSN_OUT */
+                       0x87c A_DELAY_PS(1929) G_DELAY_PS(64)   /* CFG_UART2_RTSN_IN */
+                       0x880 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RTSN_OEN */
+                       0x884 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RTSN_OUT */
+                       0x888 A_DELAY_PS(1935) G_DELAY_PS(128)  /* CFG_UART2_RXD_IN */
+                       0x88c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RXD_OEN */
+                       0x890 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_RXD_OUT */
+                       0x894 A_DELAY_PS(2172) G_DELAY_PS(44)   /* CFG_UART2_TXD_IN */
+                       0x898 A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_TXD_OEN */
+                       0x89c A_DELAY_PS(0) G_DELAY_PS(0)       /* CFG_UART2_TXD_OUT */
+               >;
+       };
+};
index fa995d0ca1f209a1ef71c8ace158cb4450179983..24e6746c5b262602ac70f4935d23842ba8454fbe 100644 (file)
        compatible = "ti,dra742", "ti,dra74", "ti,dra7";
 
        cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               cpu0: cpu@0 {
-                       device_type = "cpu";
-                       compatible = "arm,cortex-a15";
-                       reg = <0>;
-
-                       operating-points = <
-                               /* kHz    uV */
-                               1000000 1060000
-                               1176000 1160000
-                               >;
-
-                       clocks = <&dpll_mpu_ck>;
-                       clock-names = "cpu";
-
-                       clock-latency = <300000>; /* From omap-cpufreq driver */
-
-                       /* cooling options */
-                       cooling-min-level = <0>;
-                       cooling-max-level = <2>;
-                       #cooling-cells = <2>; /* min followed by max */
-               };
                cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a15";
                        reg = <1>;
+                       operating-points-v2 = <&cpu0_opp_table>;
                };
        };
 
        };
 
        ocp {
+               dsp2_system: dsp_system@41500000 {
+                       compatible = "syscon";
+                       reg = <0x41500000 0x100>;
+               };
+
                omap_dwc3_4: omap_dwc3_4@48940000 {
                        compatible = "ti,dwc3";
                        ti,hwmods = "usb_otg_ss4";
                        usb4: usb@48950000 {
                                compatible = "snps,dwc3";
                                reg = <0x48950000 0x17000>;
-                               interrupts = <GIC_SPI 345 IRQ_TYPE_LEVEL_HIGH>;
-                               tx-fifo-resize;
+                               interrupts = <GIC_SPI 345 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 345 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 346 IRQ_TYPE_LEVEL_HIGH>;
+                               interrupt-names = "peripheral",
+                                                 "host",
+                                                 "otg";
                                maximum-speed = "high-speed";
                                dr_mode = "otg";
                        };
                };
+
+               mmu0_dsp2: mmu@41501000 {
+                       compatible = "ti,dra7-dsp-iommu";
+                       reg = <0x41501000 0x100>;
+                       interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>;
+                       ti,hwmods = "mmu0_dsp2";
+                       #iommu-cells = <0>;
+                       ti,syscon-mmuconfig = <&dsp2_system 0x0>;
+                       status = "disabled";
+               };
+
+               mmu1_dsp2: mmu@41502000 {
+                       compatible = "ti,dra7-dsp-iommu";
+                       reg = <0x41502000 0x100>;
+                       interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>;
+                       ti,hwmods = "mmu1_dsp2";
+                       #iommu-cells = <0>;
+                       ti,syscon-mmuconfig = <&dsp2_system 0x1>;
+                       status = "disabled";
+               };
        };
 };
 
+&cpu0_opp_table {
+       opp-shared;
+};
+
 &dss {
        reg = <0x58000000 0x80>,
              <0x58004054 0x4>,
              <0x58004300 0x20>,
-             <0x58005054 0x4>,
-             <0x58005300 0x20>;
+             <0x58009054 0x4>,
+             <0x58009300 0x20>;
        reg-names = "dss", "pll1_clkctrl", "pll1",
                    "pll2_clkctrl", "pll2";
 
                 <&dss_video2_clk>;
        clock-names = "fck", "video1_clk", "video2_clk";
 };
+
+&mailbox5 {
+       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+               ti,mbox-tx = <6 2 2>;
+               ti,mbox-rx = <4 2 2>;
+               status = "disabled";
+       };
+       mbox_dsp1_ipc3x: mbox_dsp1_ipc3x {
+               ti,mbox-tx = <5 2 2>;
+               ti,mbox-rx = <1 2 2>;
+               status = "disabled";
+       };
+};
+
+&mailbox6 {
+       mbox_ipu2_ipc3x: mbox_ipu2_ipc3x {
+               ti,mbox-tx = <6 2 2>;
+               ti,mbox-rx = <4 2 2>;
+               status = "disabled";
+       };
+       mbox_dsp2_ipc3x: mbox_dsp2_ipc3x {
+               ti,mbox-tx = <5 2 2>;
+               ti,mbox-rx = <1 2 2>;
+               status = "disabled";
+       };
+};
diff --git a/arch/arm/dts/dra76-evm-u-boot.dtsi b/arch/arm/dts/dra76-evm-u-boot.dtsi
new file mode 100644 (file)
index 0000000..b007f78
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "omap5-u-boot.dtsi"
+
+&cpsw_emac0 {
+       phy-handle = <&dp83867_0>;
+};
+
+&cpsw_emac1 {
+       phy-handle = <&dp83867_1>;
+};
diff --git a/arch/arm/dts/dra76-evm.dts b/arch/arm/dts/dra76-evm.dts
new file mode 100644 (file)
index 0000000..b024a65
--- /dev/null
@@ -0,0 +1,423 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+/dts-v1/;
+
+#include "dra76x.dtsi"
+#include "dra7-evm-common.dtsi"
+#include <dt-bindings/net/ti-dp83867.h>
+
+/ {
+       model = "TI DRA762 EVM";
+       compatible = "ti,dra76-evm", "ti,dra762", "ti,dra7";
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x80000000 0x0 0x80000000>;
+       };
+
+       vsys_12v0: fixedregulator-vsys12v0 {
+               /* main supply */
+               compatible = "regulator-fixed";
+               regulator-name = "vsys_12v0";
+               regulator-min-microvolt = <12000000>;
+               regulator-max-microvolt = <12000000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       vsys_5v0: fixedregulator-vsys5v0 {
+               /* Output of Cntlr B of TPS43351-Q1 on dra76-evm */
+               compatible = "regulator-fixed";
+               regulator-name = "vsys_5v0";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               vin-supply = <&vsys_12v0>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       vsys_3v3: fixedregulator-vsys3v3 {
+               /* Output of Cntlr A of TPS43351-Q1 on dra76-evm */
+               compatible = "regulator-fixed";
+               regulator-name = "vsys_3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&vsys_12v0>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       vio_3v3: fixedregulator-vio_3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "vio_3v3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&vsys_3v3>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       vio_3v3_sd: fixedregulator-sd {
+               compatible = "regulator-fixed";
+               regulator-name = "vio_3v3_sd";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&vio_3v3>;
+               enable-active-high;
+               gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
+       };
+
+       vio_1v8: fixedregulator-vio_1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "vio_1v8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&smps5_reg>;
+       };
+
+       vtt_fixed: fixedregulator-vtt {
+               compatible = "regulator-fixed";
+               regulator-name = "vtt_fixed";
+               regulator-min-microvolt = <1350000>;
+               regulator-max-microvolt = <1350000>;
+               vin-supply = <&vsys_3v3>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       aic_dvdd: fixedregulator-aic_dvdd {
+               /* TPS77018DBVT */
+               compatible = "regulator-fixed";
+               regulator-name = "aic_dvdd";
+               vin-supply = <&vio_3v3>;
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+       };
+};
+
+&dra7_pmx_core {
+       mmc1_pins_default: mmc1_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x376c, PIN_INPUT | MUX_MODE14)       /* mmc1sdcd.gpio219 */
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc1_pins_sdr12: pinmux_mmc1_sdr12_pins {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x3754, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_clk.clk */
+                       DRA7XX_CORE_IOPAD(0x3758, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_cmd.cmd */
+                       DRA7XX_CORE_IOPAD(0x375c, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat0.dat0 */
+                       DRA7XX_CORE_IOPAD(0x3760, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat1.dat1 */
+                       DRA7XX_CORE_IOPAD(0x3764, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat2.dat2 */
+                       DRA7XX_CORE_IOPAD(0x3768, PIN_INPUT_PULLUP | MUX_MODE0) /* mmc1_dat3.dat3 */
+               >;
+       };
+
+       mmc2_pins_default: mmc2_pins_default {
+               pinctrl-single,pins = <
+                       DRA7XX_CORE_IOPAD(0x349c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a23.mmc2_clk */
+                       DRA7XX_CORE_IOPAD(0x34b0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_cs1.mmc2_cmd */
+                       DRA7XX_CORE_IOPAD(0x34a0, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a24.mmc2_dat0 */
+                       DRA7XX_CORE_IOPAD(0x34a4, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a25.mmc2_dat1 */
+                       DRA7XX_CORE_IOPAD(0x34a8, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a26.mmc2_dat2 */
+                       DRA7XX_CORE_IOPAD(0x34ac, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a27.mmc2_dat3 */
+                       DRA7XX_CORE_IOPAD(0x348c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a19.mmc2_dat4 */
+                       DRA7XX_CORE_IOPAD(0x3490, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a20.mmc2_dat5 */
+                       DRA7XX_CORE_IOPAD(0x3494, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a21.mmc2_dat6 */
+                       DRA7XX_CORE_IOPAD(0x3498, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a22.mmc2_dat7 */
+               >;
+       };
+};
+
+&i2c1 {
+       status = "okay";
+       clock-frequency = <400000>;
+
+       tps65917: tps65917@58 {
+               compatible = "ti,tps65917";
+               reg = <0x58>;
+               ti,system-power-controller;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+
+               tps65917_pmic {
+                       compatible = "ti,tps65917-pmic";
+
+                       smps12-in-supply = <&vsys_3v3>;
+                       smps3-in-supply = <&vsys_3v3>;
+                       smps4-in-supply = <&vsys_3v3>;
+                       smps5-in-supply = <&vsys_3v3>;
+                       ldo1-in-supply = <&vsys_3v3>;
+                       ldo2-in-supply = <&vsys_3v3>;
+                       ldo3-in-supply = <&vsys_5v0>;
+                       ldo4-in-supply = <&vsys_5v0>;
+                       ldo5-in-supply = <&vsys_3v3>;
+
+                       tps65917_regulators: regulators {
+                               smps12_reg: smps12 {
+                                       /* VDD_DSPEVE */
+                                       regulator-name = "smps12";
+                                       regulator-min-microvolt = <850000>;
+                                       regulator-max-microvolt = <1250000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               smps3_reg: smps3 {
+                                       /* VDD_CORE */
+                                       regulator-name = "smps3";
+                                       regulator-min-microvolt = <850000>;
+                                       regulator-max-microvolt = <1250000>;
+                                       regulator-boot-on;
+                                       regulator-always-on;
+                               };
+
+                               smps4_reg: smps4 {
+                                       /* VDD_IVA */
+                                       regulator-name = "smps4";
+                                       regulator-min-microvolt = <850000>;
+                                       regulator-max-microvolt = <1250000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               smps5_reg: smps5 {
+                                       /* VDDS1V8 */
+                                       regulator-name = "smps5";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-boot-on;
+                                       regulator-always-on;
+                               };
+
+                               ldo1_reg: ldo1 {
+                                       /* LDO1_OUT --> VDA_PHY1_1V8  */
+                                       regulator-name = "ldo1";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                                       regulator-allow-bypass;
+                               };
+
+                               ldo2_reg: ldo2 {
+                                       /* LDO2_OUT --> VDA_PHY2_1V8 */
+                                       regulator-name = "ldo2";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-allow-bypass;
+                                       regulator-always-on;
+                               };
+
+                               ldo3_reg: ldo3 {
+                                       /* VDA_USB_3V3 */
+                                       regulator-name = "ldo3";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-boot-on;
+                                       regulator-always-on;
+                               };
+
+                               ldo5_reg: ldo5 {
+                                       /* VDDA_1V8_PLL */
+                                       regulator-name = "ldo5";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+
+                               ldo4_reg: ldo4 {
+                                       /* VDD_SDIO_DV */
+                                       regulator-name = "ldo4";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-boot-on;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+
+               tps65917_power_button {
+                       compatible = "ti,palmas-pwrbutton";
+                       interrupt-parent = <&tps65917>;
+                       interrupts = <1 IRQ_TYPE_NONE>;
+                       wakeup-source;
+                       ti,palmas-long-press-seconds = <6>;
+               };
+       };
+
+       lp87565: lp87565@60 {
+               compatible = "ti,lp87565-q1";
+               reg = <0x60>;
+
+               buck10-in-supply =<&vsys_3v3>;
+               buck23-in-supply =<&vsys_3v3>;
+
+               regulators: regulators {
+                       buck10_reg: buck10 {
+                               /*VDD_MPU*/
+                               regulator-name = "buck10";
+                               regulator-min-microvolt = <850000>;
+                               regulator-max-microvolt = <1250000>;
+                               regulator-always-on;
+                               regulator-boot-on;
+                       };
+
+                       buck23_reg: buck23 {
+                               /* VDD_GPU*/
+                               regulator-name = "buck23";
+                               regulator-min-microvolt = <850000>;
+                               regulator-max-microvolt = <1250000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+
+       pcf_lcd: pcf8757@20 {
+               compatible = "ti,pcf8575", "nxp,pcf8575";
+               reg = <0x20>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
+       };
+
+       pcf_gpio_21: pcf8757@21 {
+               compatible = "ti,pcf8575", "nxp,pcf8575";
+               reg = <0x21>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+       };
+
+       pcf_hdmi: pcf8575@26 {
+               compatible = "ti,pcf8575", "nxp,pcf8575";
+               reg = <0x26>;
+               gpio-controller;
+               #gpio-cells = <2>;
+               p1 {
+                       /* vin6_sel_s0: high: VIN6, low: audio */
+                       gpio-hog;
+                       gpios = <1 GPIO_ACTIVE_HIGH>;
+                       output-low;
+                       line-name = "vin6_sel_s0";
+               };
+       };
+
+       tlv320aic3106: tlv320aic3106@19 {
+               #sound-dai-cells = <0>;
+               compatible = "ti,tlv320aic3106";
+               reg = <0x19>;
+               adc-settle-ms = <40>;
+               ai3x-micbias-vg = <1>;          /* 2.0V */
+               status = "okay";
+
+               /* Regulators */
+               AVDD-supply = <&vio_3v3>;
+               IOVDD-supply = <&vio_3v3>;
+               DRVDD-supply = <&vio_3v3>;
+               DVDD-supply = <&aic_dvdd>;
+       };
+};
+
+&cpu0 {
+       vdd-supply = <&buck10_reg>;
+};
+
+&mmc1 {
+       status = "okay";
+       vmmc-supply = <&vio_3v3_sd>;
+       vmmc_aux-supply = <&ldo4_reg>;
+       bus-width = <4>;
+       /*
+        * SDCD signal is not being used here - using the fact that GPIO mode
+        * is always hardwired.
+        */
+       cd-gpios = <&gpio6 27 GPIO_ACTIVE_LOW>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc1_pins_default>;
+};
+
+&mmc2 {
+       status = "okay";
+       vmmc-supply = <&vio_1v8>;
+       bus-width = <8>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&mmc2_pins_default>;
+};
+
+/* No RTC on this device */
+&rtc {
+       status = "disabled";
+};
+
+&mac {
+       status = "okay";
+
+       dual_emac;
+};
+
+&cpsw_emac0 {
+       phy_id = <&davinci_mdio>, <2>;
+       phy-mode = "rgmii-id";
+       dual_emac_res_vlan = <1>;
+};
+
+&cpsw_emac1 {
+       phy_id = <&davinci_mdio>, <3>;
+       phy-mode = "rgmii-id";
+       dual_emac_res_vlan = <2>;
+};
+
+&davinci_mdio {
+       dp83867_0: ethernet-phy@2 {
+               reg = <2>;
+               ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
+               ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
+               ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
+               ti,min-output-impedance;
+               ti,dp83867-rxctrl-strap-quirk;
+       };
+
+       dp83867_1: ethernet-phy@3 {
+               reg = <3>;
+               ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
+               ti,tx-internal-delay = <DP83867_RGMIIDCTL_250_PS>;
+               ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_8_B_NIB>;
+               ti,min-output-impedance;
+               ti,dp83867-rxctrl-strap-quirk;
+       };
+};
+
+&usb2_phy1 {
+       phy-supply = <&ldo3_reg>;
+};
+
+&usb2_phy2 {
+       phy-supply = <&ldo3_reg>;
+};
+
+&qspi {
+       spi-max-frequency = <96000000>;
+       m25p80@0 {
+               spi-max-frequency = <96000000>;
+       };
+};
diff --git a/arch/arm/dts/dra76x.dtsi b/arch/arm/dts/dra76x.dtsi
new file mode 100644 (file)
index 0000000..1c88c58
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "dra74x.dtsi"
+
+/ {
+       compatible = "ti,dra762", "ti,dra7";
+
+};
+
+/* MCAN interrupts are hard-wired to irqs 67, 68 */
+&crossbar_mpu {
+       ti,irqs-skip = <10 67 68 133 139 140>;
+};
index 3330738e4c6e1064a9f34fc5f78a1adfb58cd6f4..cf229dfabf6173872d23ea380a436109b5424caf 100644 (file)
                compatible = "ti,omap4-dpll-clock";
                clocks = <&sys_clkin1>, <&dpll_dsp_byp_mux>;
                reg = <0x0234>, <0x0238>, <0x0240>, <0x023c>;
+               assigned-clocks = <&dpll_dsp_ck>;
+               assigned-clock-rates = <600000000>;
        };
 
        dpll_dsp_m2_ck: dpll_dsp_m2_ck@244 {
                reg = <0x0244>;
                ti,index-starts-at-one;
                ti,invert-autoidle-bit;
+               assigned-clocks = <&dpll_dsp_m2_ck>;
+               assigned-clock-rates = <600000000>;
        };
 
        iva_dpll_hs_clk_div: iva_dpll_hs_clk_div {
                compatible = "ti,omap4-dpll-clock";
                clocks = <&sys_clkin1>, <&dpll_iva_byp_mux>;
                reg = <0x01a0>, <0x01a4>, <0x01ac>, <0x01a8>;
+               assigned-clocks = <&dpll_iva_ck>;
+               assigned-clock-rates = <1165000000>;
        };
 
        dpll_iva_m2_ck: dpll_iva_m2_ck@1b0 {
                reg = <0x01b0>;
                ti,index-starts-at-one;
                ti,invert-autoidle-bit;
+               assigned-clocks = <&dpll_iva_m2_ck>;
+               assigned-clock-rates = <388333334>;
        };
 
        iva_dclk: iva_dclk {
                compatible = "ti,omap4-dpll-clock";
                clocks = <&sys_clkin1>, <&dpll_gpu_byp_mux>;
                reg = <0x02d8>, <0x02dc>, <0x02e4>, <0x02e0>;
+               assigned-clocks = <&dpll_gpu_ck>;
+               assigned-clock-rates = <1277000000>;
        };
 
        dpll_gpu_m2_ck: dpll_gpu_m2_ck@2e8 {
                reg = <0x02e8>;
                ti,index-starts-at-one;
                ti,invert-autoidle-bit;
+               assigned-clocks = <&dpll_gpu_m2_ck>;
+               assigned-clock-rates = <425666667>;
        };
 
        dpll_core_m2_ck: dpll_core_m2_ck@130 {
                reg = <0x0248>;
                ti,index-starts-at-one;
                ti,invert-autoidle-bit;
+               assigned-clocks = <&dpll_dsp_m3x2_ck>;
+               assigned-clock-rates = <400000000>;
        };
 
        dpll_gmac_x2_ck: dpll_gmac_x2_ck {
                clocks = <&dpll_abe_m2x2_ck>, <&dpll_core_h22x2_ck>;
                ti,bit-shift = <24>;
                reg = <0x0520>;
+               assigned-clocks = <&ipu1_gfclk_mux>;
+               assigned-clock-parents = <&dpll_core_h22x2_ck>;
        };
 
        mcasp1_ahclkr_mux: mcasp1_ahclkr_mux@550 {
                clocks = <&dpll_core_h14x2_ck>, <&dpll_per_h14x2_ck>, <&dpll_gpu_m2_ck>;
                ti,bit-shift = <24>;
                reg = <0x1220>;
+               assigned-clocks = <&gpu_core_gclk_mux>;
+               assigned-clock-parents = <&dpll_gpu_m2_ck>;
        };
 
        gpu_hyd_gclk_mux: gpu_hyd_gclk_mux@1220 {
                clocks = <&dpll_core_h14x2_ck>, <&dpll_per_h14x2_ck>, <&dpll_gpu_m2_ck>;
                ti,bit-shift = <26>;
                reg = <0x1220>;
+               assigned-clocks = <&gpu_hyd_gclk_mux>;
+               assigned-clock-parents = <&dpll_gpu_m2_ck>;
        };
 
        l3instr_ts_gclk_div: l3instr_ts_gclk_div@e50 {
index e07715225f191f9f8afea74b641ce6db808192ad..5c24deaf4b647fd7e9548bfe683dcaa5d2b367ae 100644 (file)
@@ -84,6 +84,8 @@
        };
 
        i2c-gpio-0 {
+               #address-cells = <1>;
+               #size-cells = <0>;
                status = "okay";
 
                pcf8563@50 {
diff --git a/arch/arm/dts/fsl-ls1088a-qds.dts b/arch/arm/dts/fsl-ls1088a-qds.dts
new file mode 100644 (file)
index 0000000..9b7bef4
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * NXP ls1088a QDS board device tree source
+ *
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/dts-v1/;
+
+#include "fsl-ls1088a.dtsi"
+
+/ {
+       model = "NXP Layerscape 1088a QDS Board";
+       compatible = "fsl,ls1088a-qds", "fsl,ls1088a";
+       aliases {
+               spi0 = &qspi;
+               spi1 = &dspi;
+       };
+};
+
+&dspi {
+       bus-num = <0>;
+       status = "okay";
+
+       dflash0: n25q128a {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               reg = <0>;
+               spi-max-frequency = <1000000>; /* input clock */
+       };
+
+       dflash1: sst25wf040b {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               spi-max-frequency = <3500000>;
+               reg = <1>;
+       };
+
+       dflash2: en25s64 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               spi-max-frequency = <3500000>;
+               reg = <2>;
+       };
+};
+
+&qspi {
+       bus-num = <0>;
+       status = "okay";
+
+       qflash0: s25fs512s@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               spi-max-frequency = <50000000>;
+               reg = <0>;
+       };
+
+       qflash1: s25fs512s@1 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               spi-max-frequency = <50000000>;
+               reg = <1>;
+        };
+};
diff --git a/arch/arm/dts/fsl-ls1088a-rdb.dts b/arch/arm/dts/fsl-ls1088a-rdb.dts
new file mode 100644 (file)
index 0000000..30ceed8
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * NXP ls1088a RDB board device tree source
+ *
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/dts-v1/;
+
+#include "fsl-ls1088a.dtsi"
+
+/ {
+       model = "NXP Layerscape 1088a RDB Board";
+       compatible = "fsl,ls1088a-rdb", "fsl,ls1088a";
+       aliases {
+               spi0 = &qspi;
+       };
+};
+
+&qspi {
+       bus-num = <0>;
+       status = "okay";
+
+       qflash0: s25fs512s@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               spi-max-frequency = <50000000>;
+               reg = <0>;
+       };
+
+       qflash1: s25fs512s@1 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "spi-flash";
+               spi-max-frequency = <50000000>;
+               reg = <1>;
+        };
+};
diff --git a/arch/arm/dts/fsl-ls1088a.dtsi b/arch/arm/dts/fsl-ls1088a.dtsi
new file mode 100644 (file)
index 0000000..d943a9e
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * NXP ls1088a SOC common device tree source
+ *
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/ {
+       compatible = "fsl,ls1088a";
+       interrupt-parent = <&gic>;
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       memory@80000000 {
+               device_type = "memory";
+               reg = <0x00000000 0x80000000 0 0x80000000>;
+                     /* DRAM space - 1, size : 2 GB DRAM */
+       };
+
+       gic: interrupt-controller@6000000 {
+               compatible = "arm,gic-v3";
+               reg = <0x0 0x06000000 0 0x10000>, /* GIC Dist */
+                     <0x0 0x06100000 0 0x100000>; /* GICR (RD_base + SGI_base) */
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               interrupts = <1 9 0x4>;
+       };
+
+       timer {
+               compatible = "arm,armv8-timer";
+               interrupts = <1 13 0x8>, /* Physical Secure PPI, active-low */
+                            <1 14 0x8>, /* Physical Non-Secure PPI, active-low */
+                            <1 11 0x8>, /* Virtual PPI, active-low */
+                            <1 10 0x8>; /* Hypervisor PPI, active-low */
+       };
+
+       serial0: serial@21c0500 {
+               device_type = "serial";
+               compatible = "fsl,ns16550", "ns16550a";
+               reg = <0x0 0x21c0500 0x0 0x100>;
+               clock-frequency = <0>;  /* Updated by bootloader */
+               interrupts = <0 32 0x1>; /* edge triggered */
+       };
+
+       serial1: serial@21c0600 {
+               device_type = "serial";
+               compatible = "fsl,ns16550", "ns16550a";
+               reg = <0x0 0x21c0600 0x0 0x100>;
+               clock-frequency = <0>;  /* Updated by bootloader */
+               interrupts = <0 32 0x1>; /* edge triggered */
+       };
+
+       fsl_mc: fsl-mc@80c000000 {
+               compatible = "fsl,qoriq-mc";
+               reg = <0x00000008 0x0c000000 0 0x40>,    /* MC portal base */
+                     <0x00000000 0x08340000 0 0x40000>; /* MC control reg */
+       };
+
+       dspi: dspi@2100000 {
+               compatible = "fsl,vf610-dspi";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x0 0x2100000 0x0 0x10000>;
+               interrupts = <0 26 0x4>; /* Level high type */
+               num-cs = <6>;
+       };
+
+       qspi: quadspi@1550000 {
+               compatible = "fsl,vf610-qspi";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               reg = <0x0 0x20c0000 0x0 0x10000>,
+                       <0x0 0x20000000 0x0 0x10000000>;
+               reg-names = "QuadSPI", "QuadSPI-memory";
+               num-cs = <4>;
+       };
+
+       pcie@3400000 {
+               compatible = "fsl,ls-pcie", "snps,dw-pcie";
+               reg = <0x00 0x03400000 0x0 0x80000   /* dbi registers */
+                      0x00 0x03480000 0x0 0x80000   /* lut registers */
+                      0x00 0x034c0000 0x0 0x40000   /* pf controls registers */
+                      0x20 0x00000000 0x0 0x20000>; /* configuration space */
+               reg-names = "dbi", "lut", "ctrl", "config";
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <4>;
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0 0x00000000 0x20 0x00020000 0x0 0x00010000   /* downstream I/O */
+                         0x82000000 0x0 0x40000000 0x20 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
+       };
+
+       pcie@3500000 {
+               compatible = "fsl,ls-pcie", "snps,dw-pcie";
+               reg = <0x00 0x03500000 0x0 0x80000   /* dbi registers */
+                      0x00 0x03580000 0x0 0x80000   /* lut registers */
+                      0x00 0x035c0000 0x0 0x40000   /* pf controls registers */
+                      0x28 0x00000000 0x0 0x20000>; /* configuration space */
+               reg-names = "dbi", "lut", "ctrl", "config";
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <4>;
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0 0x00000000 0x28 0x00020000 0x0 0x00010000   /* downstream I/O */
+                         0x82000000 0x0 0x40000000 0x28 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
+       };
+
+       pcie@3600000 {
+               compatible = "fsl,ls-pcie", "snps,dw-pcie";
+               reg = <0x00 0x03600000 0x0 0x80000   /* dbi registers */
+                      0x00 0x03680000 0x0 0x80000   /* lut registers */
+                      0x00 0x036c0000 0x0 0x40000   /* pf controls registers */
+                      0x30 0x00000000 0x0 0x20000>; /* configuration space */
+               reg-names = "dbi", "lut", "ctrl", "config";
+               #address-cells = <3>;
+               #size-cells = <2>;
+               device_type = "pci";
+               num-lanes = <8>;
+               bus-range = <0x0 0xff>;
+               ranges = <0x81000000 0x0 0x00000000 0x30 0x00020000 0x0 0x00010000   /* downstream I/O */
+                         0x82000000 0x0 0x40000000 0x30 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
+       };
+};
diff --git a/arch/arm/dts/logicpd-torpedo-37xx-devkit-u-boot.dtsi b/arch/arm/dts/logicpd-torpedo-37xx-devkit-u-boot.dtsi
new file mode 100644 (file)
index 0000000..85cb548
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2017
+ * Logic PD - http://www.logicpd.com
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/ {
+       chosen {
+               stdout-path = &uart1;
+       };
+};
+
+&i2c1 {
+       clock-frequency = <400000>;
+};
+
+&i2c2 {
+       clock-frequency = <400000>;
+};
+
+&mmc1 {
+       cd-inverted;
+};
+
+&mmc2 {
+      status = "disabled";
+};
+
+&mmc3 {
+      status = "disabled";
+};
+
+&uart1 {
+       reg-shift = <2>;
+};
+
+&uart2 {
+       reg-shift = <2>;
+};
+
+&uart3 {
+       reg-shift = <2>;
+};
+
index de603a4a239475a96a342e9347bec04fe3e8a4b4..43e9364083de84383a34815c04a6bd1021b3baa0 100644 (file)
        model = "LogicPD Zoom DM3730 Torpedo + Wireless Development Kit";
        compatible = "logicpd,dm3730-torpedo-devkit", "ti,omap3630", "ti,omap3";
 
-       chosen {
-               stdout-path = &uart1;
-       };
-
        gpio_keys {
                compatible = "gpio-keys";
                pinctrl-names = "default";
        interrupts-extended = <&intc 83 &omap3_pmx_core 0x11a>;
        pinctrl-names = "default";
        pinctrl-0 = <&mmc1_pins &mmc1_cd>;
+       cd-gpios = <&gpio4 31 IRQ_TYPE_LEVEL_LOW>;              /* gpio127 */
        vmmc-supply = <&vmmc1>;
        bus-width = <4>;
        cap-power-off-card;
 };
 
-&mmc2 {
-       status = "disabled";
-};
-
 &omap3_pmx_core {
        gpio_key_pins: pinmux_gpio_key_pins {
                pinctrl-single,pins = <
                        OMAP3_CORE1_IOPAD(0x2110, PIN_INPUT | MUX_MODE0)   /* cam_xclka.cam_xclka */
                        OMAP3_CORE1_IOPAD(0x2112, PIN_INPUT | MUX_MODE0)   /* cam_pclk.cam_pclk */
 
-                       OMAP3_CORE1_IOPAD(0x2114, PIN_INPUT | MUX_MODE0)   /* cam_d0.cam_d0 */
-                       OMAP3_CORE1_IOPAD(0x2116, PIN_INPUT | MUX_MODE0)   /* cam_d1.cam_d1 */
-                       OMAP3_CORE1_IOPAD(0x2118, PIN_INPUT | MUX_MODE0)   /* cam_d2.cam_d2 */
+                       OMAP3_CORE1_IOPAD(0x2116, PIN_INPUT | MUX_MODE0)   /* cam_d0.cam_d0 */
+                       OMAP3_CORE1_IOPAD(0x2118, PIN_INPUT | MUX_MODE0)   /* cam_d1.cam_d1 */
+                       OMAP3_CORE1_IOPAD(0x211a, PIN_INPUT | MUX_MODE0)   /* cam_d2.cam_d2 */
                        OMAP3_CORE1_IOPAD(0x211c, PIN_INPUT | MUX_MODE0)   /* cam_d3.cam_d3 */
                        OMAP3_CORE1_IOPAD(0x211e, PIN_INPUT | MUX_MODE0)   /* cam_d4.cam_d4 */
                        OMAP3_CORE1_IOPAD(0x2120, PIN_INPUT | MUX_MODE0)   /* cam_d5.cam_d5 */
diff --git a/arch/arm/dts/omap3-cpu-thermal.dtsi b/arch/arm/dts/omap3-cpu-thermal.dtsi
new file mode 100644 (file)
index 0000000..235ecfd
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Device Tree Source for OMAP3 SoC CPU thermal
+ *
+ * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <dt-bindings/thermal/thermal.h>
+
+cpu_thermal: cpu_thermal {
+       polling-delay-passive = <250>; /* milliseconds */
+       polling-delay = <1000>; /* milliseconds */
+       coefficients = <0 20000>;
+
+                       /* sensor       ID */
+       thermal-sensors = <&bandgap     0>;
+};
diff --git a/arch/arm/dts/omap3-u-boot.dtsi b/arch/arm/dts/omap3-u-boot.dtsi
new file mode 100644 (file)
index 0000000..288e057
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2017
+ * Logic PD - http://www.logicpd.com
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+&uart1 {
+       reg-shift = <2>;
+};
+
+&uart2 {
+       reg-shift = <2>;
+};
+
+&uart3 {
+       reg-shift = <2>;
+};
+
index a0f24129b65f06ff9bd3198e43112136fb7e4565..e6f9c9a6ddca7c5dc22422ae97f33d7f7bbd53bd 100644 (file)
 #include <dt-bindings/pinctrl/omap.h>
 
 / {
-       compatible = "ti,omap3430", "ti,omap3";
-       interrupt-parent = <&intc>;
-       #address-cells = <1>;
-       #size-cells = <1>;
-       chosen { };
-
-       aliases {
-               i2c0 = &i2c1;
-               i2c1 = &i2c2;
-               i2c2 = &i2c3;
-               serial0 = &uart1;
-               serial1 = &uart2;
-               serial2 = &uart3;
-       };
-
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               cpu@0 {
-                       compatible = "arm,cortex-a8";
-                       device_type = "cpu";
-                       reg = <0x0>;
-
-                       clocks = <&dpll1_ck>;
-                       clock-names = "cpu";
-
-                       clock-latency = <300000>; /* From omap-cpufreq driver */
-               };
-       };
-
-       pmu@54000000 {
-               compatible = "arm,cortex-a8-pmu";
-               reg = <0x54000000 0x800000>;
-               interrupts = <3>;
-               ti,hwmods = "debugss";
-       };
-
-       /*
-        * The soc node represents the soc top level view. It is used for IPs
-        * that are not memory mapped in the MPU view or for the MPU itself.
-        */
-       soc {
-               compatible = "ti,omap-infra";
-               mpu {
-                       compatible = "ti,omap3-mpu";
-                       ti,hwmods = "mpu";
-               };
-
-               iva: iva {
-                       compatible = "ti,iva2.2";
-                       ti,hwmods = "iva";
-
-                       dsp {
-                               compatible = "ti,omap3-c64";
-                       };
-               };
-       };
-
-       /*
-        * XXX: Use a flat representation of the OMAP3 interconnect.
-        * The real OMAP interconnect network is quite complex.
-        * Since it will not bring real advantage to represent that in DT for
-        * the moment, just use a fake OCP bus entry to represent the whole bus
-        * hierarchy.
-        */
-       ocp@68000000 {
-               compatible = "ti,omap3-l3-smx", "simple-bus";
-               reg = <0x68000000 0x10000>;
-               interrupts = <9 10>;
-               #address-cells = <1>;
-               #size-cells = <1>;
-               ranges;
-               ti,hwmods = "l3_main";
-
-               l4_core: l4@48000000 {
-                       compatible = "ti,omap3-l4-core", "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0 0x48000000 0x1000000>;
-
-                       scm: scm@2000 {
-                               compatible = "ti,omap3-scm", "simple-bus";
-                               reg = <0x2000 0x2000>;
-                               #address-cells = <1>;
-                               #size-cells = <1>;
-                               ranges = <0 0x2000 0x2000>;
-
-                               omap3_pmx_core: pinmux@30 {
-                                       compatible = "ti,omap3-padconf",
-                                                    "pinctrl-single";
-                                       reg = <0x30 0x238>;
-                                       #address-cells = <1>;
-                                       #size-cells = <0>;
-                                       #interrupt-cells = <1>;
-                                       interrupt-controller;
-                                       pinctrl-single,register-width = <16>;
-                                       pinctrl-single,function-mask = <0xff1f>;
-                               };
-
-                               scm_conf: scm_conf@270 {
-                                       compatible = "syscon", "simple-bus";
-                                       reg = <0x270 0x330>;
-                                       #address-cells = <1>;
-                                       #size-cells = <1>;
-                                       ranges = <0 0x270 0x330>;
-
-                                       pbias_regulator: pbias_regulator@2b0 {
-                                               compatible = "ti,pbias-omap3", "ti,pbias-omap";
-                                               reg = <0x2b0 0x4>;
-                                               syscon = <&scm_conf>;
-                                               pbias_mmc_reg: pbias_mmc_omap2430 {
-                                                       regulator-name = "pbias_mmc_omap2430";
-                                                       regulator-min-microvolt = <1800000>;
-                                                       regulator-max-microvolt = <3000000>;
-                                               };
-                                       };
-
-                                       scm_clocks: clocks {
-                                               #address-cells = <1>;
-                                               #size-cells = <0>;
-                                       };
-                               };
-
-                               scm_clockdomains: clockdomains {
-                               };
-
-                               omap3_pmx_wkup: pinmux@a00 {
-                                       compatible = "ti,omap3-padconf",
-                                                    "pinctrl-single";
-                                       reg = <0xa00 0x5c>;
-                                       #address-cells = <1>;
-                                       #size-cells = <0>;
-                                       #interrupt-cells = <1>;
-                                       interrupt-controller;
-                                       pinctrl-single,register-width = <16>;
-                                       pinctrl-single,function-mask = <0xff1f>;
-                               };
-                       };
-               };
-
-               aes: aes@480c5000 {
-                       compatible = "ti,omap3-aes";
-                       ti,hwmods = "aes";
-                       reg = <0x480c5000 0x50>;
-                       interrupts = <0>;
-                       dmas = <&sdma 65 &sdma 66>;
-                       dma-names = "tx", "rx";
-               };
-
-               prm: prm@48306000 {
-                       compatible = "ti,omap3-prm";
-                       reg = <0x48306000 0x4000>;
-                       interrupts = <11>;
-
-                       prm_clocks: clocks {
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                       };
-
-                       prm_clockdomains: clockdomains {
-                       };
-               };
-
-               cm: cm@48004000 {
-                       compatible = "ti,omap3-cm";
-                       reg = <0x48004000 0x4000>;
-
-                       cm_clocks: clocks {
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                       };
-
-                       cm_clockdomains: clockdomains {
-                       };
-               };
-
-               counter32k: counter@48320000 {
-                       compatible = "ti,omap-counter32k";
-                       reg = <0x48320000 0x20>;
-                       ti,hwmods = "counter_32k";
-               };
-
-               intc: interrupt-controller@48200000 {
-                       compatible = "ti,omap3-intc";
-                       interrupt-controller;
-                       #interrupt-cells = <1>;
-                       reg = <0x48200000 0x1000>;
-               };
-
-               sdma: dma-controller@48056000 {
-                       compatible = "ti,omap3630-sdma", "ti,omap3430-sdma";
-                       reg = <0x48056000 0x1000>;
-                       interrupts = <12>,
-                                    <13>,
-                                    <14>,
-                                    <15>;
-                       #dma-cells = <1>;
-                       dma-channels = <32>;
-                       dma-requests = <96>;
-               };
-
-               gpio1: gpio@48310000 {
-                       compatible = "ti,omap3-gpio";
-                       reg = <0x48310000 0x200>;
-                       interrupts = <29>;
-                       ti,hwmods = "gpio1";
-                       ti,gpio-always-on;
-                       gpio-controller;
-                       #gpio-cells = <2>;
-                       interrupt-controller;
-                       #interrupt-cells = <2>;
-               };
-
-               gpio2: gpio@49050000 {
-                       compatible = "ti,omap3-gpio";
-                       reg = <0x49050000 0x200>;
-                       interrupts = <30>;
-                       ti,hwmods = "gpio2";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-                       interrupt-controller;
-                       #interrupt-cells = <2>;
-               };
-
-               gpio3: gpio@49052000 {
-                       compatible = "ti,omap3-gpio";
-                       reg = <0x49052000 0x200>;
-                       interrupts = <31>;
-                       ti,hwmods = "gpio3";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-                       interrupt-controller;
-                       #interrupt-cells = <2>;
-               };
-
-               gpio4: gpio@49054000 {
-                       compatible = "ti,omap3-gpio";
-                       reg = <0x49054000 0x200>;
-                       interrupts = <32>;
-                       ti,hwmods = "gpio4";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-                       interrupt-controller;
-                       #interrupt-cells = <2>;
-               };
-
-               gpio5: gpio@49056000 {
-                       compatible = "ti,omap3-gpio";
-                       reg = <0x49056000 0x200>;
-                       interrupts = <33>;
-                       ti,hwmods = "gpio5";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-                       interrupt-controller;
-                       #interrupt-cells = <2>;
-               };
-
-               gpio6: gpio@49058000 {
-                       compatible = "ti,omap3-gpio";
-                       reg = <0x49058000 0x200>;
-                       interrupts = <34>;
-                       ti,hwmods = "gpio6";
-                       gpio-controller;
-                       #gpio-cells = <2>;
-                       interrupt-controller;
-                       #interrupt-cells = <2>;
-               };
-
-               uart1: serial@4806a000 {
-                       compatible = "ti,omap3-uart";
-                       reg = <0x4806a000 0x2000>;
-                       reg-shift = <2>;
-                       interrupts-extended = <&intc 72>;
-                       dmas = <&sdma 49 &sdma 50>;
-                       dma-names = "tx", "rx";
-                       ti,hwmods = "uart1";
-                       clock-frequency = <48000000>;
-               };
-
-               uart2: serial@4806c000 {
-                       compatible = "ti,omap3-uart";
-                       reg = <0x4806c000 0x400>;
-                       interrupts-extended = <&intc 73>;
-                       dmas = <&sdma 51 &sdma 52>;
-                       dma-names = "tx", "rx";
-                       ti,hwmods = "uart2";
-                       clock-frequency = <48000000>;
-               };
-
-               uart3: serial@49020000 {
-                       compatible = "ti,omap3-uart";
-                       reg = <0x49020000 0x400>;
-                       interrupts-extended = <&intc 74>;
-                       dmas = <&sdma 53 &sdma 54>;
-                       dma-names = "tx", "rx";
-                       ti,hwmods = "uart3";
-                       clock-frequency = <48000000>;
-               };
-
-               i2c1: i2c@48070000 {
-                       compatible = "ti,omap3-i2c";
-                       reg = <0x48070000 0x80>;
-                       interrupts = <56>;
-                       dmas = <&sdma 27 &sdma 28>;
-                       dma-names = "tx", "rx";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       ti,hwmods = "i2c1";
-               };
-
-               i2c2: i2c@48072000 {
-                       compatible = "ti,omap3-i2c";
-                       reg = <0x48072000 0x80>;
-                       interrupts = <57>;
-                       dmas = <&sdma 29 &sdma 30>;
-                       dma-names = "tx", "rx";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       ti,hwmods = "i2c2";
-               };
-
-               i2c3: i2c@48060000 {
-                       compatible = "ti,omap3-i2c";
-                       reg = <0x48060000 0x80>;
-                       interrupts = <61>;
-                       dmas = <&sdma 25 &sdma 26>;
-                       dma-names = "tx", "rx";
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       ti,hwmods = "i2c3";
-               };
-
-               mailbox: mailbox@48094000 {
-                       compatible = "ti,omap3-mailbox";
-                       ti,hwmods = "mailbox";
-                       reg = <0x48094000 0x200>;
-                       interrupts = <26>;
-                       #mbox-cells = <1>;
-                       ti,mbox-num-users = <2>;
-                       ti,mbox-num-fifos = <2>;
-                       mbox_dsp: dsp {
-                               ti,mbox-tx = <0 0 0>;
-                               ti,mbox-rx = <1 0 0>;
-                       };
-               };
-
-               mcspi1: spi@48098000 {
-                       compatible = "ti,omap2-mcspi";
-                       reg = <0x48098000 0x100>;
-                       interrupts = <65>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       ti,hwmods = "mcspi1";
-                       ti,spi-num-cs = <4>;
-                       dmas = <&sdma 35>,
-                              <&sdma 36>,
-                              <&sdma 37>,
-                              <&sdma 38>,
-                              <&sdma 39>,
-                              <&sdma 40>,
-                              <&sdma 41>,
-                              <&sdma 42>;
-                       dma-names = "tx0", "rx0", "tx1", "rx1",
-                                   "tx2", "rx2", "tx3", "rx3";
-               };
-
-               mcspi2: spi@4809a000 {
-                       compatible = "ti,omap2-mcspi";
-                       reg = <0x4809a000 0x100>;
-                       interrupts = <66>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       ti,hwmods = "mcspi2";
-                       ti,spi-num-cs = <2>;
-                       dmas = <&sdma 43>,
-                              <&sdma 44>,
-                              <&sdma 45>,
-                              <&sdma 46>;
-                       dma-names = "tx0", "rx0", "tx1", "rx1";
-               };
-
-               mcspi3: spi@480b8000 {
-                       compatible = "ti,omap2-mcspi";
-                       reg = <0x480b8000 0x100>;
-                       interrupts = <91>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       ti,hwmods = "mcspi3";
-                       ti,spi-num-cs = <2>;
-                       dmas = <&sdma 15>,
-                              <&sdma 16>,
-                              <&sdma 23>,
-                              <&sdma 24>;
-                       dma-names = "tx0", "rx0", "tx1", "rx1";
-               };
-
-               mcspi4: spi@480ba000 {
-                       compatible = "ti,omap2-mcspi";
-                       reg = <0x480ba000 0x100>;
-                       interrupts = <48>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       ti,hwmods = "mcspi4";
-                       ti,spi-num-cs = <1>;
-                       dmas = <&sdma 70>, <&sdma 71>;
-                       dma-names = "tx0", "rx0";
-               };
-
-               hdqw1w: 1w@480b2000 {
-                       compatible = "ti,omap3-1w";
-                       reg = <0x480b2000 0x1000>;
-                       interrupts = <58>;
-                       ti,hwmods = "hdq1w";
-               };
-
-               mmc1: mmc@4809c000 {
-                       compatible = "ti,omap3-hsmmc";
-                       reg = <0x4809c000 0x200>;
-                       interrupts = <83>;
-                       ti,hwmods = "mmc1";
-                       ti,dual-volt;
-                       dmas = <&sdma 61>, <&sdma 62>;
-                       dma-names = "tx", "rx";
-                       pbias-supply = <&pbias_mmc_reg>;
-               };
-
-               mmc2: mmc@480b4000 {
-                       compatible = "ti,omap3-hsmmc";
-                       reg = <0x480b4000 0x200>;
-                       interrupts = <86>;
-                       ti,hwmods = "mmc2";
-                       dmas = <&sdma 47>, <&sdma 48>;
-                       dma-names = "tx", "rx";
-               };
-
-               mmc3: mmc@480ad000 {
-                       compatible = "ti,omap3-hsmmc";
-                       reg = <0x480ad000 0x200>;
-                       interrupts = <94>;
-                       ti,hwmods = "mmc3";
-                       dmas = <&sdma 77>, <&sdma 78>;
-                       dma-names = "tx", "rx";
-               };
-
-               mmu_isp: mmu@480bd400 {
-                       #iommu-cells = <0>;
-                       compatible = "ti,omap2-iommu";
-                       reg = <0x480bd400 0x80>;
-                       interrupts = <24>;
-                       ti,hwmods = "mmu_isp";
-                       ti,#tlb-entries = <8>;
-               };
-
-               mmu_iva: mmu@5d000000 {
-                       #iommu-cells = <0>;
-                       compatible = "ti,omap2-iommu";
-                       reg = <0x5d000000 0x80>;
-                       interrupts = <28>;
-                       ti,hwmods = "mmu_iva";
-                       status = "disabled";
-               };
-
-               wdt2: wdt@48314000 {
-                       compatible = "ti,omap3-wdt";
-                       reg = <0x48314000 0x80>;
-                       ti,hwmods = "wd_timer2";
-               };
-
-               mcbsp1: mcbsp@48074000 {
-                       compatible = "ti,omap3-mcbsp";
-                       reg = <0x48074000 0xff>;
-                       reg-names = "mpu";
-                       interrupts = <16>, /* OCP compliant interrupt */
-                                    <59>, /* TX interrupt */
-                                    <60>; /* RX interrupt */
-                       interrupt-names = "common", "tx", "rx";
-                       ti,buffer-size = <128>;
-                       ti,hwmods = "mcbsp1";
-                       dmas = <&sdma 31>,
-                              <&sdma 32>;
-                       dma-names = "tx", "rx";
-                       clocks = <&mcbsp1_fck>;
-                       clock-names = "fck";
-                       status = "disabled";
-               };
-
-               mcbsp2: mcbsp@49022000 {
-                       compatible = "ti,omap3-mcbsp";
-                       reg = <0x49022000 0xff>,
-                             <0x49028000 0xff>;
-                       reg-names = "mpu", "sidetone";
-                       interrupts = <17>, /* OCP compliant interrupt */
-                                    <62>, /* TX interrupt */
-                                    <63>, /* RX interrupt */
-                                    <4>;  /* Sidetone */
-                       interrupt-names = "common", "tx", "rx", "sidetone";
-                       ti,buffer-size = <1280>;
-                       ti,hwmods = "mcbsp2", "mcbsp2_sidetone";
-                       dmas = <&sdma 33>,
-                              <&sdma 34>;
-                       dma-names = "tx", "rx";
-                       clocks = <&mcbsp2_fck>, <&mcbsp2_ick>;
-                       clock-names = "fck", "ick";
-                       status = "disabled";
-               };
-
-               mcbsp3: mcbsp@49024000 {
-                       compatible = "ti,omap3-mcbsp";
-                       reg = <0x49024000 0xff>,
-                             <0x4902a000 0xff>;
-                       reg-names = "mpu", "sidetone";
-                       interrupts = <22>, /* OCP compliant interrupt */
-                                    <89>, /* TX interrupt */
-                                    <90>, /* RX interrupt */
-                                    <5>;  /* Sidetone */
-                       interrupt-names = "common", "tx", "rx", "sidetone";
-                       ti,buffer-size = <128>;
-                       ti,hwmods = "mcbsp3", "mcbsp3_sidetone";
-                       dmas = <&sdma 17>,
-                              <&sdma 18>;
-                       dma-names = "tx", "rx";
-                       clocks = <&mcbsp3_fck>, <&mcbsp3_ick>;
-                       clock-names = "fck", "ick";
-                       status = "disabled";
-               };
-
-               mcbsp4: mcbsp@49026000 {
-                       compatible = "ti,omap3-mcbsp";
-                       reg = <0x49026000 0xff>;
-                       reg-names = "mpu";
-                       interrupts = <23>, /* OCP compliant interrupt */
-                                    <54>, /* TX interrupt */
-                                    <55>; /* RX interrupt */
-                       interrupt-names = "common", "tx", "rx";
-                       ti,buffer-size = <128>;
-                       ti,hwmods = "mcbsp4";
-                       dmas = <&sdma 19>,
-                              <&sdma 20>;
-                       dma-names = "tx", "rx";
-                       clocks = <&mcbsp4_fck>;
-                       clock-names = "fck";
-                       status = "disabled";
-               };
-
-               mcbsp5: mcbsp@48096000 {
-                       compatible = "ti,omap3-mcbsp";
-                       reg = <0x48096000 0xff>;
-                       reg-names = "mpu";
-                       interrupts = <27>, /* OCP compliant interrupt */
-                                    <81>, /* TX interrupt */
-                                    <82>; /* RX interrupt */
-                       interrupt-names = "common", "tx", "rx";
-                       ti,buffer-size = <128>;
-                       ti,hwmods = "mcbsp5";
-                       dmas = <&sdma 21>,
-                              <&sdma 22>;
-                       dma-names = "tx", "rx";
-                       clocks = <&mcbsp5_fck>;
-                       clock-names = "fck";
-                       status = "disabled";
-               };
-
-               sham: sham@480c3000 {
-                       compatible = "ti,omap3-sham";
-                       ti,hwmods = "sham";
-                       reg = <0x480c3000 0x64>;
-                       interrupts = <49>;
-                       dmas = <&sdma 69>;
-                       dma-names = "rx";
-               };
-
-               smartreflex_core: smartreflex@480cb000 {
-                       compatible = "ti,omap3-smartreflex-core";
-                       ti,hwmods = "smartreflex_core";
-                       reg = <0x480cb000 0x400>;
-                       interrupts = <19>;
-               };
-
-               smartreflex_mpu_iva: smartreflex@480c9000 {
-                       compatible = "ti,omap3-smartreflex-iva";
-                       ti,hwmods = "smartreflex_mpu_iva";
-                       reg = <0x480c9000 0x400>;
-                       interrupts = <18>;
-               };
-
-               timer1: timer@48318000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x48318000 0x400>;
-                       interrupts = <37>;
-                       ti,hwmods = "timer1";
-                       ti,timer-alwon;
-               };
-
-               timer2: timer@49032000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x49032000 0x400>;
-                       interrupts = <38>;
-                       ti,hwmods = "timer2";
-               };
-
-               timer3: timer@49034000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x49034000 0x400>;
-                       interrupts = <39>;
-                       ti,hwmods = "timer3";
-               };
-
-               timer4: timer@49036000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x49036000 0x400>;
-                       interrupts = <40>;
-                       ti,hwmods = "timer4";
-               };
-
-               timer5: timer@49038000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x49038000 0x400>;
-                       interrupts = <41>;
-                       ti,hwmods = "timer5";
-                       ti,timer-dsp;
-               };
-
-               timer6: timer@4903a000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x4903a000 0x400>;
-                       interrupts = <42>;
-                       ti,hwmods = "timer6";
-                       ti,timer-dsp;
-               };
-
-               timer7: timer@4903c000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x4903c000 0x400>;
-                       interrupts = <43>;
-                       ti,hwmods = "timer7";
-                       ti,timer-dsp;
-               };
-
-               timer8: timer@4903e000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x4903e000 0x400>;
-                       interrupts = <44>;
-                       ti,hwmods = "timer8";
-                       ti,timer-pwm;
-                       ti,timer-dsp;
-               };
-
-               timer9: timer@49040000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x49040000 0x400>;
-                       interrupts = <45>;
-                       ti,hwmods = "timer9";
-                       ti,timer-pwm;
-               };
-
-               timer10: timer@48086000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x48086000 0x400>;
-                       interrupts = <46>;
-                       ti,hwmods = "timer10";
-                       ti,timer-pwm;
-               };
-
-               timer11: timer@48088000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x48088000 0x400>;
-                       interrupts = <47>;
-                       ti,hwmods = "timer11";
-                       ti,timer-pwm;
-               };
-
-               timer12: timer@48304000 {
-                       compatible = "ti,omap3430-timer";
-                       reg = <0x48304000 0x400>;
-                       interrupts = <95>;
-                       ti,hwmods = "timer12";
-                       ti,timer-alwon;
-                       ti,timer-secure;
-               };
-
-               usbhstll: usbhstll@48062000 {
-                       compatible = "ti,usbhs-tll";
-                       reg = <0x48062000 0x1000>;
-                       interrupts = <78>;
-                       ti,hwmods = "usb_tll_hs";
-               };
-
-               usbhshost: usbhshost@48064000 {
-                       compatible = "ti,usbhs-host";
-                       reg = <0x48064000 0x400>;
-                       ti,hwmods = "usb_host_hs";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges;
-
-                       usbhsohci: ohci@48064400 {
-                               compatible = "ti,ohci-omap3";
-                               reg = <0x48064400 0x400>;
-                               interrupt-parent = <&intc>;
-                               interrupts = <76>;
-                       };
-
-                       usbhsehci: ehci@48064800 {
-                               compatible = "ti,ehci-omap";
-                               reg = <0x48064800 0x400>;
-                               interrupt-parent = <&intc>;
-                               interrupts = <77>;
-                       };
-               };
-
-               gpmc: gpmc@6e000000 {
-                       compatible = "ti,omap3430-gpmc";
-                       ti,hwmods = "gpmc";
-                       reg = <0x6e000000 0x02d0>;
-                       interrupts = <20>;
-                       dmas = <&sdma 4>;
-                       dma-names = "rxtx";
-                       gpmc,num-cs = <8>;
-                       gpmc,num-waitpins = <4>;
-                       #address-cells = <2>;
-                       #size-cells = <1>;
-                       interrupt-controller;
-                       #interrupt-cells = <2>;
-                       gpio-controller;
-                       #gpio-cells = <2>;
-               };
-
-               usb_otg_hs: usb_otg_hs@480ab000 {
-                       compatible = "ti,omap3-musb";
-                       reg = <0x480ab000 0x1000>;
-                       interrupts = <92>, <93>;
-                       interrupt-names = "mc", "dma";
-                       ti,hwmods = "usb_otg_hs";
-                       multipoint = <1>;
-                       num-eps = <16>;
-                       ram-bits = <12>;
-               };
-
-               dss: dss@48050000 {
-                       compatible = "ti,omap3-dss";
-                       reg = <0x48050000 0x200>;
-                       status = "disabled";
-                       ti,hwmods = "dss_core";
-                       clocks = <&dss1_alwon_fck>;
-                       clock-names = "fck";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges;
-
-                       dispc@48050400 {
-                               compatible = "ti,omap3-dispc";
-                               reg = <0x48050400 0x400>;
-                               interrupts = <25>;
-                               ti,hwmods = "dss_dispc";
-                               clocks = <&dss1_alwon_fck>;
-                               clock-names = "fck";
-                       };
-
-                       dsi: encoder@4804fc00 {
-                               compatible = "ti,omap3-dsi";
-                               reg = <0x4804fc00 0x200>,
-                                     <0x4804fe00 0x40>,
-                                     <0x4804ff00 0x20>;
-                               reg-names = "proto", "phy", "pll";
-                               interrupts = <25>;
-                               status = "disabled";
-                               ti,hwmods = "dss_dsi1";
-                               clocks = <&dss1_alwon_fck>, <&dss2_alwon_fck>;
-                               clock-names = "fck", "sys_clk";
-                       };
-
-                       rfbi: encoder@48050800 {
-                               compatible = "ti,omap3-rfbi";
-                               reg = <0x48050800 0x100>;
-                               status = "disabled";
-                               ti,hwmods = "dss_rfbi";
-                               clocks = <&dss1_alwon_fck>, <&dss_ick>;
-                               clock-names = "fck", "ick";
-                       };
-
-                       venc: encoder@48050c00 {
-                               compatible = "ti,omap3-venc";
-                               reg = <0x48050c00 0x100>;
-                               status = "disabled";
-                               ti,hwmods = "dss_venc";
-                               clocks = <&dss_tv_fck>;
-                               clock-names = "fck";
-                       };
-               };
-
-               ssi: ssi-controller@48058000 {
-                       compatible = "ti,omap3-ssi";
-                       ti,hwmods = "ssi";
-
-                       status = "disabled";
-
-                       reg = <0x48058000 0x1000>,
-                             <0x48059000 0x1000>;
-                       reg-names = "sys",
-                                   "gdd";
-
-                       interrupts = <71>;
-                       interrupt-names = "gdd_mpu";
-
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges;
-
-                       ssi_port1: ssi-port@4805a000 {
-                               compatible = "ti,omap3-ssi-port";
-
-                               reg = <0x4805a000 0x800>,
-                                     <0x4805a800 0x800>;
-                               reg-names = "tx",
-                                           "rx";
-
-                               interrupt-parent = <&intc>;
-                               interrupts = <67>,
-                                            <68>;
-                       };
-
-                       ssi_port2: ssi-port@4805b000 {
-                               compatible = "ti,omap3-ssi-port";
-
-                               reg = <0x4805b000 0x800>,
-                                     <0x4805b800 0x800>;
-                               reg-names = "tx",
-                                           "rx";
-
-                               interrupt-parent = <&intc>;
-                               interrupts = <69>,
-                                            <70>;
-                       };
-               };
-       };
+       compatible = "ti,omap3430", "ti,omap3";
+       interrupt-parent = <&intc>;
+       #address-cells = <1>;
+       #size-cells = <1>;
+       chosen { };
+
+       aliases {
+               i2c0 = &i2c1;
+               i2c1 = &i2c2;
+               i2c2 = &i2c3;
+               serial0 = &uart1;
+               serial1 = &uart2;
+               serial2 = &uart3;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       compatible = "arm,cortex-a8";
+                       device_type = "cpu";
+                       reg = <0x0>;
+
+                       clocks = <&dpll1_ck>;
+                       clock-names = "cpu";
+
+                       clock-latency = <300000>; /* From omap-cpufreq driver */
+               };
+       };
+
+       pmu@54000000 {
+               compatible = "arm,cortex-a8-pmu";
+               reg = <0x54000000 0x800000>;
+               interrupts = <3>;
+               ti,hwmods = "debugss";
+       };
+
+       /*
+        * The soc node represents the soc top level view. It is used for IPs
+        * that are not memory mapped in the MPU view or for the MPU itself.
+        */
+       soc {
+               compatible = "ti,omap-infra";
+               mpu {
+                       compatible = "ti,omap3-mpu";
+                       ti,hwmods = "mpu";
+               };
+
+               iva: iva {
+                       compatible = "ti,iva2.2";
+                       ti,hwmods = "iva";
+
+                       dsp {
+                               compatible = "ti,omap3-c64";
+                       };
+               };
+       };
+
+       /*
+        * XXX: Use a flat representation of the OMAP3 interconnect.
+        * The real OMAP interconnect network is quite complex.
+        * Since it will not bring real advantage to represent that in DT for
+        * the moment, just use a fake OCP bus entry to represent the whole bus
+        * hierarchy.
+        */
+       ocp@68000000 {
+               compatible = "ti,omap3-l3-smx", "simple-bus";
+               reg = <0x68000000 0x10000>;
+               interrupts = <9 10>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+               ti,hwmods = "l3_main";
+
+               l4_core: l4@48000000 {
+                       compatible = "ti,omap3-l4-core", "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0 0x48000000 0x1000000>;
+
+                       scm: scm@2000 {
+                               compatible = "ti,omap3-scm", "simple-bus";
+                               reg = <0x2000 0x2000>;
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0x2000 0x2000>;
+
+                               omap3_pmx_core: pinmux@30 {
+                                       compatible = "ti,omap3-padconf",
+                                                    "pinctrl-single";
+                                       reg = <0x30 0x238>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       #pinctrl-cells = <1>;
+                                       #interrupt-cells = <1>;
+                                       interrupt-controller;
+                                       pinctrl-single,register-width = <16>;
+                                       pinctrl-single,function-mask = <0xff1f>;
+                               };
+
+                               scm_conf: scm_conf@270 {
+                                       compatible = "syscon", "simple-bus";
+                                       reg = <0x270 0x330>;
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       ranges = <0 0x270 0x330>;
+
+                                       pbias_regulator: pbias_regulator@2b0 {
+                                               compatible = "ti,pbias-omap3", "ti,pbias-omap";
+                                               reg = <0x2b0 0x4>;
+                                               syscon = <&scm_conf>;
+                                               pbias_mmc_reg: pbias_mmc_omap2430 {
+                                                       regulator-name = "pbias_mmc_omap2430";
+                                                       regulator-min-microvolt = <1800000>;
+                                                       regulator-max-microvolt = <3000000>;
+                                               };
+                                       };
+
+                                       scm_clocks: clocks {
+                                               #address-cells = <1>;
+                                               #size-cells = <0>;
+                                       };
+                               };
+
+                               scm_clockdomains: clockdomains {
+                               };
+
+                               omap3_pmx_wkup: pinmux@a00 {
+                                       compatible = "ti,omap3-padconf",
+                                                    "pinctrl-single";
+                                       reg = <0xa00 0x5c>;
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       #pinctrl-cells = <1>;
+                                       #interrupt-cells = <1>;
+                                       interrupt-controller;
+                                       pinctrl-single,register-width = <16>;
+                                       pinctrl-single,function-mask = <0xff1f>;
+                               };
+                       };
+               };
+
+               aes: aes@480c5000 {
+                       compatible = "ti,omap3-aes";
+                       ti,hwmods = "aes";
+                       reg = <0x480c5000 0x50>;
+                       interrupts = <0>;
+                       dmas = <&sdma 65 &sdma 66>;
+                       dma-names = "tx", "rx";
+               };
+
+               prm: prm@48306000 {
+                       compatible = "ti,omap3-prm";
+                       reg = <0x48306000 0x4000>;
+                       interrupts = <11>;
+
+                       prm_clocks: clocks {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                       };
+
+                       prm_clockdomains: clockdomains {
+                       };
+               };
+
+               cm: cm@48004000 {
+                       compatible = "ti,omap3-cm";
+                       reg = <0x48004000 0x4000>;
+
+                       cm_clocks: clocks {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                       };
+
+                       cm_clockdomains: clockdomains {
+                       };
+               };
+
+               counter32k: counter@48320000 {
+                       compatible = "ti,omap-counter32k";
+                       reg = <0x48320000 0x20>;
+                       ti,hwmods = "counter_32k";
+               };
+
+               intc: interrupt-controller@48200000 {
+                       compatible = "ti,omap3-intc";
+                       interrupt-controller;
+                       #interrupt-cells = <1>;
+                       reg = <0x48200000 0x1000>;
+               };
+
+               sdma: dma-controller@48056000 {
+                       compatible = "ti,omap3630-sdma", "ti,omap3430-sdma";
+                       reg = <0x48056000 0x1000>;
+                       interrupts = <12>,
+                                    <13>,
+                                    <14>,
+                                    <15>;
+                       #dma-cells = <1>;
+                       dma-channels = <32>;
+                       dma-requests = <96>;
+               };
+
+               gpio1: gpio@48310000 {
+                       compatible = "ti,omap3-gpio";
+                       reg = <0x48310000 0x200>;
+                       interrupts = <29>;
+                       ti,hwmods = "gpio1";
+                       ti,gpio-always-on;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio2: gpio@49050000 {
+                       compatible = "ti,omap3-gpio";
+                       reg = <0x49050000 0x200>;
+                       interrupts = <30>;
+                       ti,hwmods = "gpio2";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio3: gpio@49052000 {
+                       compatible = "ti,omap3-gpio";
+                       reg = <0x49052000 0x200>;
+                       interrupts = <31>;
+                       ti,hwmods = "gpio3";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio4: gpio@49054000 {
+                       compatible = "ti,omap3-gpio";
+                       reg = <0x49054000 0x200>;
+                       interrupts = <32>;
+                       ti,hwmods = "gpio4";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio5: gpio@49056000 {
+                       compatible = "ti,omap3-gpio";
+                       reg = <0x49056000 0x200>;
+                       interrupts = <33>;
+                       ti,hwmods = "gpio5";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio6: gpio@49058000 {
+                       compatible = "ti,omap3-gpio";
+                       reg = <0x49058000 0x200>;
+                       interrupts = <34>;
+                       ti,hwmods = "gpio6";
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               uart1: serial@4806a000 {
+                       compatible = "ti,omap3-uart";
+                       reg = <0x4806a000 0x2000>;
+                       reg-shift = <2>;
+                       interrupts-extended = <&intc 72>;
+                       dmas = <&sdma 49 &sdma 50>;
+                       dma-names = "tx", "rx";
+                       ti,hwmods = "uart1";
+                       clock-frequency = <48000000>;
+               };
+
+               uart2: serial@4806c000 {
+                       compatible = "ti,omap3-uart";
+                       reg = <0x4806c000 0x400>;
+                       reg-shift = <2>;
+                       interrupts-extended = <&intc 73>;
+                       dmas = <&sdma 51 &sdma 52>;
+                       dma-names = "tx", "rx";
+                       ti,hwmods = "uart2";
+                       clock-frequency = <48000000>;
+               };
+
+               uart3: serial@49020000 {
+                       compatible = "ti,omap3-uart";
+                       reg = <0x49020000 0x400>;
+                       reg-shift = <2>;
+                       interrupts-extended = <&intc 74>;
+                       dmas = <&sdma 53 &sdma 54>;
+                       dma-names = "tx", "rx";
+                       ti,hwmods = "uart3";
+                       clock-frequency = <48000000>;
+               };
+
+               i2c1: i2c@48070000 {
+                       compatible = "ti,omap3-i2c";
+                       reg = <0x48070000 0x80>;
+                       interrupts = <56>;
+                       dmas = <&sdma 27 &sdma 28>;
+                       dma-names = "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "i2c1";
+               };
+
+               i2c2: i2c@48072000 {
+                       compatible = "ti,omap3-i2c";
+                       reg = <0x48072000 0x80>;
+                       interrupts = <57>;
+                       dmas = <&sdma 29 &sdma 30>;
+                       dma-names = "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "i2c2";
+               };
+
+               i2c3: i2c@48060000 {
+                       compatible = "ti,omap3-i2c";
+                       reg = <0x48060000 0x80>;
+                       interrupts = <61>;
+                       dmas = <&sdma 25 &sdma 26>;
+                       dma-names = "tx", "rx";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "i2c3";
+               };
+
+               mailbox: mailbox@48094000 {
+                       compatible = "ti,omap3-mailbox";
+                       ti,hwmods = "mailbox";
+                       reg = <0x48094000 0x200>;
+                       interrupts = <26>;
+                       #mbox-cells = <1>;
+                       ti,mbox-num-users = <2>;
+                       ti,mbox-num-fifos = <2>;
+                       mbox_dsp: dsp {
+                               ti,mbox-tx = <0 0 0>;
+                               ti,mbox-rx = <1 0 0>;
+                       };
+               };
+
+               mcspi1: spi@48098000 {
+                       compatible = "ti,omap2-mcspi";
+                       reg = <0x48098000 0x100>;
+                       interrupts = <65>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "mcspi1";
+                       ti,spi-num-cs = <4>;
+                       dmas = <&sdma 35>,
+                              <&sdma 36>,
+                              <&sdma 37>,
+                              <&sdma 38>,
+                              <&sdma 39>,
+                              <&sdma 40>,
+                              <&sdma 41>,
+                              <&sdma 42>;
+                       dma-names = "tx0", "rx0", "tx1", "rx1",
+                                   "tx2", "rx2", "tx3", "rx3";
+               };
+
+               mcspi2: spi@4809a000 {
+                       compatible = "ti,omap2-mcspi";
+                       reg = <0x4809a000 0x100>;
+                       interrupts = <66>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "mcspi2";
+                       ti,spi-num-cs = <2>;
+                       dmas = <&sdma 43>,
+                              <&sdma 44>,
+                              <&sdma 45>,
+                              <&sdma 46>;
+                       dma-names = "tx0", "rx0", "tx1", "rx1";
+               };
+
+               mcspi3: spi@480b8000 {
+                       compatible = "ti,omap2-mcspi";
+                       reg = <0x480b8000 0x100>;
+                       interrupts = <91>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "mcspi3";
+                       ti,spi-num-cs = <2>;
+                       dmas = <&sdma 15>,
+                              <&sdma 16>,
+                              <&sdma 23>,
+                              <&sdma 24>;
+                       dma-names = "tx0", "rx0", "tx1", "rx1";
+               };
+
+               mcspi4: spi@480ba000 {
+                       compatible = "ti,omap2-mcspi";
+                       reg = <0x480ba000 0x100>;
+                       interrupts = <48>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "mcspi4";
+                       ti,spi-num-cs = <1>;
+                       dmas = <&sdma 70>, <&sdma 71>;
+                       dma-names = "tx0", "rx0";
+               };
+
+               hdqw1w: 1w@480b2000 {
+                       compatible = "ti,omap3-1w";
+                       reg = <0x480b2000 0x1000>;
+                       interrupts = <58>;
+                       ti,hwmods = "hdq1w";
+               };
+
+               mmc1: mmc@4809c000 {
+                       compatible = "ti,omap3-hsmmc";
+                       reg = <0x4809c000 0x200>;
+                       interrupts = <83>;
+                       ti,hwmods = "mmc1";
+                       ti,dual-volt;
+                       dmas = <&sdma 61>, <&sdma 62>;
+                       dma-names = "tx", "rx";
+                       pbias-supply = <&pbias_mmc_reg>;
+               };
+
+               mmc2: mmc@480b4000 {
+                       compatible = "ti,omap3-hsmmc";
+                       reg = <0x480b4000 0x200>;
+                       interrupts = <86>;
+                       ti,hwmods = "mmc2";
+                       dmas = <&sdma 47>, <&sdma 48>;
+                       dma-names = "tx", "rx";
+               };
+
+               mmc3: mmc@480ad000 {
+                       compatible = "ti,omap3-hsmmc";
+                       reg = <0x480ad000 0x200>;
+                       interrupts = <94>;
+                       ti,hwmods = "mmc3";
+                       dmas = <&sdma 77>, <&sdma 78>;
+                       dma-names = "tx", "rx";
+               };
+
+               mmu_isp: mmu@480bd400 {
+                       #iommu-cells = <0>;
+                       compatible = "ti,omap2-iommu";
+                       reg = <0x480bd400 0x80>;
+                       interrupts = <24>;
+                       ti,hwmods = "mmu_isp";
+                       ti,#tlb-entries = <8>;
+               };
+
+               mmu_iva: mmu@5d000000 {
+                       #iommu-cells = <0>;
+                       compatible = "ti,omap2-iommu";
+                       reg = <0x5d000000 0x80>;
+                       interrupts = <28>;
+                       ti,hwmods = "mmu_iva";
+                       status = "disabled";
+               };
+
+               wdt2: wdt@48314000 {
+                       compatible = "ti,omap3-wdt";
+                       reg = <0x48314000 0x80>;
+                       ti,hwmods = "wd_timer2";
+               };
+
+               mcbsp1: mcbsp@48074000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x48074000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <16>, /* OCP compliant interrupt */
+                                    <59>, /* TX interrupt */
+                                    <60>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp1";
+                       dmas = <&sdma 31>,
+                              <&sdma 32>;
+                       dma-names = "tx", "rx";
+                       clocks = <&mcbsp1_fck>;
+                       clock-names = "fck";
+                       status = "disabled";
+               };
+
+               mcbsp2: mcbsp@49022000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x49022000 0xff>,
+                             <0x49028000 0xff>;
+                       reg-names = "mpu", "sidetone";
+                       interrupts = <17>, /* OCP compliant interrupt */
+                                    <62>, /* TX interrupt */
+                                    <63>, /* RX interrupt */
+                                    <4>;  /* Sidetone */
+                       interrupt-names = "common", "tx", "rx", "sidetone";
+                       ti,buffer-size = <1280>;
+                       ti,hwmods = "mcbsp2", "mcbsp2_sidetone";
+                       dmas = <&sdma 33>,
+                              <&sdma 34>;
+                       dma-names = "tx", "rx";
+                       clocks = <&mcbsp2_fck>, <&mcbsp2_ick>;
+                       clock-names = "fck", "ick";
+                       status = "disabled";
+               };
+
+               mcbsp3: mcbsp@49024000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x49024000 0xff>,
+                             <0x4902a000 0xff>;
+                       reg-names = "mpu", "sidetone";
+                       interrupts = <22>, /* OCP compliant interrupt */
+                                    <89>, /* TX interrupt */
+                                    <90>, /* RX interrupt */
+                                    <5>;  /* Sidetone */
+                       interrupt-names = "common", "tx", "rx", "sidetone";
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp3", "mcbsp3_sidetone";
+                       dmas = <&sdma 17>,
+                              <&sdma 18>;
+                       dma-names = "tx", "rx";
+                       clocks = <&mcbsp3_fck>, <&mcbsp3_ick>;
+                       clock-names = "fck", "ick";
+                       status = "disabled";
+               };
+
+               mcbsp4: mcbsp@49026000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x49026000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <23>, /* OCP compliant interrupt */
+                                    <54>, /* TX interrupt */
+                                    <55>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp4";
+                       dmas = <&sdma 19>,
+                              <&sdma 20>;
+                       dma-names = "tx", "rx";
+                       clocks = <&mcbsp4_fck>;
+                       clock-names = "fck";
+                       status = "disabled";
+               };
+
+               mcbsp5: mcbsp@48096000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x48096000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <27>, /* OCP compliant interrupt */
+                                    <81>, /* TX interrupt */
+                                    <82>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp5";
+                       dmas = <&sdma 21>,
+                              <&sdma 22>;
+                       dma-names = "tx", "rx";
+                       clocks = <&mcbsp5_fck>;
+                       clock-names = "fck";
+                       status = "disabled";
+               };
+
+               sham: sham@480c3000 {
+                       compatible = "ti,omap3-sham";
+                       ti,hwmods = "sham";
+                       reg = <0x480c3000 0x64>;
+                       interrupts = <49>;
+                       dmas = <&sdma 69>;
+                       dma-names = "rx";
+               };
+
+               smartreflex_core: smartreflex@480cb000 {
+                       compatible = "ti,omap3-smartreflex-core";
+                       ti,hwmods = "smartreflex_core";
+                       reg = <0x480cb000 0x400>;
+                       interrupts = <19>;
+               };
+
+               smartreflex_mpu_iva: smartreflex@480c9000 {
+                       compatible = "ti,omap3-smartreflex-iva";
+                       ti,hwmods = "smartreflex_mpu_iva";
+                       reg = <0x480c9000 0x400>;
+                       interrupts = <18>;
+               };
+
+               timer1: timer@48318000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x48318000 0x400>;
+                       interrupts = <37>;
+                       ti,hwmods = "timer1";
+                       ti,timer-alwon;
+               };
+
+               timer2: timer@49032000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x49032000 0x400>;
+                       interrupts = <38>;
+                       ti,hwmods = "timer2";
+               };
+
+               timer3: timer@49034000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x49034000 0x400>;
+                       interrupts = <39>;
+                       ti,hwmods = "timer3";
+               };
+
+               timer4: timer@49036000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x49036000 0x400>;
+                       interrupts = <40>;
+                       ti,hwmods = "timer4";
+               };
+
+               timer5: timer@49038000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x49038000 0x400>;
+                       interrupts = <41>;
+                       ti,hwmods = "timer5";
+                       ti,timer-dsp;
+               };
+
+               timer6: timer@4903a000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x4903a000 0x400>;
+                       interrupts = <42>;
+                       ti,hwmods = "timer6";
+                       ti,timer-dsp;
+               };
+
+               timer7: timer@4903c000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x4903c000 0x400>;
+                       interrupts = <43>;
+                       ti,hwmods = "timer7";
+                       ti,timer-dsp;
+               };
+
+               timer8: timer@4903e000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x4903e000 0x400>;
+                       interrupts = <44>;
+                       ti,hwmods = "timer8";
+                       ti,timer-pwm;
+                       ti,timer-dsp;
+               };
+
+               timer9: timer@49040000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x49040000 0x400>;
+                       interrupts = <45>;
+                       ti,hwmods = "timer9";
+                       ti,timer-pwm;
+               };
+
+               timer10: timer@48086000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x48086000 0x400>;
+                       interrupts = <46>;
+                       ti,hwmods = "timer10";
+                       ti,timer-pwm;
+               };
+
+               timer11: timer@48088000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x48088000 0x400>;
+                       interrupts = <47>;
+                       ti,hwmods = "timer11";
+                       ti,timer-pwm;
+               };
+
+               timer12: timer@48304000 {
+                       compatible = "ti,omap3430-timer";
+                       reg = <0x48304000 0x400>;
+                       interrupts = <95>;
+                       ti,hwmods = "timer12";
+                       ti,timer-alwon;
+                       ti,timer-secure;
+               };
+
+               usbhstll: usbhstll@48062000 {
+                       compatible = "ti,usbhs-tll";
+                       reg = <0x48062000 0x1000>;
+                       interrupts = <78>;
+                       ti,hwmods = "usb_tll_hs";
+               };
+
+               usbhshost: usbhshost@48064000 {
+                       compatible = "ti,usbhs-host";
+                       reg = <0x48064000 0x400>;
+                       ti,hwmods = "usb_host_hs";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       usbhsohci: ohci@48064400 {
+                               compatible = "ti,ohci-omap3";
+                               reg = <0x48064400 0x400>;
+                               interrupt-parent = <&intc>;
+                               interrupts = <76>;
+                       };
+
+                       usbhsehci: ehci@48064800 {
+                               compatible = "ti,ehci-omap";
+                               reg = <0x48064800 0x400>;
+                               interrupt-parent = <&intc>;
+                               interrupts = <77>;
+                       };
+               };
+
+               gpmc: gpmc@6e000000 {
+                       compatible = "ti,omap3430-gpmc";
+                       ti,hwmods = "gpmc";
+                       reg = <0x6e000000 0x02d0>;
+                       interrupts = <20>;
+                       dmas = <&sdma 4>;
+                       dma-names = "rxtx";
+                       gpmc,num-cs = <8>;
+                       gpmc,num-waitpins = <4>;
+                       #address-cells = <2>;
+                       #size-cells = <1>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+               };
+
+               usb_otg_hs: usb_otg_hs@480ab000 {
+                       compatible = "ti,omap3-musb";
+                       reg = <0x480ab000 0x1000>;
+                       interrupts = <92>, <93>;
+                       interrupt-names = "mc", "dma";
+                       ti,hwmods = "usb_otg_hs";
+                       multipoint = <1>;
+                       num-eps = <16>;
+                       ram-bits = <12>;
+               };
+
+               dss: dss@48050000 {
+                       compatible = "ti,omap3-dss";
+                       reg = <0x48050000 0x200>;
+                       status = "disabled";
+                       ti,hwmods = "dss_core";
+                       clocks = <&dss1_alwon_fck>;
+                       clock-names = "fck";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       dispc@48050400 {
+                               compatible = "ti,omap3-dispc";
+                               reg = <0x48050400 0x400>;
+                               interrupts = <25>;
+                               ti,hwmods = "dss_dispc";
+                               clocks = <&dss1_alwon_fck>;
+                               clock-names = "fck";
+                       };
+
+                       dsi: encoder@4804fc00 {
+                               compatible = "ti,omap3-dsi";
+                               reg = <0x4804fc00 0x200>,
+                                     <0x4804fe00 0x40>,
+                                     <0x4804ff00 0x20>;
+                               reg-names = "proto", "phy", "pll";
+                               interrupts = <25>;
+                               status = "disabled";
+                               ti,hwmods = "dss_dsi1";
+                               clocks = <&dss1_alwon_fck>, <&dss2_alwon_fck>;
+                               clock-names = "fck", "sys_clk";
+                       };
+
+                       rfbi: encoder@48050800 {
+                               compatible = "ti,omap3-rfbi";
+                               reg = <0x48050800 0x100>;
+                               status = "disabled";
+                               ti,hwmods = "dss_rfbi";
+                               clocks = <&dss1_alwon_fck>, <&dss_ick>;
+                               clock-names = "fck", "ick";
+                       };
+
+                       venc: encoder@48050c00 {
+                               compatible = "ti,omap3-venc";
+                               reg = <0x48050c00 0x100>;
+                               status = "disabled";
+                               ti,hwmods = "dss_venc";
+                               clocks = <&dss_tv_fck>;
+                               clock-names = "fck";
+                       };
+               };
+
+               ssi: ssi-controller@48058000 {
+                       compatible = "ti,omap3-ssi";
+                       ti,hwmods = "ssi";
+
+                       status = "disabled";
+
+                       reg = <0x48058000 0x1000>,
+                             <0x48059000 0x1000>;
+                       reg-names = "sys",
+                                   "gdd";
+
+                       interrupts = <71>;
+                       interrupt-names = "gdd_mpu";
+
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       ssi_port1: ssi-port@4805a000 {
+                               compatible = "ti,omap3-ssi-port";
+
+                               reg = <0x4805a000 0x800>,
+                                     <0x4805a800 0x800>;
+                               reg-names = "tx",
+                                           "rx";
+
+                               interrupt-parent = <&intc>;
+                               interrupts = <67>,
+                                            <68>;
+                       };
+
+                       ssi_port2: ssi-port@4805b000 {
+                               compatible = "ti,omap3-ssi-port";
+
+                               reg = <0x4805b000 0x800>,
+                                     <0x4805b800 0x800>;
+                               reg-names = "tx",
+                                           "rx";
+
+                               interrupt-parent = <&intc>;
+                               interrupts = <69>,
+                                            <70>;
+                       };
+               };
+       };
 };
 
 /include/ "omap3xxx-clocks.dtsi"
index db47f12d12fba6c92576c019262e11c4791b58b6..858aa0796ec8c42b7772c4df4b1c596c40ccef2b 100644 (file)
  * published by the Free Software Foundation.
  */
 &cm_clocks {
-       security_l4_ick2: security_l4_ick2 {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&l4_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
+       security_l4_ick2: security_l4_ick2 {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&l4_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
 
-       aes1_ick: aes1_ick@a14 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&security_l4_ick2>;
-               ti,bit-shift = <3>;
-               reg = <0x0a14>;
-       };
+       aes1_ick: aes1_ick@a14 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&security_l4_ick2>;
+               ti,bit-shift = <3>;
+               reg = <0x0a14>;
+       };
 
-       rng_ick: rng_ick@a14 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&security_l4_ick2>;
-               reg = <0x0a14>;
-               ti,bit-shift = <2>;
-       };
+       rng_ick: rng_ick@a14 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&security_l4_ick2>;
+               reg = <0x0a14>;
+               ti,bit-shift = <2>;
+       };
 
-       sha11_ick: sha11_ick@a14 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&security_l4_ick2>;
-               reg = <0x0a14>;
-               ti,bit-shift = <1>;
-       };
+       sha11_ick: sha11_ick@a14 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&security_l4_ick2>;
+               reg = <0x0a14>;
+               ti,bit-shift = <1>;
+       };
 
-       des1_ick: des1_ick@a14 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&security_l4_ick2>;
-               reg = <0x0a14>;
-               ti,bit-shift = <0>;
-       };
+       des1_ick: des1_ick@a14 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&security_l4_ick2>;
+               reg = <0x0a14>;
+               ti,bit-shift = <0>;
+       };
 
-       cam_mclk: cam_mclk@f00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&dpll4_m5x2_ck>;
-               ti,bit-shift = <0>;
-               reg = <0x0f00>;
-               ti,set-rate-parent;
-       };
+       cam_mclk: cam_mclk@f00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&dpll4_m5x2_ck>;
+               ti,bit-shift = <0>;
+               reg = <0x0f00>;
+               ti,set-rate-parent;
+       };
 
-       cam_ick: cam_ick@f10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-no-wait-interface-clock";
-               clocks = <&l4_ick>;
-               reg = <0x0f10>;
-               ti,bit-shift = <0>;
-       };
+       cam_ick: cam_ick@f10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-no-wait-interface-clock";
+               clocks = <&l4_ick>;
+               reg = <0x0f10>;
+               ti,bit-shift = <0>;
+       };
 
-       csi2_96m_fck: csi2_96m_fck@f00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&core_96m_fck>;
-               reg = <0x0f00>;
-               ti,bit-shift = <1>;
-       };
+       csi2_96m_fck: csi2_96m_fck@f00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&core_96m_fck>;
+               reg = <0x0f00>;
+               ti,bit-shift = <1>;
+       };
 
-       security_l3_ick: security_l3_ick {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&l3_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
+       security_l3_ick: security_l3_ick {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&l3_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
 
-       pka_ick: pka_ick@a14 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&security_l3_ick>;
-               reg = <0x0a14>;
-               ti,bit-shift = <4>;
-       };
+       pka_ick: pka_ick@a14 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&security_l3_ick>;
+               reg = <0x0a14>;
+               ti,bit-shift = <4>;
+       };
 
-       icr_ick: icr_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <29>;
-       };
+       icr_ick: icr_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <29>;
+       };
 
-       des2_ick: des2_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <26>;
-       };
+       des2_ick: des2_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <26>;
+       };
 
-       mspro_ick: mspro_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <23>;
-       };
+       mspro_ick: mspro_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <23>;
+       };
 
-       mailboxes_ick: mailboxes_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <7>;
-       };
+       mailboxes_ick: mailboxes_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <7>;
+       };
 
-       ssi_l4_ick: ssi_l4_ick {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&l4_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
+       ssi_l4_ick: ssi_l4_ick {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&l4_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
 
-       sr1_fck: sr1_fck@c00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&sys_ck>;
-               reg = <0x0c00>;
-               ti,bit-shift = <6>;
-       };
+       sr1_fck: sr1_fck@c00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&sys_ck>;
+               reg = <0x0c00>;
+               ti,bit-shift = <6>;
+       };
 
-       sr2_fck: sr2_fck@c00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&sys_ck>;
-               reg = <0x0c00>;
-               ti,bit-shift = <7>;
-       };
+       sr2_fck: sr2_fck@c00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&sys_ck>;
+               reg = <0x0c00>;
+               ti,bit-shift = <7>;
+       };
 
-       sr_l4_ick: sr_l4_ick {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&l4_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
+       sr_l4_ick: sr_l4_ick {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&l4_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
 
-       dpll2_fck: dpll2_fck@40 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&core_ck>;
-               ti,bit-shift = <19>;
-               ti,max-div = <7>;
-               reg = <0x0040>;
-               ti,index-starts-at-one;
-       };
+       dpll2_fck: dpll2_fck@40 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&core_ck>;
+               ti,bit-shift = <19>;
+               ti,max-div = <7>;
+               reg = <0x0040>;
+               ti,index-starts-at-one;
+       };
 
-       dpll2_ck: dpll2_ck@4 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-dpll-clock";
-               clocks = <&sys_ck>, <&dpll2_fck>;
-               reg = <0x0004>, <0x0024>, <0x0040>, <0x0034>;
-               ti,low-power-stop;
-               ti,lock;
-               ti,low-power-bypass;
-       };
+       dpll2_ck: dpll2_ck@4 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-dpll-clock";
+               clocks = <&sys_ck>, <&dpll2_fck>;
+               reg = <0x0004>, <0x0024>, <0x0040>, <0x0034>;
+               ti,low-power-stop;
+               ti,lock;
+               ti,low-power-bypass;
+       };
 
-       dpll2_m2_ck: dpll2_m2_ck@44 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll2_ck>;
-               ti,max-div = <31>;
-               reg = <0x0044>;
-               ti,index-starts-at-one;
-       };
+       dpll2_m2_ck: dpll2_m2_ck@44 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll2_ck>;
+               ti,max-div = <31>;
+               reg = <0x0044>;
+               ti,index-starts-at-one;
+       };
 
-       iva2_ck: iva2_ck@0 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&dpll2_m2_ck>;
-               reg = <0x0000>;
-               ti,bit-shift = <0>;
-       };
+       iva2_ck: iva2_ck@0 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&dpll2_m2_ck>;
+               reg = <0x0000>;
+               ti,bit-shift = <0>;
+       };
 
-       modem_fck: modem_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&sys_ck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <31>;
-       };
+       modem_fck: modem_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&sys_ck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <31>;
+       };
 
-       sad2d_ick: sad2d_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&l3_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <3>;
-       };
+       sad2d_ick: sad2d_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&l3_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <3>;
+       };
 
-       mad2d_ick: mad2d_ick@a18 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&l3_ick>;
-               reg = <0x0a18>;
-               ti,bit-shift = <3>;
-       };
+       mad2d_ick: mad2d_ick@a18 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&l3_ick>;
+               reg = <0x0a18>;
+               ti,bit-shift = <3>;
+       };
 
-       mspro_fck: mspro_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_96m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <23>;
-       };
+       mspro_fck: mspro_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_96m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <23>;
+       };
 };
 
 &cm_clockdomains {
-       cam_clkdm: cam_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&cam_ick>, <&csi2_96m_fck>;
-       };
+       cam_clkdm: cam_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&cam_ick>, <&csi2_96m_fck>;
+       };
 
-       iva2_clkdm: iva2_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&iva2_ck>;
-       };
+       iva2_clkdm: iva2_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&iva2_ck>;
+       };
 
-       dpll2_clkdm: dpll2_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&dpll2_ck>;
-       };
+       dpll2_clkdm: dpll2_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&dpll2_ck>;
+       };
 
-       wkup_clkdm: wkup_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&gpio1_dbck>, <&wdt2_fck>, <&wdt2_ick>, <&wdt1_ick>,
-                        <&gpio1_ick>, <&omap_32ksync_ick>, <&gpt12_ick>,
-                        <&gpt1_ick>, <&sr1_fck>, <&sr2_fck>;
-       };
+       wkup_clkdm: wkup_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&gpio1_dbck>, <&wdt2_fck>, <&wdt2_ick>, <&wdt1_ick>,
+                        <&gpio1_ick>, <&omap_32ksync_ick>, <&gpt12_ick>,
+                        <&gpt1_ick>, <&sr1_fck>, <&sr2_fck>;
+       };
 
-       d2d_clkdm: d2d_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&modem_fck>, <&sad2d_ick>, <&mad2d_ick>;
-       };
+       d2d_clkdm: d2d_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&modem_fck>, <&sad2d_ick>, <&mad2d_ick>;
+       };
 
-       core_l4_clkdm: core_l4_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&mmchs2_fck>, <&mmchs1_fck>, <&i2c3_fck>, <&i2c2_fck>,
-                        <&i2c1_fck>, <&mcspi4_fck>, <&mcspi3_fck>,
-                        <&mcspi2_fck>, <&mcspi1_fck>, <&uart2_fck>,
-                        <&uart1_fck>, <&hdq_fck>, <&mmchs2_ick>, <&mmchs1_ick>,
-                        <&hdq_ick>, <&mcspi4_ick>, <&mcspi3_ick>,
-                        <&mcspi2_ick>, <&mcspi1_ick>, <&i2c3_ick>, <&i2c2_ick>,
-                        <&i2c1_ick>, <&uart2_ick>, <&uart1_ick>, <&gpt11_ick>,
-                        <&gpt10_ick>, <&mcbsp5_ick>, <&mcbsp1_ick>,
-                        <&omapctrl_ick>, <&aes2_ick>, <&sha12_ick>, <&icr_ick>,
-                        <&des2_ick>, <&mspro_ick>, <&mailboxes_ick>,
-                        <&mspro_fck>;
-       };
+       core_l4_clkdm: core_l4_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&mmchs2_fck>, <&mmchs1_fck>, <&i2c3_fck>, <&i2c2_fck>,
+                        <&i2c1_fck>, <&mcspi4_fck>, <&mcspi3_fck>,
+                        <&mcspi2_fck>, <&mcspi1_fck>, <&uart2_fck>,
+                        <&uart1_fck>, <&hdq_fck>, <&mmchs2_ick>, <&mmchs1_ick>,
+                        <&hdq_ick>, <&mcspi4_ick>, <&mcspi3_ick>,
+                        <&mcspi2_ick>, <&mcspi1_ick>, <&i2c3_ick>, <&i2c2_ick>,
+                        <&i2c1_ick>, <&uart2_ick>, <&uart1_ick>, <&gpt11_ick>,
+                        <&gpt10_ick>, <&mcbsp5_ick>, <&mcbsp1_ick>,
+                        <&omapctrl_ick>, <&aes2_ick>, <&sha12_ick>, <&icr_ick>,
+                        <&des2_ick>, <&mspro_ick>, <&mailboxes_ick>,
+                        <&mspro_fck>;
+       };
 };
index 572cb5377b665e2d2ea4311e5e2999994d70b9e4..15d18669000e4d236921169d5836b194cf4ff17b 100644 (file)
  * published by the Free Software Foundation.
  */
 &prm_clocks {
-       corex2_d3_fck: corex2_d3_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&corex2_fck>;
-               clock-mult = <1>;
-               clock-div = <3>;
-       };
-
-       corex2_d5_fck: corex2_d5_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&corex2_fck>;
-               clock-mult = <1>;
-               clock-div = <5>;
-       };
+       corex2_d3_fck: corex2_d3_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&corex2_fck>;
+               clock-mult = <1>;
+               clock-div = <3>;
+       };
+
+       corex2_d5_fck: corex2_d5_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&corex2_fck>;
+               clock-mult = <1>;
+               clock-div = <5>;
+       };
 };
 &cm_clocks {
-       dpll5_ck: dpll5_ck@d04 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-dpll-clock";
-               clocks = <&sys_ck>, <&sys_ck>;
-               reg = <0x0d04>, <0x0d24>, <0x0d4c>, <0x0d34>;
-               ti,low-power-stop;
-               ti,lock;
-       };
-
-       dpll5_m2_ck: dpll5_m2_ck@d50 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll5_ck>;
-               ti,max-div = <31>;
-               reg = <0x0d50>;
-               ti,index-starts-at-one;
-       };
-
-       sgx_gate_fck: sgx_gate_fck@b00 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&core_ck>;
-               ti,bit-shift = <1>;
-               reg = <0x0b00>;
-       };
-
-       core_d3_ck: core_d3_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&core_ck>;
-               clock-mult = <1>;
-               clock-div = <3>;
-       };
-
-       core_d4_ck: core_d4_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&core_ck>;
-               clock-mult = <1>;
-               clock-div = <4>;
-       };
-
-       core_d6_ck: core_d6_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&core_ck>;
-               clock-mult = <1>;
-               clock-div = <6>;
-       };
-
-       omap_192m_alwon_fck: omap_192m_alwon_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll4_m2x2_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       core_d2_ck: core_d2_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&core_ck>;
-               clock-mult = <1>;
-               clock-div = <2>;
-       };
-
-       sgx_mux_fck: sgx_mux_fck@b40 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&core_d3_ck>, <&core_d4_ck>, <&core_d6_ck>, <&cm_96m_fck>, <&omap_192m_alwon_fck>, <&core_d2_ck>, <&corex2_d3_fck>, <&corex2_d5_fck>;
-               reg = <0x0b40>;
-       };
-
-       sgx_fck: sgx_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&sgx_gate_fck>, <&sgx_mux_fck>;
-       };
-
-       sgx_ick: sgx_ick@b10 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&l3_ick>;
-               reg = <0x0b10>;
-               ti,bit-shift = <0>;
-       };
-
-       cpefuse_fck: cpefuse_fck@a08 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&sys_ck>;
-               reg = <0x0a08>;
-               ti,bit-shift = <0>;
-       };
-
-       ts_fck: ts_fck@a08 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&omap_32k_fck>;
-               reg = <0x0a08>;
-               ti,bit-shift = <1>;
-       };
-
-       usbtll_fck: usbtll_fck@a08 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&dpll5_m2_ck>;
-               reg = <0x0a08>;
-               ti,bit-shift = <2>;
-       };
-
-       usbtll_ick: usbtll_ick@a18 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a18>;
-               ti,bit-shift = <2>;
-       };
-
-       mmchs3_ick: mmchs3_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <30>;
-       };
-
-       mmchs3_fck: mmchs3_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_96m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <30>;
-       };
-
-       dss1_alwon_fck: dss1_alwon_fck_3430es2@e00 {
-               #clock-cells = <0>;
-               compatible = "ti,dss-gate-clock";
-               clocks = <&dpll4_m4x2_ck>;
-               ti,bit-shift = <0>;
-               reg = <0x0e00>;
-               ti,set-rate-parent;
-       };
-
-       dss_ick: dss_ick_3430es2@e10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-dss-interface-clock";
-               clocks = <&l4_ick>;
-               reg = <0x0e10>;
-               ti,bit-shift = <0>;
-       };
-
-       usbhost_120m_fck: usbhost_120m_fck@1400 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&dpll5_m2_ck>;
-               reg = <0x1400>;
-               ti,bit-shift = <1>;
-       };
-
-       usbhost_48m_fck: usbhost_48m_fck@1400 {
-               #clock-cells = <0>;
-               compatible = "ti,dss-gate-clock";
-               clocks = <&omap_48m_fck>;
-               reg = <0x1400>;
-               ti,bit-shift = <0>;
-       };
-
-       usbhost_ick: usbhost_ick@1410 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-dss-interface-clock";
-               clocks = <&l4_ick>;
-               reg = <0x1410>;
-               ti,bit-shift = <0>;
-       };
+       dpll5_ck: dpll5_ck@d04 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-dpll-clock";
+               clocks = <&sys_ck>, <&sys_ck>;
+               reg = <0x0d04>, <0x0d24>, <0x0d4c>, <0x0d34>;
+               ti,low-power-stop;
+               ti,lock;
+       };
+
+       dpll5_m2_ck: dpll5_m2_ck@d50 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll5_ck>;
+               ti,max-div = <31>;
+               reg = <0x0d50>;
+               ti,index-starts-at-one;
+       };
+
+       sgx_gate_fck: sgx_gate_fck@b00 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&core_ck>;
+               ti,bit-shift = <1>;
+               reg = <0x0b00>;
+       };
+
+       core_d3_ck: core_d3_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&core_ck>;
+               clock-mult = <1>;
+               clock-div = <3>;
+       };
+
+       core_d4_ck: core_d4_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&core_ck>;
+               clock-mult = <1>;
+               clock-div = <4>;
+       };
+
+       core_d6_ck: core_d6_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&core_ck>;
+               clock-mult = <1>;
+               clock-div = <6>;
+       };
+
+       omap_192m_alwon_fck: omap_192m_alwon_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll4_m2x2_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       core_d2_ck: core_d2_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&core_ck>;
+               clock-mult = <1>;
+               clock-div = <2>;
+       };
+
+       sgx_mux_fck: sgx_mux_fck@b40 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&core_d3_ck>, <&core_d4_ck>, <&core_d6_ck>, <&cm_96m_fck>, <&omap_192m_alwon_fck>, <&core_d2_ck>, <&corex2_d3_fck>, <&corex2_d5_fck>;
+               reg = <0x0b40>;
+       };
+
+       sgx_fck: sgx_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&sgx_gate_fck>, <&sgx_mux_fck>;
+       };
+
+       sgx_ick: sgx_ick@b10 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&l3_ick>;
+               reg = <0x0b10>;
+               ti,bit-shift = <0>;
+       };
+
+       cpefuse_fck: cpefuse_fck@a08 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&sys_ck>;
+               reg = <0x0a08>;
+               ti,bit-shift = <0>;
+       };
+
+       ts_fck: ts_fck@a08 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&omap_32k_fck>;
+               reg = <0x0a08>;
+               ti,bit-shift = <1>;
+       };
+
+       usbtll_fck: usbtll_fck@a08 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&dpll5_m2_ck>;
+               reg = <0x0a08>;
+               ti,bit-shift = <2>;
+       };
+
+       usbtll_ick: usbtll_ick@a18 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a18>;
+               ti,bit-shift = <2>;
+       };
+
+       mmchs3_ick: mmchs3_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <30>;
+       };
+
+       mmchs3_fck: mmchs3_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_96m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <30>;
+       };
+
+       dss1_alwon_fck: dss1_alwon_fck_3430es2@e00 {
+               #clock-cells = <0>;
+               compatible = "ti,dss-gate-clock";
+               clocks = <&dpll4_m4x2_ck>;
+               ti,bit-shift = <0>;
+               reg = <0x0e00>;
+               ti,set-rate-parent;
+       };
+
+       dss_ick: dss_ick_3430es2@e10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-dss-interface-clock";
+               clocks = <&l4_ick>;
+               reg = <0x0e10>;
+               ti,bit-shift = <0>;
+       };
+
+       usbhost_120m_fck: usbhost_120m_fck@1400 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&dpll5_m2_ck>;
+               reg = <0x1400>;
+               ti,bit-shift = <1>;
+       };
+
+       usbhost_48m_fck: usbhost_48m_fck@1400 {
+               #clock-cells = <0>;
+               compatible = "ti,dss-gate-clock";
+               clocks = <&omap_48m_fck>;
+               reg = <0x1400>;
+               ti,bit-shift = <0>;
+       };
+
+       usbhost_ick: usbhost_ick@1410 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-dss-interface-clock";
+               clocks = <&l4_ick>;
+               reg = <0x1410>;
+               ti,bit-shift = <0>;
+       };
 };
 
 &cm_clockdomains {
-       dpll5_clkdm: dpll5_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&dpll5_ck>;
-       };
-
-       sgx_clkdm: sgx_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&sgx_ick>;
-       };
-
-       dss_clkdm: dss_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&dss_tv_fck>, <&dss_96m_fck>, <&dss2_alwon_fck>,
-                        <&dss1_alwon_fck>, <&dss_ick>;
-       };
-
-       core_l4_clkdm: core_l4_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&mmchs2_fck>, <&mmchs1_fck>, <&i2c3_fck>, <&i2c2_fck>,
-                        <&i2c1_fck>, <&mcspi4_fck>, <&mcspi3_fck>,
-                        <&mcspi2_fck>, <&mcspi1_fck>, <&uart2_fck>,
-                        <&uart1_fck>, <&hdq_fck>, <&mmchs2_ick>, <&mmchs1_ick>,
-                        <&hdq_ick>, <&mcspi4_ick>, <&mcspi3_ick>,
-                        <&mcspi2_ick>, <&mcspi1_ick>, <&i2c3_ick>, <&i2c2_ick>,
-                        <&i2c1_ick>, <&uart2_ick>, <&uart1_ick>, <&gpt11_ick>,
-                        <&gpt10_ick>, <&mcbsp5_ick>, <&mcbsp1_ick>,
-                        <&omapctrl_ick>, <&aes2_ick>, <&sha12_ick>,
-                        <&cpefuse_fck>, <&ts_fck>, <&usbtll_fck>,
-                        <&usbtll_ick>, <&mmchs3_ick>, <&mmchs3_fck>;
-       };
-
-       usbhost_clkdm: usbhost_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&usbhost_120m_fck>, <&usbhost_48m_fck>,
-                        <&usbhost_ick>;
-       };
+       dpll5_clkdm: dpll5_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&dpll5_ck>;
+       };
+
+       sgx_clkdm: sgx_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&sgx_ick>;
+       };
+
+       dss_clkdm: dss_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&dss_tv_fck>, <&dss_96m_fck>, <&dss2_alwon_fck>,
+                        <&dss1_alwon_fck>, <&dss_ick>;
+       };
+
+       core_l4_clkdm: core_l4_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&mmchs2_fck>, <&mmchs1_fck>, <&i2c3_fck>, <&i2c2_fck>,
+                        <&i2c1_fck>, <&mcspi4_fck>, <&mcspi3_fck>,
+                        <&mcspi2_fck>, <&mcspi1_fck>, <&uart2_fck>,
+                        <&uart1_fck>, <&hdq_fck>, <&mmchs2_ick>, <&mmchs1_ick>,
+                        <&hdq_ick>, <&mcspi4_ick>, <&mcspi3_ick>,
+                        <&mcspi2_ick>, <&mcspi1_ick>, <&i2c3_ick>, <&i2c2_ick>,
+                        <&i2c1_ick>, <&uart2_ick>, <&uart1_ick>, <&gpt11_ick>,
+                        <&gpt10_ick>, <&mcbsp5_ick>, <&mcbsp1_ick>,
+                        <&omapctrl_ick>, <&aes2_ick>, <&sha12_ick>,
+                        <&cpefuse_fck>, <&ts_fck>, <&usbtll_fck>,
+                        <&usbtll_ick>, <&mmchs3_ick>, <&mmchs3_fck>;
+       };
+
+       usbhost_clkdm: usbhost_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&usbhost_120m_fck>, <&usbhost_48m_fck>,
+                        <&usbhost_ick>;
+       };
 };
index 9c7ed0337708a012717cee2284f8e42c0b5bbd4e..a21d1f0212679fdf412ddced7cb7f34a00818975 100644 (file)
  * published by the Free Software Foundation.
  */
 &cm_clocks {
-       dpll4_ck: dpll4_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-dpll-per-j-type-clock";
-               clocks = <&sys_ck>, <&sys_ck>;
-               reg = <0x0d00>, <0x0d20>, <0x0d44>, <0x0d30>;
-       };
+       dpll4_ck: dpll4_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-dpll-per-j-type-clock";
+               clocks = <&sys_ck>, <&sys_ck>;
+               reg = <0x0d00>, <0x0d20>, <0x0d44>, <0x0d30>;
+       };
 
-       dpll4_m5x2_ck: dpll4_m5x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,hsdiv-gate-clock";
-               clocks = <&dpll4_m5x2_mul_ck>;
-               ti,bit-shift = <0x1e>;
-               reg = <0x0d00>;
-               ti,set-rate-parent;
-               ti,set-bit-to-disable;
-       };
+       dpll4_m5x2_ck: dpll4_m5x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,hsdiv-gate-clock";
+               clocks = <&dpll4_m5x2_mul_ck>;
+               ti,bit-shift = <0x1e>;
+               reg = <0x0d00>;
+               ti,set-rate-parent;
+               ti,set-bit-to-disable;
+       };
 
-       dpll4_m2x2_ck: dpll4_m2x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,hsdiv-gate-clock";
-               clocks = <&dpll4_m2x2_mul_ck>;
-               ti,bit-shift = <0x1b>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-       };
+       dpll4_m2x2_ck: dpll4_m2x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,hsdiv-gate-clock";
+               clocks = <&dpll4_m2x2_mul_ck>;
+               ti,bit-shift = <0x1b>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+       };
 
-       dpll3_m3x2_ck: dpll3_m3x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,hsdiv-gate-clock";
-               clocks = <&dpll3_m3x2_mul_ck>;
-               ti,bit-shift = <0xc>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-       };
+       dpll3_m3x2_ck: dpll3_m3x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,hsdiv-gate-clock";
+               clocks = <&dpll3_m3x2_mul_ck>;
+               ti,bit-shift = <0xc>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+       };
 
-       dpll4_m3x2_ck: dpll4_m3x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,hsdiv-gate-clock";
-               clocks = <&dpll4_m3x2_mul_ck>;
-               ti,bit-shift = <0x1c>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-       };
+       dpll4_m3x2_ck: dpll4_m3x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,hsdiv-gate-clock";
+               clocks = <&dpll4_m3x2_mul_ck>;
+               ti,bit-shift = <0x1c>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+       };
 
-       dpll4_m6x2_ck: dpll4_m6x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,hsdiv-gate-clock";
-               clocks = <&dpll4_m6x2_mul_ck>;
-               ti,bit-shift = <0x1f>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-       };
+       dpll4_m6x2_ck: dpll4_m6x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,hsdiv-gate-clock";
+               clocks = <&dpll4_m6x2_mul_ck>;
+               ti,bit-shift = <0x1f>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+       };
 
-       uart4_fck: uart4_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&per_48m_fck>;
-               reg = <0x1000>;
-               ti,bit-shift = <18>;
-       };
+       uart4_fck: uart4_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&per_48m_fck>;
+               reg = <0x1000>;
+               ti,bit-shift = <18>;
+       };
 };
 
 &dpll4_m2x2_mul_ck {
-       clock-mult = <1>;
+       clock-mult = <1>;
 };
 
 &dpll4_m3x2_mul_ck {
-       clock-mult = <1>;
+       clock-mult = <1>;
 };
 
 &dpll4_m4x2_mul_ck {
-       ti,clock-mult = <1>;
+       ti,clock-mult = <1>;
 };
 
 &dpll4_m5x2_mul_ck {
-       ti,clock-mult = <1>;
+       ti,clock-mult = <1>;
 };
 
 &dpll4_m6x2_mul_ck {
-       clock-mult = <1>;
+       clock-mult = <1>;
 };
 
 &cm_clockdomains {
-       dpll4_clkdm: dpll4_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&dpll4_ck>;
-       };
+       dpll4_clkdm: dpll4_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&dpll4_ck>;
+       };
 
-       per_clkdm: per_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&uart3_fck>, <&gpio6_dbck>, <&gpio5_dbck>,
-                        <&gpio4_dbck>, <&gpio3_dbck>, <&gpio2_dbck>,
-                        <&wdt3_fck>, <&gpio6_ick>, <&gpio5_ick>, <&gpio4_ick>,
-                        <&gpio3_ick>, <&gpio2_ick>, <&wdt3_ick>, <&uart3_ick>,
-                        <&uart4_ick>, <&gpt9_ick>, <&gpt8_ick>, <&gpt7_ick>,
-                        <&gpt6_ick>, <&gpt5_ick>, <&gpt4_ick>, <&gpt3_ick>,
-                        <&gpt2_ick>, <&mcbsp2_ick>, <&mcbsp3_ick>,
-                        <&mcbsp4_ick>, <&uart4_fck>;
-       };
+       per_clkdm: per_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&uart3_fck>, <&gpio6_dbck>, <&gpio5_dbck>,
+                        <&gpio4_dbck>, <&gpio3_dbck>, <&gpio2_dbck>,
+                        <&wdt3_fck>, <&gpio6_ick>, <&gpio5_ick>, <&gpio4_ick>,
+                        <&gpio3_ick>, <&gpio2_ick>, <&wdt3_ick>, <&uart3_ick>,
+                        <&uart4_ick>, <&gpt9_ick>, <&gpt8_ick>, <&gpt7_ick>,
+                        <&gpt6_ick>, <&gpt5_ick>, <&gpt4_ick>, <&gpt3_ick>,
+                        <&gpt2_ick>, <&mcbsp2_ick>, <&mcbsp3_ick>,
+                        <&mcbsp4_ick>, <&uart4_fck>;
+       };
 };
index a9eec1bc4af10f598873fe0d23bfe93c8ed61352..1a4fbdf0d9cc35be54879ea096dff9a4a49a0679 100644 (file)
  * published by the Free Software Foundation.
  */
 &cm_clocks {
-       ssi_ssr_gate_fck_3430es2: ssi_ssr_gate_fck_3430es2@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-no-wait-gate-clock";
-               clocks = <&corex2_fck>;
-               ti,bit-shift = <0>;
-               reg = <0x0a00>;
-       };
-
-       ssi_ssr_div_fck_3430es2: ssi_ssr_div_fck_3430es2@a40 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-divider-clock";
-               clocks = <&corex2_fck>;
-               ti,bit-shift = <8>;
-               reg = <0x0a40>;
-               ti,dividers = <0>, <1>, <2>, <3>, <4>, <0>, <6>, <0>, <8>;
-       };
-
-       ssi_ssr_fck: ssi_ssr_fck_3430es2 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&ssi_ssr_gate_fck_3430es2>, <&ssi_ssr_div_fck_3430es2>;
-       };
-
-       ssi_sst_fck: ssi_sst_fck_3430es2 {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&ssi_ssr_fck>;
-               clock-mult = <1>;
-               clock-div = <2>;
-       };
-
-       hsotgusb_ick_3430es2: hsotgusb_ick_3430es2@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-hsotgusb-interface-clock";
-               clocks = <&core_l3_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <4>;
-       };
-
-       ssi_l4_ick: ssi_l4_ick {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&l4_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       ssi_ick: ssi_ick_3430es2@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-ssi-interface-clock";
-               clocks = <&ssi_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <0>;
-       };
-
-       usim_gate_fck: usim_gate_fck@c00 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&omap_96m_fck>;
-               ti,bit-shift = <9>;
-               reg = <0x0c00>;
-       };
-
-       sys_d2_ck: sys_d2_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&sys_ck>;
-               clock-mult = <1>;
-               clock-div = <2>;
-       };
-
-       omap_96m_d2_fck: omap_96m_d2_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_96m_fck>;
-               clock-mult = <1>;
-               clock-div = <2>;
-       };
-
-       omap_96m_d4_fck: omap_96m_d4_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_96m_fck>;
-               clock-mult = <1>;
-               clock-div = <4>;
-       };
-
-       omap_96m_d8_fck: omap_96m_d8_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_96m_fck>;
-               clock-mult = <1>;
-               clock-div = <8>;
-       };
-
-       omap_96m_d10_fck: omap_96m_d10_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_96m_fck>;
-               clock-mult = <1>;
-               clock-div = <10>;
-       };
-
-       dpll5_m2_d4_ck: dpll5_m2_d4_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll5_m2_ck>;
-               clock-mult = <1>;
-               clock-div = <4>;
-       };
-
-       dpll5_m2_d8_ck: dpll5_m2_d8_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll5_m2_ck>;
-               clock-mult = <1>;
-               clock-div = <8>;
-       };
-
-       dpll5_m2_d16_ck: dpll5_m2_d16_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll5_m2_ck>;
-               clock-mult = <1>;
-               clock-div = <16>;
-       };
-
-       dpll5_m2_d20_ck: dpll5_m2_d20_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll5_m2_ck>;
-               clock-mult = <1>;
-               clock-div = <20>;
-       };
-
-       usim_mux_fck: usim_mux_fck@c40 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&sys_ck>, <&sys_d2_ck>, <&omap_96m_d2_fck>, <&omap_96m_d4_fck>, <&omap_96m_d8_fck>, <&omap_96m_d10_fck>, <&dpll5_m2_d4_ck>, <&dpll5_m2_d8_ck>, <&dpll5_m2_d16_ck>, <&dpll5_m2_d20_ck>;
-               ti,bit-shift = <3>;
-               reg = <0x0c40>;
-               ti,index-starts-at-one;
-       };
-
-       usim_fck: usim_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&usim_gate_fck>, <&usim_mux_fck>;
-       };
-
-       usim_ick: usim_ick@c10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&wkup_l4_ick>;
-               reg = <0x0c10>;
-               ti,bit-shift = <9>;
-       };
+       ssi_ssr_gate_fck_3430es2: ssi_ssr_gate_fck_3430es2@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-no-wait-gate-clock";
+               clocks = <&corex2_fck>;
+               ti,bit-shift = <0>;
+               reg = <0x0a00>;
+       };
+
+       ssi_ssr_div_fck_3430es2: ssi_ssr_div_fck_3430es2@a40 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-divider-clock";
+               clocks = <&corex2_fck>;
+               ti,bit-shift = <8>;
+               reg = <0x0a40>;
+               ti,dividers = <0>, <1>, <2>, <3>, <4>, <0>, <6>, <0>, <8>;
+       };
+
+       ssi_ssr_fck: ssi_ssr_fck_3430es2 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&ssi_ssr_gate_fck_3430es2>, <&ssi_ssr_div_fck_3430es2>;
+       };
+
+       ssi_sst_fck: ssi_sst_fck_3430es2 {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&ssi_ssr_fck>;
+               clock-mult = <1>;
+               clock-div = <2>;
+       };
+
+       hsotgusb_ick_3430es2: hsotgusb_ick_3430es2@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-hsotgusb-interface-clock";
+               clocks = <&core_l3_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <4>;
+       };
+
+       ssi_l4_ick: ssi_l4_ick {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&l4_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       ssi_ick: ssi_ick_3430es2@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-ssi-interface-clock";
+               clocks = <&ssi_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <0>;
+       };
+
+       usim_gate_fck: usim_gate_fck@c00 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&omap_96m_fck>;
+               ti,bit-shift = <9>;
+               reg = <0x0c00>;
+       };
+
+       sys_d2_ck: sys_d2_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&sys_ck>;
+               clock-mult = <1>;
+               clock-div = <2>;
+       };
+
+       omap_96m_d2_fck: omap_96m_d2_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_96m_fck>;
+               clock-mult = <1>;
+               clock-div = <2>;
+       };
+
+       omap_96m_d4_fck: omap_96m_d4_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_96m_fck>;
+               clock-mult = <1>;
+               clock-div = <4>;
+       };
+
+       omap_96m_d8_fck: omap_96m_d8_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_96m_fck>;
+               clock-mult = <1>;
+               clock-div = <8>;
+       };
+
+       omap_96m_d10_fck: omap_96m_d10_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_96m_fck>;
+               clock-mult = <1>;
+               clock-div = <10>;
+       };
+
+       dpll5_m2_d4_ck: dpll5_m2_d4_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll5_m2_ck>;
+               clock-mult = <1>;
+               clock-div = <4>;
+       };
+
+       dpll5_m2_d8_ck: dpll5_m2_d8_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll5_m2_ck>;
+               clock-mult = <1>;
+               clock-div = <8>;
+       };
+
+       dpll5_m2_d16_ck: dpll5_m2_d16_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll5_m2_ck>;
+               clock-mult = <1>;
+               clock-div = <16>;
+       };
+
+       dpll5_m2_d20_ck: dpll5_m2_d20_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll5_m2_ck>;
+               clock-mult = <1>;
+               clock-div = <20>;
+       };
+
+       usim_mux_fck: usim_mux_fck@c40 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&sys_ck>, <&sys_d2_ck>, <&omap_96m_d2_fck>, <&omap_96m_d4_fck>, <&omap_96m_d8_fck>, <&omap_96m_d10_fck>, <&dpll5_m2_d4_ck>, <&dpll5_m2_d8_ck>, <&dpll5_m2_d16_ck>, <&dpll5_m2_d20_ck>;
+               ti,bit-shift = <3>;
+               reg = <0x0c40>;
+               ti,index-starts-at-one;
+       };
+
+       usim_fck: usim_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&usim_gate_fck>, <&usim_mux_fck>;
+       };
+
+       usim_ick: usim_ick@c10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&wkup_l4_ick>;
+               reg = <0x0c10>;
+               ti,bit-shift = <9>;
+       };
 };
 
 &cm_clockdomains {
-       core_l3_clkdm: core_l3_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&sdrc_ick>, <&hsotgusb_ick_3430es2>;
-       };
-
-       wkup_clkdm: wkup_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&gpio1_dbck>, <&wdt2_fck>, <&wdt2_ick>, <&wdt1_ick>,
-                        <&gpio1_ick>, <&omap_32ksync_ick>, <&gpt12_ick>,
-                        <&gpt1_ick>, <&usim_ick>;
-       };
-
-       core_l4_clkdm: core_l4_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&cpefuse_fck>, <&ts_fck>, <&usbtll_fck>,
-                        <&usbtll_ick>, <&mmchs3_ick>, <&mmchs3_fck>,
-                        <&mmchs2_fck>, <&mmchs1_fck>, <&i2c3_fck>, <&i2c2_fck>,
-                        <&i2c1_fck>, <&mcspi4_fck>, <&mcspi3_fck>,
-                        <&mcspi2_fck>, <&mcspi1_fck>, <&uart2_fck>,
-                        <&uart1_fck>, <&hdq_fck>, <&mmchs2_ick>, <&mmchs1_ick>,
-                        <&hdq_ick>, <&mcspi4_ick>, <&mcspi3_ick>,
-                        <&mcspi2_ick>, <&mcspi1_ick>, <&i2c3_ick>, <&i2c2_ick>,
-                        <&i2c1_ick>, <&uart2_ick>, <&uart1_ick>, <&gpt11_ick>,
-                        <&gpt10_ick>, <&mcbsp5_ick>, <&mcbsp1_ick>,
-                        <&omapctrl_ick>, <&aes2_ick>, <&sha12_ick>,
-                        <&ssi_ick>;
-       };
+       core_l3_clkdm: core_l3_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&sdrc_ick>, <&hsotgusb_ick_3430es2>;
+       };
+
+       wkup_clkdm: wkup_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&gpio1_dbck>, <&wdt2_fck>, <&wdt2_ick>, <&wdt1_ick>,
+                        <&gpio1_ick>, <&omap_32ksync_ick>, <&gpt12_ick>,
+                        <&gpt1_ick>, <&usim_ick>;
+       };
+
+       core_l4_clkdm: core_l4_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&cpefuse_fck>, <&ts_fck>, <&usbtll_fck>,
+                        <&usbtll_ick>, <&mmchs3_ick>, <&mmchs3_fck>,
+                        <&mmchs2_fck>, <&mmchs1_fck>, <&i2c3_fck>, <&i2c2_fck>,
+                        <&i2c1_fck>, <&mcspi4_fck>, <&mcspi3_fck>,
+                        <&mcspi2_fck>, <&mcspi1_fck>, <&uart2_fck>,
+                        <&uart1_fck>, <&hdq_fck>, <&mmchs2_ick>, <&mmchs1_ick>,
+                        <&hdq_ick>, <&mcspi4_ick>, <&mcspi3_ick>,
+                        <&mcspi2_ick>, <&mcspi1_ick>, <&i2c3_ick>, <&i2c2_ick>,
+                        <&i2c1_ick>, <&uart2_ick>, <&uart1_ick>, <&gpt11_ick>,
+                        <&gpt10_ick>, <&mcbsp5_ick>, <&mcbsp1_ick>,
+                        <&omapctrl_ick>, <&aes2_ick>, <&sha12_ick>,
+                        <&ssi_ick>;
+       };
 };
diff --git a/arch/arm/dts/omap36xx-u-boot.dtsi b/arch/arm/dts/omap36xx-u-boot.dtsi
new file mode 100644 (file)
index 0000000..2190052
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * Copyright (C) 2017
+ * Logic PD - http://www.logicpd.com
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+&uart4 {
+       reg-shift = <2>;
+};
index fc22f0d2dc804b1d0ee79fa30705b54b4540d6db..a0f2d9e805353079d404cdd2979c8dba7fdb1623 100644 (file)
 #include "omap3.dtsi"
 
 / {
-       aliases {
-               serial3 = &uart4;
-       };
+       aliases {
+               serial3 = &uart4;
+       };
 
-       cpus {
-               /* OMAP3630/OMAP37xx 'standard device' variants OPP50 to OPP130 */
-               cpu@0 {
-                       operating-points = <
-                               /* kHz    uV */
-                               300000  1012500
-                               600000  1200000
-                               800000  1325000
-                       >;
-                       clock-latency = <300000>; /* From legacy driver */
-               };
-       };
+       cpus {
+               /* OMAP3630/OMAP37xx 'standard device' variants OPP50 to OPP130 */
+               cpu: cpu@0 {
+                       operating-points = <
+                               /* kHz    uV */
+                               300000  1012500
+                               600000  1200000
+                               800000  1325000
+                       >;
+                       clock-latency = <300000>; /* From legacy driver */
+               };
+       };
 
-       ocp@68000000 {
-               uart4: serial@49042000 {
-                       compatible = "ti,omap3-uart";
-                       reg = <0x49042000 0x400>;
-                       interrupts = <80>;
-                       dmas = <&sdma 81 &sdma 82>;
-                       dma-names = "tx", "rx";
-                       ti,hwmods = "uart4";
-                       clock-frequency = <48000000>;
-               };
+       ocp@68000000 {
+               uart4: serial@49042000 {
+                       compatible = "ti,omap3-uart";
+                       reg = <0x49042000 0x400>;
+                       reg-shift = <2>;
+                       interrupts = <80>;
+                       dmas = <&sdma 81 &sdma 82>;
+                       dma-names = "tx", "rx";
+                       ti,hwmods = "uart4";
+                       clock-frequency = <48000000>;
+               };
 
-               abb_mpu_iva: regulator-abb-mpu {
-                       compatible = "ti,abb-v1";
-                       regulator-name = "abb_mpu_iva";
-                       #address-cells = <0>;
-                       #size-cells = <0>;
-                       reg = <0x483072f0 0x8>, <0x48306818 0x4>;
-                       reg-names = "base-address", "int-address";
-                       ti,tranxdone-status-mask = <0x4000000>;
-                       clocks = <&sys_ck>;
-                       ti,settling-time = <30>;
-                       ti,clock-cycles = <8>;
-                       ti,abb_info = <
-                       /*uV            ABB     efuse   rbb_m   fbb_m   vset_m*/
-                       1012500         0       0       0       0       0
-                       1200000         0       0       0       0       0
-                       1325000         0       0       0       0       0
-                       1375000         1       0       0       0       0
-                       >;
-               };
+               abb_mpu_iva: regulator-abb-mpu {
+                       compatible = "ti,abb-v1";
+                       regulator-name = "abb_mpu_iva";
+                       #address-cells = <0>;
+                       #size-cells = <0>;
+                       reg = <0x483072f0 0x8>, <0x48306818 0x4>;
+                       reg-names = "base-address", "int-address";
+                       ti,tranxdone-status-mask = <0x4000000>;
+                       clocks = <&sys_ck>;
+                       ti,settling-time = <30>;
+                       ti,clock-cycles = <8>;
+                       ti,abb_info = <
+                       /*uV            ABB     efuse   rbb_m   fbb_m   vset_m*/
+                       1012500         0       0       0       0       0
+                       1200000         0       0       0       0       0
+                       1325000         0       0       0       0       0
+                       1375000         1       0       0       0       0
+                       >;
+               };
 
-               omap3_pmx_core2: pinmux@480025a0 {
-                       compatible = "ti,omap3-padconf", "pinctrl-single";
-                       reg = <0x480025a0 0x5c>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       #interrupt-cells = <1>;
-                       interrupt-controller;
-                       pinctrl-single,register-width = <16>;
-                       pinctrl-single,function-mask = <0xff1f>;
-               };
+               omap3_pmx_core2: pinmux@480025a0 {
+                       compatible = "ti,omap3-padconf", "pinctrl-single";
+                       reg = <0x480025a0 0x5c>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       #pinctrl-cells = <1>;
+                       #interrupt-cells = <1>;
+                       interrupt-controller;
+                       pinctrl-single,register-width = <16>;
+                       pinctrl-single,function-mask = <0xff1f>;
+               };
 
-               isp: isp@480bc000 {
-                       compatible = "ti,omap3-isp";
-                       reg = <0x480bc000 0x12fc
-                              0x480bd800 0x0600>;
-                       interrupts = <24>;
-                       iommus = <&mmu_isp>;
-                       syscon = <&scm_conf 0x2f0>;
-                       ti,phy-type = <OMAP3ISP_PHY_TYPE_CSIPHY>;
-                       #clock-cells = <1>;
-                       ports {
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-                       };
-               };
+               isp: isp@480bc000 {
+                       compatible = "ti,omap3-isp";
+                       reg = <0x480bc000 0x12fc
+                              0x480bd800 0x0600>;
+                       interrupts = <24>;
+                       iommus = <&mmu_isp>;
+                       syscon = <&scm_conf 0x2f0>;
+                       ti,phy-type = <OMAP3ISP_PHY_TYPE_CSIPHY>;
+                       #clock-cells = <1>;
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                       };
+               };
 
-               bandgap@48002524 {
-                       reg = <0x48002524 0x4>;
-                       compatible = "ti,omap36xx-bandgap";
-                       #thermal-sensor-cells = <0>;
-               };
-       };
+               bandgap: bandgap@48002524 {
+                       reg = <0x48002524 0x4>;
+                       compatible = "ti,omap36xx-bandgap";
+                       #thermal-sensor-cells = <0>;
+               };
+       };
+
+       thermal_zones: thermal-zones {
+               #include "omap3-cpu-thermal.dtsi"
+       };
 };
 
 /* OMAP3630 needs dss_96m_fck for VENC */
 &venc {
-       clocks = <&dss_tv_fck>, <&dss_96m_fck>;
-       clock-names = "fck", "tv_dac_clk";
+       clocks = <&dss_tv_fck>, <&dss_96m_fck>;
+       clock-names = "fck", "tv_dac_clk";
 };
 
 &ssi {
-       status = "ok";
+       status = "ok";
 
-       clocks = <&ssi_ssr_fck>,
-                <&ssi_sst_fck>,
-                <&ssi_ick>;
-       clock-names = "ssi_ssr_fck",
-                     "ssi_sst_fck",
-                     "ssi_ick";
+       clocks = <&ssi_ssr_fck>,
+                <&ssi_sst_fck>,
+                <&ssi_ick>;
+       clock-names = "ssi_ssr_fck",
+                     "ssi_sst_fck",
+                     "ssi_ick";
 };
 
 /include/ "omap34xx-omap36xx-clocks.dtsi"
index 7455ab5ffca9d074020168437bea7a74fe247a65..9bd91641aa7cbe02e473df0353d7190f196126ca 100644 (file)
  * published by the Free Software Foundation.
  */
 &prm_clocks {
-       virt_16_8m_ck: virt_16_8m_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <16800000>;
-       };
-
-       osc_sys_ck: osc_sys_ck@d40 {
-               #clock-cells = <0>;
-               compatible = "ti,mux-clock";
-               clocks = <&virt_12m_ck>, <&virt_13m_ck>, <&virt_19200000_ck>, <&virt_26000000_ck>, <&virt_38_4m_ck>, <&virt_16_8m_ck>;
-               reg = <0x0d40>;
-       };
-
-       sys_ck: sys_ck@1270 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&osc_sys_ck>;
-               ti,bit-shift = <6>;
-               ti,max-div = <3>;
-               reg = <0x1270>;
-               ti,index-starts-at-one;
-       };
-
-       sys_clkout1: sys_clkout1@d70 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&osc_sys_ck>;
-               reg = <0x0d70>;
-               ti,bit-shift = <7>;
-       };
-
-       dpll3_x2_ck: dpll3_x2_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll3_ck>;
-               clock-mult = <2>;
-               clock-div = <1>;
-       };
-
-       dpll3_m2x2_ck: dpll3_m2x2_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll3_m2_ck>;
-               clock-mult = <2>;
-               clock-div = <1>;
-       };
-
-       dpll4_x2_ck: dpll4_x2_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll4_ck>;
-               clock-mult = <2>;
-               clock-div = <1>;
-       };
-
-       corex2_fck: corex2_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll3_m2x2_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       wkup_l4_ick: wkup_l4_ick {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&sys_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
+       virt_16_8m_ck: virt_16_8m_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <16800000>;
+       };
+
+       osc_sys_ck: osc_sys_ck@d40 {
+               #clock-cells = <0>;
+               compatible = "ti,mux-clock";
+               clocks = <&virt_12m_ck>, <&virt_13m_ck>, <&virt_19200000_ck>, <&virt_26000000_ck>, <&virt_38_4m_ck>, <&virt_16_8m_ck>;
+               reg = <0x0d40>;
+       };
+
+       sys_ck: sys_ck@1270 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&osc_sys_ck>;
+               ti,bit-shift = <6>;
+               ti,max-div = <3>;
+               reg = <0x1270>;
+               ti,index-starts-at-one;
+       };
+
+       sys_clkout1: sys_clkout1@d70 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&osc_sys_ck>;
+               reg = <0x0d70>;
+               ti,bit-shift = <7>;
+       };
+
+       dpll3_x2_ck: dpll3_x2_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll3_ck>;
+               clock-mult = <2>;
+               clock-div = <1>;
+       };
+
+       dpll3_m2x2_ck: dpll3_m2x2_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll3_m2_ck>;
+               clock-mult = <2>;
+               clock-div = <1>;
+       };
+
+       dpll4_x2_ck: dpll4_x2_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll4_ck>;
+               clock-mult = <2>;
+               clock-div = <1>;
+       };
+
+       corex2_fck: corex2_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll3_m2x2_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       wkup_l4_ick: wkup_l4_ick {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&sys_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
 };
 
 &scm_clocks {
-       mcbsp5_mux_fck: mcbsp5_mux_fck@68 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&core_96m_fck>, <&mcbsp_clks>;
-               ti,bit-shift = <4>;
-               reg = <0x68>;
-       };
-
-       mcbsp5_fck: mcbsp5_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&mcbsp5_gate_fck>, <&mcbsp5_mux_fck>;
-       };
-
-       mcbsp1_mux_fck: mcbsp1_mux_fck@4 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&core_96m_fck>, <&mcbsp_clks>;
-               ti,bit-shift = <2>;
-               reg = <0x04>;
-       };
-
-       mcbsp1_fck: mcbsp1_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&mcbsp1_gate_fck>, <&mcbsp1_mux_fck>;
-       };
-
-       mcbsp2_mux_fck: mcbsp2_mux_fck@4 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&per_96m_fck>, <&mcbsp_clks>;
-               ti,bit-shift = <6>;
-               reg = <0x04>;
-       };
-
-       mcbsp2_fck: mcbsp2_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&mcbsp2_gate_fck>, <&mcbsp2_mux_fck>;
-       };
-
-       mcbsp3_mux_fck: mcbsp3_mux_fck@68 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&per_96m_fck>, <&mcbsp_clks>;
-               reg = <0x68>;
-       };
-
-       mcbsp3_fck: mcbsp3_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&mcbsp3_gate_fck>, <&mcbsp3_mux_fck>;
-       };
-
-       mcbsp4_mux_fck: mcbsp4_mux_fck@68 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&per_96m_fck>, <&mcbsp_clks>;
-               ti,bit-shift = <2>;
-               reg = <0x68>;
-       };
-
-       mcbsp4_fck: mcbsp4_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&mcbsp4_gate_fck>, <&mcbsp4_mux_fck>;
-       };
+       mcbsp5_mux_fck: mcbsp5_mux_fck@68 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&core_96m_fck>, <&mcbsp_clks>;
+               ti,bit-shift = <4>;
+               reg = <0x68>;
+       };
+
+       mcbsp5_fck: mcbsp5_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&mcbsp5_gate_fck>, <&mcbsp5_mux_fck>;
+       };
+
+       mcbsp1_mux_fck: mcbsp1_mux_fck@4 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&core_96m_fck>, <&mcbsp_clks>;
+               ti,bit-shift = <2>;
+               reg = <0x04>;
+       };
+
+       mcbsp1_fck: mcbsp1_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&mcbsp1_gate_fck>, <&mcbsp1_mux_fck>;
+       };
+
+       mcbsp2_mux_fck: mcbsp2_mux_fck@4 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&per_96m_fck>, <&mcbsp_clks>;
+               ti,bit-shift = <6>;
+               reg = <0x04>;
+       };
+
+       mcbsp2_fck: mcbsp2_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&mcbsp2_gate_fck>, <&mcbsp2_mux_fck>;
+       };
+
+       mcbsp3_mux_fck: mcbsp3_mux_fck@68 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&per_96m_fck>, <&mcbsp_clks>;
+               reg = <0x68>;
+       };
+
+       mcbsp3_fck: mcbsp3_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&mcbsp3_gate_fck>, <&mcbsp3_mux_fck>;
+       };
+
+       mcbsp4_mux_fck: mcbsp4_mux_fck@68 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&per_96m_fck>, <&mcbsp_clks>;
+               ti,bit-shift = <2>;
+               reg = <0x68>;
+       };
+
+       mcbsp4_fck: mcbsp4_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&mcbsp4_gate_fck>, <&mcbsp4_mux_fck>;
+       };
 };
 &cm_clocks {
-       dummy_apb_pclk: dummy_apb_pclk {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <0x0>;
-       };
-
-       omap_32k_fck: omap_32k_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <32768>;
-       };
-
-       virt_12m_ck: virt_12m_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <12000000>;
-       };
-
-       virt_13m_ck: virt_13m_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <13000000>;
-       };
-
-       virt_19200000_ck: virt_19200000_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <19200000>;
-       };
-
-       virt_26000000_ck: virt_26000000_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <26000000>;
-       };
-
-       virt_38_4m_ck: virt_38_4m_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <38400000>;
-       };
-
-       dpll4_ck: dpll4_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-dpll-per-clock";
-               clocks = <&sys_ck>, <&sys_ck>;
-               reg = <0x0d00>, <0x0d20>, <0x0d44>, <0x0d30>;
-       };
-
-       dpll4_m2_ck: dpll4_m2_ck@d48 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll4_ck>;
-               ti,max-div = <63>;
-               reg = <0x0d48>;
-               ti,index-starts-at-one;
-       };
-
-       dpll4_m2x2_mul_ck: dpll4_m2x2_mul_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll4_m2_ck>;
-               clock-mult = <2>;
-               clock-div = <1>;
-       };
-
-       dpll4_m2x2_ck: dpll4_m2x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&dpll4_m2x2_mul_ck>;
-               ti,bit-shift = <0x1b>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-       };
-
-       omap_96m_alwon_fck: omap_96m_alwon_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll4_m2x2_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       dpll3_ck: dpll3_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-dpll-core-clock";
-               clocks = <&sys_ck>, <&sys_ck>;
-               reg = <0x0d00>, <0x0d20>, <0x0d40>, <0x0d30>;
-       };
-
-       dpll3_m3_ck: dpll3_m3_ck@1140 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll3_ck>;
-               ti,bit-shift = <16>;
-               ti,max-div = <31>;
-               reg = <0x1140>;
-               ti,index-starts-at-one;
-       };
-
-       dpll3_m3x2_mul_ck: dpll3_m3x2_mul_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll3_m3_ck>;
-               clock-mult = <2>;
-               clock-div = <1>;
-       };
-
-       dpll3_m3x2_ck: dpll3_m3x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&dpll3_m3x2_mul_ck>;
-               ti,bit-shift = <0xc>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-       };
-
-       emu_core_alwon_ck: emu_core_alwon_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll3_m3x2_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       sys_altclk: sys_altclk {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <0x0>;
-       };
-
-       mcbsp_clks: mcbsp_clks {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <0x0>;
-       };
-
-       dpll3_m2_ck: dpll3_m2_ck@d40 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll3_ck>;
-               ti,bit-shift = <27>;
-               ti,max-div = <31>;
-               reg = <0x0d40>;
-               ti,index-starts-at-one;
-       };
-
-       core_ck: core_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll3_m2_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       dpll1_fck: dpll1_fck@940 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&core_ck>;
-               ti,bit-shift = <19>;
-               ti,max-div = <7>;
-               reg = <0x0940>;
-               ti,index-starts-at-one;
-       };
-
-       dpll1_ck: dpll1_ck@904 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-dpll-clock";
-               clocks = <&sys_ck>, <&dpll1_fck>;
-               reg = <0x0904>, <0x0924>, <0x0940>, <0x0934>;
-       };
-
-       dpll1_x2_ck: dpll1_x2_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll1_ck>;
-               clock-mult = <2>;
-               clock-div = <1>;
-       };
-
-       dpll1_x2m2_ck: dpll1_x2m2_ck@944 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll1_x2_ck>;
-               ti,max-div = <31>;
-               reg = <0x0944>;
-               ti,index-starts-at-one;
-       };
-
-       cm_96m_fck: cm_96m_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_96m_alwon_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       omap_96m_fck: omap_96m_fck@d40 {
-               #clock-cells = <0>;
-               compatible = "ti,mux-clock";
-               clocks = <&cm_96m_fck>, <&sys_ck>;
-               ti,bit-shift = <6>;
-               reg = <0x0d40>;
-       };
-
-       dpll4_m3_ck: dpll4_m3_ck@e40 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll4_ck>;
-               ti,bit-shift = <8>;
-               ti,max-div = <32>;
-               reg = <0x0e40>;
-               ti,index-starts-at-one;
-       };
-
-       dpll4_m3x2_mul_ck: dpll4_m3x2_mul_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll4_m3_ck>;
-               clock-mult = <2>;
-               clock-div = <1>;
-       };
-
-       dpll4_m3x2_ck: dpll4_m3x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&dpll4_m3x2_mul_ck>;
-               ti,bit-shift = <0x1c>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-       };
-
-       omap_54m_fck: omap_54m_fck@d40 {
-               #clock-cells = <0>;
-               compatible = "ti,mux-clock";
-               clocks = <&dpll4_m3x2_ck>, <&sys_altclk>;
-               ti,bit-shift = <5>;
-               reg = <0x0d40>;
-       };
-
-       cm_96m_d2_fck: cm_96m_d2_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&cm_96m_fck>;
-               clock-mult = <1>;
-               clock-div = <2>;
-       };
-
-       omap_48m_fck: omap_48m_fck@d40 {
-               #clock-cells = <0>;
-               compatible = "ti,mux-clock";
-               clocks = <&cm_96m_d2_fck>, <&sys_altclk>;
-               ti,bit-shift = <3>;
-               reg = <0x0d40>;
-       };
-
-       omap_12m_fck: omap_12m_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_48m_fck>;
-               clock-mult = <1>;
-               clock-div = <4>;
-       };
-
-       dpll4_m4_ck: dpll4_m4_ck@e40 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll4_ck>;
-               ti,max-div = <32>;
-               reg = <0x0e40>;
-               ti,index-starts-at-one;
-       };
-
-       dpll4_m4x2_mul_ck: dpll4_m4x2_mul_ck {
-               #clock-cells = <0>;
-               compatible = "ti,fixed-factor-clock";
-               clocks = <&dpll4_m4_ck>;
-               ti,clock-mult = <2>;
-               ti,clock-div = <1>;
-               ti,set-rate-parent;
-       };
-
-       dpll4_m4x2_ck: dpll4_m4x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&dpll4_m4x2_mul_ck>;
-               ti,bit-shift = <0x1d>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-               ti,set-rate-parent;
-       };
-
-       dpll4_m5_ck: dpll4_m5_ck@f40 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll4_ck>;
-               ti,max-div = <63>;
-               reg = <0x0f40>;
-               ti,index-starts-at-one;
-       };
-
-       dpll4_m5x2_mul_ck: dpll4_m5x2_mul_ck {
-               #clock-cells = <0>;
-               compatible = "ti,fixed-factor-clock";
-               clocks = <&dpll4_m5_ck>;
-               ti,clock-mult = <2>;
-               ti,clock-div = <1>;
-               ti,set-rate-parent;
-       };
-
-       dpll4_m5x2_ck: dpll4_m5x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&dpll4_m5x2_mul_ck>;
-               ti,bit-shift = <0x1e>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-               ti,set-rate-parent;
-       };
-
-       dpll4_m6_ck: dpll4_m6_ck@1140 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&dpll4_ck>;
-               ti,bit-shift = <24>;
-               ti,max-div = <63>;
-               reg = <0x1140>;
-               ti,index-starts-at-one;
-       };
-
-       dpll4_m6x2_mul_ck: dpll4_m6x2_mul_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll4_m6_ck>;
-               clock-mult = <2>;
-               clock-div = <1>;
-       };
-
-       dpll4_m6x2_ck: dpll4_m6x2_ck@d00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&dpll4_m6x2_mul_ck>;
-               ti,bit-shift = <0x1f>;
-               reg = <0x0d00>;
-               ti,set-bit-to-disable;
-       };
-
-       emu_per_alwon_ck: emu_per_alwon_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll4_m6x2_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       clkout2_src_gate_ck: clkout2_src_gate_ck@d70 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-no-wait-gate-clock";
-               clocks = <&core_ck>;
-               ti,bit-shift = <7>;
-               reg = <0x0d70>;
-       };
-
-       clkout2_src_mux_ck: clkout2_src_mux_ck@d70 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&core_ck>, <&sys_ck>, <&cm_96m_fck>, <&omap_54m_fck>;
-               reg = <0x0d70>;
-       };
-
-       clkout2_src_ck: clkout2_src_ck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&clkout2_src_gate_ck>, <&clkout2_src_mux_ck>;
-       };
-
-       sys_clkout2: sys_clkout2@d70 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&clkout2_src_ck>;
-               ti,bit-shift = <3>;
-               ti,max-div = <64>;
-               reg = <0x0d70>;
-               ti,index-power-of-two;
-       };
-
-       mpu_ck: mpu_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&dpll1_x2m2_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       arm_fck: arm_fck@924 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&mpu_ck>;
-               reg = <0x0924>;
-               ti,max-div = <2>;
-       };
-
-       emu_mpu_alwon_ck: emu_mpu_alwon_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&mpu_ck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       l3_ick: l3_ick@a40 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&core_ck>;
-               ti,max-div = <3>;
-               reg = <0x0a40>;
-               ti,index-starts-at-one;
-       };
-
-       l4_ick: l4_ick@a40 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&l3_ick>;
-               ti,bit-shift = <2>;
-               ti,max-div = <3>;
-               reg = <0x0a40>;
-               ti,index-starts-at-one;
-       };
-
-       rm_ick: rm_ick@c40 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&l4_ick>;
-               ti,bit-shift = <1>;
-               ti,max-div = <3>;
-               reg = <0x0c40>;
-               ti,index-starts-at-one;
-       };
-
-       gpt10_gate_fck: gpt10_gate_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <11>;
-               reg = <0x0a00>;
-       };
-
-       gpt10_mux_fck: gpt10_mux_fck@a40 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <6>;
-               reg = <0x0a40>;
-       };
-
-       gpt10_fck: gpt10_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt10_gate_fck>, <&gpt10_mux_fck>;
-       };
-
-       gpt11_gate_fck: gpt11_gate_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <12>;
-               reg = <0x0a00>;
-       };
-
-       gpt11_mux_fck: gpt11_mux_fck@a40 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <7>;
-               reg = <0x0a40>;
-       };
-
-       gpt11_fck: gpt11_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt11_gate_fck>, <&gpt11_mux_fck>;
-       };
-
-       core_96m_fck: core_96m_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_96m_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       mmchs2_fck: mmchs2_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_96m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <25>;
-       };
-
-       mmchs1_fck: mmchs1_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_96m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <24>;
-       };
-
-       i2c3_fck: i2c3_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_96m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <17>;
-       };
-
-       i2c2_fck: i2c2_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_96m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <16>;
-       };
-
-       i2c1_fck: i2c1_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_96m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <15>;
-       };
-
-       mcbsp5_gate_fck: mcbsp5_gate_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&mcbsp_clks>;
-               ti,bit-shift = <10>;
-               reg = <0x0a00>;
-       };
-
-       mcbsp1_gate_fck: mcbsp1_gate_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&mcbsp_clks>;
-               ti,bit-shift = <9>;
-               reg = <0x0a00>;
-       };
-
-       core_48m_fck: core_48m_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_48m_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       mcspi4_fck: mcspi4_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_48m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <21>;
-       };
-
-       mcspi3_fck: mcspi3_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_48m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <20>;
-       };
-
-       mcspi2_fck: mcspi2_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_48m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <19>;
-       };
-
-       mcspi1_fck: mcspi1_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_48m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <18>;
-       };
-
-       uart2_fck: uart2_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_48m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <14>;
-       };
-
-       uart1_fck: uart1_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_48m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <13>;
-       };
-
-       core_12m_fck: core_12m_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_12m_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       hdq_fck: hdq_fck@a00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_12m_fck>;
-               reg = <0x0a00>;
-               ti,bit-shift = <22>;
-       };
-
-       core_l3_ick: core_l3_ick {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&l3_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       sdrc_ick: sdrc_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&core_l3_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <1>;
-       };
-
-       gpmc_fck: gpmc_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&core_l3_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       core_l4_ick: core_l4_ick {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&l4_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       mmchs2_ick: mmchs2_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <25>;
-       };
-
-       mmchs1_ick: mmchs1_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <24>;
-       };
-
-       hdq_ick: hdq_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <22>;
-       };
-
-       mcspi4_ick: mcspi4_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <21>;
-       };
-
-       mcspi3_ick: mcspi3_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <20>;
-       };
-
-       mcspi2_ick: mcspi2_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <19>;
-       };
-
-       mcspi1_ick: mcspi1_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <18>;
-       };
-
-       i2c3_ick: i2c3_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <17>;
-       };
-
-       i2c2_ick: i2c2_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <16>;
-       };
-
-       i2c1_ick: i2c1_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <15>;
-       };
-
-       uart2_ick: uart2_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <14>;
-       };
-
-       uart1_ick: uart1_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <13>;
-       };
-
-       gpt11_ick: gpt11_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <12>;
-       };
-
-       gpt10_ick: gpt10_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <11>;
-       };
-
-       mcbsp5_ick: mcbsp5_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <10>;
-       };
-
-       mcbsp1_ick: mcbsp1_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <9>;
-       };
-
-       omapctrl_ick: omapctrl_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <6>;
-       };
-
-       dss_tv_fck: dss_tv_fck@e00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&omap_54m_fck>;
-               reg = <0x0e00>;
-               ti,bit-shift = <2>;
-       };
-
-       dss_96m_fck: dss_96m_fck@e00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&omap_96m_fck>;
-               reg = <0x0e00>;
-               ti,bit-shift = <2>;
-       };
-
-       dss2_alwon_fck: dss2_alwon_fck@e00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&sys_ck>;
-               reg = <0x0e00>;
-               ti,bit-shift = <1>;
-       };
-
-       dummy_ck: dummy_ck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <0>;
-       };
-
-       gpt1_gate_fck: gpt1_gate_fck@c00 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <0>;
-               reg = <0x0c00>;
-       };
-
-       gpt1_mux_fck: gpt1_mux_fck@c40 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               reg = <0x0c40>;
-       };
-
-       gpt1_fck: gpt1_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt1_gate_fck>, <&gpt1_mux_fck>;
-       };
-
-       aes2_ick: aes2_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               ti,bit-shift = <28>;
-               reg = <0x0a10>;
-       };
-
-       wkup_32k_fck: wkup_32k_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_32k_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       gpio1_dbck: gpio1_dbck@c00 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&wkup_32k_fck>;
-               reg = <0x0c00>;
-               ti,bit-shift = <3>;
-       };
-
-       sha12_ick: sha12_ick@a10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&core_l4_ick>;
-               reg = <0x0a10>;
-               ti,bit-shift = <27>;
-       };
-
-       wdt2_fck: wdt2_fck@c00 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&wkup_32k_fck>;
-               reg = <0x0c00>;
-               ti,bit-shift = <5>;
-       };
-
-       wdt2_ick: wdt2_ick@c10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&wkup_l4_ick>;
-               reg = <0x0c10>;
-               ti,bit-shift = <5>;
-       };
-
-       wdt1_ick: wdt1_ick@c10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&wkup_l4_ick>;
-               reg = <0x0c10>;
-               ti,bit-shift = <4>;
-       };
-
-       gpio1_ick: gpio1_ick@c10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&wkup_l4_ick>;
-               reg = <0x0c10>;
-               ti,bit-shift = <3>;
-       };
-
-       omap_32ksync_ick: omap_32ksync_ick@c10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&wkup_l4_ick>;
-               reg = <0x0c10>;
-               ti,bit-shift = <2>;
-       };
-
-       gpt12_ick: gpt12_ick@c10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&wkup_l4_ick>;
-               reg = <0x0c10>;
-               ti,bit-shift = <1>;
-       };
-
-       gpt1_ick: gpt1_ick@c10 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&wkup_l4_ick>;
-               reg = <0x0c10>;
-               ti,bit-shift = <0>;
-       };
-
-       per_96m_fck: per_96m_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_96m_alwon_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       per_48m_fck: per_48m_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_48m_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       uart3_fck: uart3_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&per_48m_fck>;
-               reg = <0x1000>;
-               ti,bit-shift = <11>;
-       };
-
-       gpt2_gate_fck: gpt2_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <3>;
-               reg = <0x1000>;
-       };
-
-       gpt2_mux_fck: gpt2_mux_fck@1040 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               reg = <0x1040>;
-       };
-
-       gpt2_fck: gpt2_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt2_gate_fck>, <&gpt2_mux_fck>;
-       };
-
-       gpt3_gate_fck: gpt3_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <4>;
-               reg = <0x1000>;
-       };
-
-       gpt3_mux_fck: gpt3_mux_fck@1040 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <1>;
-               reg = <0x1040>;
-       };
-
-       gpt3_fck: gpt3_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt3_gate_fck>, <&gpt3_mux_fck>;
-       };
-
-       gpt4_gate_fck: gpt4_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <5>;
-               reg = <0x1000>;
-       };
-
-       gpt4_mux_fck: gpt4_mux_fck@1040 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <2>;
-               reg = <0x1040>;
-       };
-
-       gpt4_fck: gpt4_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt4_gate_fck>, <&gpt4_mux_fck>;
-       };
-
-       gpt5_gate_fck: gpt5_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <6>;
-               reg = <0x1000>;
-       };
-
-       gpt5_mux_fck: gpt5_mux_fck@1040 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <3>;
-               reg = <0x1040>;
-       };
-
-       gpt5_fck: gpt5_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt5_gate_fck>, <&gpt5_mux_fck>;
-       };
-
-       gpt6_gate_fck: gpt6_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <7>;
-               reg = <0x1000>;
-       };
-
-       gpt6_mux_fck: gpt6_mux_fck@1040 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <4>;
-               reg = <0x1040>;
-       };
-
-       gpt6_fck: gpt6_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt6_gate_fck>, <&gpt6_mux_fck>;
-       };
-
-       gpt7_gate_fck: gpt7_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <8>;
-               reg = <0x1000>;
-       };
-
-       gpt7_mux_fck: gpt7_mux_fck@1040 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <5>;
-               reg = <0x1040>;
-       };
-
-       gpt7_fck: gpt7_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt7_gate_fck>, <&gpt7_mux_fck>;
-       };
-
-       gpt8_gate_fck: gpt8_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <9>;
-               reg = <0x1000>;
-       };
-
-       gpt8_mux_fck: gpt8_mux_fck@1040 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <6>;
-               reg = <0x1040>;
-       };
-
-       gpt8_fck: gpt8_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt8_gate_fck>, <&gpt8_mux_fck>;
-       };
-
-       gpt9_gate_fck: gpt9_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&sys_ck>;
-               ti,bit-shift = <10>;
-               reg = <0x1000>;
-       };
-
-       gpt9_mux_fck: gpt9_mux_fck@1040 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-mux-clock";
-               clocks = <&omap_32k_fck>, <&sys_ck>;
-               ti,bit-shift = <7>;
-               reg = <0x1040>;
-       };
-
-       gpt9_fck: gpt9_fck {
-               #clock-cells = <0>;
-               compatible = "ti,composite-clock";
-               clocks = <&gpt9_gate_fck>, <&gpt9_mux_fck>;
-       };
-
-       per_32k_alwon_fck: per_32k_alwon_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&omap_32k_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       gpio6_dbck: gpio6_dbck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&per_32k_alwon_fck>;
-               reg = <0x1000>;
-               ti,bit-shift = <17>;
-       };
-
-       gpio5_dbck: gpio5_dbck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&per_32k_alwon_fck>;
-               reg = <0x1000>;
-               ti,bit-shift = <16>;
-       };
-
-       gpio4_dbck: gpio4_dbck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&per_32k_alwon_fck>;
-               reg = <0x1000>;
-               ti,bit-shift = <15>;
-       };
-
-       gpio3_dbck: gpio3_dbck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&per_32k_alwon_fck>;
-               reg = <0x1000>;
-               ti,bit-shift = <14>;
-       };
-
-       gpio2_dbck: gpio2_dbck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,gate-clock";
-               clocks = <&per_32k_alwon_fck>;
-               reg = <0x1000>;
-               ti,bit-shift = <13>;
-       };
-
-       wdt3_fck: wdt3_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,wait-gate-clock";
-               clocks = <&per_32k_alwon_fck>;
-               reg = <0x1000>;
-               ti,bit-shift = <12>;
-       };
-
-       per_l4_ick: per_l4_ick {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&l4_ick>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       gpio6_ick: gpio6_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <17>;
-       };
-
-       gpio5_ick: gpio5_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <16>;
-       };
-
-       gpio4_ick: gpio4_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <15>;
-       };
-
-       gpio3_ick: gpio3_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <14>;
-       };
-
-       gpio2_ick: gpio2_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <13>;
-       };
-
-       wdt3_ick: wdt3_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <12>;
-       };
-
-       uart3_ick: uart3_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <11>;
-       };
-
-       uart4_ick: uart4_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <18>;
-       };
-
-       gpt9_ick: gpt9_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <10>;
-       };
-
-       gpt8_ick: gpt8_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <9>;
-       };
-
-       gpt7_ick: gpt7_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <8>;
-       };
-
-       gpt6_ick: gpt6_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <7>;
-       };
-
-       gpt5_ick: gpt5_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <6>;
-       };
-
-       gpt4_ick: gpt4_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <5>;
-       };
-
-       gpt3_ick: gpt3_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <4>;
-       };
-
-       gpt2_ick: gpt2_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <3>;
-       };
-
-       mcbsp2_ick: mcbsp2_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <0>;
-       };
-
-       mcbsp3_ick: mcbsp3_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <1>;
-       };
-
-       mcbsp4_ick: mcbsp4_ick@1010 {
-               #clock-cells = <0>;
-               compatible = "ti,omap3-interface-clock";
-               clocks = <&per_l4_ick>;
-               reg = <0x1010>;
-               ti,bit-shift = <2>;
-       };
-
-       mcbsp2_gate_fck: mcbsp2_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&mcbsp_clks>;
-               ti,bit-shift = <0>;
-               reg = <0x1000>;
-       };
-
-       mcbsp3_gate_fck: mcbsp3_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&mcbsp_clks>;
-               ti,bit-shift = <1>;
-               reg = <0x1000>;
-       };
-
-       mcbsp4_gate_fck: mcbsp4_gate_fck@1000 {
-               #clock-cells = <0>;
-               compatible = "ti,composite-gate-clock";
-               clocks = <&mcbsp_clks>;
-               ti,bit-shift = <2>;
-               reg = <0x1000>;
-       };
-
-       emu_src_mux_ck: emu_src_mux_ck@1140 {
-               #clock-cells = <0>;
-               compatible = "ti,mux-clock";
-               clocks = <&sys_ck>, <&emu_core_alwon_ck>, <&emu_per_alwon_ck>, <&emu_mpu_alwon_ck>;
-               reg = <0x1140>;
-       };
-
-       emu_src_ck: emu_src_ck {
-               #clock-cells = <0>;
-               compatible = "ti,clkdm-gate-clock";
-               clocks = <&emu_src_mux_ck>;
-       };
-
-       pclk_fck: pclk_fck@1140 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&emu_src_ck>;
-               ti,bit-shift = <8>;
-               ti,max-div = <7>;
-               reg = <0x1140>;
-               ti,index-starts-at-one;
-       };
-
-       pclkx2_fck: pclkx2_fck@1140 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&emu_src_ck>;
-               ti,bit-shift = <6>;
-               ti,max-div = <3>;
-               reg = <0x1140>;
-               ti,index-starts-at-one;
-       };
-
-       atclk_fck: atclk_fck@1140 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&emu_src_ck>;
-               ti,bit-shift = <4>;
-               ti,max-div = <3>;
-               reg = <0x1140>;
-               ti,index-starts-at-one;
-       };
-
-       traceclk_src_fck: traceclk_src_fck@1140 {
-               #clock-cells = <0>;
-               compatible = "ti,mux-clock";
-               clocks = <&sys_ck>, <&emu_core_alwon_ck>, <&emu_per_alwon_ck>, <&emu_mpu_alwon_ck>;
-               ti,bit-shift = <2>;
-               reg = <0x1140>;
-       };
-
-       traceclk_fck: traceclk_fck@1140 {
-               #clock-cells = <0>;
-               compatible = "ti,divider-clock";
-               clocks = <&traceclk_src_fck>;
-               ti,bit-shift = <11>;
-               ti,max-div = <7>;
-               reg = <0x1140>;
-               ti,index-starts-at-one;
-       };
-
-       secure_32k_fck: secure_32k_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-clock";
-               clock-frequency = <32768>;
-       };
-
-       gpt12_fck: gpt12_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&secure_32k_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
-
-       wdt1_fck: wdt1_fck {
-               #clock-cells = <0>;
-               compatible = "fixed-factor-clock";
-               clocks = <&secure_32k_fck>;
-               clock-mult = <1>;
-               clock-div = <1>;
-       };
+       dummy_apb_pclk: dummy_apb_pclk {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <0x0>;
+       };
+
+       omap_32k_fck: omap_32k_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <32768>;
+       };
+
+       virt_12m_ck: virt_12m_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <12000000>;
+       };
+
+       virt_13m_ck: virt_13m_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <13000000>;
+       };
+
+       virt_19200000_ck: virt_19200000_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <19200000>;
+       };
+
+       virt_26000000_ck: virt_26000000_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <26000000>;
+       };
+
+       virt_38_4m_ck: virt_38_4m_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <38400000>;
+       };
+
+       dpll4_ck: dpll4_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-dpll-per-clock";
+               clocks = <&sys_ck>, <&sys_ck>;
+               reg = <0x0d00>, <0x0d20>, <0x0d44>, <0x0d30>;
+       };
+
+       dpll4_m2_ck: dpll4_m2_ck@d48 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll4_ck>;
+               ti,max-div = <63>;
+               reg = <0x0d48>;
+               ti,index-starts-at-one;
+       };
+
+       dpll4_m2x2_mul_ck: dpll4_m2x2_mul_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll4_m2_ck>;
+               clock-mult = <2>;
+               clock-div = <1>;
+       };
+
+       dpll4_m2x2_ck: dpll4_m2x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&dpll4_m2x2_mul_ck>;
+               ti,bit-shift = <0x1b>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+       };
+
+       omap_96m_alwon_fck: omap_96m_alwon_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll4_m2x2_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       dpll3_ck: dpll3_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-dpll-core-clock";
+               clocks = <&sys_ck>, <&sys_ck>;
+               reg = <0x0d00>, <0x0d20>, <0x0d40>, <0x0d30>;
+       };
+
+       dpll3_m3_ck: dpll3_m3_ck@1140 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll3_ck>;
+               ti,bit-shift = <16>;
+               ti,max-div = <31>;
+               reg = <0x1140>;
+               ti,index-starts-at-one;
+       };
+
+       dpll3_m3x2_mul_ck: dpll3_m3x2_mul_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll3_m3_ck>;
+               clock-mult = <2>;
+               clock-div = <1>;
+       };
+
+       dpll3_m3x2_ck: dpll3_m3x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&dpll3_m3x2_mul_ck>;
+               ti,bit-shift = <0xc>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+       };
+
+       emu_core_alwon_ck: emu_core_alwon_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll3_m3x2_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       sys_altclk: sys_altclk {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <0x0>;
+       };
+
+       mcbsp_clks: mcbsp_clks {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <0x0>;
+       };
+
+       dpll3_m2_ck: dpll3_m2_ck@d40 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll3_ck>;
+               ti,bit-shift = <27>;
+               ti,max-div = <31>;
+               reg = <0x0d40>;
+               ti,index-starts-at-one;
+       };
+
+       core_ck: core_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll3_m2_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       dpll1_fck: dpll1_fck@940 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&core_ck>;
+               ti,bit-shift = <19>;
+               ti,max-div = <7>;
+               reg = <0x0940>;
+               ti,index-starts-at-one;
+       };
+
+       dpll1_ck: dpll1_ck@904 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-dpll-clock";
+               clocks = <&sys_ck>, <&dpll1_fck>;
+               reg = <0x0904>, <0x0924>, <0x0940>, <0x0934>;
+       };
+
+       dpll1_x2_ck: dpll1_x2_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll1_ck>;
+               clock-mult = <2>;
+               clock-div = <1>;
+       };
+
+       dpll1_x2m2_ck: dpll1_x2m2_ck@944 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll1_x2_ck>;
+               ti,max-div = <31>;
+               reg = <0x0944>;
+               ti,index-starts-at-one;
+       };
+
+       cm_96m_fck: cm_96m_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_96m_alwon_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       omap_96m_fck: omap_96m_fck@d40 {
+               #clock-cells = <0>;
+               compatible = "ti,mux-clock";
+               clocks = <&cm_96m_fck>, <&sys_ck>;
+               ti,bit-shift = <6>;
+               reg = <0x0d40>;
+       };
+
+       dpll4_m3_ck: dpll4_m3_ck@e40 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll4_ck>;
+               ti,bit-shift = <8>;
+               ti,max-div = <32>;
+               reg = <0x0e40>;
+               ti,index-starts-at-one;
+       };
+
+       dpll4_m3x2_mul_ck: dpll4_m3x2_mul_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll4_m3_ck>;
+               clock-mult = <2>;
+               clock-div = <1>;
+       };
+
+       dpll4_m3x2_ck: dpll4_m3x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&dpll4_m3x2_mul_ck>;
+               ti,bit-shift = <0x1c>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+       };
+
+       omap_54m_fck: omap_54m_fck@d40 {
+               #clock-cells = <0>;
+               compatible = "ti,mux-clock";
+               clocks = <&dpll4_m3x2_ck>, <&sys_altclk>;
+               ti,bit-shift = <5>;
+               reg = <0x0d40>;
+       };
+
+       cm_96m_d2_fck: cm_96m_d2_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&cm_96m_fck>;
+               clock-mult = <1>;
+               clock-div = <2>;
+       };
+
+       omap_48m_fck: omap_48m_fck@d40 {
+               #clock-cells = <0>;
+               compatible = "ti,mux-clock";
+               clocks = <&cm_96m_d2_fck>, <&sys_altclk>;
+               ti,bit-shift = <3>;
+               reg = <0x0d40>;
+       };
+
+       omap_12m_fck: omap_12m_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_48m_fck>;
+               clock-mult = <1>;
+               clock-div = <4>;
+       };
+
+       dpll4_m4_ck: dpll4_m4_ck@e40 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll4_ck>;
+               ti,max-div = <32>;
+               reg = <0x0e40>;
+               ti,index-starts-at-one;
+       };
+
+       dpll4_m4x2_mul_ck: dpll4_m4x2_mul_ck {
+               #clock-cells = <0>;
+               compatible = "ti,fixed-factor-clock";
+               clocks = <&dpll4_m4_ck>;
+               ti,clock-mult = <2>;
+               ti,clock-div = <1>;
+               ti,set-rate-parent;
+       };
+
+       dpll4_m4x2_ck: dpll4_m4x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&dpll4_m4x2_mul_ck>;
+               ti,bit-shift = <0x1d>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+               ti,set-rate-parent;
+       };
+
+       dpll4_m5_ck: dpll4_m5_ck@f40 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll4_ck>;
+               ti,max-div = <63>;
+               reg = <0x0f40>;
+               ti,index-starts-at-one;
+       };
+
+       dpll4_m5x2_mul_ck: dpll4_m5x2_mul_ck {
+               #clock-cells = <0>;
+               compatible = "ti,fixed-factor-clock";
+               clocks = <&dpll4_m5_ck>;
+               ti,clock-mult = <2>;
+               ti,clock-div = <1>;
+               ti,set-rate-parent;
+       };
+
+       dpll4_m5x2_ck: dpll4_m5x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&dpll4_m5x2_mul_ck>;
+               ti,bit-shift = <0x1e>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+               ti,set-rate-parent;
+       };
+
+       dpll4_m6_ck: dpll4_m6_ck@1140 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&dpll4_ck>;
+               ti,bit-shift = <24>;
+               ti,max-div = <63>;
+               reg = <0x1140>;
+               ti,index-starts-at-one;
+       };
+
+       dpll4_m6x2_mul_ck: dpll4_m6x2_mul_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll4_m6_ck>;
+               clock-mult = <2>;
+               clock-div = <1>;
+       };
+
+       dpll4_m6x2_ck: dpll4_m6x2_ck@d00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&dpll4_m6x2_mul_ck>;
+               ti,bit-shift = <0x1f>;
+               reg = <0x0d00>;
+               ti,set-bit-to-disable;
+       };
+
+       emu_per_alwon_ck: emu_per_alwon_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll4_m6x2_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       clkout2_src_gate_ck: clkout2_src_gate_ck@d70 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-no-wait-gate-clock";
+               clocks = <&core_ck>;
+               ti,bit-shift = <7>;
+               reg = <0x0d70>;
+       };
+
+       clkout2_src_mux_ck: clkout2_src_mux_ck@d70 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&core_ck>, <&sys_ck>, <&cm_96m_fck>, <&omap_54m_fck>;
+               reg = <0x0d70>;
+       };
+
+       clkout2_src_ck: clkout2_src_ck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&clkout2_src_gate_ck>, <&clkout2_src_mux_ck>;
+       };
+
+       sys_clkout2: sys_clkout2@d70 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&clkout2_src_ck>;
+               ti,bit-shift = <3>;
+               ti,max-div = <64>;
+               reg = <0x0d70>;
+               ti,index-power-of-two;
+       };
+
+       mpu_ck: mpu_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&dpll1_x2m2_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       arm_fck: arm_fck@924 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&mpu_ck>;
+               reg = <0x0924>;
+               ti,max-div = <2>;
+       };
+
+       emu_mpu_alwon_ck: emu_mpu_alwon_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&mpu_ck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       l3_ick: l3_ick@a40 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&core_ck>;
+               ti,max-div = <3>;
+               reg = <0x0a40>;
+               ti,index-starts-at-one;
+       };
+
+       l4_ick: l4_ick@a40 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&l3_ick>;
+               ti,bit-shift = <2>;
+               ti,max-div = <3>;
+               reg = <0x0a40>;
+               ti,index-starts-at-one;
+       };
+
+       rm_ick: rm_ick@c40 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&l4_ick>;
+               ti,bit-shift = <1>;
+               ti,max-div = <3>;
+               reg = <0x0c40>;
+               ti,index-starts-at-one;
+       };
+
+       gpt10_gate_fck: gpt10_gate_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <11>;
+               reg = <0x0a00>;
+       };
+
+       gpt10_mux_fck: gpt10_mux_fck@a40 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <6>;
+               reg = <0x0a40>;
+       };
+
+       gpt10_fck: gpt10_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt10_gate_fck>, <&gpt10_mux_fck>;
+       };
+
+       gpt11_gate_fck: gpt11_gate_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <12>;
+               reg = <0x0a00>;
+       };
+
+       gpt11_mux_fck: gpt11_mux_fck@a40 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <7>;
+               reg = <0x0a40>;
+       };
+
+       gpt11_fck: gpt11_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt11_gate_fck>, <&gpt11_mux_fck>;
+       };
+
+       core_96m_fck: core_96m_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_96m_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       mmchs2_fck: mmchs2_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_96m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <25>;
+       };
+
+       mmchs1_fck: mmchs1_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_96m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <24>;
+       };
+
+       i2c3_fck: i2c3_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_96m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <17>;
+       };
+
+       i2c2_fck: i2c2_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_96m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <16>;
+       };
+
+       i2c1_fck: i2c1_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_96m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <15>;
+       };
+
+       mcbsp5_gate_fck: mcbsp5_gate_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&mcbsp_clks>;
+               ti,bit-shift = <10>;
+               reg = <0x0a00>;
+       };
+
+       mcbsp1_gate_fck: mcbsp1_gate_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&mcbsp_clks>;
+               ti,bit-shift = <9>;
+               reg = <0x0a00>;
+       };
+
+       core_48m_fck: core_48m_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_48m_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       mcspi4_fck: mcspi4_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_48m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <21>;
+       };
+
+       mcspi3_fck: mcspi3_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_48m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <20>;
+       };
+
+       mcspi2_fck: mcspi2_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_48m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <19>;
+       };
+
+       mcspi1_fck: mcspi1_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_48m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <18>;
+       };
+
+       uart2_fck: uart2_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_48m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <14>;
+       };
+
+       uart1_fck: uart1_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_48m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <13>;
+       };
+
+       core_12m_fck: core_12m_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_12m_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       hdq_fck: hdq_fck@a00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_12m_fck>;
+               reg = <0x0a00>;
+               ti,bit-shift = <22>;
+       };
+
+       core_l3_ick: core_l3_ick {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&l3_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       sdrc_ick: sdrc_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&core_l3_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <1>;
+       };
+
+       gpmc_fck: gpmc_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&core_l3_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       core_l4_ick: core_l4_ick {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&l4_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       mmchs2_ick: mmchs2_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <25>;
+       };
+
+       mmchs1_ick: mmchs1_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <24>;
+       };
+
+       hdq_ick: hdq_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <22>;
+       };
+
+       mcspi4_ick: mcspi4_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <21>;
+       };
+
+       mcspi3_ick: mcspi3_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <20>;
+       };
+
+       mcspi2_ick: mcspi2_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <19>;
+       };
+
+       mcspi1_ick: mcspi1_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <18>;
+       };
+
+       i2c3_ick: i2c3_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <17>;
+       };
+
+       i2c2_ick: i2c2_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <16>;
+       };
+
+       i2c1_ick: i2c1_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <15>;
+       };
+
+       uart2_ick: uart2_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <14>;
+       };
+
+       uart1_ick: uart1_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <13>;
+       };
+
+       gpt11_ick: gpt11_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <12>;
+       };
+
+       gpt10_ick: gpt10_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <11>;
+       };
+
+       mcbsp5_ick: mcbsp5_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <10>;
+       };
+
+       mcbsp1_ick: mcbsp1_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <9>;
+       };
+
+       omapctrl_ick: omapctrl_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <6>;
+       };
+
+       dss_tv_fck: dss_tv_fck@e00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&omap_54m_fck>;
+               reg = <0x0e00>;
+               ti,bit-shift = <2>;
+       };
+
+       dss_96m_fck: dss_96m_fck@e00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&omap_96m_fck>;
+               reg = <0x0e00>;
+               ti,bit-shift = <2>;
+       };
+
+       dss2_alwon_fck: dss2_alwon_fck@e00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&sys_ck>;
+               reg = <0x0e00>;
+               ti,bit-shift = <1>;
+       };
+
+       dummy_ck: dummy_ck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <0>;
+       };
+
+       gpt1_gate_fck: gpt1_gate_fck@c00 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <0>;
+               reg = <0x0c00>;
+       };
+
+       gpt1_mux_fck: gpt1_mux_fck@c40 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               reg = <0x0c40>;
+       };
+
+       gpt1_fck: gpt1_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt1_gate_fck>, <&gpt1_mux_fck>;
+       };
+
+       aes2_ick: aes2_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               ti,bit-shift = <28>;
+               reg = <0x0a10>;
+       };
+
+       wkup_32k_fck: wkup_32k_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_32k_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       gpio1_dbck: gpio1_dbck@c00 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&wkup_32k_fck>;
+               reg = <0x0c00>;
+               ti,bit-shift = <3>;
+       };
+
+       sha12_ick: sha12_ick@a10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&core_l4_ick>;
+               reg = <0x0a10>;
+               ti,bit-shift = <27>;
+       };
+
+       wdt2_fck: wdt2_fck@c00 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&wkup_32k_fck>;
+               reg = <0x0c00>;
+               ti,bit-shift = <5>;
+       };
+
+       wdt2_ick: wdt2_ick@c10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&wkup_l4_ick>;
+               reg = <0x0c10>;
+               ti,bit-shift = <5>;
+       };
+
+       wdt1_ick: wdt1_ick@c10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&wkup_l4_ick>;
+               reg = <0x0c10>;
+               ti,bit-shift = <4>;
+       };
+
+       gpio1_ick: gpio1_ick@c10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&wkup_l4_ick>;
+               reg = <0x0c10>;
+               ti,bit-shift = <3>;
+       };
+
+       omap_32ksync_ick: omap_32ksync_ick@c10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&wkup_l4_ick>;
+               reg = <0x0c10>;
+               ti,bit-shift = <2>;
+       };
+
+       gpt12_ick: gpt12_ick@c10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&wkup_l4_ick>;
+               reg = <0x0c10>;
+               ti,bit-shift = <1>;
+       };
+
+       gpt1_ick: gpt1_ick@c10 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&wkup_l4_ick>;
+               reg = <0x0c10>;
+               ti,bit-shift = <0>;
+       };
+
+       per_96m_fck: per_96m_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_96m_alwon_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       per_48m_fck: per_48m_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_48m_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       uart3_fck: uart3_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&per_48m_fck>;
+               reg = <0x1000>;
+               ti,bit-shift = <11>;
+       };
+
+       gpt2_gate_fck: gpt2_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <3>;
+               reg = <0x1000>;
+       };
+
+       gpt2_mux_fck: gpt2_mux_fck@1040 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               reg = <0x1040>;
+       };
+
+       gpt2_fck: gpt2_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt2_gate_fck>, <&gpt2_mux_fck>;
+       };
+
+       gpt3_gate_fck: gpt3_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <4>;
+               reg = <0x1000>;
+       };
+
+       gpt3_mux_fck: gpt3_mux_fck@1040 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <1>;
+               reg = <0x1040>;
+       };
+
+       gpt3_fck: gpt3_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt3_gate_fck>, <&gpt3_mux_fck>;
+       };
+
+       gpt4_gate_fck: gpt4_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <5>;
+               reg = <0x1000>;
+       };
+
+       gpt4_mux_fck: gpt4_mux_fck@1040 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <2>;
+               reg = <0x1040>;
+       };
+
+       gpt4_fck: gpt4_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt4_gate_fck>, <&gpt4_mux_fck>;
+       };
+
+       gpt5_gate_fck: gpt5_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <6>;
+               reg = <0x1000>;
+       };
+
+       gpt5_mux_fck: gpt5_mux_fck@1040 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <3>;
+               reg = <0x1040>;
+       };
+
+       gpt5_fck: gpt5_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt5_gate_fck>, <&gpt5_mux_fck>;
+       };
+
+       gpt6_gate_fck: gpt6_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <7>;
+               reg = <0x1000>;
+       };
+
+       gpt6_mux_fck: gpt6_mux_fck@1040 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <4>;
+               reg = <0x1040>;
+       };
+
+       gpt6_fck: gpt6_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt6_gate_fck>, <&gpt6_mux_fck>;
+       };
+
+       gpt7_gate_fck: gpt7_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <8>;
+               reg = <0x1000>;
+       };
+
+       gpt7_mux_fck: gpt7_mux_fck@1040 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <5>;
+               reg = <0x1040>;
+       };
+
+       gpt7_fck: gpt7_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt7_gate_fck>, <&gpt7_mux_fck>;
+       };
+
+       gpt8_gate_fck: gpt8_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <9>;
+               reg = <0x1000>;
+       };
+
+       gpt8_mux_fck: gpt8_mux_fck@1040 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <6>;
+               reg = <0x1040>;
+       };
+
+       gpt8_fck: gpt8_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt8_gate_fck>, <&gpt8_mux_fck>;
+       };
+
+       gpt9_gate_fck: gpt9_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&sys_ck>;
+               ti,bit-shift = <10>;
+               reg = <0x1000>;
+       };
+
+       gpt9_mux_fck: gpt9_mux_fck@1040 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-mux-clock";
+               clocks = <&omap_32k_fck>, <&sys_ck>;
+               ti,bit-shift = <7>;
+               reg = <0x1040>;
+       };
+
+       gpt9_fck: gpt9_fck {
+               #clock-cells = <0>;
+               compatible = "ti,composite-clock";
+               clocks = <&gpt9_gate_fck>, <&gpt9_mux_fck>;
+       };
+
+       per_32k_alwon_fck: per_32k_alwon_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&omap_32k_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       gpio6_dbck: gpio6_dbck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&per_32k_alwon_fck>;
+               reg = <0x1000>;
+               ti,bit-shift = <17>;
+       };
+
+       gpio5_dbck: gpio5_dbck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&per_32k_alwon_fck>;
+               reg = <0x1000>;
+               ti,bit-shift = <16>;
+       };
+
+       gpio4_dbck: gpio4_dbck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&per_32k_alwon_fck>;
+               reg = <0x1000>;
+               ti,bit-shift = <15>;
+       };
+
+       gpio3_dbck: gpio3_dbck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&per_32k_alwon_fck>;
+               reg = <0x1000>;
+               ti,bit-shift = <14>;
+       };
+
+       gpio2_dbck: gpio2_dbck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,gate-clock";
+               clocks = <&per_32k_alwon_fck>;
+               reg = <0x1000>;
+               ti,bit-shift = <13>;
+       };
+
+       wdt3_fck: wdt3_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,wait-gate-clock";
+               clocks = <&per_32k_alwon_fck>;
+               reg = <0x1000>;
+               ti,bit-shift = <12>;
+       };
+
+       per_l4_ick: per_l4_ick {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&l4_ick>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       gpio6_ick: gpio6_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <17>;
+       };
+
+       gpio5_ick: gpio5_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <16>;
+       };
+
+       gpio4_ick: gpio4_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <15>;
+       };
+
+       gpio3_ick: gpio3_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <14>;
+       };
+
+       gpio2_ick: gpio2_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <13>;
+       };
+
+       wdt3_ick: wdt3_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <12>;
+       };
+
+       uart3_ick: uart3_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <11>;
+       };
+
+       uart4_ick: uart4_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <18>;
+       };
+
+       gpt9_ick: gpt9_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <10>;
+       };
+
+       gpt8_ick: gpt8_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <9>;
+       };
+
+       gpt7_ick: gpt7_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <8>;
+       };
+
+       gpt6_ick: gpt6_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <7>;
+       };
+
+       gpt5_ick: gpt5_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <6>;
+       };
+
+       gpt4_ick: gpt4_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <5>;
+       };
+
+       gpt3_ick: gpt3_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <4>;
+       };
+
+       gpt2_ick: gpt2_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <3>;
+       };
+
+       mcbsp2_ick: mcbsp2_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <0>;
+       };
+
+       mcbsp3_ick: mcbsp3_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <1>;
+       };
+
+       mcbsp4_ick: mcbsp4_ick@1010 {
+               #clock-cells = <0>;
+               compatible = "ti,omap3-interface-clock";
+               clocks = <&per_l4_ick>;
+               reg = <0x1010>;
+               ti,bit-shift = <2>;
+       };
+
+       mcbsp2_gate_fck: mcbsp2_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&mcbsp_clks>;
+               ti,bit-shift = <0>;
+               reg = <0x1000>;
+       };
+
+       mcbsp3_gate_fck: mcbsp3_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&mcbsp_clks>;
+               ti,bit-shift = <1>;
+               reg = <0x1000>;
+       };
+
+       mcbsp4_gate_fck: mcbsp4_gate_fck@1000 {
+               #clock-cells = <0>;
+               compatible = "ti,composite-gate-clock";
+               clocks = <&mcbsp_clks>;
+               ti,bit-shift = <2>;
+               reg = <0x1000>;
+       };
+
+       emu_src_mux_ck: emu_src_mux_ck@1140 {
+               #clock-cells = <0>;
+               compatible = "ti,mux-clock";
+               clocks = <&sys_ck>, <&emu_core_alwon_ck>, <&emu_per_alwon_ck>, <&emu_mpu_alwon_ck>;
+               reg = <0x1140>;
+       };
+
+       emu_src_ck: emu_src_ck {
+               #clock-cells = <0>;
+               compatible = "ti,clkdm-gate-clock";
+               clocks = <&emu_src_mux_ck>;
+       };
+
+       pclk_fck: pclk_fck@1140 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&emu_src_ck>;
+               ti,bit-shift = <8>;
+               ti,max-div = <7>;
+               reg = <0x1140>;
+               ti,index-starts-at-one;
+       };
+
+       pclkx2_fck: pclkx2_fck@1140 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&emu_src_ck>;
+               ti,bit-shift = <6>;
+               ti,max-div = <3>;
+               reg = <0x1140>;
+               ti,index-starts-at-one;
+       };
+
+       atclk_fck: atclk_fck@1140 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&emu_src_ck>;
+               ti,bit-shift = <4>;
+               ti,max-div = <3>;
+               reg = <0x1140>;
+               ti,index-starts-at-one;
+       };
+
+       traceclk_src_fck: traceclk_src_fck@1140 {
+               #clock-cells = <0>;
+               compatible = "ti,mux-clock";
+               clocks = <&sys_ck>, <&emu_core_alwon_ck>, <&emu_per_alwon_ck>, <&emu_mpu_alwon_ck>;
+               ti,bit-shift = <2>;
+               reg = <0x1140>;
+       };
+
+       traceclk_fck: traceclk_fck@1140 {
+               #clock-cells = <0>;
+               compatible = "ti,divider-clock";
+               clocks = <&traceclk_src_fck>;
+               ti,bit-shift = <11>;
+               ti,max-div = <7>;
+               reg = <0x1140>;
+               ti,index-starts-at-one;
+       };
+
+       secure_32k_fck: secure_32k_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <32768>;
+       };
+
+       gpt12_fck: gpt12_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&secure_32k_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
+
+       wdt1_fck: wdt1_fck {
+               #clock-cells = <0>;
+               compatible = "fixed-factor-clock";
+               clocks = <&secure_32k_fck>;
+               clock-mult = <1>;
+               clock-div = <1>;
+       };
 };
 
 &cm_clockdomains {
-       core_l3_clkdm: core_l3_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&sdrc_ick>;
-       };
-
-       dpll3_clkdm: dpll3_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&dpll3_ck>;
-       };
-
-       dpll1_clkdm: dpll1_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&dpll1_ck>;
-       };
-
-       per_clkdm: per_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&uart3_fck>, <&gpio6_dbck>, <&gpio5_dbck>,
-                        <&gpio4_dbck>, <&gpio3_dbck>, <&gpio2_dbck>,
-                        <&wdt3_fck>, <&gpio6_ick>, <&gpio5_ick>, <&gpio4_ick>,
-                        <&gpio3_ick>, <&gpio2_ick>, <&wdt3_ick>, <&uart3_ick>,
-                        <&uart4_ick>, <&gpt9_ick>, <&gpt8_ick>, <&gpt7_ick>,
-                        <&gpt6_ick>, <&gpt5_ick>, <&gpt4_ick>, <&gpt3_ick>,
-                        <&gpt2_ick>, <&mcbsp2_ick>, <&mcbsp3_ick>,
-                        <&mcbsp4_ick>;
-       };
-
-       emu_clkdm: emu_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&emu_src_ck>;
-       };
-
-       dpll4_clkdm: dpll4_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&dpll4_ck>;
-       };
-
-       wkup_clkdm: wkup_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&gpio1_dbck>, <&wdt2_fck>, <&wdt2_ick>, <&wdt1_ick>,
-                        <&gpio1_ick>, <&omap_32ksync_ick>, <&gpt12_ick>,
-                        <&gpt1_ick>;
-       };
-
-       dss_clkdm: dss_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&dss_tv_fck>, <&dss_96m_fck>, <&dss2_alwon_fck>;
-       };
-
-       core_l4_clkdm: core_l4_clkdm {
-               compatible = "ti,clockdomain";
-               clocks = <&mmchs2_fck>, <&mmchs1_fck>, <&i2c3_fck>, <&i2c2_fck>,
-                        <&i2c1_fck>, <&mcspi4_fck>, <&mcspi3_fck>,
-                        <&mcspi2_fck>, <&mcspi1_fck>, <&uart2_fck>,
-                        <&uart1_fck>, <&hdq_fck>, <&mmchs2_ick>, <&mmchs1_ick>,
-                        <&hdq_ick>, <&mcspi4_ick>, <&mcspi3_ick>,
-                        <&mcspi2_ick>, <&mcspi1_ick>, <&i2c3_ick>, <&i2c2_ick>,
-                        <&i2c1_ick>, <&uart2_ick>, <&uart1_ick>, <&gpt11_ick>,
-                        <&gpt10_ick>, <&mcbsp5_ick>, <&mcbsp1_ick>,
-                        <&omapctrl_ick>, <&aes2_ick>, <&sha12_ick>;
-       };
+       core_l3_clkdm: core_l3_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&sdrc_ick>;
+       };
+
+       dpll3_clkdm: dpll3_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&dpll3_ck>;
+       };
+
+       dpll1_clkdm: dpll1_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&dpll1_ck>;
+       };
+
+       per_clkdm: per_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&uart3_fck>, <&gpio6_dbck>, <&gpio5_dbck>,
+                        <&gpio4_dbck>, <&gpio3_dbck>, <&gpio2_dbck>,
+                        <&wdt3_fck>, <&gpio6_ick>, <&gpio5_ick>, <&gpio4_ick>,
+                        <&gpio3_ick>, <&gpio2_ick>, <&wdt3_ick>, <&uart3_ick>,
+                        <&uart4_ick>, <&gpt9_ick>, <&gpt8_ick>, <&gpt7_ick>,
+                        <&gpt6_ick>, <&gpt5_ick>, <&gpt4_ick>, <&gpt3_ick>,
+                        <&gpt2_ick>, <&mcbsp2_ick>, <&mcbsp3_ick>,
+                        <&mcbsp4_ick>;
+       };
+
+       emu_clkdm: emu_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&emu_src_ck>;
+       };
+
+       dpll4_clkdm: dpll4_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&dpll4_ck>;
+       };
+
+       wkup_clkdm: wkup_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&gpio1_dbck>, <&wdt2_fck>, <&wdt2_ick>, <&wdt1_ick>,
+                        <&gpio1_ick>, <&omap_32ksync_ick>, <&gpt12_ick>,
+                        <&gpt1_ick>;
+       };
+
+       dss_clkdm: dss_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&dss_tv_fck>, <&dss_96m_fck>, <&dss2_alwon_fck>;
+       };
+
+       core_l4_clkdm: core_l4_clkdm {
+               compatible = "ti,clockdomain";
+               clocks = <&mmchs2_fck>, <&mmchs1_fck>, <&i2c3_fck>, <&i2c2_fck>,
+                        <&i2c1_fck>, <&mcspi4_fck>, <&mcspi3_fck>,
+                        <&mcspi2_fck>, <&mcspi1_fck>, <&uart2_fck>,
+                        <&uart1_fck>, <&hdq_fck>, <&mmchs2_ick>, <&mmchs1_ick>,
+                        <&hdq_ick>, <&mcspi4_ick>, <&mcspi3_ick>,
+                        <&mcspi2_ick>, <&mcspi1_ick>, <&i2c3_ick>, <&i2c2_ick>,
+                        <&i2c1_ick>, <&uart2_ick>, <&uart1_ick>, <&gpt11_ick>,
+                        <&gpt10_ick>, <&mcbsp5_ick>, <&mcbsp1_ick>,
+                        <&omapctrl_ick>, <&aes2_ick>, <&sha12_ick>;
+       };
 };
index 17602909a61d09f670f9dfb71abb4c7f034ec8bc..2eeed6f4a0123e1e9e5b5c67a2298dc467d434ca 100644 (file)
@@ -8,6 +8,10 @@
  */
 
 /{
+       chosen {
+               tick-timer = &timer2;
+       };
+
        ocp {
                u-boot,dm-spl;
 
 
 &uart1 {
        u-boot,dm-spl;
+       reg-shift = <2>;
 };
 
 &uart3 {
        u-boot,dm-spl;
+       reg-shift = <2>;
 };
 
 &mmc1 {
@@ -49,6 +55,7 @@
        u-boot,dm-spl;
 
        m25p80@0 {
+               compatible = "spi-flash";
                u-boot,dm-spl;
        };
 };
diff --git a/arch/arm/dts/rk3288-vyasa.dts b/arch/arm/dts/rk3288-vyasa.dts
new file mode 100644 (file)
index 0000000..93a9c5e
--- /dev/null
@@ -0,0 +1,327 @@
+/*
+ * Copyright (C) 2017 Jagan Teki <jagan@amarulasolutions.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This file is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/dts-v1/;
+#include "rk3288.dtsi"
+
+/ {
+       model = "Amarula Vyasa-RK3288";
+       compatible = "amarula,vyasa-rk3288", "rockchip,rk3288";
+
+       chosen {
+               stdout-path = &uart2;
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0x80000000>;
+       };
+
+       vcc_sd: sdmmc-regulator {
+               compatible = "regulator-fixed";
+               gpio = <&gpio7 RK_PB3 GPIO_ACTIVE_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&sdmmc_pwr>;
+               regulator-name = "vcc_sd";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               startup-delay-us = <100000>;
+               vin-supply = <&vcc_io>;
+       };
+
+       vcc_sys: vsys-regulator {
+               compatible = "regulator-fixed";
+               regulator-name = "vcc_sys";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+};
+
+&dmc {
+       rockchip,pctl-timing = <0x29a 0xc8 0x1f8 0x42 0x4e 0x4 0xea 0xa
+               0x5 0x0 0xa 0x7 0x19 0x24 0xa 0x7
+               0x5 0xa 0x5 0x200 0x5 0x10 0x40 0x0
+               0x1 0x7 0x7 0x4 0xc 0x43 0x100 0x0
+               0x5 0x0>;
+       rockchip,phy-timing = <0x48f9aab4 0xea0910 0x1002c200
+               0xa60 0x40 0x10 0x0>;
+       /* Add a dummy value to cause of-platdata think this is bytes */
+       rockchip,sdram-params = <0x30B25564 0x627 3 666000000 3 9 1>;
+};
+
+&cpu0 {
+       cpu0-supply = <&vdd_cpu>;
+};
+
+&i2c0 {
+       clock-frequency = <400000>;
+       status = "okay";
+
+       rk808: pmic@1b {
+               compatible = "rockchip,rk808";
+               reg = <0x1b>;
+               interrupt-parent = <&gpio0>;
+               interrupts = <RK_PA4 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pmic_int &global_pwroff>;
+               wakeup-source;
+               rockchip,system-power-controller;
+               #clock-cells = <1>;
+               clock-output-names = "xin32k", "rk808-clkout2";
+
+               vcc1-supply = <&vcc_sys>;
+               vcc2-supply = <&vcc_sys>;
+               vcc3-supply = <&vcc_sys>;
+               vcc4-supply = <&vcc_sys>;
+               vcc6-supply = <&vcc_sys>;
+               vcc7-supply = <&vcc_sys>;
+               vcc8-supply = <&vcc_io>;
+               vcc9-supply = <&vcc_sys>;
+               vcc10-supply = <&vcc_sys>;
+               vcc11-supply = <&vcc_sys>;
+               vcc12-supply = <&vcc_io>;
+
+               regulators {
+                       vdd_cpu: vdd_log: DCDC_REG1 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <750000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-name = "vdd_log";
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vdd_gpu: DCDC_REG2 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <850000>;
+                               regulator-max-microvolt = <1250000>;
+                               regulator-name = "vdd_gpu";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1000000>;
+                               };
+                       };
+
+                       vcc_ddr: DCDC_REG3 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-name = "vcc_ddr";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
+                       };
+
+                       vcc_io: DCDC_REG4 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-name = "vcc_io";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <3300000>;
+                               };
+                       };
+
+                       vcca_tp: LDO_REG1 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-name = "vcc_tp";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <3300000>;
+                               };
+                       };
+
+                       vcc_codec: LDO_REG2 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-name = "vcc_codec";
+                               regulator-state-mem {
+                                       regulator-off-in-suspend;
+                               };
+                       };
+
+                       vdd_10: LDO_REG3 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-name = "vdd_10";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1000000>;
+                               };
+                       };
+
+                       vcc_gps: LDO_REG4 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-name = "vcc_gps";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vccio_sd: LDO_REG5 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-name = "vccio_sd";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <3300000>;
+                               };
+                       };
+
+                       vcc10_lcd: LDO_REG6 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1000000>;
+                               regulator-max-microvolt = <1000000>;
+                               regulator-name = "vcc10_lcd";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vcc_18: LDO_REG7 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-name = "vcc_18";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vcc18_lcd: LDO_REG8 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-name = "vcc18_lcd";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                                       regulator-suspend-microvolt = <1800000>;
+                               };
+                       };
+
+                       vcc33_sd: SWITCH_REG1 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-name = "vcc33_sd";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
+                       };
+
+                       vcc_lan: SWITCH_REG2 {
+                               regulator-always-on;
+                               regulator-boot-on;
+                               regulator-min-microvolt = <3300000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-name = "vcc_lan";
+                               regulator-state-mem {
+                                       regulator-on-in-suspend;
+                               };
+                       };
+               };
+       };
+};
+
+&sdmmc {
+       u-boot,dm-pre-reloc;
+       status = "okay";
+
+       bus-width = <4>;
+       cap-mmc-highspeed;
+       cap-sd-highspeed;
+       card-detect-delay = <200>;
+       disable-wp;
+       pinctrl-names = "default";
+       pinctrl-0 = <&sdmmc_clk>, <&sdmmc_cmd>, <&sdmmc_cd>, <&sdmmc_bus4>;
+       vmmc-supply = <&vcc_sd>;
+       vqmmc-supply = <&vccio_sd>;
+};
+
+&uart2 {
+       u-boot,dm-pre-reloc;
+       status = "okay";
+};
+
+&wdt {
+       status = "okay";
+};
+
+&pinctrl {
+       u-boot,dm-pre-reloc;
+       pmic {
+               pmic_int: pmic-int {
+                       rockchip,pins = <RK_GPIO0 4 RK_FUNC_GPIO &pcfg_pull_up>;
+               };
+       };
+
+       sdmmc {
+               sdmmc_pwr: sdmmc-pwr {
+                       rockchip,pins = <7 11 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+};
index 6052e8a8d38926ed2ccf92a3b04c5e1792134a87..a9b7f81c6273019260b352e8de04246b931cbcef 100644 (file)
@@ -13,6 +13,7 @@
        chosen {
                stdout-path = "serial0:115200n8";
                u-boot,spl-boot-order = &emmc, &sdmmc;
+               tick-timer = "/timer@ff810000";
        };
 
 };
 };
 
 &emmc {
-       u-boot,dm-pre-reloc;
+       u-boot,dm-spl;
 };
 
 &sdmmc {
-       u-boot,dm-pre-reloc;
+       u-boot,dm-spl;
 };
 
 &spi1 {
-       u-boot,dm-pre-reloc;
+       u-boot,dm-spl;
 
        spiflash: w25q32dw@0 {
-               u-boot,dm-pre-reloc;
+               u-boot,dm-spl;
        };
 };
 
 &timer0 {
        u-boot,dm-pre-reloc;
        clock-frequency = <24000000>;
+       status = "okay";
 };
 
 
index dd1baea70407c188e934dd284212b7369357c8ed..a04878e223c007c1749e659a70f0be79fa6b281b 100644 (file)
                };
        };
 
+       usbhub_enable: usbhub_enable {
+               compatible = "regulator-fixed";
+               regulator-name = "usbhub_enable";
+               enable-active-low;
+               gpio = <&gpio4 3 GPIO_ACTIVE_HIGH>;
+               regulator-always-on;
+               regulator-boot-on;
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
        vccadc_ref: vccadc-ref {
                compatible = "regulator-fixed";
                regulator-name = "vcc1v8_sys";
 };
 
 &dwc3_typec1 {
-       rockchip,vbus-gpio = <&gpio4 3 GPIO_ACTIVE_LOW>;
        status = "okay";
 };
 
index 0128dd8b1d73d81dc75cab3058716b952a48ceea..2b221b6d61eef5b4d739b3e152f41e624b5b2ba0 100644 (file)
        chosen {
                stdout-path = "serial2:1500000n8";
        };
+
+       vcc5v0_otg: vcc5v0-otg-drv {
+               compatible = "regulator-fixed";
+               enable-active-high;
+               regulator-name = "vcc5v0_otg";
+               gpio = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>;
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+       };
 };
 
 &gmac {
 &uart2 {
        status = "okay";
 };
+
+&usb20_otg {
+       vbus-supply = <&vcc5v0_otg>;
+       status = "okay";
+};
+
+&usb_host_ehci {
+       status = "okay";
+};
+
+&usb_host_ohci {
+       status = "okay";
+};
index 77ca24e7f3d707927a02b0ad5a8ea4af9253c75b..3153dfe6584a17bf34f308fea3b2c492f1485d57 100644 (file)
                status = "disabled";
        };
 
+       usb_host_ehci: usb@30140000 {
+               compatible = "generic-ehci";
+               reg = <0x30140000 0x20000>;
+               interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       usb_host_ohci: usb@30160000 {
+               compatible = "generic-ohci";
+               reg = <0x30160000 0x20000>;
+               interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
+               status = "disabled";
+       };
+
+       usb20_otg: usb@30180000 {
+               compatible = "rockchip,rv1108-usb", "rockchip,rk3288-usb",
+                            "snps,dwc2";
+               reg = <0x30180000 0x40000>;
+               interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
+               hnp-srp-disable;
+               dr_mode = "otg";
+               status = "disabled";
+       };
+
        sfc: sfc@301c0000 {
                compatible = "rockchip,sfc";
                reg = <0x301c0000 0x200>;
index d8a65145d673aec07eb83bf58ff6b1e3284ec68e..b02a602378ee81304f0ca2e1f269173ef8b9342f 100644 (file)
                                        compatible = "atmel,at91sam9x5-clk-utmi";
                                        #clock-cells = <0>;
                                        clocks = <&main>;
+                                       regmap-sfr = <&sfr>;
                                        u-boot,dm-pre-reloc;
                                };
 
                                        qspi0_clk: qspi0_clk@52 {
                                                #clock-cells = <0>;
                                                reg = <52>;
+                                               u-boot,dm-pre-reloc;
                                        };
 
                                        qspi1_clk: qspi1_clk@53 {
                                                #clock-cells = <0>;
                                                reg = <53>;
+                                               u-boot,dm-pre-reloc;
                                        };
                                };
 
                                status = "disabled";
                        };
 
+                       qspi1: spi@f0024000 {
+                               compatible = "atmel,sama5d2-qspi";
+                               reg = <0xf0024000 0x100>, <0xd8000000 0x08000000>;
+                               reg-names = "qspi_base", "qspi_mmap";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&qspi1_clk>;
+                               status = "disabled";
+                       };
+
                        spi0: spi@f8000000 {
                                compatible = "atmel,at91rm9200-spi";
                                reg = <0xf8000000 0x100>;
                                status = "disabled";
                        };
 
+                       sfr: sfr@f8030000 {
+                               compatible = "atmel,sama5d2-sfr", "syscon";
+                               reg = <0xf8030000 0x98>;
+                       };
+
                        sckc@f8048050 {
                                compatible = "atmel,at91sam9x5-sckc";
                                reg = <0xf8048050 0x4>;
                                status = "disabled";
                        };
 
+                       uart3: serial@fc008000 {
+                               compatible = "atmel,at91sam9260-usart";
+                               reg = <0xfc008000 0x100>;
+                               clocks = <&uart3_clk>;
+                               clock-names = "usart";
+                               status = "disabled";
+                       };
+
                        i2c1: i2c@fc028000 {
                                compatible = "atmel,sama5d2-i2c";
                                reg = <0xfc028000 0x100>;
diff --git a/arch/arm/dts/sama5d27_som1.dtsi b/arch/arm/dts/sama5d27_som1.dtsi
new file mode 100644 (file)
index 0000000..0c44a97
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * sama5d27_som1.dtsi - Device Tree file for SAMA5D27 SOM1
+ *
+ *  Copyright (C) 2017 Microchip Corporation
+ *                     Wenyou Yang <wenyou.yang@microchip.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This file is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU General Public License as
+ *     published by the Free Software Foundation; either version 2 of the
+ *     License, or (at your option) any later version.
+ *
+ *     This file is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "sama5d2.dtsi"
+#include "sama5d2-pinfunc.h"
+/ {
+       model = "Atmel SAMA5D27 SOM1 EK";
+       compatible = "atmel,sama5d27-som1-ek", "atmel,sama5d2", "atmel,sama5";
+
+       memory {
+               reg = <0x20000000 0x8000000>;
+       };
+
+       aliases {
+               spi0 = &qspi1;
+               u-boot,dm-pre-reloc;
+       };
+
+       ahb {
+               apb {
+                       qspi1: spi@f0024000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_qspi1_sck_cs_default &pinctrl_qspi1_dat_default>;
+                               status = "okay";
+                               u-boot,dm-pre-reloc;
+
+                               spi_flash@0 {
+                                       compatible = "spi-flash";
+                                       reg = <0>;
+                                       spi-max-frequency = <50000000>;
+                                       spi-rx-bus-width = <4>;
+                                       spi-tx-bus-width = <4>;
+                                       u-boot,dm-pre-reloc;
+                               };
+                       };
+
+                       macb0: ethernet@f8008000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_macb0_rmii &pinctrl_macb0_phy_irq>;
+                               phy-mode = "rmii";
+                               status = "okay";
+
+                               ethernet-phy@1 {
+                                       reg = <0x1>;
+                               };
+                       };
+
+                       i2c0: i2c@f8028000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c0_default>;
+                               status = "okay";
+
+                               i2c_eeprom: i2c_eeprom@50 {
+                                       compatible = "microchip,24aa02e48";
+                                       reg = <0x50>;
+                               };
+                       };
+
+                       i2c1: i2c@fc028000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c1_default>;
+                               status = "okay";
+                       };
+
+                       pioA: gpio@fc038000 {
+                               pinctrl {
+                                       pinctrl_i2c0_default: i2c0_default {
+                                               pinmux = <PIN_PD21__TWD0>,
+                                                        <PIN_PD22__TWCK0>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_i2c1_default: i2c1_default {
+                                               pinmux = <PIN_PD4__TWD1>,
+                                                        <PIN_PD5__TWCK1>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_macb0_phy_irq: macb0_phy_irq {
+                                               pinmux = <PIN_PD31__GPIO>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_macb0_rmii: macb0_rmii {
+                                               pinmux = <PIN_PD9__GTXCK>,
+                                                        <PIN_PD10__GTXEN>,
+                                                        <PIN_PD11__GRXDV>,
+                                                        <PIN_PD12__GRXER>,
+                                                        <PIN_PD13__GRX0>,
+                                                        <PIN_PD14__GRX1>,
+                                                        <PIN_PD15__GTX0>,
+                                                        <PIN_PD16__GTX1>,
+                                                        <PIN_PD17__GMDC>,
+                                                        <PIN_PD18__GMDIO>;
+                                               bias-disable;
+                                       };
+
+                                       pinctrl_qspi1_sck_cs_default: qspi1_sck_cs_default {
+                                               pinmux = <PIN_PB5__QSPI1_SCK>,
+                                                        <PIN_PB6__QSPI1_CS>;
+                                               bias-disable;
+                                               u-boot,dm-pre-reloc;
+                                       };
+
+                                       pinctrl_qspi1_dat_default: qspi1_dat_default {
+                                               pinmux = <PIN_PB7__QSPI1_IO0>,
+                                                        <PIN_PB8__QSPI1_IO1>,
+                                                        <PIN_PB9__QSPI1_IO2>,
+                                                        <PIN_PB10__QSPI1_IO3>;
+                                               bias-pull-up;
+                                               u-boot,dm-pre-reloc;
+                                       };
+                               };
+                       };
+               };
+       };
+};
index 84ee0892027c845a53ac53209c2a291fcd18bac4..ee0e14e5165bd9407aa34697e896c4173d6adbee 100644 (file)
                                        interrupt-parent = <&pmc>;
                                        interrupts = <AT91_PMC_LOCKU>;
                                        clocks = <&main>;
+                                       regmap-sfr = <&sfr>;
+                                       u-boot,dm-pre-reloc;
                                };
 
                                mck: masterck {
index 79e94f9f2c4498b66dfa361e7b4664b139ab85cc..a7098be8463e7b6461b602d50ab02799008e452f 100644 (file)
 #define CONFIG_SYS_FSL_ERRATUM_A008751
 
 #define CONFIG_SYS_FSL_MAX_NUM_OF_SEC          1
+
+#elif defined(CONFIG_ARCH_LS1088A)
+#define CONFIG_SYS_FSL_NUM_CC_PLLS             3
+#define CONFIG_SYS_FSL_CLUSTER_CLOCKS          { 1, 1 }
+#define CONFIG_GICV3
+#define CONFIG_FSL_TZPC_BP147
+#define CONFIG_FSL_TZASC_400
+#define CONFIG_SYS_PAGE_SIZE           0x10000
+
+#define        SRDS_MAX_LANES  4
+
+/* TZ Protection Controller Definitions */
+#define TZPC_BASE                              0x02200000
+#define TZPCR0SIZE_BASE                                (TZPC_BASE)
+#define TZPCDECPROT_0_STAT_BASE                        (TZPC_BASE + 0x800)
+#define TZPCDECPROT_0_SET_BASE                 (TZPC_BASE + 0x804)
+#define TZPCDECPROT_0_CLR_BASE                 (TZPC_BASE + 0x808)
+#define TZPCDECPROT_1_STAT_BASE                        (TZPC_BASE + 0x80C)
+#define TZPCDECPROT_1_SET_BASE                 (TZPC_BASE + 0x810)
+#define TZPCDECPROT_1_CLR_BASE                 (TZPC_BASE + 0x814)
+#define TZPCDECPROT_2_STAT_BASE                        (TZPC_BASE + 0x818)
+#define TZPCDECPROT_2_SET_BASE                 (TZPC_BASE + 0x81C)
+#define TZPCDECPROT_2_CLR_BASE                 (TZPC_BASE + 0x820)
+
+/* Generic Interrupt Controller Definitions */
+#define GICD_BASE                      0x06000000
+#define GICR_BASE                      0x06100000
+
+/* SMMU Defintions */
+#define SMMU_BASE                      0x05000000 /* GR0 Base */
+
+/* DDR */
+#define CONFIG_SYS_DDR_BLOCK1_SIZE     ((phys_size_t)2 << 30)
+#define CONFIG_MAX_MEM_MAPPED          CONFIG_SYS_DDR_BLOCK1_SIZE
+
+#define CONFIG_SYS_FSL_CCSR_GUR_LE
+#define CONFIG_SYS_FSL_CCSR_SCFG_LE
+#define CONFIG_SYS_FSL_ESDHC_LE
+#define CONFIG_SYS_FSL_IFC_LE
+#define CONFIG_SYS_FSL_PEX_LUT_LE
+
+#define CONFIG_SYS_MEMAC_LITTLE_ENDIAN
+
+/* SFP */
+#define CONFIG_SYS_FSL_SFP_VER_3_4
+#define CONFIG_SYS_FSL_SFP_LE
+#define CONFIG_SYS_FSL_SRK_LE
+
+/* Security Monitor */
+#define CONFIG_SYS_FSL_SEC_MON_LE
+
+/* Secure Boot */
+#define CONFIG_ESBC_HDR_LS
+
+/* DCFG - GUR */
+#define CONFIG_SYS_FSL_CCSR_GUR_LE
+#define CONFIG_SYS_FSL_MAX_NUM_OF_SEC  1
+#define CONFIG_SYS_FSL_OCRAM_BASE      0x18000000 /* initial RAM */
+#define SYS_FSL_OCRAM_SPACE_SIZE       0x00200000 /* 2M space */
+#define CONFIG_SYS_FSL_OCRAM_SIZE      0x00020000 /* Real size 128K */
+
 #elif defined(CONFIG_FSL_LSCH2)
 #define CONFIG_SYS_FSL_OCRAM_BASE              0x10000000 /* initial RAM */
 #define SYS_FSL_OCRAM_SPACE_SIZE               0x00200000 /* 2M space */
 #define GICC_BASE              0x01420000
 
 #define CONFIG_SYS_FSL_MAX_NUM_OF_SEC          1
-
 #else
 #error SoC not defined
 #endif
index c4e5eccd77b5c3e1107b0ca2b714ef5353fe47ab..a0dac86babb7b9b02d62bb11f36d7293667f92fa 100644 (file)
@@ -24,6 +24,10 @@ static struct cpu_type cpu_type_list[] = {
        CPU_TYPE_ENTRY(LS1026A, LS1026A, 2),
        CPU_TYPE_ENTRY(LS2040A, LS2040A, 4),
        CPU_TYPE_ENTRY(LS1012A, LS1012A, 1),
+       CPU_TYPE_ENTRY(LS1088A, LS1088A, 8),
+       CPU_TYPE_ENTRY(LS1084A, LS1084A, 8),
+       CPU_TYPE_ENTRY(LS1048A, LS1048A, 4),
+       CPU_TYPE_ENTRY(LS1044A, LS1044A, 4),
 };
 
 #ifndef CONFIG_SYS_DCACHE_OFF
@@ -199,7 +203,8 @@ static struct mm_region final_map[] = {
        },
        { CONFIG_SYS_FSL_QSPI_BASE1, CONFIG_SYS_FSL_QSPI_BASE1,
          CONFIG_SYS_FSL_QSPI_SIZE1,
-         PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_NON_SHARE
+         PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+         PTE_BLOCK_NON_SHARE | PTE_BLOCK_PXN | PTE_BLOCK_UXN
        },
        { CONFIG_SYS_FSL_QSPI_BASE2, CONFIG_SYS_FSL_QSPI_BASE2,
          CONFIG_SYS_FSL_QSPI_SIZE2,
@@ -208,7 +213,8 @@ static struct mm_region final_map[] = {
        },
        { CONFIG_SYS_FSL_IFC_BASE2, CONFIG_SYS_FSL_IFC_BASE2,
          CONFIG_SYS_FSL_IFC_SIZE2,
-         PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | PTE_BLOCK_NON_SHARE
+         PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
+         PTE_BLOCK_NON_SHARE | PTE_BLOCK_PXN | PTE_BLOCK_UXN
        },
        { CONFIG_SYS_FSL_DCSR_BASE, CONFIG_SYS_FSL_DCSR_BASE,
          CONFIG_SYS_FSL_DCSR_SIZE,
index a8f9a505016da36f9b7ea9f16b9f899c09162a19..12fd6b8bdf99b9ecc369b42d3ede2c58ec4e271c 100644 (file)
@@ -9,7 +9,7 @@
 
 #include <config.h>
 
-#ifdef CONFIG_ARCH_LS2080A
+#ifdef CONFIG_FSL_LSCH3
 enum srds_prtcl {
        /*
         * Nobody will check whether the device 'NONE' has been configured,
@@ -158,6 +158,8 @@ void fsl_serdes_init(void);
 int serdes_get_first_lane(u32 sd, enum srds_prtcl device);
 enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane);
 int is_serdes_prtcl_valid(int serdes, u32 prtcl);
+int serdes_get_number(int serdes, int cfg);
+void fsl_rgmii_init(void);
 
 #ifdef CONFIG_FSL_LSCH2
 const char *serdes_clock_to_string(u32 clock);
index 4afc338b8e7ca28e3679e865e65e6d6f496c9144..2561ead7c392eccab98016e5aefce550290f5e18 100644 (file)
@@ -15,7 +15,6 @@
 #define CONFIG_SYS_DCSR_COP_CCP_ADDR   (CONFIG_SYS_DCSRBAR + 0x02008040)
 
 #define CONFIG_SYS_FSL_DDR_ADDR                        (CONFIG_SYS_IMMR + 0x00080000)
-#define CONFIG_SYS_CCI400_ADDR                 (CONFIG_SYS_IMMR + 0x00180000)
 #define CONFIG_SYS_GIC400_ADDR                 (CONFIG_SYS_IMMR + 0x00400000)
 #define CONFIG_SYS_IFC_ADDR                    (CONFIG_SYS_IMMR + 0x00530000)
 #define SYS_FSL_QSPI_ADDR                      (CONFIG_SYS_IMMR + 0x00550000)
@@ -338,6 +337,25 @@ struct ccsr_gur {
 #define SCFG_USBPWRFAULT_USB2_SHIFT    2
 #define SCFG_USBPWRFAULT_USB1_SHIFT    0
 
+#define SCFG_BASE                      0x01570000
+#define SCFG_USB3PRM1CR_USB1           0x070
+#define SCFG_USB3PRM2CR_USB1           0x074
+#define SCFG_USB3PRM1CR_USB2           0x07C
+#define SCFG_USB3PRM2CR_USB2           0x080
+#define SCFG_USB3PRM1CR_USB3           0x088
+#define SCFG_USB3PRM2CR_USB3           0x08c
+#define SCFG_USB_TXVREFTUNE                    0x9
+#define SCFG_USB_SQRXTUNE_MASK         0x7
+#define SCFG_USB_PCSTXSWINGFULL                0x47
+#define SCFG_USB_PHY1                  0x084F0000
+#define SCFG_USB_PHY2                  0x08500000
+#define SCFG_USB_PHY3                  0x08510000
+#define SCFG_USB_PHY_RX_OVRD_IN_HI             0x200c
+#define USB_PHY_RX_EQ_VAL_1            0x0000
+#define USB_PHY_RX_EQ_VAL_2            0x0080
+#define USB_PHY_RX_EQ_VAL_3            0x0380
+#define USB_PHY_RX_EQ_VAL_4            0x0b80
+
 #define SCFG_SNPCNFGCR_SECRDSNP                0x80000000
 #define SCFG_SNPCNFGCR_SECWRSNP                0x40000000
 #define SCFG_SNPCNFGCR_SATARDSNP       0x00800000
@@ -544,54 +562,6 @@ struct ccsr_serdes {
        u8      res_19a0[0x2000-0x19a0];        /* from 0x19a0 to 0x1fff */
 };
 
-#define CCI400_CTRLORD_TERM_BARRIER    0x00000008
-#define CCI400_CTRLORD_EN_BARRIER      0
-#define CCI400_SHAORD_NON_SHAREABLE    0x00000002
-#define CCI400_DVM_MESSAGE_REQ_EN      0x00000002
-#define CCI400_SNOOP_REQ_EN            0x00000001
-
-/* CCI-400 registers */
-struct ccsr_cci400 {
-       u32 ctrl_ord;                   /* Control Override */
-       u32 spec_ctrl;                  /* Speculation Control */
-       u32 secure_access;              /* Secure Access */
-       u32 status;                     /* Status */
-       u32 impr_err;                   /* Imprecise Error */
-       u8 res_14[0x100 - 0x14];
-       u32 pmcr;                       /* Performance Monitor Control */
-       u8 res_104[0xfd0 - 0x104];
-       u32 pid[8];                     /* Peripheral ID */
-       u32 cid[4];                     /* Component ID */
-       struct {
-               u32 snoop_ctrl;         /* Snoop Control */
-               u32 sha_ord;            /* Shareable Override */
-               u8 res_1008[0x1100 - 0x1008];
-               u32 rc_qos_ord;         /* read channel QoS Value Override */
-               u32 wc_qos_ord;         /* read channel QoS Value Override */
-               u8 res_1108[0x110c - 0x1108];
-               u32 qos_ctrl;           /* QoS Control */
-               u32 max_ot;             /* Max OT */
-               u8 res_1114[0x1130 - 0x1114];
-               u32 target_lat;         /* Target Latency */
-               u32 latency_regu;       /* Latency Regulation */
-               u32 qos_range;          /* QoS Range */
-               u8 res_113c[0x2000 - 0x113c];
-       } slave[5];                     /* Slave Interface */
-       u8 res_6000[0x9004 - 0x6000];
-       u32 cycle_counter;              /* Cycle counter */
-       u32 count_ctrl;                 /* Count Control */
-       u32 overflow_status;            /* Overflow Flag Status */
-       u8 res_9010[0xa000 - 0x9010];
-       struct {
-               u32 event_select;       /* Event Select */
-               u32 event_count;        /* Event Count */
-               u32 counter_ctrl;       /* Counter Control */
-               u32 overflow_status;    /* Overflow Flag Status */
-               u8 res_a010[0xb000 - 0xa010];
-       } pcounter[4];                  /* Performance Counter */
-       u8 res_e004[0x10000 - 0xe004];
-};
-
 /* MMU 500 */
 #define SMMU_SCR0                      (SMMU_BASE + 0x0)
 #define SMMU_SCR1                      (SMMU_BASE + 0x4)
index 59410aa7e74454404aa85bdf3c8001a188095464..957e23b02ad59fe2403b772bf355deb6a0f62157 100644 (file)
 #define CONFIG_SYS_PCIE2_ADDR                  (CONFIG_SYS_IMMR + 0x2500000)
 #define CONFIG_SYS_PCIE3_ADDR                  (CONFIG_SYS_IMMR + 0x2600000)
 #define CONFIG_SYS_PCIE4_ADDR                  (CONFIG_SYS_IMMR + 0x2700000)
+#ifdef CONFIG_ARCH_LS1088A
+#define CONFIG_SYS_PCIE1_PHYS_ADDR             0x2000000000ULL
+#define CONFIG_SYS_PCIE2_PHYS_ADDR             0x2800000000ULL
+#define CONFIG_SYS_PCIE3_PHYS_ADDR             0x3000000000ULL
+#else
 #define CONFIG_SYS_PCIE1_PHYS_ADDR             0x1000000000ULL
 #define CONFIG_SYS_PCIE2_PHYS_ADDR             0x1200000000ULL
 #define CONFIG_SYS_PCIE3_PHYS_ADDR             0x1400000000ULL
 #define CONFIG_SYS_PCIE4_PHYS_ADDR             0x1600000000ULL
+#endif
 
 /* Device Configuration */
 #define DCFG_BASE              0x01e00000
 #define SCFG_BASE              0x01fc0000
 #define SCFG_USB3PRM1CR                        0x000
 #define SCFG_USB3PRM1CR_INIT           0x27672b2a
+#define SCFG_USB_TXVREFTUNE            0x9
+#define SCFG_USB_SQRXTUNE_MASK 0x7
 #define SCFG_QSPICLKCTLR       0x10
 
+#define DCSR_BASE              0x700000000ULL
+#define DCSR_USB_PHY1                  0x4600000
+#define DCSR_USB_PHY2                  0x4610000
+#define DCSR_USB_PHY_RX_OVRD_IN_HI     0x200C
+#define USB_PHY_RX_EQ_VAL_1            0x0000
+#define USB_PHY_RX_EQ_VAL_2            0x0080
+#define USB_PHY_RX_EQ_VAL_3            0x0380
+#define USB_PHY_RX_EQ_VAL_4            0x0b80
+
 #define TP_ITYP_AV             0x00000001      /* Initiator available */
 #define TP_ITYP_TYPE(x)        (((x) & 0x6) >> 1)      /* Initiator Type */
 #define TP_ITYP_TYPE_ARM       0x0
@@ -246,6 +263,23 @@ struct ccsr_gur {
 #define FSL_CHASSIS3_SRDS2_PRTCL_SHIFT FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT
 #define FSL_CHASSIS3_SRDS1_REGSR       29
 #define FSL_CHASSIS3_SRDS2_REGSR       29
+#elif defined(CONFIG_ARCH_LS1088A)
+#define FSL_CHASSIS3_EC1_REGSR  26
+#define FSL_CHASSIS3_EC2_REGSR  26
+#define FSL_CHASSIS3_RCWSR25_EC1_PRTCL_MASK     0x00000007
+#define FSL_CHASSIS3_RCWSR25_EC1_PRTCL_SHIFT    0
+#define FSL_CHASSIS3_RCWSR25_EC2_PRTCL_MASK     0x00000038
+#define FSL_CHASSIS3_RCWSR25_EC2_PRTCL_SHIFT    3
+#define        FSL_CHASSIS3_RCWSR29_SRDS1_PRTCL_MASK   0xFFFF0000
+#define        FSL_CHASSIS3_RCWSR29_SRDS1_PRTCL_SHIFT  16
+#define        FSL_CHASSIS3_RCWSR30_SRDS2_PRTCL_MASK   0x0000FFFF
+#define        FSL_CHASSIS3_RCWSR30_SRDS2_PRTCL_SHIFT  0
+#define FSL_CHASSIS3_SRDS1_PRTCL_MASK  FSL_CHASSIS3_RCWSR29_SRDS1_PRTCL_MASK
+#define FSL_CHASSIS3_SRDS1_PRTCL_SHIFT FSL_CHASSIS3_RCWSR29_SRDS1_PRTCL_SHIFT
+#define FSL_CHASSIS3_SRDS2_PRTCL_MASK  FSL_CHASSIS3_RCWSR30_SRDS2_PRTCL_MASK
+#define FSL_CHASSIS3_SRDS2_PRTCL_SHIFT FSL_CHASSIS3_RCWSR30_SRDS2_PRTCL_SHIFT
+#define FSL_CHASSIS3_SRDS1_REGSR       29
+#define FSL_CHASSIS3_SRDS2_REGSR       30
 #endif
 #define RCW_SB_EN_REG_INDEX    9
 #define RCW_SB_EN_MASK         0x00000400
index aeb12739aad1ca655670794cd6bf9519c494bbc1..247f09e0f5ff69bd209aebac8ab5f9c01df704b2 100644 (file)
 #ifdef CONFIG_SYS_FSL_CCSR_SCFG_LE
 #define scfg_in32(a)       in_le32(a)
 #define scfg_out32(a, v)   out_le32(a, v)
+#define scfg_clrbits32(addr, clear) clrbits_le32(addr, clear)
+#define scfg_clrsetbits32(addr, clear, set) clrsetbits_le32(addr, clear, set)
 #elif defined(CONFIG_SYS_FSL_CCSR_SCFG_BE)
 #define scfg_in32(a)       in_be32(a)
 #define scfg_out32(a, v)   out_be32(a, v)
+#define scfg_clrbits32(addr, clear) clrbits_be32(addr, clear)
+#define scfg_clrsetbits32(addr, clear, set) clrsetbits_be32(addr, clear, set)
 #endif
 
 #ifdef CONFIG_SYS_FSL_PEX_LUT_LE
@@ -57,6 +61,10 @@ struct cpu_type {
 #define SVR_LS1023A            0x879208
 #define SVR_LS1046A            0x870700
 #define SVR_LS1026A            0x870708
+#define SVR_LS1048A            0x870320
+#define SVR_LS1084A            0x870302
+#define SVR_LS1088A            0x870300
+#define SVR_LS1044A            0x870322
 #define SVR_LS2045A            0x870120
 #define SVR_LS2080A            0x870110
 #define SVR_LS2085A            0x870100
index d7d527d8f4f34bea1ead14762550e4c8339f113b..d1891c4bd60065b022e511c6ecacb255d1f11eac 100644 (file)
 #define FSL_USB2_STREAM_ID             2
 #define FSL_SDMMC_STREAM_ID            3
 #define FSL_SATA1_STREAM_ID            4
+
+#if defined(CONFIG_ARCH_LS2080A)
 #define FSL_SATA2_STREAM_ID            5
+#endif
+
+#if defined(CONFIG_ARCH_LS2080A)
 #define FSL_DMA_STREAM_ID              6
+#elif defined(CONFIG_ARCH_LS1088A)
+#define FSL_DMA_STREAM_ID              5
+#endif
 
 /* PCI - programmed in PEXn_LUT */
 #define FSL_PEX_STREAM_ID_START                7
+
+#if defined(CONFIG_ARCH_LS2080A)
 #define FSL_PEX_STREAM_ID_END          22
+#elif defined(CONFIG_ARCH_LS1088A)
+#define FSL_PEX_STREAM_ID_END          18
+#endif
+
 
 /* DPAA2 - set in MC DPC and alloced by MC */
 #define FSL_DPAA2_STREAM_ID_START      23
index fc954c536622a758f65bcb3f9224c4ecb2efc472..ff0fc47021efd54b805056abf85f01d52e4e5732 100644 (file)
@@ -20,7 +20,6 @@
 
 #define SYS_FSL_GIC_ADDR                       (CONFIG_SYS_IMMR + 0x00400000)
 #define CONFIG_SYS_FSL_DDR_ADDR                        (CONFIG_SYS_IMMR + 0x00080000)
-#define CONFIG_SYS_CCI400_ADDR                 (CONFIG_SYS_IMMR + 0x00180000)
 #define CONFIG_SYS_FSL_CSU_ADDR                 (CONFIG_SYS_IMMR + 0x00510000)
 #define CONFIG_SYS_IFC_ADDR                    (CONFIG_SYS_IMMR + 0x00530000)
 #define CONFIG_SYS_FSL_ESDHC_ADDR              (CONFIG_SYS_IMMR + 0x00560000)
index c34fd63e66b01308c8ca05adca042b9d8da0ad4a..fe0bbb9d93d81efb1865be9dad799d0f1b500490 100644 (file)
@@ -6,6 +6,7 @@
 
 #ifndef __ASM_ARCH_LS102XA_IMMAP_H_
 #define __ASM_ARCH_LS102XA_IMMAP_H_
+#include <fsl_immap.h>
 
 #define SVR_MAJ(svr)           (((svr) >>  4) & 0xf)
 #define SVR_MIN(svr)           (((svr) >>  0) & 0xf)
@@ -173,6 +174,21 @@ struct ccsr_gur {
 #define SCFG_PMCINTECR_ETSECERRG1      0x00040000
 #define SCFG_CLUSTERPMCR_WFIL2EN       0x80000000
 
+#define SCFG_BASE                      0x01570000
+#define SCFG_USB3PRM1CR                        0x070
+#define SCFG_USB_TXVREFTUNE            0x9
+#define SCFG_USB_SQRXTUNE_MASK         0x7
+#define SCFG_USB3PRM2CR                        0x074
+#define SCFG_USB_PCSTXSWINGFULL_MASK   0x0000FE00
+#define SCFG_USB_PCSTXSWINGFULL_VAL            0x00008E00
+
+#define USB_PHY_BASE                   0x08510000
+#define USB_PHY_RX_OVRD_IN_HI  0x200c
+#define USB_PHY_RX_EQ_VAL_1            0x0000
+#define USB_PHY_RX_EQ_VAL_2            0x8000
+#define USB_PHY_RX_EQ_VAL_3            0x8004
+#define USB_PHY_RX_EQ_VAL_4            0x800C
+
 /* Supplemental Configuration Unit */
 struct ccsr_scfg {
        u32 dpslpcr;
@@ -374,53 +390,7 @@ struct ccsr_serdes {
        u8      res_a00[0x1000-0xa00];  /* from 0xa00 to 0xfff */
 };
 
-#define CCI400_CTRLORD_TERM_BARRIER    0x00000008
-#define CCI400_CTRLORD_EN_BARRIER      0
-#define CCI400_SHAORD_NON_SHAREABLE    0x00000002
-#define CCI400_DVM_MESSAGE_REQ_EN      0x00000002
-#define CCI400_SNOOP_REQ_EN            0x00000001
-
-/* CCI-400 registers */
-struct ccsr_cci400 {
-       u32 ctrl_ord;                   /* Control Override */
-       u32 spec_ctrl;                  /* Speculation Control */
-       u32 secure_access;              /* Secure Access */
-       u32 status;                     /* Status */
-       u32 impr_err;                   /* Imprecise Error */
-       u8 res_14[0x100 - 0x14];
-       u32 pmcr;                       /* Performance Monitor Control */
-       u8 res_104[0xfd0 - 0x104];
-       u32 pid[8];                     /* Peripheral ID */
-       u32 cid[4];                     /* Component ID */
-       struct {
-               u32 snoop_ctrl;         /* Snoop Control */
-               u32 sha_ord;            /* Shareable Override */
-               u8 res_1008[0x1100 - 0x1008];
-               u32 rc_qos_ord;         /* read channel QoS Value Override */
-               u32 wc_qos_ord;         /* read channel QoS Value Override */
-               u8 res_1108[0x110c - 0x1108];
-               u32 qos_ctrl;           /* QoS Control */
-               u32 max_ot;             /* Max OT */
-               u8 res_1114[0x1130 - 0x1114];
-               u32 target_lat;         /* Target Latency */
-               u32 latency_regu;       /* Latency Regulation */
-               u32 qos_range;          /* QoS Range */
-               u8 res_113c[0x2000 - 0x113c];
-       } slave[5];                     /* Slave Interface */
-       u8 res_6000[0x9004 - 0x6000];
-       u32 cycle_counter;              /* Cycle counter */
-       u32 count_ctrl;                 /* Count Control */
-       u32 overflow_status;            /* Overflow Flag Status */
-       u8 res_9010[0xa000 - 0x9010];
-       struct {
-               u32 event_select;       /* Event Select */
-               u32 event_count;        /* Event Count */
-               u32 counter_ctrl;       /* Counter Control */
-               u32 overflow_status;    /* Overflow Flag Status */
-               u8 res_a010[0xb000 - 0xa010];
-       } pcounter[4];                  /* Performance Counter */
-       u8 res_e004[0x10000 - 0xe004];
-};
+
 
 /* AHCI (sata) register map */
 struct ccsr_ahci {
index 14f5d948c9f65ddaf0cae4f30389caf3f1187173..ba739432606c10b061f7a6d21b662c3625c88f05 100644 (file)
@@ -6,3 +6,10 @@
  */
 
 #include <asm/mach-imx/sys_proto.h>
+
+#define USBPHY_PWD             0x00000000
+
+#define USBPHY_PWD_RXPWDRX     (1 << 20) /* receiver block power down */
+
+#define is_usbotg_phy_active(void) (!(readl(USB_PHY0_BASE_ADDR + USBPHY_PWD) & \
+                                  USBPHY_PWD_RXPWDRX))
index 688d2361df43e267aa8ec529be6d3aa20f44f565..3b115ad57cbf8a8b26212281277e94c9c8ab2069 100644 (file)
@@ -318,9 +318,9 @@ struct clk_root_map {
 };
 
 enum enet_freq {
-       ENET_25MHz,
-       ENET_50MHz,
-       ENET_125MHz,
+       ENET_25MHZ,
+       ENET_50MHZ,
+       ENET_125MHZ,
 };
 
 u32 get_root_clk(enum clk_root_index clock_id);
index dbe340d23e4fb42e2ae45a4b397ec315fc5cca62..ee2e78b99b6684427fb75db7cd0bc8944519a2ce 100644 (file)
 /* Offset is 0.73V for LP873x */
 #define LP873X_BUCK_BASE_VOLT_UV               730000
 
+/* Offset is 0.73V for LP87565 */
+#define LP87565_BUCK_BASE_VOLT_UV              730000
+
 /* TPS659038 */
 #define TPS659038_I2C_SLAVE_ADDR               0x58
 #define TPS659038_REG_ADDR_SMPS12              0x23
 #define TPS65917_REG_ADDR_SMPS1                0x23
 #define TPS65917_REG_ADDR_SMPS2                0x27
 #define TPS65917_REG_ADDR_SMPS3                0x2F
+#define TPS65917_REG_ADDR_SMPS4                0x33
 
 /* LP873X */
 #define LP873X_I2C_SLAVE_ADDR          0x60
 #define LP873X_REG_ADDR_BUCK1          0x7
 #define LP873X_REG_ADDR_LDO1           0xA
 
+/* LP87565 */
+#define LP87565_I2C_SLAVE_ADDR         0x61
+#define LP87565_REG_ADDR_BUCK01                0xA
+#define LP87565_REG_ADDR_BUCK23                0xE
+
 /* TPS */
 #define TPS62361_I2C_SLAVE_ADDR                0x60
 #define TPS62361_REG_ADDR_SET0         0x0
index 5eed98ca27a41cec88ad0111ff2d1673bba98a2a..55f49c784857ec353d6fcfbc161822e88247d444 100644 (file)
 
 #include <asm/types.h>
 
-#define FSC    (1 << 19)
-#define SSC    (0 << 19)
-
-#define IEN    (1 << 18)
-#define IDIS   (0 << 18)
-
-#define PTU    (1 << 17)
-#define PTD    (0 << 17)
-#define PEN    (1 << 16)
-#define PDIS   (0 << 16)
-
-#define WKEN   (1 << 24)
-#define WKDIS  (0 << 24)
-
 #define PULL_ENA               (0 << 16)
 #define PULL_DIS               (1 << 16)
 #define PULL_UP                        (1 << 17)
index b047f0d6508159374e42bc738714b2c9931c6cfb..81feac704aae5b34cf86c10fcea608c699e17083 100644 (file)
 #define OMAP5430_CONTROL_ID_CODE_ES2_0          0x1B94202F
 #define OMAP5432_CONTROL_ID_CODE_ES1_0         0x0B99802F
 #define OMAP5432_CONTROL_ID_CODE_ES2_0          0x1B99802F
+#define DRA762_CONTROL_ID_CODE_ES1_0           0x0BB5002F
 #define DRA752_CONTROL_ID_CODE_ES1_0           0x0B99002F
 #define DRA752_CONTROL_ID_CODE_ES1_1           0x1B99002F
 #define DRA752_CONTROL_ID_CODE_ES2_0           0x2B99002F
 #define DRA722_CONTROL_ID_CODE_ES1_0           0x0B9BC02F
 #define DRA722_CONTROL_ID_CODE_ES2_0           0x1B9BC02F
+#define DRA722_CONTROL_ID_CODE_ES2_1           0x2B9BC02F
 
 /* UART */
 #define UART1_BASE             (OMAP54XX_L4_PER_BASE + 0x6a000)
index 26071c8ec8ae1b3a8790abc79e5b92139f2d23dc..c0c0d84cf1675d35c3d717fda8993b82478185ba 100644 (file)
@@ -54,6 +54,32 @@ struct rk322x_grf {
        unsigned int os_reg[8];
        unsigned int reserved9[(0x604 - 0x5e4) / 4 - 1];
        unsigned int ddrc_stat;
+       unsigned int reserved10[(0x680 - 0x604) / 4 - 1];
+       unsigned int sig_detect_con[2];
+       unsigned int reserved11[(0x690 - 0x684) / 4 - 1];
+       unsigned int sig_detect_status[2];
+       unsigned int reserved12[(0x6a0 - 0x694) / 4 - 1];
+       unsigned int sig_detect_clr[2];
+       unsigned int reserved13[(0x6b0 - 0x6a4) / 4 - 1];
+       unsigned int emmc_det;
+       unsigned int reserved14[(0x700 - 0x6b0) / 4 - 1];
+       unsigned int host0_con[3];
+       unsigned int reserved15;
+       unsigned int host1_con[3];
+       unsigned int reserved16;
+       unsigned int host2_con[3];
+       unsigned int reserved17[(0x760 - 0x728) / 4 - 1];
+       unsigned int usbphy0_con[27];
+       unsigned int reserved18[(0x800 - 0x7c8) / 4 - 1];
+       unsigned int usbphy1_con[27];
+       unsigned int reserved19[(0x880 - 0x868) / 4 - 1];
+       unsigned int otg_con0;
+       unsigned int uoc_status0;
+       unsigned int reserved20[(0x900 - 0x884) / 4 - 1];
+       unsigned int mac_con[2];
+       unsigned int reserved21[(0xb00 - 0x904) / 4 - 1];
+       unsigned int macphy_con[4];
+       unsigned int macphy_status;
 };
 check_member(rk322x_grf, ddrc_stat, 0x604);
 
@@ -516,4 +542,10 @@ enum {
        CON_IOMUX_PWM0SEL_SHIFT = 0,
        CON_IOMUX_PWM0SEL_MASK  = 1 << CON_IOMUX_PWM0SEL_SHIFT,
 };
+
+/* GRF_MACPHY_CON0 */
+enum {
+       MACPHY_CFG_ENABLE_SHIFT = 0,
+       MACPHY_CFG_ENABLE_MASK  = 1 << MACPHY_CFG_ENABLE_SHIFT,
+};
 #endif
index a34990368e4b61f023d84da95966aff15efa998c..6121aab547fc8a0f8015c05479ef8b4ef77edc35 100644 (file)
@@ -8,15 +8,6 @@
 #ifndef _ASM_ARMV8_MMU_H_
 #define _ASM_ARMV8_MMU_H_
 
-/***************************************************************/
-/*
- * The following definitions are related each other, shoud be
- * calculated specifically.
- */
-
-#define VA_BITS                        CONFIG_SYS_VA_BITS
-#define PTE_BLOCK_BITS         CONFIG_SYS_PTL2_BITS
-
 /*
  * block/section address mask and size definitions.
  */
@@ -25,7 +16,7 @@
 #undef  PAGE_SIZE
 #define PAGE_SHIFT             12
 #define PAGE_SIZE              (1 << PAGE_SHIFT)
-#define PAGE_MASK              (~(PAGE_SIZE-1))
+#define PAGE_MASK              (~(PAGE_SIZE - 1))
 
 /***************************************************************/
 
index a5821f54e5670a185ea541013ec7e2359089db5b..287466800e4bfd4f1793e8a59d22ef65c86fbd8b 100644 (file)
@@ -8,13 +8,9 @@
 #ifndef __ASM_ARM_DMA_MAPPING_H
 #define __ASM_ARM_DMA_MAPPING_H
 
-#define        dma_mapping_error(x, y) 0
+#include <linux/dma-direction.h>
 
-enum dma_data_direction {
-       DMA_BIDIRECTIONAL       = 0,
-       DMA_TO_DEVICE           = 1,
-       DMA_FROM_DEVICE         = 2,
-};
+#define        dma_mapping_error(x, y) 0
 
 static inline void *dma_alloc_coherent(size_t len, unsigned long *handle)
 {
index b0b3b9377eecf1b877ce4d190365d87b0f78446d..ec6463dbb86c0e4cda097aed4e4120424f5a9be8 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright 2015 Freescale Semiconductor, Inc.
+ * Copyright 2017 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
  * DDR memory map
  */
 #ifdef CONFIG_FSL_LSCH3
-#define CONFIG_BS_HDR_ADDR_DEVICE      0x580d00000
-#define CONFIG_BS_ADDR_DEVICE          0x580e00000
-#define CONFIG_BS_HDR_ADDR_RAM         0xa0d00000
-#define CONFIG_BS_ADDR_RAM             0xa0e00000
-#define CONFIG_BS_HDR_SIZE             0x00002000
+#ifdef CONFIG_QSPI_BOOT
+#define CONFIG_BS_ADDR_DEVICE          0x20600000
+#define CONFIG_BS_HDR_ADDR_DEVICE      0x20640000
+#else /* NOR BOOT */
+#define CONFIG_BS_ADDR_DEVICE          0x580600000
+#define CONFIG_BS_HDR_ADDR_DEVICE      0x580640000
+#endif /*ifdef CONFIG_QSPI_BOOT */
 #define CONFIG_BS_SIZE                 0x00001000
+#define CONFIG_BS_HDR_SIZE             0x00004000
+#define CONFIG_BS_ADDR_RAM             0xa0600000
+#define CONFIG_BS_HDR_ADDR_RAM         0xa0640000
 #else
 #ifdef CONFIG_SD_BOOT
 /* For SD boot address and size are assigned in terms of sector
  * offset and no. of sectors respectively.
  */
-#if defined(CONFIG_ARCH_LS1043A) || defined(CONFIG_ARCH_LS1046A)
-#define CONFIG_BS_HDR_ADDR_DEVICE      0x00000920
-#else
-#define CONFIG_BS_HDR_ADDR_DEVICE       0x00000900
-#endif
-#define CONFIG_BS_ADDR_DEVICE          0x00000940
-#define CONFIG_BS_HDR_SIZE             0x00000010
+#define CONFIG_BS_ADDR_DEVICE          0x00003000
+#define CONFIG_BS_HDR_ADDR_DEVICE      0x00003200
 #define CONFIG_BS_SIZE                 0x00000008
+#define CONFIG_BS_HDR_SIZE             0x00000010
 #elif defined(CONFIG_NAND_BOOT)
-#define CONFIG_BS_HDR_ADDR_DEVICE      0x00800000
-#define CONFIG_BS_ADDR_DEVICE          0x00802000
-#define CONFIG_BS_HDR_SIZE             0x00002000
-#define CONFIG_BS_SIZE                 0x00001000
-#elif defined(CONFIG_QSPI_BOOT)
-#ifdef CONFIG_ARCH_LS1046A
-#define CONFIG_BS_HDR_ADDR_DEVICE      0x40780000
-#define CONFIG_BS_ADDR_DEVICE          0x40800000
-#elif defined(CONFIG_ARCH_LS1012A)
-#define CONFIG_BS_HDR_ADDR_DEVICE      0x400c0000
-#define CONFIG_BS_ADDR_DEVICE          0x40060000
-#else
-#error "Platform not supported"
-#endif
+#define CONFIG_BS_ADDR_DEVICE          0x00600000
+#define CONFIG_BS_HDR_ADDR_DEVICE      0x00640000
+#define CONFIG_BS_SIZE                 0x00001000
 #define CONFIG_BS_HDR_SIZE             0x00002000
+#elif defined(CONFIG_QSPI_BOOT)
+#define CONFIG_BS_ADDR_DEVICE          0x40600000
+#define CONFIG_BS_HDR_ADDR_DEVICE      0x40640000
 #define CONFIG_BS_SIZE                 0x00001000
-#else /* Default NOR Boot */
-#define CONFIG_BS_HDR_ADDR_DEVICE      0x600a0000
-#define CONFIG_BS_ADDR_DEVICE          0x60060000
 #define CONFIG_BS_HDR_SIZE             0x00002000
+#else /* Default NOR Boot */
+#define CONFIG_BS_ADDR_DEVICE          0x60600000
+#define CONFIG_BS_HDR_ADDR_DEVICE      0x60640000
 #define CONFIG_BS_SIZE                 0x00001000
+#define CONFIG_BS_HDR_SIZE             0x00002000
 #endif
-#define CONFIG_BS_HDR_ADDR_RAM         0x81000000
-#define CONFIG_BS_ADDR_RAM             0x81020000
+#define CONFIG_BS_ADDR_RAM             0x81000000
+#define CONFIG_BS_HDR_ADDR_RAM         0x81020000
 #endif
 
 #ifdef CONFIG_BOOTSCRIPT_COPY_RAM
-#define CONFIG_BOOTSCRIPT_HDR_ADDR     CONFIG_BS_HDR_ADDR_RAM
 #define CONFIG_BOOTSCRIPT_ADDR         CONFIG_BS_ADDR_RAM
+#define CONFIG_BOOTSCRIPT_HDR_ADDR     CONFIG_BS_HDR_ADDR_RAM
 #else
 #define CONFIG_BOOTSCRIPT_HDR_ADDR     CONFIG_BS_HDR_ADDR_DEVICE
 /* BOOTSCRIPT_ADDR is not required */
index ef5c481349f6f4dd169a04b44cda8849478f0e42..481e9389c455a6a1e0cd114542af776f3649b74d 100644 (file)
@@ -596,6 +596,7 @@ extern struct prcm_regs const omap4_prcm;
 extern struct prcm_regs const dra7xx_prcm;
 extern struct dplls const **dplls_data;
 extern struct dplls dra7xx_dplls;
+extern struct dplls dra72x_dplls;
 extern struct vcores_data const **omap_vcores;
 extern const u32 sys_clk_array[8];
 extern struct omap_sys_ctrl_regs const **ctrl;
@@ -607,6 +608,7 @@ extern struct omap_sys_ctrl_regs const dra7xx_ctrl;
 
 extern struct pmic_data tps659038;
 extern struct pmic_data lp8733;
+extern struct pmic_data lp87565;
 
 void hw_data_init(void);
 
@@ -722,6 +724,7 @@ static inline u8 is_omap54xx(void)
 
 #define DRA7XX         0x07000000
 #define DRA72X         0x07200000
+#define DRA76X         0x07600000
 
 static inline u8 is_dra7xx(void)
 {
@@ -734,6 +737,12 @@ static inline u8 is_dra72x(void)
        extern u32 *const omap_si_rev;
        return (*omap_si_rev & 0xFFF00000) == DRA72X;
 }
+
+static inline u8 is_dra76x(void)
+{
+       extern u32 *const omap_si_rev;
+       return (*omap_si_rev & 0xFFF00000) == DRA76X;
+}
 #endif
 
 /*
@@ -761,11 +770,13 @@ static inline u8 is_dra72x(void)
 #define OMAP5432_ES2_0  0x54320200
 
 /* DRA7XX */
+#define DRA762_ES1_0   0x07620100
 #define DRA752_ES1_0   0x07520100
 #define DRA752_ES1_1   0x07520110
 #define DRA752_ES2_0   0x07520200
 #define DRA722_ES1_0   0x07220100
 #define DRA722_ES2_0   0x07220200
+#define DRA722_ES2_1   0x07220210
 
 /*
  * silicon device type
index f6eb51ee3c61cca7b39aa60daa61e22c79a70fbf..fd33408622a1ad09cbb79a9a5686c7ef77bab16a 100644 (file)
@@ -174,4 +174,5 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
                int wp_gpio);
 
 void vmmc_pbias_config(uint voltage);
+void board_mmc_poweron_ldo(uint voltage);
 #endif /* OMAP_MMC_H_ */
index 20f7eeaf0913285c8a5d44a03631d20996f5a727..0e71b69a1965b55c445d97f9628a708809f2c7ac 100644 (file)
@@ -1,5 +1,60 @@
 if ARCH_AT91
 
+config AT91FAMILY
+       def_bool y
+
+config AT91SAM9260
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9G20
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9XE
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9261
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9263
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9G45
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9M10G45
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9N12
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9RL
+       bool
+       select CPU_ARM926EJS
+
+config AT91SAM9X5
+       bool
+       select CPU_ARM926EJS
+
+config SAMA5D2
+       bool
+       select CPU_V7
+
+config SAMA5D3
+       bool
+       select CPU_V7
+
+config SAMA5D4
+       bool
+       select CPU_V7
+
 choice
        prompt "Atmel AT91 board select"
        optional
@@ -10,24 +65,24 @@ config TARGET_AT91RM9200EK
 
 config TARGET_AT91SAM9260EK
        bool "Atmel at91sam9260 reference board"
-       select CPU_ARM926EJS
+       select AT91SAM9260
        select BOARD_EARLY_INIT_F
 
 config TARGET_ETHERNUT5
        bool "Ethernut5 board"
-       select CPU_ARM926EJS
+       select AT91SAM9XE
 
 config TARGET_SNAPPER9260
        bool "Support snapper9260"
-       select CPU_ARM926EJS
+       select AT91SAM9260
        select DM
        select DM_SERIAL
        select DM_GPIO
 
 config TARGET_GURNARD
        bool "Support gurnard"
+       select AT91SAM9G45
        select BOARD_LATE_INIT
-       select CPU_ARM926EJS
        select DM
        select DM_SERIAL
        select DM_GPIO
@@ -35,107 +90,120 @@ config TARGET_GURNARD
 
 config TARGET_AT91SAM9261EK
        bool "Atmel at91sam9261 reference board"
-       select CPU_ARM926EJS
+       select AT91SAM9261
        select BOARD_EARLY_INIT_F
 
 config TARGET_PM9261
        bool "Ronetix pm9261 board"
-       select CPU_ARM926EJS
+       select AT91SAM9261
 
 config TARGET_AT91SAM9263EK
        bool "Atmel at91sam9263 reference board"
-       select CPU_ARM926EJS
+       select AT91SAM9263
        select BOARD_EARLY_INIT_F
 
 config TARGET_USB_A9263
        bool "Caloa USB A9260 board"
-       select CPU_ARM926EJS
+       select AT91SAM9263
 
 config TARGET_PM9263
        bool "Ronetix pm9263 board"
-       select CPU_ARM926EJS
+       select AT91SAM9263
 
 config TARGET_AT91SAM9M10G45EK
        bool "Atmel AT91SAM9M10G45-EK board"
-       select CPU_ARM926EJS
+       select AT91SAM9M10G45
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
 
 config TARGET_PM9G45
        bool "Ronetix pm9g45 board"
-       select CPU_ARM926EJS
+       select AT91SAM9G45
 
 config TARGET_PICOSAM9G45
        bool "Mini-box picosam9g45 board"
-       select CPU_ARM926EJS
+       select AT91SAM9M10G45
        select SUPPORT_SPL
 
 config TARGET_AT91SAM9N12EK
        bool "Atmel AT91SAM9N12-EK board"
-       select CPU_ARM926EJS
+       select AT91SAM9N12
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
 
 config TARGET_AT91SAM9RLEK
        bool "Atmel at91sam9rl reference board"
-       select CPU_ARM926EJS
+       select AT91SAM9RL
        select BOARD_EARLY_INIT_F
 
 config TARGET_AT91SAM9X5EK
        bool "Atmel AT91SAM9X5-EK board"
-       select CPU_ARM926EJS
+       select AT91SAM9X5
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
 
 config TARGET_SAMA5D2_PTC
        bool "SAMA5D2 PTC board"
-       select CPU_V7
+       select SAMA5D2
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
 
 config TARGET_SAMA5D2_XPLAINED
        bool "SAMA5D2 Xplained board"
+       select SAMA5D2
+       select SUPPORT_SPL
+       select BOARD_EARLY_INIT_F
+
+config TARGET_SAMA5D27_SOM1_EK
+       bool "SAMA5D27 SOM1 EK board"
        select CPU_V7
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
+       select BOARD_LATE_INIT
+       help
+         The SAMA5D27 SOM1 embeds SAMA5D2 SiP(System in Package),
+         a 64Mbit QSPI flash, KSZ8081 Phy and a Mac-address EEPROM
+         24AA02E48. The SAMA5D2 SiP integrates the ARM Cortex-A5
+         processor-based SAMA5D2 MPU with up to 1 Gbit DDR2-SDRAM
+         in a single package.
 
 config TARGET_SAMA5D3_XPLAINED
        bool "SAMA5D3 Xplained board"
-       select CPU_V7
+       select SAMA5D3
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
 
 config TARGET_SAMA5D3XEK
        bool "SAMA5D3X-EK board"
+       select SAMA5D3
        select BOARD_LATE_INIT
-       select CPU_V7
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
 
 config TARGET_SAMA5D4_XPLAINED
        bool "SAMA5D4 Xplained board"
-       select CPU_V7
+       select SAMA5D4
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
 
 config TARGET_SAMA5D4EK
        bool "SAMA5D4 Evaluation Kit"
-       select CPU_V7
+       select SAMA5D4
        select SUPPORT_SPL
        select BOARD_EARLY_INIT_F
 
 config TARGET_MA5D4EVK
        bool "Aries MA5D4EVK Evaluation Kit"
-       select CPU_V7
+       select SAMA5D4
        select SUPPORT_SPL
 
 config TARGET_MEESC
        bool "Support meesc"
-       select CPU_ARM926EJS
+       select AT91SAM9263
 
 config TARGET_CORVUS
        bool "Support corvus"
-       select CPU_ARM926EJS
+       select AT91SAM9M10G45
        select SUPPORT_SPL
        select DM
        select DM_SERIAL
@@ -144,7 +212,7 @@ config TARGET_CORVUS
 
 config TARGET_TAURUS
        bool "Support taurus"
-       select CPU_ARM926EJS
+       select AT91SAM9G20
        select SUPPORT_SPL
        select DM
        select DM_SERIAL
@@ -153,7 +221,7 @@ config TARGET_TAURUS
 
 config TARGET_SMARTWEB
        bool "Support smartweb"
-       select CPU_ARM926EJS
+       select AT91SAM9260
        select SUPPORT_SPL
        select DM
        select DM_SERIAL
@@ -162,7 +230,7 @@ config TARGET_SMARTWEB
 
 config TARGET_VINCO
        bool "Support VINCO"
-       select CPU_V7
+       select SAMA5D4
        select SUPPORT_SPL
 
 endchoice
@@ -181,6 +249,7 @@ source "board/atmel/at91sam9rlek/Kconfig"
 source "board/atmel/at91sam9x5ek/Kconfig"
 source "board/atmel/sama5d2_ptc/Kconfig"
 source "board/atmel/sama5d2_xplained/Kconfig"
+source "board/atmel/sama5d27_som1_ek/Kconfig"
 source "board/atmel/sama5d3_xplained/Kconfig"
 source "board/atmel/sama5d3xek/Kconfig"
 source "board/atmel/sama5d4_xplained/Kconfig"
index 2e559537995a7e4a493ffc946df2022be6c291b8..51c5e80be7c5f81f18f4936f9bf6b64d3e23ab97 100644 (file)
@@ -150,6 +150,48 @@ void at91_mck_init(u32 mckr)
                ;
 }
 
+/*
+ * For the Master Clock Controller Register(MCKR), while switching
+ * to a lower clock source, we must switch the clock source first
+ * instead of last. Otherwise, we could end up with too high frequency
+ * on the internal bus and peripherals.
+ */
+void at91_mck_init_down(u32 mckr)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+       u32 tmp;
+
+       tmp = readl(&pmc->mckr);
+       tmp &= (~AT91_PMC_MCKR_CSS_MASK);
+       tmp |= (mckr & AT91_PMC_MCKR_CSS_MASK);
+       writel(tmp, &pmc->mckr);
+
+       while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
+               ;
+
+#ifdef CPU_HAS_H32MXDIV
+       tmp = readl(&pmc->mckr);
+       tmp &= (~AT91_PMC_MCKR_H32MXDIV);
+       tmp |= (mckr & AT91_PMC_MCKR_H32MXDIV);
+       writel(tmp, &pmc->mckr);
+#endif
+
+       tmp = readl(&pmc->mckr);
+       tmp &= (~AT91_PMC_MCKR_PLLADIV_MASK);
+       tmp |= (mckr & AT91_PMC_MCKR_PLLADIV_MASK);
+       writel(tmp, &pmc->mckr);
+
+       tmp = readl(&pmc->mckr);
+       tmp &= (~AT91_PMC_MCKR_MDIV_MASK);
+       tmp |= (mckr & AT91_PMC_MCKR_MDIV_MASK);
+       writel(tmp, &pmc->mckr);
+
+       tmp = readl(&pmc->mckr);
+       tmp &= (~AT91_PMC_MCKR_PRES_MASK);
+       tmp |= (mckr & AT91_PMC_MCKR_PRES_MASK);
+       writel(tmp, &pmc->mckr);
+}
+
 int at91_enable_periph_generated_clk(u32 id, u32 clk_source, u32 div)
 {
        struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
index 978eac29bd74e89d5d45e46dde39252f4617b32e..de1d9b5bfb31baa59b1479aa9529788cdfb12a8a 100644 (file)
 #include <asm/arch/clk.h>
 #include <asm/arch/sama5d2.h>
 
-char *get_cpu_name()
+int cpu_is_sama5d2(void)
 {
+       unsigned int chip_id = get_chip_id();
+
+       return ((chip_id == ARCH_ID_SAMA5D2) ||
+               (chip_id == ARCH_ID_SAMA5D2_SIP)) ? 1 : 0;
+}
+
+char *get_cpu_name(void)
+{
+       unsigned int chip_id = get_chip_id();
        unsigned int extension_id = get_extension_chip_id();
 
-       if (cpu_is_sama5d2()) {
+       if (chip_id == ARCH_ID_SAMA5D2) {
                switch (extension_id) {
                case ARCH_EXID_SAMA5D21CU:
                        return "SAMA5D21";
@@ -41,6 +50,19 @@ char *get_cpu_name()
                }
        }
 
+       if ((chip_id == ARCH_ID_SAMA5D2) || (chip_id == ARCH_ID_SAMA5D2_SIP)) {
+               switch (extension_id) {
+               case ARCH_EXID_SAMA5D225C_D1M:
+                       return "SAMA5D225 128M bits DDR2 SDRAM";
+               case ARCH_EXID_SAMA5D27C_D5M:
+                       return "SAMA5D27 512M bits DDR2 SDRAM";
+               case ARCH_EXID_SAMA5D27C_D1G:
+                       return "SAMA5D27 1G bits DDR2 SDRAM";
+               case ARCH_EXID_SAMA5D28C_D1G:
+                       return "SAMA5D28 1G bits DDR2 SDRAM";
+               }
+       }
+
        return "Unknown CPU type";
 }
 
index adf44c6a94ce4ea061d829ed5c1ebc9cc2f60f7d..d595ba8836be6f8cf0718e3d4aa9c07949fd4417 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/arch/sama5_sfr.h>
 
index 0742ffc56f8a059a6aca6aa39e16be8a7970069a..0b09ce7b2e0df686aa6912050122f384757e9007 100644 (file)
@@ -25,6 +25,7 @@ void at91_lcd_hw_init(void);
 void at91_plla_init(u32 pllar);
 void at91_pllb_init(u32 pllar);
 void at91_mck_init(u32 mckr);
+void at91_mck_init_down(u32 mckr);
 void at91_pmc_init(void);
 void mem_init(void);
 void at91_phy_reset(void);
@@ -36,4 +37,7 @@ void matrix_init(void);
 void redirect_int_from_saic_to_aic(void);
 void configure_2nd_sram_as_l2_cache(void);
 
+int at91_set_ethaddr(int offset);
+int at91_video_show_board_info(void);
+
 #endif /* AT91_COMMON_H */
index 2875ff20b192954cf27c06523db6a44bbdfa5d6b..08ad1bf2d047a9ea0aeb87e3395b249f0341a94c 100644 (file)
@@ -87,6 +87,8 @@ typedef struct at91_pmc {
 
 #define AT91_PMC_MCFR_MAINRDY          0x00010000
 #define AT91_PMC_MCFR_MAINF_MASK       0x0000FFFF
+#define AT91_PMC_MCFR_RCMEAS           0x00100000
+#define AT91_PMC_MCFR_CCSS_XTAL_OSC    0x01000000
 
 #define AT91_PMC_MCKR_CSS_SLOW         0x00000000
 #define AT91_PMC_MCKR_CSS_MAIN         0x00000001
index d177bdcae56cd72565ab057ee12743d1e3891175..d15fb7a2921eee47535cf29c1f6c719cc0930b93 100644 (file)
@@ -6,7 +6,6 @@
 #ifndef __AT91RM9200_H__
 #define __AT91RM9200_H__
 
-#define CONFIG_AT91FAMILY      /* it's a member of AT91 family */
 #define CONFIG_ARCH_CPU_INIT   /* we need arch_cpu_init() for hw timers */
 #define CONFIG_AT91_GPIO       /* and require always gpio features */
 
index 1a4e84b050a94e0a4436b22b3532456b928c72cd..24d5dbd68a707b26ae9c510bb7a016ff87d57db4 100644 (file)
 #ifndef AT91SAM9260_H
 #define AT91SAM9260_H
 
-/*
- * defines to be used in other places
- */
-#define CONFIG_AT91FAMILY      /* it's a member of AT91 */
-
 /*
  * Peripheral identifiers/interrupts.
  */
index 914a3b0460e062e5dd2e7d62fd8bf4e97534002e..06403ce2254e2b9cc52224ad774f6697a924ffd2 100644 (file)
 #ifndef AT91SAM9261_H
 #define AT91SAM9261_H
 
-/*
- * defines to be used in other places
- */
-#define CONFIG_AT91FAMILY      /* it's a member of AT91 */
-
 /*
  * Peripheral identifiers/interrupts.
  */
index 71675abf824faa4c6d60cea13077c783b7927197..be9a665db5bf28a1f10884e99f13698b6d37ae1f 100644 (file)
 #ifndef AT91SAM9263_H
 #define AT91SAM9263_H
 
-/*
- * defines to be used in other places
- */
-#define CONFIG_AT91FAMILY      /* it's a member of AT91 */
-
 /*
  * Peripheral identifiers/interrupts.
  */
index 5c32e24ed0f24559f2cf66124752053b25fc1351..96922c4e6bc7782d8d1782fe91b91a253262e6ee 100644 (file)
 #ifndef AT91SAM9G45_H
 #define AT91SAM9G45_H
 
-/*
- * defines to be used in other places
- */
-#define CONFIG_AT91FAMILY      /* it's a member of AT91 */
-
 /*
  * Peripheral identifiers/interrupts.
  */
index 70bbf4edaa432f4219db1acf9be4ed27c8f65414..8f9155c9ea68758c88c040cb19c8ce026ed06c77 100644 (file)
 #ifndef AT91SAM9RL_H
 #define AT91SAM9RL_H
 
-/*
- * defines to be used in other places
- */
-#define CONFIG_AT91FAMILY      /* it's a member of AT91 */
-
 /*
  * Peripheral identifiers/interrupts.
  */
index e7224e432d90fd96f9c5fc24d7385b965d3a95a8..f9710a172f8cd2113c5819eb60f72c6ceeb4c5b5 100644 (file)
@@ -12,8 +12,6 @@
 #ifndef __AT91SAM9X5_H__
 #define __AT91SAM9X5_H__
 
-#define CONFIG_AT91FAMILY      /* it's a member of AT91 family */
-
 /*
  * Peripheral identifiers/interrupts.
  */
index 803501f5cf98c057412d8aa93f6f8fd5082f73bb..40e1cf0a0a9939b668ce8a279465b862dfa6b5a7 100644 (file)
@@ -96,6 +96,10 @@ int ddr3_init(const unsigned int base,
 #define ATMEL_MPDDRC_CR_DLL_RESET_ENABLED      (0x1 << 7)
 #define ATMEL_MPDDRC_CR_DIC_DS                 (0x1 << 8)
 #define ATMEL_MPDDRC_CR_DIS_DLL                        (0x1 << 9)
+#define ATMEL_MPDDRC_CR_ZQ_INIT                        (0x0 << 10)
+#define ATMEL_MPDDRC_CR_ZQ_LONG                        (0x1 << 10)
+#define ATMEL_MPDDRC_CR_ZQ_SHORT               (0x2 << 10)
+#define ATMEL_MPDDRC_CR_ZQ_RESET               (0x3 << 10)
 #define ATMEL_MPDDRC_CR_OCD_DEFAULT            (0x7 << 12)
 #define ATMEL_MPDDRC_CR_DQMS_SHARED            (0x1 << 16)
 #define ATMEL_MPDDRC_CR_ENRDM_ON               (0x1 << 17)
index b805a2c93495e80e2a20a3a262dbc64d6471b6ba..965631aad76f32534855fbf06dcb255e99874846 100644 (file)
@@ -28,6 +28,9 @@ struct atmel_sfr {
        u32 l2cc_hramc; /* 0x58 */
 };
 
+/* Register Mapping*/
+#define AT91_SFR_UTMICKTRIM    0x30    /* UTMI Clock Trimming Register */
+
 /* Bit field in DDRCFG */
 #define ATMEL_SFR_DDRCFG_FDQIEN                0x00010000
 #define ATMEL_SFR_DDRCFG_FDQSIEN       0x00020000
@@ -56,6 +59,8 @@ struct atmel_sfr {
 #define AT91_SFR_EBICFG_SCH1_OFF               (0x0 << 12)
 #define AT91_SFR_EBICFG_SCH1_ON                        (0x1 << 12)
 
+#define AT91_UTMICKTRIM_FREQ           GENMASK(1, 0)
+
 /* Bit field in AICREDIR */
 #define ATMEL_SFR_AICREDIR_NSAIC       0x00000001
 
index 25c85411e5a1e3c7ce3ee9dc6def14d3b1358f9e..a4ec0aac619cb6d8a98a3750f7f332791d6b5a56 100644 (file)
 #ifndef __SAMA5D2_H
 #define __SAMA5D2_H
 
-/*
- * definitions to be used in other places
- */
-#define CONFIG_AT91FAMILY      /* It's a member of AT91 */
-
 /*
  * Peripheral identifiers/interrupts.
  */
 #define ARCH_EXID_SAMA5D28CU   0x00000010
 #define ARCH_EXID_SAMA5D28CN   0x00000020
 
-#define cpu_is_sama5d2()       (get_chip_id() == ARCH_ID_SAMA5D2)
+#define ARCH_ID_SAMA5D2_SIP            0x8a5c08c2
+#define ARCH_EXID_SAMA5D225C_D1M       0x00000053
+#define ARCH_EXID_SAMA5D27C_D5M                0x00000032
+#define ARCH_EXID_SAMA5D27C_D1G                0x00000033
+#define ARCH_EXID_SAMA5D28C_D1G                0x00000013
 
 /* PIT Timer(PIT_PIIR) */
 #define CONFIG_SYS_TIMER_COUNTER       0xf804803c
 #ifndef __ASSEMBLY__
 unsigned int get_chip_id(void);
 unsigned int get_extension_chip_id(void);
+int cpu_is_sama5d2(void);
 unsigned int has_lcdc(void);
 char *get_cpu_name(void);
 #endif
index d558f95141f062ac964582a7685c431fa641d8b6..0d32e3900f92ac6554f3b917de9e630edd19b57e 100644 (file)
 #ifndef SAMA5D3_H
 #define SAMA5D3_H
 
-/*
- * defines to be used in other places
- */
-#define CONFIG_AT91FAMILY      /* it's a member of AT91 */
-
 /*
  * Peripheral identifiers/interrupts.
  */
index 78cc2a7a0abde860a7d246976857ed85fb7236c9..7e2657faeb403be823de12e9b2d1c1235dd1e52d 100644 (file)
 #ifndef __SAMA5D4_H
 #define __SAMA5D4_H
 
-/*
- * defines to be used in other places
- */
-#define CONFIG_AT91FAMILY      /* It's a member of AT91 */
-
 /*
  * Peripheral identifiers/interrupts.
  */
index 57d72700d330e00e92f54ab074976ea7ad866511..08659c87d46a8a30b2a18d6ed33720ff5690e994 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <asm/hardware.h>
 #include <asm/io.h>
 #include <asm/arch/sama5_matrix.h>
 
index ddd70f5ff0ee33bb0631fc818bddeff44f819461..adb761e1ac5ca765f87e19de09b71cf0e148d198 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include <common.h>
+#include <asm/hardware.h>
 #include <asm/io.h>
 #include <linux/sizes.h>
 #include <asm/arch/at91_rstc.h>
index e113336b7bfca467ea7049e4c5e0682584ae469f..7e7e24bbe69d038d195d89616357dc02976d8a40 100644 (file)
@@ -37,7 +37,7 @@ u32 spl_boot_device(void)
        u32 off = (bootrom_stash.r4 >> ATMEL_SAMA5_BOOT_DEV_ID_OFF) &
                  ATMEL_SAMA5_BOOT_DEV_ID_MASK;
 
-#if defined(CONFIG_SYS_USE_MMC)
+#if defined(CONFIG_SYS_USE_MMC) || defined(CONFIG_SD_BOOT)
        if (dev == ATMEL_SAMA5_BOOT_FROM_MCI) {
 #if defined(CONFIG_SPL_OF_CONTROL)
                return BOOT_DEVICE_MMC1;
@@ -52,10 +52,14 @@ u32 spl_boot_device(void)
        }
 #endif
 
-#if defined(CONFIG_SYS_USE_SERIALFLASH) || defined(CONFIG_SYS_USE_SPIFLASH)
+#if defined(CONFIG_SYS_USE_SERIALFLASH) || \
+       defined(CONFIG_SYS_USE_SPIFLASH) || \
+       defined(CONFIG_SPI_BOOT)
        if (dev == ATMEL_SAMA5_BOOT_FROM_SPI)
                return BOOT_DEVICE_SPI;
 #endif
+       if (dev == ATMEL_SAMA5_BOOT_FROM_QSPI)
+               return BOOT_DEVICE_SPI;
 
        if (dev == ATMEL_SAMA5_BOOT_FROM_SMC)
                return BOOT_DEVICE_NAND;
@@ -71,11 +75,13 @@ u32 spl_boot_device(void)
 #else
 u32 spl_boot_device(void)
 {
-#ifdef CONFIG_SYS_USE_MMC
+#if defined(CONFIG_SYS_USE_MMC) || defined(CONFIG_SD_BOOT)
        return BOOT_DEVICE_MMC1;
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif defined(CONFIG_SYS_USE_NANDFLASH) || defined(CONFIG_NAND_BOOT)
        return BOOT_DEVICE_NAND;
-#elif CONFIG_SYS_USE_SERIALFLASH || CONFIG_SYS_USE_SPIFLASH
+#elif defined(CONFIG_SYS_USE_SERIALFLASH) || \
+       defined(CONFIG_SYS_USE_SPIFLASH) || \
+       defined(CONFIG_SPI_BOOT)
        return BOOT_DEVICE_SPI;
 #endif
        return BOOT_DEVICE_NONE;
@@ -85,7 +91,7 @@ u32 spl_boot_device(void)
 u32 spl_boot_mode(const u32 boot_device)
 {
        switch (boot_device) {
-#ifdef CONFIG_SYS_USE_MMC
+#if defined(CONFIG_SYS_USE_MMC) || defined(CONFIG_SD_BOOT)
        case BOOT_DEVICE_MMC1:
        case BOOT_DEVICE_MMC2:
                return MMCSD_MODE_FS;
index b75c2ccefdc2a029dec8fceb243b3fb81679fa0a..ce16ef3bdb71eb376e7db24847fbd876ea6eed29 100644 (file)
@@ -32,6 +32,20 @@ static void switch_to_main_crystal_osc(void)
        while (!(readl(&pmc->sr) & AT91_PMC_IXR_MOSCS))
                ;
 
+#if defined(CONFIG_SAMA5D2)
+       /* Enable a measurement of the external oscillator */
+       tmp = readl(&pmc->mcfr);
+       tmp |= AT91_PMC_MCFR_CCSS_XTAL_OSC;
+       tmp |= AT91_PMC_MCFR_RCMEAS;
+       writel(tmp, &pmc->mcfr);
+
+       while (!(readl(&pmc->mcfr) & AT91_PMC_MCFR_MAINRDY))
+               ;
+
+       if (!(readl(&pmc->mcfr) & AT91_PMC_MCFR_MAINF_MASK))
+               hang();
+#endif
+
        tmp = readl(&pmc->mor);
        tmp &= ~AT91_PMC_MOR_OSCBYPASS;
        tmp &= ~AT91_PMC_MOR_KEY(0xff);
@@ -47,11 +61,13 @@ static void switch_to_main_crystal_osc(void)
        while (!(readl(&pmc->sr) & AT91_PMC_IXR_MOSCSELS))
                ;
 
+#if !defined(CONFIG_SAMA5D2)
        /* Wait until MAINRDY field is set to make sure main clock is stable */
        while (!(readl(&pmc->mcfr) & AT91_PMC_MAINRDY))
                ;
+#endif
 
-#ifndef CONFIG_SAMA5D4
+#if !defined(CONFIG_SAMA5D4) && !defined(CONFIG_SAMA5D2)
        tmp = readl(&pmc->mor);
        tmp &= ~AT91_PMC_MOR_MOSCRCEN;
        tmp &= ~AT91_PMC_MOR_KEY(0xff);
index 7d67191de8ce60b92709fcb678067aafff0ff2f5..d4c593d25beafa542d4bbeb8733c8445dbecc1c2 100644 (file)
@@ -13,7 +13,6 @@ obj-$(CONFIG_SOC_DM355)       += dm355.o
 obj-$(CONFIG_SOC_DM365)        += dm365.o
 obj-$(CONFIG_SOC_DM644X)       += dm644x.o
 obj-$(CONFIG_SOC_DM646X)       += dm646x.o
-obj-$(CONFIG_SOC_DA830)        += da830_pinmux.o
 obj-$(CONFIG_SOC_DA850)        += da850_pinmux.o
 obj-$(CONFIG_DRIVER_TI_EMAC)   += lxt972.o dp83848.o et1011c.o ksz8873.o
 
diff --git a/arch/arm/mach-davinci/da830_pinmux.c b/arch/arm/mach-davinci/da830_pinmux.c
deleted file mode 100644 (file)
index 4182bb7..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Pinmux configurations for the DA830 SoCs
- *
- * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <common.h>
-#include <asm/arch/davinci_misc.h>
-#include <asm/arch/hardware.h>
-#include <asm/arch/pinmux_defs.h>
-
-/* SPI0 pin muxer settings */
-const struct pinmux_config spi0_pins_base[] = {
-       { pinmux(7), 1, 3 },  /* SPI0_SOMI */
-       { pinmux(7), 1, 4 },  /* SPI0_SIMO */
-       { pinmux(7), 1, 6 }   /* SPI0_CLK */
-};
-
-const struct pinmux_config spi0_pins_scs0[] = {
-       { pinmux(7), 1, 7 }   /* SPI0_SCS[0] */
-};
-
-const struct pinmux_config spi0_pins_ena[] = {
-       { pinmux(7), 1, 5 }   /* SPI0_ENA */
-};
-
-/* NAND pin muxer settings */
-const struct pinmux_config emifa_pins_cs0[] = {
-       { pinmux(18), 1, 2 }   /* EMA_CS[0] */
-};
-
-const struct pinmux_config emifa_pins_cs2[] = {
-       { pinmux(18), 1, 3 }   /* EMA_CS[2] */
-};
-
-const struct pinmux_config emifa_pins_cs3[] = {
-       { pinmux(18), 1, 4 }   /* EMA_CS[3] */
-};
-
-#ifdef CONFIG_USE_NAND
-const struct pinmux_config emifa_pins[] = {
-       { pinmux(13), 1, 6 },  /* EMA_D[0] */
-       { pinmux(13), 1, 7 },  /* EMA_D[1] */
-       { pinmux(14), 1, 0 },  /* EMA_D[2] */
-       { pinmux(14), 1, 1 },  /* EMA_D[3] */
-       { pinmux(14), 1, 2 },  /* EMA_D[4] */
-       { pinmux(14), 1, 3 },  /* EMA_D[5] */
-       { pinmux(14), 1, 4 },  /* EMA_D[6] */
-       { pinmux(14), 1, 5 },  /* EMA_D[7] */
-       { pinmux(14), 1, 6 },  /* EMA_D[8] */
-       { pinmux(14), 1, 7 },  /* EMA_D[9] */
-       { pinmux(15), 1, 0 },  /* EMA_D[10] */
-       { pinmux(15), 1, 1 },  /* EMA_D[11] */
-       { pinmux(15), 1, 2 },  /* EMA_D[12] */
-       { pinmux(15), 1, 3 },  /* EMA_D[13] */
-       { pinmux(15), 1, 4 },  /* EMA_D[14] */
-       { pinmux(15), 1, 5 },  /* EMA_D[15] */
-       { pinmux(15), 1, 6 },  /* EMA_A[0] */
-       { pinmux(15), 1, 7 },  /* EMA_A[1] */
-       { pinmux(16), 1, 0 },  /* EMA_A[2] */
-       { pinmux(16), 1, 1 },  /* EMA_A[3] */
-       { pinmux(16), 1, 2 },  /* EMA_A[4] */
-       { pinmux(16), 1, 3 },  /* EMA_A[5] */
-       { pinmux(16), 1, 4 },  /* EMA_A[6] */
-       { pinmux(16), 1, 5 },  /* EMA_A[7] */
-       { pinmux(16), 1, 6 },  /* EMA_A[8] */
-       { pinmux(16), 1, 7 },  /* EMA_A[9] */
-       { pinmux(17), 1, 0 },  /* EMA_A[10] */
-       { pinmux(17), 1, 1 },  /* EMA_A[11] */
-       { pinmux(17), 1, 2 },  /* EMA_A[12] */
-       { pinmux(17), 1, 3 },  /* EMA_BA[1] */
-       { pinmux(17), 1, 4 },  /* EMA_BA[0] */
-       { pinmux(17), 1, 5 },  /* EMA_CLK */
-       { pinmux(17), 1, 6 },  /* EMA_SDCKE */
-       { pinmux(17), 1, 7 },  /* EMA_CAS */
-       { pinmux(18), 1, 0 },  /* EMA_CAS */
-       { pinmux(18), 1, 1 },  /* EMA_WE */
-       { pinmux(18), 1, 5 },  /* EMA_OE */
-       { pinmux(18), 1, 6 },  /* EMA_WE_DQM[1] */
-       { pinmux(18), 1, 7 },  /* EMA_WE_DQM[0] */
-       { pinmux(10), 1, 0 }   /* Tristate */
-};
-#endif
-
-/* EMAC PHY interface pins */
-const struct pinmux_config emac_pins_rmii[] = {
-       { pinmux(10), 2, 1 },  /* RMII_TXD[0] */
-       { pinmux(10), 2, 2 },  /* RMII_TXD[1] */
-       { pinmux(10), 2, 3 },  /* RMII_TXEN */
-       { pinmux(10), 2, 4 },  /* RMII_CRS_DV */
-       { pinmux(10), 2, 5 },  /* RMII_RXD[0] */
-       { pinmux(10), 2, 6 },  /* RMII_RXD[1] */
-       { pinmux(10), 2, 7 }   /* RMII_RXER */
-};
-
-const struct pinmux_config emac_pins_mdio[] = {
-       { pinmux(11), 2, 0 },  /* MDIO_CLK */
-       { pinmux(11), 2, 1 }   /* MDIO_D */
-};
-
-const struct pinmux_config emac_pins_rmii_clk_source[] = {
-       { pinmux(9), 0, 5 }    /* ref.clk from external source */
-};
-
-/* UART2 pin muxer settings */
-const struct pinmux_config uart2_pins_txrx[] = {
-       { pinmux(8), 2, 7 },   /* UART2_RXD */
-       { pinmux(9), 2, 0 }    /* UART2_TXD */
-};
-
-/* I2C0 pin muxer settings */
-const struct pinmux_config i2c0_pins[] = {
-       { pinmux(8), 2, 3 },   /* I2C0_SDA */
-       { pinmux(8), 2, 4 }    /* I2C0_SCL */
-};
-
-/* USB0_DRVVBUS pin muxer settings */
-const struct pinmux_config usb_pins[] = {
-       { pinmux(9), 1, 1 }    /* USB0_DRVVBUS */
-};
-
-#ifdef CONFIG_MMC_DAVINCI
-/* MMC0 pin muxer settings */
-const struct pinmux_config mmc0_pins_8bit[] = {
-       { pinmux(15), 2, 7 },  /* MMCSD0_CLK */
-       { pinmux(16), 2, 0 },  /* MMCSD0_CMD */
-       { pinmux(13), 2, 6 },  /* MMCSD0_DAT_0 */
-       { pinmux(13), 2, 7 },  /* MMCSD0_DAT_1 */
-       { pinmux(14), 2, 0 },  /* MMCSD0_DAT_2 */
-       { pinmux(14), 2, 1 },  /* MMCSD0_DAT_3 */
-       { pinmux(14), 2, 2 },  /* MMCSD0_DAT_4 */
-       { pinmux(14), 2, 3 },  /* MMCSD0_DAT_5 */
-       { pinmux(14), 2, 4 },  /* MMCSD0_DAT_6 */
-       { pinmux(14), 2, 5 }   /* MMCSD0_DAT_7 */
-       /* DA830 supports 8-bit mode */
-};
-#endif
index 2cfde46a5532d29dda738fd8bfa4d0740142b34c..8150faa1a31304cd9f52b5b8110b048b925b48ef 100644 (file)
@@ -966,15 +966,15 @@ int set_clk_enet(enum enet_freq type)
        clock_enable(CCGR_ENET2, 0);
 
        switch (type) {
-       case ENET_125MHz:
+       case ENET_125MHZ:
                enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK;
                enet2_ref = ENET2_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_125M_CLK;
                break;
-       case ENET_50MHz:
+       case ENET_50MHZ:
                enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK;
                enet2_ref = ENET2_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_50M_CLK;
                break;
-       case ENET_25MHz:
+       case ENET_25MHZ:
                enet1_ref = ENET1_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK;
                enet2_ref = ENET2_REF_CLK_ROOT_FROM_PLL_ENET_MAIN_25M_CLK;
                break;
index 258578ac25b4fd6efee695c703f4d81bdb9bbff4..5944f99482607790aa6b40937fbbd9852af94b8c 100644 (file)
@@ -14,6 +14,7 @@
 #include <asm/spl.h>
 #include <spl.h>
 #include <asm/mach-imx/hab.h>
+#include <g_dnl.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -31,6 +32,18 @@ u32 spl_boot_device(void)
        if (((bmode >> 24) & 0x03) == 0x01) /* Serial Downloader */
                return BOOT_DEVICE_BOARD;
 
+       /*
+        * The above method does not detect that the boot ROM used
+        * serial downloader in case the boot ROM decided to use the
+        * serial downloader as a fall back (primary boot source failed).
+        *
+        * Infer that the boot ROM used the USB serial downloader by
+        * checking whether the USB PHY is currently active... This
+        * assumes that SPL did not (yet) initialize the USB PHY...
+        */
+       if (is_usbotg_phy_active())
+               return BOOT_DEVICE_BOARD;
+
        /* BOOT_CFG1[7:4] - see IMX6DQRM Table 8-8 */
        switch ((reg & IMX6_BMODE_MASK) >> IMX6_BMODE_SHIFT) {
         /* EIM: See 8.5.1, Table 8-9 */
@@ -82,6 +95,15 @@ u32 spl_boot_device(void)
        }
        return BOOT_DEVICE_NONE;
 }
+
+#ifdef CONFIG_SPL_USB_GADGET_SUPPORT
+int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
+{
+       put_unaligned(CONFIG_G_DNL_PRODUCT_NUM + 0xfff, &dev->idProduct);
+
+       return 0;
+}
+#endif
 #endif
 
 #if defined(CONFIG_SPL_MMC_SUPPORT)
index b90cadef8f10c90dfbd813285153ccb54f64b205..11f5f058b9e0c4772da7fd90c06570d16ba070f5 100644 (file)
@@ -111,6 +111,7 @@ config TARGET_OMAP3_LOGIC
        select DM
        select DM_SERIAL
        select DM_GPIO
+       select OMAP3_GPIO_3
        select OMAP3_GPIO_4
        select OMAP3_GPIO_6
 
@@ -149,6 +150,21 @@ config TARGET_SNIPER
 
 endchoice
 
+choice
+       prompt "Memory Controller"
+       default SDRC
+
+config SDRC
+       bool "SDRC controller"
+       help
+         The default memory controller on most OMAP3 boards is SDRC.
+
+config EMIF4
+       bool "EMIF4 controller"
+       help
+         Enable this on boards like AM3517 which use EMIF4 controller
+endchoice
+
 config SPL_OMAP3_ID_NAND
        bool "Support OMAP3-specific ID and MFR function"
        help
index 30a9ff9c7b7e0eb966958f516a0beb6673693e9e..8f58235baf9d4f9997adcd281e932c57f304f13c 100644 (file)
@@ -26,6 +26,10 @@ config TARGET_DRA7XX_EVM
        select TI_I2C_BOARD_DETECT
        select PHYS_64BIT
        imply SCSI
+       imply DM_PMIC
+       imply PMIC_LP87565
+       imply DM_REGULATOR
+       imply DM_REGULATOR_LP87565
 
 config TARGET_AM57XX_EVM
        bool "AM57XX"
index 4ad6b530d29cb7b5ba4073dd9495e7fe8450a401..3bdb114bb6bcd2afd8dcf371d0d5ac30554ef433 100644 (file)
@@ -113,6 +113,16 @@ static const struct dpll_params per_dpll_params_768mhz_dra7xx[NUM_SYS_CLKS] = {
        {10, 0, 4, 1, 3, 4, 4, 2, -1, -1, -1, -1},              /* 38.4 MHz */
 };
 
+static const struct dpll_params per_dpll_params_768mhz_dra76x[NUM_SYS_CLKS] = {
+       {32, 0, 4, 1, 3, 4, 8, 2, -1, -1, -1, -1},              /* 12 MHz   */
+       {96, 4, 4, 1, 3, 4, 8, 2, -1, -1, -1, -1},              /* 20 MHz   */
+       {160, 6, 4, 1, 3, 4, 8, 2, -1, -1, -1, -1},             /* 16.8 MHz */
+       {20, 0, 4, 1, 3, 4, 8, 2, -1, -1, -1, -1},              /* 19.2 MHz */
+       {192, 12, 4, 1, 3, 4, 8, 2, -1, -1, -1, -1},            /* 26 MHz   */
+       {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 27 MHz   */
+       {10, 0, 4, 1, 3, 4, 8, 2, -1, -1, -1, -1},              /* 38.4 MHz */
+};
+
 static const struct dpll_params iva_dpll_params_2330mhz[NUM_SYS_CLKS] = {
        {1165, 11, -1, -1, 5, 6, -1, -1, -1, -1, -1, -1},       /* 12 MHz   */
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},       /* 13 MHz   */
@@ -234,6 +244,17 @@ struct dplls omap5_dplls_es2 = {
        .ddr = NULL
 };
 
+struct dplls dra76x_dplls = {
+       .mpu = mpu_dpll_params_1ghz,
+       .core = core_dpll_params_2128mhz_dra7xx,
+       .per = per_dpll_params_768mhz_dra76x,
+       .abe = abe_dpll_params_sysclk2_361267khz,
+       .iva = iva_dpll_params_2330mhz_dra7xx,
+       .usb = usb_dpll_params_1920mhz,
+       .ddr =  ddr_dpll_params_2664mhz,
+       .gmac = gmac_dpll_params_2000mhz,
+};
+
 struct dplls dra7xx_dplls = {
        .mpu = mpu_dpll_params_1ghz,
        .core = core_dpll_params_2128mhz_dra7xx,
@@ -285,6 +306,22 @@ struct pmic_data tps659038 = {
        .gpio_en = 0,
 };
 
+/* The LP87565*/
+struct pmic_data lp87565 = {
+       .base_offset = LP873X_BUCK_BASE_VOLT_UV,
+       .step = 5000, /* 5 mV represented in uV */
+       /*
+        * Offset codes 0 - 0x13 Invalid.
+        * Offset codes 0x14 0x17 give 10mV steps
+        * Offset codes 0x17 through 0x9D give 5mV steps
+        * So let us start with our operating range from .73V
+        */
+       .start_code = 0x17,
+       .i2c_slave_addr = 0x60,
+       .pmic_bus_init  = gpi2c_init,
+       .pmic_write     = palmas_i2c_write_u8,
+};
+
 /* The LP8732 and LP8733 are software-compatible, use common struct */
 struct pmic_data lp8733 = {
        .base_offset = LP873X_BUCK_BASE_VOLT_UV,
@@ -709,6 +746,12 @@ void __weak hw_data_init(void)
        *ctrl = &omap5_ctrl;
        break;
 
+       case DRA762_ES1_0:
+       *prcm = &dra7xx_prcm;
+       *dplls_data = &dra76x_dplls;
+       *ctrl = &dra7xx_ctrl;
+       break;
+
        case DRA752_ES1_0:
        case DRA752_ES1_1:
        case DRA752_ES2_0:
@@ -719,6 +762,7 @@ void __weak hw_data_init(void)
 
        case DRA722_ES1_0:
        case DRA722_ES2_0:
+       case DRA722_ES2_1:
        *prcm = &dra7xx_prcm;
        *dplls_data = &dra72x_dplls;
        *ctrl = &dra7xx_ctrl;
@@ -747,12 +791,14 @@ void get_ioregs(const struct ctrl_ioregs **regs)
        case DRA752_ES1_0:
        case DRA752_ES1_1:
        case DRA752_ES2_0:
+       case DRA762_ES1_0:
                *regs = &ioregs_dra7xx_es1;
                break;
        case DRA722_ES1_0:
                *regs = &ioregs_dra72x_es1;
                break;
        case DRA722_ES2_0:
+       case DRA722_ES2_1:
                *regs = &ioregs_dra72x_es2;
                break;
 
index afe59e0b58260180191dd91d036fc17f6fd30098..14a35dd284692eb50877d8f107354003e2434c0c 100644 (file)
@@ -362,6 +362,9 @@ void init_omap_revision(void)
        case OMAP5432_CONTROL_ID_CODE_ES2_0:
                *omap_si_rev = OMAP5432_ES2_0;
                break;
+       case DRA762_CONTROL_ID_CODE_ES1_0:
+               *omap_si_rev = DRA762_ES1_0;
+               break;
        case DRA752_CONTROL_ID_CODE_ES1_0:
                *omap_si_rev = DRA752_ES1_0;
                break;
@@ -377,6 +380,9 @@ void init_omap_revision(void)
        case DRA722_CONTROL_ID_CODE_ES2_0:
                *omap_si_rev = DRA722_ES2_0;
                break;
+       case DRA722_CONTROL_ID_CODE_ES2_1:
+               *omap_si_rev = DRA722_ES2_1;
+               break;
        default:
                *omap_si_rev = OMAP5430_SILICON_ID_INVALID;
        }
@@ -455,10 +461,14 @@ void v7_arch_cp15_set_acr(u32 acr, u32 cpu_midr, u32 cpu_rev_comb,
 }
 
 #if defined(CONFIG_PALMAS_POWER)
+__weak void board_mmc_poweron_ldo(uint voltage)
+{
+       palmas_mmc1_poweron_ldo(LDO1_VOLTAGE, LDO1_CTRL, voltage);
+}
+
 void vmmc_pbias_config(uint voltage)
 {
        u32 value = 0;
-       struct vcores_data const *vcores = *omap_vcores;
 
        value = readl((*ctrl)->control_pbias);
        value &= ~SDCARD_PWRDNZ;
@@ -467,15 +477,7 @@ void vmmc_pbias_config(uint voltage)
        value &= ~SDCARD_BIAS_PWRDNZ;
        writel(value, (*ctrl)->control_pbias);
 
-       if (vcores->core.pmic->i2c_slave_addr == 0x60) {
-               if (voltage == LDO_VOLT_3V0)
-                       voltage = 0x19;
-               else if (voltage == LDO_VOLT_1V8)
-                       voltage = 0xa;
-               lp873x_mmc1_poweron_ldo(voltage);
-       } else {
-               palmas_mmc1_poweron_ldo(voltage);
-       }
+       board_mmc_poweron_ldo(voltage);
 
        value = readl((*ctrl)->control_pbias);
        value |= SDCARD_BIAS_PWRDNZ;
index 7712923d8572072a11566f44067fd2374531010c..8fb962e39dcb020a17935063a0aada77bdcf6d78 100644 (file)
@@ -480,7 +480,9 @@ void __weak emif_get_ext_phy_ctrl_const_regs(u32 emif_nr,
                *regs = dra_ddr3_ext_phy_ctrl_const_base_666MHz;
                *size = ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_666MHz);
                break;
+       case DRA762_ES1_0:
        case DRA722_ES2_0:
+       case DRA722_ES2_1:
                *regs = dra_ddr3_ext_phy_ctrl_const_base_666MHz_es2;
                *size = ARRAY_SIZE(dra_ddr3_ext_phy_ctrl_const_base_666MHz_es2);
                break;
@@ -709,11 +711,13 @@ const struct read_write_regs *get_bug_regs(u32 *iterations)
                *iterations = sizeof(omap5_bug_00339_regs)/
                             sizeof(omap5_bug_00339_regs[0]);
                break;
+       case DRA762_ES1_0:
        case DRA752_ES1_0:
        case DRA752_ES1_1:
        case DRA752_ES2_0:
        case DRA722_ES1_0:
        case DRA722_ES2_0:
+       case DRA722_ES2_1:
                bug_00339_regs_ptr = dra_bug_00339_regs;
                *iterations = sizeof(dra_bug_00339_regs)/
                             sizeof(dra_bug_00339_regs[0]);
index 2d54a3165ef3a278b86002e3d1d266c84cfffa97..52e1785b4aaa73eae184f59c2d6b67f655d61cba 100644 (file)
@@ -305,12 +305,8 @@ int secure_tee_install(u32 addr)
 
        if ((hdr->magic != OPTEE_MAGIC) ||
            (hdr->version != OPTEE_VERSION) ||
-           (hdr->init_load_addr_hi != 0) ||
-           (hdr->init_load_addr_lo < (sec_mem_start + sizeof(struct optee_header))) ||
-           (tee_file_size > size) ||
-           ((hdr->init_load_addr_lo + tee_file_size - 1) >
-            (sec_mem_start + size - 1))) {
-               printf("Error in TEE header. Check load address and sizes\n");
+           (tee_file_size > size)) {
+               printf("Error in TEE header. Check firewall and TEE sizes\n");
                unmap_sysmem(hdr);
                return CMD_RET_FAILURE;
        }
index c0ac2e9b56fc499245899fbc99c2f2e920881caa..dcd8cf805fe51aa2a1d2fa25aefdb6a3e37a758b 100644 (file)
@@ -7,6 +7,7 @@
 #include <clk.h>
 #include <dm.h>
 #include <ram.h>
+#include <syscon.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/periph.h>
@@ -67,6 +68,14 @@ int board_init(void)
                     CON_IOMUX_UART2SEL_MASK,
                     CON_IOMUX_UART2SEL_21 << CON_IOMUX_UART2SEL_SHIFT);
 
+       /*
+       * The integrated macphy is enabled by default, disable it
+       * for saving power consuming.
+       */
+       rk_clrsetreg(&grf->macphy_con[0],
+                    MACPHY_CFG_ENABLE_MASK,
+                    0 << MACPHY_CFG_ENABLE_SHIFT);
+
        return 0;
 }
 
@@ -136,3 +145,17 @@ int board_usb_cleanup(int index, enum usb_init_type init)
        return 0;
 }
 #endif
+
+#if defined(CONFIG_USB_FUNCTION_FASTBOOT)
+int fb_set_reboot_flag(void)
+{
+       struct rk322x_grf *grf;
+
+       printf("Setting reboot to fastboot flag ...\n");
+       grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+       /* Set boot mode to fastboot */
+       writel(BOOT_FASTBOOT, &grf->os_reg[0]);
+
+       return 0;
+}
+#endif
index 53cc9a0dcd21fc126f32f98ca3f01aef500ac4ff..4ad294006949672243638dca6227d43f8b524b3b 100644 (file)
@@ -84,6 +84,15 @@ config TARGET_POPMETAL_RK3288
          2GB DDR3. Expansion connectors provide access to I2C, SPI, UART,
          GPIOs and display interface.
 
+config TARGET_VYASA_RK3288
+       bool "Vyasa-RK3288"
+       select BOARD_LATE_INIT
+       help
+         Vyasa is a RK3288-based development board with 2 USB ports,
+         HDMI, VGA, micro-SD card, audio, WiFi  and Gigabit Ethernet, It
+         also includes on-board eMMC and 2GB of SDRAM. Expansion connectors
+         provide access to display pins, I2C, SPI, UART and GPIOs.
+
 config TARGET_ROCK2
        bool "Radxa Rock 2"
        select BOARD_LATE_INIT
@@ -129,6 +138,8 @@ config SPL_LIBGENERIC_SUPPORT
 config SPL_SERIAL_SUPPORT
        default y
 
+source "board/amarula/vyasa-rk3288/Kconfig"
+
 source "board/chipspark/popmetal_rk3288/Kconfig"
 
 source "board/firefly/firefly-rk3288/Kconfig"
index d6bf74f7ad7a35095231cf3c99d85c8efdef359a..34061564478d165742f3f1abc719f017e77e7014 100644 (file)
@@ -5,19 +5,17 @@
  */
 
 #include <common.h>
-#include <debug_uart.h>
-#include <dm.h>
-#include <ram.h>
-#include <spl.h>
-#include <asm/gpio.h>
-#include <asm/io.h>
 #include <asm/arch/clock.h>
+#include <asm/arch/grf_rk3399.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/periph.h>
-#include <asm/arch/sdram.h>
-#include <asm/arch/timer.h>
+#include <asm/io.h>
+#include <debug_uart.h>
+#include <dm.h>
 #include <dm/pinctrl.h>
-#include <power/regulator.h>
+#include <ram.h>
+#include <spl.h>
+#include <syscon.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -53,7 +51,6 @@ void secure_timer_init(void)
 
 void board_debug_uart_init(void)
 {
-#include <asm/arch/grf_rk3399.h>
 #define GRF_BASE       0xff770000
        struct rk3399_grf_regs * const grf = (void *)GRF_BASE;
 
@@ -80,13 +77,12 @@ void board_debug_uart_init(void)
 #endif
 }
 
-#define GRF_EMMCCORE_CON11 0xff77f02c
-#define SGRF_DDR_RGN_CON16 0xff330040
-#define SGRF_SLV_SECURE_CON4 0xff33e3d0
 void board_init_f(ulong dummy)
 {
        struct udevice *pinctrl;
        struct udevice *dev;
+       struct rk3399_pmusgrf_regs *sgrf;
+       struct rk3399_grf_regs *grf;
        int ret;
 
 #define EARLY_UART
@@ -103,9 +99,6 @@ void board_init_f(ulong dummy)
        printascii("U-Boot SPL board init");
 #endif
 
-       /*  Emmc clock generator: disable the clock multipilier */
-       rk_clrreg(GRF_EMMCCORE_CON11, 0x0ff);
-
        ret = spl_early_init();
        if (ret) {
                debug("spl_early_init() failed: %d\n", ret);
@@ -121,8 +114,13 @@ void board_init_f(ulong dummy)
         * driver, which tries to DMA from/to the stack (likely)
         * located in this range.
         */
-       rk_clrsetreg(SGRF_DDR_RGN_CON16, 0x1FF, 0);
-       rk_clrreg(SGRF_SLV_SECURE_CON4, 0x2000);
+       sgrf = syscon_get_first_range(ROCKCHIP_SYSCON_PMUSGRF);
+       rk_clrsetreg(&sgrf->ddr_rgn_con[16], 0x1ff, 0);
+       rk_clrreg(&sgrf->slv_secure_con4, 0x2000);
+
+       /*  eMMC clock generator: disable the clock multipilier */
+       grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
+       rk_clrreg(&grf->emmccore_con[11], 0x0ff);
 
        secure_timer_init();
 
index 63342ab5c98ab9e8f059e7862c5b9b45f9778be7..5ed4b03837d63f4b8482d914cfe786e1260b34ea 100644 (file)
@@ -1115,7 +1115,7 @@ static int conv_of_platdata(struct udevice *dev)
        int ret;
 
        ret = regmap_init_mem_platdata(dev, dtplat->reg,
-                       ARRAY_SIZE(dtplat->reg) / 4,
+                       ARRAY_SIZE(dtplat->reg) / 2,
                        &plat->map);
        if (ret)
                return ret;
index 37b5b8fb5b9920b3758259729cc52d912b44989f..abc18c03a5ebb65e7f1fedf028d9c0f58fb5a994 100644 (file)
@@ -224,9 +224,7 @@ tegra_xusb_padctl_config_parse_dt(struct tegra_xusb_padctl *padctl,
 
        config->name = ofnode_get_name(node);
 
-       for (subnode = ofnode_first_subnode(node);
-            ofnode_valid(subnode);
-            subnode = ofnode_next_subnode(subnode)) {
+       ofnode_for_each_subnode(subnode, node) {
                struct tegra_xusb_padctl_group *group;
                int err;
 
@@ -256,9 +254,7 @@ static int tegra_xusb_padctl_parse_dt(struct tegra_xusb_padctl *padctl,
                return err;
        }
 
-       for (subnode = ofnode_first_subnode(node);
-            ofnode_valid(subnode);
-            subnode = ofnode_next_subnode(subnode)) {
+       ofnode_for_each_subnode(subnode, node) {
                struct tegra_xusb_padctl_config *config = &padctl->config;
 
                debug("%s: subnode=%s\n", __func__, ofnode_get_name(subnode));
index ee2211241235210573341bf3366d5093d6501f1d..c8b5ab4d3284e3b06a77833d14dcf246f23649f8 100644 (file)
@@ -12,18 +12,14 @@ config ARCH_UNIPHIER_32BIT
 
 choice
         prompt "UniPhier SoC select"
-        default ARCH_UNIPHIER_PRO4
+        default ARCH_UNIPHIER_V8_MULTI
 
 config ARCH_UNIPHIER_LD4_SLD8
        bool "UniPhier LD4/sLD8 SoCs"
        select ARCH_UNIPHIER_32BIT
 
-config ARCH_UNIPHIER_PRO4
-       bool "UniPhier Pro4 SoC"
-       select ARCH_UNIPHIER_32BIT
-
-config ARCH_UNIPHIER_PRO5_PXS2_LD6B
-       bool "UniPhier Pro5/PXs2/LD6b SoCs"
+config ARCH_UNIPHIER_V7_MULTI
+       bool "UniPhier Pro4/Pro5/PXs2/LD6b SoCs"
        select ARCH_UNIPHIER_32BIT
 
 config ARCH_UNIPHIER_V8_MULTI
@@ -44,19 +40,24 @@ config ARCH_UNIPHIER_SLD8
        depends on ARCH_UNIPHIER_LD4_SLD8
        default y
 
+config ARCH_UNIPHIER_PRO4
+       bool "Enable UniPhier Pro4 SoC support"
+       depends on ARCH_UNIPHIER_V7_MULTI
+       default y
+
 config ARCH_UNIPHIER_PRO5
        bool "Enable UniPhier Pro5 SoC support"
-       depends on ARCH_UNIPHIER_PRO5_PXS2_LD6B
+       depends on ARCH_UNIPHIER_V7_MULTI
        default y
 
 config ARCH_UNIPHIER_PXS2
        bool "Enable UniPhier Pxs2 SoC support"
-       depends on ARCH_UNIPHIER_PRO5_PXS2_LD6B
+       depends on ARCH_UNIPHIER_V7_MULTI
        default y
 
 config ARCH_UNIPHIER_LD6B
        bool "Enable UniPhier LD6b SoC support"
-       depends on ARCH_UNIPHIER_PRO5_PXS2_LD6B
+       depends on ARCH_UNIPHIER_V7_MULTI
        default y
 
 config ARCH_UNIPHIER_LD11
index 0266e7e66b79d849d29d1fdca11d59a004795e3f..a4b7419e5404f21cd8541874e4707a981c3b1978 100644 (file)
@@ -40,7 +40,7 @@ void uniphier_ld11_clk_init(void)
                int ch;
 
                tmp = readl(SC_CLKCTRL4);
-               tmp |= SC_CLKCTRL4_MIO | SC_CLKCTRL4_STDMAC;
+               tmp |= BIT(10) | BIT(8);        /* MIO, STDMAC */
                writel(tmp, SC_CLKCTRL4);
 
                for (ch = 0; ch < 3; ch++) {
index 5bb560cafe1d2bf4101b706ea09a6ccd7966dfe1..f79fb38535cdffde48967ad50292da063fd13708 100644 (file)
@@ -4,14 +4,26 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#include <linux/bitops.h>
 #include <linux/io.h>
 
 #include "../init.h"
+#include "../sc64-regs.h"
 
 #define SDCTRL_EMMC_HW_RESET   0x59810280
 
 void uniphier_ld20_clk_init(void)
 {
+       u32 tmp;
+
+       tmp = readl(SC_RSTCTRL6);
+       tmp |= BIT(8);                  /* Mali */
+       writel(tmp, SC_RSTCTRL6);
+
+       tmp = readl(SC_CLKCTRL6);
+       tmp |= BIT(8);                  /* Mali */
+       writel(tmp, SC_CLKCTRL6);
+
        /* TODO: use "mmc-pwrseq-emmc" */
        writel(1, SDCTRL_EMMC_HW_RESET);
 }
index 2dee857a18c8d17cd201c7b04f9eeda8bb1620b0..3b9cc626f1414fe5c8e8fbdf6be11db497f1bb2b 100644 (file)
@@ -4,14 +4,26 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#include <linux/bitops.h>
 #include <linux/io.h>
 
 #include "../init.h"
+#include "../sc64-regs.h"
 
 #define SDCTRL_EMMC_HW_RESET   0x59810280
 
 void uniphier_pxs3_clk_init(void)
 {
+       u32 tmp;
+
+       tmp = readl(SC_RSTCTRL6);
+       tmp |= BIT(8);                  /* Mali */
+       writel(tmp, SC_RSTCTRL6);
+
+       tmp = readl(SC_CLKCTRL6);
+       tmp |= BIT(8);                  /* Mali */
+       writel(tmp, SC_CLKCTRL6);
+
        /* TODO: use "mmc-pwrseq-emmc" */
        writel(1, SDCTRL_EMMC_HW_RESET);
 }
index d0a51f239c3808c2beede8c86631089d3b5bed59..80efb4e4e37f48f27adb00fa3f0139f44eb8c5d6 100644 (file)
 #define SC_RSTCTRL             (SC_BASE_ADDR | 0x2000)
 #define SC_RSTCTRL3            (SC_BASE_ADDR | 0x2008)
 #define SC_RSTCTRL4            (SC_BASE_ADDR | 0x200c)
-#define   SC_RSTCTRL4_ETHER            (1 << 6)
-#define   SC_RSTCTRL4_NAND             (1 << 0)
 #define SC_RSTCTRL5            (SC_BASE_ADDR | 0x2010)
 #define SC_RSTCTRL6            (SC_BASE_ADDR | 0x2014)
 #define SC_RSTCTRL7            (SC_BASE_ADDR | 0x2018)
-#define   SC_RSTCTRL7_UMCSB            (1 << 16)
-#define   SC_RSTCTRL7_UMCA2            (1 << 10)
-#define   SC_RSTCTRL7_UMCA1            (1 << 9)
-#define   SC_RSTCTRL7_UMCA0            (1 << 8)
-#define   SC_RSTCTRL7_UMC32            (1 << 2)
-#define   SC_RSTCTRL7_UMC31            (1 << 1)
-#define   SC_RSTCTRL7_UMC30            (1 << 0)
 
 #define SC_CLKCTRL             (SC_BASE_ADDR | 0x2100)
 #define SC_CLKCTRL3            (SC_BASE_ADDR | 0x2108)
 #define SC_CLKCTRL4            (SC_BASE_ADDR | 0x210c)
-#define   SC_CLKCTRL4_MIO              (1 << 10)
-#define   SC_CLKCTRL4_STDMAC           (1 << 8)
-#define   SC_CLKCTRL4_PERI             (1 << 7)
-#define   SC_CLKCTRL4_ETHER            (1 << 6)
-#define   SC_CLKCTRL4_NAND             (1 << 0)
 #define SC_CLKCTRL5            (SC_BASE_ADDR | 0x2110)
 #define SC_CLKCTRL6            (SC_BASE_ADDR | 0x2114)
 #define SC_CLKCTRL7            (SC_BASE_ADDR | 0x2118)
-#define   SC_CLKCTRL7_UMCSB            (1 << 16)
-#define   SC_CLKCTRL7_UMC32            (1 << 2)
-#define   SC_CLKCTRL7_UMC31            (1 << 1)
-#define   SC_CLKCTRL7_UMC30            (1 << 0)
 
 #define SC_CA72_GEARST         (SC_BASE_ADDR | 0x8000)
 #define SC_CA72_GEARSET                (SC_BASE_ADDR | 0x8004)
index f9f999902c22b4067b5153199f7ce7b1c078e7a0..0d98d03fc33d18df025fb7b2ff8861cf6d79b06a 100644 (file)
@@ -119,19 +119,46 @@ set_ivb:
        /* set IVIC, vector size: 4 bytes, base: 0x0 */
        mtsr    $r0, $ivb
 /*
- * MMU_CTL NTC0 Cacheable/Write-Back
+ * MMU_CTL NTC0 Non-cacheable
  */
+       li      $r0, ~0x6
+       mfsr    $r1, $mr0
+       and     $r1, $r1, $r0
+       mtsr    $r1, $mr0
+
        li      $r0, ~0x3
        mfsr    $r1, $mr8
        and     $r1, $r1, $r0
        mtsr    $r1, $mr8
 #if (!defined(CONFIG_SYS_ICACHE_OFF) || !defined(CONFIG_SYS_DCACHE_OFF))
+/*
+ * MMU_CTL NTC0 Cacheable/Write-Back
+ */
        li      $r0, 0x4
        mfsr    $r1, $mr0
        or      $r1, $r1, $r0
        mtsr    $r1, $mr0
 #endif
 
+#ifndef CONFIG_SYS_DCACHE_OFF
+#ifdef CONFIG_ARCH_MAP_SYSMEM
+/*
+ * MMU_CTL NTC1 Non-cacheable
+ */
+       li      $r0, ~0x18
+       mfsr    $r1, $mr0
+       and     $r1, $r1, $r0
+       mtsr    $r1, $mr0
+/*
+ * MMU_CTL NTM1 mapping for partition 0
+ */
+       li      $r0, ~0x6000
+       mfsr    $r1, $mr0
+       and     $r1, $r1, $r0
+       mtsr    $r1, $mr0
+#endif
+#endif
+
 #if !defined(CONFIG_SYS_ICACHE_OFF)
        li      $r0, 0x1
        mfsr    $r1, $mr8
index 4221e4bf9ac01b660af1406a9b69bda82a99a079..fbe6d7443710ff1f9842857eae8995bd2e50813a 100644 (file)
@@ -8,6 +8,7 @@
        aliases {
                uart0 = &serial0;
                ethernet0 = &mac0;
+               spi0 = &spi;
        } ;
 
        chosen {
                reg = <0x00000000 0x40000000>;
        };
 
+       spiclk: virt_100mhz {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <100000000>;
+       };
+
        cpus {
                #address-cells = <1>;
                #size-cells = <0>;
                device-width = <1>;
        };
 
+       spi: spi@f0b00000 {
+               compatible = "andestech,atcspi200";
+               reg = <0xf0b00000 0x1000>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               num-cs = <1>;
+               clocks = <&spiclk>;
+               interrupts = <3 4>;
+                       flash@0 {
+                       compatible = "spi-flash";
+                       spi-max-frequency = <50000000>;
+                       reg = <0>;
+                       spi-cpol;
+                       spi-cpha;
+               };
+       };
 };
index 6b10c078dfd2754ff59a913b561b5be5d8ffa605..2e2fe01f0e630374e4cfa4f20ccad544a876567c 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef NDS32_BOOTM_H
 #define NDS32_BOOTM_H
 
+#include <asm/setup.h>
+
 extern void udc_disconnect(void);
 
 #if defined(CONFIG_SETUP_MEMORY_TAGS) || \
index 25e5a1b6ec8a253803dd42bed8abd0bc6b3570e2..a627306ed852306fa0ffad8d9ff1c2f5001489ac 100644 (file)
@@ -7,11 +7,7 @@
 #ifndef __ASM_NDS_DMA_MAPPING_H
 #define __ASM_NDS_DMA_MAPPING_H
 
-enum dma_data_direction {
-       DMA_BIDIRECTIONAL       = 0,
-       DMA_TO_DEVICE           = 1,
-       DMA_FROM_DEVICE         = 2,
-};
+#include <linux/dma-direction.h>
 
 static void *dma_alloc_coherent(size_t len, unsigned long *handle)
 {
index b2c4d0ef8cf342e18f523920987e5f11917fb08e..e8ee9615264cf89c00e5e2f24680706d2c217495 100644 (file)
@@ -48,6 +48,27 @@ static inline void sync(void)
 #define MAP_WRBACK     (0)
 #define MAP_WRTHROUGH  (0)
 
+#ifdef CONFIG_ARCH_MAP_SYSMEM
+static inline void *map_sysmem(phys_addr_t paddr, unsigned long len)
+{
+       if(paddr <PHYS_SDRAM_0_SIZE + PHYS_SDRAM_1_SIZE)
+       paddr = paddr | 0x40000000;
+       return (void *)(uintptr_t)paddr;
+}
+
+static inline void *unmap_sysmem(const void *vaddr)
+{
+       phys_addr_t paddr = (phys_addr_t)vaddr;
+       paddr = paddr & ~0x40000000;
+       return (void *)(uintptr_t)paddr;
+}
+
+static inline phys_addr_t map_to_sysmem(const void *ptr)
+{
+       return (phys_addr_t)(uintptr_t)ptr;
+}
+#endif
+
 static inline void *
 map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
 {
index e834329e0b68db16f3f9ae726d5a0816162b5c5b..42b15dfcbfc0edf09652bc01b23fa0a86647d5b7 100644 (file)
@@ -12,7 +12,6 @@
 #include <u-boot/zlib.h>
 #include <asm/byteorder.h>
 #include <asm/bootm.h>
-#include <asm/setup.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
index f7a6e1aef809585095af26644b197ee104faaff2..87418e398687cd652bf9b1a60b7967e7488c28c1 100644 (file)
@@ -18,4 +18,26 @@ config SYS_CONFIG_NAME
        default "sandbox_spl" if SANDBOX_SPL
        default "sandbox" if !SANDBOX_SPL
 
+choice
+       prompt "Run sandbox on 32/64-bit host"
+       default SANDBOX_64BIT
+       help
+         Sandbox can be built on 32-bit and 64-bit hosts.
+         The default is to build on a 64-bit host and run
+         on a 64-bit host. If you want to run sandbox on
+         a 32-bit host, change it here.
+
+config SANDBOX_32BIT
+       bool "32-bit host"
+
+config SANDBOX_64BIT
+       bool "64-bit host"
+
+endchoice
+
+config SANDBOX_BITS_PER_LONG
+       int
+       default 32 if SANDBOX_32BIT
+       default 64 if SANDBOX_64BIT
+
 endmenu
index 65b2f8ecdac037c136cc7f3c70ffe5473f76842e..e67d428eb2f725a70d72c41259f57188dd8efd0c 100644 (file)
                compatible = "denx,u-boot-fdt-test";
        };
 
-       clk_fixed: clk-fixed {
-               compatible = "fixed-clock";
-               #clock-cells = <0>;
-               clock-frequency = <1234>;
+       clocks {
+               clk_fixed: clk-fixed {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <1234>;
+               };
        };
 
        clk_sandbox: clk-sbox {
index 277c3babf37495623730d8a03e64ca0635a4172c..38a618753a2a931e2599481867d6cf5e4b408e52 100644 (file)
@@ -108,6 +108,7 @@ source "board/intel/Kconfig"
 
 # platform-specific options below
 source "arch/x86/cpu/baytrail/Kconfig"
+source "arch/x86/cpu/braswell/Kconfig"
 source "arch/x86/cpu/broadwell/Kconfig"
 source "arch/x86/cpu/coreboot/Kconfig"
 source "arch/x86/cpu/ivybridge/Kconfig"
@@ -558,6 +559,48 @@ config VGA_BIOS_ADDR
          address of 0xfff90000 indicates that the image will be put at offset
          0x90000 from the beginning of a 1MB flash device.
 
+config HAVE_VBT
+       bool "Add a Video BIOS Table (VBT) image"
+       depends on HAVE_FSP
+       help
+         Select this option if you have a Video BIOS Table (VBT) image that
+         you would like to add to your ROM. This is normally required if you
+         are using an Intel FSP firmware that is complaint with spec 1.1 or
+         later to initialize the integrated graphics device (IGD).
+
+         Video BIOS Table, or VBT, provides platform and board specific
+         configuration information to the driver that is not discoverable
+         or available through other means. By other means the most used
+         method here is to read EDID table from the attached monitor, over
+         Display Data Channel (DDC) using two pin I2C serial interface. VBT
+         configuration is related to display hardware and is available via
+         the ACPI OpRegion or, on older systems, in the PCI ROM (Option ROM).
+
+config VBT_FILE
+       string "Video BIOS Table (VBT) image filename"
+       depends on HAVE_VBT
+       default "vbt.bin"
+       help
+         The filename of the file to use as Video BIOS Table (VBT) image
+         in the board directory.
+
+config VBT_ADDR
+       hex "Video BIOS Table (VBT) image location"
+       depends on HAVE_VBT
+       default 0xfff90000
+       help
+         The location of Video BIOS Table (VBT) image in the SPI flash. For
+         example, base address of 0xfff90000 indicates that the image will
+         be put at offset 0x90000 from the beginning of a 1MB flash device.
+
+config VIDEO_FSP
+       bool "Enable FSP framebuffer driver support"
+       depends on HAVE_VBT && DM_VIDEO
+       help
+         Turn on this option to enable a framebuffer driver when U-Boot is
+         using Video BIOS Table (VBT) image for FSP firmware to initialize
+         the integrated graphics device.
+
 config ROM_TABLE_ADDR
        hex
        default 0xf0000
index 999429e62b197c5d64c29302704239eb11a3d6f2..94cdff18cc0943bc97e5c790f9bb7f263f22c543 100644 (file)
@@ -27,6 +27,7 @@ endif
 
 obj-y += intel_common/
 obj-$(CONFIG_INTEL_BAYTRAIL) += baytrail/
+obj-$(CONFIG_INTEL_BRASWELL) += braswell/
 obj-$(CONFIG_INTEL_BROADWELL) += broadwell/
 obj-$(CONFIG_SYS_COREBOOT) += coreboot/
 obj-$(CONFIG_EFI_APP) += efi/
diff --git a/arch/x86/cpu/braswell/Kconfig b/arch/x86/cpu/braswell/Kconfig
new file mode 100644 (file)
index 0000000..0e214a7
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+config INTEL_BRASWELL
+       bool
+       select HAVE_FSP
+       select ARCH_MISC_INIT
+       select CPU_INTEL_TURBO_NOT_PACKAGE_SCOPED
+       imply HAVE_INTEL_ME
+       imply HAVE_VBT
+       imply ENABLE_MRC_CACHE
+       imply ENV_IS_IN_SPI_FLASH
+       imply AHCI_PCI
+       imply ICH_SPI
+       imply MMC
+       imply MMC_PCI
+       imply MMC_SDHCI
+       imply MMC_SDHCI_SDMA
+       imply SCSI
+       imply SPI_FLASH
+       imply SYS_NS16550
+       imply USB
+       imply USB_XHCI_HCD
+       imply VIDEO_FSP
+
+if INTEL_BRASWELL
+
+config FSP_ADDR
+       hex
+       default 0xfff20000
+
+config FSP_LOCKDOWN_SPI
+       bool
+       default y
+
+endif
diff --git a/arch/x86/cpu/braswell/Makefile b/arch/x86/cpu/braswell/Makefile
new file mode 100644 (file)
index 0000000..ddf6d28
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += braswell.o cpu.o early_uart.o fsp_configs.o
diff --git a/arch/x86/cpu/braswell/braswell.c b/arch/x86/cpu/braswell/braswell.c
new file mode 100644 (file)
index 0000000..37099aa
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/mrccache.h>
+#include <asm/post.h>
+
+int arch_cpu_init(void)
+{
+       post_code(POST_CPU_INIT);
+
+       return x86_cpu_init_f();
+}
+
+int arch_misc_init(void)
+{
+#ifdef CONFIG_ENABLE_MRC_CACHE
+       /*
+        * We intend not to check any return value here, as even MRC cache
+        * is not saved successfully, it is not a severe error that will
+        * prevent system from continuing to boot.
+        */
+       mrccache_save();
+#endif
+
+       return 0;
+}
+
+void reset_cpu(ulong addr)
+{
+       /* cold reset */
+       x86_full_reset();
+}
diff --git a/arch/x86/cpu/braswell/cpu.c b/arch/x86/cpu/braswell/cpu.c
new file mode 100644 (file)
index 0000000..6ff9036
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ *
+ * Derived from arch/x86/cpu/baytrail/cpu.c
+ */
+
+#include <common.h>
+#include <cpu.h>
+#include <dm.h>
+#include <asm/cpu.h>
+#include <asm/cpu_x86.h>
+#include <asm/io.h>
+#include <asm/lapic.h>
+#include <asm/msr.h>
+#include <asm/turbo.h>
+
+static const unsigned int braswell_bus_freq_table[] = {
+       83333333,
+       100000000,
+       133333333,
+       116666666,
+       80000000,
+       93333333,
+       90000000,
+       88900000,
+       87500000
+};
+
+static unsigned int braswell_bus_freq(void)
+{
+       msr_t clk_info = msr_read(MSR_BSEL_CR_OVERCLOCK_CONTROL);
+
+       if ((clk_info.lo & 0xf) < (ARRAY_SIZE(braswell_bus_freq_table)))
+               return braswell_bus_freq_table[clk_info.lo & 0xf];
+
+       return 0;
+}
+
+static unsigned long braswell_tsc_freq(void)
+{
+       msr_t platform_info;
+       ulong bclk = braswell_bus_freq();
+
+       if (!bclk)
+               return 0;
+
+       platform_info = msr_read(MSR_PLATFORM_INFO);
+
+       return bclk * ((platform_info.lo >> 8) & 0xff);
+}
+
+static int braswell_get_info(struct udevice *dev, struct cpu_info *info)
+{
+       info->cpu_freq = braswell_tsc_freq();
+       info->features = (1 << CPU_FEAT_L1_CACHE) | (1 << CPU_FEAT_MMU);
+
+       return 0;
+}
+
+static int braswell_get_count(struct udevice *dev)
+{
+       int ecx = 0;
+
+       /*
+        * Use the algorithm described in Intel 64 and IA-32 Architectures
+        * Software Developer's Manual Volume 3 (3A, 3B & 3C): System
+        * Programming Guide, Jan-2015. Section 8.9.2: Hierarchical Mapping
+        * of CPUID Extended Topology Leaf.
+        */
+       while (1) {
+               struct cpuid_result leaf_b;
+
+               leaf_b = cpuid_ext(0xb, ecx);
+
+               /*
+                * Braswell doesn't have hyperthreading so just determine the
+                * number of cores by from level type (ecx[15:8] == * 2)
+                */
+               if ((leaf_b.ecx & 0xff00) == 0x0200)
+                       return leaf_b.ebx & 0xffff;
+
+               ecx++;
+       }
+
+       return 0;
+}
+
+static void braswell_set_max_freq(void)
+{
+       msr_t perf_ctl;
+       msr_t msr;
+
+       /* Enable speed step */
+       msr = msr_read(MSR_IA32_MISC_ENABLES);
+       msr.lo |= (1 << 16);
+       msr_write(MSR_IA32_MISC_ENABLES, msr);
+
+       /* Enable Burst Mode */
+       msr = msr_read(MSR_IA32_MISC_ENABLES);
+       msr.hi = 0;
+       msr_write(MSR_IA32_MISC_ENABLES, msr);
+
+       /*
+        * Set guaranteed ratio [21:16] from IACORE_TURBO_RATIOS to
+        * bits [15:8] of the PERF_CTL
+        */
+       msr = msr_read(MSR_IACORE_TURBO_RATIOS);
+       perf_ctl.lo = (msr.lo & 0x3f0000) >> 8;
+
+       /*
+        * Set guaranteed vid [22:16] from IACORE_TURBO_VIDS to
+        * bits [7:0] of the PERF_CTL
+        */
+       msr = msr_read(MSR_IACORE_TURBO_VIDS);
+       perf_ctl.lo |= (msr.lo & 0x7f0000) >> 16;
+
+       perf_ctl.hi = 0;
+       msr_write(MSR_IA32_PERF_CTL, perf_ctl);
+}
+
+static int braswell_probe(struct udevice *dev)
+{
+       debug("Init Braswell core\n");
+
+       /*
+        * On Braswell the turbo disable bit is actually scoped at the
+        * building-block level, not package. For non-BSP cores that are
+        * within a building block, enable turbo. The cores within the BSP's
+        * building block will just see it already enabled and move on.
+        */
+       if (lapicid())
+               turbo_enable();
+
+       /* Dynamic L2 shrink enable and threshold, clear SINGLE_PCTL bit 11 */
+       msr_clrsetbits_64(MSR_PMG_CST_CONFIG_CONTROL, 0x3f080f, 0xe0008),
+       msr_clrsetbits_64(MSR_POWER_MISC,
+                         ENABLE_ULFM_AUTOCM_MASK | ENABLE_INDP_AUTOCM_MASK, 0);
+
+       /* Disable C1E */
+       msr_clrsetbits_64(MSR_POWER_CTL, 2, 0);
+       msr_setbits_64(MSR_POWER_MISC, 0x44);
+
+       /* Set this core to max frequency ratio */
+       braswell_set_max_freq();
+
+       return 0;
+}
+
+static const struct udevice_id braswell_ids[] = {
+       { .compatible = "intel,braswell-cpu" },
+       { }
+};
+
+static const struct cpu_ops braswell_ops = {
+       .get_desc       = cpu_x86_get_desc,
+       .get_info       = braswell_get_info,
+       .get_count      = braswell_get_count,
+       .get_vendor     = cpu_x86_get_vendor,
+};
+
+U_BOOT_DRIVER(cpu_x86_braswell_drv) = {
+       .name           = "cpu_x86_braswell",
+       .id             = UCLASS_CPU,
+       .of_match       = braswell_ids,
+       .bind           = cpu_x86_bind,
+       .probe          = braswell_probe,
+       .ops            = &braswell_ops,
+};
diff --git a/arch/x86/cpu/braswell/early_uart.c b/arch/x86/cpu/braswell/early_uart.c
new file mode 100644 (file)
index 0000000..c70a885
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+
+#define PCI_DEV_CONFIG(segbus, dev, fn) ( \
+               (((segbus) & 0xfff) << 20) | \
+               (((dev) & 0x1f) << 15) | \
+               (((fn)  & 0x07) << 12))
+
+/* Platform Controller Unit */
+#define LPC_DEV                        0x1f
+#define LPC_FUNC               0
+
+/* Enable UART */
+#define UART_CONT              0x80
+
+/* UART PAD definitions */
+#define UART_RXD_COMMUITY      1
+#define UART_TXD_COMMUITY      1
+#define UART_RXD_FAMILY                4
+#define UART_TXD_FAMILY                4
+#define UART_RXD_PAD           2
+#define UART_TXD_PAD           7
+#define UART_RXD_FUNC          3
+#define UART_TXD_FUNC          3
+
+/* IO Memory */
+#define IO_BASE_ADDRESS                0xfed80000
+
+static inline uint32_t gpio_pconf0(int community, int family, int pad)
+{
+       return IO_BASE_ADDRESS + community * 0x8000 + 0x4400 +
+               family * 0x400 + pad * 8;
+}
+
+static void gpio_select_func(int community, int family, int pad, int func)
+{
+       uint32_t pconf0_addr = gpio_pconf0(community, family, pad);
+
+       clrsetbits_le32(pconf0_addr, 0xf << 16, func << 16);
+}
+
+static void x86_pci_write_config32(int dev, unsigned int where, u32 value)
+{
+       unsigned long addr;
+
+       addr = CONFIG_PCIE_ECAM_BASE | dev | (where & ~3);
+       writel(value, addr);
+}
+
+/* This can be called after memory-mapped PCI is working */
+int setup_internal_uart(int enable)
+{
+       /* Enable or disable the legacy UART hardware */
+       x86_pci_write_config32(PCI_DEV_CONFIG(0, LPC_DEV, LPC_FUNC), UART_CONT,
+                              enable);
+
+       /* All done for the disable part, so just return */
+       if (!enable)
+               return 0;
+
+       /*
+        * Set up the pads to the UART function. This allows the signals to
+        * leave the chip
+        */
+       gpio_select_func(UART_RXD_COMMUITY, UART_RXD_FAMILY,
+                        UART_RXD_PAD, UART_RXD_FUNC);
+       gpio_select_func(UART_TXD_COMMUITY, UART_TXD_FAMILY,
+                        UART_TXD_PAD, UART_TXD_FUNC);
+
+       return 0;
+}
+
+void board_debug_uart_init(void)
+{
+       setup_internal_uart(1);
+}
diff --git a/arch/x86/cpu/braswell/fsp_configs.c b/arch/x86/cpu/braswell/fsp_configs.c
new file mode 100644 (file)
index 0000000..249f851
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <asm/fsp/fsp_support.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/**
+ * Override the FSP's Azalia configuration data
+ *
+ * @azalia:    pointer to be updated to point to a ROM address where Azalia
+ *             configuration data is stored
+ */
+__weak void update_fsp_azalia_configs(struct azalia_config **azalia)
+{
+       *azalia = NULL;
+}
+
+/**
+ * Override the FSP's GPIO configuration data
+ *
+ * @family:    pointer to be updated to point to a ROM address where GPIO
+ *             family configuration data is stored
+ * @pad:       pointer to be updated to point to a ROM address where GPIO
+ *             pad configuration data is stored
+ */
+__weak void update_fsp_gpio_configs(struct gpio_family **family,
+                                   struct gpio_pad **pad)
+{
+       *family = NULL;
+       *pad = NULL;
+}
+
+/**
+ * Override the FSP's configuration data.
+ * If the device tree does not specify an integer setting, use the default
+ * provided in Intel's Braswell release FSP/BraswellFsp.bsf file.
+ */
+void update_fsp_configs(struct fsp_config_data *config,
+                       struct fspinit_rtbuf *rt_buf)
+{
+       struct upd_region *fsp_upd = &config->fsp_upd;
+       struct memory_upd *memory_upd = &fsp_upd->memory_upd;
+       struct silicon_upd *silicon_upd = &fsp_upd->silicon_upd;
+       const void *blob = gd->fdt_blob;
+       int node;
+
+       /* Initialize runtime buffer for fsp_init() */
+       rt_buf->common.stack_top = config->common.stack_top - 32;
+       rt_buf->common.boot_mode = config->common.boot_mode;
+       rt_buf->common.upd_data = &config->fsp_upd;
+
+       node = fdt_node_offset_by_compatible(blob, 0, "intel,braswell-fsp");
+       if (node < 0) {
+               debug("%s: Cannot find FSP node\n", __func__);
+               return;
+       }
+
+       node = fdt_node_offset_by_compatible(blob, node,
+                                            "intel,braswell-fsp-memory");
+       if (node < 0) {
+               debug("%s: Cannot find FSP memory node\n", __func__);
+               return;
+       }
+
+       /* Override memory UPD contents */
+       memory_upd->mrc_init_tseg_size = fdtdec_get_int(blob, node,
+               "fsp,mrc-init-tseg-size", MRC_INIT_TSEG_SIZE_4MB);
+       memory_upd->mrc_init_mmio_size = fdtdec_get_int(blob, node,
+               "fsp,mrc-init-mmio-size", MRC_INIT_MMIO_SIZE_2048MB);
+       memory_upd->mrc_init_spd_addr1 = fdtdec_get_int(blob, node,
+               "fsp,mrc-init-spd-addr1", 0xa0);
+       memory_upd->mrc_init_spd_addr2 = fdtdec_get_int(blob, node,
+               "fsp,mrc-init-spd-addr2", 0xa2);
+       memory_upd->igd_dvmt50_pre_alloc = fdtdec_get_int(blob, node,
+               "fsp,igd-dvmt50-pre-alloc", IGD_DVMT50_PRE_ALLOC_32MB);
+       memory_upd->aperture_size = fdtdec_get_int(blob, node,
+               "fsp,aperture-size", APERTURE_SIZE_256MB);
+       memory_upd->gtt_size = fdtdec_get_int(blob, node,
+               "fsp,gtt-size", GTT_SIZE_1MB);
+       memory_upd->legacy_seg_decode = fdtdec_get_bool(blob, node,
+               "fsp,legacy-seg-decode");
+       memory_upd->enable_dvfs = fdtdec_get_bool(blob, node,
+               "fsp,enable-dvfs");
+       memory_upd->memory_type = fdtdec_get_int(blob, node,
+               "fsp,memory-type", DRAM_TYPE_DDR3);
+       memory_upd->enable_ca_mirror = fdtdec_get_bool(blob, node,
+               "fsp,enable-ca-mirror");
+
+       node = fdt_node_offset_by_compatible(blob, node,
+                                            "intel,braswell-fsp-silicon");
+       if (node < 0) {
+               debug("%s: Cannot find FSP silicon node\n", __func__);
+               return;
+       }
+
+       /* Override silicon UPD contents */
+       silicon_upd->sdcard_mode = fdtdec_get_int(blob, node,
+               "fsp,sdcard-mode", SDCARD_MODE_PCI);
+       silicon_upd->enable_hsuart0 = fdtdec_get_bool(blob, node,
+               "fsp,enable-hsuart0");
+       silicon_upd->enable_hsuart1 = fdtdec_get_bool(blob, node,
+               "fsp,enable-hsuart1");
+       silicon_upd->enable_azalia = fdtdec_get_bool(blob, node,
+               "fsp,enable-azalia");
+       if (silicon_upd->enable_azalia)
+               update_fsp_azalia_configs(&silicon_upd->azalia_cfg_ptr);
+       silicon_upd->enable_sata = fdtdec_get_bool(blob, node,
+               "fsp,enable-sata");
+       silicon_upd->enable_xhci = fdtdec_get_bool(blob, node,
+               "fsp,enable-xhci");
+       silicon_upd->lpe_mode = fdtdec_get_int(blob, node,
+               "fsp,lpe-mode", LPE_MODE_PCI);
+       silicon_upd->enable_dma0 = fdtdec_get_bool(blob, node,
+               "fsp,enable-dma0");
+       silicon_upd->enable_dma1 = fdtdec_get_bool(blob, node,
+               "fsp,enable-dma1");
+       silicon_upd->enable_i2c0 = fdtdec_get_bool(blob, node,
+               "fsp,enable-i2c0");
+       silicon_upd->enable_i2c1 = fdtdec_get_bool(blob, node,
+               "fsp,enable-i2c1");
+       silicon_upd->enable_i2c2 = fdtdec_get_bool(blob, node,
+               "fsp,enable-i2c2");
+       silicon_upd->enable_i2c3 = fdtdec_get_bool(blob, node,
+               "fsp,enable-i2c3");
+       silicon_upd->enable_i2c4 = fdtdec_get_bool(blob, node,
+               "fsp,enable-i2c4");
+       silicon_upd->enable_i2c5 = fdtdec_get_bool(blob, node,
+               "fsp,enable-i2c5");
+       silicon_upd->enable_i2c6 = fdtdec_get_bool(blob, node,
+               "fsp,enable-i2c6");
+#ifdef CONFIG_HAVE_VBT
+       silicon_upd->graphics_config_ptr = CONFIG_VBT_ADDR;
+#endif
+       update_fsp_gpio_configs(&silicon_upd->gpio_familiy_ptr,
+                               &silicon_upd->gpio_pad_ptr);
+       /*
+        * For Braswell B0 stepping, disable_punit_pwr_config must be set to 1
+        * otherwise it just hangs in fsp_init().
+        */
+       if (gd->arch.x86_mask == 2)
+               silicon_upd->disable_punit_pwr_config = 1;
+       silicon_upd->emmc_mode = fdtdec_get_int(blob, node,
+               "fsp,emmc-mode", EMMC_MODE_PCI);
+       silicon_upd->sata_speed = fdtdec_get_int(blob, node,
+               "fsp,sata-speed", SATA_SPEED_GEN3);
+       silicon_upd->pmic_i2c_bus = fdtdec_get_int(blob, node,
+               "fsp,pmic-i2c-bus", 0);
+       silicon_upd->enable_isp = fdtdec_get_bool(blob, node,
+               "fsp,enable-isp");
+       silicon_upd->isp_pci_dev_config = fdtdec_get_int(blob, node,
+               "fsp,isp-pci-dev-config", ISP_PCI_DEV_CONFIG_2);
+       silicon_upd->turbo_mode = fdtdec_get_bool(blob, node,
+               "fsp,turbo-mode");
+       silicon_upd->pnp_settings = fdtdec_get_int(blob, node,
+               "fsp,pnp-settings", PNP_SETTING_POWER_AND_PERF);
+       silicon_upd->sd_detect_chk = fdtdec_get_bool(blob, node,
+               "fsp,sd-detect-chk");
+}
index 94f31c40beb614188ad8e6a6e7d1b33e4fa5bcb3..442942956b26dabbeb312c4f762664a6a2471d2d 100644 (file)
@@ -34,16 +34,6 @@ int bridge_silicon_revision(struct udevice *dev)
        return bridge_id | stepping;
 }
 
-/*
- * Reserve everything between A segment and 1MB:
- *
- * 0xa0000 - 0xbffff: legacy VGA
- * 0xc0000 - 0xcffff: VGA OPROM (needed by kernel)
- * 0xe0000 - 0xfffff: SeaBIOS, if used, otherwise DMI
- */
-static const int legacy_hole_base_k = 0xa0000 / 1024;
-static const int legacy_hole_size_k = 384;
-
 static int get_pcie_bar(struct udevice *dev, u32 *base, u32 *len)
 {
        u32 pciexbar_reg;
index 6589495f2317b5344e306f69ba2a9b92d276b70b..6d0c4b65ecf5cf24e92d66fe7cc153720eb5f9e6 100644 (file)
@@ -3,6 +3,7 @@
 #
 
 dtb-y += bayleybay.dtb \
+       cherryhill.dtb \
        chromebook_link.dtb \
        chromebox_panther.dtb \
        chromebook_samus.dtb \
diff --git a/arch/x86/dts/cherryhill.dts b/arch/x86/dts/cherryhill.dts
new file mode 100644 (file)
index 0000000..1ccb605
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/dts-v1/;
+
+#include <asm/arch-braswell/fsp/fsp_configs.h>
+#include <dt-bindings/interrupt-router/intel-irq.h>
+
+/include/ "skeleton.dtsi"
+/include/ "serial.dtsi"
+/include/ "rtc.dtsi"
+/include/ "tsc_timer.dtsi"
+
+/ {
+       model = "Intel Cherry Hill";
+       compatible = "intel,cherryhill", "intel,braswell";
+
+       aliases {
+               serial0 = &serial;
+               spi0 = &spi;
+       };
+
+       config {
+               silent_console = <0>;
+       };
+
+       chosen {
+               stdout-path = "/serial";
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "intel,braswell-cpu";
+                       reg = <0>;
+                       intel,apic-id = <0>;
+               };
+
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "intel,braswell-cpu";
+                       reg = <1>;
+                       intel,apic-id = <2>;
+               };
+
+               cpu@2 {
+                       device_type = "cpu";
+                       compatible = "intel,braswell-cpu";
+                       reg = <2>;
+                       intel,apic-id = <4>;
+               };
+
+               cpu@3 {
+                       device_type = "cpu";
+                       compatible = "intel,braswell-cpu";
+                       reg = <3>;
+                       intel,apic-id = <6>;
+               };
+       };
+
+       pci {
+               compatible = "pci-x86";
+               #address-cells = <3>;
+               #size-cells = <2>;
+               u-boot,dm-pre-reloc;
+               ranges = <0x02000000 0x0 0x80000000 0x80000000 0 0x40000000
+                         0x42000000 0x0 0xc0000000 0xc0000000 0 0x20000000
+                         0x01000000 0x0 0x2000 0x2000 0 0xe000>;
+
+               pch@1f,0 {
+                       reg = <0x0000f800 0 0 0 0>;
+                       compatible = "intel,pch9";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       irq-router {
+                               compatible = "intel,irq-router";
+                               intel,pirq-config = "ibase";
+                               intel,ibase-offset = <0x50>;
+                               intel,pirq-link = <8 8>;
+                               intel,pirq-mask = <0xdee0>;
+                               intel,pirq-routing = <
+                                       /* Braswell PCI devices */
+                                       PCI_BDF(0, 2, 0) INTA PIRQA
+                                       PCI_BDF(0, 3, 0) INTA PIRQA
+                                       PCI_BDF(0, 11, 0) INTA PIRQA
+                                       PCI_BDF(0, 16, 0) INTA PIRQA
+                                       PCI_BDF(0, 17, 0) INTA PIRQA
+                                       PCI_BDF(0, 18, 0) INTA PIRQA
+                                       PCI_BDF(0, 19, 0) INTA PIRQA
+                                       PCI_BDF(0, 20, 0) INTA PIRQA
+                                       PCI_BDF(0, 21, 0) INTA PIRQA
+                                       PCI_BDF(0, 24, 0) INTA PIRQA
+                                       PCI_BDF(0, 24, 1) INTC PIRQC
+                                       PCI_BDF(0, 24, 2) INTD PIRQD
+                                       PCI_BDF(0, 24, 3) INTB PIRQB
+                                       PCI_BDF(0, 24, 4) INTA PIRQA
+                                       PCI_BDF(0, 24, 5) INTC PIRQC
+                                       PCI_BDF(0, 24, 6) INTD PIRQD
+                                       PCI_BDF(0, 24, 7) INTB PIRQB
+                                       PCI_BDF(0, 26, 0) INTA PIRQA
+                                       PCI_BDF(0, 27, 0) INTA PIRQA
+                                       PCI_BDF(0, 28, 0) INTA PIRQA
+                                       PCI_BDF(0, 28, 1) INTB PIRQB
+                                       PCI_BDF(0, 28, 2) INTC PIRQC
+                                       PCI_BDF(0, 28, 3) INTD PIRQD
+                                       PCI_BDF(0, 30, 0) INTA PIRQA
+                                       PCI_BDF(0, 30, 3) INTA PIRQA
+                                       PCI_BDF(0, 30, 4) INTA PIRQA
+                                       PCI_BDF(0, 31, 0) INTB PIRQB
+                                       PCI_BDF(0, 31, 3) INTB PIRQB
+
+                                       /*
+                                        * PCIe root ports downstream
+                                        * interrupts
+                                        */
+                                       PCI_BDF(1, 0, 0) INTA PIRQA
+                                       PCI_BDF(1, 0, 0) INTB PIRQB
+                                       PCI_BDF(1, 0, 0) INTC PIRQC
+                                       PCI_BDF(1, 0, 0) INTD PIRQD
+                                       PCI_BDF(2, 0, 0) INTA PIRQB
+                                       PCI_BDF(2, 0, 0) INTB PIRQC
+                                       PCI_BDF(2, 0, 0) INTC PIRQD
+                                       PCI_BDF(2, 0, 0) INTD PIRQA
+                                       PCI_BDF(3, 0, 0) INTA PIRQC
+                                       PCI_BDF(3, 0, 0) INTB PIRQD
+                                       PCI_BDF(3, 0, 0) INTC PIRQA
+                                       PCI_BDF(3, 0, 0) INTD PIRQB
+                                       PCI_BDF(4, 0, 0) INTA PIRQD
+                                       PCI_BDF(4, 0, 0) INTB PIRQA
+                                       PCI_BDF(4, 0, 0) INTC PIRQB
+                                       PCI_BDF(4, 0, 0) INTD PIRQC
+                               >;
+                       };
+
+                       spi: spi {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "intel,ich9-spi";
+
+                               spi-flash@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       reg = <0>;
+                                       compatible = "macronix,mx25u6435f", "spi-flash";
+                                       memory-map = <0xff800000 0x00800000>;
+                                       rw-mrc-cache {
+                                               label = "rw-mrc-cache";
+                                               reg = <0x005e0000 0x00010000>;
+                                       };
+                               };
+                       };
+               };
+       };
+
+       fsp {
+               compatible = "intel,braswell-fsp";
+               fsp,memory-upd {
+                       compatible = "intel,braswell-fsp-memory";
+                       fsp,mrc-init-tseg-size = <MRC_INIT_TSEG_SIZE_4MB>;
+                       fsp,mrc-init-mmio-size = <MRC_INIT_MMIO_SIZE_2048MB>;
+                       fsp,mrc-init-spd-addr1 = <0xa0>;
+                       fsp,mrc-init-spd-addr2 = <0xa2>;
+                       fsp,igd-dvmt50-pre-alloc = <IGD_DVMT50_PRE_ALLOC_32MB>;
+                       fsp,aperture-size = <APERTURE_SIZE_256MB>;
+                       fsp,gtt-size = <GTT_SIZE_1MB>;
+                       fsp,enable-dvfs;
+                       fsp,memory-type = <DRAM_TYPE_DDR3>;
+               };
+               fsp,silicon-upd {
+                       compatible = "intel,braswell-fsp-silicon";
+                       fsp,sdcard-mode = <SDCARD_MODE_PCI>;
+                       fsp,enable-hsuart1;
+                       fsp,enable-sata;
+                       fsp,enable-xhci;
+                       fsp,lpe-mode = <LPE_MODE_PCI>;
+                       fsp,enable-dma0;
+                       fsp,enable-dma1;
+                       fsp,enable-i2c0;
+                       fsp,enable-i2c1;
+                       fsp,enable-i2c2;
+                       fsp,enable-i2c3;
+                       fsp,enable-i2c4;
+                       fsp,enable-i2c5;
+                       fsp,enable-i2c6;
+                       fsp,emmc-mode = <EMMC_MODE_PCI>;
+                       fsp,sata-speed = <SATA_SPEED_GEN3>;
+                       fsp,pmic-i2c-bus = <0>;
+                       fsp,enable-isp;
+                       fsp,isp-pci-dev-config = <ISP_PCI_DEV_CONFIG_2>;
+                       fsp,turbo-mode;
+                       fsp,pnp-settings = <PNP_SETTING_POWER_AND_PERF>;
+                       fsp,sd-detect-chk;
+               };
+       };
+
+       microcode {
+               update@0 {
+#include "microcode/m01406c2220.dtsi"
+               };
+               update@1 {
+#include "microcode/m01406c3363.dtsi"
+               };
+               update@2 {
+#include "microcode/m01406c440a.dtsi"
+               };
+       };
+
+};
diff --git a/arch/x86/dts/microcode/m01406c2220.dtsi b/arch/x86/dts/microcode/m01406c2220.dtsi
new file mode 100644 (file)
index 0000000..cf17dea
--- /dev/null
@@ -0,0 +1,4308 @@
+/*
+ * ---
+ * This is a device tree fragment. Use #include to add these properties to a
+ * node.
+ *
+ * Date:
+ */
+
+compatible = "intel,microcode";
+intel,header-version = <1>;
+intel,update-revision = <0x220>;
+intel,date-code = <0x1142015>;
+intel,processor-signature = <0x406c2>;
+intel,checksum = <0x21a02433>;
+intel,loader-revision = <1>;
+intel,processor-flags = <0x1>;
+
+/* The first 48-bytes are the public header which repeats the above data */
+data = <
+       0x01000000      0x20020000      0x15201401      0xc2060400
+       0x3324a021      0x01000000      0x01000000      0xd00b0100
+       0x000c0100      0x00000000      0x00000000      0x00000000
+       0x00000000      0xa1000000      0x01000200      0x20020000
+       0x00000000      0x00000000      0x14011520      0xe1420000
+       0x01000000      0xc2060400      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x17ce1b3d      0x74fb4eb5      0x2f27d633      0x14060671
+       0x6b4d57b0      0xaa1ad327      0x6022d785      0x5fa91aad
+       0xef44e4c3      0xf91d4958      0x230883b7      0x7382ab6e
+       0xf14324ef      0xf94c28d7      0x9131d196      0xebcf2faa
+       0xc049cb37      0xd1577abd      0x5edbe45a      0x17e1ca1e
+       0xbe9a92c3      0x1c8e1790      0xb3c08b8a      0xca799851
+       0x3f2a8c92      0x1b7e15d8      0x1f44ecb2      0xaeda1838
+       0x0ace8669      0xae9d497e      0x424c680c      0x21b3a3ed
+       0xd924acfe      0xddc126a2      0x26363596      0x21cd999b
+       0x193f9df3      0x037d1953      0xf97a3dc5      0x4c94ad7e
+       0x98b360f0      0xeb90461f      0x438e6d2e      0x30851a0e
+       0xfd623681      0x18782d3c      0x702938c5      0x462df0dd
+       0xf7d67cc1      0x161076a0      0xf06e5db3      0xd861a76b
+       0xa40b06bc      0xed37c69b      0x2b25f98b      0x2b67887d
+       0xbf0131b5      0x571b7c25      0x34eb3752      0x992e406e
+       0x031ba8e7      0xccfc5b1d      0x33f487e9      0xeccc3098
+       0xe452737b      0xb38cc286      0x817bc58f      0x852a7fde
+       0xcbcd1b19      0xab11894a      0xa1f278d7      0x360829c9
+       0x11000000      0x67a4c01f      0x3f863221      0xf4b82fe4
+       0xf464c489      0x36b8d097      0xfa9ab17e      0x9bccf4e6
+       0x9f836ffd      0x647c263c      0x03c7bede      0xf20172e9
+       0x8bd6e772      0x8621aca5      0xbdf4eade      0xac27528a
+       0xb562042b      0x23d0304c      0x964558ea      0xb5c03c97
+       0xe0bd0467      0xe8a6d50a      0xe5d4b902      0xb164253e
+       0x8306959c      0xd1cd57d5      0xf7d1d586      0x4eb5152b
+       0xf488caca      0xaa47f32f      0x366676b3      0x96b27e47
+       0xc8f4fdda      0x9f6854bb      0x89921eb5      0xbb7fe720
+       0x59709d36      0x01a5880c      0xee526518      0x586055d6
+       0xfac43c7a      0x7ce6da62      0x301be309      0xf48c261e
+       0xdd7d6b27      0x6783c81a      0xf9151492      0x92a57bd1
+       0x94607cfc      0xd70700ed      0x18136034      0x16d26594
+       0xeadd5210      0xf2fa345f      0xba7e9be4      0x548b8db1
+       0xd9d81a27      0xb361bae3      0xe2c5c033      0xd34d0488
+       0x07925cd2      0xaf57a669      0xf7f634b6      0x58408a6f
+       0x2c8b4c46      0xe71e9a53      0x65bc42be      0x77db4bf1
+       0x4c839bf5      0xd6dbc641      0x4fbf6fef      0x6b71eb34
+       0x808898b9      0x7ecea348      0x608a1d5e      0x81225ea2
+       0x487a3d44      0xc2443f3e      0xff580d9a      0xefd915b1
+       0xe867848b      0x73c48e53      0x84d211d4      0x77a45152
+       0x146f95fc      0x088157cb      0x9661fa65      0x6b998636
+       0xd8d8748d      0x16bb32b5      0x3eb3be6a      0x29a2aa6e
+       0xcbd08ca6      0x74317789      0xe9e8f1ea      0x7c555679
+       0xd7f19a7b      0xcead34da      0xe584403c      0xbfae80e2
+       0x4e9a7a52      0x0eefa659      0x00eb4354      0xe6f0cf6d
+       0x69374a24      0xdb59e992      0x2d4a51eb      0x4cdb46ca
+       0x03613349      0x24d146ab      0x1cca9b58      0x6db9989a
+       0x534dedef      0xab90d703      0x75a8331b      0xec865e24
+       0x8415faf2      0x851022e8      0x4ee795cd      0x7af2b1a8
+       0x65ec359a      0x0a16c7d8      0x76d51f56      0x7e1e10ec
+       0xbab138d8      0x0d69389e      0x0a50fc3a      0x7746732d
+       0x98f692d2      0xf97254ff      0xd31185d4      0x1a7104b4
+       0x1382fbff      0x4660f775      0x187ed97f      0x880cb07a
+       0x566157d2      0x1ec58c53      0xc1fff1e3      0x30cde9d6
+       0x933993eb      0x365c5318      0x30a5df05      0x91744f18
+       0xac99ae3a      0xacb5cc81      0x6af06584      0xcbfcb5dc
+       0x10e3cdd1      0x8d31a621      0x36851aa8      0x718c1d81
+       0x4a574346      0x70fb532a      0xc97b70e3      0x4e61d0d1
+       0x9e5e2563      0xd86da543      0xb6c07a52      0x417e59f2
+       0xee4c48d6      0xca38e12e      0x9188a73d      0x6624af3c
+       0x62a1d33f      0xcf8afe37      0xd0173727      0x378470e3
+       0x35067424      0x0775c48c      0x7cab8eb0      0xfeb84d6c
+       0x187fbb8c      0xe2cab639      0xedfc3f59      0xbace1601
+       0xbc2535e9      0x74b7d16e      0xbc351b20      0xf4a41f6f
+       0x996a0c11      0xec1e5d06      0x8dae9d53      0xe92082ce
+       0x8bfb678f      0xb4ae58e4      0xbecbf0de      0xfdbd1df9
+       0x0cf5ffe2      0x362f4eb5      0x90cc7b4e      0x813a329d
+       0xd6b5c9fc      0x19dea293      0x4bc51036      0x10570f4b
+       0xd904d7b6      0x348da9e4      0x2fd7a32d      0xfc79b430
+       0x0b9c30dd      0xe0289eb6      0xc6ef55ef      0xfae73fe2
+       0xbd4a65d1      0x463804e8      0xc1d6c9d9      0xa94cea7a
+       0xa23f954d      0x2d76b17e      0x5851be88      0xcf829e51
+       0xe6c5c2a6      0x94f9772b      0xe6c22b45      0x3a6cb78f
+       0xb7f13d24      0x4c45d9f3      0xa8c115ec      0x3156aea1
+       0x8076cddc      0x191032dc      0xc7e3c577      0x04ff6b8e
+       0x4b048a66      0x61645b1e      0x49c1f2da      0x428518b8
+       0x5270837d      0x25aee268      0xa0d1bbaa      0x7c2b6cdc
+       0x95251e7d      0x47eb8833      0x4b274412      0x9df92f4d
+       0xc9165ad1      0x928605dd      0xed0ca542      0x59899c98
+       0xbe0a0295      0xaa9cc0ae      0x1a03db3f      0x00adb561
+       0xecfda91f      0xc4ba7882      0x38ec4207      0x55bc0855
+       0xced7c3e9      0x3e783ec0      0xe5085047      0x120366cb
+       0x56161c5b      0x2cda197c      0x4b855ae0      0xdebd39ef
+       0xe077f8c5      0x831346fc      0x119cf5bc      0x1f856af0
+       0x71be6741      0x94946c60      0x320ff78f      0xb24955bf
+       0xcaeaa452      0xcf673cad      0x83dee256      0xc1ca89d6
+       0x9a99b0c8      0x0506634a      0x43825141      0x93b261da
+       0x110fc9e7      0x1fff550f      0xff64e483      0x8ab28045
+       0xdc8a20e1      0x64f0125b      0x02b35cc1      0xae9a45a0
+       0x1ba02775      0x4ca78c43      0x00492b04      0xca28b4c6
+       0x2986d389      0x277de0ac      0x115a59fc      0x03c55ef6
+       0xeb2d37d4      0x8f6091a6      0x5589954b      0xd6a76cfe
+       0x52f90c11      0xc880f0aa      0x674e9009      0xd1cf458a
+       0xcbf97f4e      0x8b1a7a5e      0x52aca0bb      0x7562f0bb
+       0x27351468      0xf1ec9a0e      0x8300fefd      0x34358af1
+       0x1c33380b      0x29c5eae7      0x8ad5fedc      0x1fd8288b
+       0xb87a0fa8      0x0ed4830d      0x034a4536      0x9479d467
+       0xe6d0aafe      0x941d6d97      0x4e3b0d6f      0x057a6b8d
+       0x62cc8d8f      0xdcc01061      0x13217f10      0x6e5ddaa3
+       0xd9ebc375      0x1d54b3f2      0xed12af1c      0x48ff2428
+       0xe65ca319      0x6c699865      0x2d101e05      0xd28a495a
+       0x8bd948d8      0xa0b503b1      0x447158c1      0x662e03d2
+       0x0150fb5f      0x55288aa2      0x3e74f75d      0x5c111c33
+       0x802fe4c9      0x4d90bb9b      0x8b0a9377      0x9c215cdd
+       0x75602db3      0xf990e4a2      0xb41c8f6a      0x8a044b56
+       0x56214d80      0x95a51d94      0x957256ad      0xbc4bcfa2
+       0x82325276      0xe03231d9      0xb30b1dba      0x62974827
+       0x75c311f5      0x73081c86      0x6caedca9      0xfd65a79c
+       0x8a0a51b1      0x69f69434      0x1ec5f9ac      0x4379a9b8
+       0x25ee82e2      0xb8de5ce8      0x4dddef11      0x1f287f04
+       0x3438be45      0xa9f615c0      0xc4b4885d      0x4463603c
+       0x17a51586      0xb941900e      0x55f6b1fc      0x827adf71
+       0x2be9133f      0x98fcacec      0x7db549ff      0xf2172b4d
+       0x389a1ee7      0x28b04504      0x091e5333      0x9b3d5323
+       0xab29ddb5      0xf67748c3      0x838b320d      0xc2cd0deb
+       0x40b166b2      0xafe61841      0xbb915676      0x060235f5
+       0x68cbea2d      0xa7e4415c      0x9b67dcf9      0xd40da108
+       0xa6f53ede      0x395f766c      0xfd2b8267      0x84cbdd78
+       0x5dea645a      0x188cc462      0x471782c5      0x716f5c34
+       0x12b64f0a      0xc4e5d287      0x008469cf      0x74023871
+       0x280e14e8      0xa4cd2075      0xd6741c46      0x39228423
+       0x1d33880d      0x0fe5a8b2      0x09a0d784      0x43f282e0
+       0xe1fb9193      0x0c1d6d00      0x4618bb7e      0xa2346753
+       0xac82efb0      0x50c97aed      0x5e08b6da      0x1540d8d4
+       0xaaefaa57      0x0ae69a20      0x304ca040      0xc8e6ba4d
+       0x43b79690      0x5955117f      0x31e602b0      0xc650acbb
+       0x74fd2f1c      0xaa0ae398      0x83f8a97b      0xe2b2c874
+       0xfcb179bd      0xe2c54c23      0x1fa7d92f      0xfbafaf63
+       0xcc581a06      0x6a75505b      0xb1a35d63      0x9830e0e5
+       0xfdb7327f      0xa806c4db      0x0f146d1a      0xe848b52e
+       0x468a29bc      0x29ea4c2c      0x35ab0da3      0x0e81c222
+       0x86567478      0x1e8e8296      0x565fbd9a      0x37028b11
+       0xa477474d      0x97d39513      0x037b58a7      0x9c5b00eb
+       0xa72d199f      0xa7435b0d      0x2504561d      0xabb17c92
+       0xd4266638      0xcad2a41f      0x80527d70      0xcf6ced92
+       0x66f2fb6b      0xb8c51f64      0xb6afb635      0x32ad2078
+       0x117eab32      0x9a1304a1      0x0291a57a      0xea6bc7b5
+       0x0bfaa751      0x1e07d4af      0x2e09ea27      0x84dee2e8
+       0x6fe9e22e      0x3fc0a825      0xd34a7310      0x2e91e3ac
+       0x72c41ca4      0xe054f5c9      0xd41cf7a3      0x1451734b
+       0xf22c4d4c      0x6ff1ddbb      0x8322a1a2      0x169f77ca
+       0x8d948d3a      0x6ea0b0f5      0x59688992      0xefe70251
+       0x77dbfe62      0xcb4a6d76      0x765fa85c      0xb971b63f
+       0xf0991fe5      0xd3adf7c6      0xcd96811b      0xa49d5613
+       0x68263809      0xd97dd8e5      0xa402e5d0      0x4ee84e99
+       0x5458f785      0xdd7c356a      0x8ab65316      0xfed03904
+       0xa416a959      0x6507893a      0xc0efcfa7      0xf3f6c537
+       0x1f36838f      0x4abd214a      0x3e7f80c0      0x8f806c17
+       0xac8a7c48      0x92a9d45e      0xb923b35a      0x2e0dc4b5
+       0x38033851      0x469df49b      0x9493372a      0xe9615673
+       0x90d6cf75      0xc161311b      0xb58a84c3      0x03a5f485
+       0x59aaf326      0xb7332227      0xeed2691b      0xe0151563
+       0x90724196      0xda93f7bc      0x2928e854      0xeada9582
+       0x650c43e6      0xaef61786      0xfbedec7c      0xc31eb425
+       0x950719a9      0xa12c80d7      0x4024b15f      0xa9f81f31
+       0xd1381f85      0xb7287ed7      0x5fb7679e      0x1933734c
+       0x5ede6770      0x1ed50817      0x9b9e3605      0xf9432e65
+       0xe5537255      0xa2216726      0x5a58b595      0x197b2a54
+       0x36050287      0xebedeb87      0x362d920c      0x7b0a455f
+       0x84cae44d      0xa8862ae6      0x85a968fe      0x30e77406
+       0x36a4a4a3      0x94f0f11d      0xe94b7c54      0x6ca83879
+       0x2612a797      0xcb794096      0xe865a5c1      0x2a0be103
+       0x02e32985      0x476f701c      0xc71ba33d      0x4a028652
+       0x9876c689      0x1c3a44fa      0x26ac3755      0xaff3b350
+       0xadeb81ea      0xbdbd1786      0x3476e7a0      0xec4f3ad6
+       0xe0c48b27      0xa79b18ee      0x97f483ab      0xc99f011d
+       0x7e2eed90      0x7dc8b1db      0xa0cc452a      0xf6b42f90
+       0x75fad6db      0x9c5bdca7      0x5a01f8a8      0x6014dd88
+       0x0a01294c      0xbc5cea06      0xd503b150      0x6060d7fa
+       0xe873dbf2      0xa325211c      0x933c6ef8      0x7ea9b2ee
+       0x394f6927      0x56531513      0x99f0662d      0x86554329
+       0xf3251f93      0x54c593f1      0xb5255252      0x26a7b639
+       0x23ab770b      0xa6acb21a      0xe599b798      0xb95143f5
+       0x8c806fe3      0x19978f7e      0xb4d37f44      0xd187235f
+       0xe4bed961      0x6fa2eed6      0x9fc0c7b2      0xf893b168
+       0x87b33909      0x78cd7ca9      0xd3f90120      0x0c807273
+       0x26f6418b      0xd31524d0      0x714c9c3f      0x07eb97a8
+       0x858bdb17      0x5a588101      0x5018f39c      0x74dda380
+       0x8fbf21c5      0x3093a68e      0x8ff3944f      0x066a211a
+       0x420f71b2      0x526a827d      0xfa801547      0x5087ccc4
+       0xf137741e      0x0938d58f      0x3c69fe23      0x017c35e8
+       0x029ded16      0x036dc14c      0x770c59a2      0xd4670464
+       0x0c8d2275      0x45a911c5      0x6cb60b1f      0x3891138d
+       0xc45336a4      0x1e86ff67      0xa4b0e708      0x2c273632
+       0x43fbe16c      0x2faf304e      0x128c5e42      0x4ade9c9b
+       0xcba7d896      0xb9b05e25      0x5b74586c      0x3b45d774
+       0xdf6e3eb3      0xcbdba34d      0x5ccf0d19      0x9b957144
+       0x6cf3b84b      0xa5277ebd      0x829c027f      0x99bc4440
+       0xcb9ce49b      0x28b9b4de      0x34e39214      0x9602a143
+       0xd4845084      0x4d728f3a      0x4dcf4ceb      0x5db80b4d
+       0x430f332f      0xf543c3ae      0xbea87cc6      0x6fc493ff
+       0xfebd2c95      0x943f53c9      0x3065b316      0x11dc1899
+       0xb7d68855      0x97bab122      0x2184f556      0xf387584b
+       0x320563c9      0xb1a979a7      0x5b97dfd6      0xa255e382
+       0xa7c0df72      0xc5049fd4      0xe474318e      0x7a0c9551
+       0xfc34bdd1      0xe05dfec4      0x6c9a6135      0x3c203dad
+       0xc87836ce      0x9d1217db      0x05b32a0e      0x5b5f121e
+       0xb3fc7b09      0xa1258607      0xd20cd31e      0x7f24127e
+       0x7e949924      0x48b96fff      0x60ee0f36      0x4e3956ed
+       0x20296c84      0xc0b681d1      0x69de56a4      0xf9db1b9e
+       0xdf841982      0xaca92b54      0x3436bb28      0xf7863b65
+       0x4e5b4b1f      0x95ab63db      0x6334f3d4      0x871d46a8
+       0x9753f01a      0x7e10b06b      0xc376ab1c      0x260cdf6d
+       0x5eab64f9      0x327a9132      0x7709826a      0x23f10786
+       0x44c6dba1      0x871f6de4      0xe8ccf7eb      0x8bb6dc59
+       0x69eff83f      0xaef98db0      0x1cd5adb5      0x1ed2ca86
+       0x5a472d16      0xbae909f4      0x8f8afb96      0x75692a34
+       0x8a2899e6      0x2bf5b8f5      0x13391132      0xcd42c72b
+       0xf7e48375      0x7477eb4f      0xdd7419c3      0x84a9d605
+       0x2199b9c5      0xd6b13bc8      0xd20d40bd      0x424820d5
+       0x1d40eed0      0x018a94cc      0x40b544ed      0x24739fb3
+       0x327d9b77      0x86a2f928      0xd186ea76      0xb6228cb3
+       0x439078ab      0xae2f9ede      0xf974f961      0xaa3f8a1e
+       0xd48adf10      0x1c8a527f      0x7b70c677      0x119c057c
+       0x9ca80ada      0x8a61351e      0x232a873f      0x1c126055
+       0x65737648      0xd9d9924f      0xceec4cdb      0x5278cd97
+       0x91e7610a      0x87cb310c      0xe8a04120      0xfec45da1
+       0xc8126edd      0x6ee53cb5      0x98bdeb53      0x899eef0a
+       0xc89fbe7b      0x16433847      0xe42a19cd      0xda597cba
+       0xb70e5b99      0x4fb5d111      0xe7a8ab60      0x7e6551d5
+       0x353ee9d3      0xe84fab3b      0xe35e702c      0x2ad32196
+       0x4f9e3670      0xc66429d0      0x64ce22e8      0x11e4ba05
+       0x55224a16      0x76ec7d37      0x02e62543      0x04b1cde7
+       0xbd3dc8ee      0xb6ad0b0b      0xb6fcf7d7      0x7881c834
+       0x3df0cc71      0x537bb7e8      0x78f8df73      0x9923b5c0
+       0x6a8d2f3c      0x97443072      0x8bb39bc1      0x5786d5c6
+       0x48546b94      0x2577d9b9      0xb4f66e56      0x8abe2099
+       0xfe70136c      0x17691bdf      0x88723f20      0x2870a189
+       0x6427b158      0xb2684324      0x6a9bea0c      0xabf8f95c
+       0x8bcfc326      0x92eadb59      0xf2b8a4cc      0x2b9ae0d7
+       0x3c1a539a      0xbf09a99c      0x83d4cd4f      0x14eb71a3
+       0x9cf5b5fb      0x7023baeb      0x2546c235      0xc7df8897
+       0x57bc6c5a      0xa588fb47      0x1222afe6      0xe7a23d55
+       0x031d9638      0x27128d7c      0x1dcc8710      0x6d596692
+       0x1cff2406      0x768cd7f7      0xccbb7e3d      0x951a2e2f
+       0xd8c57dc6      0xfa455cfb      0x4629547d      0xf2157f97
+       0xb182bd3c      0x566937bc      0xe527b342      0x466f0a4b
+       0xd66b033a      0xc0ae8a6f      0xf949ee60      0x9a7fc09c
+       0xd1d021b1      0x4a6283f3      0x104ab7c6      0xa84b7fe9
+       0x59af67a3      0x7942c3f9      0xa59f5b30      0x911f8e99
+       0xca33c891      0xf8c0b06c      0x5a93223b      0x28e7f4ca
+       0x08ff0a04      0x33f5debd      0x680656df      0x68dc25c1
+       0x6d7dd94e      0x6bfec19a      0x14b0904c      0xd335e438
+       0x01548614      0x0f7950d0      0x1cb1ebd0      0x18e8128e
+       0x82b26a7d      0x59c0d22f      0x37c01e61      0xc0ff5ae7
+       0xf600e19a      0xe08b235e      0x21558e16      0xe5af4c73
+       0xaac86b6b      0x41871253      0x8cbaa7bc      0x61f54b66
+       0x24303f07      0xaa03bb7c      0x90bb6890      0x90a847ba
+       0x1f0a2952      0x3cd4c8d5      0x8f15edb8      0x46d70e56
+       0x0e3bb3a1      0xc5502c65      0xd8ad6939      0xa5e878bf
+       0x90e081fb      0x77f2b0bf      0x560b9d43      0x2fc8c14e
+       0x94b1e73b      0x5b631347      0x3aa84950      0xe0d176fd
+       0x0a786edd      0x844591b2      0x10c3d0e2      0xc4d98f1d
+       0xe0a0e814      0xb2e0716f      0x940e9f05      0x186aeb7e
+       0xba7a807e      0x57deb62c      0x7b265a97      0x01fd2f94
+       0xd48e5d97      0x733d35ec      0x9a9d42dc      0xb6deedbd
+       0xfa1a3fd1      0xc3d5f76a      0xbe067709      0x08fde17d
+       0xdf9ecd32      0x2c674cee      0xbe20548d      0xf72ed4f3
+       0x151e9726      0x77749b6c      0xddc2842d      0x640a0309
+       0xf3b76855      0xf835db9e      0xf60dc4c9      0x0406794a
+       0x29036a63      0xa8d17980      0x7564b51d      0xf9863792
+       0x862f3df4      0x11139a39      0x77d1ce24      0x2669e680
+       0xba710cfe      0x5836286e      0xd091dc30      0x185e7f5e
+       0x94b61754      0x1498803d      0x8b1938bf      0x10e14a86
+       0x52d03ce0      0x4a2e1dc7      0xc46e8732      0x3bd74fdd
+       0x8601f3a0      0xe94df719      0x5b3e303a      0x73991fca
+       0x3e94cb68      0xa189260c      0xe0c41caa      0xb5f4ce3c
+       0x73aa5d51      0xcf254e72      0x9956a4d4      0xec1dc462
+       0xc9d8bc09      0x31473e5a      0xb418252a      0x1b4ee56f
+       0xf87bd290      0x431fbb01      0x0381c88a      0xcf32fbb6
+       0x8d2957f8      0xc93752bb      0x983c2012      0x81fc1f24
+       0xc1662206      0x6288cc5d      0x337172e9      0xe3a81a3e
+       0x6f46ebe8      0x2fd1f276      0x2099a1ed      0x6c6f9e9a
+       0x63cfcf1f      0x72f26afd      0x7f793c82      0xa7c1c388
+       0x55152f46      0x3e65bc7f      0xa26cd264      0xe623a0d4
+       0x0cab83da      0x3dc711d7      0x8d4572ee      0xf5017c41
+       0x1cade528      0xc4b4978c      0x67d85f89      0x8507cf37
+       0x1926fac4      0x0f4d8776      0x965166fd      0x81e00306
+       0xe917c43f      0x27272e12      0x9ec2c54c      0x7b265343
+       0x8cd58bba      0x7566812e      0xe9f66859      0xb6bec38f
+       0xf3ee8826      0x60b03f12      0xa6dd812f      0x88f9307d
+       0xc7c8061e      0xb7c2d198      0x445c3ff9      0xe346d33b
+       0x68576e7e      0xbbdb20bd      0x1f113435      0xd5968e28
+       0x8f9f2e07      0x7f5b3a96      0x711be59c      0x7ea8ebd0
+       0x63c80b97      0x4b662d9d      0x0f02e59a      0x8d128923
+       0x07e0cf69      0x7318a67c      0x190edc7e      0xcd2c9601
+       0x53f49be2      0x5f6bf052      0x6bbda8f2      0x1a6331a2
+       0x9dac0f1c      0x6c5efba8      0x6766161a      0x59494954
+       0xfb1ed722      0x51005a48      0x05493ed9      0xb8ecb020
+       0xf304a4d5      0x76944a7a      0x54073b20      0xe25ee0fb
+       0x20b9619f      0xd25296d0      0xc6510a66      0x9834e366
+       0x4f315534      0x3b34ee74      0xe73216c4      0xbdf56f95
+       0xfce1057b      0x2315a5fe      0xeb2a061b      0xfcd4ea01
+       0x5c6bddc2      0x0275f614      0xb9f9f7d0      0x1f10dd83
+       0x48d0d8fe      0xccffd762      0x9321a2c8      0x8ff7a89c
+       0xcf1a10b3      0xb5d2c579      0xad383da9      0xbb95d976
+       0xf25f9da6      0x3fdb3f63      0xe8fa2d09      0xa2985c42
+       0x27c6eeb6      0x25151b99      0x76201836      0x75d6362d
+       0xf7905ab9      0x44126a2f      0xa0713396      0x848bcfb3
+       0xa84d3466      0x1c0b9e19      0xe61e094f      0x112b9bf0
+       0x619e22d9      0x03dbef62      0x59859152      0xec368e6b
+       0xa651aa1f      0x3d66eea0      0xf67ea12f      0x1ba2e0f9
+       0xedecff56      0xada3d57b      0xfbb21920      0xdf6f2854
+       0xb3114298      0xa82045fb      0x937479f0      0x9d3b3b4c
+       0xf26a948d      0x47b83b1f      0x32f02882      0x57a304e3
+       0x00a6ab5c      0x1254cb74      0xdd115800      0xf32884b2
+       0x6660b648      0x391661a6      0x5b038cd2      0x2d9c1493
+       0xc181d5b7      0xcc734a9e      0x7d9d8f29      0xa35cc0fb
+       0xe9903a5f      0xe646da45      0xb72e3546      0x16154cd3
+       0x3565634d      0xbd15552f      0xafd6884b      0xd8108f87
+       0x276f1bed      0x6b06c575      0xf65e35ec      0xfe0592fc
+       0x0ae81424      0x423094ad      0xe3ad0717      0x9e91e5ac
+       0x35d70ba2      0xa7c8cdcb      0xc95822e4      0x18777373
+       0x9ad23679      0x415765c3      0xfb48eb57      0x3356c8ef
+       0xf1efa441      0x24e7b6a3      0xb0445605      0x2dba7bc3
+       0x6a76440d      0xd07c1cea      0x20b0d8e7      0xbfe3a37e
+       0x9678c4dd      0x6d82de29      0x74ab2c66      0x00089f86
+       0xe6add22d      0xe2889df8      0xedadf4ae      0x19b23cb7
+       0x183ce9b4      0x77d73586      0x550fa098      0x974a7b9d
+       0x25115b51      0xdc16ab43      0x616cbe0b      0x7ba015db
+       0xd28c8bd0      0x074b507a      0xb13510f9      0x4ae4bfb1
+       0x1ddac74d      0x98f81d84      0x7e2da21d      0xec8d8dde
+       0xb713eecd      0xe75d0e49      0x55d42c23      0xecf1bf77
+       0xbed9c1ae      0xbe1acacc      0x6e2b8f23      0x7ccb75b6
+       0x001b686f      0xc914dfe8      0xa0a9e739      0x73e23c70
+       0x903e23fa      0x7676979d      0x93ed84f5      0x5624b6e3
+       0x574f0099      0x49dd6b23      0xa4341324      0xaeb24f83
+       0x8034f882      0x3ca2b684      0x8e928752      0x8a6ad2c1
+       0x8b26d97d      0x36814410      0xfe488fb4      0xcb4fe01b
+       0x5a04e8da      0xfb61ec2a      0xe49d9eef      0x94f7ca44
+       0x4166f73a      0x701ec6ea      0xce252ff6      0x04694cf3
+       0x195a89f0      0x2175f03b      0xf395917e      0xe881c885
+       0xfe159686      0x943e185f      0xb62a8327      0xed5b3540
+       0x41dd84c9      0x4188c534      0xa73c3c92      0x38406b81
+       0x7cc88362      0xced41beb      0x5ac6d56a      0xcb07c1f4
+       0x3a7f14de      0x7d507fd6      0x17569413      0xc8ba1f3b
+       0xfe57551e      0xbcff6395      0xe956535e      0xf1086750
+       0x05379ce5      0xd2e013c7      0xe3743d76      0x7ef17c09
+       0x16a2cdb5      0x5e91e546      0xe0fe9d3b      0xcb056e70
+       0x1f686ad4      0x42a8c460      0x1666f3fb      0x9c3967a4
+       0x5e2d882e      0x2e6aee38      0xc81e4ea3      0xed9569e7
+       0x0cea0a6a      0x8249847b      0x91cf9396      0x2bb3eea8
+       0xc7731e11      0x7d612f98      0x6b841102      0xad167aac
+       0xc24bc27d      0xd38029b4      0xe9ccdf55      0x77636545
+       0xa9928fdf      0x22907957      0x95a9cebe      0x37614f0c
+       0x839cbf2e      0xbcc5f0ea      0x0fe941c2      0x44557efc
+       0x04b7e364      0xaf443dc6      0x7cfc7330      0x4f48038f
+       0x048be991      0x80afdf6f      0x96ceacb1      0xf939ad8d
+       0x16f93fca      0x448e5e63      0x3825ad75      0x37eee5cd
+       0xeb6d744e      0xaed3f21a      0xed455624      0xa9a8f6e5
+       0xbafd945c      0xe4eb4ddf      0xd0dc4d3b      0x56f62531
+       0xef005820      0x6b65368c      0xe2b2674e      0xd34cf592
+       0xff62fd2a      0x6ffd6361      0x4b52670d      0xdef62e4f
+       0xd7c2f9b6      0xbe9ac33f      0xc43fd67e      0x24144699
+       0xff9bbfdf      0x8c24eb0f      0x45653dc7      0x2ef18a09
+       0x51e53102      0x6032ac7c      0xef149ac7      0x73dcf922
+       0xb52d4342      0xf03327e3      0x7a73e3f5      0x1b377d4c
+       0xde916da3      0x559e414a      0xd10af3f3      0x8c7fee3b
+       0x36776122      0x4f3207c6      0x1d27e08f      0xa21fbb0f
+       0xd7c5229d      0xbf4788a4      0xd82a3f93      0x03903b53
+       0x7f347a83      0xab4071c4      0x0a1ecbb1      0xb1e7d6bf
+       0x5e828079      0xc019e2c1      0x0ec16bfa      0xac509265
+       0x17de3777      0x99cfe9ac      0xad478dff      0x06c34fb7
+       0xda68a0ba      0x9b4b7b6c      0x5b2f93d2      0x104bc05b
+       0xa89442c3      0x27c3a2e6      0x8d5cc0e3      0x10e6d531
+       0xc10ea99e      0xeb4fe96c      0x763f38f8      0x81ebddc4
+       0x506b82fb      0x0b0880a0      0x87577166      0x398a310c
+       0xba9e9cc4      0xc7f2974a      0xb486646a      0x4cdda979
+       0x0e94c3dc      0x1964ef22      0xd97a63e5      0x6bca1047
+       0xd56a9939      0x5bb91696      0xc20562d5      0x66f7dda8
+       0xdcd24268      0x46d45d8b      0x3d44200f      0xc14319f2
+       0x5e67ffe3      0x26069d77      0xb725d689      0xda0d0e66
+       0x77dac019      0x49006c10      0xcb47615f      0x7dd57b9b
+       0x36a36580      0x7a96b587      0xcc09597e      0x3a2a2bb7
+       0x1bb88bda      0x845ecb94      0x30652a68      0x4b86fa95
+       0x714ee97c      0xb9dcc74d      0x2dbbf5bd      0x9b004cdf
+       0x317b9288      0x9bc26497      0x48c37e55      0xa1b606f7
+       0x5fcc75a7      0x56286706      0x12a80a33      0x753d756f
+       0x76043aa0      0x68485471      0x743a3148      0x1fb65fed
+       0x820b616f      0xc5e7a29d      0xef3b7dae      0xeeb0bc3c
+       0x5af0af0c      0x22596b27      0x67b89c35      0x9ad4bdc0
+       0x4ba48492      0xde6bacf0      0xda7db4e0      0x194b5b25
+       0xb9dd2572      0xa831880e      0x4cc498bf      0x19f82a38
+       0x1b595c33      0xb104e1e7      0xbb7300bd      0x1aa80628
+       0xb5f5a93b      0x62bd9398      0x0e44b29c      0x4eb6635b
+       0x3a95b2da      0x7e5147d0      0x37bd2f57      0xc9da31db
+       0x56984727      0xf3dcdd5d      0x5a53247c      0xed7d60f1
+       0x6b852de7      0x50cefb47      0x1ee892ff      0x49dd4b99
+       0xc6e50db0      0x41cbeec0      0x77e3d8db      0x3806f198
+       0xf86abbd1      0x6faf3be7      0x31838342      0xb42bfec9
+       0xf99b603a      0x612ce0ec      0x76512b53      0xab5c35d7
+       0x8adf788a      0x659c62cf      0x959658c6      0x65671995
+       0x0699df96      0xa37f6c8c      0x38361808      0xd1cf3052
+       0x1a936623      0x08e62ea2      0xdde8b2d3      0x5ca766ff
+       0xd43eadcd      0x55dcfede      0x6a8f1693      0x50c3e623
+       0x2c2f7aff      0x013a0ef4      0xbe178125      0xede2c59f
+       0x9430200e      0x335f2b92      0xc702fbc4      0xae049872
+       0x5c4724da      0x9ba3f4a2      0x82f9bf27      0x6a8b9804
+       0xe02d6803      0xf62f3e49      0x08dd271e      0xd621f3a4
+       0xd898f09b      0x0dfe3196      0x0d979ec4      0xdfaf6a3b
+       0x0ff88167      0xe75e4156      0x1d04e07c      0x85247846
+       0x4f9e6bb6      0x4696c3de      0xc6e4c54b      0xbba3ad9f
+       0x79be7de5      0x918cdf32      0x96e7e972      0xad0fce45
+       0x18ddfc3c      0x704c30a8      0xa510cde0      0x04ddbf57
+       0x72dac9fb      0x67e10a1f      0x8e2d9311      0xddc9a331
+       0xbb49ee04      0x475a66c4      0x384e248c      0x0574a573
+       0xa5e7afac      0xb064b73c      0x22026ef5      0xc556e9e7
+       0x5390cfd3      0xce544730      0xd2f36326      0x2ff6ea1e
+       0x9640deb8      0x1db8680c      0xd13f1600      0xb91c9a46
+       0x045d0ce3      0xe5954466      0x905fc4f5      0xe64f1439
+       0xa7bdae21      0x02e9dc8d      0x776eb13f      0x41ca6eff
+       0x74073553      0xff4631a1      0x092048a7      0xc2971cc1
+       0x599e6bfb      0xee9772b7      0x01e4906e      0x34d833b4
+       0x7345b8a0      0x06466cef      0xf7c46eb9      0xbaeeb3c5
+       0xd2117453      0x1ddc8818      0x04cb7263      0x2be9c872
+       0xcc62bc18      0x136c9191      0x874fe5ca      0xc383ae50
+       0xb679883a      0x3e1819d9      0x2d008f33      0x2bade1a8
+       0xb89e6983      0x83c2c04b      0xc5a242f0      0x2814c262
+       0x3372296c      0xe47a8643      0xee4a3e5c      0xfb51e2da
+       0x0a624f5d      0xee5ba40b      0x5af412e2      0x4405590b
+       0xd07f4584      0xed69ec96      0x55dfdb5a      0x41f83ecf
+       0x2463f7af      0x266943ce      0x259ab0ad      0x65dae624
+       0x03a9caf8      0xa702a063      0x1be78eac      0x1ab26eae
+       0x6dd98b4b      0x448e144a      0x5daa692b      0x0ebf8652
+       0x07c83684      0x40638efb      0xa6618691      0xead4007f
+       0x7cceba52      0x9d712806      0x92017ff5      0x0b645ffa
+       0xb908a27d      0x8ed144ea      0xa0a98258      0x6f1828d3
+       0xc8e8e87d      0xf804f635      0x77849351      0x4edbbdef
+       0x1375cd94      0x5ccdeb90      0x129783fd      0x4cef7ba2
+       0xa9e20d3f      0x28a45fae      0x84e866e3      0x5b8e42f9
+       0x649ae8d2      0x2b878cf5      0x220afb7a      0xa2037752
+       0x6b4e0536      0x184c53cd      0x65483969      0xb25d4b7b
+       0x094dde31      0xa0f8fb5a      0x352a48ee      0x431ddccd
+       0xf83f2014      0x7a34377f      0x1aa432c4      0x8c5727e9
+       0x42e36e37      0x570ea374      0xb4c4643f      0xa15445c8
+       0xc6791cac      0xf827045d      0xf1e899fa      0xcd7c7bf0
+       0xf19a1442      0xe65b96f8      0x2c49b75b      0x0f9a8e06
+       0x8493333d      0xf120841f      0x7b357e63      0x9942def8
+       0x32ecf6e5      0x2b7b7af7      0xf744ae93      0x8c04f43f
+       0x023840aa      0x6d4336db      0xe2514620      0x83596c26
+       0x2d519cad      0xe8b2c54f      0x30af842a      0x13d8331c
+       0xee9b610d      0x25c8449f      0xcf654339      0x8690e7a8
+       0x62f295fd      0xd328114b      0x79dd4e4d      0x8637a5f3
+       0x31b71fce      0x40f48fee      0xf28f611c      0xa408fd38
+       0xea4c449e      0x20589721      0xe6a88ba0      0x358852dd
+       0xb5ee1dc5      0x8b9e6596      0xe51c70d5      0xd3ac891f
+       0x3e09b78f      0x814b0301      0x8c392bed      0x5fd0351e
+       0x20481f83      0xbf0fd0a4      0x19cf17a3      0x3bbbdcfc
+       0xd7e0673a      0xd3a43eed      0xfa1a2862      0xe8b99bbe
+       0x23f53922      0x35c68711      0x6b175228      0xb59de586
+       0x3fb571e3      0x62cffd32      0x075402d4      0x65f1eea7
+       0x2c68469f      0x67f58b84      0xa73e59d5      0x9ead311c
+       0xf5c71938      0x3d9654f4      0x70481671      0x58b45461
+       0x3759d4f5      0x376b3871      0x60733242      0x76a498c5
+       0xe279b81d      0xb43df7dd      0x831117e7      0xc0fbeda9
+       0x3784c4a7      0xe5f37177      0x8f500d62      0xe99c71e9
+       0x7a4b3daa      0x9ed0d8b7      0x469aa7c6      0x9d899657
+       0xb4069f17      0x31a69746      0x6aafee94      0xa14487b6
+       0x9c00643b      0xe80ada25      0x5214ac22      0xbdb230c5
+       0x6edfab40      0x01b5f94f      0x9f849d84      0xe93777a5
+       0x4939d6e2      0xf4fc71ab      0xfa37c156      0xbc70404b
+       0xfc1ce927      0xf9383d29      0x038d5717      0x4168bb8b
+       0x71ff37a9      0x5cdd4c2f      0x3b72f3eb      0xfb24e3be
+       0x35768d10      0x3a23273f      0x8abcc6a0      0x19e9bd07
+       0x1a330236      0x11620bde      0xdd49844e      0xdc3d6de4
+       0x1c281445      0xba0afcf9      0xd028ed33      0x9dbe4b86
+       0xa19a7b55      0x9c8d38b7      0xdc309662      0x401bfc35
+       0x3b5d1916      0xa5269114      0x8e412b76      0xf7647392
+       0xf942b7d5      0x9260adcc      0x8afee875      0xfb118859
+       0xd6804c4e      0xfb85a736      0x5dc115f0      0x3f59b455
+       0xe929debd      0x63056252      0xa148034f      0x8402d095
+       0x3e97b9a6      0xe40db503      0xf0386a46      0xed00b7b3
+       0x39bb22fc      0xddb3b098      0xba16d44b      0x5e2dde16
+       0xa6bda0f5      0x724402e2      0xb5124159      0x08e33efa
+       0xcb7f9fe7      0x9e71664e      0xb23392e7      0xe2af1dc0
+       0x0eb10493      0x968aafbb      0x28471024      0x3d381c3e
+       0x1a9733e4      0x653aa7af      0x562d42b5      0x31d86c56
+       0xca350054      0x457b1463      0x851fa734      0x44487bfc
+       0xebb40fcb      0x2695d870      0xbdd9bd58      0xad69e109
+       0xc8ef5141      0xd3c19c68      0xfd162971      0x4468a595
+       0xbd54a760      0x4322f3d9      0xaddb735c      0xc825ed17
+       0xa35f38ad      0x86deb244      0xd950d2b7      0xafe4cf81
+       0xe07e1821      0xb95a97de      0x13a266bc      0x8f4d01d9
+       0xe5276f4f      0x872f5acf      0xeebdc97f      0x7a43dee0
+       0xc2c6a943      0xa5eb8784      0x4adf3352      0x3f9dc065
+       0xe496d204      0x8af51abb      0x6475d7ed      0x667702a3
+       0x7e20c88a      0x02776ed1      0xfa888f01      0xfeeb837e
+       0xdd3d24b6      0xfba0362b      0xf03e3b68      0x74f25458
+       0x903e8f1a      0x2d3de9d1      0x9fdf3e7f      0xe12a3e43
+       0xf15bc9e9      0x3863c287      0x49004368      0xbe29845e
+       0x0bdbf633      0x5a76c7ef      0x98c23cdf      0x0d7607cf
+       0x89f7332b      0xef2be61b      0xb71c5847      0x0e27f5b1
+       0x039cfe80      0x7e903d56      0x2255045e      0x544c6d81
+       0xf94977dd      0xedfe79e1      0x50d8408a      0x73c43dba
+       0x866128a7      0xdf2133c3      0x633d31c1      0xe5cecc60
+       0x743b41ae      0xa0fabbc1      0xf1d18ab7      0xd103807d
+       0x6830fa56      0x1dcf2890      0xdf7034ff      0xdd0460d7
+       0xe4f433a2      0x682725ff      0x0a1ae47d      0x9faef3a8
+       0x4cf5284f      0x1752bc7f      0x9013813c      0x729f3c2f
+       0x920aaacf      0x1c4e03f2      0x0bce5e49      0x4a202b94
+       0xa5d0855a      0xd35e2236      0xee7fdc41      0xfc8064be
+       0xe1940fc0      0xa7dfbfb7      0x5af5c656      0xdb9d9fc7
+       0x0345d8d2      0x63ef4246      0x109c3bda      0xa7705fca
+       0x531f9f2a      0xe1824461      0x076fbcd0      0xa3f84478
+       0x39c1e1fc      0xcd6d68ff      0xd683d764      0xfc9ee692
+       0x8882a22f      0x5751ff82      0x7cf8ba19      0x9bf70f38
+       0xfd552cc2      0x65e9a628      0x6efc977d      0xdb7c6cf1
+       0xf0881a57      0xd858fa98      0x60249fdf      0x5d4c712b
+       0x6d7de508      0xb1e94228      0x7bdd41e3      0xb0f587bc
+       0x91b6ebc8      0x6fc8145f      0x560ccdfa      0xae26f3f7
+       0x3bee581c      0xe16c2219      0x473b0210      0xdc6a823b
+       0xff5e7b11      0x12787b53      0x5a1e1c1e      0x213604d7
+       0x61248c6f      0xcbfdf1bf      0xd9fa23ca      0x1690dd8e
+       0x61ef8046      0x48b6d372      0xc4569da7      0x89b2c805
+       0xed56daaa      0x73ff7451      0x0a0701bb      0xe8af7ab0
+       0x7419b74a      0x48c9abba      0xeb388644      0x02514f88
+       0x8776a046      0xbf52785f      0xa65b7abb      0xb031db8e
+       0x30722207      0x15647b89      0x300041e7      0x2c08eb5e
+       0x7d05830a      0xd8e51933      0xddbaa66b      0x6b136c2b
+       0x0fb77213      0xe7ee78d2      0xbd33b0a7      0x095e5714
+       0x3bc7a3bb      0x578d0937      0x66f3a3fb      0x166f85b0
+       0x58fa0ff0      0xaf952487      0xdc3c8a47      0xe5bd8ffd
+       0x3b846c9b      0x38261e06      0x3f08e8e7      0x354bd695
+       0xde0d33eb      0xbe505098      0x6732ef86      0x4fa4b8bf
+       0x5fd1c5ec      0x816b4a96      0xd1bc334a      0x98311a2f
+       0x3165282d      0x2dba4779      0x2bbe37da      0xaf23cf33
+       0x67ba8ea0      0xdace3214      0x9cb27eab      0x6924268d
+       0x69c19eb7      0xa89b662e      0xe9d5dc02      0x3fb9655e
+       0xd5118c4c      0x6f2888bc      0x4678ab4b      0xb93276b3
+       0xe5423906      0x1f00d0a1      0xab4e1fc4      0x64f2e39f
+       0x1f207b02      0x70c940cd      0x4a3283f7      0x83343d9d
+       0x5eed954d      0x74ba89aa      0x5ce4726d      0xdf17f716
+       0x32a7a135      0x39973f63      0x0a791cd4      0x24565097
+       0xd266128f      0x59d68959      0xc7588b8c      0x0486bb41
+       0x86ba3732      0x3a3b6d92      0x153242a6      0x1dff0d91
+       0xf79d767a      0x924081dc      0xd790fa0b      0x38f94b43
+       0x0ac25566      0x19bf2f81      0x7104b31a      0xd23401d4
+       0xc74eca0e      0xd3b49e65      0x5abf11db      0xa28bb479
+       0xf34c8996      0xf3334251      0x10cf18c6      0xc8025f38
+       0x378ae993      0xd92f6598      0xf33c3c97      0x8e3cfaec
+       0x6e2a5de2      0xaaeed089      0x313f507c      0x4eba04b8
+       0xb531d1c5      0x1f10901f      0xf8ea4c50      0xecdd5da0
+       0x77772fa8      0x42ebec15      0x0974789b      0xb9e827b9
+       0xa528577a      0x5c48609d      0xc0121c09      0xb1a8ccd4
+       0x6cef020e      0x4a46ab88      0x9d719fdd      0x2adec1f2
+       0x8b397d10      0x7d65806b      0x995f1f48      0x0ecb33d2
+       0x7245161c      0x3444b266      0x999cbc96      0xa8d3297a
+       0xc95212e8      0xab4204bc      0x30a2483e      0xbb8b2181
+       0x0094cdee      0xeb347b37      0x0a1ac9ec      0x5825c9df
+       0x5cc2fa56      0xfebdbbdf      0x6fa5c412      0xc7f327a5
+       0x13777390      0x51c71bf5      0xf4a542d8      0x8cc0990c
+       0x198e2bf5      0x419a8534      0x070d7f89      0xe7790bc3
+       0x8d1a5ef0      0x3ce23a21      0xe01ea069      0x5b9f9a00
+       0x2f8ed3e0      0x97332f38      0x001925cf      0x6e779295
+       0x739fc4d1      0xabf9944f      0x343ed8be      0x2ebf63e6
+       0xd51e34e0      0x1337d0fa      0xd7fe4c38      0xb08a0db5
+       0x40bc7d7f      0x4c212f41      0x96d3bb7c      0xd2279ce2
+       0x16eb515d      0xc110656e      0xa9e92d84      0xcedc22f7
+       0xe8706dde      0x4a76e110      0x22c3fa98      0xdb211bcd
+       0x957fc51c      0x36c29d63      0x1483afaa      0x5e39e758
+       0x814d7e6a      0x5ac931fd      0x16fbe255      0x257eb0f2
+       0x39cd3ceb      0x4ee4ba07      0x1ac38737      0xecda25d6
+       0x6ea0bdad      0x07e7a879      0x0296f80a      0x7b958ed6
+       0x575161b7      0x5f650e87      0x4289d79a      0xee7d22ab
+       0x6ff67a68      0xf4dd0a9d      0xa34c4007      0xf0a5dab9
+       0x85acc38f      0x76f87ae5      0x822abfe1      0xad687af9
+       0xded258ea      0x49f6c703      0x353272bd      0xc75758a1
+       0x6b48eb11      0xdc817270      0x4910311e      0x1cfc6962
+       0xed766448      0x61cf7dba      0xf864aa30      0x8df293ee
+       0x25c5b108      0xdd5d0fe4      0x086e588a      0x7c598f63
+       0xe7089dce      0x215f3970      0xf6bef979      0x25df09d8
+       0xa8ba0705      0xa14aec4e      0xa0ece62d      0xd99cebe5
+       0x90dae17f      0x4c419379      0x86667d85      0x3dc66e8f
+       0xd2292fc2      0x4180741f      0x5f03dacb      0xcd2f8d67
+       0xc8057a13      0xff1393e9      0xb36b309c      0x8cc016a4
+       0xfbfd12da      0x0feade1f      0x240e5e48      0xbf31d152
+       0xf591375d      0xb65a5a81      0x83a06001      0x9965ae6f
+       0x32003ace      0x7a53f92d      0xa1ded870      0x6dedb048
+       0xb93fb122      0x766aed37      0xc55cea46      0xb67eb22b
+       0x91325510      0x64a2d0f8      0x26388359      0xfb09be60
+       0x6e016f6b      0xf0002197      0x9219ec31      0xf2dfa417
+       0x819b3c73      0x6d0234d8      0x5ce80fd8      0xe8257515
+       0x1a8a86c9      0xb3c27617      0xa69dacbf      0x9417e360
+       0x40df8c3c      0x59f1f2a5      0xf75856ec      0x3ac2903b
+       0x8b73d094      0x4521bbf9      0x0a845523      0x6dd5d385
+       0x3fcf96c4      0xcecdacf6      0xc2a64486      0xf4e26ac2
+       0x51187861      0xac1e7b98      0x9f02008e      0x17a2447d
+       0x0b72467f      0x23e98819      0x4e1b81af      0x58aef855
+       0x9d47d2f0      0x15515333      0xfec897ba      0xaee89cc7
+       0xc0de21ab      0xc043e61b      0x548fe55e      0x3ea899d9
+       0x01502408      0x81962698      0xffe9bb16      0x1ba4b3fb
+       0x49f85b98      0x0540393b      0xfb173c81      0x863f9793
+       0xde7cb7f3      0x6655e382      0xc0c49ccb      0xeb8d3b0c
+       0x683b66ce      0x3d61caa6      0x78868ffb      0x392248cd
+       0x9605b7db      0xa7c83840      0x4a87ab87      0x6370860a
+       0xc350fa9d      0xd4a596d3      0xcd7c5a64      0xba6f96de
+       0xe9c2a355      0x3b946d03      0x03a9c139      0x3b83ff2f
+       0xb7483bb1      0x417c662b      0xc13005ed      0xc81c11da
+       0x105191c4      0x6f03ce06      0xe358598d      0x5629fd10
+       0x2c0d1d20      0x262f8774      0x856c333d      0xfdf25340
+       0xb666a0b4      0x94ac4952      0xddc6b991      0x9cbde852
+       0xd315c735      0x85179f2e      0x6fa62af8      0xb33ec55f
+       0xd05b166f      0x6ee23870      0x352fea75      0x7b1b987b
+       0xa87efa86      0x6d0602b5      0xfe94274e      0xeb649dfb
+       0x3973b9a1      0x08cb32b5      0x5d68e7bd      0x809d8f23
+       0xd3b679e3      0x951eb5e9      0xe2585b7b      0x1c7e73c1
+       0xefb750d0      0xc422aad2      0xdc396e18      0xa4690744
+       0xb4c36aa6      0x5fd5af3b      0x4b7cc0d3      0x4909d125
+       0x4824fb79      0x7c339f14      0x28f59be1      0x363d3777
+       0x2fc0f93a      0xbaf388ba      0xeb56afce      0x4ff249ee
+       0x03661a38      0x4bf043f9      0x7b077324      0x957ea45b
+       0xccef6c1d      0xea17b6bb      0xae8338d4      0x71dd5565
+       0x8af88bf5      0x3a18b963      0x247044ee      0x5dff0975
+       0x6a5c6636      0x58e57987      0x3416898d      0xf6343200
+       0x44267a46      0xfa332076      0xf48cf90e      0x10133045
+       0xa371e825      0x420517db      0xe55f8621      0x3d3dad24
+       0xdaaa220b      0x52cacc16      0xea856a3f      0x9f67b308
+       0x01ea7270      0x98b35b19      0xf6233e61      0xd9151928
+       0x7c38a66b      0x89f7d1be      0xc443282a      0xc1950bba
+       0x85c0cc0b      0x324eac89      0xa27ae909      0x31d9c4b7
+       0xaaba5c56      0x60e58336      0x9b788ce0      0x0b133d63
+       0x07dacceb      0xf2bb1e6d      0x42ee5003      0xbf4baa0f
+       0x6500b4fc      0x1b4cce63      0x0b302ffe      0x14de241f
+       0xbfed61b8      0x9db110b3      0xac57e0dd      0x2120d62a
+       0xe8979a5c      0x9cb6e7f8      0xf7f49032      0x3e7c33a9
+       0x780e310a      0x86e4ff19      0xda9d435f      0x84b24371
+       0xd17a5e78      0xec3d82f7      0xfa8ab863      0xf7a8c116
+       0xd9ca1c0f      0xa83ae454      0x8d3cfeec      0xf9051edc
+       0x983f992d      0x4aa4d94c      0x1c2df5ca      0x637ffe63
+       0x83df348c      0xf2af22b7      0x09ac1da0      0x41ff3eb3
+       0x5ac05404      0x34977ded      0x0ad4bf25      0x905a460c
+       0x95f35a7c      0x9cf479f4      0x681daf0a      0xe6a6eaa1
+       0xdc566718      0xa7f7057f      0x48c0003d      0xddd3cb43
+       0xb261a28a      0x38d299a9      0xd1fb08fa      0x138c965f
+       0xdab5a4f2      0xeeffae4c      0x3b3c9be8      0x38d111a2
+       0x43866ff1      0x386d136c      0xd9c4c955      0x3c89ae19
+       0xbea88e6a      0x7289dab6      0x3bc4d0c6      0xb53ca927
+       0x2585c917      0x9cb4a0ad      0xb06a4a22      0xc4b3193a
+       0xd0eefaf8      0xd05f04f2      0xa1c01106      0xb9e3c86f
+       0x870a4c40      0xf5ea7b8a      0x84b8b389      0xec2a0349
+       0x02c58178      0x7641d24b      0xda5f8d6b      0xffaabbde
+       0xf4c4b368      0x9841bb8d      0xca886f15      0xa50808cc
+       0x87aef6c6      0xe191def5      0x62cceed2      0x7422822c
+       0x9840460e      0x90fb5b26      0xe095873a      0xdf5bab2f
+       0x4dcf7004      0x3b751ed2      0xa6ff671f      0x0d63a239
+       0x2c947c16      0x8f791edb      0xd5e2e176      0x1897b16b
+       0x788f26ac      0x4faf514f      0xdc131349      0x1cc91d38
+       0x6cf64acc      0xecb6a4e2      0x3a920d0c      0x9df858f4
+       0x0a346428      0x01edce06      0xa26d5ce5      0xeb8b4478
+       0x5fe54d4c      0x9d59253c      0x5a2c2bdc      0xff52e133
+       0xa5715f09      0xc46d07c7      0x2fe11c95      0x367037c0
+       0x395c2335      0xa400d4d8      0xffbbcd93      0xf10589c5
+       0x5fe05470      0x62dcd103      0x831bd594      0xf8042f6c
+       0xfbd4e834      0x53f18136      0xdb37cc3e      0xba36b5ef
+       0x932f8a0a      0xbfd2464e      0xd790043c      0x18cddf0e
+       0xc9fe957b      0xeb06fcdd      0x658422ca      0x06105ad4
+       0x4fb90483      0xf513562a      0xf8de755a      0x2b3f4a4c
+       0x9ca4c51a      0xbe9895dd      0xc31b38d3      0x9c8bb7a5
+       0x55c7c5e7      0x75fa0c7a      0xea27c61f      0xe5a176ee
+       0x6ed35a19      0x4dbcf9f6      0xf9957451      0xc8069744
+       0x682b653a      0xc6ffa275      0xe274804e      0x1f74a248
+       0xdd1a6bea      0x61bfc414      0xa12035cc      0xeb4d91b5
+       0xe908d527      0x7e1bd310      0xa5095e94      0xf1af1fe4
+       0x79fc7ade      0x549c9189      0xc20aaf51      0xaadca08f
+       0xa6bc836c      0xe6f304b2      0x614815c1      0x940d62f6
+       0xb6a2e309      0xda518187      0x3fc3b671      0x6e596f6f
+       0xecf24a59      0x5a6130fb      0xfe863237      0x3eab2f43
+       0x008fd345      0xb84dbbb3      0x17f3df84      0xa77046b0
+       0x80fe3806      0x2c9fd8be      0x98bd4be4      0xf0c9d9ac
+       0x01443cc0      0x1fa6e5e8      0x3413872a      0xfbd252ab
+       0xc4f1b4c7      0x178cc63b      0xf3a6e182      0xaebe4595
+       0xc9de7c32      0x6c1cd5ec      0x6a0ab8eb      0xe83312cd
+       0x012c7e93      0x7edd1c8a      0x4b6a751f      0x074eee6b
+       0xb79259f7      0x93963d5f      0x7bd5cda6      0x22852976
+       0x39f2e9a2      0x8f4bc0a7      0x0419312c      0xe4be5fec
+       0x6c8dc91c      0x14e59f50      0x85f17c97      0x865604f8
+       0x21c3bdd7      0x65dae217      0xb7071263      0xdb7f2d71
+       0x85f83e68      0x67be49f5      0x2fa8b9bb      0xa6c09ed5
+       0x49e9b467      0x871995eb      0x267a6ee0      0x7d7aa401
+       0xf094e6f4      0x2bd0096e      0x05d4801a      0xff33cebc
+       0xc54c1678      0x628736d4      0xb98cca32      0xfbfe5e7b
+       0x277c98c1      0x2eba7546      0xa41a9b3a      0x5c232d15
+       0xfc62c9fa      0xcb27f7a1      0xbb21a120      0x2987fa3f
+       0xc20a868a      0x592f3543      0xf6ba1c61      0xe9aeead4
+       0x0ced340d      0x484ea274      0xe8e7205f      0xf4d42151
+       0x8d63652f      0x5df919ba      0xc782202e      0x00b5558a
+       0x058ac4b7      0xf7ed3616      0xaaf532ca      0x0466f7e1
+       0xc715de7d      0x891abb16      0xd3f1edec      0x703e7d46
+       0xabcaff31      0x65da8b73      0xdb78bc96      0xb90676de
+       0x5d7426ac      0xf19f71aa      0xaf3c8094      0xbe384c5d
+       0xb1845940      0x058f5892      0x01f1e3cd      0xeecefb78
+       0x216f47ef      0x83ce4dd4      0x99a2a92e      0x5f489e0e
+       0x0030accb      0x10a522b5      0xc0e9bf92      0xbe72aaae
+       0x2868b69a      0xe16d004d      0x68cdf097      0xf0c81e42
+       0xfb771c2e      0x6c49e356      0xdf43fa86      0x6f8fdd69
+       0xe8efde9a      0x61104a22      0x9314ea71      0x4f9833d0
+       0x02d83ff3      0xb68e7a13      0x0734b8ec      0x8cebe42a
+       0x995c5419      0x77dc758e      0x40926526      0x63d5e2ec
+       0x53451011      0xdb095010      0xf04c8959      0x84fc2ade
+       0x6a8d1f9b      0xab4a694a      0xb68e3295      0x2c33244c
+       0xb756684a      0x8824b6dc      0xc7718d09      0x2c78a0b1
+       0xd6df2d21      0x1d84fdc2      0xef8449dc      0xb84516b6
+       0x1654ccf5      0x58d50227      0x775f49a4      0xa0efdc64
+       0x2f5c7ab6      0x8d5cebe6      0xe005d427      0x9d5a2340
+       0xf6960126      0xf7d1db59      0xc0d6d6a3      0x74cb7b1b
+       0xf802dbca      0x90a9f81b      0x0e8bb4b6      0xe6a3ef4c
+       0xdcc932d8      0x89b76667      0x8a6a225b      0x90762ae8
+       0x0f1f6328      0xd3b7db8e      0x979d5e9a      0x5e617a2b
+       0x4c3ee8e9      0x2af196fa      0xca0a130f      0xc013619d
+       0x64a456e2      0x066900f9      0xbf5ed7a8      0x38a68296
+       0x53ef7330      0xe823e118      0x6217d7c0      0x5e73506f
+       0x42a7702b      0xce68f476      0x747461b6      0xc9ad8bc6
+       0x6c189fb1      0xe9a4f518      0x7fa18264      0x01c1a852
+       0x1344ca0a      0x29ca755c      0x63b7079a      0x4d8c8683
+       0x0c0633db      0xa470e228      0x62cabbf5      0x9e8095b9
+       0x119922c7      0x7ba0b8eb      0x3766faee      0x7cc8deba
+       0xddf20b61      0x61b04695      0x03baee6b      0xe0246a67
+       0xf10a42e2      0xa3dc8a00      0xdd5d9f77      0xe1f1dcc4
+       0x3772369b      0xace130c6      0xbbf5fb88      0xdf454e32
+       0xc25df6b3      0x83c2d8e7      0x9cd44e3b      0xf45e8cd6
+       0x7b94d7bb      0x53b5f935      0x46006c16      0x5d342245
+       0x9621d860      0xe4f4e4cf      0xe1788871      0x1045d508
+       0xfd114bfd      0xec6966a2      0xeb6aff51      0xb03a7abb
+       0xe3766706      0x757ed7fd      0xd18e949c      0xef3f6251
+       0x9787316a      0x506cb265      0xd48cb59d      0xecb463d0
+       0xbd84346c      0x4b8360d2      0xb26d8c6a      0x450ff5bc
+       0x3ba3fbe4      0x93ee71f7      0xd2601c87      0x1aec2358
+       0x844a5d34      0x80b40953      0xa9207cb2      0x26076dd2
+       0x6a2a5343      0x589d94ac      0x3c1b0455      0x7e9c1526
+       0x9e651ce4      0x756809f9      0xd67cfec3      0xa6e987a8
+       0x74111b0a      0x95bf18d6      0x883ba1c5      0xb439a503
+       0x47b994c0      0xa08ed9ac      0x299c05a4      0x6c4a726a
+       0xdc15ec63      0xc2548b1b      0xc7b6d9c9      0x1e3fca68
+       0x8ae69b33      0x0d534ee8      0xccbc545c      0x69d8a57c
+       0x5f024f9e      0x453f469a      0xdfc42c44      0xd4a9346b
+       0x4dd997f4      0x5cd6e314      0x449335b2      0xfab68310
+       0x5a8a47e2      0xbdd8071c      0xeffc2195      0x18b06efc
+       0xfe7f3523      0xfa086966      0x7c006f79      0x87a0bcc3
+       0x693a04c3      0xf0950720      0xe0bea427      0xa12e6b4b
+       0xe3f1e30a      0xc1a2cc7b      0xbf95627c      0x123ad686
+       0xb253fb89      0x124f86ca      0x59c98e2e      0xddd47f2f
+       0x2dbd08c1      0xd0f061e2      0x3d41b8ba      0x86c36a10
+       0x24e75d20      0xa93674ed      0xd50f71e4      0xeac56eb7
+       0x5e95e65d      0x6ebe1bec      0x5f0f3adb      0xd30659cc
+       0x1ed0f17d      0xab3d79f5      0x906ec76b      0x0617fc88
+       0x126cef95      0xc7191ce3      0xd89e162e      0x4fbd2727
+       0x17b7a6a1      0x06151f52      0x73f6f1b2      0x37d20679
+       0xea9a9e5f      0xf483a7a1      0x37bb2981      0x300afd63
+       0xa168aa2f      0x0f1b60c8      0x73cd1a34      0x3ede2d95
+       0xacfa2c19      0xa6ef9928      0xb5410e65      0x5679d314
+       0x3b9ec3f1      0x0873a9b2      0xfe3eed93      0x01909bea
+       0x1c062fa3      0x9f4f9dee      0xad180d14      0x3a77f62e
+       0x903cd80b      0xdd716284      0x5d3a17e3      0xf33557db
+       0x5593cd64      0x280a25e8      0xf27720d7      0x016386e5
+       0x3eaa11dc      0xafe1dbab      0xab939bcb      0x10505da8
+       0x80f18377      0x5adb5fd6      0x2a80f194      0xf893c3e5
+       0xc575996b      0xbb898847      0xb9911094      0x3052115e
+       0x1b5be836      0xc7ff13be      0x34256191      0x159c5ea2
+       0x3a09a25a      0x5f6fe241      0x234a29cc      0x0071906a
+       0x9c3dceba      0xa0eee574      0xf7b2e1fa      0x7b16551a
+       0xe603659e      0xfcdfc6a4      0x85e43b4d      0x0c926271
+       0x615365fb      0x89e17565      0x07ab1a68      0x64555432
+       0xa0a4797c      0xa16ecc13      0xd8e6fa59      0xce8476be
+       0xc736b7c5      0x9ea33c44      0xb0097071      0xc4344f6a
+       0x9984f945      0x3a147fc2      0x59c59ff7      0xbd0af922
+       0x85dbb525      0xb57272e5      0x7f1ce809      0x3c5998e3
+       0x961b649f      0x5bc2b19a      0x272cc085      0xb0440956
+       0x0755da18      0x92c90f51      0x3efdc205      0xb3ad184c
+       0xf27700ea      0x56cb6d6f      0x8e931a0b      0x8b54c662
+       0xe12ae153      0x0fe92413      0xa4fb9a0b      0x5ac60a46
+       0xeb0da138      0xe0cbe58c      0x3a916aca      0x7eb879e0
+       0x2d000d97      0x2bdbbcff      0xd114dc63      0xd510235f
+       0xc5651eb6      0xc936dda0      0x3695d532      0x92e3d72b
+       0x5e298a2e      0x32064f5f      0x74b1d5bc      0xe499bb8f
+       0x9e69b8a6      0xa2ba91b1      0x665e010e      0xf540755c
+       0xa4481061      0x6a8b6038      0xefcd2326      0xfc35b7dc
+       0x2a9ff1e3      0xeeb9fb5a      0x3e2e55da      0xe666d0b7
+       0x425febc6      0x5e43d9f7      0x530bcc47      0xd0ff91de
+       0x4c69f7bf      0xfbd112b9      0xe09693c6      0xa3b840aa
+       0x0cdff6e4      0xb7c110ab      0xd0610264      0x1c358890
+       0x2ae72b61      0x2c777a83      0x03d82504      0x773df708
+       0xc055721f      0xc0469e23      0x9843663b      0xe6f8ba58
+       0x32a3b083      0x00c04321      0xfff85d06      0x9811ad10
+       0x7e084d4e      0xb51271c3      0x73c3e909      0x6f4dc689
+       0xed6bc204      0x6bfcf9d6      0xae6badb3      0xba47a39b
+       0x956a9ae2      0x2fbfcc3d      0xa7c82312      0xa997e4eb
+       0x084f5bfd      0x49e42545      0x0149311b      0x8f2565a3
+       0x6b59cf2f      0x350d5b66      0x44d703b5      0xc7c1a080
+       0x23e7718e      0xa94c33f8      0x6b3449f8      0x35dbe5d5
+       0xcd64f37e      0x0653ccd0      0xfeb5ffc3      0xa1cb2c2d
+       0x29d709ac      0x9f7f92c5      0xd39970bd      0xa6941c48
+       0xbeea817d      0xb16290b2      0xe7fa1175      0x04eb43e6
+       0x1738a55e      0xd4bb4d56      0x93e37393      0x062dec67
+       0x2beda16e      0xa10873fa      0x2e6c8434      0x794a42ff
+       0xb07934fa      0x7b6ac0c5      0x1ea05365      0xe3f1bbda
+       0x20b2363e      0xc03fa440      0xaa2936e1      0x5c08a05b
+       0x6a39c1e5      0xd6f678d3      0xbd1cc401      0x93ac898a
+       0x20942d76      0x7852a50f      0x544139ed      0x1537e6bf
+       0xf0539bf4      0x0a2708f3      0xd2f83a02      0x1cba26d2
+       0x86443e0e      0x62d0229f      0x4b2d945d      0x1f1c1f28
+       0xb497e8ca      0xba3e04e5      0x522509c7      0x192f77ef
+       0xef7da5e0      0x7a759321      0x41b83ff4      0x6c646590
+       0x30f48620      0x6a5612fb      0x42832c7a      0x2574928e
+       0xd6e388a5      0x9345eec0      0x167ffb91      0x4168d51e
+       0xb8b646d8      0x75646e79      0x974db936      0xc02a6e1d
+       0x3c995264      0xb2d0c32f      0x29822c7f      0xe74eeb5d
+       0xe03580eb      0x8319b856      0x0d1d271d      0x8ad42434
+       0x96651fa1      0x5564df67      0xc9ef4ef8      0x71302d3f
+       0x72226833      0xc97b6c5d      0x20610c32      0x01f874f3
+       0x622fcc68      0x081e4913      0xf830a20c      0x11a7964a
+       0x85b88912      0x52358837      0x90acc6da      0x5c0bebee
+       0xc40bfb78      0x83adc676      0x454f72b8      0x1776e8b1
+       0x0f298261      0xe2e4e4ec      0x2b3130df      0xaeee0c65
+       0x33ce26e0      0xb3577250      0xbeafcd81      0xc6c7138a
+       0xd700eb30      0x3bb1b274      0xc71598d7      0xfd7a7f26
+       0x38add452      0x8574241b      0xf596bf98      0x6785b542
+       0x4631cae3      0x2220df5e      0xffe77fd9      0x87fba210
+       0x6b145970      0x144c0e9c      0xf5bd939c      0x41d32ae4
+       0x43b35b0a      0x59c8f792      0x355355c4      0x6a2b17bd
+       0xcdcfefcb      0xdbf1dbc0      0x609e35ac      0x0ecb8b52
+       0x9c3a4f1b      0xa33870c0      0xa381d6ec      0xb386f4aa
+       0x5ae62eef      0xdf19932f      0x4d76d341      0xf26cfcce
+       0x83a36919      0xf6738880      0xaa9228cd      0xbff13a9d
+       0x6d8e63a8      0xc75f28eb      0xde816caf      0x21b1c98b
+       0x134ac097      0xbfc29aa6      0xa393e847      0xe1795918
+       0x8c5f1b5d      0x18f10df2      0xfd98960b      0x82176151
+       0x7509e711      0x73b9ee6d      0x2c11cad3      0xb8e5b028
+       0x2ab11953      0xda19e17b      0x3fe13700      0x96cc4c45
+       0x19612a6f      0x6b216822      0x4dc650e5      0xa0f67fe6
+       0x2860722b      0xebbfd77c      0xe9f8306a      0xbd1cfe5d
+       0x9f8520c2      0x4826927b      0xa6e8c777      0x91cf868d
+       0x2ef6e415      0xa66db818      0xb5c371d1      0x3d2e27f6
+       0x3c85744d      0x4fd2deaa      0xbdd81f53      0xf652b345
+       0x87ca0ec8      0xf9b7373d      0x19859129      0x71872f82
+       0x9efabd33      0x1d965b6a      0x8d4bbb05      0xc69dd6e6
+       0x0cc18042      0x4cbf6954      0x0ffffcba      0xec26cc1a
+       0x134d3aee      0x7224df40      0x701f74df      0x80b0d9a8
+       0xc835f80d      0xfee03bb0      0x67e78ebe      0x8daec7b4
+       0xb0999490      0xfcddb4e8      0x19a339f8      0xadb71117
+       0xf1ac4cbd      0xe83402f7      0xd0404953      0xdc6e386b
+       0xb0331448      0x7a80ea7d      0x1cf9cda7      0x9fcd458d
+       0xfd023527      0x66e58053      0x573800d6      0xdd2c9579
+       0xc387c6c1      0xf4bf2199      0xde150280      0xd22eac26
+       0x50cdc5fa      0x8ca12024      0xa90a1e65      0xa7393b56
+       0x8314e967      0x08deee83      0xff1b467b      0xc57ebb67
+       0x3a94253c      0x859efcdd      0x8d0a085b      0xda771c92
+       0x846af9d0      0x8005a917      0xe0985eb5      0x82ca31d7
+       0x9e862be7      0x182365f8      0xfbde08db      0xe2070ffb
+       0xf789f749      0x43e284b1      0xfebfe41b      0x43c24bd8
+       0xb5b96980      0x411ad230      0x5d2d20ae      0x6a81b066
+       0xb9d7499c      0x5f2ec4ca      0x7c0743ac      0xa66bb574
+       0x9dd48615      0x5d7d7e96      0x9fec85c9      0x8e61a725
+       0x206c4d3e      0x73b5d242      0x1359bdbb      0x61a357a5
+       0xb95f058f      0x3e519639      0xe8d4cfee      0x767253b4
+       0x3bd93d26      0x1310035f      0x172fe3ef      0x44d5f736
+       0xf8218b94      0x4e217ff7      0x7b889089      0xb1cc6b4e
+       0x1094227f      0x4a8f39c7      0xb9767d40      0xc0d8a4d7
+       0x983431d3      0x7688316b      0x2a37d76c      0x92c14d2e
+       0x395db078      0xc682c142      0x2e16782e      0xfa052bd5
+       0xd1248d63      0xcd9d1fb5      0x0ea954ae      0x2a378a49
+       0xc32815e9      0xc1381b26      0xf2f2ea46      0x7e0ac5a8
+       0xfc8b9b7f      0xa09d0266      0x511d3d2d      0x9488f11e
+       0xbfe7037c      0xc3dd86bf      0x0d368472      0xff07b3b0
+       0x3eaf3450      0xda9995b8      0x21af9375      0x4ad5b401
+       0x8e874afb      0x17358bb5      0x20905355      0x994a56f1
+       0x6c0d0b46      0xaa2c474b      0x92e7c153      0x7a0f16ef
+       0x9a5b5068      0xbd9bf73c      0x0e62a1b6      0x1337bd97
+       0x1c575823      0xc9d3a4f3      0xd4dd3f92      0x670048d8
+       0x7bccbcd4      0x2cc48caa      0x6391a9fc      0x504b86ba
+       0x6afda937      0xe11a8b22      0xb3a9b260      0x4870e243
+       0xa895fbb4      0x6dc3fa91      0x3f0f87ed      0x552b7c53
+       0xf5d866ad      0x9fd0c9b5      0x330e3e93      0x9366084a
+       0x427e792c      0x2ca2e653      0xedc14ee4      0x62a4fdb0
+       0x9a4fb34d      0x49c9ef8b      0x9dd9dbd8      0x287a5863
+       0x5338e4b9      0x09de2dff      0xde64dddc      0xc4dde910
+       0x1f8e9962      0x144f6437      0x9848dc67      0x2674682e
+       0x8f914818      0x04b1971f      0xfdb3ff8e      0x585d9e1d
+       0xe365dab8      0x84ea6149      0x54933b51      0x1c92c025
+       0x43c4475c      0x066e4d9b      0x2d7e837b      0x6b8276ba
+       0xfb0ba618      0x2386546e      0x2d3cfd88      0x354a0896
+       0x9a4dbc00      0x321910dd      0x630ce2e3      0x8fa81a9c
+       0xd2e03c87      0x73119e29      0x45352381      0xa9682006
+       0x1fb516df      0x64d22b4d      0xeac1648b      0xc2f29243
+       0x693ce48a      0x7c7db02c      0x7a32e833      0xeb0bfd4b
+       0x3b7fa87e      0x478665dd      0x021813b9      0xc044ccb2
+       0xb3e18708      0x455f2e57      0xd62563ff      0xb03fdee5
+       0x295320d1      0x4b9b793d      0x8e3b1d3c      0x4df2c6e8
+       0x1bc7ccea      0x200cde8d      0x9f4a1d1c      0xcf52ac9d
+       0x1e9f3758      0xa2039bf4      0xfd21eb46      0x501c1fad
+       0xbe8b9a79      0x244c6179      0xa141d6b2      0x458acb5e
+       0x05e036a7      0x56bd83c3      0x488946c3      0x1723be53
+       0xac579ab1      0x72c9ab9b      0xd299736c      0xa46d18bc
+       0x05f29f68      0x330856e9      0x9c3cca59      0x6766f4e8
+       0x2442ed07      0x4302b7aa      0x95b73fc2      0xf7f70673
+       0x47f8006b      0x5445fa8d      0x535338f6      0xac29315e
+       0x52df8cd4      0xc5f86670      0x33b5152d      0xf3c3fcee
+       0x45d6b944      0xdb4ef73d      0x5f4e2d47      0xfcb182df
+       0xe0415c05      0x5e423d91      0xb2a77337      0x8ded2af1
+       0xfd2a41b6      0x38b6da43      0xeb08fde3      0xa8b92f71
+       0x6033938b      0x916fc8fb      0xa1cb0bb9      0xd43d0dd8
+       0x265ccaf4      0x6ab46630      0xb5b7fca8      0x1cdc8fab
+       0x5d57f907      0x731b1c98      0x13f06a7a      0x52d40403
+       0x90838f2e      0x174c3545      0x79a5bfda      0x9a61823e
+       0x74057ca9      0x352c1c28      0x9423416c      0x04567712
+       0xcf8df7ca      0x788ad050      0x79eb1e57      0xe480f4bf
+       0xe666c03d      0x7f764d8b      0x87b54e90      0x4ad4c310
+       0xc76f14fc      0x8d31c3cc      0xd385c7de      0xc3c62ea3
+       0x756a84ed      0x6093ba49      0x865a843b      0x15a21f31
+       0x491e7d8c      0x6a85ead4      0xc23d7071      0xfee65ab3
+       0x4dbb128c      0x8756a2c8      0xe41bea19      0x6b646205
+       0x4f612363      0x102f1b65      0x50c42444      0xd66b72ac
+       0xd0a5d189      0xbbb48835      0xfaed0f85      0x35299dbd
+       0xae520e37      0xbc62d5b6      0x9fc997ce      0x4285c1f2
+       0x144b2062      0xdd2bfab3      0x34ca7ad5      0x5b0b96b1
+       0x4f5f5030      0xc6235ceb      0xbda53252      0x8d9d9c6a
+       0x91e27091      0x584cb5b4      0x118a16fd      0x6e7307ec
+       0x967dc77b      0xe25f67fc      0x71df26e3      0xf2140483
+       0x950ab226      0x98565d79      0x13c1dc8d      0xa7bbd9b8
+       0xfea3a85f      0x0514f498      0x67a9ae82      0x0b794d65
+       0x910cf547      0xac89285b      0xb7d20b88      0xdcb0d698
+       0xacec261b      0xb85e4354      0xfeb44708      0xe16daab6
+       0xe39ea8d7      0x270d9917      0xf4c443ba      0xca1ee7c6
+       0x3b772ba7      0x5db5b518      0x30743f87      0x89ea8485
+       0xebe34ec9      0x92e785bb      0x9bab88c5      0xa567d991
+       0x0834a6c7      0x3bf34a62      0x5ea7165d      0xfd765d50
+       0x1d339374      0x393ae576      0x44615546      0x94966490
+       0x522d0d58      0xc3f84daa      0xff9b3090      0x0a2b777a
+       0x9d147f93      0x7484b82d      0x7e42ce9a      0x2479cbf2
+       0xed5e8671      0x48a3fd5d      0x8c0efe67      0x57514a6a
+       0xb2d59c23      0xac1bce8e      0x9d865295      0xbf2d52f9
+       0x99eb3289      0xe9ec608d      0xdc8865fe      0x62a1d008
+       0x09e75fb8      0x14eed62f      0xb1d983c1      0x18ffc5dc
+       0x676dd012      0xd5ad1d1c      0x24089ea9      0x7b6b886b
+       0x5b597f41      0xbc45f33e      0x0607aa61      0x4c24a7d5
+       0x7c95d063      0x95bbdb62      0x54e9359a      0x64ca6b54
+       0xa8697963      0x3ac8c630      0x659a0575      0xdcf3f3df
+       0xc85e85e1      0x0be24ca6      0x754e3262      0x2ae09cc4
+       0x141edd9d      0x293850c7      0xc4d06e42      0x1db7681d
+       0x509c1d65      0xd4d25a9c      0x8b62e86e      0x7bf06aad
+       0x577b51ab      0x546dffe2      0x68a1cc2d      0x4dfbfaa4
+       0x900b86e9      0xd772e5b6      0x53b2cd20      0xd429c80c
+       0x4df53704      0x7c591d73      0xc37bf9cd      0x405de0b9
+       0xbf61eefb      0xf78d710e      0x771bfc4e      0x295bbb57
+       0x57e03c7f      0x458dcf94      0x6cfa44c5      0x8b37c19d
+       0xf6b700cd      0xee83a2e0      0xa69e0524      0xb5e8c23b
+       0xfadd16fa      0x92103411      0xf7691e93      0x024d5d01
+       0xc8f1a6bb      0xc52ae4b6      0x1481a804      0x76c3addd
+       0x4a5b380e      0x05a06be2      0x8280fad0      0x7eefcb56
+       0x6e7dbd22      0xe368006d      0x2bf09a2d      0xf19dcdea
+       0x28bed5fd      0x4a5c7584      0x3f27e5cd      0xd93992d1
+       0x05f76867      0x783a60eb      0x207ef64e      0xc55256ff
+       0xe5d8982e      0xde4fed52      0x5c407fb2      0x693745b5
+       0x67b5e2ba      0xc5141e02      0x7f8a949d      0x4bdecc6e
+       0xede07b33      0x36190f68      0x67e701a2      0x05498bb4
+       0xf320cb59      0x7c38504a      0xb6d4d813      0x2c1c0ec2
+       0x70d1628b      0x69fe9eb2      0xce721143      0x3bc1a755
+       0x22d0f125      0xbd270909      0x75fd4507      0xc86bc8af
+       0x668d01a0      0xf5f15c8f      0x46a790f7      0xb4b1cc3d
+       0xcb1e47a6      0x49f6ac3d      0xc749f955      0x71dfb5b5
+       0xe69aa8af      0x68ea10ff      0xdeeef051      0xd28eca7e
+       0xee70f434      0xdfc239a9      0xf32e58be      0xc7e4c16e
+       0x009ea4f0      0x3c704ace      0x998ba989      0x90303963
+       0xa881bb08      0x9fe1a2a8      0xa9302aa3      0x8e12260d
+       0xd8344e74      0x0b2229df      0x1de95390      0xa69dc5fe
+       0x4d2448c5      0x592dd6f9      0x66a0ff0e      0xcae3e34e
+       0xf5692970      0xc8f6a8c2      0xef6d6cc6      0x995781d9
+       0xb9b19cf2      0xf29ca8ce      0x805b80b5      0x566996a3
+       0x20c14749      0x7f7dc821      0x33b1048c      0x1d77e93f
+       0xc9924712      0xea25b7de      0x54e82316      0xbad33995
+       0x7ce5f207      0xb89032e4      0x970a6002      0x12f0cee1
+       0xfa5ff132      0x2f7c4ce8      0xa09d3c01      0x5d584790
+       0x0f019e8c      0xc140fd07      0x2ada9dde      0x3beb0ad5
+       0x0f5324f7      0x400dc16e      0x9fcaa586      0xb7cafe7e
+       0xc329b81d      0x2a52a2fa      0x41cfd08b      0x8691f7b2
+       0x88bd93f5      0x01846265      0xe5dde3dc      0xc0acf5d0
+       0x4f4951ac      0xe12d4537      0x8f897a4e      0x4e61554b
+       0xbc9daab2      0x82b1de59      0x77aa65a9      0x78dd3dcf
+       0xc457dc3a      0x8df6cdd6      0xafa82b4d      0xf892d037
+       0x15659e6f      0xd1da82f5      0x51b1da6d      0x8f8a0058
+       0x8f3da547      0x3a4c96a1      0x6c520f93      0x2560ea69
+       0xff562ca0      0x8849e4ab      0xb94bd186      0x81d83d63
+       0xd62100f2      0x10b53f77      0x3f2f3e10      0xea85a3fb
+       0x3c14492d      0x94972b24      0xee409e55      0x3fe09f34
+       0xe5bc0387      0xdbf6ed07      0xd2a13228      0x1342a4b3
+       0x8c1e9332      0x67460ce5      0xedc055ef      0xb33c3a6a
+       0x1fecac27      0x105c822d      0x38e69161      0x8ad10c3c
+       0x6c409f8c      0x10f13a50      0x9bfaadde      0xd547a844
+       0xe604518d      0xc97c118c      0x7a962a31      0xcc3f7448
+       0xa53cf973      0x39608fa7      0x2efa96ba      0xf0a05821
+       0x5054d76a      0xb17f737b      0xd7e00db5      0x5fdfe3e6
+       0xa28102d2      0x2b94e4e1      0x0f39bc76      0xdd012a05
+       0x2fb574f4      0x16395501      0x74130e6b      0x328629a6
+       0xf9fb7d2b      0x3d68bdcf      0xc5f03b6b      0x918f5026
+       0x9cc0e54d      0x246c0133      0x3b2cac9c      0x198d8cba
+       0x165c8ae3      0x4e1222fe      0xe3358ab8      0xbb920fa6
+       0xd3efae9b      0x9b1ae032      0x71ef638d      0x37c980be
+       0x683b26b3      0xcfca82d6      0x8daae26c      0xca7952a2
+       0x6c1f14cc      0x0c125b4f      0x6088cd18      0xca6fa30b
+       0x67a717d2      0x4af87e50      0x0b8d486c      0xee99aee2
+       0x8211f817      0xda042d81      0x4d4e8b3f      0x5ed4f785
+       0xb735b1e5      0xa221f19c      0x79c8c3ef      0x5f534751
+       0xe687519a      0x9c4b3c01      0x3e2e8920      0xc3fc6c9a
+       0x1fe57afe      0x042d100b      0x6704bb3b      0x385ae3bc
+       0x7a95f242      0xf063b32e      0x446a6205      0xbdea4286
+       0x89590a8b      0xf29abccd      0xab76135b      0xe3c51cf7
+       0xfe3d8718      0x9af8d666      0xd741a492      0x93f745ae
+       0xffdd5db8      0xe98f3ab4      0xf7f41efa      0x6cc9cbda
+       0x236ebf0a      0xde0b085c      0x2da1474b      0x127ef5d8
+       0xd3400d6c      0x7b9835d4      0xea2ccd18      0x7a44dbf6
+       0x20344986      0xd04719b5      0xfddecbde      0x4b3bc441
+       0xfb3ef6fc      0x3ba485e3      0xc9745a29      0x1d11db63
+       0x4b7beb71      0x5c3cc855      0x30b18cb9      0x2f0875ab
+       0x821b49fc      0xb67545d3      0xe8224e1a      0x7bc30424
+       0x08a741b1      0xb1d782e8      0xf5f92b42      0xf866a709
+       0x9df02c1e      0xb90be338      0xcfd3b7d0      0xd363a325
+       0x75ef0539      0xe6ce8816      0xed1a6ed8      0x0276b3d3
+       0xf8410ec6      0xb34b11a8      0x1a1feb78      0x37059c61
+       0xd9fc291f      0xa907066c      0x0bb622f7      0x4b5b8394
+       0x3cb593b6      0xa85f939d      0x3e752988      0xcc036b5a
+       0xaab617ed      0xdb4c7404      0x3112ffd8      0xa64d7ed1
+       0xe3e21689      0x100c07f6      0x88712b27      0x5ff60870
+       0x5ad52931      0xa588761b      0xe27bba56      0x40290b22
+       0x81c2ec99      0xd96dc1fd      0x743bc863      0xa9bc83b8
+       0x6c1f57b1      0xb3e49963      0x0e68216c      0x3b91e56b
+       0x0d0044fb      0xb771b566      0xb9bfb5e6      0x539c1238
+       0x6537f6f6      0xf3212291      0xca9a7eee      0x94fe56ea
+       0xff23247a      0x18845146      0xa9b4acec      0xbf88cd08
+       0xa8bd56db      0xbc48ddd8      0xc9e534e5      0xfb26bc94
+       0xeb2aab50      0x083e1f38      0xa1cc8db0      0xf6b7388a
+       0x07ab2148      0x08102d67      0xfbc9db3d      0xda9309ae
+       0xe1566f9e      0xa5b5013c      0xe95f5cbe      0x5a2f0891
+       0xc407cd12      0x72f2541c      0xc73d9dc0      0x000326c4
+       0xf5df8f04      0x04a46fd9      0xda0b0045      0xc0db427d
+       0x279e6218      0xf65ecee2      0x54207683      0x5f2136d1
+       0x31db49a4      0xbee12a37      0x8aec9367      0xae726b4f
+       0x79926b22      0x7b8d6817      0x3566839f      0xaa6778c4
+       0xcbf46909      0x2c4db79d      0x9cd111b2      0xd06c19a8
+       0x4e05be08      0xb385e8ba      0x1a97778d      0x3a999b16
+       0x1f27e052      0x360a451b      0xcecd5085      0xd3b98b80
+       0x60de8dc1      0x9492c191      0x6dfb20b6      0x82a2845e
+       0xfa474090      0x2f639c3c      0xb7778b58      0xe70b3e08
+       0x92e7ed04      0x16330fd7      0xa60979ce      0x37db1b61
+       0xd5b1c551      0xa1750ddb      0x35cabc02      0x7017d4d5
+       0xd7b489ca      0x385a53c0      0x5140692f      0x137807aa
+       0x4d5c15ca      0x4d8e2959      0x7309d85f      0x56620777
+       0x3b94136c      0x45cd588f      0x16175db0      0xb0189180
+       0xf7d77e22      0x72bf5c2b      0xd72bf217      0x4f440f3c
+       0x55efeb82      0xfd328176      0x991c948e      0x18db77b4
+       0x8cb7c363      0xa6db597c      0xbc0eae6e      0x5314ad9d
+       0x9e9a823e      0x0ad007b3      0x7c14dc3d      0x4fc184dc
+       0xcf15e0d5      0xf32b2740      0xf5cde28e      0xc71bb3e6
+       0x32710afb      0xce14c151      0xc8e1f0dd      0x4f79c217
+       0x224c6f25      0xa638f90f      0x9960b361      0x3bafdd53
+       0xee1e338e      0x74a43972      0xe917e85e      0x68f6623b
+       0x779950ef      0x35f45667      0x4d9f7b72      0x306cb60e
+       0x96be7043      0x82574ab5      0x51ecdf6f      0x5e89a588
+       0xeacbd163      0x8c1a51f5      0xc0cc9b39      0x0d9e650f
+       0x947a3e4f      0xb2f964ef      0x9db5a2e4      0xcdc5d80e
+       0x27491175      0xbb7e60f9      0xe3f1352d      0xfc06d400
+       0x45efed2a      0x80416fb8      0x5d391fbe      0xd9e790a7
+       0x3c62de10      0xe5b340e2      0xd7586e54      0x0bba5041
+       0xcfdb2dae      0xdf6d5e8e      0x86331542      0xfd291355
+       0x4804bbef      0xcb119296      0xcaf2989c      0x2ede7994
+       0x2b8b67a5      0xf21f05f4      0x4ffbfcd7      0xf11da934
+       0x2a725603      0x01340ad6      0xbe618780      0x404eb1e3
+       0xb5b9fdea      0x1117c89f      0xe5a203d4      0x2f518cc0
+       0xf5de0b36      0xc010b1c8      0x583c3089      0x5df76333
+       0xc1114ae8      0xb4baa895      0x7d57dc83      0x46e9a215
+       0x9ae829bf      0xea95a2ec      0x641bdac5      0x27c1b542
+       0x9776ecd8      0x673f1573      0xc59e6618      0x62b7b3f4
+       0x89f41db6      0x0e4cd877      0xbad7e43b      0x999863fc
+       0x0508928a      0x87dbb0e8      0x346aacb8      0x0ea45e00
+       0x89372f68      0xba63fc87      0x2ca89806      0x6b1150b2
+       0xefe81331      0x75b64ff8      0x653271d2      0x7c4a369e
+       0xff84d22f      0x4498d4d7      0x9819b64c      0x13603c8a
+       0x0a11e11f      0x83829df2      0xfbe75676      0xa0956257
+       0x3925356f      0xc58c2253      0x52fb552e      0x65cc18bb
+       0xcb96dcf2      0xf0ea23cf      0x09e63554      0x6ac78cc6
+       0xcd928046      0x56967dff      0x11d6e16f      0x68d423a8
+       0x0ea348fe      0xc11fffc8      0x554dc1c1      0x63e81f0c
+       0xf5a5b517      0x7a145d8d      0xe6764ad1      0x9ebefdf2
+       0x1ea700ba      0x7a41e49e      0xac6ad2ec      0x32430937
+       0x78c0c0a9      0x0d186685      0x12311c87      0x12334cef
+       0xa8f981cf      0x97e3f9fd      0x6466f308      0x7c834042
+       0xf56281b7      0x7f3a48b4      0x7f875a13      0xd5ac8188
+       0x1b284be4      0x48c0db67      0xbbf1dd5c      0xb048cb42
+       0x5fd646ec      0xddc5b07e      0xecd7dc52      0xfea93ba0
+       0xd6d2876f      0x36c646a4      0x05234f63      0xfda3b2ec
+       0x0d5e885a      0x289442d9      0x1b84cebc      0x24c57b27
+       0xcdc7af90      0x0d9054b0      0x102b9fc5      0x7c3b7851
+       0x4fc9b680      0x1027ac0f      0xe9d33d07      0xe70f0d86
+       0x0b67a11f      0x7b00c993      0x7b944198      0xe9473d98
+       0x9dbb331f      0xfc68a0df      0xc2bfdff4      0x2645cc1c
+       0xa432b05c      0x5ff0d00d      0x094daa97      0x86110404
+       0x13152e68      0xfe61af26      0x73585153      0x5d5d4bf3
+       0x1e72e7f6      0x29158039      0x67d827fd      0x28891d12
+       0x277fb2e8      0x688f2cfd      0x6cc5b235      0x2a91ad07
+       0x73ea8da0      0xdf0b3ea0      0x3483725d      0xe6e8e3de
+       0xf78e1d07      0x94568c0b      0xfff3f1ad      0xd7ef83bf
+       0x93788ec9      0x4a85764d      0xe055935b      0x6d4c35ee
+       0x015ac081      0x3a7d7f7d      0xfbbab5d3      0xd6ba93f0
+       0xadf23210      0xb3972a33      0x3b27aca8      0x14129a04
+       0xe054246c      0x49773d16      0x53ef69e4      0x543fab09
+       0xa3db9f24      0xa1905890      0x603a7878      0x46971d2b
+       0xb3aa0701      0x71439a8c      0xb1160b2b      0x2500f535
+       0xeb529914      0x09bc681c      0x886a22ca      0x029839c0
+       0x24f6fa9d      0xf273b94b      0xd4ed1fc0      0xa725fb0a
+       0xc1288834      0x298c0de6      0x7ccedef6      0x475cdd4f
+       0x9b74fe73      0xaca142f1      0x3b90630e      0xafcc14f0
+       0xa7b9176a      0x18a78adf      0x3717feaf      0x8dfca953
+       0x964b191f      0x4b2292b0      0xa0ada75c      0x439c2150
+       0x1b6bc949      0xfd7de88d      0xcafeaee5      0x1b47ea7a
+       0x4886a9bb      0xcf4f8cb5      0xdafee879      0xffa4f85a
+       0xbbc7d17b      0x386e6a18      0x37a76a81      0xe71481b2
+       0x0be3cc58      0xd1abf083      0x6f863841      0xba25ae41
+       0x7d897088      0x141ac561      0x55636cba      0xa1c6d0f4
+       0x00f9adb2      0x401e9d6a      0xf82a5978      0x7d75b4d5
+       0x38f52ee9      0xc9bf7776      0x57e541ec      0xa7326049
+       0x4eb310db      0x7a911090      0xe980d24d      0x4e4928a8
+       0xc341da19      0x160d50fb      0x52b629ed      0x36e373e1
+       0x03156b52      0x7dda6394      0x9016c191      0x10e1c2b2
+       0x745f2fa5      0xf97a0fd7      0xed78e2dd      0x52cb1fb4
+       0xf3f5a357      0x7bbb6eed      0xd49494f3      0xd5d282e6
+       0x331457a2      0xe0986390      0xabd4ad46      0xffd32433
+       0xc6760132      0x17edf947      0xef74541c      0x6c633d01
+       0x1bfc8944      0x66ae5f06      0x49180ca9      0x9439b3a5
+       0x0109ab6a      0x9988841b      0x3138e4b9      0x0c041259
+       0xdd2d6cdc      0xba4aef87      0x00b54150      0x1af1eb60
+       0x17362972      0x4e9e7391      0x2a4c8c0e      0x86e366c6
+       0xc4d32a69      0xf9682136      0x89a37daa      0xab0f206b
+       0x4bc10c8c      0xdf1448c5      0xfb04128d      0x801adf60
+       0xc610756c      0x427fad0c      0x94e62b1e      0xab472ed0
+       0x18390093      0xa57beb73      0xf76ef93a      0x47f81306
+       0x6a1f16b1      0xb5a3cb25      0xce9234b3      0x7d7be393
+       0xefc9352b      0x20469b4e      0x78d2d7c0      0x52d5a924
+       0x8dc1e477      0x9535e2a7      0x14a76758      0x00c3b32f
+       0xfc9b912e      0xe199d9ef      0xefe2a54d      0x9fe26d7e
+       0xe782325f      0x225fff1b      0xa57f1197      0x9156e416
+       0x194055ea      0x0660af3c      0x658a517f      0xc90f5346
+       0x4dcd36cf      0x5e225bb0      0x6e52580b      0xf12142b3
+       0x20495447      0xe75f4145      0xdfeda257      0xaae519ad
+       0x0b1fafa9      0xd70bddc9      0x66131cd2      0xea6513e5
+       0xdb3e7f2e      0x393388fc      0xc712bc66      0x5dcfd28e
+       0xa6c8ef27      0x6e82503a      0xc8fed6cc      0x37f04c92
+       0xf0bb837a      0x8adf1397      0x2c2e09db      0xe6ebdd65
+       0xba2f5430      0xcfa2d541      0x398ef4b7      0x1c1a1525
+       0xfed5250b      0xc8ea4537      0xd9285c99      0x4ee366c0
+       0xf00ce3a3      0xe36d4ae1      0x41a85806      0x3b26c890
+       0xb5f8bbbf      0xef64d87d      0xb7983644      0xef77edd7
+       0xf0c98c90      0xea55a358      0x3243d74f      0x8e7ecc0b
+       0xfd6e5cba      0x4ba3353b      0x2b71f634      0x068abf5c
+       0x2c7d2629      0x5ca26d59      0x69558629      0xef7dd3e4
+       0xc5b45181      0x9b8dcc34      0xd42804fa      0x97863a0c
+       0x33e67d39      0x4964aed4      0x8ddf1f63      0xaf56235e
+       0x395e9cbf      0xe4e312d8      0x54a95a58      0x1a20df2f
+       0xc020be59      0xf766cc8b      0x90f0a8fc      0x975e7117
+       0xc9c67436      0x47a32de8      0xc8b4b4ad      0xd7ad6e3b
+       0x7ea90e0a      0xc888c20e      0xa7b34096      0x49408ad6
+       0x196a44a2      0x0c976185      0x3661073f      0xec9f2ff6
+       0x363e340e      0xf5bfa91a      0x460b2797      0x8d31424f
+       0x92067803      0x4b8ea711      0xaa64e9e0      0x99af04e4
+       0x5f4ec94d      0x984ecc59      0xb46e3237      0x94ae2df5
+       0x406aceb0      0xc2db3748      0xa2ccce68      0xe4aaa783
+       0x848d3790      0x9310ceaf      0xf03f5227      0x5cfcfee2
+       0x86f79341      0x8ae74083      0xcdcfbd57      0xb73c78b8
+       0x46d53ce7      0xaf63127f      0xc8af1f62      0xd9345e73
+       0xd5a843dc      0xdfe408ed      0x2b0a5a74      0xfc5e83b6
+       0x02b82383      0xd11a8304      0x9eb33f49      0x780258e1
+       0x10ecc11d      0x3d86f81a      0x4135e11b      0x7b3c13fb
+       0x9d497a35      0xc98a53b5      0xa2662751      0x67411a3e
+       0xb7b2ec7b      0x4df0fa7a      0x27f27874      0x0e3180cb
+       0x9ce8a228      0x52ed9080      0x7419dcf4      0x39b6bb03
+       0x5f2fc03f      0x9c0b3310      0xc71ae18a      0x596789fb
+       0x0f5b72fa      0x93d2df5c      0xa1b39822      0x972f2f23
+       0x3dbab78b      0xf58f6c2f      0xc6641558      0xf4c4c4ee
+       0xc8bee865      0xec52beaf      0x25cfcf49      0xf9effa32
+       0x4da772ca      0x550135cf      0x135cd4b0      0xfb3467a1
+       0xdd9375e8      0x1bb87880      0x2212e688      0xad1cb275
+       0xc3ec168a      0xf673b7b4      0xa37cb4ba      0x496b8bd5
+       0x040481ef      0x32952c2b      0x694d71c3      0x224c0566
+       0xd53264ce      0x4151ec8c      0xbaa0aecf      0xb86f2bd5
+       0x7de90b99      0xf2f8e815      0x04ed273f      0x36587931
+       0x4d15c3c4      0x17de4bac      0xdee68b3b      0x7a2b0434
+       0x6a2c7cc5      0x1b73fd40      0x35eb37b2      0x23e52371
+       0x73b31abf      0x7bb9e3f0      0xecc6fbe1      0x88c73c81
+       0xee50ceac      0x6721d013      0x4adc7e60      0x598f6e88
+       0xcc7826ac      0x37b443ce      0xa0e46430      0x51a848e1
+       0x75990dd8      0xd9dc6164      0xaa8ac8b1      0xc68ae7bb
+       0x5d424bf5      0x6f3f6adc      0x7c5c5112      0xd4052c5d
+       0xfb5930ea      0x899798ef      0x3612772a      0x3d09d7cb
+       0xa4e4bf10      0x32539b0c      0x13dc2f07      0x3d0a5dee
+       0x4e8b1433      0x8f0299c8      0x84398672      0x8fb4eaaa
+       0x3e0ea530      0x928f9160      0xd0c59a0b      0x63212ea5
+       0xfb58f129      0xd23cfebc      0xecc0d9a5      0xaa19360a
+       0x0d8d5cda      0x9cea8440      0x3302fb43      0xfbe4cc65
+       0x84c87f41      0xdc887170      0xce6d073f      0x6b1f95d5
+       0x32cd021e      0x1238650d      0x46a4b16b      0x969889d1
+       0x05066b32      0xe5d5db39      0xe61132cf      0xc83c73cc
+       0xd9a26b2b      0x1e8514d9      0xa4ee1099      0xee5b0979
+       0x809c85d1      0x7c915969      0xc19de1de      0x5dc57999
+       0x05aaf1aa      0x9bf127cf      0x5500e2e4      0x0b58a12c
+       0xadff8f92      0x97fd18c5      0xb65ca67b      0xac997c27
+       0x183a2353      0x0d4885a0      0xbf07de7f      0x7acd2fe0
+       0x1305967a      0x73ffb3f6      0xd56bfaae      0x8bb522bd
+       0x4ec60a1c      0xd15e73a2      0xf5d5e543      0xd1936082
+       0x0e5f1e3f      0x82b630e5      0xacb42758      0x60457204
+       0x4db21d80      0x63268543      0xa74445eb      0x4da0ba72
+       0x86a911fc      0xff6eeea5      0xd9b841c2      0xcd8eeff0
+       0x7d5f71d4      0x79276494      0x7fc1532e      0x35b84999
+       0x3ae06442      0xdcb11206      0x220d92cc      0xfb716e84
+       0x106cf027      0x79265724      0x420c10a6      0xb76ebb4a
+       0x19ea9fff      0x9b4c6e5a      0xd7362c61      0x2587a379
+       0xea661035      0x33f2b5df      0x24fb5e4f      0x350973e8
+       0x3e7acc52      0x97fefe48      0xe9494f9f      0x490935bb
+       0xb570c9b7      0xff52cd9a      0x925bcd3c      0xac372cf2
+       0xf8a77b40      0x7ebc3984      0x9b61852c      0x81e07c63
+       0x7992e762      0x07517eb2      0x7b2ba667      0x09bb1d78
+       0x0514bbfb      0xb1783dc2      0xfe4e7fc3      0x76822498
+       0xf67c8bd8      0xe44c8216      0xfc0d30c9      0x99660ddf
+       0x87bdabef      0x5f0aff39      0xa8cf6af9      0x3d1b8f76
+       0x17f475b2      0xd08c6d1c      0xf431aeda      0x76c43999
+       0x7f101532      0xa09e63e2      0x6fbd3a20      0x0456123f
+       0x23d69239      0x389e916e      0xf13efcc8      0x2a00281f
+       0x8cdd42ad      0x5ae6f695      0x6ba7f99c      0x4ea30128
+       0xaa10f592      0xaa7d8d67      0x73159f38      0xad352429
+       0x42e49d5c      0x66595b5c      0x46dd2f35      0xe321a946
+       0x0b9e476f      0x97d89aad      0x6c774f9c      0x6a78c7c0
+       0xe9db7e8e      0x936b0794      0x7de947c6      0x86c2d7f6
+       0x4088019c      0xf2ae9570      0x3f766b87      0x74a306b2
+       0xe287dab3      0x789504fd      0xff9ea9ea      0xc71002bf
+       0xe162c8be      0xe59a08fb      0xd24079d2      0xdde8e548
+       0x5a05697d      0x6043463a      0xb730f504      0xbba93972
+       0xeb63ce5b      0xccdcd737      0x1c0403a9      0x0e22357c
+       0xa6eb5b59      0xde4ac8b2      0x8678668b      0x8e21df3d
+       0x6fe75aba      0x42554c7d      0x58cd2a81      0xd503c6c5
+       0x7bb58d0a      0x1dee3f4c      0x8b971ca4      0xe8222a21
+       0x59f67b2d      0xa8ae44d3      0xc1023b05      0xac1950ca
+       0xa3879faa      0xc2b4e30f      0x87109909      0x19497132
+       0x33dede03      0xce3bb967      0x78f25931      0xb7b6f9ea
+       0x7e04ac4c      0x2205aaf0      0x58542633      0xbf829e22
+       0x5b1888f5      0xe354dfc6      0x76459dcb      0x0ca1ec70
+       0x5c9fbd45      0x3e70df73      0x9d73570e      0x81f6b1b3
+       0x3ff497b8      0x3c6c1409      0x1a0d08d4      0x0dcf49ac
+       0x324f8fcb      0x08d7ff92      0xb5631b97      0xc3490c90
+       0x969d4cdc      0xcb5ba099      0xda817065      0x07862b6b
+       0x32fc8988      0x2cdf060e      0xcc4dd974      0x9c42baec
+       0x9b2a2a21      0x1e2241a1      0xb0e1cb78      0xd62e1d9a
+       0xff793d44      0x953863d2      0xf0da874b      0x1d60a9e7
+       0xbc91e4a4      0x6e782750      0x1621cef1      0x99282d4f
+       0xf7e0e472      0x9f6fc05d      0xae4f5395      0x09f8f78a
+       0xc3f194de      0x8f4233d4      0xd4850906      0x05c0c011
+       0x12a9a805      0x0058c2fc      0x7cf4c088      0x785c0d53
+       0x202f7fd0      0x5562e41c      0x4b78c95b      0xc23b4cde
+       0x763b6697      0xa5ed06ea      0x04e24f13      0xe4b2088b
+       0xb1adf6c0      0xfe2b4df4      0x63dafcb2      0x7d86b66c
+       0xa2012dbe      0xc39c7866      0x27530159      0xc7f0a0b5
+       0xd22971a9      0xc092c6f3      0xe7de0bbb      0x5bb3572a
+       0x7b0800da      0xdf370aea      0x4006f1dc      0x09518047
+       0xdf8ea9ae      0xea791ff3      0xd256760e      0x103a8d26
+       0xa96153c3      0x68b46384      0xe1e33cfe      0x7f9d352d
+       0x6251e36f      0x58519610      0xf16b6040      0x37a9baf8
+       0x81c0026c      0x0588afac      0xfba288cc      0x1dc42a1a
+       0x5d41af78      0xea4fdcec      0x66ba98ad      0xce81a06b
+       0xe85dd4b6      0xae8998ea      0x700cc21e      0x8d5df4b9
+       0x8e4388ef      0xc5d566d1      0x3cbb3fa4      0x3b8ef9bc
+       0x15017d02      0x5064cc6b      0x74248edc      0xc1f0affc
+       0x6888e988      0xf6b7b234      0x87f41320      0xffa17183
+       0x77924fd6      0x789785ee      0xf3613ee6      0x393ed47d
+       0x03ee805b      0xe5469529      0x53299ada      0xd555232c
+       0xa561286d      0x21d41ec6      0xd58f7665      0x61a5b849
+       0x6b8fc21f      0x715d1cd8      0x1b295302      0xf3856fd8
+       0x87e12015      0xb77a43f5      0x73f2f8d3      0x565fb49a
+       0xdc064b4a      0x5f8e28ba      0x14de6a35      0x397fd796
+       0xf2713e96      0x9b410701      0x47942eca      0x89d3dae0
+       0xf6255e2a      0x22af994a      0xa63d0e33      0x4a85cccb
+       0xab341593      0x07f73cfb      0x07f06a61      0x675bb9da
+       0xeeb2ef7d      0x69320097      0x3580f4b6      0xc2ccb1e3
+       0x0b0ecf68      0x3a9ccb95      0xf7b12b91      0xe678a5c1
+       0x2e2c3616      0x1cd5f11f      0x57e69fc2      0xe7d784d2
+       0x633fe3ce      0x498cd506      0xec34675d      0x4c06b624
+       0x02c81653      0xb8f19413      0xa448a3d4      0xa29eaaa7
+       0xb82040ca      0xba43097c      0x44771e12      0x3c210021
+       0x9a6ef1f1      0xb41f5d76      0xe46be509      0x59ebfa66
+       0xf0541902      0xd4f116bb      0xd68e1c39      0x6f6ee876
+       0x2a95733c      0x4ab04908      0x54433296      0x6ae55d87
+       0xa4297ea1      0x3d5ba5e7      0x4874794d      0x91dfacba
+       0x61e3868d      0x4934786c      0xb5d08504      0x0b589e13
+       0x20ed8fe7      0x8928b007      0x74231e4d      0xd08ae28c
+       0x214a2d90      0xb4e86908      0x87e9ffe8      0x4379fe18
+       0x5613c5f3      0x92556af5      0xe057ac38      0x5c706fdf
+       0xad5ab3b2      0x614c247f      0x1a1ae839      0x6a12e0b9
+       0x595d02ea      0x4a3784c8      0xdcd10560      0xa9fdce4e
+       0xde30047b      0x68044489      0xe8c6a3ed      0xee2e9140
+       0x1c9786b0      0xe923e849      0x4253cdc6      0x2a88805a
+       0xfe3cf21c      0x3e0fd06a      0x1de52860      0xd9bc4766
+       0x7fdd8310      0x85b81370      0xd4515cbb      0xd8c4529f
+       0x3a6b0087      0xaf7b3eab      0x35a9f9c5      0xcb2dee2d
+       0xc2dc5eba      0x4fad7365      0xe949f027      0xa661918b
+       0x7de7ac66      0x79a79781      0x2fd7a72d      0x106f0863
+       0x9944ba95      0x774719d9      0x96fab1e7      0xb9f5e57b
+       0xafa42488      0xd60053da      0x195b355f      0x00a488cb
+       0x6bd8ac6c      0x68f42580      0x9b24e1b7      0xe051d90a
+       0xcc303b59      0x127fb687      0x75aec9da      0x41b2172f
+       0xc212cdff      0x44dd927d      0xceabdb0e      0x7c5a5ffe
+       0x78ddaaf2      0x0dfda5de      0x2e2f3645      0xf8c23d24
+       0xf9cef11d      0x1c11f3d9      0x49748cc6      0xe168353f
+       0xe32b5678      0x23135d35      0x5d18c760      0x83500ece
+       0xa4ca1521      0x64da0411      0x73f7c159      0xc1450c89
+       0xd678fb9f      0xbe61b22f      0xa7dced66      0x75bc6601
+       0xb9bb83b8      0x0b2dbcc7      0xb037f875      0x28b67597
+       0xa5494bb3      0x77f73fac      0x460e3ea2      0x8d04b992
+       0x1a5473ed      0xe15dc011      0x4358b9b6      0xb841bd32
+       0xebfd0cf4      0x1f154cd6      0x5472d51a      0x5868057e
+       0x0e6ddf96      0x56167f00      0x9366e9a4      0xb910f4b6
+       0x1ce725c0      0x19e47c3e      0x2b7def54      0xa41ba975
+       0xb18d73b4      0xa8928f7c      0x42d41b6a      0x36e45805
+       0x6acb9862      0x9f9e3faf      0xd210afa3      0x531fdd05
+       0xc700476a      0x0d20590d      0x634abb30      0x6fd34f59
+       0x31270c92      0x61281d99      0xaaaf0d99      0xbef01a81
+       0x911ee0db      0xd4dd34e6      0xb4ed321f      0x836e0456
+       0xfafe9ee6      0xcec3d176      0xc8feacfe      0xaa78be42
+       0xfcd2a6c9      0x85c52e32      0xc00e0b2b      0x23ae87e1
+       0xfdab99e9      0xc2403118      0x7df6bb22      0x5ccd1c47
+       0x84d08ce6      0x45937da1      0xb3df11ef      0x6462dd41
+       0x32af313f      0xda1266cb      0x08591f3a      0x862fd070
+       0xbe9176a9      0xb7934784      0xbd323ecc      0x550be9b6
+       0x45f912d6      0xdfe9d0f4      0xea84ef59      0x394bce1e
+       0x42e94a55      0xb81ffa90      0xd741bba1      0xb690207b
+       0x2b120333      0x7548a8fc      0xc089f30c      0x288443a0
+       0xf3bd8eeb      0x31e37bb0      0x6c5e755d      0xd311b84c
+       0xeaac7adc      0x07c23f8e      0x11d1699a      0xcd207b08
+       0xc6407bba      0x9827894e      0x46c91baf      0x82e21b56
+       0x76bf2c72      0x0f55bd2c      0xfc5d6853      0xf88d1e03
+       0x94c643ec      0xa708c4f6      0x21dc5dbf      0xe59ac098
+       0xc80ebf22      0x3324198b      0xfb45f988      0x0226a02d
+       0xbccc6f40      0x89e6a1de      0x59f7c39d      0x4694469e
+       0x693d3d5d      0x0b38d0a0      0xeb0a72b5      0x7208517b
+       0x40310537      0x436c9a71      0x3c479b18      0x17e4b154
+       0x3b41580d      0x450991d7      0x4d76b0d3      0x46e34079
+       0xa27bb1b0      0xb99a5c34      0xb96c40c2      0xc63b7a4a
+       0x442a9d21      0xfb6db7c0      0xb31a89c1      0xe7f6bf0b
+       0x5528a8ac      0x8eed191a      0x10e6d50a      0x1a9bd4f0
+       0x5436b0e5      0xabcaca12      0xe82490aa      0xef7bf6ba
+       0x54376519      0x6368263b      0x4a125ac8      0x4bf533c8
+       0x09f9355e      0x64eb02cc      0x4fc27ae2      0x8bd26def
+       0x64fd9ef8      0xe314729b      0x7a2adcc2      0xbba495c1
+       0x1e747882      0xf569aa01      0x08c48bc4      0x3c75d45c
+       0x6e75c728      0x7fb98e42      0x5a254bed      0xf97ad9ee
+       0x3c740138      0xaa031c23      0x63a64b23      0x90b6395c
+       0xa527fad9      0x525434ae      0x9404f8e7      0x873f3702
+       0xe8d7acb5      0x174281c4      0x83f5ca85      0x5b37aab8
+       0x612c5543      0x91cf3160      0x3ea20c63      0x6099e8ee
+       0x4d834d4d      0xd2210d3c      0xa692ea70      0xf01e8904
+       0xefd7d188      0x04b10c7d      0x418fb623      0x7d2fc0b0
+       0x1b5278be      0xb693d7c9      0x60fdf6ee      0x7ece8c37
+       0x92eba7f7      0x7a925b1d      0x344552a4      0xdb2cf628
+       0x4d2a59b8      0x6da97a8c      0x322529d3      0x59140695
+       0xea6b9f9f      0x1b863b1d      0x2d5fd42f      0x5434d15c
+       0x642c5645      0x32cf7bf5      0xd4c04783      0x13e6f185
+       0xc32e96ed      0x1bd13970      0xb35313d8      0x392a0151
+       0x22488ad2      0xad9f285b      0xfdd7ff53      0xdb554e65
+       0xfbcc1e43      0x1a37ad95      0x12d38316      0x68bb1b6f
+       0xfd975bfe      0x3687c1dc      0x4563b4d3      0xc7a94f02
+       0x85722a8d      0x78320fdc      0x77662dcd      0x3a3f3642
+       0xbcd5b65b      0x113ec4c8      0x173268d6      0x3ee59f92
+       0x19b8dfe2      0xa83377cc      0x83683889      0x659befaa
+       0x4485df8d      0x7708fabf      0x44dde54c      0x3af23cbc
+       0x7e4d3048      0x737a865c      0x7160e23f      0xca21b20a
+       0x0433eae9      0xdaf47e67      0x24f18868      0x1cab7482
+       0xdf05b48a      0x69a42384      0x63a7a43e      0x316cc018
+       0x74f34be0      0x170dea21      0xec9fcf44      0xceb0e68f
+       0xc7f0e924      0x7d8bda46      0xb2c20026      0x1571a800
+       0x1fde1a61      0x3e3a22b3      0x62ef6e0e      0x984336cd
+       0xfbf0e5f5      0x70b67258      0xdf903425      0xeb54f70f
+       0x886b58d6      0x4b10d7fe      0x849b310f      0xcd39e60d
+       0xff41ad90      0x6a0a3df8      0x3cf8b078      0xb38ac71d
+       0xb5facad1      0x65a70948      0xa26997bb      0x8c92c2b4
+       0x7471c53f      0x9323b393      0x0cf70ab9      0xa37c8ecc
+       0x4a807b5c      0xbd83950a      0x6ec9e16d      0x40d62e3b
+       0xdf11015e      0xa7ff5ee8      0xf5585b3a      0x1fbe36b3
+       0xca132fc9      0x41958f29      0xa7c7a1bd      0xd41b88e1
+       0x8b723fb9      0x122db730      0xee76db7f      0xb13ea7c2
+       0x288f3d79      0xd10d82af      0x4a8a62d9      0x79bff991
+       0x5dc3301e      0x7f1a25e3      0x7636784d      0x8578642d
+       0x5afb8f70      0xcb5a7515      0xc5e74b59      0xfad50e55
+       0xd4e30207      0xb3d96b9e      0x1fdc91b9      0x87493d65
+       0x84cbbf69      0x7d7182ab      0x27d0ef36      0xcfda02f5
+       0x40fdf283      0x2de373e9      0x7562fd72      0xa84f70fc
+       0xf5d0d0b1      0x320a765e      0x7e643413      0x2a53592a
+       0x0de440dc      0x3d74cf31      0x74a2a3e2      0xb23d6788
+       0xbf7a95e7      0x9825884c      0xeee45682      0xb5b4c7c8
+       0xc3a7f9f2      0x5ece37f6      0x292a0559      0x719b0312
+       0xe567988a      0x93ab533f      0xe533370b      0x7bc50a08
+       0x41dcf01b      0x28ae927c      0x630ea007      0x49656cd3
+       0xe5bedbe2      0xfce7631e      0x6846ce25      0x708367f0
+       0x43a67c95      0xe92cd7fb      0xaabb55fa      0xfe4acc1e
+       0x2ca611a4      0xbe5dbdd8      0xacc6e736      0x04841338
+       0xde45a48f      0x2bc5183d      0xf5d35047      0x3eb2eecd
+       0x5418f40a      0x7d16472b      0x14d207ce      0x54a36e56
+       0x65008a50      0x212bc84f      0xcad5e399      0xd25dc624
+       0xe7b0fddf      0x60aa4951      0xd17a4a74      0xd1e18d5e
+       0xd48ee4c7      0x1e888f6e      0xc928e8eb      0xc43b64e8
+       0x2a11df73      0xf6dd3d0b      0xca850c7e      0x474d4db1
+       0xe8bf9ae5      0x22b41c6d      0xd1f1ef6a      0xc126ca17
+       0x407b7517      0x55a6dde7      0x804f6d7d      0x7c08faaa
+       0x72c998e1      0x7fc79a9a      0xda06e2b2      0xdabf393f
+       0xd9276c53      0x74e7e4c2      0x0d4bf502      0xd1d7c5ea
+       0x875cbcb9      0x6cfb2c10      0x64c2b561      0xea10e25f
+       0x26d6de7e      0x4725b565      0xcd3781a5      0x7c03ed14
+       0xa863085d      0xc07843e3      0x158f686a      0xa05ea8a5
+       0x9b6c89b4      0x56aaeb67      0xf629081c      0x43cdfbe0
+       0xf60a231f      0xd9994447      0xd4328af1      0xf2b771d9
+       0x5edf23af      0x98ffc84a      0x7942201d      0xad44cb25
+       0x8f9d2422      0x7278c6cd      0x5f62c6c5      0xcc41eac3
+       0x4e71353b      0x273af945      0xbae89c3b      0xf63349f1
+       0x5b44bceb      0xf37bedc3      0x2698fdc1      0xbaac0de3
+       0x6acbcd11      0x27b5ddd4      0x1df197ea      0xe2a576c6
+       0x50783d87      0x8eab25ab      0xd79d476d      0x8532782c
+       0x37ee030b      0x6e638e06      0x8650c83e      0xa1ae3206
+       0xd72abd48      0x55e94bba      0x2dfb25e1      0xcff3d98c
+       0x9936fcb5      0x8959a486      0x5bd30cfe      0x53dd356c
+       0x3443ce5d      0x91337d8b      0xd081222f      0xd14fc07b
+       0x68609843      0x572ace06      0x28b96e42      0xbba7c9cd
+       0xafdb8edb      0x2cfe192e      0xf8cae44d      0x5bbff8d3
+       0xcecc6bb5      0x9edac99d      0x355e6d71      0xabed645f
+       0x8085fb33      0x565d74f4      0x2c8ee192      0xba7276b2
+       0xef1ae1c2      0x433ec40a      0x564bbb47      0xc74e9dc7
+       0x6fcccdb4      0x4e01308f      0x16d945a7      0x29ed35fa
+       0x9328cf10      0xad3d658a      0x3d2f6aa9      0xf7dea386
+       0x2b14c435      0x259d417d      0xc25061a1      0xcbb30944
+       0x07457b0c      0xa5f352e6      0x76dc8156      0x82cddb23
+       0x8c4f163e      0x9307db9a      0x9c1335fe      0xbe7ab810
+       0x84d8b6c3      0x4bcf6fb8      0x78456523      0xed825b19
+       0x0007364b      0x56c39a7c      0x407e5e5f      0x7e50b91b
+       0xfb1b4da9      0x62e94e3f      0xc1c34997      0x20c6d4e0
+       0xce9d05ce      0xf7558b1b      0x097b99b0      0x66c2cb97
+       0x71189bca      0x4144f358      0x12a70cb2      0x179fa9b4
+       0x94d4acba      0x44a77a51      0xa815e160      0x00ba3204
+       0xbd41d6e5      0xedbbf7be      0x53c62fce      0xde596636
+       0x6dcb0bc7      0xe5689e30      0x3557eb61      0x32fa1131
+       0x0b71f616      0x41b11371      0x9272079a      0x7d91456a
+       0xbe58797e      0x5a42bde7      0x5545cbf9      0xb26db577
+       0xac1b10d3      0x723b95d9      0xb40d3998      0xbf75126f
+       0x84e2bdff      0x50ed4d3b      0x918a974c      0xf8d9649e
+       0x35d76697      0xb262e991      0xc15bc480      0x654a6404
+       0x7a76a020      0x039112f3      0x64d9e8c6      0x45bd67f6
+       0xc8cc5187      0xed9fce97      0xf47af956      0x188c783f
+       0xd7d163ef      0xfac2c447      0x251feb6d      0x1bf02539
+       0x2f039ba0      0x4cbb7532      0xa9bc6043      0xfc669e51
+       0xe84848c9      0x8dececc2      0xa0cce802      0x64dcc7f3
+       0x8bfbdc32      0xcc39105e      0xc7041c56      0x1086785a
+       0x6378e1c8      0x472b1153      0x660ffc42      0xc0b5220c
+       0x68a76c49      0x0932e082      0x5a65df76      0xe90028e0
+       0x94083531      0x3cccbcdd      0x5843d223      0xae6d84e0
+       0xb491638c      0x8a5d5e27      0xc256865c      0x55f8474b
+       0xdf49d454      0x2f0c8ead      0x0775d272      0xdec275ee
+       0xcc2dcad1      0xd9375085      0xc5bfb607      0x787ddf25
+       0xed50f8d2      0x791cc44c      0x9813ef08      0x53dc5349
+       0x64388d8d      0xcc973f31      0xaaa4e3e8      0xa0a62f9a
+       0xdc807786      0x9f08060c      0x7f3215e4      0xdbe18ffc
+       0x2e3c472b      0x75af4ce8      0xb970b528      0x24ff6c05
+       0xd8765bf1      0x66bb3062      0xd9beab31      0xdc3f67ec
+       0x3626c356      0x5b7fff0e      0x3b69f0f3      0xeeec7672
+       0x458dd8c7      0x01fc98ff      0xd77b54a7      0xbb977768
+       0xdd8cd676      0xd3aadb42      0x4cf8146c      0xa1995736
+       0xdfac95dc      0xfeed8d4d      0x6374914b      0x332112b7
+       0x763fac3d      0x05574470      0x17dfbbe9      0x82366ce1
+       0xabcec744      0x0415e04b      0x514997ee      0xd5352b1b
+       0x61380140      0xa6f58b5f      0x4ed4d7aa      0x0bd94f3a
+       0x1d77257c      0x2faced14      0x3208775a      0x5106ea55
+       0x63f6638b      0x5487c618      0x09bb75e4      0xc7016e51
+       0x7a4b97db      0x49ca9b5c      0xd5935595      0xdf4c53b1
+       0xc48a8bf8      0xfc918e77      0xcc8f8391      0x5e01ccdc
+       0x76f8eaf4      0x65fdf363      0x9f8ff68b      0x374e0972
+       0xcd3d2b3b      0x705fd33e      0x4676be98      0xe55dd0b3
+       0x5d320643      0x0177236a      0x191f349a      0xc509f6f6
+       0x24ce75a2      0x0e89ab61      0xc645e5f3      0x70abbe8d
+       0xddb3100c      0xcb3dc211      0x21cdc6c0      0x39c180b7
+       0x7dbd7a3f      0x10096c5e      0x51aa0e57      0x374e1c24
+       0xad4499c3      0x9c147248      0xf7d71841      0x7dc43952
+       0xdf44e196      0x240af2fc      0xc0480049      0xc4349b93
+       0xf197c246      0xd635758f      0x25ef779a      0xac9f2109
+       0xb6f62ecb      0x2bf07b64      0xa8b4685d      0x36979990
+       0x6887d9f5      0xd2612a38      0xb015001b      0x1f5b3fb3
+       0x5222d20d      0xda1b8a2e      0xb67a3bb0      0xe3594883
+       0x1fca07d0      0x99e19d74      0x4ccd57ae      0xffabd989
+       0x12d7abb0      0x9a601f63      0x386a592b      0xf9875f84
+       0x09a668a6      0xb084ffe3      0x18767678      0xd274125a
+       0xbad57d37      0x995de6fe      0x510e22e6      0x4f609bf3
+       0xac7fa65e      0x2d01f56c      0x702ffe23      0x95675930
+       0xecf6c705      0x60b3999b      0x592edd95      0x225dd441
+       0x307eaf9c      0xa266d125      0x535f54bd      0x3fdd8447
+       0xb50232fe      0xbd529b2c      0xa18f4b08      0xcb5e665f
+       0x855a893f      0x62b0f1cb      0x05a6b7fb      0x5112f3f3
+       0xa8282b3d      0xad79d030      0x18291569      0x50cd76c3
+       0x5b72b8d2      0xf873d71a      0xfe8238ca      0xa286370b
+       0xbe7a6071      0xf19e8646      0x03915270      0xfdf96d7c
+       0x0eebabe1      0x737acaac      0x57ae375f      0x34f6470a
+       0x00e0956b      0x2280c408      0x18a7f080      0x4be2761a
+       0xc20c3c03      0x652f61a1      0x681cf2ba      0x90a76946
+       0xd9e81d1d      0x6c935503      0x0243964d      0x4d6548c2
+       0x7b4a5973      0x12cc8e36      0x248da3c8      0xb21cebf1
+       0x809343aa      0x78a4e27b      0x2fcc02b0      0x09ad9174
+       0x20b8f784      0x7dea74df      0x0440f402      0x61961b3c
+       0x2ca4bb12      0x4a04d9b6      0xb28242e9      0x410d5237
+       0x7aa0bd8e      0x8ea39021      0x0e65c9cd      0xb01500b8
+       0xaaa7dcc1      0xd08390b8      0xa4b8a97a      0x8cd02001
+       0xecaccf41      0x633c7006      0xa9c2346d      0x526e9446
+       0xf959c633      0xcfe32892      0xf7d7ae52      0x345e1dda
+       0x03d22449      0x0d5a42cc      0x10605e60      0x89c7c14f
+       0xccd10bc8      0x1a83309c      0x0bc3108c      0x331ef896
+       0x11089de5      0x579b7061      0xe78c6535      0x186b50d2
+       0xc0257051      0xf0954f4b      0xe97bd497      0xfa80c57c
+       0x5fff084f      0x94a4d534      0x58cb76c9      0x2b6833e9
+       0x596c0b17      0xcdf9b85e      0xb3bd39ae      0x207bb792
+       0x9b9faf14      0x3ca7bc61      0xdf563ed2      0xcc047ccd
+       0x5210afee      0xff010b40      0x5720ed85      0x21d51621
+       0x3533cb99      0x0aa899a0      0xa0deaec9      0x08bfab41
+       0x39247564      0x41efb3c1      0x4164db69      0x1652786a
+       0xab748ead      0x5d10bfb3      0x5efc86a3      0x7cbda76f
+       0x65636fa8      0xdfecccac      0xfedfcb07      0xab2328d3
+       0x42dd5dd5      0x5b2d84b0      0x55531305      0x699bf734
+       0xa8261501      0x4e2070bb      0x0b927703      0x06748069
+       0xf9a1b399      0xe08b5427      0xba31583c      0x967ceb20
+       0xd187f5d2      0xcfb55282      0xb84f48e1      0x5d35fe15
+       0xe785b043      0xd0dc77e2      0x85df4fb2      0xdb77f89c
+       0x6b2accdb      0x58a47118      0xb0f8d24a      0xc39e7f23
+       0x52944e9a      0xd1006214      0xd9aba59e      0x42bd3bd9
+       0x8b7e1cac      0xf2c23db8      0x801ebde9      0x41cbb528
+       0x1b0c84bd      0xafb6487a      0x79b44529      0x1ddb236d
+       0x7035b8c5      0x7191ff1c      0xccff144a      0x5c3e8e08
+       0x7685dcac      0x6fe12e13      0x05097918      0xc2116c7c
+       0xc22b04eb      0xce3b93d1      0xcb0182a2      0xa0a7e1ea
+       0x9bf205f5      0xaa86e3c6      0x4f8b42ae      0xc0818993
+       0xa331cd1b      0x220686c1      0x63100651      0xfc69d85c
+       0x91281ba5      0x376d0dbc      0x04cbc901      0xfd1469e8
+       0xbcefcc0f      0x56653d6a      0xc2154d39      0xb4327949
+       0x4198bfa8      0x32613648      0x9ae013b8      0x656431b5
+       0xd8bd20de      0x6ffdd852      0xfa6c2024      0xc5b94dd2
+       0xb1d0d9f6      0xb660a472      0x4ff02e71      0x0d31712c
+       0x6abac5b6      0x42f10492      0x786d6dd7      0x4f20c20b
+       0x5e968a66      0xafb3cb2d      0xab055fdd      0x658f820d
+       0x2c66f544      0x53bf2921      0x6d0f63da      0x438bdb0c
+       0xfaa07652      0x5b927896      0xb33bfd4f      0xfe9bbd43
+       0x101c0e0e      0x30867a78      0xde68f671      0x391fa524
+       0xa4b948d0      0x2437e3c1      0xd9d96470      0xba321aa4
+       0x3e5b5566      0xe39a53e3      0xa82ce2d8      0x9d8ba8cc
+       0x575630c6      0x506c705b      0x2277c9d6      0xa31bac1d
+       0x37976219      0xa5e21493      0x8fd041df      0x4d2af032
+       0xe75de268      0x98699fe6      0xf3b7cfa4      0x97ac7dc4
+       0x5ff1d2c5      0x8e33fbd8      0x010772a9      0x6c93d48f
+       0x899512dd      0xf7d53c91      0x97fa8288      0xa4adab19
+       0x63717d7f      0x5e6ef885      0x66934b06      0x3dc6fa91
+       0x29f89f47      0xcd4f90f6      0xff792638      0x799c3fc1
+       0x77217e24      0xb5a6225b      0x3cb8f8f4      0x2973d35e
+       0xf3de75c9      0x3a8dd99b      0x576658b3      0x398766f6
+       0x6f3a6d60      0x1c0d85bc      0x3545d4e0      0xdc374f57
+       0x26299056      0x15385f9d      0xc4e8004d      0x12b2c69d
+       0xdc62264a      0x3fc24e10      0x0fdccc5b      0xd4d80c5a
+       0xb78c30d6      0x88e84b5c      0xaa58163f      0x3bc39155
+       0xe0df56b3      0xa93df4da      0x7c599726      0x5dd21192
+       0x1113bafe      0x95819953      0xb29234f6      0x80e1192c
+       0x3eb8a7c0      0xaa099bd0      0xc520b607      0xb4c732e9
+       0x94bbc8d2      0x5dabd0f0      0x81817835      0x50c90c43
+       0xbd61a919      0xd0604736      0xd5d59332      0x5df77937
+       0x70756f6d      0xb97c959e      0xb12e3ee7      0xfa0f8e6c
+       0x8edf86b0      0xbc55e121      0xffe36f9b      0xc5b18418
+       0xa5695abc      0xfd78db88      0xa5abb701      0xf3106a23
+       0x2a25b674      0x92149d92      0x75f554f6      0x15711825
+       0x4018223d      0x6cee4a7f      0xac49f2a4      0x8b7cbc1b
+       0x0021a126      0x5a82bb4c      0x95517060      0x5bd1c72e
+       0xef0aa703      0xded54efb      0xb0d70e26      0x5063c928
+       0x422c2cc1      0x21ca6d4c      0x5380165e      0x69a350c1
+       0x0cd638b6      0x27f70fbe      0xa666ede2      0x63dd6867
+       0xa8266be3      0x000b0b78      0x6b19ab23      0x0d00f83c
+       0x16e78848      0xd871978f      0x47602cec      0xfc687f98
+       0xf3e79da2      0xab10e9b5      0xaf437a53      0x28094fdd
+       0x1a6b4dd0      0x70375aea      0x0718d285      0xf78ef2d2
+       0xcbcfb3ef      0xedc5fdf1      0x0da3a7b8      0x233a162d
+       0xf29e56c5      0xc94f4a19      0xa8fbe895      0x28f9e994
+       0x1b32b3d1      0x1786c3c3      0x8ba9469f      0xbbe72c2f
+       0xf662f439      0x307c6b2c      0x95d354cd      0xc7c7e94c
+       0x27f3c237      0x4e52b116      0x9cb00e0d      0x952f9f0c
+       0x8fc1ddf6      0x88537027      0x8b0d8999      0x1939fa64
+       0xb72b6f2e      0x9039fe55      0x21df947c      0x21884ed3
+       0x54ad873d      0x292c5416      0x83548712      0xf8745d3e
+       0xc1c283e4      0x9d073b08      0x9e8da326      0xf859614f
+       0xf427a00f      0x45ee737d      0xe33a7d69      0x807148ad
+       0x669f1957      0x7b1f9f20      0x784c5c0c      0xded902c0
+       0x82934e64      0xc2e2a0b6      0x87a55058      0x95fe7792
+       0xff7084b8      0xba3f604d      0xeda549c7      0x2527db18
+       0x3131ec59      0x32285503      0x0d7b69de      0xa87b760c
+       0x721b0978      0xc2632bfa      0x4ee58616      0xae73bb41
+       0x7794bd9d      0x130a7b9c      0x59427c7d      0x5326fa67
+       0x7f496099      0x30e2f463      0x28df3ac0      0x6b9ea8de
+       0x842220ca      0x25a5d22f      0x0a6c931b      0x6064ee13
+       0xf3646b94      0x69ff9348      0x6663c7d4      0x6d4b1bf2
+       0x31dc6f14      0xbf8a0e0d      0xfdf341d9      0xe5d1100f
+       0x6eb5f2dc      0x9c966ca9      0xe6e58d17      0x73f020f6
+       0x069cac60      0x7b7669d0      0x39e66b48      0x6122e1ca
+       0x54bb1c31      0x413ac58a      0xcf9dbe59      0x0cd7971b
+       0xc998891d      0xdd341b08      0x670496e5      0xd46e8408
+       0xf7a7446d      0xe41b5248      0x43dbcf5a      0xba655675
+       0x886b0044      0x52399478      0x553f8eac      0x68ccfb1f
+       0xdd9d2e22      0xabee0f09      0xe897717c      0xb86cc2b4
+       0xa8db1d3f      0x2d478c2c      0xbfa07903      0x1d589a1a
+       0xd2ecb496      0xfd803a9c      0x44c95165      0xb3f0b5f4
+       0xe4423f2e      0xcbfa628e      0xf73c7e83      0xf1799aa6
+       0x9cb2acbd      0xd92d4814      0xe2e1fc1c      0x4a52d4cb
+       0x8b961bc4      0x291986d5      0x8497e79d      0xf5c9e19f
+       0x00970532      0xc4e9076f      0x683bd9a0      0x94d62993
+       0x3acffdfe      0xc54379d8      0x62746505      0xc3dd7ea2
+       0xe95e5ffb      0x0ca0c1f7      0xcdaa6c1c      0x1ed34d31
+       0xda1cc033      0xf361f4e2      0x6e798025      0x43add425
+       0xfb22a33a      0xfa2d2df9      0x32dad85d      0x8aa337c6
+       0x5a3ea801      0x28990c71      0x9f1f5086      0x21e8177f
+       0xd5763e1a      0xbe0b4887      0xd8cec934      0x94cbd176
+       0xdddd5e67      0x6dbcfde4      0x70801d55      0xbe62094e
+       0xb27820a6      0xf7455932      0x7193ab84      0x3ae710a5
+       0x01647022      0xd6c94ac0      0x2c7ebe04      0x0fba5ad2
+       0x21540f9a      0x0bf66866      0x7e88d875      0xc99e6f8f
+       0x912768ce      0x39939ec8      0xb0e09efa      0x52fb6226
+       0x1e539887      0x786bb585      0x12a61463      0x7e5dd8c2
+       0x871c00ac      0x171b39b9      0xed1f9a1b      0x38c19931
+       0x5d308052      0xddcd7646      0x7518280a      0xa310bf55
+       0x139d10fb      0x0b60d41b      0xb7e08b37      0x40fcedaf
+       0x510f5550      0x9e47ca8a      0x5c6b396b      0x04c36bde
+       0x6461629b      0x86ebdb46      0x689d0983      0x905ce4b8
+       0xc6112a75      0x890557dd      0x42b6d408      0x32fb46ce
+       0xd54112fb      0x03f7629a      0xc9d04969      0x632538b8
+       0x2fc3ec04      0x4cc3433e      0x06e50f4c      0xc0db9cd2
+       0x2d7f8994      0xd8953273      0x01861f5c      0xbbc42f81
+       0x8f8ba543      0x39727f2e      0x69c3af09      0xb0448177
+       0x6eb6bdaa      0x75de88f5      0x3871f3c8      0x9d6c8586
+       0x116cf51a      0x8a6abbd3      0xa5004cba      0x3c8d1766
+       0x51285b03      0xa00d5a46      0x83755d99      0x2d91fd87
+       0x42f0ab84      0x14c6fa0b      0xeb0a98f5      0xffd02f56
+       0xd35546d9      0x290be482      0xdba0a9d2      0x201501ff
+       0x5c753f02      0xfcefe14f      0xb7153dbb      0x6f56f22f
+       0x8779937d      0xf049ad79      0xc7e56474      0xdfc45382
+       0x17844149      0xde6612ed      0xddf3b1ea      0x88f64bb4
+       0x2dcafc21      0x3f5ba161      0x77abc313      0x0157ee00
+       0x450ec000      0xafc523c1      0x32eb6523      0x1d320c0c
+       0x5a72fb83      0x2ba7e97f      0x13ac3668      0x7b0018e8
+       0x64f4c130      0x4a4f9c9f      0xeb84e0b5      0x8c8b14d5
+       0xaa72c45a      0x47ee1a96      0x322c599d      0x2dd7faa8
+       0x55ca08be      0x9b3917f5      0x5e376234      0x476c916d
+       0x6a3f57bd      0xe4ea3874      0x168dc270      0x9357f9aa
+       0x3d600539      0x258a1ff5      0xdd634c31      0xec5d8b7e
+       0x493cba14      0x6021950e      0xd64befe4      0xc026327b
+       0xab7f248f      0xd8f340d3      0x5b7bc0b4      0xa3c306a1
+       0xdd6463d2      0x62e96662      0xa5656cef      0x772abeb6
+       0xc2ca1677      0x5f8b5aad      0x5098757b      0xbc8c8acb
+       0xee9806f2      0x48c6f749      0x7265ae20      0x13819e0e
+       0xe6da83a8      0x38b743fb      0xd024009e      0x0779eab0
+       0x324c7ad8      0x2cd02206      0x6dc4a51b      0x5c51762e
+       0x7d8c7b92      0x5ad2f586      0x45bbee73      0xb0b4018b
+       0x26ee139e      0xb1fadcd7      0x24790587      0x0dd9cbd3
+       0x08682c61      0xbd3982a2      0xd5884224      0x94a0cde5
+       0x16b5e484      0xe043a35a      0x2326d176      0xc47d6b68
+       0x15621681      0x1cb77fa1      0xdb86c3e1      0x283a89fe
+       0x7407d5e2      0x3e7473db      0x177764bf      0x2592cc46
+       0x9f907da4      0xa07f27a7      0xb8727679      0x49adfbd0
+       0xcc4e5196      0x1d5be775      0x78494187      0x74886d39
+       0xc13bccec      0xe1bf1652      0x583d5f23      0x2921f74b
+       0xf521fa1f      0xb3c6d0c7      0x9e34749b      0xe55fa3bc
+       0xd5bf2524      0x040df0cf      0xc83f244a      0x20271f12
+       0x0c9fa1fb      0x8551ada7      0x1036de92      0x5c7cf42f
+       0x9bcb3652      0x3987784f      0xcfa8d354      0x98659e8a
+       0x7c6462dc      0x9381913b      0xf34e5b3e      0x36df8a2d
+       0xb4faf4fd      0x60fb5e03      0x04158eec      0x8979dbd1
+       0xd2c21a33      0xcf6d2fcb      0xb12ea899      0x5253b50f
+       0x5e594c95      0x7284bd1a      0xe746ca53      0x06f96d59
+       0xe9de6b3e      0x03803410      0xa1d858f2      0x8b8657f7
+       0x0d4162ab      0x95a60f33      0xf1ab053d      0x7128c15b
+       0x2f79db78      0xbdc7d174      0xd8dc9ea9      0xa3f59785
+       0x74c6ff33      0xddf28b34      0x591511ac      0x4d8a8d37
+       0x0de29c2c      0xfb9f1e6a      0xe6cf02e3      0x539939a2
+       0x70947caf      0xfdf4270f      0x1100a164      0xba859bca
+       0x97dee242      0xcb0ab915      0xc28a0031      0xf76cdc57
+       0x6e66c36f      0xa797fe6f      0xcb6df78a      0x6ebb2e97
+       0x0ee6bb91      0x8de4af0e      0xa0d2fccd      0xeae7cb84
+       0x15f23995      0xcd674ce1      0xcddc0174      0xb952b1e8
+       0x71782504      0x1f747c66      0x19e32685      0x84a56908
+       0xa1f4a5be      0x8e6a987f      0xf222b162      0xc9930437
+       0x42e1ea32      0x2c2eeb4f      0x4731b176      0x9bc3e607
+       0x37f5515e      0x2b8e4f9f      0x2aba8550      0x50f9ddd1
+       0x58ddc1b9      0x75947cbf      0x0abfba8e      0x841f9f1f
+       0x069dadc6      0xe83cd9e9      0x759789dc      0x7f5c5ca4
+       0x07c29225      0xccf67318      0x97de839c      0x4e1df148
+       0x7a20ad44      0x31cb8a85      0x7f490a28      0x7d1a1656
+       0x57152c0c      0x7d55b186      0xf1cefcb3      0xf131eb0d
+       0xbc8493d1      0x17fbaff2      0xefcee9db      0x5f5a5a95
+       0xb92004b1      0x21449267      0x63ecb05e      0xe49b7a31
+       0x540647a9      0x49fd1a23      0x9ed5c174      0xa244a14d
+       0x4c9472a1      0xc708f592      0x17dab705      0x4274f9ab
+       0x08ab5c9a      0x602ba956      0xbbf687bc      0x1717007f
+       0x6e23568c      0x55ea4fc8      0x723dbdeb      0x0fc5e36c
+       0x64523bbc      0xad1a6b55      0x9837bbc4      0x6e52a3e7
+       0xd03441ca      0xbbb6df8c      0xd6697252      0x6f2da4aa
+       0x94de656e      0x10c12624      0xa5f244e8      0x72c7146b
+       0xe3014425      0xe041df93      0x9a521efe      0x86b2eae1
+       0xd095d69d      0xf6bbd12d      0xba43a859      0x282ab87e
+       0xa0ebff78      0x69e0c87f      0x7d14ce42      0x44027851
+       0x3edc8505      0x15347503      0xcad522a4      0x4f9b766b
+       0x16d657a4      0x33ff32da      0x220bc839      0x92ebc7f5
+       0x9219ce4f      0x2afe097e      0xaff96207      0xd307c69b
+       0x09a7f3d4      0x4554abc6      0xa9502f07      0x477b01d7
+       0xd20b932a      0x2c35f23d      0xd5ebc780      0xf9546079
+       0xe84e9405      0x25ac1f6a      0xcc3c443f      0x9d386146
+       0x33a1d55e      0xe422f8e5      0x777aa2a8      0xf3e897ec
+       0xa34b0838      0xcc9643e2      0x41702834      0x80e5fda3
+       0x5d814095      0x54702ff6      0x4f91b16b      0x98ae0b0c
+       0xf8cf2d5d      0xa200b65e      0x48511821      0x2e8722f5
+       0x147acd39      0xeac2f68b      0xc2c178af      0x0d5155f2
+       0x40c5a98d      0x2ea9cdb7      0x58589cd9      0xa76c4d0c
+       0xf1b2eb41      0xa169ebe1      0x9f59d297      0xf50fabad
+       0xc20acb23      0x19674a49      0xee4532f9      0x2e925d1a
+       0x24486eac      0x53aec881      0x8ad74637      0x779562c7
+       0x70aa2712      0xc0899db3      0x7fca4ae8      0xf8eaea9e
+       0x881926f3      0xdfc3a498      0x1c791816      0x7b09cea9
+       0x050667e6      0x370d6873      0xf7814892      0x618980d3
+       0x2f99b029      0x9bc8f6bb      0x625dbb01      0x3ec0567c
+       0x05a5fc45      0x71d42160      0xd2628efc      0x04ebfbee
+       0xedfdf421      0xa9300f58      0x54f9e2eb      0x499d5699
+       0x293ae3e9      0xc8cf35ad      0x9ece5019      0x4d24d1a5
+       0xd5167c3c      0x452a94a9      0x9b44e0a9      0x2ab9c19c
+       0x08537165      0xe2f91115      0xd4a4152c      0xbaaacaaf
+       0xc3e05300      0xbb0baa45      0xe9634182      0x09a6e09c
+       0x961b864a      0x992eaf99      0x92e33a00      0xcb8c1c1a
+       0xca1d7d4a      0x0a7dab83      0xbd60ec53      0xca708bd3
+       0xa97e98f8      0xed558fc4      0xd51267e4      0x57794652
+       0x133d4aad      0xe1b861ce      0xbe168102      0x007a1b16
+       0xdf08a40d      0xe761a6cc      0x71daebf2      0x73a60746
+       0x7929cbba      0x7ae763b9      0x0af8bd6c      0x98ef76e7
+       0xb463b22b      0x47ed2bd0      0xe50af1a6      0xe6337225
+       0xa09b632a      0x78496068      0xc8b89d6a      0x712da1b5
+       0x13147914      0xb03c4207      0x9725c5d9      0x6b114015
+       0xe98ace26      0xa3306ef0      0x926cd96c      0x3fa48ddc
+       0xb953f5dc      0x2e0c843b      0xb1c264db      0xe0f26270
+       0x840b08f3      0x6635f8f2      0x304b1728      0xa2c49b4f
+       0x07469866      0x622ffe72      0xd10d7143      0xb00e0d18
+       0xb76d4fc1      0x0c8e95a1      0xe0204bef      0x7cc1a000
+       0xc3f63f6f      0x50c171e2      0xb84ef3af      0x9f3364fb
+       0x02391e8b      0x6a062144      0xd8735f9c      0xbc448212
+       0xe6e1f61f      0x91750601      0x618c0642      0x3ea60e7a
+       0x5f1fd7f6      0xc4df14b0      0xc1470e35      0xcf0698d7
+       0x4b35c08c      0x8087143f      0x8fee4146      0x4563f24b
+       0x91f56e26      0xcbb627d6      0xac7fe373      0x8eccaa77
+       0x233d6d0d      0xeefccf2b      0xed159025      0x5dec09ab
+       0x6caedc10      0x8619b172      0xde79e560      0x9cd63d35
+       0xa6833e63      0xcc681535      0xec1d231b      0x5499eb3e
+       0x31ce53bd      0x39dfe672      0x63d8335e      0xab9cb671
+       0xcc5c0cad      0xd2b42d3d      0x51001000      0x01c29cd4
+       0x7b3a886d      0x93ff5435      0x4257aad8      0x957e557f
+       0xee6a5ff2      0x4601c423      0x691ab5ea      0x9f28e47a
+       0x2e441c07      0xb46dfce2      0xb85dba4d      0x2cc93e79
+       0xa29c90d2      0x239479ae      0x24459955      0x71958e73
+       0x1821725f      0x43781d53      0x57ce2d7a      0x09cbc141
+       0x52ed544d      0x765b4384      0xbfe1e539      0xaff3928d
+       0xc6533387      0x15c1de88      0x49a84665      0xddcf0d9e
+       0xde8e8287      0x3b495d4d      0x79d51f19      0xe6b93066
+       0x53dcf1e2      0x8e16e857      0xd42d5fe5      0x0864f760
+       0x27eff8c5      0xc728cf7f      0x67a46f77      0xa0103ff8
+       0xcf855c1d      0x0b2856da      0x2ef36701      0xf87d2a8a
+       0xa88bf5b2      0x44270459      0xc222c218      0xe3472c8e
+       0x147294e9      0x17d90558      0xa8b2839b      0x2da18106
+       0xbbc8cdf9      0x7986d8f3      0xa7b0dc4f      0x60a65a4b
+       0x93651766      0x9aa797d0      0x81630734      0xbdcf497d
+       0xd778ae9a      0x25dde16f      0x371b6fd6      0xb97f89ab
+       0xc54476ef      0x1566ce6b      0xa2849ad1      0x806a7c56
+       0x44e04e52      0x74cb5a8c      0x867c5d3f      0xdcbcf8c5
+       0x71dfd15d      0x0858e63f      0xc1126eee      0xf517cde1
+       0x3a6f8284      0xeeb9229d      0x7957295b      0x6b3cca9c
+       0x60c303cb      0x0ed8144b      0xdb28da39      0x8306abce
+       0xacb727f4      0x986057d3      0x86098196      0xd2b16b02
+       0x1090efff      0x5159e82d      0xf9947295      0xf5f6c667
+       0x9da3a5cb      0x1e48b098      0x6d5c6c90      0x383d4fcc
+       0x03d3a6b1      0xc8735258      0x389cb7d2      0x1e036542
+       0xdb037e85      0x27d2e476      0xdd9af5d2      0xd7ed3f8a
+       0x280c5e82      0x999392ca      0x749a0263      0x7810c063
+       0xc865ba64      0x896a9beb      0xb673e866      0x5caeca39
+       0x4cd2a62d      0xbb6b0b92      0xc71835f1      0x165b9305
+       0x3016ab9b      0xd3e0b3c2      0x217c94d4      0x19f842bd
+       0x5f125f2d      0xc1ee0904      0x465bd564      0xc460f787
+       0x946c6008      0x4a0d0533      0xd5c6bd32      0xf04f24a5
+       0xa9c993fe      0x6b0864a1      0x187d904d      0x86eb48d5
+       0xd79dd986      0x397f7e62      0x819367fe      0x65fa193a
+       0x272d28b5      0x30d3ae72      0x002f4db2      0xe4655566
+       0x90ac4aca      0xb5e53d29      0x4822cf23      0x56f8385b
+       0x338a06f4      0xadf089fd      0xeb9f1bfe      0xc09399c7
+       0xd29a120c      0x934328e7      0x51383456      0x01314dd4
+       0xe39975fa      0x6987ff55      0x4e3caa02      0xe67779e8
+       0x9dfbe6eb      0x3d19a794      0x7aca1062      0x2c1a1e11
+       0xcd2c5175      0x9be23364      0x229492a0      0x02fec171
+       0x2d8b1b44      0x7e606375      0xdbcfee13      0x04a33a9b
+       0x6ffcd7bb      0x7341f372      0x58f5c94b      0xf7b0cdf9
+       0xb5ba43e3      0x87f4128b      0xf2b5a2c7      0x3d3879a6
+       0xad1e477e      0x1236fe8c      0x664e0f88      0x41dfc0a9
+       0x31b4c69d      0x540c82ff      0x46fbe172      0xa06214b0
+       0x37529df4      0xd2bf7135      0x5d4e5e34      0x5d0c7d00
+       0xd2db4358      0xcf8688a1      0x0c711fd3      0x50fd0c71
+       0x4ec2e1db      0xd7a365c5      0x308c0a23      0x8d158bed
+       0xb600514c      0x8e133cf0      0x05af2138      0x3e1e6e62
+       0x2fa12834      0xf4cc4a63      0x22f00f7b      0xfd1daa6c
+       0x6623db43      0x95651a73      0x72e5e9e7      0xd42aad46
+       0x394043d0      0x58c741dd      0xbb56d30a      0xebe05fb1
+       0xbb8969a7      0xdd2b4af3      0x278c9406      0xb2b5e33c
+       0xee0d55f1      0xb6cdfa03      0x74826a93      0xef76b508
+       0x2c11ce20      0xdd49ed67      0xc562d228      0x67afe7eb
+       0xe76f1b01      0x80610fd8      0xd8656007      0xddc51ae3
+       0x99bff49f      0xbdca6ef8      0xaefd4e9c      0x07c8427a
+       0x5b5ada45      0x97bc8bf7      0xb4a27da5      0xaf3af444
+       0x5594b6e4      0x391beed5      0x09fc21dc      0xfbc8f199
+       0x6777a987      0xf33d15c2      0x1243b8e4      0x869188da
+       0x0b778b61      0x85959d28      0x4f9babf8      0x14fa33a0
+       0xea86de6f      0x5f2578da      0x14d30f79      0xe733ffb0
+       0xd913fe78      0xa523a7d6      0x5363d7b2      0xa3473e1a
+       0xb8adba3a      0xe144c2f1      0xe2b1f2b9      0xa3a2f9b3
+       0x842ef087      0x4c2b6680      0x16d2efd9      0xed96c3c7
+       0x683da5dd      0x9dd9c1d4      0x91457265      0xf987a602
+       0x34c042f2      0x21d69410      0x43c88084      0x554e55c9
+       0x7acc992a      0xb6da3604      0x006ef86a      0xe31a28aa
+       0x2770ba09      0x918a852d      0x79cc7c4d      0x64fbb9ab
+       0x01f8b85b      0x9443c44c      0xa6c3d2ce      0xb54cae74
+       0x1213c6b9      0x0858483d      0xe6f47844      0x5376709e
+       0x4b256846      0xf49c6aa8      0x25c81e4c      0x25999396
+       0x9b54415a      0x788d4226      0xebbe2262      0xc3bcb748
+       0x543af883      0x69c08baa      0xd54a656d      0xe0b039aa
+       0xac046b7f      0x84177c31      0x356c736a      0xb770fcf6
+       0x4b000b6b      0xf9b48dcf      0xf7657f1c      0x31b1e8e4
+       0xd8e994e7      0x34ca54ba      0x4911adee      0x7e5cc517
+       0x550806bf      0xd7fa5263      0x47e6ee14      0x1c49c943
+       0xeed7bcf1      0xb900ce8f      0x99777ef8      0x3baf54e7
+       0x2548ef59      0x17d9af8b      0xc676ada7      0x8f56dec4
+       0x1fa7bc61      0x81ab1dd7      0xce8f5df2      0xa3209c87
+       0x851f0c02      0xed3ac326      0xe0529344      0xd9306aa9
+       0x6b7d00ba      0x79426849      0x0ed3b6f4      0xae3e8af1
+       0x1e255fce      0x56eb5b59      0x07bf8950      0xa15d9b22
+       0x7dd6aa5b      0xa84faf46      0x74a1a06f      0x1a480b82
+       0x4fd0aced      0xe83372e5      0x6e6947c8      0x8397ca58
+       0xccb2423e      0xb264a888      0x13ac9e1a      0x0ef1a3b3
+       0x8e1afe87      0xd52bd6ad      0xdbae821a      0xc180101a
+       0x72ccbf05      0x210558b4      0x00ae1034      0x9340d9ed
+       0xfe6223ee      0xb8acbf6c      0xedc343d2      0xbac97e9d
+       0xa587fc40      0x3748b829      0xdae6c133      0x93a5521a
+       0x0f6e6c9d      0xe0d0e2ac      0xc2ad2d8b      0x8cab1489
+       0x24452aa3      0xd3e7fd52      0x08c5a8dd      0x3ef6d86a
+       0xc6a3c1bd      0x63a6d745      0xaf2ca5cc      0xccdc8223
+       0xc49c5c36      0xed5f1553      0xff5db9d1      0x82966ff0
+       0x8b8bd5b7      0x058fef40      0xe1ee6bed      0xbd645268
+       0xc89a4ffa      0x797baef7      0x2b4376f7      0xb61ed7c1
+       0x83ab37d7      0x72c77f78      0x9f79d15a      0x5d1951b1
+       0x114359c7      0xc7b6c8a0      0x15169406      0x6fec157f
+       0x1410a4c3      0xd1c2ba26      0x26fcf2ac      0x083e3f5e
+       0x9eb6cd4a      0x441e1768      0x6e540aa1      0xb27dbd7a
+       0xc8e42721      0xa2db5137      0xa7265985      0x169a754c
+       0x9e420ca7      0xc5c0f227      0xe437cc64      0x95aef99c
+       0x5e72ab86      0x8acf1554      0x257637f6      0xefa6e471
+       0xc58947a0      0xe7ca213e      0xbd2256d7      0xa59c1096
+       0x4d7c13d5      0x0ffe8534      0xf21f0220      0x7d485296
+       0x6977386f      0x9e240b43      0xc203de0a      0x570c75f0
+       0x7fc32645      0x618a34a9      0xdf2aae4e      0x1ae6e5fa
+       0xd624fb58      0x2df35718      0xd4b1dbb5      0x01b66636
+       0xf60ece48      0x1c2b5666      0xba1e4ff0      0x5bae1854
+       0xcfc26662      0xfc16d190      0x76ee7090      0xeae95c1a
+       0x6e76ca24      0xc7107724      0x7724006b      0x46cb66d5
+       0xe06ca426      0x44746684      0xecf7b1e6      0x1b24b877
+       0x6f88c894      0x4c9cec34      0x58cdf298      0xd899e510
+       0xdc1d2e48      0xe854758b      0x5ba5924c      0xb266ab1d
+       0x273660ed      0xdf07e034      0x4b5604e6      0x50dcbff3
+       0xef34afec      0xc056102b      0xaeba9d1e      0xb522ded9
+       0xe8908747      0x6cffe77b      0x1bde6b95      0x1e3786f4
+       0x95a8460e      0x77e0f421      0xf5908c99      0xe89b4c58
+       0x4aca0c69      0xd7c0b9a5      0x619bbb02      0x921b1d0a
+       0xea6579fc      0xd95bbb3c      0xc63bd462      0xa1e8e5a0
+       0xed0c345f      0x46b84170      0x34117047      0x0387a17e
+       0xf8d1a23a      0x553cbf2c      0x11c979de      0x3cf65056
+       0xf4a25aa2      0x605091ea      0x02faeb4e      0x97555584
+       0x3443e2c5      0xa9aaf9f8      0xfc6971d7      0xbf08de21
+       0x79f139a8      0xffe80b0f      0x97ac6bb5      0xff425410
+       0x4979eaa0      0x6d009b89      0x2c8ffde8      0x94b047e2
+       0xc8365227      0xa43a41b6      0xb2dccea4      0xdbbe4876
+       0xb54243de      0xe697c776      0xee033277      0xd27a3701
+       0x2a299b40      0x083de408      0xf34636a8      0x205d473c
+       0x749a26a7      0x7be9dc36      0xa97f3934      0xe14b3e44
+       0x0bab208e      0x7b264b81      0x291257e9      0xde72ec36
+       0x4574e269      0x57796910      0xb70e079e      0xf26fb4bb
+       0xfed27420      0x2f8774e1      0xcdfffbdb      0x079d7d6e
+       0x7103090b      0x42aa43e2      0x43145060      0x1507ed7a
+       0x796546a8      0x5b7b7273      0x70049828      0xeba1607b
+       0x6b10fff1      0x80ce2259      0x077c7b5c      0x65743d3a
+       0x7ef79050      0xb837dcf8      0x97a4525b      0xb0b2de90
+       0xe83727d8      0x6b6b91cb      0xe5a2dec8      0xeb46fde8
+       0xfd0662ca      0x4e41fd86      0xb6dfc704      0xa196e275
+       0x8ff4c3fb      0x0e9a9f98      0x9b346734      0x03d3e037
+       0xbc9688c1      0x79e2341a      0x5fa428c3      0x4965486d
+       0x3b7502f6      0x1d75af58      0xda593f8f      0x78b75ab7
+       0x6e70c385      0x0210b6ef      0xa9e9c0b3      0xf3856c36
+       0x6cb020ee      0x019797cd      0xbb6e9b95      0xfd1ce108
+       0xfe0b08e5      0xec225a0e      0xc2d4ad33      0xdef719ef
+       0xffaeeea6      0xe1243771      0x3615c3ec      0x72cdbaae
+       0x566bb86d      0xd8845192      0x86f125cf      0x7898db6a
+       0x5dcbc672      0x285dd79f      0xe23b16f8      0x014114d5
+       0x516ae99d      0x785c3fc2      0x4cd36c31      0x288a6976
+       0x14124dcf      0x5cc7f2ec      0x5b8d8ecb      0x0301d1e5
+       0x4982c681      0xd9a1c7ce      0x4f94fb85      0x90ccd5a5
+       0xdbbf99da      0x650fd62b      0xfdc4f3b7      0xbcd913f5
+       0xd013d980      0xd8f89a26      0x761fdae3      0x92313163
+       0x9118c987      0xad2b0584      0x0b5b89fa      0x315f8457
+       0x2c9e481a      0x5209ad43      0x4e9ab303      0x060e92b1
+       0x0639f966      0x9d4fb6cb      0xd57b371b      0x15a162b3
+       0x39148221      0xcbe014bb      0x407307dd      0x8ba26aa8
+       0x3be5f416      0xc43a9c41      0xd332b1c6      0x0af92f10
+       0x45467e20      0x6db14b18      0x6b13fda6      0xee416fe0
+       0xc27e01a8      0xcbe2df1b      0xd202f12f      0xcb9538f5
+       0x16344446      0x44edb8da      0x9e685ee7      0xda2e7ea1
+       0xe2a9cabe      0x3aaed424      0xeef7b952      0xfc5ee770
+       0xf6f6352a      0xff0b30be      0xe9655fa3      0x8313d64b
+       0x43703914      0x7106d5a7      0x6435d631      0x607ad042
+       0x4bf0dfd2      0x385492e1      0x48b348b5      0x38c35b9a
+       0xfdb51c06      0x66346026      0x9c192cbe      0x504ca3cc
+       0xdf1f5d15      0x05df6fd5      0xa7f21311      0x83c216dc
+       0x96b7f3fc      0xe63fa223      0xb56d4d98      0x025628d9
+       0xe0b9029b      0x8a7d4fe8      0xdafa0c44      0xaa612564
+       0x7a79883e      0xca986c55      0x40421bed      0xc038c502
+       0xbd051dfc      0xb0b49027      0xece58167      0xcba46998
+       0x34ba0fe1      0x5d187c08      0xdc47004c      0x6d74842c
+       0x2ae5624a      0xd50830c6      0xd15ecb95      0x17ce8d88
+       0x6e9276db      0x37736b67      0x6c76df1e      0x93dcd47d
+       0xc8d79fb2      0x0588b459      0x69a1bd05      0xceb86a87
+       0xd870509d      0xa2182729      0x7cb99aa1      0x2f2b6056
+       0x4869b722      0x8a46e79c      0x60d2ea42      0x0a0ef7bd
+       0xdb0f19d7      0xb12f65b5      0x7cc51707      0x3f21c663
+       0x2b1f67d0      0x6b1ed5e1      0x4333b92b      0x7d54a7a9
+       0x03a9ebf8      0x329601c4      0x4d428e4b      0x2a50477b
+       0x40a92952      0xbd58f69b      0x2d18cb43      0x331d4674
+       0x500c3cc0      0x501e3415      0x4efcf36a      0xcfd2291d
+       0x3c8657cd      0x00f687ae      0xfb3a3320      0x2d1854f5
+       0x5e6de7be      0xda36f143      0x5275dc99      0xd025b4a6
+       0x0b4bd9eb      0xf9ee3514      0x57abfa48      0xa81dae71
+       0x53845138      0x67ef4067      0x5480eb95      0x6dd8d7e2
+       0x7005155d      0xeeebabdd      0xf7a27c90      0xadee3747
+       0x314f2207      0x5001c5d0      0x0bc6e690      0x5ac451fa
+       0xb2cec227      0x84a7adfb      0x42a217bf      0xd3817dbf
+       0x32b7ff64      0x4c029b42      0x2717b9ec      0x4cdfc875
+       0x29db73da      0x70b48751      0x81a370e5      0x34726efa
+       0x4bfe99c2      0x252b678e      0xa2f811df      0x00413042
+       0xd0d1b87e      0x87f0d2da      0x5c380bd0      0xffb9e978
+       0x107ae818      0x15dd6a54      0x05d83a7e      0xa69448f9
+       0xe05d10c0      0x5f3b283c      0x3542204c      0x4dcc0839
+       0x0c5f54f5      0xf31ebdeb      0x5c1b87cb      0xeaaddddd
+       0xb4d61728      0x9b22b56c      0xad635da5      0x890aafdd
+       0xb2b77d91      0xf1ca2170      0x93029f39      0x21bdba33
+       0x736fd17a      0xce304fb8      0x6386fec6      0x01e91644
+       0x9be9c0a6      0x339ac4e4      0x1f980bf7      0x4d3277ed
+       0x75f7c6aa      0x4268086e      0xf934105c      0x45231df8
+       0x4c29625f      0x636c44c3      0x5bc247a5      0x6dbd584b
+       0x91192c3e      0x2cc14b07      0xc2234991      0xbfea0822
+       0xeb9687ef      0x1a1de5a7      0xa93f8b2d      0x7f1e8c33
+       0xc98ad887      0x0bad541a      0x766213a3      0xe2260c29
+       0x3de6c95d      0x8ec8963b      0xb2dc9bfb      0x9c08dacd
+       0x30ec7579      0xe9c6cc98      0x7b9a3234      0xf22ab140
+       0xd6984299      0x1f37764d      0x858a694e      0xb716b059
+       0x0bf8efb5      0x86d575e4      0x88dd61ef      0x2ca7b6fb
+       0x106af38a      0x4e35d588      0x327d4501      0x190a11d3
+       0x81e0288b      0x748a0223      0xecc2d2aa      0xbc958592
+       0x0b271e73      0x721eca15      0x375daa70      0x78c9033b
+       0x35643a59      0xf7f8b522      0x876112a4      0xba2bc70f
+       0x6478efdd      0xfdde22fb      0x7c3dfed5      0xd7fe1862
+       0x96aeee40      0x800855c8      0xdd37a6ad      0x3a84bc05
+       0x476c96b3      0x313b0837      0x5f499ed9      0x7d2e36ba
+       0xceb15da7      0x64cc6357      0xef5ff7b9      0x4bace9d8
+       0xc3de5315      0x6a68b3f0      0x3628f647      0x7a01c17a
+       0xae62464f      0x3a8d3185      0x2b78e14e      0x85a5e84d
+       0xde213afe      0x46cb8306      0xb19edd23      0x86d647ee
+       0x92e1fb05      0x89fca641      0x2700fd68      0x9abe7af7
+       0x41a0c32c      0x81898e73      0x5ff48040      0xb54580a2
+       0xeb5186ad      0x507375c2      0x0b4848bd      0xb07fe901
+       0x0d93ea1f      0xf991e92b      0xe9676946      0x747d6df0
+       0x56a6bf32      0xe6a63b17      0x5a296a56      0x112b3537
+       0xae4c7a7a      0x3fc1caa1      0x932ee139      0x0d345fdc
+       0xd46cd214      0x5e8323b8      0x6346c206      0x0c9f152b
+       0x5e1f0f95      0x6230e379      0x400f60bf      0xecc113ba
+       0x5975e3fc      0x62c9f9c5      0x5ba85502      0xca610496
+       0x582ea53a      0x05e7ecad      0xfa3f762c      0x412b2a6d
+       0x71670f10      0x4fcbee0e      0xf09cb82f      0x4d76c70c
+       0xdfdf510b      0x44c52b3e      0x907283fe      0x2a3d9481
+       0xc9bdf0ed      0x1798c4a6      0x68bfc2fe      0xc940dc1c
+       0x9354742b      0x31d55875      0xdc416900      0xce9331ec
+       0xae9f8e06      0xc0daa781      0xcd848a26      0x2f0b02aa
+       0xc0eb3783      0xf256f4e4      0xcdf477ab      0x7f66be8a
+       0x4f8baf5f      0x6157a7b8      0xdb2482bc      0x2a85231a
+       0x5c2b7eb8      0x0f49f740      0x6af5f4c9      0x732fcdd9
+       0xae01bcee      0x55f142bc      0xfad20f99      0x0e156e61
+       0xa72243a1      0xf187ff0e      0xe0ffff47      0x6d6e5238
+       0x42980807      0xb7e51b3a      0x2e54e824      0xacd9a4be
+       0x86b05c24      0x53d3aa13      0x08031859      0xdff1d3c1
+       0x25e00058      0x861c7a0a      0x1f1e3258      0xd4cb2853
+       0x6c86a0e4      0x158b6074      0xe30ddaf1      0xc4bbc48d
+       0x8bcf8953      0xc1372083      0x18073359      0x5f9cf737
+       0x5c3c0d12      0x9f5389e4      0x91a038fb      0xe8bf9dac
+       0xef60f867      0xa81b58d4      0xbc45f8c5      0x56b97f8a
+       0x6bb92b76      0xdc2aa293      0xba0b6502      0x7425f0ba
+       0x612c13a6      0xa2f2960a      0xddca243c      0xfc89a041
+       0xdd3c1943      0x5c5fd16d      0xab313c5a      0xea4d057f
+       0x8a4af66b      0x20257eb2      0x08d37adf      0x5919c7a6
+       0x4851f6b1      0x492e2f2e      0x36b0d4c0      0xb114f9ce
+       0x2e3f772b      0x942d340a      0x9e82414b      0x8fe95909
+       0x182ac3bc      0xb61a79e5      0xea2b7e3e      0xd6c24248
+       0x8c05863f      0x5380cd65      0x73bae4c5      0xa89a3972
+       0xe6c7b775      0x992a0588      0x11074bac      0x09132399
+       0x7cf0c30a      0xbe0bd1ee      0x8cf6e461      0xed196e5c
+       0x9a852385      0x26109fd3      0x91fa3ea1      0x2b5b312d
+       0x5caaac5e      0x6f65ae60      0xa2f21e6f      0x01dbdcd2
+       0xeb9fe559      0x1f77a3db      0x84a3fc80      0xf5081861
+       0xedbbabcf      0x2b582fc4      0xd873c137      0x38949a47
+       0x14cb2d76      0x8b82464b      0xf307f8ed      0xc4ed602c
+       0x6d4c4962      0x60483dd7      0x8b74d774      0xe3b273e0
+       0x54cd6692      0xcbdf06d5      0xc76ed302      0x4072048f
+       0xf2e67b28      0x1d8f25cc      0x8eb3820d      0x9dce8211
+       0xfbb5b706      0x4911c664      0x498cb190      0xeb086e18
+       0xaab32d7d      0x77659ae5      0x0d33a0d2      0xdb3b58fa
+       0xd95a0e2d      0x41bab52c      0xdf8cb9a7      0xe5be76ae
+       0xe5d3959e      0x545f4f88      0x0d810eae      0x42086f42
+       0xe9951149      0xeb280219      0x9f89757a      0xd85fe39a
+       0x8caf75ea      0xe605030c      0x16cb8151      0x3f10871e
+       0x70ce960c      0x7497c71b      0x1dc2df1d      0x718f8a11
+       0x88b5d93a      0x61ae0176      0xf7b06d8c      0x5b975445
+       0x8173b27f      0xb6bb1bd3      0xe428b56f      0xf2757513
+       0xc4eb2c1b      0x0f480969      0x735e7378      0x45b51ed4
+       0x13628703      0x7cafcab7      0xf59661ba      0xd509df58
+       0x9c89f68d      0x22f2d3e5      0xb63e3b55      0xcb381ad6
+       0x6fb7756f      0x9227a63a      0x08fc0721      0x5a39461d
+       0x7ac6ed7a      0x2145aaea      0x6a91b4d4      0x17e7847a
+       0x62b65666      0x953c8d6a      0x25ab7103      0xe92e3b09
+       0xbd95cb19      0x776def1c      0x707cdb78      0x2557b7df
+       0x8ec44671      0xe4f4b4dd      0x9ed1fd8d      0x8ac6138a
+       0x383542f7      0x621ac3d0      0x529446c6      0x57de60ab
+       0x159f06fc      0x03e234e7      0x7c95c8b5      0x9000e809
+       0x914a2724      0x94693755      0x54ed28a2      0x2ab5669d
+       0x9b1210ae      0xa565f56e      0xe6f4370b      0x1f8999ff
+       0x16f8b9fe      0xb0f889f0      0x722b4d96      0xe47322a2
+       0x086734e4      0x02944b1e      0xf158227e      0xa2867257
+       0x87a261de      0x82ccae09      0x4e263f28      0xd34a3206
+       0xd519172c      0x925e3840      0x2dd5fcd0      0x2fd51f10
+       0xfd3db761      0x8b1b7678      0x113e3438      0x077d715d
+       0x3513f8ce      0x177d0926      0x3203a088      0xaa01716b
+       0x522f474b      0x380d61e4      0x3ebd3255      0x0fe370f5
+       0x1be5edf6      0x6738fa64      0x759fcb14      0x87e19f53
+       0xd2fab90e      0xf612b889      0xdf8a32bb      0xea93eb69
+       0x75f6c1c7      0x63cb06c5      0xd673a63f      0x62512736
+       0x68f570ef      0x8912b248      0x11b08705      0xc431e781
+       0x57cc81b1      0xde5fe207      0xf524334f      0x82d083b2
+       0xe9d5733b      0x56b09eab      0xbbc76a27      0x5c1f4192
+       0x315f95c9      0x11784e77      0x4b2dea04      0x06e3c08e
+       0x693e4455      0xb3b21fbe      0xc2359f08      0xd38509c4
+       0xdb8be759      0x84aa9e41      0xd0187e39      0x9ca1aabe
+       0x8336e963      0xb5753fb1      0x36d35860      0xb4901721
+       0x673e390f      0xb15d8744      0x08611d98      0xd113b5e0
+       0xae88b81b      0x6a3986f4      0xa5b078ea      0xd809237f
+       0x632e0ec0      0x5da21e6f      0x17a19bd0      0xfc067354
+       0x8a4b39d7      0x878b4dee      0x38d9bc60      0xedcdfdb8
+       0x02e2dcc5      0x7e793f70      0x545cfd75      0x231760e3
+       0x3b06b558      0xd1ebec25      0x3bbc4561      0x1de5c33f
+       0xa8be3608      0x496ec301      0x8a60ff90      0x0b464864
+       0x24355c7d      0x0df4ce8b      0xcbdb764a      0x888d8fe1
+       0xb3048d2f      0x0efa5175      0xc41d4cc3      0xfa6bee3b
+       0x353c9949      0xdb191cd5      0xdb7a24dd      0x9a501902
+       0x38a8c55f      0x0b68d5b1      0xe6bfc496      0x75d094f8
+       0xf61aeb27      0x3f2442ea      0x31c65668      0x854f3c74
+       0x038480ce      0xd0e38812      0x5c591451      0x7e8e5a92
+       0xe16d372e      0x410b345f      0x80bd6abf      0x478eba91
+       0x08affe8b      0x0b866ea9      0x8ac35b00      0x8060c27b
+       0x0f9c9112      0xd655d30d      0xca7b6889      0x5cc6255d
+       0x9f073643      0x4c947c23      0xbfe3e6b7      0x17efd8ed
+       0xbb3a9850      0xb156dca7      0x0bfd2388      0x88bffee0
+       0x00a6440c      0xf995eceb      0x4f707603      0x23d57780
+       0x7bec0bf9      0xdebcbfb3      0x4ef065fb      0x1a302ba3
+       0x04192dca      0x946bee85      0xb0b7e7c6      0x320f8d45
+       0x38deb95e      0x33c79be8      0xe5eaa420      0x7f92daf9
+       0xe6cb25b0      0xd40f40bc      0xb84add83      0xc5c2ca98
+       0xc6daa9e3      0xd6ca4704      0x6354e6f0      0x51c5d31e
+       0x729d120b      0x8a2196a9      0xe61aefdd      0x80fe491c
+       0x3558d507      0x68feb980      0xbfd332e4      0x0da57078
+       0x6eb13214      0x6f614ae1      0x945830db      0xcfd3d7c1
+       0x30b376e1      0x856075e5      0x4b23527a      0x4ebad274
+       0x78747fdc      0x9af54a7b      0x12ac6d0c      0xb1b54096
+       0xbfdda75f      0x128ab19b      0x27df8b10      0x8c7c4129
+       0x3f624e9c      0x8ad257a1      0x1ef6d4a7      0x975c7886
+       0x0f6bd612      0x14ca9031      0x7de145ce      0x9bfb1a63
+       0xcbb5e614      0xe7801eda      0x9285d689      0xad984119
+       0xf1ee771d      0xa33ed630      0x9ac8e735      0xc6fa6871
+       0xf08bfc19      0xc712cb28      0xc86cf1a2      0x2ccdd60b
+       0x17b8c249      0x5fbddb03      0x97994dcb      0xa7cc6bb2
+       0xd78f3ef1      0x975f3e5d      0x00b8214d      0x31ed6277
+       0xb36cd683      0x479c1b64      0xdde3e419      0xf05836c9
+       0xde1b0549      0x34c6f410      0xb09ba104      0x6d30517a
+       0xe99a3a43      0x144a1632      0xd84c5846      0xa43d8850
+       0x4edbe0db      0xb42f8b4b      0x2179a398      0xb7e6d28c
+       0xfb0b43c8      0x0125ea28      0x39821135      0xca96637d
+       0x16f5173a      0x3231e220      0xfdee4613      0xf95f5d6a
+       0xfe690577      0xf4c46861      0x7e29b629      0x50e9ab1a
+       0x546e6d9e      0x5d79fd8e      0x93c67ec1      0x98309faa
+       0xcbb2bd86      0x606467ce      0x0814890e      0xd8770236
+       0x65f538cf      0xf2dcfcc4      0x4a39b0a7      0x436d7323
+       0x64ae68c0      0xdccc2654      0x7443744b      0x66be2a44
+       0x699957c4      0x93b62946      0xacf624ab      0x175fc132
+       0x3e89d209      0x1555ac25      0x62a25b70      0x0673a851
+       0x8132cb98      0x917c1ced      0xdfe51ea3      0xbc2d7718
+       0xa9d20408      0x0f897a72      0xd47719f0      0xef6fe253
+       0x24a754bb      0x999fa777      0xccf547ed      0x2b7d4539
+       0x74b58a9c      0x8106cac6      0x08ceab23      0x1c5353ee
+       0x7755a6d8      0x5c540708      0xeb4db8ac      0xbe274621
+       0x1aad9fe8      0xc4730db6      0x071c4042      0xe7604f3c
+       0x422dc9c1      0x7443db5b      0xcec0c201      0x56247323
+       0xd7841a1d      0x2e7b4062      0x33529c42      0x195bd16d
+       0xab2908a3      0xa380e98c      0x3458650c      0xce7321b6
+       0xda2ccbf6      0x81c2cbcf      0xbf1a6632      0xdda7af3f
+       0xd837f6e5      0x1af3fba7      0x799dc943      0xd338b93c
+       0xd53cbe53      0x1ea14b1b      0xd14983cd      0x5c128b83
+       0x67b4de12      0xe1953066      0x363304ff      0x8d721875
+       0x4872a85a      0x95a1c4be      0x1ec36a87      0xfa01837f
+       0xa9a5c3a5      0x66eccb5b      0xc5ad6d97      0xe8f3c55b
+       0x31d7786d      0x554c65d4      0x8d9dad06      0xa8079ee7
+       0xe7858df3      0x9947190a      0xf6933767      0x9451bff3
+       0x62ae5373      0x5ed0cc9c      0x45a002f7      0x264b46a0
+       0xc6844f34      0xa609e1a0      0x6cb4f75e      0xcf949485
+       0xe51115d6      0x7e9c3921      0x07ce3eee      0x0a324524
+       0x9c438342      0xaf75882d      0x16ae3a18      0xf239ee69
+       0x9bd67ee9      0xa4fccb48      0xd3a3452e      0xb9591408
+       0x61a908f5      0x8caeef9a      0x5f60734b      0x16dd888d
+       0xb12fefd3      0xe1633adc      0x559f7c6b      0xb233acf9
+       0x7b31c9b5      0xd8f67ac2      0x52f43eac      0x1ec42085
+       0xadb38845      0x3e93dd26      0x237b5838      0x049c5841
+       0xfd0c9e22      0x89fcbd6d      0xe4ec3767      0xed69deaa
+       0x32e0def7      0x5e6838a5      0xd148bda5      0xd93cc961
+       0x51c6e231      0xf0f8ff84      0x07d71241      0xbc827db9
+       0xcb0f66c6      0xdd559f7f      0xcdb23b06      0xa312dcfa
+       0x25451423      0xf1937dee      0xaa8392e6      0x28a40c5a
+       0x22ee9b7c      0xb134936e      0x802a1c38      0x15f289d5
+       0x49f7584c      0x41d79fe1      0x852d4371      0xf16a1bcb
+       0xf6d56ff1      0x3f030117      0x91240da9      0xd89243a9
+       0x255b2462      0x919c2dfd      0xa9ca3fad      0x9410a730
+       0xcee4d4a7      0xd1ff1629      0xe4e949cd      0xb792a0c6
+       0x4557b3d8      0x7f35f4ff      0x0fc40751      0x815a6254
+       0x9599e787      0x67d63390      0xb85cd4d4      0x49cf0026
+       0x1b77297e      0x1ea09e33      0x52922842      0x88850b80
+       0x15602291      0x0e102d47      0x3b9017d4      0x7c69cd81
+       0xd0fc8695      0x89b66f04      0x644b0c26      0x5d9c1f6c
+       0x2b439fd6      0x2b4c7754      0xdb12e51d      0xe6425b31
+       0x213d40b9      0x5cff5b94      0x36d37893      0x42157be6
+       0x8187955d      0x226c75ed      0xc11ba2d2      0xd08e7034
+       0xd71c8f16      0x100cd39b      0xd22b9c90      0xabbf1b20
+       0x96cb5b9c      0xc2bf3c79      0x153e2dce      0xe4e09907
+       0x669b62eb      0x318c4d63      0x0f020ab9      0x97eda6bf
+       0x4aac44d2      0xe6a48e8e      0x67b2c4eb      0x8c6951b8
+       0x25b56bca      0xb1b86107      0x0f896429      0xfda27789
+       0x70f6ee52      0x04e4b8cd      0x39eab79c      0x680a97f0
+       0x57cd1f78      0x03a7be3f      0xe7bc5154      0x90c21bcf
+       0x29c5f3f2      0xe651bedb      0xbc60e231      0x26fcd61d
+       0x77e29bdb      0xe1f7632e      0xd0542216      0x5c20409b
+       0xbf04c9d2      0x42494839      0x69cd5d4a      0xa13238f0
+       0x37ee6e57      0x92f0692c      0x895db8b9      0x11618b3f
+       0xbf84f1db      0xff26cf0f      0x39fd3e89      0xcdae196f
+       0xa6e4fc99      0x866a0f26      0x1e5064e0      0xc8cb2c35
+       0xe027c58e      0x7826835d      0x23102f37      0xdb2e2ae4
+       0xf991ee0c      0xc09d41ac      0x1d35bd25      0x2cc7002e
+       0x16fe24c9      0x550acd8c      0x698049cf      0x5ac6f2fb
+       0x8b42e909      0xd54c7bba      0x6d7e0bd0      0x827ac5b3
+       0x515741d6      0x4b68ac60      0x5dc21b9f      0xd550920d
+       0x30dc43c2      0xf66a9f00      0xdf0653b9      0x25e44abe
+       0x37de97bc      0x539fdc3c      0x814d3d35      0xa7321b72
+       0xa7d54281      0xd1343cb2      0x335685bb      0x4e026598
+       0x959a0af7      0xe9d9347d      0xe1428335      0x4aea4d28
+       0xe291cd87      0xfb3455bd      0x9bf6ca76      0x407bfd48
+       0x7bd8199a      0x1cdbea77      0xe77bfba7      0x30d4d97a
+       0x5d319b28      0x2bdbb1be      0x1d0c4b1e      0xc2b8987e
+       0x16609582      0xc8179734      0x078b4be3      0xa600e314
+       0x946f5e54      0x0eed6f63      0xa78b90b3      0x717643a4
+       0x6293fe4b      0xbde73e0d      0x011ee48a      0x4302e756
+       0x24d15f56      0x89c5ffc9      0x4481975a      0x81ea1ffd
+       0xba958ba2      0xb434fca0      0x72459be0      0x80c84042
+       0xc5162b2d      0x3a1b24b4      0x9a0b30b2      0xce47289b
+       0xc7300404      0xd1be44cc      0x67ea5c42      0xf6c97d46
+       0x63a5dc05      0xea5fcd0d      0xe095cb46      0x6a0849fa
+       0x50f172ee      0x39809f1f      0x79d7aa5b      0x3658c931
+       0xe6861e96      0x6ec7d014      0xfc481f9e      0x5f937642
+       0x01843f84      0x343565f1      0x54876cf9      0x442cd4b7
+       0x883a07db      0x99c484bc      0x95f15b01      0xa1574a2b
+       0x4bc75f62      0x93644ba0      0x1ba23bb0      0xb4acbdbe
+       0xa1b9e321      0x70e96254      0x1be5b668      0xf3df4e76
+       0x1ec1077d      0x53a1755a      0x235f32b6      0xa43e6554
+       0x247708f1      0x26ac0aa5      0x21d0e0de      0xe56c8157
+       0x579bdbf4      0x36f1e4eb      0xfa9eae74      0xa72b378d
+       0xd8ae11a2      0xbf7cd65f      0x5878079c      0xab1fda3f
+       0x409d08a6      0xf7e21f8b      0x07fd0685      0x1104254e
+       0x4f4cce2c      0x6a3fe8b9      0xd7a3a98a      0xb49dd0b6
+       0xf6c622bd      0x40dc74d3      0x92a5efd4      0x8132d6f7
+       0xeb789b86      0xe372562d      0x9c191f01      0xec41e204
+       0x7f72233e      0x6a97a91c      0x7548c957      0x23e77111
+       0x1669d8ee      0x26065766      0x93edbc5e      0xff1befbd
+       0xc9703895      0xb66287be      0x48cc29ca      0x65c800a9
+       0xaffe3b20      0xabbc2173      0x11610d2c      0xdc6b71c6
+       0xbc7b05af      0x2d390968      0x295bf334      0x64372651
+       0x461c260c      0x776d6dbf      0x39dd11a6      0x5af6beaf
+       0x2fd67fe3      0x59b8b4fe      0xe002655e      0xd998d7e8
+       0x4e2e26e5      0x1c490af0      0x633fc9fb      0x4f3bc077
+       0xa34f9f58      0xd4dad154      0x65c97188      0xb37b225d
+       0x04027ffd      0x4b6300a3      0x478742df      0xb7689dd4
+       0xea6377a6      0x850fa531      0x9de3c417      0x11c5b298
+       0x87d695c7      0x1adc2a5c      0x88455398      0xacefd3ff
+       0x34e32daa      0xd1b9008e      0x808afbaa      0x559120bc
+       0xdbf49720      0x9c5badf9      0x9c34258f      0x8018ee25
+       0x2b93bce7      0x779ca04b      0x6e0a3b48      0xdfbe13df
+       0xf123f183      0x4277cc2a      0x6c2e48a8      0xd3e3f81d
+       0x578cc007      0xaa81a4d8      0xd48d4ff8      0x7cf48c52
+       0x12b11d11      0x3c7002dd      0x434817b3      0x9a57ff3b
+       0xa19ad130      0x14a2590e      0xb973ee61      0x03e2fb13
+       0xd2ce4893      0xc8874799      0x114949d2      0x76e77375
+       0x078de0fa      0x55ce0761      0x3d544841      0x5b025388
+       0xcf3c4773      0x803ef761      0xb2e053af      0x7c523650
+       0x19d21655      0xef79ab2a      0x76ddb493      0x6dfffdb6
+       0x2ba16dd0      0x43c032c8      0x73efba26      0x963c8bda
+       0xcfed3f28      0xa5050b0a      0x05da3600      0xcba16a30
+       0x46bff28f      0x15ff5bf0      0x723ee92a      0x7d30a9e1
+       0x04c0b56e      0xb2784bbe      0x12e22ea1      0xed9765bb
+       0x98122b90      0x12f11308      0x16cc0f64      0x0d1684d8
+       0x27636750      0x2f423c1c      0x2d232bbe      0x4e3074cb
+       0x5ee7a3f6      0x70a07522      0x0fa51377      0xbea2a52b
+       0xcbcbc9c1      0xa0e9445a      0x342bf8a6      0x5ff44d0f
+       0x5dbba578      0xa486b64c      0xd333f02e      0x94166eba
+       0x835a2f39      0xea4144d9      0x1adf550e      0x922f5f14
+       0x4bd6842e      0xcc5508fd      0x509729b8      0x97e3a0da
+       0x1502d681      0x54133718      0x76af6c05      0xee5e68ab
+       0xa9032f6b      0x1b35fcae      0x37f9101d      0x29fa9067
+       0xee63a074      0xbb8fabc0      0x5bf66de5      0x9de88092
+       0x49c256ac      0x798c5a57      0xe47b5d30      0x273739af
+       0x6dd98eac      0xba8aba44      0x943ceae7      0xb51cd54c
+       0x9c44196a      0xfb8d5174      0x962f59f1      0x4b993f12
+       0x8c7866a9      0xa80e66bd      0xd619e562      0x7526df66
+       0xcbe7248b      0xe58056fb      0x21959ce9      0x7cc51a54
+       0x56e87a27      0x3a9c278f      0x9cec3ea9      0x66b8eab3
+       0x0667bef0      0x8375b748      0x5d9138d8      0x86e91bc0
+       0x24185745      0xdb2f13d3      0x01b2b0dd      0x9a358fdf
+       0xf30e3c7d      0x304b0dbd      0x440bb690      0x0b711e8a
+       0x6056cb97      0x30ae756f      0x5fb1e8c8      0xb2384413
+       0x879931ee      0x5aed1a79      0x3c859d95      0x7af6f363
+       0xcbce37e9      0xdf2be0f8      0x7f12d56b      0xcf915753
+       0xac8e345c      0xd7df8ee4      0xd9b5e1ee      0x8306ccc4
+       0x9e5b3fc7      0x38bf4e27      0x63475afc      0x4233edc5
+       0x230ffb77      0xe13918d4      0x1ea05a03      0xf845750c
+       0xd417f2dc      0xb6d25158      0x219039d4      0xbccaf9d7
+       0xb1e44727      0x6dae7c78      0x47549388      0xeeb315f3
+       0x79aa11ad      0x88a50a8e      0xee3cac93      0x6a51924c
+       0x04a4b799      0x9106db64      0x42b4a099      0x9b2901b6
+       0xc2e3aac4      0x586d472d      0x2a789813      0xb95a7af4
+       0x01d13bbb      0x5f0b8e41      0xf95f3182      0x641dc9e9
+       0x265779c9      0xa713a2f9      0x5cd19f4b      0x27aa226c
+       0xeddd652e      0x3a07395c      0xca22ac57      0x4ad147e8
+       0xf43ed399      0x5fce4508      0xaa1289ab      0x22b1df6f
+       0x399520ba      0x09f3a4bc      0x59bf9f38      0xd8bd704a
+       0xa64ae533      0xfbb34b9b      0x4aa9d05e      0x2ab62f9c
+       0x0dd361ad      0x000caeea      0x37267540      0xab66045b
+       0xedf23eff      0x54d08375      0xa0d56a23      0x8eb27a52
+       0x44d900a9      0x3d922854      0xae577189      0x8a7f6af2
+       0x05dc4fcd      0x44abada7      0x8243f96b      0x2b748f8a
+       0x483e7ef9      0x8862cbe2      0x39d0b695      0x2cb8216e
+       0x4d9fe0ed      0xbe5193ab      0x77187f01      0xc1ac2739
+       0x45caf4ec      0x0f87807e      0xfacb08f1      0x6a1713df
+       0x65413100      0xbee9fadb      0x8dfddbad      0x6c5b94a4
+       0xa672ee8f      0x6caa7dde      0x28f1c33c      0x591d41ee
+       0xa5cd15fe      0x4a193248      0x3cbfdcc3      0x1f2deabc
+       0x3bf46283      0x44ef7fe9      0xc2746149      0x08959fbd
+       0xe24dc276      0x7671f2e3      0xf1530519      0x1a6d6dc9
+       0xe50f31b6      0x7b8dc105      0xb888fb09      0xf61d2497
+       0x9b116244      0x0f66d30c      0xe7f0dd57      0xf3d57d01
+       0xca0249b9      0xbeb19bec      0x08651ab9      0xd4ed5cd3
+       0xd69286bc      0xbe88a628      0x6c65d515      0x3504a143
+       0xc5058619      0x244e9c08      0xac47e987      0xb9d6c7d7
+       0xe70c1d95      0xaeed74fc      0x11958ba5      0x8e6e335d
+       0x632d8338      0x8935ff5d      0x4ac507ed      0x3352bef7
+       0x797e7b7a      0xbee98206      0x832a50a0      0xc4a1a343
+       0x97b85530      0x41e6364d      0x168f4fb7      0x7aafc495
+       0x4d151df9      0xda375844      0xce336f4c      0x9da29b59
+       0x544e4bca      0x2a342322      0x64669f0e      0x964f0e3d
+       0xc08b95ba      0x9c3dcb9a      0xdfbd1d47      0x9b3ed679
+       0xafb6ace8      0xf126b860      0x54135b76      0x021216bc
+       0x50828699      0x0a7ed42d      0xaf94229c      0xfa5d6724
+       0x9eb496a5      0x80d45fe9      0x2736e370      0x2ce968ab
+       0xbb04396f      0xf3af6073      0x151b4e88      0x79186842
+       0x8daa7f9f      0x8f58396d      0x5dae83bd      0x5e2ff686
+       0xf8ce141c      0xa63764fd      0xf899c2b0      0x4f4566a6
+       0xd9265d15      0xb462bb9d      0xe9dc819d      0x976b3bf3
+       0x089e1788      0xb818e7ca      0x8e7ea97e      0x5d751541
+       0x9d3eb2e2      0xd492ecc6      0xe13b3113      0xecab5969
+       0x148fc8e5      0xad3ce50e      0x76180016      0xfcefbd01
+       0x7fdb6d60      0x12b4f0a9      0x2c20795c      0x8d9cfb96
+       0xeb6a9c96      0xe52d4229      0xfff76799      0x5257131d
+       0x9e519097      0x976dda55      0xb9f1ee47      0x9ae4c7a3
+       0x0066626e      0x2d761ad3      0xa126348c      0x211c5d8d
+       0x4b04d2a2      0x17623762      0x50586c7d      0xdd1a458f
+       0xa7a75592      0xe07db4fb      0x1c734db9      0x7a93cf62
+       0x9f36c801      0x8e690d73      0x66384386      0x54c6b876
+       0x207e9d7b      0xf37c3e97      0xc578a411      0xe882fd44
+       0xc635590e      0x3245084e      0x0a32171d      0xe16911de
+       0x1b7333a4      0xd6b1f15a      0x99231acc      0xb47744e3
+       0xf9d870c2      0x20ea41c0      0xc5a758f6      0x96c2e9bb
+       0x21cdc437      0xab9e4714      0x895c8b0c      0x4cd96082
+       0x552c42e4      0x631d677e      0x584af198      0x7b8986d3
+       0x7bcb6916      0xac597320      0xc6bb955b      0xab3fbb95
+       0x73e18e2c      0x35a123db      0xe29ee696      0xa47e25c9
+       0x7694ccf4      0x07e0312e      0xa98668c1      0x25ceef8e
+       0x208b4cdb      0x5d52d0b4      0x73eb5d34      0x101d2bc4
+       0x6efb2462      0x6fc5cb2b      0x03eaae45      0x43e0ad16
+       0xfbe69890      0x142b491a      0x8fdd772f      0x2b16d31d
+       0xfe9d9330      0x22e85f18      0x65ec872a      0x64871a65
+       0x36ca658a      0xc0b57a2a      0x04d6a752      0xa698f526
+       0xa1114058      0x8fea9ab6      0xe8a7edaf      0x6fd0093d
+       0x18448c52      0xd8a462cd      0x5a67343c      0x01b15967
+       0xfe12ac1a      0xf54f606b      0x688163c1      0x622e372e
+       0xffdfe4ac      0x6f01351d      0xc5ea04eb      0x7a51dd8b
+       0xd7631eee      0xadefd7a8      0x5c5caecc      0x2980fb70
+       0xbfb74ae7      0xfc7261ba      0xed4131b7      0x9f74fee8
+       0xe44ce2f8      0xd62e9ad4      0xff5c5f3e      0x36a8a6f4
+       0x0c16614b      0x9fa3ca8a      0x178a2e2a      0x3d2c2500
+       0xec1e3b87      0x2bed0c6a      0xc8c33d5b      0x52759bb7
+       0xb2662e95      0xaac07365      0xedd4ca11      0xbc89b970
+       0x2f3ee0d8      0x35ab53f2      0xffb12a47      0xb808e006
+       0x09e3b477      0x9cdf9eda      0x6fd3da31      0x959ada45
+       0x316c6a4c      0xca919150      0x1156bf37      0x04414cbf
+       0x068df2d3      0xe1e8e0bf      0xfbbf9e6c      0x91221c9f
+       0x39bd5ab4      0xd2b1e6e1      0x2362f14f      0xad545262
+       0x701c0a2b      0x772464ad      0xffcf8891      0xcdcdb1a9
+       0xe34e80e9      0xce7eebfb      0xde299e34      0x615e2ed8
+       0x52a7f9e3      0x6cc1020d      0xbdee7e4a      0x569e7fc2
+       0x59c142c8      0xf7c20e96      0xf20fb631      0x6740687c
+       0x4d68fff2      0x5a2cd053      0x33b257e8      0x7b4f088a
+       0xa4f176cb      0xfd328e24      0x3e154e03      0xa43b5b87
+       0x11c71071      0x7257bfe8      0x2a535d61      0x36c78202
+       0x722d168b      0x6890769c      0xfe42ecfa      0xa831d7c2
+       0xb29d1ce9      0xb5aeb94c      0x37565794      0x2539f681
+       0x5e591752      0xcb418994      0x835a9582      0x268cd714
+       0x1e3609aa      0x6d61ca85      0x9e9294dc      0xd80dc7ff
+       0x62fe6445      0xe1ea3101      0x5ad5adff      0x0db24cfe
+       0x80a30b66      0x88d2bc06      0x9274e673      0x434cc675
+       0xe9530b4a      0x269c98a0      0xc22c1ee9      0xf1a3a9dc
+       0x51fb0a56      0x7547d9ae      0x867b1489      0x508c8a12
+       0xdf8cd4c6      0x762bd1ba      0x80794fb2      0x2e923a11
+       0x6c00d0bd      0xc3bb10df      0x8c5f12bf      0x6ca706f3
+       0x7fe862e8      0x0d1518f4      0x61c8eec6      0xf201b867
+       0xc3faff2a      0x3c8e0c74      0xb57f2e79      0xf84a69e7
+       0x3f29ffb6      0xe4460c7c      0xb93854a0      0x826ccfb0
+       0xe5bac7c8      0x8fae6291      0x9a481041      0x4fbd6c9f
+       0xd565e22f      0xc736254a      0x7ac9ac60      0x57e9395f
+       0x8324d3a2      0x19aedcb5      0x458ec2da      0x6f2bcfa2
+       0xabf94fc1      0xf090b920      0x52a32453      0x8df5ca69
+       0xa6cad8ad      0x78b946c8      0xc2a66495      0x6be3328e
+       0x661d82cc      0x792206ef      0x9a23f795      0x87a4358a
+       0xc095f84b      0x3b55b6db      0x61e9fcc5      0x193df332
+       0xeea4ffb2      0xa948c000      0x33e4c69f      0x63e18e34
+       0x15d54588      0x95fcd9f6      0x5b802518      0xd29163f5
+       0x33e0c0d2      0x5d55f78f      0x4670d87b      0xdde32267
+       0x0caee58b      0x97adfd07      0xba82b888      0x1309f9d5
+       0xbe324ab6      0x52f3bc02      0xa65c5525      0xa6689f03
+       0xb18bac07      0x51267e61      0x49f82171      0xddafed58
+       0x37b59cec      0xd78152d2      0xc9e15f7c      0xad73670a
+       0xab87d97c      0x2b8ee545      0xc53aed3f      0xe3dcf6ba
+       0x760bac69      0x77063b2f      0x75358b30      0x1edc6db8
+       0x7cf2ef97      0xa15ffb60      0x6ab73f6a      0x29832e6b
+       0x47a21751      0x8589bea3      0xf2cc45d8      0xdb3d8cec
+       0x8f89316e      0xc92e05e8      0xf908701e      0x05ca02fb
+       0xca9055af      0x98261ed8      0xc20ca7fb      0xa818983c
+       0xd6afd167      0x0c23b117      0x7b14c760      0xeeeae6ce
+       0x2d6d2df1      0xe8b97dd6      0x91a146bf      0xc45c2822
+       0x18edb5d2      0xf4322067      0x344eca4d      0x7aa61d1b
+       0x6b7bbcb8      0xdaaff992      0xc7f1d9af      0x004a5488
+       0x4056e400      0x68720a32      0x07020016      0x6d9508e1
+       0xe67fafba      0xd3192f4a      0xeb75feb8      0xf70f0078
+       0xe9d4e113      0xd6ad19d7      0x0a57fa5c      0xacd3e0af
+       0x3b2f8dfc      0xe60fa073      0x71d022c0      0x60cdc1cb
+       0xff6f3e3b      0x6f56876d      0x02da7761      0xdba11240
+       0xcb6946a2      0x0c1cd2f5      0x5e58b320      0x031e6018
+       0xafe088a6      0xb945aef6      0xff9ba07e      0x22f2c150
+       0xa06ea588      0xb7c84ee2      0x021832d5      0x15bab1e3
+       0x5751e3d7      0x0ed06781      0x0ac46714      0xf2b83cba
+       0x82974ac8      0x572d7f6c      0xc0b2dcc9      0xb74267ad
+       0x01b5f663      0xdc669a6d      0xe54de2e1      0xc489e3be
+       0x8745a0e2      0x02bbe7a8      0x78ef8353      0x70611454
+       0x49487788      0x5539e7c7      0x24cf1183      0x1d8afdd0
+       0x119f6314      0x3d8a6f88      0xb21cba2c      0x8fa40360
+       0x9346fe4f      0x41a673bf      0x0480b244      0x35ea4016
+       0x16a555bd      0x6053a483      0xba8b89f5      0xf01dfe8b
+       0xd034f390      0x3dc8d073      0xb62c428d      0xc157396f
+       0xb80fe4ff      0xf8ed4318      0xd77e5827      0x6e25f621
+       0x741ca755      0x1a230108      0x812cd8fe      0xc16b06cc
+       0xf8c7e326      0xef900c87      0x55182109      0xeb49c8bc
+       0xe4d64da5      0x159f165c      0x6b83712b      0x727d0a0e
+       0x54295c6f      0x512e128c      0x5f64ae6c      0xb6e0b9a3
+       0xc9bca0e5      0x74acac20      0x5133cc55      0x53854fc1
+       0xc53b1a16      0x8e3737b4      0x0ae1c226      0x82bb4958
+       0xd076fdfa      0x61bbc3d6      0x9bffc907      0x8884ada7
+       0x61653261      0x9dad1561      0x94f09e29      0x039dcb7f
+       0x2254661a      0x341d1877      0x1be7116d      0x4ec98bdc
+       0xe4c65bc3      0xabebd063      0x47589b3d      0x9cc879f5
+       0x15982c8b      0xa77020c7      0x3538b713      0x370c64e1
+       0xc74fb9f2      0xf8b41ed8      0xd2ebb5bf      0xb017d73b
+       0x97ba1ff9      0xa67b8a27      0x6d0c8a44      0xa105b7a0
+       0xb37a34db      0x0fe7f07a      0x1c148611      0xfa53072d
+       0x3171bd8b      0x2650cfb0      0x80fb7709      0x701a10de
+       0x97eea655      0x59ae138c      0x742dc115      0xd631b80e
+       0x39592e51      0x46e17975      0x84d0086f      0x1ce1898a
+       0x7dfc4667      0x97e090d0      0x1af1f5cf      0xb901056b
+       0x6102fa9b      0x8b091ff9      0xe6b04608      0x50d42eb4
+       0xc34910eb      0x6420d46f      0xe1c63a02      0x1545563f
+       0xca592437      0x9bb5a862      0xa9adaa9d      0x6b63f3dd
+       0x2e8421d1      0x4436c8a1      0xfe069f0a      0xec241501
+       0xc0372dae      0x381b7153      0x8f81e0bd      0x43d5e80e
+       0x5784effd      0xa2b6e1ca      0x2ecf57d9      0x69fa2072
+       0xb75cdb16      0x902b9782      0x8167bb38      0xfd05e6cd
+       0x21f6e01e      0xf3f9c0f6      0x788d65fa      0xc957a9be
+       0x9470c32b      0x718470fd      0x93593bed      0x50ed8943
+       0x33088cd2      0x69f3ca47      0x66d28d9f      0x038c2c08
+       0xa8ece07a      0x3e2d4144      0x6a676915      0x5e2e1d63
+       0xf3ad8ae3      0x1b9725c8      0xe037d675      0xf1e80565
+       0x3d40fa7c      0x30f6e383      0x0a39dcd5      0x60fab0b0
+       0x515e34b5      0x58eb39e0      0xdd81d1f8      0xe3ca488a
+       0xd17ca1b8      0xe6b69eae      0x64847000      0xd6885f81
+       0x78417c1b      0x32757661      0xaaf7bc36      0x9122e930
+       0xfbd61074      0x1d53bf81      0x60a449c1      0xe743eb61
+       0x288768f6      0x4f549549      0x557b2e14      0x358d1fa3
+       0x3aaad4c8      0x985986e9      0xd36a1f61      0xdc2ae2e0
+       0x6e96ff1b      0x7b6c4f31      0xe442671e      0x32879a8c
+       0x5833b991      0x45de1989      0x4811924d      0xdb23156d
+       0x2d4f2b8b      0x554979bc      0x5fe9829e      0xfaec643c
+       0x9323dff7      0x38807f08      0x0e255d02      0x2ad3f7e8
+       0x9bfa7c5b      0x0beff56b      0x5c992f75      0x92540340
+       0x46d25820      0x8db340f0      0x452cf847      0xea8f58e2
+       0x41091440      0x6399d1a8      0x8a2264ac      0x9609e3ba
+       0x263fba61      0xb1923d79      0xcd9d5fd3      0x4a5b670a
+       0x2d5bb9a6      0x7fb0f958      0xc3c50eb4      0x77ebc5b9
+       0xd0656774      0xf8047773      0x309dbbb4      0x0395875e
+       0xd03f9414      0x541cdf9f      0x1f28cb35      0xae620c69
+       0x714cfe74      0x131f5c3d      0xe1a1276d      0xb4797d11
+       0x1824aa85      0xf695b531      0x30973b73      0x5f95c0ee
+       0xe6722704      0x5d73a400      0x66f06a52      0x08a42726
+       0xd5fb4ce1      0x9577bf82      0xbdfbe01f      0xaf1045c6
+       0x170bb145      0xa40f9795      0x88da4c37      0xa8417263
+       0xc0b19124      0xca1e4aee      0xe16a930c      0x5708231f
+       0xceef40b5      0xce8a8658      0x8d77f697      0x56d8c708
+       0x682fb701      0x062f7bef      0xcdd06d3f      0xacbbce6f
+       0x4e3377d0      0xc8d08a3b      0x07387e43      0xf5738441
+       0x34e27cc7      0x2959d4bf      0x6e798e68      0xe2fd29b2
+       0x95e8b685      0x972bad63      0xac3e25b5      0x57e61037
+       0xc265f8bf      0x697b6f8a      0xf0cf5f0c      0x8733e846
+       0x7a70f93e      0xf370c803      0xd7c74e5c      0x9caccb57
+       0x021cf7b2      0x0c104e67      0xab6f3c9b      0x71000592
+       0x9ba5fc98      0x07060ad5      0x0fcd94da      0xb7cd6659
+       0x54e7be2c      0xfda3d365      0xe418f91a      0x0265bf0d
+       0xa87143e1      0xdf948a49      0x161dfc21      0xb91c3822
+       0xd17f1149      0xd88d6db3      0x02b5ee68      0x306f9e00
+       0x70082a00      0x201722b0      0xfe921c36      0x946a098e
+       0x2c85aafb      0x3feb3e95      0x023d093f      0x68c3fd43
+       0x49796b79      0x215b7bb9      0x7d899645      0x53e0b6f3
+       0x01275119      0x89ef5092      0x0bee6baa      0x828287ef
+       0xf2cdcbbc      0xcad0a642      0xd7dd58dd      0x8507b066
+       0x4867bd5d      0x17735ee4      0x3d8c84d6      0xe7bbfc25
+       0x4afe54d8      0x76a67be3      0x90e22d33      0x7af2edc8
+       0x340d131a      0xd6169ca3      0xfe9c531a      0x80d4a781
+       0x9f0ad542      0x23b90fa5      0xf3e3b2ff      0xdbdd4a15
+       0xe885ffb3      0xe83f06dc      0x36d01664      0xccac8eb9
+       0x0e2fe658      0x8e32fb03      0xf0feb948      0xab0bbc6d
+       0xa2ebbb23      0x82f5a9f1      0x025b340c      0x3a1537e2
+       0x3353e8ab      0x5d461c01      0x8c0fa939      0x7233d4f3
+       0x2d77fcc7      0xd39fadff      0x8756fc45      0x48cbfcb8
+       0x6ba0c1bb      0xaf826bca      0xe471a042      0x2a073d41
+       0xdfff768d      0xe9e7e40b      0x4e26ea1b      0x471d13ea
+       0x3e41db9e      0x2de0a5b5      0x52fe94f9      0xdd74f6df
+       0x303b55b2      0xbcec507d      0x093e8352      0xce8c109e
+       0x5b9e3ecd      0xe0ab45cf      0xcf7e5d4c      0xc96c12af
+       0xe07f086e      0xcf6c6d70      0x3618958a      0x9eff845e
+       0x35d4cbc3      0x68eb4585      0xf20f85fe      0x599d4cc0
+       0x32293be1      0xaae3a3a4      0x76ece22e      0x22e032c2
+       0xaea4cac8      0x563cb9ef      0x85dfd3ac      0x744b495e
+       0x41913409      0x1553da8c      0x1778e480      0x350155b0
+       0x9c1517d2      0x4bb4ff82      0xe8649a4a      0x8858b0be
+       0xd5de22f2      0x4f8485f5      0xcbbb7992      0x0f4bfd5a
+       0x48f9feff      0xee2b26f0      0x3dc09391      0xc8caaf8c
+       0x3e64f3c3      0xf7a299da      0x9285b5f6      0x94a0bed9
+       0x5cfb559f      0x5c152fc4      0xc3ac4928      0xada954e6
+       0x8b0890cb      0x35c8e9d1      0xbe8f23b6      0xa752a66b
+       0x3153a838      0xdfa3ac41      0x2d01f9ee      0x15b6a289
+       0x3a59c616      0xa62ba845      0xc9fceb0e      0x894d02d6
+       0x59bbe43f      0x8999cca5      0xb7e3b015      0x1c56389e
+       0x1a4d8fe2      0xd8093920      0x2ef7b14b      0x4d09fc33
+       0x8148f366      0xb33afb8d      0x62a121da      0x012313bb
+       0x42fcef59      0x69f66472      0xb8539ce5      0xf56a9e1a
+       0x7e8f0b38      0x55a7d94d      0x72ca77d0      0x33eb0192
+       0x393552d1      0x1ea5b260      0x63d751e3      0x59cc559a
+       0x765ec596      0x07dd4159      0x783419e2      0x84870e85
+       0x6fe93a6d      0x1c4fa8d4      0x845a9b43      0xf83c406c
+       0x01bb3657      0xb57f03fd      0x7a43accc      0x25086537
+       0x2749c2e4      0xa74612e9      0x214c1c64      0xff5baeae
+       0xf9718add      0xf45ac774      0x1f709894      0xdd07661a
+       0xad8bded0      0x016f598c      0x85728daf      0xcdf2648a
+       0xba9b05bf      0xc5915f4a      0x0e636683      0x782a41d5
+       0x92258d0d      0x76879ddd      0x4dfef931      0x43c6294d
+       0x9e0a0f33      0x3baf914f      0x82ea0ccc      0x2417f36d
+       0x933d283c      0xd49064df      0xaf705fb4      0x292ff209
+       0x104ecbbb      0xf7161f37      0xf1a32b65      0x440d9e20
+       0x99b1f14f      0xdd7c40b0      0xfe1454b5      0xb66c6234
+       0xfdbe13e7      0x46c99139      0xb8479077      0xf7779973
+       0x8c960fb6      0xa194e586      0x3c720cbc      0xee20add6
+       0x28506fbc      0xaccd5f81      0x80f6cdbf      0xe1c52a91
+       0xc4ccd59a      0xaf1e28de      0xd89853fa      0x85843b1d
+       0x04c1e2ff      0x5c0b4616      0xbbd12336      0x9fa7b839
+       0xc7deed28      0xc2ab5517      0x89cfe951      0xebbdb0b0
+       0x598f7687      0xe928e119      0x3f03cb67      0x985af6dd
+       0x5d54a64c      0x96f70d4b      0xdfe127a3      0x0cc32534
+       0x3fdf00bf      0xa5490101      0x694635c9      0x1d181afb
+       0x195e7dae      0x08d1b01c      0xe50b7f44      0xe0c66ff8
+       0x3e7d7df4      0x29dfa54d      0x396d4d56      0x5a5fec29
+       0x2f0b1ea3      0x1c429153      0xf873906b      0x6eb926ef
+       0x1ed0626a      0x2e783b2c      0xeb16668e      0x54ce6f8d
+       0x44346c9d      0x223594b1      0xa676ba72      0x52e6aad6
+       0x43aac9f7      0x7c3a943f      0xf3b3ac65      0x40406bad
+       0xffe83b06      0x78aa8653      0xa1fa7542      0x6ce5804e
+       0x5460f9e2      0x2d71b525      0xb7326a91      0x4ec206d4
+       0xf527fc96      0x11772a2e      0x2b40b840      0x39d3f9f5
+       0x8b0f190f      0x8644fef3      0xa5ff3268      0x52f86ffd
+       0x0f018df7      0x42540a92      0x7bfc5d35      0x964c0a00
+       0x018bf8cd      0x3ac4a3bb      0x46d91e99      0x34864b57
+       0x9b27684e      0xf52848c7      0xe9f499d7      0x5ed9520c
+       0x325d3019      0x54b74933      0x10bbcdbd      0x843d5ce8
+       0x1350ac4a      0x10054476      0x0c434aed      0x6e401c15
+       0xeac89092      0x8928ccef      0x4b3ceca6      0xb79327e5
+       0xf68b937c      0x8284deba      0x5787d3e9      0x171732af
+       0x2dbe7ee5      0xe7a0c06b      0x95615d4f      0x8f8c11a6
+       0x13b2e6dc      0x55df9fe4      0x087a97a1      0xaf7bd784
+       0x9b9e74d8      0x26a90a74      0x7f4f506f      0x10eecf92
+       0xedd22425      0x490a9ad2      0xc229a4df      0xfba84966
+       0xe7a61de1      0x5bc09b37      0x09114d32      0xda88bc90
+       0x8f445360      0x69b19ba7      0xb9d2a4fc      0x1d971264
+       0xf9da43f3      0xee9cfc18      0xbd336645      0x3bb51d85
+       0x3a9a2600      0x58599a7a      0x48bd1dec      0xd8e78ad6
+       0x40bbca73      0x92b149af      0x063f99b5      0x4647638f
+       0x7d175128      0x140aa819      0x6fe74eb6      0x94691c2f
+       0x317fac5b      0x98a645cc      0xda37bc6b      0x6b3d5ddc
+       0x4ace45cd      0xcd36c61f      0x2e5c5b6e      0x7f5906e3
+       0x0784d3d2      0xf4b96726      0x077559dd      0xe068de7b
+       0xb32065a3      0x630e552c      0xf8f58a90      0x397637d5
+       0xe73aa63e      0x97cc9bc9      0xa4d6d2fa      0xdbbcdbd5
+       0xdd8f2653      0x0c81184f      0xdc1a58ac      0x3b420612
+       0x47c5eee1      0xdf8b7c86      0x12ad08db      0xbdda9dfb
+       0xe15bcf9e      0x98fb6b80      0x1e0abf93      0xdcd32013
+       0x5ff178a4      0x74bc98fc      0xbc942107      0xf84dd8c9
+       0x6f65042e      0x30be145f      0xb6d4fa39      0x54ef9dd0
+       0xc67654a6      0x5a4fbe86      0x97431a93      0x29be3abc
+       0x61f8d807      0xd629e228      0x2d348c64      0x40d53c5f
+       0xb32f8f6b      0x9d7d19d1      0x91c295e7      0x0900015b
+       0x3bd8edce      0x643a6dbf      0xdb9c134e      0x052d2348
+       0x3985d783      0xe6214b3e      0x0ceea115      0x8a97ef33
+       0x1951fd0b      0x05672f90      0x24b61c0e      0x32aa09a0
+       0xd56e1a76      0x9b43c0b4      0xfdf5c115      0xac8854a6
+       0x4574d2eb      0xc3b1fb64      0xfb318b58      0x1b61932d
+       0x645d1434      0xac9c6028      0x68db8a50      0x695e0986
+       0xb9378c0e      0x5d9753ce      0xc5801b0c      0x2b914f4d
+       0x69362da3      0x6dcf0bba      0x3dba091b      0xd81155bf
+       0x2ae6ceaf      0xbc5d3ea6      0xb3696a31      0x0d910d86
+       0x61e9f818      0x11966945      0x7e808dcd      0xd6c990a3
+       0x23fed067      0x7f98fe99      0x38c05e9b      0xfac83319
+       0x6f40f294      0x99225033      0xa04177da      0xabde8892
+       0x09bb36f3      0x7a958cd8      0xb74932bf      0x2efaf9cf
+       0xfcdf2bcc      0xc5baeafa      0x289ad862      0x3eb0f9fb
+       0x524bd500      0x66182e9f      0xab892c38      0x64d7ec97
+       0x510aef95      0x9f7cee10      0x415865ba      0xcd86791c
+       0x17c3bdad      0xe214512d      0x3fc96df1      0x93b8d658
+       0x4e817981      0x74192d57      0x1718380b      0xc3b266e1
+       0x3c29d04c      0xed3f09b0      0x3f336186      0xc74a44e4
+       0xd30e15b4      0x3fe5cf4b      0x38e02365      0x87da8d5f
+       0xa6918ee3      0x1f58d143      0x7d762103      0xfb1b37e4
+       0xc9ba17ca      0x29105a84      0x01c6f74c      0x577de9e7
+       0x270ed2d2      0xdd28071a      0xc66d7707      0xc9250b61
+       0x11521c10      0x9efab61b      0x94ef5452      0xc2a8847b
+       0xc4eb4a70      0x75549c80      0x5a398a60      0xf27cf77f
+       0x162ccca7      0x6cea6d46      0xf8724576      0xa7715f1f
+       0x83472f4c      0xaaaf12e8      0xe5f3225a      0x602188f3
+       0x8e10688a      0x477793c2      0x055a94f5      0x989004f4
+       0x50538cb2      0xf758cf09      0x5b3e1f0a      0x9d3be1ef
+       0x78b3bb3d      0x283429b7      0x5904b82b      0x7791ec90
+       0x4f62f742      0x85910cb2      0x88227cd9      0xab20b554
+       0x9e181a23      0xe4ca55f4      0x415ecf0e      0xfbba25b9
+       0x56dc4d43      0xe491fb91      0x008dc964      0x8528b622
+       0x9538ab29      0x1fb56a06      0xcf6b791d      0x138b53ab
+       0xf37d6d8c      0x38f813a1      0x59447c80      0x9ec08e62
+       0x551d8684      0xc30c28d2      0x4f7a7e94      0x2f1a6fba
+       0xb03d5bca      0xcea3cabd      0x1c3c66e7      0x89b412d3
+       0x31eec879      0x51d9c13f      0x8d4e64dd      0xacaffbec
+       0x1e978596      0x6663f425      0xf344dd59      0x5254ff1b
+       0xa6bc460f      0xc4fdb022      0x3d5e5d4d      0x411f5f91
+       0x8c574d13      0xbe2ae560      0x0882307b      0x26a703f0
+       0x77a928f2      0x1c65e6e7      0xab26ad92      0xa370c465
+       0xc92aa2c4      0x3ceb0899      0xcbf6c098      0xf133da7a
+       0x4ea55ec0      0xe80a19b7      0x2c44ac08      0x76a7f23f
+       0xbd64ba33      0xf3ead7d9      0xb1638c82      0x2959cdd0
+       0x0a7646f3      0xbf2857f7      0x355605cd      0x54801112
+       0x45622ed8      0x9f1ea771      0x63a53f12      0x81d63a7a
+       0x0a989e59      0xc3fe2618      0x65762357      0xeca3af22
+       0x138494f7      0x17795305      0xefaa46af      0xe5a3d0aa
+       0xff654c04      0x4f9543ff      0xd32bf76c      0x90a9c531
+       0xd72ef592      0x47396347      0xeb3902d2      0xbb67ba7f
+       0x9885fd57      0x663d6975      0x4ffd1507      0x465c7749
+       0xa09ae051      0xf1ac19cb      0xae4a58ff      0x8d51f111
+       0xe6cfd107      0x183241e8      0xe1024212      0xa6a1be30
+       0x0d6fb8cd      0xa9fdfc68      0x682db3de      0x600a1191
+       0x6576b836      0x1cfb2dbc      0x81edbcf7      0x6724d6f7
+       0xc953334f      0x8beb8c32      0x1cff827e      0xa1b64518
+       0x94bd5568      0x9645ea51      0x1b17cb54      0xb4537111
+       0x4ee6404b      0x4a9e390e      0xcc3f0596      0x3b40e328
+       0x0a8a46ee      0x18a2497a      0x4ebe7b10      0x4734ed23
+       0x4b5b780d      0x2d58b0b7      0x4f003454      0x106ea2b0
+       0x96338a78      0x99a2d258      0x3bcd3c24      0xe9171f98
+       0xf53f28be      0xeb4c6bdb      0x7873f13b      0xadfa32bc
+       0xfd9a5c9a      0x8f9c0955      0x74a20e95      0x0e5ceb7a
+       0x6cb22f73      0xa0e403a1      0xb3b46888      0xfd897d09
+       0x75a7571f      0x6f57ee02      0x6ab0b730      0x5ec25c97
+       0xb7ad96a0      0xdf8c309b      0x1ef43910      0x8aa0762b
+       0xb837ae11      0xb8dea241      0x48fd99dc      0x7f172ee6
+       0xa601708e      0x73db75de      0x992c9983      0x63712a44
+       0x4959af0c      0x7e2918f1      0x171d5d78      0xd08a48b4
+       0xd4918738      0xa793aaf7      0x75ba7d1b      0xa7906816
+       0xd2448c66      0x2dbb4c5b      0x06bd992f      0xac8e6248
+       0x0598d56b      0xb270c2d4      0xb30e6c13      0x8e4d5737
+       0xfa6d2ff0      0xd9b814b2      0x67f8c96c      0x25eb6d9a
+       0x84ab30a7      0x1bc02a16      0x1b7490b4      0xf15f3b88
+       0xff30e664      0x93923f25      0xd7d16d36      0xae8a6386
+       0x5d570513      0xde712ee8      0xdf6f779d      0x69f99aac
+       0xc08c2fa9      0x2936303d      0xb827825d      0xeb572a57
+       0x889f4adc      0x88f7a156      0x8e55d08b      0x6ef07e2f
+       0x85197e9a      0x84ed69da      0x9f71b333      0x541e5ca9
+       0xb50378ba      0xfb378085      0xfb70ab90      0xea0118cd
+       0xf2af9e45      0xe3cc28ba      0xe23dd167      0xca4ca7a9
+       0xb0dd538c      0x06200f5d      0x5cf68a66      0xf91ea9af
+       0x69679e3e      0xa119c1a8      0x1381e5f4      0x4dad271f
+       0x44e96569      0x7f4c0a70      0x48b1f70f      0x3ed120ce
+       0xa9a14283      0x848cddc8      0x29bff7d6      0xcb3818bc
+       0x6b9cf285      0xea21693a      0x2bfe9e1a      0xd675777f
+       0x964c311f      0xa916619c      0x271395e9      0xf18749e6
+       0x6e490302      0x75d6a3f4      0x1a7a5cdf      0xeda3ed50
+       0x04fc7264      0x42b53a21      0x82f2706c      0xe5a6f0f9
+       0xa0636220      0x4249c3b2      0xa5e01986      0xd521df61
+       0x8f5107ea      0x18bdae9f      0x3a685b33      0x5b68b069
+       0x81842215      0x3477440a      0xa4ea6722      0x4282ab6d
+       0x95438aad      0xbf5c89a9      0x73caf622      0xdbe07f84
+       0xa0b36e6b      0x9ee5fc76      0x371a4e80      0x0dc46f3c
+       0xfbe25193      0x0a416bb0      0x3ac9ffad      0x42ab52d3
+       0xc2c7ba93      0xce3914ab      0x7cbd49de      0x39cecd8a
+       0x6c6e19f5      0xae1cc215      0x68647865      0xb9878bce
+       0xc69e46ff      0xbe330e8b      0x9b26e30a      0xa023d085
+       0x39d91fc7      0x4401e719      0xd9f62ad9      0x6d1aef5a
+       0x234c8a27      0xe4f8e6e9      0xa6c63d04      0x601da433
+       0x359bc185      0x96a6a1d3      0xeca09192      0x1bb7b4d9
+       0xa6b66bb9      0xa20f2686      0xe08e66fa      0x83e105f0
+       0xd0d3070c      0x56e6f3e3      0xb52defd8      0x89e3b8db
+       0x87f5dbbd      0x82ae6cb3      0x5133abdb      0x722ad75b
+       0xfdc790ca      0xffcb2097      0xf5a5f8c2      0x598a62d9
+       0x69abe5f5      0x3cd812b2      0xc1ead283      0xf308a524
+       0xc69a652a      0x60bf3daf      0x7e8c3c8b      0x060c78af
+       0xa427b01a      0xb7002ac2      0xee11e506      0x3b1f02b5
+       0xfd6a99d3      0xf68673a2      0xfea0aceb      0xb7e3129a
+       0xcd6be898      0x1e350a9b      0x00087306      0x651027d7
+       0x96f67b85      0xfddd87e2      0xcecd9ce1      0x23914f19
+       0x2baca7a7      0x59e98966      0xe3d40395      0x0d474a28
+       0x21a45fbf      0x180cce5c      0xb95349cd      0xfc33ab53
+       0xfed5c534      0x31ea17b3      0xf738b5b8      0x3c7b1c2c
+       0xb4ff97fe      0x2991d2bf      0xa161c7d6      0x0b8d0e28
+       0x2bb0845f      0xa18ee08d      0x3cbb23d3      0x272d2fde
+       0x979f51be      0x402a856a      0x2e2e684c      0xc0725c5e
+       0x151498e0      0xcd3b3ca0      0xc284884b      0xc35eb429
+       0x7011a50a      0xae111112      0xaa6b3716      0x583738ce
+       0xd3233b6b      0xeacf9269      0x500c7c5c      0x5ba9c133
+       0xbc02b573      0x7f324a4a      0x0da91320      0x8481fe8a
+       0x86bda1fa      0xa0644d02      0x42ec50ee      0x3cc0dcbc
+       0x91782c66      0x49e0bc17      0xb72ac376      0x2a599d01
+       0x72666f91      0xf28b3a2b      0x2e1d4883      0x9eef84fd
+       0xeb1156fc      0xb82fb5e7      0xc1d31b05      0xd0e66645
+       0x17936957      0x4e70a725      0xf2104854      0xfb1a8aa3
+       0x33dd7589      0x7cf3351e      0x7be5be6a      0x69f1efc2
+       0xf6bc5444      0x71b15520      0x23bd7f80      0x5f9b8652
+       0x74ec2e77      0x8a7475d4      0xcb055568      0x56638ae9
+       0x059d2310      0x61d0ebaf      0xdcdb9ad8      0x80d3ed00
+       0x691d72aa      0x348fdef7      0x82f12704      0xfb9f8298
+       0x1e6dd716      0xe43a1bbf      0xb0d9fc3e      0xf041bd37
+       0x55663cb8      0x58c507dc      0xdeacc350      0x95d01a50
+       0x0a5a1a98      0x3bca74f9      0x5b83fa01      0xd29a2529
+       0x80dd918d      0x152c46d1      0x70d432af      0x60f8283a
+       0xf5c4866c      0x4af696c1      0x03059ee5      0x2d5ef125
+       0x56138f9f      0x3192ee6c      0xc8c0fced      0xd527524a
+       0x3547f3ac      0x681877d7      0x85ab46d3      0x150c4b81
+       0xe6f18306      0x434c8d75      0x1d1c9390      0xf3e81419
+       0x8d3d8764      0x7dc75ec7      0x75c3b569      0xcd03a1c4
+       0x9d3f41e9      0xfe19b33e      0x0e67a028      0x79401e87
+       0x0e037b98      0xc58d76ca      0xe0f18cb7      0x8c560033
+       0xa4665500      0xc4bb78cd      0xad95ca98      0xd68fb836
+       0xfdf57060      0xd80497a9      0xa7a421ea      0x96d32db5
+       0xa66fc3b2      0x95cdb8cd      0x23d0f185      0x91efb9be
+       0x7d9e1f37      0xef1c892e      0x1d486e24      0x476682b7
+       0x0a050d32      0x88d9c829      0x541c8537      0xfd710cde
+       0xcba5a430      0x2439f385      0x72fd21b2      0x2ca554f3
+       0x614f7729      0xec985291      0x0ca509cb      0x6d6e05b6
+       0x08dd92de      0xbd192b92      0xe8ccb7e4      0xaf07cb91
+       0x799ad4e5      0x5b4c6bf5      0x1a96cc14      0xcd2ae345
+       0x17c15ee4      0x6197b941      0xe24b83b1      0x7d9d6993
+       0x70f9691f      0x60bf2e52      0x1d01c51d      0x3bee5868
+       0xdfd72783      0x8a0f4233      0x866a6236      0xc2740cc1
+       0xdbaf339e      0x559cf7c6      0x96de364a      0x9c7cbcd6
+       0x7217baa6      0xd82daa51      0xcf0c97f6      0xd0db73ec
+       0x4f14d278      0x4669fa19      0xcf5d110c      0xe2011982
+       0xd1bb97b0      0xce81f96f      0x8bc01310      0x37156ed0
+       0xd77a974d      0x2a9073fe      0xb5f0d732      0x8a813bbe
+       0x971eb766      0xca2c3d14      0x4c96d317      0xca6b323a
+       0x85935552      0xf9f02c07      0xab3740ff      0x067505c2
+       0xf5d79a6e      0xe0f07b19      0x84078681      0xec6f3957
+       0xe440ea84      0xfd6e6309      0xa6179eb4      0xbec35610
+       0x8174ddc6      0x6c748197      0xc731de2e      0x49ae5123
+       0x7f467990      0x19f1f7ed      0x59ea5f2e      0x325c88c3
+       0x833d42ce      0x621d7c1b      0x6ca406dd      0xa5680ffe
+       0xd1c7b2d3      0x5a0bf09e      0x513d1f59      0x30882bf5
+       0x5a3cc060      0xdc71a26b      0x70289e32      0x236092e0
+       0x25b2423f      0xeaea4214      0xf8a027f9      0x67bc07a0
+       0x860f374c      0x52c05b05      0x3cd08d35      0xe402c8d6
+       0x3e3bd1a8      0xe2719582      0x095e06c8      0x17c0fd86
+       0x6bc76611      0xdea59bd8      0xc34b8f1e      0x763a1679
+       0x8c26c74a      0xd9a379b0      0x13aba746      0xfea28b8a
+       0xeebd68b6      0x7c4be527      0x53e05cbe      0xd4696042
+       0x8d2aeaec      0xcfffe2d7      0x2f668a74      0x79eebfb7
+       0xb0b47728      0xef935a45      0x40776fa7      0xa4dc6e68
+       0xc134bcb4      0xf56a1c7d      0xd7b188db      0xfccd1513
+       0xd5fa1cdd      0x0da42ee0      0x917f9565      0xc85997bf
+       0xf3e0f227      0xe09dc49a      0xca311aaa      0x574b0177
+       0xd9e5882a      0x0f2ff3e6      0x1b9769f5      0xcb86228f
+       0x3530ef4d      0xc0065320      0x55c4a52c      0x56bcf2b4
+       0x28d6b879      0x4f6bca0b      0x8c13384a      0xa1ca5361
+       0x48532265      0xd6167805      0xa63e0df7      0x1c83982b
+       0x367bbf0d      0x14e4797d      0xce1f56c7      0xa04a254f
+       0x0100bff2      0x253f6912      0xbdab9fa3      0xdfb39d62
+       0xc61c6b98      0x328b68dd      0xeaa264b6      0x892578f4
+       0x0ccb1952      0x9f21a8b8      0x38484927      0xc35a4a04
+       0x901e27da      0xea2b1952      0x3a04a54f      0x22c27e88
+       0x536408bc      0xe40b9d2b      0xf97afa03      0x2425f1de
+       0xbe9e79cb      0x5c656ea4      0xcd9f53d7      0x7c2459c8
+       0xf2cf492e      0xd66ba4d5      0x932c54a0      0x682dd6dd
+       0x1fd9d2f4      0x7a4c719f      0xd3102aea      0x0ee30eb7
+       0x26328baf      0x828ef58b      0x8a78a330      0x00c1742f
+       0x6a918626      0x9de34f8c      0xbcdef508      0x260901a7
+       0x7ce3d9d7      0x3b2ce881      0x872791ce      0xb877f248
+       0x208c6741      0x3926bb9a      0xf6ef56c4      0x71e95a98
+       0x6e65ac48      0x32655c5c      0xe17578aa      0x7f79bc19
+       0x5f2214eb      0x2fdc1b96      0x1339f21d      0x2b9b682e
+       0x766f751a      0xa63dcd95      0xd7a19033      0x3dbf3738
+       0x6f1caa22      0xb2145b92      0x27350daa      0xe36d8963
+       0xcb6152bd      0xaadba327      0x3264e5a5      0xcde388d2
+       0xbe051823      0xf812b0f6      0x0dd2725a      0xb18d071f
+       0x55f11010      0x0131337d      0x773fd32a      0xb2cef0ec
+       0x8c777bb7      0x536358dc      0x3ac5b6f1      0xb0032579
+       0xabdd5210      0xa2ea314e      0x73a3906d      0xeb00bd25
+       0x1fdbb407      0xa395c963      0x6be88c57      0x49697e3f
+       0xc45e7d24      0xe7fb738a      0xf461814c      0xc8e10092
+       0x0d7b6ef4      0xe30c0ea5      0xbf3d6067      0x6a341bef
+       0x7eb252b9      0xe353e73d      0x84a72fa6      0xa1d7799a
+       0x0b28a100      0x3e979814      0x0a01e9ba      0x041213e2
+       0x9682d08f      0x97db936e      0xbd038ed4      0x018805bc
+       0x5744f72b      0x293acae9      0x33361db6      0x51dad2b4
+       0x71444411      0xf734afdd      0x2fd51800      0xaf887d8b
+       0xb8650c96      0xddec4e1c      0x4c20c82e      0x6844bfe5
+       0x1b4e3911      0x4376451c      0xfd8a040a      0x42203ede
+       0x5ff4a30e      0x033125e5      0xee955d8d      0x60bb6fcb
+       0x88e683e8      0x2c64e94c      0x7fd60fb7      0xdf71ff7f
+       0x56e0b50d      0xeb80f2dd      0x8b51a6f3      0xc84563d0
+       0xde6339e1      0xca9527ae      0x24c47d25      0x1bd828dc
+       0xf0bcb594      0x8663ed64      0xa1c7b5b0      0x1c586cfa
+       0x7a50799b      0x74c48f60      0x631183a7      0xa432410c
+       0x410977ca      0x222954b0      0x8263a564      0x41acbe9b
+       0x561b3f37      0x89e3ae92      0x9cd9d49a      0x4301b667
+       0x985f3ae6      0xe2e3cb2b      0x9e9c9095      0xb46966c9
+       0xf4103b85      0x911c3159      0xc7d3e024      0x8f315d21
+       0x0509d166      0x9f915cf3      0xd20cce6f      0x93f3af79
+       0x0f91111e      0x1d8830b3      0x983caba4      0xfebe1539
+       0xa3fd7366      0x99a86b87      0xfb009453      0xf0e5c885
+       0xff8026f6      0x191d065a      0xd98a7da3      0x6d2eb3ad
+       0x46d35a1f      0xd0bba3ae      0x4310dfd1      0xf603632d
+       0xdd07ff8a      0xf2cb72ff      0xd9643599      0x2e020a79
+       0xb964ee0f      0x2211f75f      0xb3729296      0x9124d4b5
+       0x7d657de6      0x542b4144      0x59cfad0b      0xe106d924
+       0xa6ac25fc      0x4f4dcf4c      0x09a03e2b      0x2593cfc1
+       0xeb51cebe      0x3c52ac75      0x4c9091b4      0xcde9d0e9
+       0xefca538b      0x6e4ba953      0x91b2f850      0x8ac76d62
+       0x7dd300ce      0x113b588b      0xf4d90739      0x6efa3b7d
+       0x69bf858c      0x36fbe931      0x78ce8a1f      0x44c13036
+       0xb5cda075      0x952b5f83      0x58e926e7      0xc33b1d22
+       0x4678b660      0xc534c50a      0x6b045967      0xbc593b62
+       0xd529ca82      0xddafd549      0x534a4675      0xc5f2810b
+       0x010d724f      0x9bdcc4d1      0xac25d0c1      0x3337462a
+       0xfdad1b5c      0x942d2ef3      0x5bc00f04      0xc1c0a1fd
+       0x2cd752a4      0xbc9ddbe7      0xf9fe8983      0xe7f62a40
+       0x5ecbc1eb      0x97215bf5      0x7d4ea578      0x9fa60471
+       0xdfffb2ba      0x6e2e0e99      0x55339f5d      0x89a6fc60
+       0x784585c0      0x5f3f1cda      0xd9b9eb32      0xcb6392cc
+       0x29ccc5e1      0xece21770      0x60160a23      0xc1a4cb2a
+       0xc04c2c5e      0x7d11d3b7      0x4e508c61      0x252d370f
+       0x61ca2fe3      0xb8893354      0x156a1bee      0x8cfbb425
+       0x0ec00ff3      0xb2d2c12a      0x744e9a40      0x9b1e322e
+       0x20a00e1b      0x41f36133      0xbbf6844d      0x899998e9
+       0xb61bdcab      0x9f099e9b      0x17f82e06      0x7be263a8
+       0x49da5051      0x8e6c0a37      0xffe21180      0xedd1b2df
+       0x9ea4f41d      0x52b90d0a      0xffe84c6a      0xa8a98e48
+       0x10b792c3      0xc671854a      0x04d6d76e      0xca21a927
+       0x69562081      0x42ba970e      0xa47d3ded      0x11290900
+       0x1bce8523      0xd23d507b      0xf9371906      0x68fefac7
+       0x86ba4afb      0x178b9522      0xb1b26fad      0x6c4bd4e5
+       0x87f32b9b      0x4bc26f5b      0xa8c1748b      0x7bdd23b9
+       0xca098aae      0x6f816727      0x83eaa588      0x3ac77f98
+       0x8d417845      0xfe66d122      0x80c414c3      0x506db940
+       0x79c972b2      0x84c4b037      0x6580b38f      0x1cd7ac85
+       0x96eeaa0d      0xf718544f      0x756626dd      0x617b2315
+       0x00d28310      0x3e5a31d1      0xe05f100b      0xfa00bea2
+       0x3d1ce179      0x1da00cd9      0xe1cc6bc6      0xe07a17c5
+       0x9f4fd5d9      0x64809f2c      0xb5a71c87      0xa0b89200
+       0x12fd1d30      0xb026eb38      0xe84069bf      0xed556b2d
+       0x48b71126      0xa6fc59da      0x4801cda9      0x54323a0d
+       0xac881a6b      0xd6b8b66a      0xcce5dedb      0x36bdd0ef
+       0xbbe0dbca      0x8267f1d0      0xc7144609      0x8c4a5a8b
+       0x9b4bfee5      0x2400014c      0x51da7bc8      0xaa980c19
+       0xbc6bb101      0x4ec052fa      0x382f14f4      0x1d3d0d99
+       0xbe93b2bd      0x4541bdf6      0xb96df961      0x0db074ba
+       0x3d930ac0      0xbac1dc8d      0xec705170      0xc682e13c
+       0xae6373da      0xd8b872ff      0x815dcf44      0xaa0bb85f
+       0x2a08228e      0x50d4d118      0x8f158f8e      0x9344b454
+       0x40cfeb63      0x8711d963      0xa00597cf      0xffa6c123
+       0xfea36087      0xf1127531      0xff5b516f      0x49ab591f
+       0x66a4f2c1      0xe46f9f84      0x895384bd      0xb10cc9a9
+       0x58aa653e      0xfc456ba5      0x7bb6eeb8      0x7af7745f
+       0x2322ddee      0xe972a8d7      0x5c202012      0x009c983b
+       0x47086cce      0x23f78f4b      0x932b8ec3      0x49e50004
+       0x9240886a      0x4a173bc2      0xfa3164aa      0x1d9d2288
+       0x29e23199      0xb08d8bf5      0xac5274c3      0x55486b55
+       0x2c0d04c4      0xbd357b9a      0x766a55e1      0xa3a59052
+       0x4220d9dd      0x82b1ee57      0x0bb060a4      0x78150cf6
+       0xd037d758      0xb5aa59ed      0xae9dae85      0x80426176
+       0x72f8ffc8      0x7380897e      0x56ae8a52      0xe86a04e0
+       0xfe3d33be      0x4cc78b31      0x16ea75bb      0x40a64a3a
+       0x4ab21ffe      0x8509097b      0xdf89f438      0xd0a8df88
+       0x9b06018e      0xffda7f12      0xb6412342      0xa2234c5c
+       0x073c54a0      0x54ab932b      0x54f3ba7a      0x767d27d1
+       0x0e823a8f      0x206e93ab      0xab7b029a      0xd1e6fddc
+       0xc56aff85      0x11fc8e64      0x104c00ef      0x1cdb304d
+       0x669861d5      0x2fb3c3c1      0xcc3e829a      0xa4e01628
+       0xfd07ac4f      0x311062b3      0xa82b6834      0xba8a782d
+       0x5d139ca3      0x092f4c64      0x97a138b1      0x671bfe84
+       0x32395323      0xb4811fe3      0xe4e1fdeb      0xee692025
+       0xf9489f39      0x676f1f08      0x868dabc2      0xf9284790
+       0x12fe33ee      0x4bf3eb4c      0x180dd059      0xa205262a
+       0xb6054936      0xcbdc411b      0x7ef444c7      0x6f709eed
+       0x75869b11      0x7a1ea66a      0x43a5c950      0x4050e2f4
+       0x19a0cbcb      0xda1245c6      0x46bde7e9      0x4624cdac
+       0xef1f2c6e      0x0cfdd195      0x22c250e3      0x6dfbabeb
+       0x65d6dbfe      0xc32560b2      0x83817d15      0x2334666c
+       0xb2c7847a      0xe33a2456      0x74c202d0      0x6ee768e4
+       0xdb5adcfa      0x575521cf      0xf35166a3      0x38a1e16a
+       0x5e52b85d      0xa9105dea      0x3001f463      0xa81282b5
+       0x40f621fb      0xe017ed72      0x53179b07      0x5fba0fe6
+       0x273a09cd      0x33c59783      0x36e46a18      0x2444bd0d
+       0xca7bfbcd      0x72126bae      0x8e73e4f4      0x19b8327d
+       0xde5ed4cf      0xc69f7abd      0x39e087ca      0x867bef14
+       0x44412cca      0x8bd477f7      0x7b454f92      0xd29dcda2
+       0x3985521a      0x3d057f8d      0xb4f25bf7      0x5ddf53a2
+       0x2dbb000a      0xcc769706      0x7c509a35      0x7536d0e5
+       0xe6fb28c5      0x78e9ca32      0x11c593a7      0xdc654c6b
+       0xc536316b      0xa0bf76f4      0x73a446a8      0x18b86ee7
+       0xbcac6e11      0xa3d419f1      0xaf64cbca      0x9f51f8f7
+       0x5eeb5c32      0xd0fe97f2      0x88d1121c      0x3b22fe5f
+       0x720a79e7      0x30bef458      0xf83ea136      0x96b9b18f
+       0xd5f7c727      0x85d43ffd      0x0d33c6e6      0x18a0e37a
+       0x210e8a58      0x638cc461      0x3ac82eb5      0x0d3a098b
+       0x2e844cc0      0x97fbdaff      0x4be281ab      0x539ce211
+       0xd431c84c      0x1d5606f9      0x92ada3b2      0xc351847b
+       0x7595a55b      0xfd20526e      0x7f7da312      0x50ee5988
+       0x86619923      0x58c93c12      0x48de7c9d      0x8951775e
+       0x86c58dc6      0x7c11bb9d      0x1445cc73      0x4a5fb963
+       0xfb67eae4      0x715bad5d      0x5b5282e1      0xe6005c13
+       0x76aff50f      0xe1ed4e10      0x8ce7f4e1      0xee046339
+       0xef369f23      0x88f8dcd9      0x277b7f26      0xf8afc49e
+       0xa7114f15      0xb77f54a0      0x96a890d9      0x89c723d3
+       0x6bd5c7b0      0xfcf80514      0x46ac6c44      0x58159bb4
+       0xfa39868b      0x305e3d31      0x8dbb8ea7      0x2172f94b
+       0x86f7674b      0xea2c4e84      0xe7122ae8      0x030e2111
+       0xf4bb22fc      0xa6d86557      0xc25553c4      0x11022c02
+       0x60bb2490      0xd072401d      0x1fae9bee      0x8843ad22
+       0x8166238b      0xe26ad06c      0x5b96a160      0xab9ba04b
+       0xbba87fb5      0x87a089a2      0x3c443686      0x95cdb795
+       0x2070abd4      0xb66fae78      0xd2cd443d      0xe3f960f7
+       0xf01a5190      0x0d8e29d1      0x812d7ddc      0x436fddf7
+       0x85da3ee8      0x3c5da6a1      0x98e3063f      0xeab3e9dc
+       0xb19c265c      0x148e8255      0x7f1c1be5      0xfe9a28c4
+       0xc6642072      0x79db6955      0x36a653fc      0x7387416a
+       0x963963a3      0xa384062d      0x2f523d8f      0x4c17cb15
+       0x1ebeeef8      0xf3251237      0xd3562689      0xe1261014
+       0x0277fa19      0x4eaf04fd      0x3c1a02cf      0x7f2d35c8
+       0x71838b3a      0x89bf3914      0xc2e1167b      0xe30f07a1
+       0xc1ddd568      0x6b760cc3      0x12e2bd8d      0xc81cc476
+       0xf95424d7      0x48166ebb      0xae89af8a      0x4eb2b613
+       0x05c0499c      0x43f7ae47      0x49b26a4d      0x70efebc7
+       0xe6458dc0      0xd931c67f      0x564d09fc      0x3f5b48c5
+       0x49113b37      0xfae8eb42      0x340f6fec      0x722f8f0c
+       0xd8329272      0xa623e80a      0x3547cab4      0x266b501a
+       0x6e762890      0xc1484a56      0x54a9801d      0x37acde5f
+       0x4709ff9e      0xa7d6455a      0x55d30ab6      0x7fe5dd42
+       0x79dc6301      0xb597d3cb      0x1cfafa97      0xa9a46412
+       0xfec0a81f      0x9285ceaf      0xf1f1519c      0xdd50d7ae
+       0x1c64953f      0xf3e172e3      0xced17f5f      0x1cc66c02
+       0x44022f6a      0xffd7ecec      0xacad3192      0x24fcd3c7
+       0x54c193dc      0xa698c52e      0x55f7a806      0xf200e68d
+       0x7c5649a1      0x91595665      0x176f5f43      0x70ddcab3
+       0x34603fc7      0xea739a38      0x0972dd60      0x846544f7
+       0x5499b006      0xe4f7a0d5      0xdd6c9139      0x9c25e62c
+       0x88f53b0d      0xbe1074e8      0x160b4f39      0x698352ef
+       0x5aace662      0x1bd05b38      0x873e3b22      0x6a368f2a
+       0xf2a7c13b      0xd4d5b269      0x255e6546      0x3ec84e52
+       0xcb0fe661      0x0dcfd5db      0xb5fc18b2      0xa66c333d
+       0xd947a7e0      0x1d6e598d      0x01190e16      0xa02b5a31
+       0x83389457      0x068520cd      0x5492f8fd      0x36261168
+       0x1f46a505      0xefb43fbd      0x1079db7a      0x1959e999
+       0xe68a7bf8      0x9f4df5bb      0x58724697      0xd2144804
+       0x69478ac6      0x1f40cec6      0x3cb38516      0xd34988f4
+       0x834f7d76      0xf5e7fe32      0xef2c015a      0x18eae9a8
+       0x1acdcf92      0x8c8d43f2      0xbc4afdcc      0xb94060bc
+       0x085ca92a      0x60f68fa0      0x58e8df01      0x8cbfd008
+       0x9f3bf0f7      0x41bf92c7      0xe15a791b      0x820cd473
+       0xd85604ca      0xcf461ecf      0xbf4dcf27      0x21d0b4b7
+       0x5b8f7cb5      0xb0d8720a      0x93108f23      0xda9cc89e
+       0xdc20dd9d      0x26cad1b2      0x7863489b      0xd8b7881c
+       0x7d4fe255      0xa568cb77      0x7cd793c2      0x97369021
+       0x4f0192ee      0x80069294      0x56231744      0xe896631b
+       0xe90773bc      0x60dad8d7      0x30774647      0x4615aaf4
+       0x4d6b8af2      0x1ea00762      0x4ed2a604      0x17da0aba
+       0xe683308e      0x181cf60b      0xdcf9852f      0x8425e6f0
+       0x0a0fd062      0x2caf198f      0xd73456c4      0xf01ae7a1
+       0xd35a93e2      0x73039b16      0x0898e624      0x4fce54ed
+       0x35a9acce      0x7fe8568d      0xf07fdfa0      0xb24aea3a
+       0xa7cf4dcf      0x71e9147b      0x5474a30c      0x4400103f
+       0x70f1ed1f      0x2fba3216      0x318139a0      0x2d97bd43
+       0xabb875cf      0xe5c48965      0xa617b7ff      0x605f5312
+       0x657a4913      0xae5c7a1f      0xd7278db5      0xa727c6ae
+       0x23237019      0x1bca1cf3      0x4ce7d75e      0x3d6260de
+       0xda7542fb      0xfed426b5      0x584aacd2      0x409d7f66
+       0x0cb12eda      0x32045830      0x3ea4cef8      0x23f1ae12
+       0x82b55794      0x88476e1e      0xf5e6fabe      0x9dd24014
+       0x526dc5f9      0xd5330e74      0xf564e324      0xb7ed3a40
+       0xc666a437      0x8e621109      0xb0bb5c5a      0x882ec891
+       0xd2ec223c      0xa4e014f1      0x18c986f4      0x37b091ff
+       0x99d834d7      0x769c83e7      0x2cefe61b      0x568a793b
+       0x2323c761      0x89a5b8e0      0x6362f58f      0x45be41b9
+       0xddca518b      0x6b75c740      0x3dcea7ab      0xaab3321c
+       0x84ac6e36      0x151aa4bb      0x5ef8616a      0xa8a6f4f5
+       0x8971c6d6      0x4ba09733      0xb00ac1b6      0xcecc0a8e
+       0x3902fce3      0x99cd7764      0x49635cb2      0x61285d7b
+       0xe864c399      0x2888ae44      0x8456ae24      0xf4309ff7
+       0x44fa0710      0x068ab156      0xcdccae46      0x510a3ad7
+       0x00fdcbe5      0x707b0b45      0xe2498381      0x6d5b5891
+       0xb7840535      0x916e2105      0x75bf1f3b      0xf1a9b91e
+       0x22059373      0xde5f66db      0xca763395      0xac7368db
+       0x094a11b7      0x00de9249      0x3b028a80      0xd3bbe38a
+       0x020c4fac      0x15b1a7f4      0x823fd68f      0x7aedb2c8
+       0xda1dcf88      0x8167363f      0x5212c8ad      0xcc539c32
+       0x9a592ed8      0x739d5dd7      0xb07487b0      0x44cfb5a6
+       0x4b7e9b69      0x6d955dd2      0xef11d8c9      0x1801ff87
+       0xe538e687      0x837d77d5      0x5dd3dcf6      0x763dcc25
+       0x8ba97294      0xa59a0e1d      0xc545bdbc      0x459b4722
+       0xbf6e6ca3      0x923e279f      0x21469de7      0x915755c1
+       0x779d24ba      0x82f39460      0xbd7ba86e      0xd410a466
+       0x27e5aeaa      0xebc0bce9      0xd3952d25      0x7639086c
+       0xc92aa304      0x1912539c      0x9ea5299b      0xd63291f6
+       0x9fd17cd9      0x12689c75      0x0b2475ba      0x2f29f0b4
+       0x1686610d      0xb7908df6      0x7e018220      0x6a9d967a
+       0xb8853d2f      0x8f17d277      0x8ee35c9e      0x5bb52123
+       0xcdc51b2c      0x11ab24ea      0x97a5e07e      0x16ae2ec5
+       0x9d89b449      0xe0cd155e      0xb566de07      0x3da387d8
+       0x2b163524      0x04a4e8a2      0xc08632ca      0x74346654
+       0x334a0eb5      0xe0fec033      0x0f07e557      0x579cb55e
+       0xc6a3b9c6      0xa96c9277      0x376ee1fa      0x44868b46
+       0xe7f1b1a1      0x573319b5      0x7f7dac8d      0x6bc19580
+       0x3a090d03      0xfc314db0      0x979d1515      0x13778534
+       0x4449b939      0x0a8313b9      0xf8428aaa      0xb97a50d0
+       0x7dbd8c53      0x76b2ffe6      0x15fffaa2      0x63c4df79
+       0x3b282acf      0x2c751b03      0xaa6ac19c      0xd0ebe2a7
+       0xd309415f      0xc6c76dd2      0x1f983341      0x8aabd53b
+       0xdb5b4aff      0x12c283d2      0x62ae51aa      0xf30240c1
+       0x026336e8      0x538067a1      0x86fa2b2e      0x247758f9
+       0x42ef3f1d      0x930ea01d      0xadc11695      0x8a5ad5ab
+       0x961378d8      0x815dadf4      0x89d6726e      0x9974f509
+       0x9467085f      0x3f737b8d      0xe4b7e85b      0xa127a188
+       0x43859791      0x04509c12      0xa908227e      0x4e881c59
+       0x146a901b      0x36043abf      0xe0249d3f      0xb8b40360
+       0xbc0e5905      0xd0897708      0x5bdbae08      0x2b9b4a5e
+       0xf4f0f498      0x0d74ecf3      0xbdc2b65f      0x0cdbeb32
+       0xdd8a336b      0x005a5f0f      0xd2c3b52f      0xe819f7d3
+       0x181f7af6      0x18d77153      0xb951173e      0xaf0efbb5
+       0x139c0df5      0xf55b2391      0x67f94504      0x625534e3
+       0x7137d0cb      0x4581b79a      0x5e3325bb      0x8a881e6e
+       0x56a92630      0xc5f640de      0x89ea6941      0x8f989fd6
+       0x3ca31a74      0xcb271a85      0x6a387c51      0x3102c3bc
+       0x84b11081      0xd0495826      0x601f3eba      0x317dd032
+       0x3707a5e6      0x849fd348      0x558923cf      0xc1d6a6da
+       0x9ac208df      0x0051eff7      0xefd7b696      0x53bc0b4d
+       0x4e13e187      0x8bdc8c38      0xf63cc938      0xccd0fc6f
+       0x3c246414      0xbe9f7feb      0x34f0f93d      0x41b1a8f2
+       0x4cb44be2      0x6c59845b      0xfdd370a8      0xffdf9058
+       0xf392f759      0xd09732a6      0x4bc3b395      0x344051b1
+       0xb18f6e3d      0x734ffcd6      0x1318ba1f      0x0c13962c
+       0xb1cd74e4      0x439423fc      0x833d7d7c      0xe9b7adc5
+       0x2ce75959      0xc340708f      0xa57d4b03      0x9ea09ff2
+       0x4c239371      0x879a996b      0x2a783a36      0xe7f95df1
+       0xd814e58d      0x4fde6bf3      0x2f1b853e      0x71a60eed
+       0x74368f0e      0xd518e17e      0x4f4d152b      0x5797fd43
+       0x682c1380      0x652dee62      0x5cdd2d7f      0xb1a51c6f
+       0xc0bf2a05      0xe96126ba      0xc03e1206      0x383d8f98
+       0x61a97ed4      0xf1f8a5d8      0x449d44fc      0x4b61a046
+       0xc228957f      0xc4a4791b      0x15f89e9c      0x0a18a2eb
+       0x1c6040cd      0x4a7fd441      0x68d22682      0x9dac9a1f
+       0x63a7ed73      0x66662c99      0xe9661636      0x438ece88
+       0xc7cc5dcd      0x0ab73e2c      0xa3c05809      0x237a7be1
+       0x9da8d9ca      0x3a678df4      0x174b2325      0x6699eb6e
+       0x6ee6a1e4      0x15cf3d9a      0xc186100f      0xc48e80a4
+       0xa216d214      0xb0abfdb6      0xfffdd485      0x59b8a696
+       0xbe0b2bad      0xf32fb091      0x1ad71fb1      0xee001c7b
+       0x48ce3760      0x11bef465      0xa6908b71      0x92516d61
+       0x07c5ff99      0x0cef4a87      0xc799692d      0xd6684783
+       0xc1aa46bc      0x2d254b12      0xa2ba5de8      0x313faf01
+       0x05507d1b      0x29e1c622      0x154e0e98      0x4d76bcae
+       0xad7a5459      0x4602faa9      0x8d325944      0x20d1c574
+       0x4d9fcb7e      0x6b95443a      0x3ad64f33      0x0700ad1c
+       0x0f162bb4      0xbe52b28d      0xc3fd2f6a      0x3d9348e8
+       0x8a2e44a7      0xf2cce16a      0x00493d5c      0xe6e9ac80
+       0xae579d23      0x7fcf2669      0x15d5197f      0x09c806b9
+       0x808001f8      0xe2c0af54      0xa00fbe07      0x497f4f5d
+       0x2179b3f2      0xdf4774f3      0x5326f7fb      0x53ffbc38
+       0xb0e193fa      0xc96c9187      0xca82fbbd      0xe522ccd6
+       0x5114b610      0xf3269b98      0xa86ac6b5      0x884238d5
+       0xafa0865c      0x46b6cdcb      0x1e237e25      0x5df49865
+       0x54a55227      0x103fe9fe      0x5e79b7c6      0xba5d1624
+       0x48f6acdc      0xaa1060a1      0xff201401      0xf1c72711
+       0x83bfd484      0xb9477bbc      0xc3094039      0x3fe23c1a
+       0x254f9f9e      0xcf4de256      0x75ee4a50      0x6b04ff22
+       0xf8065074      0x8208977e      0x0cc05238      0xe1bb9163
+       0xf064f24c      0x1ea1de47      0x24359038      0xc5c17857
+       0x9a61f46c      0x0380618b      0x1602b8c4      0x8b506160
+       0x281ffe9e      0xae6a64d5      0x52911d06      0x08628fc2
+       0x09b0bdfe      0x91d7e488      0x5dfeb2b0      0x554d331e
+       0xcb4910d7      0x0f02630b      0x645a0d0a      0x8799a9fa
+       0x1e90c160      0x5dfacd01      0x6e5b651c      0x43001211
+       0xd9272dd5      0x3b4c1989      0x31d1b76e      0x0431c48d
+       0x9b649d96      0x4018ead0      0x0f020d41      0x1fabb251
+       0x7d379f56      0x59ab5470      0x29fab0f3      0xf502e9b0
+       0x79c30707      0x165b1c6f      0x3bb4bf59      0xea326857
+       0x892a2637      0xcac37abf      0x8f87756e      0x1dd5d05b
+       0x2986abf8      0x7da8f9c9      0x163fcbd0      0xea0f6a42
+       0xaa56217f      0xe82b10c1      0xf8581e2e      0xd6171338
+       0x32d21d55      0x6ff99536      0xed2e3d73      0xa2d18f07
+       0xa1660bf6      0xa89c770a      0x183afffd      0x280d0489
+       0xfaf77ceb      0x020c77e0      0x9b3e113a      0x99b11be4
+       0xb4d41ae4      0xb82cfa1f      0x1945a22f      0x4e156e72
+       0xb1e8b7ea      0x943e0da2      0x309d01b0      0x103d0233
+       0xec37b78d      0x0e37e6b6      0x274db293      0x1ccbc327
+       0xea19b9cf      0x1cfef210      0x4298488e      0xb22277d8
+       0xee59c14d      0xc539649f      0xfccfe8c1      0x5c989a10
+       0xeaa9317f      0xdc2dbb6b      0x2d07ace5      0x32e3487b
+       0xae086d5a      0x01d5d8ba      0x005cc847      0x2a6692b7
+       0x5f5ae5f9      0x19c868da      0xeaa1ddab      0x1f849493
+       0x3cd98fbe      0x6f02973a      0x885df640      0x033503d3
+       0x4d65cecc      0xb6f97983      0x52ec0648      0xfa8c83e3
+       0x43afcd52      0xf3fd8ad9      0x579ee672      0xef2511e1
+       0x6376e64b      0xea4f5e23      0xf13075b3      0xab7c9c5f
+       0x5304165b      0x9d6cdb33      0xfe463417      0x3d94bd5d
+       0x13b55b93      0x3afffa8e      0x69f7629e      0x7ec208ec
+       0xad17abc0      0xabb2d616      0x5641f14c      0x6a22f368
+       0x3ae5000a      0x95f98b76      0xfd8b7ba5      0x7eea947e
+       0x14850a2e      0x2811b9a8      0x4c60bc75      0x41867697
+       0xd0a319ef      0xad739b60      0x0000b49d      0xef7a2838
+       0x4b307ffa      0xe8a43fb0      0x15d00666      0xd9c686e9
+       0xdd559522      0x950cf282      0x22637302      0x3aa53b0f
+       0x80b1c08a      0xe96ced73      0x91e61c84      0xa0d0fdaa
+       0xbd8fe413      0xfd36e042      0x5a09087b      0x41ca8ba5
+       0x5582ce5a      0x942347ba      0x8f543e4c      0x8d0883c6
+       0xf3b7900d      0x97dc4923      0x782f0938      0xab8d31fa
+       0xce074404      0x517cd3ac      0xad20e6ba      0xa0e32f62
+       0xce282013      0x23506bed      0xd55edcd3      0x8a949f33
+       0x98357070      0x947df2a6      0xc2749533      0x5fd1b6f5
+       0x783eb10e      0xa27d4380      0xfea7ae04      0x5fe3cf02
+       0xe811a8f3      0x84b02fe8      0x0ae8b270      0xab5e39ef
+       0x09cbc1ea      0xf3fa86d9      0x1257493d      0xc4fb830c
+       0x82684855      0x681a3998      0x116c7625      0x109245d2
+       0xa97679eb      0xdbaa6a73      0x1b548c81      0xa800a3d4
+       0xdba71824      0x2d6ac2f0      0x97fbb83d      0x44ac16bb
+       0x086466c9      0x068e445a      0xba067266      0x6a92d113
+       0x4622b9b1      0xcea3ad3c      0xe4f18a40      0x358bab3d
+       0x29d3f843      0x51574b32      0xed4fa591      0x84aad130
+       0x61c97e51      0xe7e4f5e4      0x568d72b5      0x7e0376f9
+       0x85ba9b6e      0x723dbaae      0x6a0e7b64      0x1d33f4a2
+       0xe8117fe7      0x8f49b0c2      0x30538efb      0xcc7b34e8
+       0x5be8af6d      0xba290732      0xaf3fdeff      0x83ba0ee9
+       0xa4038c56      0x82d06778      0x8c365bc4      0x36921cd9
+       0xf81b3664      0xd1e32720      0xa29e3f29      0x585dcf98
+       0xdacd4790      0x902909df      0xbb803811      0x18859d23
+       0x066726db      0xb1ea7f6f      0xd25699f1      0xafa83cc6
+       0xd8b63456      0xa8caebdd      0x65b2a477      0x718f24ed
+       0xcb22bc40      0x92c64ba4      0x11c00c0c      0x706874a6
+       0x42a3e5e5      0x923ee55b      0xdecf3447      0x34a09608
+       0x4963b9b3      0xba0a416c      0x4ce8b1c5      0x54a684c1
+       0xbdeeadbf      0x9c4689c4      0xababefe0      0x8552a932
+       0x9da36835      0xefe736ff      0x61dbdc19      0x42c8da6c
+       0x9c9ea5c3      0xdda59588      0x50d16f05      0x9efbbf32
+       0xa7aa127e      0x9a5bf19d      0xea2f6f3a      0xaf023974
+       0x6d41a00f      0x94698a5c      0xa843d04a      0x92f305c2
+       0xbb1a189f      0x51381238      0x2cd0d86d      0xb5271901
+       0x0614ab8e      0xf11d1c5f      0x8bc6ecfd      0xb72a944f
+       0xe5e37c3b      0x3d2fb190      0x5be6ff10      0x99e5b7fe
+       0x08fb6b43      0x1b05d96f      0xc1e363c3      0x3b4ea153
+       0x055fa866      0x63560a08      0x48d508b5      0x2fc84522
+       0x9e497947      0x5da46000      0x08fe7486      0xb71af89e
+       0x96682b28      0x4d1b01dd      0xed86a5b3      0xbde56a90
+       0x59d66d6a      0x8d9ae73c      0x6b50cfe1      0x5af5b3e0
+       0xb42d30e9      0x63630d25      0xd4e07404      0x00410f7a
+       0x1af01c86      0xf0392f92      0x4e24573e      0xe267a029
+       0x9e368723      0xebc0de48      0xea1799a7      0xcaa9591e
+       0x3eec15b0      0x49147a3a      0x8398a992      0x0d846394
+       0x383132c7      0x83b0cdf8      0x37be77d1      0x7451051e
+       0x14596202      0xf47654ab      0xdd72e4c1      0xe5f6b03c
+       0x174fe6c6      0xb2ec3331      0x553add25      0x824fe0ca
+       0x743dd64a      0xa1f6a9b4      0x30e7f63c      0x541e4e26
+       0x224e59df      0xe65c2718      0x7f663d27      0xa02a37e8
+       0x3f46ce0d      0xda16ac30      0xeadebbe5      0xa1f631ac
+       0x8e9a2524      0x01277d97      0x96ee64e5      0x868bf692
+       0x42a67eaa      0xe8852162      0x965f701a      0x19f3eb75
+       0x8f4c8a81      0x0c3d787d      0x7268eafa      0xe2aeb9ab
+       0x96f2ced9      0x832314f9      0xb20bf783      0xf96cd573
+       0x6912cfb3      0x843deb68      0x66b3b4d3      0xd51c896a
+       0x83c9640d      0xdd44eb6d      0x49499ae1      0xed73fb90
+       0xbba34589      0x9a9278d3      0x58ad6ea0      0x043ac283
+       0xd9406ccd      0xbcb9bc65      0x7b60a064      0xbc84931f
+       0xfa292d20      0x800329ab      0x27bd926e      0x69915eea
+       0xe5725af1      0xdd498125      0x440a3c54      0xa4cd0026
+       0x985de162      0xfbbb4d53      0xb0268b1f      0x475ae7e2
+       0xdf9072f8      0xa0c61765      0x250d0ae7      0x65478dd8
+       0xc799678a      0xd2c4d218      0x862ce7a2      0x96919833
+       0x203b20e9      0x215e010e      0x80128487      0xf1c23e63
+       0xa04fad4b      0xb8daf933      0x15f80914      0xdfc12a54
+       0xf09894ca      0x0dbf802f      0x4822f4d1      0xff8f6c06
+       0xdbd955c7      0x75bc50dc      0x3b2ee099      0x962cc2d6
+       0x584684ea      0xef781e36      0x7f1cdc78      0x526cbd59
+       0x71c3b647      0xca9da3a9      0xfceb24b9      0x5eb4ebad
+       0xea05e523      0xe393ebf8      0x2234a837      0x5404fc94
+       0x75e1f0b9      0x3893aafe      0x5df94edc      0x7a263e44
+       0x529927d1      0x0a6eb683      0x829ee381      0x76c6317c
+       0xd86bea02      0x386e83ad      0x3040f550      0xc7431de1
+       0x3a554676      0xc08f78cd      0x3c906410      0x7d644738
+       0x250809eb      0x0357ffc8      0x278792ac      0x1fbd32d6
+       0x8b0c0c67      0xc87b2153      0x03dc960c      0x82f8befd
+       0xfa807046      0x120ddd29      0xd90feab4      0x326df8d1
+       0x37413bca      0xdc02be11      0x900b85f4      0x124d3924
+       0x078b6666      0x1e84d3fb      0x3b7b556c      0x01db9222
+       0x3f67bac4      0xbaa2092a      0x9d3926f3      0x838a7e8b
+       0xd6ec9093      0xc7b28ae8      0xde908167      0x84b57590
+       0x7d970261      0x3a3f7ac0      0x24ce07f6      0xe12fa1f5
+       0x2a475218      0x21856d02      0xa889915a      0xf0076ddb
+       0x5cbc303b      0x2ce1af10      0x4ff9772c      0x09ad5c1f
+       0xf9da31dc      0x072110b2      0x2637530d      0x3445b14b
+       0x72361261      0xa56d991d      0x5a3fdef8      0x8472cefd
+       0xcfe469fa      0xf979bd1a      0xb13015f8      0x52dedd85
+       0x7b2b4aea      0x3162f491      0xd191644f      0x06389e18
+       0x59d35a49      0x14fc45e6      0x762a6757      0x8d73f8e2
+       0xfbb66183      0x53664f34      0x21e39aac      0x1df6c044
+       0x6e0b37e1      0xfd1d6be6      0x1e45cafe      0xb70f2cea
+       0x95703ace      0x7def955e      0x060ed2a3      0xda4ecd97
+       0x862f2017      0xf77a59a7      0xaf00f288      0x6a8a3c55
+       0x5db5ad58      0x3871535e      0xd28ca2ce      0x19077968
+       0xb6b3301f      0x6caac995      0x6f19d03d      0x93cf25e6
+       0x4a5ef7d9      0x503a517e      0xb9128085      0x0b906ccf
+       0x46c12827      0x03198651      0x51633fd5      0x57f76542
+       0x7b2f000d      0x53d75ad1      0x2726e127      0xe64b4b7f
+       0x0446d85d      0xd7b27611      0x014c2d86      0x04ef2c99
+       0xf994c14d      0x7c8dd60b      0x87840031      0x33b59fa1
+       0xa1b74cd1      0x0663e464      0x097c78d0      0x39517e7e
+       0x8e439670      0xee73e23a      0x71191747      0x9d28f80d
+       0x64a576d6      0xb93fe03e      0xbca46b86      0x03616ac5
+       0x4d6f28e0      0xa42d5c11      0x85087dc7      0x7605084e
+       0xe10664ea      0x348d8b18      0xc52546ed      0x3a0686b0
+       0x0d6fb15f      0x70bf33a6      0x01a19964      0x0aaa4b46
+       0xbaff2780      0x65537512      0xc4da57e4      0x18a089d4
+       0x66170517      0x9154bc38      0x3fd4a883      0xfae08ded
+       0x79997728      0x5e328a8a      0xe5168164      0x148a3df4
+       0xae1e000b      0xa957e0a8      0xadefd9ce      0x758ae4c1
+       0x5fb16b90      0xe2f91327      0x7267d2bb      0xc472d002
+       0x8cd3b22c      0x55637951      0xa7563abe      0x5857990d
+       0x94401edd      0xec2fc270      0x3ec524cd      0xf85d4e63
+       0x3eef221b      0x450894f0      0x2734d776      0x0dd4735f
+       0x2223521b      0x459c8947      0x2d0815ce      0x44940b29
+       0x6583d5cc      0xa03f028b      0x8c7b685f      0xad0cff56
+       0xbbd27ef6      0xc1c3e146      0x2f1cdbad      0x9ee51a3d
+       0x95b72a44      0x21ce3ac2      0x7bfccdd5      0xa3cf0bab
+       0x15d9a1f6      0xca4362ce      0x34a700b7      0x8b4b5da6
+       0x6548fcb6      0xf4a08e6d      0x775e8ba2      0x0191759a
+       0xf80eabaa      0xce4f7f89      0xfb96fd51      0x6ea99f33
+       0xc27e64ba      0x7654419f      0xecfbaa6c      0xcb0736f0
+       0x1b80c5e0      0x689e27a5      0x7cc27bff      0x3f936593
+       0x00063fc7      0x111c3681      0x3b3b81a7      0x35e94cb2
+       0x4a49e1c3      0x17f666a1      0xc7e4ae56      0x9284c4c2
+       0xd8286ab2      0xef43b783      0x9c65b2cb      0x722fb1a7
+       0x6f2efb2a      0xdd60ea32      0xf472389a      0x616d9bae
+       0x48a7c9a0      0x0bd60952      0x93ae5e33      0xb6060df6
+       0xb9e59956      0x13069152      0xf46a7f8e      0x2851630f
+       0xd3ed8188      0xaf7dd5f1      0xc29090b6      0x8578215c
+       0xd6f6a05b      0x95db6cde      0x2cf581df      0x9a99ad77
+       0x2b313890      0xc9463b1c      0xadbc3748      0x6e790f05
+       0x9bf484d9      0x34c6d5dc      0x75740b8a      0x7d3fdfab
+       0xb9f8ba17      0x8d3b35d0      0x5ff294bc      0x6f6c874b
+       0xfffe2c94      0x62fe0257      0xf2e24887      0x350b5bd4
+       0x3fa99e5e      0xb7f2c2c7      0x0ae1cc93      0x333c2900
+       0xb38e8042      0x51fba3ad      0x1ceccae1      0x71c8c270
+       0x6a043a3f      0x936b478a      0x777651ad      0x450df7b7
+       0xd1089e90      0x809d789c      0xfd839654      0xe6496898
+       0x49217884      0xf50869c1      0xf2748a8b      0x0bec9aef
+       0x770f7fa1      0x76655775      0x009b2bde      0x5676ca7a
+       0xc1e143c8      0x4ee4fcdd      0xe91f1074      0x6736ad3e
+       0x4356fa89      0x495e75a5      0x0b741ec6      0x449a3b61
+       0x452ff00b      0x2ed81694      0x70f03ef9      0x964329cc
+       0x5dd12754      0xd81bca72      0x3f86b58b      0x400ac496
+       0xad12b3dc      0x5764182f      0x0e45cb09      0x7e7beac9
+       0x7dd95c4a      0xad7df1d1      0x1bac39b4      0x5bb6e943
+       0x87d1b391      0xfb54afd3      0x79b2d767      0xd84bdc42
+       0x0066dc1a      0x55b3ad75      0xf2c112a0      0x580f45ec
+       0xf62b463d      0xf60ba3fd      0x9b2c6028      0xa5b43f91
+       0x1f2d50bf      0xb8f66b8a      0xf986f887      0xd65f68be
+       0x40b82be9      0x9a43449a      0x591ef31e      0x12dbcc88
+       0x317e9176      0xa6c6c909      0xdae0d9e4      0x6bb23ee9
+       0x4ef2788f      0xa80f8192      0x3ae4b944      0x1b3f2a9e
+       0x4711ee6c      0x84eda57a      0x3dc2a8d8      0x13162de4
+       0x05aaf176      0x8d64b2e6      0x92f66278      0xcd2673e5
+       0x79c0f52d      0xf9b3c1e9      0x5ff67a66      0xf39b87df
+       0x525a32ce      0x7245ab37      0x68f7349e      0x2936377e
+       0xd6685b43      0x71c2d0ed      0x27ee3ee9      0xf3a1fac7
+       0xbdb0181b      0xaac6865c      0x84c32bdf      0x4bc38fef
+       0x3f096faa      0x1702e79b      0xae527c0a      0xb0248221
+       0x3b56d999      0x21a0eb9d      0x08f57a24      0xa95c4146
+       0x4dcaa3b7      0x80ad0104      0xd6dae67d      0x0683e683
+       0x01ac7f00      0x25374859      0x90ecc466      0x440af6ca
+       0x2321871b      0x02618fbf      0x8c7f98d6      0xd3938fe2
+       0xf252cc19      0xdb423f69      0x76334fa4      0xb3e719dc
+       0x8be5e174      0x6aa3b63b      0x1d2f3e02      0x2d01f7e6
+       0x9509183c      0x549ab8e1      0x228c065e      0x7da315ec
+       0xcaedb827      0xbfd6a696      0x4d38fa96      0xb316cf20
+       0x933ebd26      0x193b8c86      0xd95627c8      0x7ddc2f7a
+       0xb8605822      0xb19e082f      0xd64c7867      0xa7a3313e
+       0x92be3149      0x8145fe85      0x409fc646      0x7f554a0e
+       0x640e1789      0xd5e3576f      0x92eb074e      0xaeb34222
+       0x901c5e43      0xbce455a8      0x4bc50c91      0x17ddc1eb
+       0x80a18acf      0x3082a9af      0x8bb1d391      0xf47eed91
+       0x46ef5720      0xe3cbe3fc      0x00d44d26      0x586a9c44
+       0x12e92f06      0xfdae8b56      0x7f56e426      0x747caa6a
+       0x1bfe8673      0x1d19d6b5      0x33583fa6      0x77188754
+       0xb283f9a5      0x6f51a2e2      0xaf3112eb      0x320cb85f
+       0x43030267      0x81754867      0xdc41223e      0x98945de9
+       0x1390f612      0xcfdcb91a      0x2a0bf7d9      0xee8e6b80
+       0x5b33912b      0x8b46d712      0x42fb5637      0x5c7f42c4
+       0x39e78445      0x6fb87bb3      0x0f051cae      0xa61678de
+       0x3bbf0faa      0xc870c052      0x4b142a27      0x0e550347
+       0x0c5382e9      0x195b9b2c      0xeba1d275      0x7096f4fa
+       0xfa22ed77      0xa05e5b84      0x778d7db6      0x2b60f32b
+       0x6e748cc3      0x334d3f23      0x75cc287d      0xf7d1644b
+       0xc97a13df      0x4bc06771      0x1306660b      0xd3c7dd1b
+       0xa142efd6      0xe68f0d22      0xd5ff232b      0x94fb5e41
+       0x0ec6aa34      0x6da358a0      0xc02e995e      0xcaaeb52c
+       0x2835ef52      0x99bd2258      0x5f1d9529      0xb8092431
+       0xae849d31      0x15316f12      0x42b1c0ab      0xa1569054
+       0x34fcd6af      0xd798b2b7      0xfb2cff48      0xfec896d6
+       0x7ab94809      0x2030174e      0xc186a684      0x5f4a8817
+       0x84bdf2dd      0x0a291522      0xf6ab50b2      0xa9439e0f
+       0x44d7ea23      0x5351ba4b      0x928dec2a      0x0b9dd63d
+       0x5a76913a      0x079a5164      0x8e0777ee      0x4374b399
+       0x6f34f567      0xfab69db4      0xde38e38b      0xa2e5ebe3
+       0xcf6dae0a      0xd898148b      0x476e3296      0x5e7ab451
+       0x2fe45cde      0x929624e9      0x2203c854      0xfd8b8626
+       0x17376cae      0x32501bca      0xe6fcb278      0x7953d8de
+       0x9752e1cf      0x341c1601      0x00d3ae30      0xb3739e58
+       0xeceff6a6      0x4ed58c80      0x459a63ea      0x5cfc1899
+       0x9e6b410b      0xe4da8646      0xd75c48d0      0xd404f4bc
+       0x33825d6f      0xb9855c82      0xe90a0e4c      0xa989b633
+       0xfb2473e9      0x7f10fd55      0x6e0768f6      0x7c6d8450
+       0x7cc93a19      0x76475dd9      0x0b778a1a      0x29cc2a70
+       0x91caa9a7      0x49655d56      0x1c64596b      0x52d61f69
+       0x53bff6f9      0x44d9c1d4      0x2ba15c62      0x382dbeb4
+       0x56cff583      0x565c1803      0x5893fc7f      0x6a94cda8
+       0xe95ac193      0xaf3b09a1      0x795697ae      0xff624c67
+       0x56e611f2      0x9ba437a6      0x8b7d27a8      0xae8c1565
+       0xb28b944f      0x9c895b81      0xfe787519      0xa0ca12c9
+       0xd23c5ba9      0xb730d089      0x302d12dd      0x9af1a4c7
+       0x69599341      0xa8b17cb7      0xc573e9f3      0x4fe015d3
+       0x3b3286ef      0x591128a6      0xbf0bea82      0x466d79cd
+       0x3076347e      0x9c7ca61c      0x13e8aa93      0xbb00d00b
+       0xbfa86c94      0x56f38137      0xd727a03d      0x1a41b362
+       0x5331fc0d      0x113d1d31      0x09e3c464      0xf54b6824
+       0x40ba971d      0x2f1d4b53      0x2832f814      0xafdf91ec
+       0xe2d77aba      0x44f0e00d      0x2f376938      0x6d47f1df
+       0x9bef11f9      0x3f9aca74      0x197d855f      0x5d899fd2
+       0x0174123f      0x63cfbf61      0xc85eed10      0xf11930cd
+       0x163dc199      0x49f8ad22      0x1b5e4fe5      0x4ff6450e
+       0x942489f5      0xb11bff2b      0x600f4652      0x31a37809
+       0x99be777e      0x343bd797      0xc7bd34a2      0xf2b1a60c
+       0xe106e486      0xd179808b      0x1419645b      0xb34771c0
+       0x3ba7d144      0x15791097      0xbc5928ca      0xc9cc7cf6
+       0x1f17fd5b      0xba686d51      0x9e6d912b      0x20e4a194
+       0xd8c32654      0xf8937d4c      0x533007af      0x04696e3d
+       0x8207c2c8      0x7b739e0f      0xb67d066e      0x3726cf3d
+       0x62d4b3b8      0x75aec6a8      0x44469ec9      0x91406a1d
+       0x4f5ae33b      0xddcc9105      0x3387b59b      0x87c6a066
+       0x14d769a8      0x448c6139      0x476ed45c      0x8232fe75
+       0x7cb6d1d1      0xa670320b      0x28098df7      0xb94dabfa
+       0x41c51c73      0xbdfc4d53      0xd70a3aef      0xe1c8f70c
+       0x077da48d      0x441bb268      0xcd2bc13c      0x78a46a1c
+       0x84bd17dc      0x31597b9d      0x623fae1c      0xe24170ff
+       0xcf8cd6ee      0x11df9820      0x3e480b36      0x4a7eb051
+       0x3203f70c      0x06b348c1      0xf4e33bbb      0x24ed5413
+       0x1ed84552      0x3772588a      0x4ea84347      0xe1250dfb
+       0x8bfa3adb      0xe59afa8c      0x44ca1357      0x1145a5a9
+       0x0df9a86d      0xe6ab249a      0xbe151d80      0x3e7bbf3b
+       0xc1ebfa83      0x84348d05      0x8b65deac      0xdeeabbb2
+       0x6b9e5b0c      0xe1d19302      0xb0b01cec      0xd69a98d4
+       0xe42edc62      0x261ea15e      0x4c546ae1      0x74f85d40
+       0x9a9db547      0x33e07898      0x4422af20      0x5999891a
+       0x83e63253      0x7f7268c1      0x4429c438      0xab119869
+       0x1f1bd091      0x2a1652ba      0xd4dfc9ab      0x2d7b18d6
+       0x2d87faa6      0xac590208      0xcf6e46ca      0xb1c9e615
+       0x73d3bb7e      0x09573088      0x3d91165c      0xb688a3ff
+       0x7a4346cd      0x2360cc0c      0x494d1f13      0x1e4244b7
+       0x1e057f8c      0x7d3e15ad      0xee6cbca3      0x1ccf470a
+       0x9c7fb86a      0x2b694405      0xc1ceec27      0x2f4a8555
+       0xcb722c5d      0xc0756c77      0x3c2ee8ca      0x7053fe01
+       0x51dbf675      0xfe1e166d      0x654cc429      0x191d8fd0
+       0x9c6d2967      0x9f0eca60      0x6332bcb2      0xc161dd34
+       0x459bd9dc      0x89815a1f      0xc9cee790      0x7b577e3b
+       0x7b57a18f      0x1fe6c630      0x8d25db6b      0x09bd8d7c
+       0x48635a97      0x6360756a      0x9177a3d3      0x111b800f
+       0x5ebfc6d3      0xdb865f41      0x7c168244      0x32e5d8d3
+       0x91109a8d      0xa20a3590      0xd0a933ea      0x88f5df2e
+       0xccb03537      0xdb41eebd      0x5c8dbbe6      0x4c2644bb
+       0x4c65b98a      0x742f1134      0x60fde8d7      0x1cde9854
+       0xb1ea0f52      0x8a4ca4da      0x44783953      0xe0243e19
+       0xcd8cd441      0x1e042b06      0x2ccaf99f      0x5ed2d15c
+       0x3deb43f0      0x8e34c18d      0xd5be1491      0x70b793fb
+       0xaf8acf24      0x5d38b1a0      0x1630ac4f      0x182237ea
+       0x627ddbb6      0x2ea22ef5      0xd8dedc3c      0xa51830bf
+       0xda49f488      0xd2fa2c85      0x721615a3      0x1208ebe9
+       0x85048c1c      0x58acaadb      0xe7eeabb3      0x81e9430d
+       0x63346e2c      0xbb26215b      0xf83c4194      0x015cf67b
+       0x44d93f48      0x0bc2900a      0x10df11c6      0x061db4b1
+       0xad2c0350      0x52a8d223      0x0b9af5e6      0x112cba32
+       0xd5c0611a      0xde0c5af5      0xbf369309      0x2005c01a
+       0xe7e4bce4      0x253a7515      0xa66c38b2      0x6371a674
+       0x033a39bb      0xb99f4a73      0x9a359731      0x0724e9dc
+       0xd9944bb4      0xedb01d0e      0x85fecafb      0xd75f7e73
+       0xc72c37ab      0xe9b59fa2      0xf8f85487      0x09704e58
+       0x0ffe8d54      0xf8162535      0x6bf16af4      0x8f46df6f
+       0xf0e33411      0x3e177d34      0x730009ab      0xa1631939
+       0xabe65f95      0xd90633fa      0xcecf66a3      0x79cc15b5
+       0xcb28d41d      0x4861efdf      0xe7de0dbf      0x9722f417
+       0x572088db      0x7f511819      0x318b7d8b      0xce84e61a
+       0xa01a4c75      0x600c1a0f      0xc0286e02      0x1af83c30
+       0xbb64bc49      0x7a0f71cf      0x2554129d      0xc5a154f6
+       0xb842f910      0xe710460b      0x5d86e6e3      0xe414c0da
+       0xb61ad875      0x669fef0e      0x58fa944f      0x16ca9eae
+       0x1fc6f838      0x3ffe0098      0xf6be0d22      0xa2f381ab
+       0xd995847b      0x16fbc1e2      0xcc756a1a      0xd89f7485
+       0x1d0abb0b      0xffcd8cb0      0x71989ea7      0x60e19b0f
+       0xa8a56589      0xf097597f      0x942a4e88      0xeab31855
+       0x8af2fd0b      0x078a03ed      0x62025b1e      0xaf19cb9c
+       0x8c1ab68d      0xc262628b      0x62083c6c      0x874688bf
+       0x5b512007      0x310e1d4f      0x5736b0db      0xdf96874c
+       0xf0648345      0x5b3b2da9      0x075ed4cc      0x86f0f05d
+       0x211b38ac      0xe41c1462      0xf36b3395      0x63a19aff
+       0xc271872b      0x3f11e6a4      0x209ffe67      0x42def127
+       0xe22ef2a8      0x6a4624b5      0x61a19475      0x149dee80
+       0x286187be      0xf5e381aa      0x53a6bb60      0x84ba5a64
+       0xf33ed14d      0x6f2e992b      0x24ad13bb      0xbf0739a1
+       0xdc312f28      0xcd45e42f      0x63d233cc      0x8d86ec61
+       0xf8e5d0be      0x26e15a81      0xa4f6d30f      0x2cb1f3cd
+       0xa64c7b81      0x1950fab1      0x97dfa1d9      0xb437b47d
+       0x53de79c3      0xd8ebe484      0xbd655b1e      0x39de3925
+       0x51747cff      0x4a238541      0x80ada60a      0x02296598
+       0xdf23b02b      0x3ffbf18f      0x52feac43      0x01ba32ed
+       0x6bd49cbf      0x8b4bda59      0x92697191      0x3632a5b5
+       0xc060d9e1      0x124b11fa      0x61602a46      0xec8a28a7
+       0x01b67d7c      0x63b03988      0xa4591fec      0xb23e8594
+       0xa5f7633a      0x84d8a66f      0x7f06a567      0xf38b81ae
+       0x1efbd58d      0xdc476674      0x88205063      0x04ce4533
+       0x880ed70f      0xe9011878      0x58a3824d      0xdaffbc02
+       0x66941b6f      0x9e132bf9      0xf3eff9a9      0xb3d2ac15
+       0x766e0ebd      0xfd469d3a      0x678eb9e2      0x8c65bd29
+       0xebb204da      0x2875a82e      0x41341882      0xc1fc677a
+       0x111cff64      0x9af5f6cf      0x9d57bf72      0x0280048f
+       0xdb4d1bbb      0xb7aab40d      0xc953ce3b      0x9e9dc79e
+       0x291772f1      0x90872d54      0x158a2ce0      0x87da1ff1
+       0x8c4867e4      0xafbc5845      0x2d62d991      0x0ddaac95
+       0x28295d76      0x5c2cbe25      0xd9661876      0xc2438e8f
+       0x4cff1d7d      0xedcafc76      0xdd01e779      0x7facce7c
+       0x57058402      0xda77d4dd      0x53b4bb50      0x65391cb3
+       0x8152d72e      0x5d01c98b      0xff747405      0x19e6f055
+       0x1ced591b      0x525d28bf      0x121ce275      0x38539d0a
+       0x996008c7      0xa71f9800      0x85284c36      0x0d5ca4e5
+       0xa315c804      0xc4fb1ce4      0x76c8a106      0xef84c812
+       0xadb11f71      0x86d1095d      0xddd4b1e1      0x065cd8c0
+       0x99b9fe1b      0x921403d8      0x95f05195      0x1d726ca0
+       0x0fec4222      0x36aa98d7      0x2206a9a1      0xf2905f96
+       0x9502d27d      0x192e5af1      0x6b030782      0x3083d3d5
+       0x079ac64d      0xde9b04ee      0x3e1a0eec      0xbe3410ff
+       0x380d770b      0xe51dec70      0xfd45046a      0x60e9b5a8
+       0xfcee7db3      0x9407fcbc      0xe54f8a33      0x91bbcac7
+       0x1ff989a8      0xb626741b      0x086a7934      0xf6318222
+       0x8047f0dc      0x4bc04243      0xd8c55fd0      0x71019f76
+       0x2ddb9237      0x40948af4      0x0910ee25      0x9b89252f
+       0x18364ebd      0x079ffe04      0xd76db709      0xf97538b4
+       0xdbc20ced      0xa3fb6b50      0x787f7229      0x1b54a67b
+       0xb706e1bf      0xe2218739      0xa9ce7e63      0x91de8423
+       0x78aa8a85      0xb4b2297e      0xef3625d0      0x2c6618cd
+       0xe8908b71      0x678fedd7      0xf33b04a7      0x83cff4d7
+       0xafc00ab3      0x9e006bd3      0xae11c467      0xf8005ae8
+       0x3dc3c0e4      0x9615fea3      0x3cda278e      0x77f1adf4
+       0xcde0963c      0xbd3d6e5e      0x630de1a1      0x841fb94c
+       0x396b32ed      0xccdea70d      0x308edf0b      0x71acfcf6
+       0x2f07d226      0x531b1985      0xd08b58ea      0x47127332
+       0x2813e4e3      0xa3266030      0xe27c82af      0xfb03fbaf
+       0x408f9dfc      0xbad7ed47      0xd6beb8fe      0x229c79b5
+       0xe91cc6b5      0xd807be50      0xcef683cb      0x44f87410
+       0xb891c4b8      0xef29d1af      0xa93c8894      0x1e7d3a69
+       0x1acfc11b      0x4a29db04      0x983d185c      0x68ce4131
+       0x2e9cb1ee      0xe91510b5      0x621c1ef7      0x0f14a520
+       0x35cdf015      0xcc767e0a      0x2476d5f9      0x68d558e3
+       0x6932d432      0xc980c74f      0xa23e9608      0x3161023e
+       0x64a5c93c      0x9fb3985d      0x538bd7f3      0xeb8256e3
+       0x65aae455      0xb1b16e5b      0xb41b906a      0xa3e1c623
+       0x5ebfd20c      0x472ab0c7      0xb862ec5a      0x677caf94
+       0xf12f50f4      0xd188afed      0xf3cb7e39      0x53e924c6
+       0x42e0eb39      0xc60b822c      0xd8661fdb      0x72b0faf0
+       0x6aa3c735      0xce48dad5      0xc8201232      0xa4d95ef4
+       0xe80626ad      0xe0a47835      0xd6854983      0xc2b7e630
+       0x77f32e03      0x21f00e02      0x622eb8dd      0x37103875
+       0xe9c7416b      0x83db0965      0x7375fe36      0x192b127d
+       0x62794f9d      0x5a451860      0x594cdffd      0xd5e7ef9d
+       0xc782917c      0x6f9e9141      0x46a8b7a3      0x181df7e2
+       0x6dad09f9      0x15a1937c      0x99d80e91      0x63e92c73
+       0x73e43728      0x179e1573      0xfdcc276e      0x46112bec
+       0x137d0f85      0x8435213a      0xef04615e      0x01dbbc7b
+       0x505ce560      0x16f833ce      0xaa8d3688      0x47b4669b
+       0x0f354a7b      0x12c0dbd5      0xe77a9efa      0x930a3567
+       0xa011b706      0x85fdfcf3      0x7ceb2c48      0x429d7349
+       0xe61b9120      0xe080e78e      0x50f6d453      0xd63f20ce
+       0x4e18a840      0x613b4431      0x2afa105f      0xde138b58
+       0x77336868      0x5214293c      0xf6fdcdf3      0x5e63d611
+       0x42d0a5c0      0xcd01f451      0x1583eb33      0x95c699e0
+       0x21893a08      0x704facdd      0xb4ead18b      0x7c6ddaf1
+       0xbab85cc3      0xa2b9344f      0xa8657896      0xb63babb6
+       0xfaf99f20      0x73dc0349      0x38dd90f6      0xbe1a118a
+       0x76d8d230      0x2b6fc0eb      0x485a22f9      0x233df23a
+       0x894d1b5c      0x0afb3e50      0x71e7eaa9      0x88923872
+       0x085033c7      0xcb3c83de      0xbf38a300      0xfa018e69
+       0x50a4549f      0x06422587      0x0dc263ae      0x5e048686
+       0x64587a45      0x69fcf415      0xcff7a01f      0x4224983a
+       0xd2f00e53      0xbc50202f      0x56c2c541      0x716a3f01
+       0xeb97c469      0x545cf2ab      0x8a5fafe7      0x9ca6b167
+       0x7d24b6b5      0x5b9c6061      0xb7f4d550      0xf3651821
+       0x42e3dd52      0xd96e98e2      0x28b6006f      0xb30d9122
+       0x62954242      0x3b824f4b      0x97010e45      0x63caf666
+       0xf1852f27      0x5ac1018e      0x5261907c      0x8e2062d6
+       0x9bb98a7d      0xf73121cc      0xd44d7ca3      0xd922ff41
+       0xa2a7bd66      0xb60ad501      0x1042d3f4      0x464e258b
+       0xf740d72d      0x3eb38eeb      0xd155dff3      0x89a80f07
+       0x4b022bba      0x6647ef88      0xef3a7405      0x7e999fb7
+       0xf0881841      0x72f7b9f3      0x5f844112      0x3c9b265d
+       0x7ab280f8      0xf05ee4ec      0x0980072d      0x99997fd2
+       0x0be19dc1      0xf4d8a16a      0x341ebdb4      0x134c79ae
+       0x4caa6647      0xbd166e1d      0x0a3726ae      0xf6f19820
+       0xb00aaa60      0x332d2567      0xc0668705      0xd5ac46b9
+       0x0c27ef58      0x1f2a3544      0x16de79a8      0x1d4fb3e0
+       0x22c094da      0x5780d40d      0xeffedd2e      0x98be7ed8
+       0xdcd20eb6      0xcc49d902      0xee004f43      0x4db50bac
+       0x2c48407a      0x158ae057      0x1007cd9a      0x4339f13f
+       0xb25bda18      0xe3d5dc8b      0xc311b3ad      0xbf26f86d
+       0xcb685e0a      0x4e09b6b3      0x8b7d79bb      0x602281f5
+       0x56e4bb98      0xa59cbf03      0x68ac07be      0xa9565d05
+       0xd2436522      0x40fb37a5      0x0671bdda      0xd5217560
+       0x7547d749      0x3a1baa3d      0xda341a51      0x165317bb
+       0x8b7ca453      0x4794f5c6      0x939bbb1e      0xb658d2e3
+       0x4620a572      0x0d8f0169      0x15ee2511      0x20f2d2c9
+       0x77d5514a      0x5c732436      0x235b6b69      0xe32db055
+       0x609cee9a      0x60b02bf2      0xf6fef4b8      0x789f7d0c
+       0x2251220b      0x3ea6e885      0x187101af      0xc99f3ce3
+       0x171ce0b2      0x47ddb34a      0x05d20663      0x33ebcaaa
+       0x095e9ddd      0xccfa1e7a      0xa388f304      0x369c1782
+       0x811bf00f      0xab1c951a      0xe88f1480      0xbe71f874
+       0xe34e8d5a      0xa574fa6e      0xf848a97b      0x157c3627
+       0x76e11850      0xc922bef2      0x47d7f3c5      0x498c2531
+       0x7a6f752d      0x462ae32b      0x290ae02d      0x6352395b
+       0x03b5f70c      0xe66b9177      0xd006c3e0      0xc5302173
+       0xa8fc59b1      0xbb39b0d7      0x9ba45a17      0x3a03547b
+       0x28b1fc82      0xaaae00c8      0xa6723469      0x66b69630
+       0xf50a3e6f      0x33ae1719      0x4c2a4520      0x2e84d3b1
+       0xc2a6da1b      0xa8c63fb4      0x5ef3150e      0x62648121
+       0xbde9f90f      0x2e348297      0x421be188      0x3e129c67
+       0x0b72d6b1      0xdcef0ca4      0xb3f5180f      0xa3ab312d
+       0x92cf1271      0xb0174d00      0x07c34185      0x96629df5
+       0xb669f92e      0x48ffbb2f      0xce303a62      0x58758152
+       0xff88c28f      0x740203cd      0xd8606fad      0xe0f49016
+       0xe50d362c      0x8af053e2      0xe405b078      0x517db488
+       0x664667dc      0xdac203d0      0x579e7a13      0xf75bb4b8
+       0x2c465572      0xdebb0288      0x810ba79c      0xc5fb168d
+       0x325eec36      0x12939e50      0x8978e795      0x4b26a562
+       0xc0eb36e6      0xcdecddf6      0x74d8ab28      0x69abb8cc
+       0xc3e49aea      0xf4302958      0xd49f47f7      0xf41884f1
+       0x81431670      0xa6da9dcc      0x98d844b0      0x85f7dc61
+       0x28746eba      0xeefb5d09      0xdfd17127      0xb90651b1
+       0x960ff381      0x4dc2f826      0x93dd1524      0x5dda5d3c
+       0x1fd68f6e      0xd4045aa4      0x2254d6ee      0x1f92cf67
+       0xb2655366      0xf623e3ff      0x7b3d96dd      0x1871a30f
+       0x954a44c5      0x2f29fd8b      0x62c27aab      0xdc46ddc8
+       0xd44356ed      0x5bd8a440      0xd549484f      0x746e26d2
+       0x65783d84      0xcab49250      0x7a1c8b24      0xc8063e68
+       0x7609278e      0xb4f14286      0x27495301      0x2cd03051
+       0x446a046b      0x0be32e76      0xb9171daa      0x4cdc88df
+       0xcc1f34e0      0x7a81d4bf      0x6cb5743d      0x57450c96
+       0x4a236466      0xe31357ef      0xfd9a4d3e      0x03d308c8
+       0x33f21e03      0xe781adb8      0x88521371      0xd19164cb
+       0x3caa33e5      0x0c65ea5e      0x8fcd4379      0x1194cfa9
+       0x8937eced      0x7628f0e1      0x1016ee9b      0x6c43093c
+       0xd562ec84      0x53daa34f      0xc64a0632      0x5768c330
+       0x9b22d9a0      0xbabbc688      0xf83adf7f      0x9f454bfc
+       0x436c3478      0x1501bae4      0x8bdd6dba      0xabd0d59b
+       0x380ceaf2      0x698c8047      0x8646a825      0x69a0ef6e
+       0x79a56c4c      0x2789d08d      0xc52f3a4d      0x2166f074
+       0x59eb5fb7      0x43f2a041      0x43609bfa      0x9327c7c5
+       0x6663ffdc      0xfcdef11a      0xc5f824f3      0xee0fd8cb
+       0x2d6c495d      0xe280de34      0xf4af7465      0x0b157539
+       0x2a7ab144      0xbab24805      0x562ad952      0xd230fec1
+       0xe4167036      0x20a88433      0x24af7727      0xbf0622d8
+       0xbb3abc8a      0x98190a0b      0x256ac6ac      0xaf4c6720
+       0xefa7f106      0x75a16acb      0x44ea3d10      0xd696ed81
+       0xd0b59111      0x766d8497      0x100c5abc      0xf1b95046
+       0x6e69f5d9      0x66b6a5d9      0x2dd2c310      0x495dbe1b
+       0x1d32d006      0x8c690d83      0x4fb1063d      0x92979582
+       0xb385b386      0xbf0a3354      0x17ce9072      0xbdd59104
+       0x7327ab1d      0x125c0791      0x4ac0e89c      0xc2b30c57
+       0xe0686206      0x35c12383      0x10d5ae11      0x60730cbb
+       0x57ddbbc2      0xafce2e54      0xf0856d8f      0xa9759bc9
+       0x0d8f3f4f      0xa9febc31      0xe2f1b192      0x11b60587
+       0x1c33d3e4      0x479c0a41      0xf037853e      0xab97a5cc
+       0x1e1924a6      0x6d669b25      0x9b1f0d7c      0xce0407fd
+       0x2f913715      0x17099510      0x704d3f98      0x9682966e
+       0x45da3d7a      0x32d7ef00      0x36a1b717      0xc555e6e4
+       0xe50350d2      0x5d50c32c      0xd8d37f54      0x03708cda
+       0xac1e2a5d      0x257ffad7      0xd0f70b95      0x8f74af3b
+       0xa0bf13de      0x9edf45a8      0x69665702      0x756672a8
+       0x3cc067ea      0x00fe56db      0x85ae983e      0xaeb28321
+       0x09defe2d      0xa8c13c37      0x5dceaecd      0x7bec1219
+       0x4e7921c5      0x98cfe03a      0x6958c017      0x9087ef00
+       0x95ea4dfe      0xe264c6b7      0x9a6810b3      0x05d7e8ad
+       0x26a1f7b3      0xc78cf12b      0x7c4658cd      0xba02d02a
+       0x4bf51833      0x31f10171      0xeedb6de2      0xa95fe8b1
+       0x9b4e834c      0x6edb1df4      0x2eb374fa      0x599f21af
+       0xd91c85ef      0x29bb5e50      0x40acfb6d      0x5188b56e
+       0x7b371516      0x47336571      0x021a7e29      0x900ecaf5
+       0x7aaac4bd      0x7c630119      0x51592e5a      0x984c316d
+       0x99aaf2eb      0x5a5ef213      0x62972730      0x9db4c2bf
+       0x36fa8158      0x9e83fd35      0x1e819155      0xcd7da0e2
+       0x7b4b9287      0x7df42364      0x815ffec4      0x28a02a2f
+       0x7645873b      0xa96a9600      0x86fe7360      0xe2429409
+       0x0e81cec3      0x2837d531      0x3634694e      0x205f07b2
+       0x92797dd7      0x431aaadf      0x54d3edce      0x02bab9c1
+       0xff502eed      0x3f5cdb73      0xaf217968      0x65c7d614
+       0x6c1fed64      0xc84ef92b      0x3335dc76      0x8a36f261
+       0xe18cc99f      0xecb5a349      0xa60f9ac3      0xbad211ad
+       0x414c5b7a      0x2427e2d2      0x06c840e5      0x5eb6c304
+       0x81981cce      0x46fe9618      0x55b7e5e7      0xb0a84b4d
+       0xb64f1852      0x1b91dcab      0xbdc34189      0x9954a8a7
+       0x94353c4c      0x47c53c9d      0x55906e49      0xd957647d
+       0xc695fe87      0x3cdc787e      0x10deb790      0xd7e646ed
+       0x1277253c      0xe6ecc20e      0x2ecf2f7a      0x5b5deb63
+       0x49b50f6a      0x6f9e13ef      0xfc1c3a3a      0xe43a9188
+       0xa08e487c      0x7679f614      0xb2c75035      0x4ad8b606
+       0xc2ca32d9      0xe6ecc606      0x12fa8dce      0xc07baf0a
+       0x0e05a004      0x9e9e9411      0x130e9972      0xcd9ef9cf
+       0xbefbbcc7      0xf96216b6      0x9aa77353      0xb43e54d2
+       0x2df91569      0x0b16533d      0xef134eda      0xe986df3c
+       0x9d9690bb      0x821d2f44      0x21fbabb8      0x79ce8167
+       0x84f9ea38      0x2cf4434e      0x85644f97      0xb17722d6
+       0x96c1a108      0xe07cc5d9      0x843e98fd      0x92f6ac95
+       0x19f7e9f7      0x1f7602b7      0x09d94385      0x79ae50d1
+       0x66a40fe1      0xcd01e167      0x22ffeb10      0xccb05daf
+       0x407877d4      0x3dd335e1      0x7712a985      0xdb4c9f02
+       0x6c109614      0xe0c09e0f      0x93c4dec9      0x8e9742ee
+       0x10dbc990      0xaaff5f72      0xce73d6af      0x4d6ce4aa
+       0x9d78739c      0x674ec129      0x45de755a      0xa122c199
+       0x6fd9251a      0xb8a1979b      0x2a62ebbf      0xf6d19f54
+       0xdfeba405      0xec19fde2      0x51950563      0xe68e02cc
+       0xe2213039      0x9fad2f99      0x663ba91c      0x8044f595
+       0x8451dd81      0x78df35df      0x103fd73a      0xd9f2f1f3
+       0x493caf73      0xe5025797      0xdba6c5fb      0xcac85576
+       0xd36dfa5b      0xcbf18249      0xd4053837      0x1f128937
+       0xfbf049eb      0x83be2114      0xa69a8b6f      0xfbbeb881
+       0x7a738c47      0x06a3f4d2      0x7b9a8b67      0xfe949d59
+       0x8a8f15f9      0x483cba16      0x2d85aaa6      0x7285eadd
+       0x06f66872      0x59e3da71      0x2ef8ffc9      0x9e419e3e
+       0x10da30a9      0xbf052864      0xd55bb868      0x843663a0
+       0x54302010      0xca056426      0xa413d44c      0x6cfa2f03
+       0xeec3722e      0xc1b3d010      0x6cbe9937      0x4e28768f
+       0xd85a8bd2      0x852d36d3      0xdc2bb17a      0x942adb65
+       0xde0d232e      0xe7a3fdeb      0xa2effa04      0xe88f2956
+       0x4df8bc13      0x90895e4d      0xa7817aab      0xf3248976
+       0xb32d394e      0xda2db11f      0xe423fdb0      0xb09ef58f
+       0xcc889395      0xdf875ef3      0x908324d8      0x62548201
+       0x6fc040a5      0x5421e58a      0xcbed64ab      0xde8ad9b1
+       0x46708788      0xbfd97b14      0xab421144      0xae60a0ba
+       0xb6e6bbc9      0x09f37f60      0xf1135386      0x5164926e
+       0xf2660ddf      0x45fe5b88      0xfd74f7f9      0xa586e2b1
+       0x44bb2794      0x9ec54550      0x65ce44b4      0x6a326bd3
+       0x59146d09      0xc74c4e5a      0x3be1b656      0xf67601d3
+       0xbb69de44      0x6065d21a      0xe4463332      0x868232c8
+       0x3e5e8ad7      0xd04eecdf      0xc89c34ca      0xa62c3540
+       0x134bc86e      0x0fec76e9      0xb159baaa      0x419a1c49
+       0x8d829ad7      0x90a19def      0xd71d7652      0x4a9d3846
+       0xebd1c228      0x5d875423      0x0287924d      0x4ec52bbf
+       0x752c7893      0x99a1842a      0x7c8e08f6      0x35ff21a2
+       0x95ddff74      0x28bffb90      0xfe686106      0x628a1db5
+       0xb2f59548      0xeeaaabb4      0xe7825340      0x3e9c0125
+       0x1533225f      0x82e6aa5c      0x699430b1      0x2b79e86e
+       0x70b259d3      0x71586bb0      0x26c4fd82      0x322d3e16
+       0xd686454e      0xdbd4b583      0x6cae58dc      0x77b7e14f
+       0x562d70ac      0x907e049e      0xc3c4866a      0x99ccfaf9
+       0x6591a5ce      0xd35cba59      0x82d892f6      0xf6d04abd
+       0x25595ff4      0x2b5e8b12      0xe4b3d932      0x3f8f3a16
+       0xbf7f9ac8      0x4f54467f      0x41df7a1b      0x2c2002a4
+       0x4ab82fa7      0xff80a896      0x22539611      0x642ab065
+       0x4f293070      0x99ed3529      0xcb5945a9      0x7820d897
+       0x59b2ff7c      0x7ecdab7f      0xb37a6005      0xd50bcf61
+       0x4484ed63      0x2b28332a      0x101e8686      0xfdb32040
+       0x8874ce52      0xe991bdcb      0xd99d48a8      0xef1654e7
+       0x1a37d482      0xc3824d3a      0x338d6d44      0xe4f26648
+       0x4ff10b7b      0x7e2dccc2      0x02c1b663      0xc6b5e51a
+       0x327d0c75      0xff3f5359      0x55c407dd      0x7795732a
+       0x4b033d1a      0x5e285c1b      0xffa99def      0x2cac8a65
+       0x33d66077      0x8e3b374d      0xf70cde75      0xe342a9a8
+       0xf8a8286c      0x26f21845      0x1c35821c      0x30480bd7
+       0xa895087d      0x63e32777      0xfce580c3      0x62f97856
+       0x505c22db      0xfab99f9f      0xe1099684      0xf62f8889
+       0xec9b6b43      0x555e966a      0x462e70e4      0x2ae637d6
+       0x3d6ba70e      0x37bdea88      0xbcb566b0      0x40a34189
+       0xf3474e78      0xbb16e878      0x115dcbd0      0x6e379a93
+       0x55605ebb      0x357d26a6      0xce1ce1a2      0xff38b240
+       0x50b9e52b      0x66c12a77      0x99a25a6c      0xf9de1622
+       0x471d103b      0x256ad08d      0x4fff9dcd      0x44685f25
+       0x9a0e1396      0x88a2f2ae      0xc3f9f29f      0x4f9e8c90
+       0xe294901c      0x4c2a3147      0x2c206563      0x6adeb562
+       0xf9d839c6      0x801b3964      0xa61cb7cc      0x32a2072e
+       0x3e2a1d00      0x1904f4fb      0xe1027957      0x9ed87c1a
+       0x048aade5      0xe63aa9a2      0x5a460512      0xf3b85e58
+       0x1960d9ce      0x11445aeb      0xf96645a1      0xa1ad34ca
+       0xba376d98      0x5833c258      0xd7920fda      0x3a2658d7
+       0x095b9750      0x4b3fe950      0x7e6b6db7      0x259b5be5
+       0x98ee769a      0xa5fde88e      0xa6ecfc18      0xafd66bca
+       0xbc9a9779      0x260e70f8      0xd24be5fe      0x53af1ac7
+       0xec112709      0x76a4d04c      0xfc88a201      0x673f6cc8
+       0xcfce8151      0xc328f56e      0x184f44b4      0x94f0d97f
+       0xf34963bd      0x629ea5f5      0x99a6209b      0x6f11ce53
+       0x6385b633      0xc2d2e97c      0x608d81ac      0x488268ee
+       0xdddf7f90      0xa71b1365      0x332b2446      0x416a0ee8
+       0xf34dbf77      0xbf85a55c      0x39acda18      0x7b6d076b
+       0x51ab603e      0x3916cd25      0x862c27ae      0x941c4083
+       0x206fbef7      0x116e6624      0xd386b8d4      0xf5d762c9
+       0xe3aa182e      0x1c4cc0e6      0xb9d6a7fe      0x53834a40
+       0x7bcd85aa      0x47e66276      0xc6a8ba31      0x93c75a1c
+       0xdccdbe7b      0xb469a50f      0x92849b1b      0x797b14fb
+       0x9e6dcd3c      0x29cb2bbe      0x3e534aec      0x96e19982
+       0xf2c0cd9e      0x3604f523      0xb7320cba      0x1868ed05
+       0x95e44be2      0xbd16fe0d      0xfbff21c2      0x64ad7cd4
+       0xf9b88d56      0xb5224d1a      0x1271618a      0x1a5007ec
+       0xf5781dc6      0xb87bb7b2      0x0a47addf      0x003a1646
+       0xe5c57e01      0x0ddef18e      0x954de803      0xf6660d87
+       0xc929d78a      0xef164296      0x1d3993c5      0x8bdad828
+       0xafd5abf0      0xe9f3a99c      0xc925e16b      0xc1f2e4bd
+       0xb8c84791      0x59ec0aac      0xd955ed35      0x760982e2
+       0x56f2cf66      0xfbbb52c6      0x18aae748      0x3b245be1
+       0x5c455748      0xbc824892      0xd26cee8f      0x932bbf5a
+       0x1112c54c      0x75db823d      0xd8b7785d      0xc6a3aeea
+       0x1efe5e62      0x5f06df56      0x4ca2a339      0xe1f7271a
+       0xade0c55e      0x672d03d8      0x81101086      0x945d4701
+       0x77658b7f      0x7ed8432b      0xbc196029      0x9d040e95
+       0x86869faf      0xb625768b      0xda8b5870      0xb7c57dac
+       0x5486f95d      0x29c43911      0x03f75c18      0x477d1f58
+       0x43ed5793      0x0d3b9725      0x6a03401c      0x909a5bfa
+       0xce10d526      0x7adca2a0      0x04ba72f8      0x17373ae5
+       0x71c0e8ec      0xc09a855b      0xa46e5cfb      0x7d02e85f
+       0x88c0f756      0x69373644      0x2e54aba2      0xacf37234
+       0x70e33aa5      0xf560abfe      0x0fd8f883      0x7f01298a
+       0x5af95b0c      0xa07ba2b6      0x67e34074      0x23d0bf23
+       0x99a5c52e      0x1c6fc87c      0x31dbd46e      0xd291eb44
+       0x421e30e4      0xa5ff0214      0x6abceca5      0x90933fe1
+       0x45a72a5b      0x07a2b36a      0xe5313898      0xca7b9485
+       0x6263c073      0xf5190740      0xdd80f0d8      0x432fa2dd
+       0x69831440      0x6fced3b5      0xa314fbab      0x18b9ecc8
+       0xae7235a4      0x08a267fa      0xcc4a217c      0x477440b6
+       0x5877756d      0x862847a9      0x91c017ae      0x39292950
+       0x21bd5cb9      0xf01d709a      0xcdc173ad      0x138e94d5
+       0x53054d97      0x302bb5b1      0x0d264e98      0x3cc9d0be
+       0xc92555fa      0x3e79530c      0xd48c4c4b      0xa06ba129
+       0xb5f33763      0x39a37bd0      0x1e8d0d46      0x93b599bf
+       0x0842efce      0x8d6ce60f      0x3432f84c      0x9d8ca617
+       0xfec93e00      0x3389826b      0x61d2bcb6      0x6b15eeca
+       0xa8f814ec      0x31fb1195      0x4d5784dd      0x9a0c7388
+       0x39ee3413      0x7f858c65      0xfa9ea23f      0x6231f584
+       0xfaf40874      0xf2c87fe1      0x8869c40a      0x04eee868
+       0xe3bb8a66      0xc28c5aa6      0xea2cbe9a      0x3de2d5d1
+       0x88ffcd76      0x47493091      0x310271dd      0x557e51a0
+       0x6e0dc01b      0xdf812ce2      0x3b6da963      0x214f5533
+       0x099c5441      0xc16460c6      0x8c55c47e      0x319d328a
+       0xf230ceac      0x7dde560b      0x337b15d2      0x80678040
+       0x1052d3ac      0x06db710d      0x0b54d93e      0x98987009
+       0x254704e0      0x20650419      0x6118e810      0x4f52d866
+       0x64d2e8a3      0x0480d5da      0xde5ef5b9      0xb03a703f
+       0x379ffb82      0x76f87284      0xb0b7059e      0xb3d37671
+       0x2b243a94      0x75a70d88      0xe242c806      0x30435090
+       0x3ec06f3e      0xcc25e123      0x58db94cf      0x890826ff
+       0x73057887      0x1e2e0740      0xf80ced81      0x924e6de7
+       0x15a8e02e      0xde8ee51f      0x2dbb33d6      0x185567db
+       0x8145bac8      0x0d14334e      0xd8bcd7d4      0xc18d3256
+       0x57efede9      0x73ac6179      0xf6e98357      0x068c24d2
+       0x3dc62465      0x70d47d94      0x2b249317      0xca89c2dc
+       0x335e7372      0x78584f6c      0xc645bcd9      0xdd941604
+       0x0e72657e      0x5a3ba416      0x86710900      0xcf2dbfbb
+       0xa59814dd      0x8850b913      0x0c8d653c      0x2d220e4b
+       0xedfed05f      0xc4688466      0xec54375a      0x3ab1c99d
+       0xf64dba02      0x01499f01      0xbec76bba      0xf520292a
+       0xd98d6fcc      0x9e8811b5      0x0d3e90f8      0x440928a5
+       0x6df4dca7      0xd991e421      0xa80f7476      0xd39255f1
+       0x747d717f      0x67536af2      0xcbdc6e90      0xb3ef075d
+       0xc6b59f51      0xf3d2b422      0x96e646de      0x9f95a00a
+       0x370d965a      0xa20df02b      0xe3326da4      0x97e96ebe
+       0x62133be4      0xec63e8d1      0x7170458b      0xa04077ea
+       0xda611b2a      0xd4541229      0xb262f2fa      0xa0280090
+       0x04d9ff11      0xc4dd530e      0xaecc11d3      0xac5e8ee2
+       0xe03303a9      0x45c74f3b      0x0a44e0a3      0x623c812c
+       0x5a78acbb      0x174b6ddb      0xc15a6167      0xeb370d7d
+       0x344742d4      0x95c36708      0x50b22ead      0xa8f66299
+       0x240522f1      0x0c19352e      0x7aa5f269      0x7e349786
+       0xefa03eaa      0x162cbd19      0x1d657093      0xe7e2d85b
+       0x64cb8342      0xffed7a87      0x48877ee5      0x9861324c
+       0x894e2a1b      0x0ed0ad9f      0x97ffdebf      0xd8e71947
+       0xe9797767      0xd3a02dba      0x872192d2      0x9ba0166b
+       0x8c6418fa      0xc9ca4562      0xd1c20f63      0x7c0827f7
+       0xc55ebb68      0x8d7eec37      0xa0f2a179      0xfb121fb2
+       0xb6496a31      0x54f7332f      0x37fec58c      0xde32ed05
+       0xd8de600d      0x3384d32c      0xe49fdb04      0x6788cf7d
+       0x4739394a      0xff02632c      0x81c5255e      0xfa67feb4
+       0x06d7befc      0x9639b5ee      0x639cf17f      0xf9de4a5f
+       0x02243882      0x8d2241af      0x90a2219e      0x48f9d0be
+       0x3856b281      0x559afad3      0x4c73c448      0x6a19c2c3
+       0x422b9934      0x19bf9591      0x3edfbac9      0x1410f992
+       0x009c3964      0xcb2139b1      0x1f28d6ff      0xa96de3b3
+       0x7436f1c4      0xe7a96628      0x4593df96      0xa360dbf0
+       0x092edc07      0xa728ec90      0xd84eea82      0x8df6e4f4
+       0x69342820      0x7a71afe6      0x8edbcb4d      0x41c381ee
+       0xf4828f3d      0x8135dfc9      0xb7d60954      0x6ffcd452
+       0xea6fc8e9      0x5d321983      0xe1961ede      0xa627d22a
+       0x78e1fb4b      0x7cb48d21      0x45791225      0x9ed45669
+       0x873cc9b3      0x226dd2ef      0x3bc8e0b5      0x73515ea1
+       0xcfd1a0a6      0x3f0ef6a6      0x42698d45      0x24774846
+       0x1b4dd33d      0x7ab567b3      0x4287a3d1      0xb3a340af
+       0x5461daad      0x42d65034      0x79ce7d93      0x4de02311
+       0xc9cfeb8b      0xfc31cb0e      0xf2783bd9      0x9f883599
+       0x44d25fc6      0x2d0ac361      0x2314756d      0x6204058c
+       0xbb89b0c5      0x466ed73c      0x9dbe3d75      0x8ec6447c
+       0x89853f2a      0x452f289d      0x59ab32d1      0x664ef2b7
+       0xf2feb1ae      0xee84c078      0xfd352da2      0xf4bb27c5
+       0xf946c061      0xecc515c8      0x89f15047      0x7305b158
+       0xac79b70a      0x4851a92c      0xa60cda46      0xc36b47a3
+       0x1fe96c82      0x775c7496      0x7ff0ef05      0x3b902ee5
+       0x3d63a012      0xe9a59d17      0x990dc562      0x3d28b2e7
+       0x463f45b8      0x2cf93af1      0xc0b20323      0xd2f2a727
+       0x2ab30093      0x7b3067b1      0xb1084167      0x9359b6e5
+       0x2bfc7ee2      0xa433704e      0x2534cc30      0xb7eeb3ad
+       0xe6433dab      0xfab7ee93      0x8fe1baf6      0x7c9d1cab
+       0x0b37489b      0x21f29bb2      0x1fbe19de      0xa9fd5655
+       0x18cee72a      0x54444e6a      0x7b8e67bd      0x4733851b
+       0x1edc5cf6      0xc4058d84      0xb17b3474      0x635842ce
+       0x87dc13e5      0xc85c88a8      0x6465d06d      0x3651a206
+       0xf221335c      0x8f829f04      0x0cfd2da7      0x3f8a1f5c
+       0x9d7fd530      0xecebbebb      0xac20b927      0x0931c838
+       0x04f4da8a      0xc604e560      0xb5a32b43      0x92578126
+       0x086e4838      0xe299f931      0x405921ff      0x1bf3b424
+       0xe330e775      0x32a8b2e8      0x8c398e8b      0x4c1b9be4
+       0x3d6bbc2a      0xe16749d5      0x3f711d29      0x167679b3
+       0x67753943      0xbd19e4ce      0x8a01927b      0x7ed9db48
+       0xeb810bed      0xf010bb3b      0x0c619dc8      0xda2b4ee6
+       0x97f72cae      0xb1e50373      0x86a56b38      0x42564171
+       0xa42e02ea      0xf9a73535      0xa090a1e7      0x36c5f132
+       0x2be425e7      0x99450cba      0xaf895b37      0xea338c07
+       0xb5173364      0x87cba1b1      0xff17a025      0x926c143f
+       0xc1bd8ed0      0x7dc43a1b      0x409201a3      0x37435a42
+       0x6fa2c185      0xf6b63721      0x36e18dad      0x65fcabe3
+       0x047d6f6f      0xabb8de33      0x36edf818      0x5240f1c2
+       0x2a74bfe4      0x23bd88f6      0x5277ef4b      0x661eff54
+       0x63c1912d      0x5ec4b96a      0x80ce9176      0xd93f4b74
+       0xdaa4a9c4      0x4fe89560      0x4ad9f1e2      0xcf39d5ab
+       0x78a71e58      0x7fc8c792      0xf8524dcd      0x2ad0224d
+       0x80397618      0x91a5956c      0xe6d93642      0x16e811c3
+       0x115e8e88      0x01b33913      0x6019e327      0xa5394792
+       0xfaace8e9      0x984b2b11      0xa7dc9448      0xc947698c
+       0x8b191b70      0xb47def7e      0x504a792b      0x6a1e6978
+       0x8f697729      0x87e133ad      0x98b112ad      0xf4cf8898
+       0xde515d35      0x5e534596      0xbd8bf459      0x783d26c1
+       0xf021a2e4      0x2a15a509      0xa314f1db      0x88fcf5fb
+       0xcd0ab684      0x24fa6b87      0x3bde9c04      0x3a5381f5
+       0x0b035c86      0x5d8c4134      0x7131d67d      0xad193dcf
+       0xe8b949ef      0xa241ca53      0xc6a522ba      0x08214572
+       0x0f8b6327      0xd744cc9c      0xe626ba3c      0xbcc8fa71
+       0xc8889a16      0x4101e6c4      0x013361e2      0x81afc6f5
+       0xd47afc84      0x594e2007      0x46a03c82      0x6ed8e69d
+       0xc395debd      0xdf10a851      0xfdc1968e      0x35fb989a
+       0xc5c8f333      0x4bab2dcb      0xe145c017      0x2ec93db8
+       0x993415ca      0xe1fb3144      0xf111e25f      0x52cbcd55
+       0x0691a307      0xa535bda0      0x8f0f5921      0x4250306c
+       0x65307a53      0xf7c8a4bd      0x606aa819      0xaa534324
+       0xf9cea68f      0xe4152914      0xd5fe89a6      0x5199e351
+       0x82322d06      0xa9a7ccdd      0x859d711f      0x28fa34c0
+       0x405d0a0e      0x31622b61      0x5205acc2      0x658e0d8c
+       0xbf87f2f4      0xcc6309f0      0x0ac483d3      0x62d61d0a
+       0xc29ee1cb      0xe719d1be      0x44b8140b      0x9bcdda3a
+       0x4533c26b      0xb42060a9      0x58853442      0xd876d55f
+       0xf13165f3      0x35ed56e8      0xea1a5415      0x4c920d34
+       0x191ceeb2      0xc8ddc82e      0x3922fd04      0x978d6ab9
+       0xa087551e      0xbb616dc2      0x86d8101f      0x2c6e98b1
+       0x28fcd44b      0x67daa758      0xc19c6c89      0x28338d0f
+       0x9a173526      0xf1c32e1f      0x42eafaeb      0x697bf44a
+       0xb677045f      0xe902a9db      0xc96cc214      0x476ff77f
+       0x5419cc3f      0x77b86c5c      0xd95d783e      0xadf630d6
+       0x1fee8ae4      0x4e6f2f89      0xfd784caa      0x00bcc110
+       0x785fdec4      0x4b8ea519      0x93f2031e      0x69d42d67
+       0xb6a0c4f7      0xdde15f78      0xe106753d      0xd4319e3d
+       0x9f033801      0x45d214cb      0x89f0bbb6      0x0b68e9a1
+       0x0b42f46f      0x97d81d3a      0x592a0992      0x70a18d46
+       0xbd75f408      0x5fb94e1e      0x894505a4      0xd84edd3b
+       0x951f996b      0xcb7a6410      0xa9bb75fe      0x17269ed7
+       0x797e64e3      0x5385297a      0xc2e0ffb8      0xea3e7cdd
+       0x34b70c33      0xd879e291      0x6b2be9f6      0x615ef9d1
+       0x17f93517      0x29e19ec2      0xde62a1a0      0x552675ef
+       0x991f0dac      0x2decb2aa      0xf90b2cdf      0xaaeafa85
+       0xba1395be      0x552431b8      0x46b5c459      0xa95dd0b8
+       0x3da73cd1      0xb493eed4      0x4b2c1292      0x72437c8d
+       0x1fa3c029      0x3c846098      0x91f628fb      0x66c3083e
+       0xbd8674ec      0x2ad21c30      0x0755b90c      0x7c1c02f4
+       0xdea8981e      0x173c3099      0xdf5eb473      0x821bac29
+       0x2d83fed4      0x06a8eb69      0x7d3f8bad      0x5629edc3
+       0x7c4593b6      0xba8c76ee      0xf8b0d46b      0xccb41bef
+       0x571e8d7e      0xd99f20bd      0x0af219a2      0x89750f0a
+       0xfc0a9b8d      0xd0dca061      0xab6383db      0x5e095be9
+       0xc116da10      0x0850f5d4      0xa01f6c33      0x2b4b8a62
+       0xbc96338f      0x338cd044      0x6da96fd0      0x0d5c7042
+       0xffd4c56c      0x4ef92fee      0xc2f3d4e1      0xb81b2901
+       0xb0cfdcfd      0x7e68076c      0x6a48b418      0x5ae173be
+       0xa42af94f      0xb5aeaedd      0xd0a2ca28      0xfe301cb9
+       0x64616a36      0x9b63ce32      0x17e895eb      0x8576a9a1
+       0x23d14337      0x019c592b      0xef031722      0xfd6e5b19
+       0xc23eba8c      0xc64e6794      0x3602e7a0      0xfa9b4a62
+       0x806f61cc      0xbb1ad0c1      0x8253edd3      0x9e3bd367
+       0xbd24ea1b      0xcdc3507e      0xd98eed4e      0x8edd45cc
+       0x08fbf233      0xcaca956d      0x273ba326      0x49fa6eaa
+       0xd0fb7870      0x9ee56e1e      0xe675f026      0x47c4249a
+       0xd15ba3f7      0xd6a2090b      0x50b33122      0xc7bf73b7
+       0xc33cf621      0x73f17107      0x2de0b8fb      0xb8131d55
+       0xb0f18745      0xe4ed1a78      0xaf5dcc10      0xb56a7d51
+       0x27544a20      0x34188d9a      0x4d565903      0x9bfb8895
+       0x0e0ff1b1      0xd8dbb9de      0xc5b073ac      0x06499ced
+       0xdbe6dd00      0x051bc5f6      0x460e37b5      0xba525f13
+       0xf54a5470      0x227d4bfe      0x462105ac      0x43141f50
+       0x11de79f7      0x9f1821bf      0xc2aaf461      0xd5042606
+       0x7f7823cb      0x37374cd8      0x5f40c496      0xfcca9b0c
+       0xc9061b3d      0xc4887c54      0x3f9ac089      0xc7ebe1ba
+       0x933dea63      0xcf1de178      0x63713e5d      0xddf92c47
+       0x0ad1cd99      0x0ba92d8e      0xcdfcb995      0xde9d0007
+       0x8d11f064      0xb16073ac      0xcaf71f3f      0x3c220cd1
+       0x9afaebf5      0xfaa8b8d4      0x013085d5      0xa701c1c3
+       0xde4f97b1      0xe98fdf11      0xfcdf5165      0x704f0326
+       0x3aa9c333      0x5eba9c4a      0x8f17ad1b      0xefc9d59b
+       0xa8d6f56d      0xc5ba175c      0x33e332c7      0xf234bf43
+       0xf7478a19      0x62fc6fe6      0x8c205e86      0xeb21b117
+       0xda68f6c2      0xc35e50d0      0xaed255fc      0xfafaccbd
+       0x68bf6e7c      0xaedc2f85      0xb4963f95      0xb3bcdbde
+       0x20319ef8      0xa8e0c197      0x7be0aa53      0x77dd2f2f
+       0x27c5d672      0x4c9d8630      0x5b259176      0xecab82ec
+       0x0566cb79      0x35f099c5      0x2a915c42      0x2ac9e371
+       0x7137e3fa      0x4f43b99d      0x11c4dc00      0x8fc8cdf2
+       0x20e0dcd1      0x0234a137      0xa7226b26      0xf71df5a7
+       0x2c80994c      0x50f43827      0x97248143      0xdf8d811c
+       0x63168f49      0xa885ac8e      0xe7e6fce6      0x7b1d8b68
+       0x51378009      0x51eca507      0x7c862ee6      0x3a907513
+       0x339c2fb1      0xfb24c06c      0xb16c9630      0xec9327a1
+       0x790d3884      0x3053bd28      0x52a58115      0xd4071422
+       0x0e71ae93      0x446e0c55      0x917dea8c      0xecd558d4
+       0xc34e9011      0x0e3ab373      0xc74a7f70      0x1def7cc6
+       0x70e00517      0xae5bcec4      0xa491b7f0      0xa990d6f3
+       0x35322ee2      0x250d253f      0xf41d19e3      0xc8219293
+       0xf7aad70e      0x420423df      0x17947be5      0x1770183c
+       0x2d7b019f      0xac55ab96      0xec1b5070      0x6e9ae72f
+       0xf45ef9f8      0xbd99d8f5      0x5720a49d      0x4b26724b
+       0x5f7b899b      0x431d8946      0xdc9f5bb0      0xd9df764f
+       0x74fd696b      0x8ac6f8cb      0xe655113e      0x2178fb00
+       0x3ff85fbe      0xbe052b5b      0x51dd6484      0xd4f79bf6
+       0x15f60a65      0x0390aec1      0xfb6776d2      0x92f54e91
+       0x46b7b912      0x29638a41      0x36d4a299      0x817824a5
+       0x8d1f8eec      0x69fd819d      0xa2e2a133      0x54635a65
+       0x770c410f      0x4e02d788      0x3e0bdf87      0x3c98d2fb
+       0x63010acf      0x96cfa678      0x81b5b497      0x16ff2913
+       0xb8f90d11      0xd32d3085      0xd5a9a46f      0x05f45932
+       0x0694ea00      0x0d039ee0      0xa309cb9a      0xc506fe28
+       0x6d5af6e6      0xcf7e16f4      0xebb5a600      0x10b66a7a
+       0x07b0e164      0xe4466d8c      0x02979c1c      0x22e44ad8
+       0x0eba1199      0x7e007291      0x3e6eaab3      0x6bd3459a
+       0xf3072e5b      0x60e0e63e      0xc4c7072d      0xe23a1451
+       0x4fe5cd8d      0xb7cf3759      0xc415ef02      0x2ac8ed21
+       0x32d8a07f      0x630f2355      0x95f4a1f3      0xebb5fc49
+       0x766ee7b3      0x5195461c      0x652f7115      0xa5284de9
+       0xe9c3b41f      0x392f6792      0xc2997b44      0x55551481
+       0xd3f21d99      0xf0785862      0xbac2eddd      0xe1a58663
+       0x1e847578      0xd5345e0c      0x0680c68e      0x1d987ba8
+       0x94337413      0x9708920e      0x47a0683f      0x09cbf028
+       0xa400dbbe      0xe3d6cf1e      0x3d2264e3      0x82a0844e
+       0x5c6d61a0      0x29ed71ae      0x94d67091      0xa6d18fac
+       0x143550ed      0xbf002e96      0x5791faad      0x5c910726
+       0xee2a9fb8      0x92f476ac      0xff288092      0x580b9f47
+       0x2496ae51      0x6c979248      0xcfd508cf      0x24e1ed75
+       0xde92ee9a      0x227b8ea5      0x1a58fa12      0xab8990f2
+       0x9e16b990      0x9902e4f4      0x926e8f63      0x7d163d87
+       0x745c3611      0x16bb1ae9      0x8d169535      0x8a0cf1ad
+       0xf4b0ed16      0x1db04987      0x844a1644      0xde883736
+       0xd3ea88b3      0xf602cfc3      0x60be8c98      0xe94f8d25
+       0x9969ec2f      0xea40781b      0x9a51d49d      0x247539fc
+       0x396a391d      0x403bfcc4      0x460eaff9      0xfb50e4d2
+       0x88942d26      0xdc84dfd1      0x8ae3e0a2      0xed47755a
+       0x9719345b      0x84d5c24c      0xa27ae8c4      0x6bfc3ecd
+       0xb533222b      0xd9c2a3b9      0xa068909a      0xd334506a
+       0x5f8969e9      0xea577574      0x4fd7c372      0x79ebedfb
+       0x519b857e      0xe5a3b57b      0xa9c66d58      0x622d9e75
+       0x184a3f0c      0x8353e40b      0x67dffdeb      0x96f28a6a
+       0x69e3d77f      0x837ad601      0x45adb16c      0x95b7103d
+       0xf8de8e34      0xe5d897b6      0xa19aa999      0xf62b5b2a
+       0xa21205fe      0x96e3d97d      0x2f8763d1      0xc1f5ac4b
+       0xea03ebc7      0xf691c313      0x348842c3      0x5f8107ed
+       0x4b4322c5      0x7356b08a      0x1f22322a      0x60cc8cde
+       0x44d031d0      0x61832e25      0xa4405833      0x87900700
+       0x42a7965b      0xa2b6b169      0xddd0d382      0xbd6b2ad4
+       0x006b62d9      0x8cec67fd      0x8c54cce6      0xa9874881
+       0xa34fec79      0xa8d13e9c      0x918a39ff      0x2027a461
+       0x716dd8ae      0xda06d88d      0x4ec42f28      0xbb89f516
+       0x65a813d1      0x2f36fbb1      0xd16b3d5f      0x36a6a634
+       0xbafc79ac      0xd74feb8a      0x33bce888      0x2e97f521
+       0xbf3b8afa      0xe51b3ec4      0xeffd67ce      0x257f5698
+       0xc5ffbedc      0x922bfc28      0x8138e0be      0xf8f5d9fa
+       0x0d446f83      0xd43c2cf5      0x0835e427      0xd0858e4f
+       0x5d0c3300      0x9ce5e8ad      0x0238443a      0x383fe4e5
+       0x409c65be      0x726f1549      0x3e0fcec0      0x660a684e
+       0xd5959ade      0x3a07917b      0x3fd5346d      0xbe334d1a
+       0x14e90a3b      0x345f134f      0xd737dd52      0x36558ea3
+       0x66532c32      0xffda2d76      0x70c23a69      0x576cce17
+       0x1bc0f11f      0xe7e2594e      0x5531b96c      0xc7115f3e
+       0xc12d5d5c      0x61863f0c      0x953bbbac      0xf4fbc9d4
+       0x26c8f68f      0x9b1ff5d4      0x2f72c468      0x84733422
+       0xb4eaa65f      0x211fd212      0x8c3de90a      0x312ed1e2
+       0xb37aa93c      0x31f32754      0x11c8acb7      0xdc485091
+       0x6e4aa039      0x0cfa7399      0xdc5a7f7c      0x3f71ef24
+       0x30df5838      0x4eef7156      0x97ea7b48      0x7c19ff92
+       0x1bb85768      0x0fba8cf4      0xa4069660      0x7b24c4c1
+       0x9e9bcaa0      0xe8a3ba7c      0x055107ec      0xfd592e53
+       0x11d25c42      0x200bf193      0x342f7daf      0xcdfc8fc7
+       0x6f32bfc8      0xf0079c0c      0x269d86e3      0x23e44431
+       0xe1fbed2f      0x61ca39f0      0x4ac6264c      0x7b998418
+       0xa98ece70      0x25ff9012      0xfcc59f7a      0x4bdbbfe3
+       0x68bd284a      0xd49ba70a      0xe9771aaa      0x183fbdb8
+       0x0cfb07c9      0xbed9ec14      0xdd2fbd24      0x79946087
+       0x716a31a0      0x080e18fd      0x6504a5a1      0x2e4d22b4
+       0xbdad854a      0xdaba04a9      0x6eac5971      0x1eae6100
+       0x9fa5e77c      0x9e48a4ff      0xe26a35c2      0x34a7ceed
+       0x48d0287b      0x9589f189      0x899e75a6      0xfcb6b2e7
+       0x82181300      0xdb567ec3      0x215bd550      0x867ce1cd
+       0x16aaf849      0x4a455636      0xf8dd943c      0x9fb628c2
+       0xe70af387      0x2f3b46c9      0xbcd6bae6      0x1df9e892
+       0xfa3a8acf      0xb8255dec      0xedd76ede      0xe926dc9a
+       0x5bc71a93      0x792b9383      0x34c87266      0x026560b6
+       0xa3e4f7fe      0x33cfc10d      0x84a0847f      0xdd682f5e
+       0x14623fcc      0xd049aa15      0x48afe64b      0x3be26bf5
+       0xedab7c7e      0xb21641ba      0x49953a88      0x6b37a7fe
+       0xa0be5422      0xfb2bd2e4      0xf6565a3d      0xf946617c
+       0x637176da      0xa1d905eb      0x59c02b62      0xb19ce441
+       0xc04fbe15      0x40660e94      0xfdbb3c4a      0xfcbb64e7
+       0x6428a539      0xa6bda0a2      0x10fd064d      0xd565719c
+       0x3144002a      0x36d33d73      0x2f994a1e      0xd42d8bb0
+       0xd5152b0a      0x0a9849a2      0x60326948      0x28440694
+       0xcfa29f9e      0x314dc2be      0xa4620cc2      0xb7e82cfd
+       0x5975c2e8      0x4e5a273b      0xca2ae9e0      0x4e6ce1cb
+       0x25a341ab      0xec5bf801      0x4c85a32b      0xe2ec9a40
+       0x371cd350      0x2d7dfefb      0xf1a7e1aa      0x3af9adff
+       0x66788da1      0xab007648      0x6237e368      0xc20ab56f
+       0xd3886e9b      0xa67a70e6      0x18b59e24      0x2ef31cb2
+       0x1cbbe7cb      0xb94b0b60      0xce7edf06      0x14e55b20
+       0xcf71b03f      0x86b5405b      0x79fee28e      0x5ce147a0
+       0xdea14796      0x833d27e8      0xd8826ce2      0x9434b65f
+       0x36bdc020      0xf0f6c4ec      0xc322ba9c      0xbf0d9370
+       0x9b8a39b9      0x560c0742      0x317f2428      0xac3151e6
+       0x1895a12e      0xc50bd4ee      0x79a5dfd9      0xc6b3d06f
+       0x4221ca51      0xbc96d184      0x7721f26f      0x2a9faebe
+       0x680e9559      0x4761117e      0x08d752d6      0x5117fbcc
+       0xe23bb33b      0xb1d72955      0xc337218b      0x933b12b1
+       0x57f83533      0x9a8bc464      0xba8a4102      0x1767693e
+       0xfad687c2      0xa5b53640      0xf19ccc71      0xf05bf6e8
+       0x47a7cb9b      0x9208a5de      0xe23d5578      0xcac29dfc
+       0x96c58051      0x50463c0c      0x7048f2d4      0x409f78c9
+       0x74da5bf6      0x759aedc7      0x852d1133      0xbc835c09
+       0x3cb0672a      0xd9cec34d      0xfeabe3d8      0x4b1e1c6e
+       0x6c9097ec      0x026b8e9a      0x4f858410      0x79c78cd2
+       0x4381f237      0xcd7010c3      0x886e8f51      0xdaf6ce82
+       0x003307d4      0x3e60dad0      0x4506368e      0x6e01f417
+       0xee9b6003      0x8f36f3b2      0xb17c829f      0xe4fee189
+       0x06b95373      0x530cf764      0xc99046ec      0x05b6c1be
+       0xc9c164a4      0x58502c85      0x3186a69a      0xcac65ed3
+       0x13bdb988      0xbbbfa094      0x5df20633      0xbeacd0a0
+       0xc4b3abb6      0x7cd2ef9a      0x5838646e      0x800db131
+       0x27440dc0      0xca15d49b      0x66ae0afc      0x92cc4e6c
+       0xe347ed4f      0xfd8c0070      0x2537e7a3      0xb96cc468
+       0x4bf4a0ef      0xcd4d5b4b      0x99c5d3fe      0x82c7ac9f
+       0x13118704      0x5ba10fea      0x1d0972c8      0x3e9c0ab9
+       0x28289b9e      0x0cd5bfaf      0x0d6d529b      0x6c38c0a9
+       0x412e7a71      0x8b2670b2      0x9348ee40      0xf2f32dc0
+       0x625f09d3      0x6fd62269      0x0294baa8      0xb0c962bc
+       0x18298a69      0xa27dd181      0xbade6357      0xb5ddb668
+       0x3a3824f9      0x1640cc58      0xf5157f35      0x8112eb28
+       0xe3cc5745      0x1de85839      0xc3c928d7      0x9e2707fd
+       0xbca1f90f      0xccca98e7      0x56b7087d      0xd497fa74
+       0x6a01185a      0xcf937695      0x239a29bc      0x5e932d13
+       0x03598809      0x00a335c4      0x61475568      0xfb446c9e
+       0x54a56804      0x70e9920a      0x9d285d6e      0xab10cb35
+       0xdc81decd      0x062c98e7      0x72e4fa95      0x0a8e9581
+       0x361a5f99      0x26b8d16c      0x41ec0c3f      0xa8258ece
+       0xffdcbfe9      0xe4dc0b7c      0x9a2dba01      0x94ecbb16
+       0xe2c60666      0xd79195c6      0x6942afe4      0xed29d2a6
+       0x453355c3      0x48dd90bf      0x9016f7c9      0x3aa79213
+       0xf5528cd5      0x57e21566      0xbe79c184      0xefaecf61
+       0xa240ce49      0x7d3a701d      0x3345c92c      0x7045dfbd
+       0xf266997e      0xe4725404      0xacf00dc8      0x14fd44a8
+       0x7480fb1f      0x469c63dd      0x630306a9      0xe74ff394
+       0x115f913b      0x6beeff69      0x152ec535      0xe375b9dd
+       0xf86b85e5      0xa642d387      0xd57270d6      0xd5e564b5
+       0x6dcf53c2      0xf8a0cdf6      0xf10fa1b8      0xccdafb95
+       0x18bcc1be      0x9b849014      0xe3108441      0x39c736e6
+       0x07de210f      0x1e78f0cd      0xb25985b1      0x0ff9479d
+       0x582348e6      0xed3af892      0xb80f38f5      0x19df3f10
+       0x9fe7a266      0x54377947      0x87446ecf      0xc17b93b9
+       0x48987f5a      0xd80286ca      0xa53f86a4      0x50e8870d
+       0x5bf9bb0d      0xadfe56d6      0x54f7b96a      0xcbfd68e6
+       0xd31258f3      0x640cbbbb      0x6cdeced7      0xb762b7d0
+       0x3b9cd4d0      0x62ed874a      0x6c18c646      0x35181a11
+       0x2b9385f8      0x2f52ee24      0x69c8bba2      0xca1e2fca
+       0x298f168d      0x229faf64      0x00219f3f      0xf46bf47c
+       0xcd9987b0      0xabc50e23      0x5fe20807      0xc7bffa5b
+       0x5c64e801      0x8e5fdf7c      0xf22c3a58      0x6ebfcaf0
+       0x18c04c76      0xb876d8b6      0x0d185e8c      0x15e87b88
+       0xcc30f6ca      0xfebf9664      0xa26e41a0      0x7e1bff14
+       0xdac4e629      0xf3a9b993      0xea7e92ae      0x32bba216
+       0xf2b0c1b0      0xd649ab34      0xcea057ff      0xf07ab0ad
+       0x6a0cc061      0xf9844196      0x8770cbf5      0x0d0ebcd0
+       0xa137d921      0x01a0ac7a      0x6ce9b55a      0x851b7c81
+       0x9d1a3c60      0x16f70264      0x960700ee      0xcd83b035
+       0xf624d4aa      0x44831510      0x7076f930      0x558502dc
+       0xcc14f4ad      0x49f5f054      0x245eb157      0x5d717aff
+       0xb2945cd3      0x2ef2fab4      0x891b0abb      0xa74f7ecb
+       0x2f60d277      0x4382d068      0xf5621a38      0xb701d8a3
+       0xf02441a3      0x9a3bc4af      0x1fba0377      0x5585c7d8
+       0x77c10914      0x4641014e      0x125b270f      0x3e1f1d95
+       0xc5b5fa9e      0x608ef6e0      0x5287c20e      0xe5bc7622
+       0x36d5a0fe      0x26cbe98d      0x96908dd1      0x0fec2e3a
+       0x5eafa4a9      0xcdbc5730      0xdc874327      0xc4583395
+       0xca8be21a      0xf42dd3f8      0x113aa82e      0x19bf7cfd
+       0xb819ccdc      0xc8b0fd95      0x25a0b336      0xdfe23781
+       0x2061f003      0x6c897f34      0x0f10770d      0x2e7c5862
+       0x2b9b1b60      0x4a770d78      0xd7065b77      0xe5fe912d
+       0x22e6eeb6      0xdc8bc5ff      0xb6d8737a      0x4b3e0d31
+       0x9dcdfc18      0x6bd995e3      0x7d05cc1f      0xc5bf3600
+       0x49b7cfe4      0x84c8bb06      0x0622cc72      0x0107b8ef
+       0x91eb2766      0xa9bbe486      0x7076236a      0x2328014d
+       0x852261bd      0x568a0a88      0x08b3bf20      0x691b28c8
+       0x1b1ce35f      0x27bd4371      0xfb71d136      0x130006e0
+       0xbf191bd0      0xe4ef4523      0x88835271      0xb464f510
+       0x5508d73c      0xe8d62464      0x1aea93b1      0xa9d26d06
+       0x5026aba0      0x5aace509      0x6d9f3bb2      0x205742f1
+       0x4d0dcd05      0x45e0586d      0x6977274e      0x7478121f
+       0x52d3281f      0x2678cd9c      0x19aaf2f2      0x7a6ca61b
+       0x6ddd75bd      0xa4dd4b06      0x4db83b73      0x0f732c5a
+       0x85a24c37      0xb87fc623      0x58da4ed8      0x77a67f89
+       0xbf8b8cf4      0xdec76d60      0xa14e2e48      0x5e153c52
+       0x879c421a      0xa76e650e      0x04881140      0x7a0bf61b
+       0x38eb1c6c      0x53599688      0x7eee839a      0xd6bf2fcc
+       0x5b83c794      0xd191589a      0x76f4a38e      0x223c94e6
+       0xd6e7080e      0x9254461a      0xbd2a7952      0x7bc4b6c1
+       0xfddf9eeb      0x074aef50      0x32f61578      0xe7c3f32e
+       0x77bd22cc      0x3b72e014      0xf2b7b877      0xe9987b96
+       0x79333a9d      0xaf9faa27      0xcde582e0      0x58ee0d11
+       0x5bd8bd59      0x99853e4a      0x16158bc0      0xd7813aa7
+       0xc16daba6      0xf017ab49      0xed1ddd5f      0x89aef3a4
+       0x83c7ffdf      0x6c29d7f7      0x1eb83c2e      0xe030cf03
+       0xf3a1810c      0x363ae113      0x43a6b42b      0x4e5ac2d4
+       0x2a77c299      0x6c8bc618      0xedb0232b      0xdb3b2844
+       0x2bc1a846      0x4a23f40c      0x684854ba      0x01d47692
+       0x83aee0e5      0x28fa7c7b      0x851c2cce      0x7076ca67
+       0x995d2fe2      0xc6c5e8fc      0xdca37ee2      0xfde28cb7
+       0xa84895a7      0xe6a8e4cf      0x90b19069      0xa0003041
+       0x0d9b07a2      0x56c92d5b      0xde206c05      0xa3a18ec0
+       0x8b009bd2      0x24582152      0x3aa878da      0x85dcb3d3
+       0x77f97c4f      0xdf418d92      0x4607940e      0x253b04de
+       0x2ea6ee88      0xa8da5a41      0x170cce34      0x29d20fcf
+       0x8cb7151b      0x0b647896      0xe724f612      0xa37c3d7a
+       0x27be5ba2      0xc667d65e      0x80c0fc8c      0xb6231066
+       0xe85fe1bc      0xdc8209ad      0x87605f6b      0x8e237dd3
+       0x86c98159      0x991b9623      0x4e3f3beb      0x8929cdad
+       0x6ea581e4      0xc5b8abe0      0x3f844e1d      0x143bd24a
+       0x258b4f70      0xa407e2f9      0xac35a1e7      0xab93f86e
+       0x3a6f7b70      0x9edda2e3      0xf021cbe9      0x853b9110
+       0x8a61bacb      0x39b937d0      0x17b55c70      0x02dcae26
+       0x3fc81c76      0xcaa89990      0x0d187f2f      0x5f15dab7
+       0x6c5aa228      0xc584fe52      0x2d132795      0xe36d8b39
+       0x51fa6bf9      0x1f635d0d      0xe0e58f26      0x3cbed7d5
+       0x7d5a1214      0x84d7636e      0x3d09e00e      0x51f263ce
+       0x1dc8bbb3      0xdad73812      0xf8018762      0x0eb149e2
+       0x0a37a27f      0x649f893c      0xf81b17bb      0xbdfe07de
+       0x3f186d13      0x944c3b9d      0x6089cd72      0x538064c2
+       0x7d7b1940      0x857acbd8      0x441ae33e      0x612fad10
+       0xf675c90c      0x4a2b9aaa      0x4bdc9d55      0xda87fc33
+       0x3f530c81      0x8a0bfd0e      0xce301979      0x5fb8df8b
+       0xf4f89658      0xf4ec3f3a      0xdcdb37dd      0x4ff70e33
+       0xd001840a      0xa6c315dc      0x54415bbf      0x12c26520
+       0x5fa5336f      0x5127274f      0x495d8b4d      0x95e0b696
+       0x4e534571      0x259d92c9      0x04293543      0x7814a548
+       0x4226c6a6      0x931c2472      0x5e03faab      0xdc77f1f9
+       0xdf4e5b23      0xeb990f87      0xf2aee5f3      0x22ad49b7
+       0x2eeacb2f      0x57635891      0x78bb20c4      0x71f950b2
+       0x8b0d95cf      0x100241d7      0x19200510      0x57a07524
+       0xc78fa596      0xae0952e6      0xceda63f6      0xa5957392
+       0x72b6dbda      0x4c407c71      0x7bcb53ac      0xbf5536f4
+       0xdd13d99f      0xdf096e1b      0x2a03e85c      0x145f4170
+       0x7a826278      0xde53c72c      0x74ea07cf      0x0c1e956f
+       0x98bbcd66      0x93d86c6d      0x6d2d4a51      0x09c96e1d
+       0x88d7fae6      0x6e2cede2      0xc726e74f      0x964aa40b
+       0xb8ef0785      0xd9bf9c5a      0xb8e9f8d2      0xa984653b
+       0x9f33e37f      0x6031ca0c      0x479ffd41      0x31456b43
+       0xc45c89c1      0x13dd9cab      0x653c4600      0x428daa03
+       0x4b80961c      0x049c0b39      0x96f7f8dd      0x87c18aec
+       0x95724423      0x5fea9835      0xb11f3437      0x6b9a69ed
+       0xb9f0a440      0x1ae9f2e7      0x1d387b33      0x56cfc0a9
+       0xd44983b6      0x4effaa80      0x0ec7ad1b      0x655fbffb
+       0x06f6b8ca      0xcae05603      0x922bd43a      0xf4abd220
+       0xfb9b6374      0x45d377a0      0xed58cabe      0x772cc460
+       0x7ff5d59b      0x0ab67b08      0x1fc231b1      0xb04a0441
+       0x4ea6735e      0x83ea71c2      0x91773202      0xe90c33c3
+       0xa235b2af      0xa7d8afa4      0x18d523e2      0xa48b6acf
+       0x56f62366      0xade89732      0xd5aa0f21      0x4b78914f
+       0xb774fbc8      0x47e8458a      0xbc8c5b27      0xe79f809d
+       0x37339143      0xfc5c2925      0x0a66dfc6      0x421a0c01
+       0xc0a3b3aa      0x17b0dc02      0xb6b9302a      0x05d5544a
+       0x50a3ca33      0xdbb31a0a      0x216c21dd      0x3e1eeeb9
+       0xe031627a      0x17f60b7a      0x417e5944      0x79878636
+       0x1566e37a      0x3c8aeb1d      0xcce8bfaf      0x85c1e11c
+       0x2ded8d3e      0xb9f69ba8      0xd7b2509e      0xe320a03a
+       0xa8da1ae2      0x0ce8a42e      0xf35334c3      0x0b16d14a
+       0x0ec31ece      0x21d6fc90      0x357c6d53      0x0660c479
+       0xd71b35d9      0x70b3dfc6      0xa04757cf      0xe7c480cf
+       0xb5cefffb      0x815596aa      0xa4fe1233      0xd40b51f9
+       0xcd65c934      0x9e410744      0x50943901      0xb9f64d34
+       0x765892c4      0xc37dcf44      0x4ca52be5      0x4150fc1a
+       0x6be637e4      0x09593fa3      0xf3c41aff      0xa2c5ab39
+       0xb34d6c8b      0x4f5959cd      0x192f572d      0x465e28d7
+       0xec9db016      0x4daf6f1c      0x8249efd4      0x54527d96
+       0xf053854b      0xaea0ff5a      0x4811f2eb      0xb0cb3314
+       0x015d9850      0x33f43296      0x9faa4a12      0x3c385258
+       0xe11c11c3      0x1efd827d      0xe41ad89d      0x3bd99c18
+       0xefb133e0      0x97727400      0x85c3e601      0x4ff46200
+       0xa224b0da      0x640a9f69      0xefb53b38      0x78cc66ba
+       0x24cf59a2      0xec0bea08      0x7e926b0e      0x2d921e46
+       0xd8e2e2ca      0x4cd53cdf      0xb82d08ae      0xe78c1e4d
+       0xca6734a5      0xe2e63cab      0xc5ba68fd      0xfa6cb0e5
+       0xeec04de5      0x459c0ddf      0x4ec808d6      0xe039961b
+       0x03696e0b      0x92c8caf5      0xa7e86d70      0x1f742b06
+       0x1d5cbd78      0x92d5578e      0x2e51bdd0      0x23346eb0
+       0xf05d39a6      0xc8fa8535      0x0384770a      0xce33dbcf
+       0xb9044bd7      0x9afdb602      0x4f22c8bf      0x4fd59c18
+       0xb04d1c2b      0x38b74c43      0x77a23a0c      0x579b9580
+       0x4890fb00      0x58a2e345      0x22420ca1      0x82aef8f1
+       0x4218f112      0xa0156339      0x44b5af22      0x96dafcb7
+       0xfed244ce      0x0ec0d7a8      0xa52e86f9      0x694248ed
+       0xd25870fe      0x34f93daa      0xe178d84a      0x70897ace
+       0xdfec9960      0x061729b4      0x1941e2d4      0xe88eded6
+       0x5657b452      0x5c98b677      0xf4f17162      0x996c3f42
+       0x61e22ac5      0xbcc504c2      0x841ab74d      0x35630385
+       0x0e5c2389      0xa77897fc      0xadd38e6f      0x03671090
+       0x2a94d2cc      0xa866a8a8      0x381068a4      0x0d8f769c
+       0x031cd3f4      0x43efbb62      0x65d26933      0x07c4c862
+       0x08bfe63f      0x63cf80fb      0x2bc411ea      0x1e53cdbc
+       0xccd46f61      0x7ae6f760      0x0a3794f2      0x7b8366b2
+       0x8781320d      0x4d49b28a      0xfe700e14      0xac5c041a
+       0x8a428c72      0xbeba1ba8      0x104ca0c9      0x2ecdd70c
+       0x99f94dd2      0x8c9e8050      0x2cdc1187      0x8697667a
+       0x39963209      0xbd6a1e9d      0xeb57f0d9      0x9c876cd1
+       0xde6cc752      0xc5d81dd8      0xcb04f322      0x3675e023
+       0x69f0ccaf      0xdc1c7299      0x66f6cc58      0x4af279a3
+       0x2405daef      0x3cdc114a      0xf11c038b      0xed163d84
+       0x8f915a3b      0x7a03313f      0x9abedf01      0xb828e02f
+       0x05d2d07e      0x36799491      0x1fbb66ec      0x215f0d93
+       0xa195c1f4      0xfd3cf434      0x4dd36fbf      0xfcbaeef5
+       0x5fa49ada      0xcfef09b7      0x9ca1f00f      0x1094bca9
+       0x2890356c      0x5535696f      0x3f786826      0xdfd166a6
+       0x7cc2a7bb      0xeb9775f7      0xf1f1d015      0x6cb43330
+       0x44f5103e      0x19cc238a      0xd802a783      0xa86d23b2
+       0xfc6d5595      0x406b04f8      0x1f87e63d      0x7def0a8c
+       0x66df4024      0x91291bd7      0xe7c9f664      0x3053efa6
+       0x13ae9ef3      0x1ca9934c      0x635e98b0      0xd7c0e7e8
+       0x951c1f5a      0x6a1f8310      0xe2e136b4      0x4fda9bf9
+       0x3748e217      0x201a3128      0xa77450a7      0x68a164db
+       0xbecaaa8b      0x39acdb6c      0xd72a8e99      0x358091fb
+       0xcbd44198      0xf8abf8d2      0x460d979f      0x09779fed
+       0xb066acb4      0xdd3b0b54      0xba6b34d1      0x9cd07e73
+       0xded39eaf      0x4a86f91e      0xa1576746      0xef5535c6
+       0x0d68d90d      0x9063b417      0x63764a13      0xe46589e8
+       0x4c464469      0x01da5cd7      0xda3d955f      0xa9cb6bda
+       0x74c5905a      0x022a3068      0x99785d4d      0x4aa81734
+       0x65f0e347      0x38cae44a      0x41445dd6      0xa8d298e6
+       0xe135a8c6      0x9e36cc39      0x450fd746      0xb4c9282e
+       0x5f902e54      0x52047a0a      0x054dcd41      0xa7f54f76
+       0x7e064c5d      0x1840b8dc      0xa42b3fc2      0x89959221
+       0x3670527e      0x0033bf58      0x6d01b3e7      0x153a4523
+       0xfdbede48      0xeb37591e      0xe9dcd198      0xe19b32b3
+       0x0ce76cc6      0x07fd8a8b      0x7861aea7      0x0e6ef7cc
+       0x295dcc81      0xeed43565      0x85e6b1b4      0x1c36176e
+       0x4de5e5ea      0xad417cd3      0xa0b502d7      0x4f4f26ad
+       0x55f0a11a      0x70414fff      0x578f513f      0x1a0036d4
+       0x65cb54d0      0xdbe91469      0xb613a236      0x73c05182
+       0x8da00dae      0xbc1c8526      0xff0ad02c      0x9289e4ef
+       0x245d0636      0x162603db      0x0e5a40fa      0x0cfeefd3
+       0xc355fae2      0xf2866c99      0xc65dfc8f      0xb7ab492f
+       0xf811fcf6      0xceaef429      0x4ecdb0e5      0x54bf4e1c
+       0x02c83d94      0x174cf22e      0x3c304b8d      0x9ad51572
+       0x444ab420      0x7c41fcb7      0x70193210      0xdc59b8da
+       0x9042a368      0x2c73167e      0x47dfb476      0xc07c86a0
+       0x0341e3aa      0x8ee97f19      0x65a47f28      0xe9221e76
+       0xac7ce5b2      0x5dc2293a      0x575436c1      0xb897b186
+       0xb6722e1b      0x0cede865      0x641884f8      0x87784739
+       0xb2cdbe39      0xf53210b5      0x819b5b5e      0x7e993c71
+       0x088c20d9      0x1ff3c97a      0xe348600f      0xb9434df3
+       0x4e2404ee      0x72ab1fb6      0x80922cc4      0x1239aa8b
+       0x180c6d70      0x47f0e6c8      0x04c35fa4      0x861eee82
+       0x4a5b0130      0xd29740e4      0x1200e288      0xd8aa1b4a
+       0x45cf055b      0xf0970e66      0x7e82c921      0x038a1be7
+       0x0f12a078      0x89ad1d6a      0x1c97ef2b      0xd3a3abb8
+       0xd6026f4e      0x2b9e13d4      0x5d5611d7      0xb35b1222
+       0x6a0715d6      0xe93cceea      0xbdc957a3      0x998dad9d
+       0xecfec721      0x09f02421      0x4c971582      0xe4fc588d
+       0x3a8f1c64      0xaeb5a6de      0x94bdd5e3      0xca0c1072
+       0x352fd723      0x6257b138      0xfee44d09      0x9a3d6c87
+       0x1031ae4d      0x6f2ebcac      0x97611fc4      0x37799303
+       0x9566d4f0      0xf6a69a64      0xd089ecc2      0x06c7a3b0
+       >;
diff --git a/arch/x86/dts/microcode/m01406c3363.dtsi b/arch/x86/dts/microcode/m01406c3363.dtsi
new file mode 100644 (file)
index 0000000..a90f21c
--- /dev/null
@@ -0,0 +1,4308 @@
+/*
+ * ---
+ * This is a device tree fragment. Use #include to add these properties to a
+ * node.
+ *
+ * Date:
+ */
+
+compatible = "intel,microcode";
+intel,header-version = <1>;
+intel,update-revision = <0x363>;
+intel,date-code = <0x12182015>;
+intel,processor-signature = <0x406c3>;
+intel,checksum = <0x3ecdece5>;
+intel,loader-revision = <1>;
+intel,processor-flags = <0x1>;
+
+/* The first 48-bytes are the public header which repeats the above data */
+data = <
+       0x01000000      0x63030000      0x15201812      0xc3060400
+       0xe5eccd3e      0x01000000      0x01000000      0xd00b0100
+       0x000c0100      0x00000000      0x00000000      0x00000000
+       0x00000000      0xa1000000      0x01000200      0x63030000
+       0x00000000      0x00000000      0x18121520      0xf1420000
+       0x01000000      0xc3060400      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x6abbab24      0x789752cb      0x83003819      0x616df082
+       0xf0952c2c      0x7fbf7fbe      0xe1ca9540      0x47bb7ec7
+       0xef44e4c3      0xf91d4958      0x230883b7      0x7382ab6e
+       0xf14324ef      0xf94c28d7      0x9131d196      0xebcf2faa
+       0xc049cb37      0xd1577abd      0x5edbe45a      0x17e1ca1e
+       0xbe9a92c3      0x1c8e1790      0xb3c08b8a      0xca799851
+       0x3f2a8c92      0x1b7e15d8      0x1f44ecb2      0xaeda1838
+       0x0ace8669      0xae9d497e      0x424c680c      0x21b3a3ed
+       0xd924acfe      0xddc126a2      0x26363596      0x21cd999b
+       0x193f9df3      0x037d1953      0xf97a3dc5      0x4c94ad7e
+       0x98b360f0      0xeb90461f      0x438e6d2e      0x30851a0e
+       0xfd623681      0x18782d3c      0x702938c5      0x462df0dd
+       0xf7d67cc1      0x161076a0      0xf06e5db3      0xd861a76b
+       0xa40b06bc      0xed37c69b      0x2b25f98b      0x2b67887d
+       0xbf0131b5      0x571b7c25      0x34eb3752      0x992e406e
+       0x031ba8e7      0xccfc5b1d      0x33f487e9      0xeccc3098
+       0xe452737b      0xb38cc286      0x817bc58f      0x852a7fde
+       0xcbcd1b19      0xab11894a      0xa1f278d7      0x360829c9
+       0x11000000      0x34af9103      0xd674d0ce      0xa551e6a8
+       0xa4ecdc9d      0x1cc02761      0x9c6e5450      0xa160c598
+       0x52f99daf      0xec0347b8      0x3da61ab4      0xf567197c
+       0xfd8bb83f      0xcc995bef      0x54d178b6      0x1671de11
+       0xac092895      0x9debbed1      0x6c92142c      0x6323623d
+       0x0eb91ca9      0x5c295220      0xfbaa9c0e      0x589cb9fc
+       0xec23fbf8      0xa4a586a7      0x199f007f      0xdf3216db
+       0xc0d57da5      0x5f4725e3      0x5726d9c9      0x17667c8d
+       0xc1c79708      0x9e2256eb      0xfdd0d08f      0x60c7bed3
+       0x5845511d      0xd7082ef8      0x3baa9a81      0x79e5bbdb
+       0x5fa1d140      0x1a9dd574      0x65ab8603      0x3d09b760
+       0x5d5370dd      0x20cbfc54      0x6bb53528      0xd0d59569
+       0x3072c8e0      0x8d041e8a      0x393ff37c      0xa924e167
+       0xdc321c2e      0x758ef7f9      0x75d45a77      0xa162493e
+       0x541efc10      0x10adfa66      0x1ec98113      0x2adbfc4e
+       0x6f72ee57      0xb6135602      0x6bb1aaa5      0x8b28671d
+       0x52cd7438      0xe23e5714      0x541d71b8      0x1edeaecd
+       0x66099798      0x273aafe2      0x94c4bcfa      0xd2a91918
+       0xbfb900b7      0x7bffd9a6      0x98f3cc81      0x25418789
+       0xe4827c24      0xf91a6587      0xa8f37dce      0xed2bb02a
+       0x55e3d863      0xf75d0279      0x2d08e3a9      0x04447fc8
+       0x5b8a7d2d      0x7feac814      0x49f424a3      0xf3875991
+       0x7ba76639      0x15c5c756      0x351ce3b5      0x3f6c510c
+       0x99f05511      0xbf82e8cc      0x3a08ff2e      0x27ce0320
+       0x156823c8      0xea93277e      0xd4f644ee      0xed19db7c
+       0x883aa3cc      0x477659d8      0x328f8021      0x5f5027be
+       0xdc5dc6b0      0x7be0a222      0x3eeac5c3      0xd550feb0
+       0xe536e7f1      0x286636de      0x853b327c      0x89c0fb10
+       0xf3ca1f99      0xdfac434b      0x77629984      0xbf9089ab
+       0x4c485305      0xeeb11fc0      0x287f76db      0x30930095
+       0x6903c661      0x2b8cdcc7      0xdde71952      0xe608b18c
+       0x92c949a1      0x8aad2b8f      0x65862768      0x9cee8ac0
+       0x823d78c3      0x847136fe      0xd9310ed3      0xb8b42493
+       0x29ace469      0x42888461      0xded8e619      0xdf05ba83
+       0xbdff529b      0x200b50aa      0xa68969a3      0x852839f8
+       0xe990c70b      0x4646940c      0x97d3cc15      0xfbc684fd
+       0x670dc5bb      0x9221de80      0x4c8e6b5f      0x0d8e97a0
+       0xad70fce0      0xeae31c56      0x285bf809      0xe8875db3
+       0x90b80642      0xd3823067      0xcc83a749      0xf9ca429a
+       0x67422236      0x1391a167      0x0bf82b36      0xc9765751
+       0xe716e34a      0xe0a8a4f3      0x98c3a88c      0xc6e2f8a4
+       0x7fac67f1      0x1dc95999      0x506bbfcd      0xca368479
+       0xb40279c4      0x55bcf309      0xa33edb78      0x82136a30
+       0x5b12a8f7      0x760c01d3      0x5db7a4db      0x74f5bbf7
+       0x88d8cf63      0xbc44938d      0x3b8aa64c      0xa619841b
+       0x938ef7b6      0x4e62db80      0xec29b936      0x12c88360
+       0xd13fd368      0x049fedc3      0x980d670c      0x751d7334
+       0xe275082c      0xa856923e      0xcf718388      0x91c05a55
+       0x1feea2d0      0x973e9ef4      0xfdb50bdb      0xc9f0d356
+       0x1fb535f4      0xac8935e1      0x54ca8daa      0x5236b3f6
+       0x96077418      0x7cd145ee      0x4c3eac4c      0x96708111
+       0x2d0d2818      0xdf8d4d8c      0x1e0dc74d      0x55563148
+       0x8ded787c      0x8b23817c      0x2791cb6b      0xfe592eeb
+       0xc291504a      0x594803f6      0x5cb40c93      0x0fb42830
+       0xdc805110      0xa04177c6      0x5b196cff      0xa8389595
+       0xc22006a4      0x48f63bed      0x956fe2ab      0x8326bac5
+       0xf607d430      0x4db75e7c      0x5abe98f3      0x1ce11559
+       0x9a6bf85a      0x38332b5f      0xd5d89037      0xc68921c6
+       0xa0076717      0x7a8825e0      0xeca2298b      0x78202f5f
+       0xe9fb2a84      0x0a190fbb      0xacd7c21a      0x7c1b5df8
+       0x8bec1b4c      0x269507e6      0x8890150a      0xaba688e7
+       0x3bfe89e6      0xa2b9f1c1      0xe073b921      0x8886f1ec
+       0x8e70e13e      0x32a1a95e      0xaf7eb731      0x76ef3515
+       0x4e90039d      0x8e469581      0x076c7437      0x136549ac
+       0x357e3610      0x63a28516      0x19d505b8      0x43c971a6
+       0x0472035b      0x756164f2      0xbe6062a4      0xa1c37b2d
+       0xb07d2cf8      0x8476f6b6      0xc715da8d      0xb2afed44
+       0x249f6d7c      0xb5d69bab      0xcebfac4a      0x79dbe92b
+       0x27885a7a      0x36e23920      0x22974454      0xdb75e82a
+       0x9ed157a9      0x66b7f446      0x8dd61b49      0x1ec542a6
+       0x2f1602c7      0xfef7c1f0      0xf0e03fd1      0x7c5d27ba
+       0x1aab9e49      0x320c70a0      0x8428e51f      0x6518c994
+       0x4b1dd367      0x43e7759e      0x2e3a273b      0x02e96af6
+       0x7d7fd596      0x76fb392f      0x01e0575a      0x34c3c159
+       0x58ad09c1      0xff429aa9      0x542c728e      0x960c1be4
+       0xd993a44d      0xbe66f3b0      0x097dffa0      0x63ffa221
+       0x4e9d0eeb      0x059ac1e7      0xc8a98f69      0xba154f66
+       0x4c32444b      0x16c6b875      0x90ece67b      0xac649e61
+       0x9e8f0cf7      0x428e6df3      0xc9ceb8ef      0xa66bab0f
+       0xd499148e      0xbc453d7b      0x10064f2b      0x839a2b6d
+       0x8cf150bf      0xef4ff034      0x5f760dad      0x3ca17566
+       0xc469b66b      0x59389505      0xe731e5ef      0x436cf37c
+       0x07430a9d      0x4ec457cc      0xbb9b3569      0x39e66440
+       0x51508550      0x14e9282f      0x9019d229      0x4f1f91a8
+       0x52ed0975      0xb0f8c69e      0xc95dd930      0x58613f85
+       0xef94c1bb      0x4763c396      0x0271e452      0x199cf8f5
+       0xb5459017      0xd30a46f7      0x4a882adb      0xd81c67fe
+       0x560d3066      0x1c54e221      0xcff36db6      0x10ba2ad6
+       0x2a2f3b5c      0xb49815be      0x23d8e3a1      0x199ace76
+       0x14cabe0d      0xdcdb74ec      0x7ba0ee4e      0xcd8ade16
+       0x6fff6e9b      0xe7ebf779      0x3cd0d4bd      0x1d5988ba
+       0x41a869e6      0x938f3f7c      0x1c32d1cb      0x32cd7d32
+       0xd5f6c5b5      0x18f6ce02      0x355e6a02      0x1ce3fe19
+       0xef2db61e      0x53569367      0x2143daf2      0x9ff48c31
+       0xa8f2ae31      0xb942b0c5      0x5322e9fd      0x5c86f025
+       0x4564eb04      0xbf84637f      0x72649b68      0xbcfa9479
+       0x92160cd7      0x6a82f2ed      0x56e95854      0x8de8854e
+       0x3a6f9ae7      0xc600810a      0x3b916a72      0xc7757b0b
+       0x5c509f76      0x671a3e65      0x557be597      0xbfa43c40
+       0x75ad1bd1      0xef6e4e5e      0xc925131b      0x0b23f0df
+       0x8872d439      0xe7c68436      0x66948273      0x52c5820e
+       0x8bcdd308      0x5961f832      0x8b9e05b3      0x1877dc15
+       0x677c923f      0x9275f82c      0xb63ab226      0x2ebed52f
+       0x709be956      0x029efa11      0x181b9d17      0x85b196bd
+       0xd0ef2b24      0xdb40ed0f      0x64cd9131      0x6d4591ce
+       0x39b07cad      0x5d93a4fa      0xc72ab75f      0x411c103c
+       0x0e543f47      0x82326a56      0x97e74672      0x8ff175c5
+       0xa4af4aa4      0x7d486409      0x3c4f0022      0x8c340a17
+       0xbb78a4de      0xcd8347d6      0x3b413b09      0xc5ea0d4f
+       0xc04924fe      0x775b3449      0x5177508d      0x7837f058
+       0xad7585b2      0x04de4c25      0x62045a0d      0x795cdf60
+       0x20895612      0x927248ac      0xdec3682b      0x5f624760
+       0xd1eb3249      0x3c258434      0x5471ce68      0x63dfc40a
+       0x972e356c      0x248921e6      0x2c6c68d3      0xc7934632
+       0x21b3e041      0xe261b970      0x872c8f48      0xbc83ee9b
+       0x7fc5365e      0xbf811695      0x7421fbf8      0x351251fe
+       0x2fa69f93      0x1b0e076e      0x844620b6      0x34ae0b82
+       0xb4397ce5      0xc8c334c2      0x3b83e4a3      0x9400ac98
+       0x77ef3b8d      0x9e99a943      0xc9dea3e9      0xc79bcc15
+       0x97adb857      0xcf3628a5      0x5fb9dcd8      0x1fb48b0d
+       0x912814a2      0xd90cc6c5      0x8d41c708      0x31f3f996
+       0xd3cdc511      0x3548427b      0xb61e440d      0xa37184ed
+       0x4046b193      0xd4fa3e6c      0x49be92e7      0xffc4d769
+       0x2a612567      0xc0e47c24      0xb4cd56dc      0x642e0d3c
+       0x28f29fcc      0xade72ab6      0xb2b4e692      0x45f1d977
+       0xf6cb5893      0xd5de01db      0x8e12fe1d      0xda7387d8
+       0xe7ffe1a8      0x0b2dcacf      0x303d217e      0x755c391e
+       0x182f0fad      0x5c3b4c52      0x005ea5af      0xce544cd8
+       0x85a42ec0      0x5d7efb0d      0xb902ae0e      0x25dc0faf
+       0x31f94bdd      0x4a3ea693      0xa3715564      0x356f9547
+       0x10f6c847      0x306c053b      0x12a2b255      0xd12abc31
+       0x692c4e07      0x26e8fe46      0x893e5fb7      0xd592abdb
+       0x48135ecc      0x1c433483      0x83e52581      0xa984e767
+       0xa65b1461      0x0d32513c      0x0932221d      0x0fcfb020
+       0x20bbdc83      0x2fbad27c      0x9eb4a08b      0x947301a3
+       0x7776ddac      0x04e8ac11      0x40e42a9d      0xaf74d77d
+       0xc9e1e938      0x7af6c1d4      0xc8dc1650      0x24ad902f
+       0xe009278f      0x905d5de6      0x638d3a74      0x937d4685
+       0xaf0e95d4      0xcf1d2012      0xf9c608a0      0x6fce7bb9
+       0x8b421310      0x23efaa4c      0xa52bdf67      0x1898d46c
+       0x8f3834de      0xba7c2fb4      0xfe84eabd      0x0e66e78e
+       0x1c636cef      0x8c9c5d30      0x665e1ae3      0x5eb5888f
+       0xa832e9a9      0x8e9c37e9      0xcfb38ace      0x93ee97fb
+       0x1c191d98      0x276c4d6e      0xd18ab928      0xf86a8dd9
+       0xf975c062      0x8cc952c0      0x69c5f436      0xcd50d9d6
+       0x916dd94e      0xfe6645cf      0xb7dacd07      0xb1bbc45d
+       0x564b887d      0x587b5323      0xc0706aa2      0x14a7dcfa
+       0xad918e14      0x27edb562      0x71467cc6      0x544931c6
+       0xa003a9d3      0x9d5bc429      0x891c3a2e      0xa838c8ca
+       0xf2e664da      0xd6e6fccf      0xa4a65c77      0x845eaac8
+       0x5f15eac0      0xa0c6f671      0x6a506930      0xcc44355e
+       0xe379041c      0xee2434b6      0xcd186246      0xf7ca9b32
+       0x6150775c      0x6b8b53dc      0xc1c929fa      0x73747210
+       0xa96bbd50      0x5e3fbb16      0xb10042d8      0xe0214515
+       0x572302b6      0xd501abb8      0x39250387      0x95dee388
+       0x50c64c16      0x799e94bc      0x323bde9e      0x0148ecc4
+       0x8fa3aca3      0xbbab92ef      0xeaaa2864      0x59fc47d6
+       0xe9973a97      0xeff10530      0x2ee64dca      0x26549b06
+       0x0c8c2e08      0xae8e5415      0x3c40bbf0      0x89c50b81
+       0xb4fcfba9      0xb9c4c555      0xf2968416      0x7091257b
+       0xc70896ef      0xb3086b29      0x5b224365      0x516c78cc
+       0xc36c7b04      0xeae540ec      0x7b50490b      0x1c0681ba
+       0xdbdb6bc1      0x1892d735      0xc55d1f7d      0x43a13e09
+       0x64fb4fc7      0x63d9f7be      0xd94a1264      0x7c29c0c2
+       0xbc80d0e5      0xcc0f8ba9      0xd9ffcbe2      0xe6cbbfd7
+       0xa393ea13      0x9c1d2cb8      0xf6b30c8d      0x774ab520
+       0x902f1f82      0x591e8fcb      0x54a49a0f      0xea92775f
+       0x32db070d      0x46871147      0x71db3643      0x46ec5752
+       0x60b676d7      0x000e6315      0xda2f8ed1      0xa02774f8
+       0x5b10b0c9      0x745201fa      0x64cdb756      0xdbac8197
+       0x8ccda850      0x03376e2a      0x30b1bd37      0x40879940
+       0x0a94a9fd      0x45f5a94d      0xd291c228      0x63e8dce6
+       0xc0e92d5d      0x94f4af95      0xa6493cb2      0xaf6796d1
+       0x1b92305d      0x90cb1f96      0x52b6a25d      0x60adaaa6
+       0xc39b1758      0x90365599      0x1fd8ba91      0x9d8142d3
+       0x35de6e66      0x8c3c97c2      0xe080a68a      0x0c1212a4
+       0x432e0909      0x4617fbc2      0x8c64a51c      0x83cadb95
+       0x61e751bc      0x5a1f6e50      0xc18bf429      0x44796e3c
+       0x9196cb25      0xaa458f0d      0x17a892e2      0x0fa38b9a
+       0x27d433ad      0xbf81824c      0xc554ecde      0x3e0e0ec5
+       0x3d0507fa      0x8e01868b      0xe9890628      0x95462999
+       0x78d3c488      0x7c11e37e      0x744f486e      0x382b91a4
+       0x92b5aaa4      0xe5ced181      0x538c6405      0xef665333
+       0x0f2c9006      0x817b1d64      0x8ed18582      0x4762ebed
+       0x793e8754      0x7ffc1370      0x83e97a2f      0x0097efbb
+       0x3af550b8      0xe8b5d326      0x1328badc      0x1b876137
+       0x87d0a5f9      0xa886af93      0x84d82661      0xd59c25a7
+       0x9436457a      0x33657675      0xc2e84838      0xb69dfb0f
+       0x7cd5f62b      0x4aefc230      0x55dfae89      0x09303273
+       0x99df1289      0x91a8a253      0x308c3493      0x82ffc531
+       0xbe46de4a      0x95018289      0xb3f1484a      0xfab68007
+       0xda22a10f      0x52dc5477      0xc6c0cd11      0xd7432402
+       0x66b3b9b9      0x2d9e453c      0x61b9f88f      0x7c0eb965
+       0xcfea53f6      0x2128bef3      0xc70cd033      0x0b64e589
+       0x83b6c8fe      0x90f7f205      0x746ad9a9      0x60dc76f9
+       0x8853da22      0x77af258d      0x392bbcc6      0x4bbcee30
+       0x5109f557      0x6a54ad0e      0x8f88d2a7      0x26b23261
+       0xaacf9560      0x8fee9392      0x2305214d      0x700c4bc7
+       0x5e6fa646      0x81c09c02      0x124edc15      0x0952d2c5
+       0xac95aaa1      0xc942e831      0x59def5cd      0xf973bca3
+       0x8804722d      0x35b6502c      0xee05d2d2      0x47df0499
+       0xe9bb746e      0x3fa99f04      0x9b727ba2      0xeca8c402
+       0xe17495bb      0xbacf5681      0x37b9aac6      0x210490db
+       0x733b0296      0x946bb6c4      0x7dbf7cba      0x0faed4ab
+       0xfdf0bdfd      0x376c755a      0x7b81d000      0x4dbd9803
+       0xe86dec4f      0x69144ec7      0xb8fb18ef      0xc23f8e5d
+       0xf4dcb6a3      0x32e22545      0x2404ad5b      0x6682c8e0
+       0x65a6ca16      0x2ca8667a      0x1b54a478      0x7cc57603
+       0xe3f94a87      0xc96d24c4      0x3aeaaa11      0x23ba93fe
+       0x25855840      0x32ac7211      0xec0eed00      0x1d53723f
+       0xb27942fe      0x8ec00760      0x97116503      0x68b22ca5
+       0x36752cd5      0x61abc066      0x8fff56de      0x287f4a5a
+       0x19f88345      0x712a09d3      0xec3be550      0xd08bd04d
+       0x45e1d15a      0xde83aecf      0x0331b023      0x91b0075a
+       0x70d39c38      0xbcf8b4ce      0x3365c4eb      0x71cf887a
+       0x5c42404c      0x56953eaf      0xf804db60      0xf2d9770b
+       0xed5b877a      0xa8ebc885      0x8dd2b361      0xa3f228b8
+       0x3ce6b3c4      0x404dec04      0x32db0836      0x80805f40
+       0xee0a6b4d      0xecb6a91a      0x65583189      0xd3fe005f
+       0xff19d475      0xe030314e      0x852f4c46      0x340007ba
+       0x95500a80      0x63761dd5      0x1751389f      0x7f611d78
+       0xfab36f54      0x5f071822      0x43c70000      0xf1813b21
+       0x7ed03c5b      0x6105ae85      0x8e1d08ff      0xbd4c223c
+       0x43c39836      0x50172b88      0xa1b58d41      0x37f631e2
+       0xbf956f52      0x77c8f43d      0xab796206      0x59e9e046
+       0xcc7ada10      0x8a1c4541      0x08b733b8      0x0c8c7616
+       0x90071b59      0x34a6e0c4      0x4625f3b6      0xb992ce0c
+       0x8da6fb2c      0x5b659d0e      0x92428703      0xccf200ed
+       0x3dddcdad      0xce4f2c52      0xf9f9679c      0xa3fc82f7
+       0x06202e00      0x25f9de55      0xf0594e68      0x1cd670b5
+       0x845386f1      0x10bdf789      0xe3ee4a05      0x1efda32c
+       0x2a76a8fb      0xd0e71447      0xe77a41af      0x119b8c5c
+       0x14dc63f4      0xe5e9d8ae      0xe8cec247      0x9029858b
+       0xc0870608      0x1615fc71      0x05563b71      0x9cb09413
+       0xb4ec6ff6      0x51d020c6      0x30d8bb6c      0x438b91aa
+       0x38c35cc7      0x32b2e77f      0xf8b82f0f      0x41a186ab
+       0xb9f51625      0x87384508      0xe269eb2b      0xf6fac07a
+       0x4f81200c      0xa7534357      0x65fcc7b7      0xe4d7e5ff
+       0xc8b32713      0xd1c2d99b      0xdcf6bbbf      0x9e037d0f
+       0x39b70e51      0xdf43026f      0x347b7c12      0xc8e78974
+       0xf486ff91      0x1bfd469a      0xaa1354b5      0x487339ea
+       0x84ca7228      0x4955fd60      0xb57a9c21      0x84e74c78
+       0xcfcea592      0xa8ddaa1f      0x6c00eb77      0x45bd61e3
+       0xc629ef4e      0xcb46eec4      0x39c106fe      0xe3c17770
+       0x13a0d721      0xd4e634e6      0xdb6809f3      0xc598c116
+       0xf85738df      0x342ee0e4      0xe6161d83      0xe3691d5a
+       0x37944585      0x1a9805e3      0x0680d08e      0x70e92def
+       0x0cbe04cd      0xd962c766      0xd78ddd24      0x0e6e1994
+       0x858139f0      0xea68a33b      0xae28354c      0x207ac2fb
+       0x923d1a1e      0x2450832b      0x51f38454      0xc1fa8519
+       0x8d0ed6c9      0x6e65d931      0x1ba4b87b      0x951d0bff
+       0xbe90b5bd      0x0c110d64      0xd3f1276d      0x471d6f38
+       0x3bb356e3      0x308139ff      0x92968f30      0x553d37e2
+       0x60bc26af      0x8f72e058      0xf9d248fa      0x499d4f06
+       0x106be129      0xd82dfa04      0x076fb7ba      0xe00575f9
+       0x7876dc60      0x72b2a280      0x4953f9ed      0xcf8cf94c
+       0xb216d447      0xdd8d68e3      0xf4eba871      0xf0623e64
+       0xf358ecea      0xf22a1276      0x45f7341f      0xc1291cc8
+       0xfabf1d5e      0x6cc3988c      0x3d30aa87      0xbaef31e5
+       0x607603d1      0x87ec3e92      0xdf44a6da      0x4b97b845
+       0xf011ca64      0x7597e4a7      0x950abddf      0x57793aff
+       0x2572736b      0x2a85c40e      0x7b7f1d71      0xa288c516
+       0x85be78cf      0xa3cc2834      0xe8eaab52      0x46b92d89
+       0xe28ec2b1      0x0986bb79      0x0ac43504      0x340b3751
+       0x7d07fb3b      0x23df6bc8      0xc696b021      0xa8901b33
+       0x8f63e0ed      0x8402c0f5      0x31e1ba34      0x2b6f92fe
+       0x863fef70      0x6aca166f      0x73c01ba0      0xb1a0465c
+       0xf5ed2a7f      0x276014bf      0x09aeefaa      0xf4a04698
+       0x7c72df4d      0xe6743589      0x39398783      0x6266778a
+       0xc7bcb0ba      0xa83bcee7      0xb38fd684      0x9d49dfd0
+       0xd0503d7e      0xa3f36b94      0x014f4481      0x60628909
+       0x9c954bde      0x588f5938      0xf956dfa4      0x9a39b849
+       0xdf6d3559      0x4b52c1c5      0xbbeb551f      0xba33f1e8
+       0xb788be1e      0xb690bdcd      0xb9437592      0x020a4b65
+       0xa26c8ab7      0xfda34a43      0x8365278d      0x5a13951d
+       0xcdcf9e4e      0xe9362211      0xbff63b3a      0x7563ebfe
+       0x16de12c3      0xffac1a2e      0x394dddf2      0x37239c14
+       0xfebbf610      0xc8f5e49b      0xcc38813f      0x87bd1f2e
+       0x9e32e4bf      0x39b20865      0x5b02b19b      0x401fbafe
+       0x0a3cd931      0x3a76015e      0x3d7c7751      0x7f3f45c2
+       0xad34d39a      0x9eed5a5d      0x495ab92e      0xec72bdc8
+       0xa1659ec6      0x0d0e82db      0xcceeb7ff      0xc3a04c63
+       0x09b44e30      0x8c68f5d9      0x78a1dfe7      0x8ae29967
+       0x7a6009e7      0x7d7a57b0      0xb606debc      0x36db9de1
+       0x91b23ab3      0x9bbbbb97      0x1c7a5812      0x053b493f
+       0x21fb49e4      0x0e0c1170      0xc7519471      0x6ce8e6bc
+       0xdbfcc87e      0x902ec5da      0x5ed1890e      0x67ad2554
+       0x2b1c1e1c      0x535ae4ec      0xac637c43      0x1a601fed
+       0xfef207e2      0x46ff3ba1      0x88e9e0a2      0x64d2dd97
+       0x778e24c0      0x6052a550      0x95ed76f0      0xb3454d17
+       0x01ee92aa      0xffefab6a      0xc3d8559b      0x0dba8de7
+       0x068bedaf      0xfaef15e4      0x6234ae34      0x73ec4bf5
+       0x43adf339      0x4b0f8de7      0xe764d584      0xe0760a24
+       0xb3eb0c68      0x75b3f9b2      0xf024df28      0xda645aac
+       0x0a6bc56e      0xb7260018      0xe615875a      0xa13a327d
+       0x6eb423af      0xb033289c      0x1b738592      0x143e03a5
+       0x14d84813      0x39fb3f9c      0x97563669      0x4bb8b9b5
+       0x5d122b9f      0xf43aa655      0xcbf6bd89      0x513cd153
+       0x5a720ac6      0x28edaf40      0xc6962633      0x09116fa1
+       0x23b1dbaf      0x4ab7b1ce      0xe057f269      0x9245662b
+       0x48f8ddfd      0xecc6a53b      0x1a02ac4a      0x3ec2ff1e
+       0x498e52c1      0x97687f25      0xd8f37547      0x515b39ac
+       0x6cc1b15a      0x65522e34      0x5fd144de      0x2571633d
+       0x9d9da5d5      0x965a114f      0x40c991cf      0x8058ddf1
+       0x84f473dc      0x51ae6d25      0xde9f9b35      0xa3e3c16e
+       0x666156e1      0x829e6c3e      0xa5a38205      0x3592bc43
+       0x52d75b00      0xa047e2ea      0x7e0bd672      0x7342aabc
+       0x5f5059ca      0x9382e589      0x062931ba      0x0e0fbd2c
+       0xd5223860      0xc940e45a      0x869f1a78      0xdfa5eeda
+       0xd127bdcb      0x63940885      0x3274b29f      0xfcb77bb9
+       0xa49feb47      0x8cbf77a4      0xbb5f6177      0xa1942c88
+       0x89658f9f      0x400579e7      0x159b799f      0xa0b21b4e
+       0x1906d38f      0xda44cef9      0x26b222c0      0x5218c63e
+       0xb807726a      0x56227902      0xaa0e2b56      0xf9c690a4
+       0x045a60d7      0xaead7431      0xdf43a28b      0x72aed6cf
+       0x336aceaf      0x265ad71f      0x1f3e7c99      0x7e6030f3
+       0x6d6648d8      0xb4926841      0xc7e0b902      0x7ce4540e
+       0x70b972ef      0x17e40022      0x675e851a      0x42180d66
+       0xe45dcb6c      0x54a4491d      0x72f7671f      0xef45a9d3
+       0xeb9f8137      0x802f2db6      0x3ede9405      0x4b86c1e2
+       0x9372d02f      0xfd63fec6      0x35020008      0x52114900
+       0x7a1ad13f      0x2402f735      0xb1f6b7c7      0xd6d5b632
+       0x154a9438      0x3e364d80      0x72f916e6      0xbfd36cad
+       0x8714a353      0x4cd98007      0x319db6e4      0x9ba24eab
+       0x65a72eb8      0xf575feb1      0x040c685c      0x5eb50e7c
+       0x1e41c876      0xc93dcc6d      0xc5291538      0x59815560
+       0x94d306ef      0xc9d44f42      0xe7415aec      0xc35479b5
+       0x92e467c8      0x9782185d      0xc09fbcf2      0x8403181a
+       0xa1b58b43      0xcc02ca17      0x634bf9ec      0x20882faf
+       0xcfe6569c      0x5bb61be5      0x8de00bcf      0xd0abbb26
+       0x9b239fb7      0x6491d6c8      0x1f86ff77      0x52d842a2
+       0x769a9eb9      0xa9d7140a      0xf44acf53      0x8f679b77
+       0xda12ab14      0x45849bd4      0xd4b8fedb      0x41d2f20e
+       0x5119dfeb      0x0ab7ac95      0x85bb4fcc      0x8d5cd1bf
+       0x09d78592      0x5d632ed2      0xb7a17164      0x0d86ae85
+       0xb9ad5cfd      0x6de7be63      0xf5fe6344      0xf657f761
+       0x38ccc981      0xf4050114      0xc5c65e8b      0xc8437cbe
+       0xd61d858a      0x713f2780      0x66a26ca6      0xc2ba846e
+       0xb9c0363b      0xca90c529      0xd97bdb85      0xebd51c51
+       0xd25f339d      0x72a565df      0x3da5a9fc      0x6d8c4d1e
+       0xbb0f9788      0x64c88ee2      0xdc4fab6f      0x739aac40
+       0xb6cec86e      0xd3f1aab0      0x64cdfa8e      0xcfc2fd83
+       0x3ff62c87      0xdcc78eaf      0xec1b3f33      0x14dd4c2d
+       0x9669b3fa      0x205aa2e3      0x188ab67f      0x0383e315
+       0x7ebae462      0xaf454af4      0x7f958e2c      0xc87727b4
+       0x2451100e      0x6c0869e0      0xe9372939      0xd903f020
+       0xd6db9b5d      0xea0aec89      0xcb9ee968      0x55e6daf8
+       0x8e0c5fef      0xe0f285fb      0x3de5fd91      0x2737dc03
+       0xa5123db6      0x5e1281b0      0x1494bed2      0x7d5e981e
+       0xcd14b88a      0x70b3ef5e      0xdc22e10e      0x2d73bc09
+       0x1720e7e7      0xa48ed5c6      0xc229e058      0xf2d51b6c
+       0xe71c26eb      0x6903b9b4      0x42ee13cb      0xa4b8841f
+       0x10bfaad4      0x3b41f550      0x45802cb9      0x9e9267a6
+       0x23db6591      0xe5537ac9      0x9762de9d      0xd7da6111
+       0x43d83e0b      0x6953ab95      0x8676fad4      0xa54d6833
+       0xfbf56f8c      0xcbf1d10a      0xa0acef92      0x0e6a0856
+       0xc78ba1eb      0xb4866d64      0x79ea0af9      0xe5ccbe52
+       0x1d5441b2      0xffbedd4a      0x1a86b3e0      0x8ec6db6f
+       0x0ce230c9      0xe2d6c885      0x36d28fc1      0xe4ed575b
+       0x36aa0795      0x809c85a8      0x3d1e8a24      0x275871b3
+       0xa83143d4      0x4d0b8458      0x486621c2      0x3f3715ec
+       0x5539614e      0xcec52cee      0x2b1535bf      0x77242e14
+       0xedd93846      0x33217bda      0xab6f9a65      0x4c861cb6
+       0xc9813f7f      0xda359ebe      0xa2f24cf2      0x6f733200
+       0xcbf36590      0x7af00123      0x408b3c8b      0x1ff8bf2a
+       0x8d990131      0x464287e5      0x2c4007a2      0x5a25ac0b
+       0x8f17ec59      0x3b3292f1      0x1aac8dd3      0xd3e7bd12
+       0x36a71bf6      0xbf17a12e      0xea40b62b      0x60368c5c
+       0x0e999db3      0x6f5231f7      0x7d8e89b2      0x0f514e1e
+       0x50cf103c      0x0639c099      0xb1dd19a7      0xa2998698
+       0x3267ab50      0xfe09a5a8      0x6eda6c63      0x1e0dbd6b
+       0xbc83c163      0xecfc0b8b      0x07c4ecf4      0x207096e2
+       0x89ef2adf      0x30363e99      0xadf28af4      0x22dacfe2
+       0xb1e0a489      0x62bbb325      0x493930ea      0xf1ffee5a
+       0xa57777d0      0x44c9ad84      0x02e8c23e      0xab4819aa
+       0x02afa569      0xbb1b40d0      0x8d471322      0x253f299b
+       0x99263b6d      0x408e631e      0x0a307e49      0x80eab591
+       0xcfd02a10      0xe0f2fee0      0x627851c2      0x74c0f9ca
+       0x4b0b5736      0xfa6c461b      0x52477f06      0x1921c6ec
+       0x47538b96      0x87216ab5      0x68daa276      0xc201e54e
+       0x6a0ffcb0      0x6c38f828      0x267d3508      0xf1c7a93d
+       0x99988b01      0x43ef71fd      0x56659310      0x66cebb0b
+       0xfb59ef57      0xb11445c2      0x8cdbefc6      0x89927126
+       0xcc246095      0xea6c0e77      0x6fa82a03      0x40b81e9d
+       0x44ce6618      0x2f683915      0x7234f37c      0x04f06fae
+       0xe3f58d38      0xc5e44f9b      0x9faa5509      0xa3251387
+       0xd2bacd98      0xcc01a7ed      0xcd75beed      0x0543feeb
+       0x8a733b71      0xcc4b4ff0      0x9a328688      0x0e00ae47
+       0xd4c3291d      0x123d394d      0xe8aededc      0x67905689
+       0xcc88cd05      0x3dc25d0d      0xfcbe2d01      0xc25cb130
+       0x77668e7f      0x1a76e00c      0x2913ccad      0x623371fc
+       0x46786b97      0xe2c24f6d      0xa6f28a6d      0x311dacf3
+       0x5a0f5312      0xd0a19821      0x7415811d      0x4aad5d43
+       0xb69b186d      0x9296aad7      0xc8627e27      0xe1b2c304
+       0x138b78f2      0xa5cc26ce      0xde5c3b06      0x6a30d0c7
+       0xf4c74a52      0x61cdb6b1      0xe30a5cfd      0xb32aa583
+       0xba26805f      0x77e33257      0xbf08b9b8      0x09829ccc
+       0x248b0942      0xa6ddf03b      0x62bc5d95      0x9493b6f8
+       0xdd952082      0x1d33c2da      0xa788160a      0x8b39d3ba
+       0xdfe00bcc      0x2fd60d5e      0x1363968f      0x9f859918
+       0x71eb38a5      0x5f0519f4      0xd8f6227c      0xfe496054
+       0xb5fce544      0x8e6f6ff5      0xed51f072      0xa95500a5
+       0x952b9803      0x52deadb6      0x927e1eac      0x2f93f3a1
+       0x12e3978a      0x31b458ff      0xeae4aad2      0x8d257c5c
+       0x1b5c24b8      0x482fa692      0x7d8260a7      0x3297e1bd
+       0x1aa499be      0x58fa7e01      0x3f22da1a      0x41707c77
+       0xb474c077      0xd3ee8670      0x6eeafb6f      0xe97f6353
+       0x12c43638      0xdd846a87      0xa5ad486d      0x5b10e299
+       0x11d1fe2b      0x410f5e33      0x33a1f43c      0xa728a8dd
+       0x4197784a      0x46db1576      0xd170a6ad      0x1bb97415
+       0xbaaf2e8b      0x46c4f1b6      0x563260ed      0xf121ce91
+       0x0f02eda8      0x4b9c4db1      0xd15b1fd9      0x28a9c018
+       0x48f3a184      0x64d54afd      0x0d619290      0x45488d7b
+       0xc9ba9f92      0x5dc66623      0x4ffb5ab9      0xedd36a35
+       0x3464bbc1      0xe16e5a72      0x88f092e7      0x865a393e
+       0x4155f5fd      0x6693bfb9      0xc11be46b      0xbfb59ec6
+       0x0ddd5033      0x9a2bb34e      0x4b09421b      0x8f3363cd
+       0xd3bf4f74      0x6126f624      0x8649f98b      0x8631b39c
+       0x5d9b705a      0x6c7508fd      0x6598a753      0xed03e0f5
+       0x265586fa      0x47e2a475      0x22df5b1f      0xfd697213
+       0xf8343c28      0xfee82a3f      0xbd52e7fb      0x3c55ae1d
+       0xaa7e3726      0x9e113891      0xad1178e3      0x7c79b062
+       0xa6182e3e      0xab5cbad3      0xfafc5b49      0xab4004f0
+       0xfe9e29b4      0x2ececfb2      0xac222317      0x7eb04c5b
+       0x0bb3d6b5      0xe65e6be1      0xb6f4776b      0x854d0f09
+       0xf373c8ab      0x1686e6d3      0x4b0c5b13      0x96a5af0e
+       0xd19f784a      0xf4084e77      0x0baaf70a      0x885251fa
+       0x3211962a      0x648092a8      0x9b9cb4ba      0x15dd84a2
+       0x210f3225      0x90e32ede      0x08fe39a1      0xc3f77b81
+       0xa66164a4      0xade3cc77      0xcf101d91      0xcf32381e
+       0xf7947fc5      0xd2069d22      0x3400bff5      0xb2d092a5
+       0x17f1d109      0x2df9e6e1      0x9ecb56ac      0xbda05f04
+       0xe4f87413      0x2cb25b92      0x3830daf5      0x4855e79a
+       0x2616db3d      0xaf2e7354      0x6e4e1965      0x0bcca840
+       0x6df2d311      0xa685a6c4      0xbf1d9d04      0x0c45f1fa
+       0xfefa97a2      0x56acf5b3      0xdf253591      0x9840f77d
+       0xd939872f      0xc21a4032      0x61d3f315      0xd0f3872b
+       0x21d79975      0xe71f07af      0xfdb46980      0x1e0f2472
+       0x84dca328      0xccc1f96a      0x68b8ce74      0x666d9f20
+       0x0cd78628      0xdea393b2      0xe79cf948      0xd9a30305
+       0xa6f6e661      0xfac3a529      0x43867c2b      0x3b51873f
+       0xf83332a9      0x8083120f      0xb0c8310e      0xb2aae08c
+       0x1aaa878a      0x755bf6e7      0x046b6877      0x6d87925a
+       0x2e170b79      0x1239578a      0x6195eab2      0xe3f66cea
+       0x766fab12      0x45da58e7      0x7f4569df      0x0888ea36
+       0x8bf6feaf      0xad9cc5c0      0x21bd9bc5      0x9ea4aea1
+       0xf85aa451      0x825a4e79      0x8cd4e36d      0x5150b082
+       0x4bb0fb31      0x0dde5a88      0x973592d1      0x14eb8fe1
+       0x75174bfd      0x74847459      0xce7b6c3b      0x94c33d40
+       0xd8690898      0xf2b0b665      0x918cb951      0xc6ca50fe
+       0x2b99e7f3      0x1a346961      0x8fe21508      0x04fcf521
+       0xa9538384      0xe47fb4c2      0xd2ab26ae      0xe641ce82
+       0xd534070d      0xe156d957      0x9e98e20b      0x87e261e1
+       0x1bf87d39      0xbae63c29      0x51dc5625      0x99fa08df
+       0x29a87254      0x3ceb0e63      0x52960cb5      0xa2b429e2
+       0x7bd0cb97      0xbfece039      0x43ea635e      0xd879205a
+       0xea8557b0      0x8af0b125      0x21bece00      0x265b663b
+       0xb97bacfc      0x012a7dbf      0xf79bcf53      0x3855e394
+       0x8e095c6d      0x11842e8c      0x91c4e8d3      0x496f6dc1
+       0x67e8be94      0xeda3085b      0x0dcc7e57      0x31f1bc9f
+       0xf945ba14      0x67012d13      0x2a927c55      0x6ad89f60
+       0xaf6d62fa      0xd2b538dd      0x22961c16      0xe7c469c7
+       0x3e814b2a      0x975e033f      0x8e11e47b      0x76aa7f86
+       0xbd28d9af      0x2f52bd9a      0x04f14a37      0x03c10ea5
+       0xd109a0f1      0xeaac7a38      0x182b8b7a      0x63df0f9c
+       0xb4437ae0      0x00277618      0x92a9653c      0xc761c1b4
+       0x4b8d723b      0x0de967b3      0x8418132d      0x8766fddc
+       0x2176c33a      0x6d46b1f5      0xcef94f44      0x06499ec4
+       0x41de9284      0x40b846d0      0x609737fd      0xae574bed
+       0x7f48ddbf      0x7037a488      0x0930579e      0x70b86289
+       0x72c960d9      0xcf307642      0x333b4536      0x3208af9a
+       0xff7bdb38      0xa834082e      0x6f5586fd      0x1e033254
+       0xfec00a53      0xd4bc3747      0xea7689ea      0xce66a07c
+       0xb88dbbd5      0x8b3632f9      0x85081be5      0xe0984f27
+       0x39b71d03      0xf5cddb75      0xd32cca39      0x7a450b08
+       0x52379b99      0x5ba9e7b2      0xba19bb5f      0x138a1cc0
+       0xf64b0ccb      0x6fd1d6ee      0x81637094      0x25066f8a
+       0x8d7b1af2      0xabf72360      0x1cd5f0f9      0x2c2787e1
+       0x73eaf8d4      0x3d8875fc      0xce76c829      0x40959f26
+       0x8bf720f9      0xbf270ee2      0x0aa2bdad      0xf425fe98
+       0x7a3dbae0      0xae734299      0xfaecb714      0xe205e383
+       0x3c162cbb      0xb54f19e5      0x82f7ba9e      0x86527878
+       0xcebda01f      0xd86ced7a      0xcae432f9      0x4b07cfa4
+       0x81ec3e6b      0xec1aeb5a      0x4b2330ea      0x6fde9ffe
+       0x33aae610      0x7d371b76      0xecbcc9e0      0x0f8bbe77
+       0x139c11ff      0x53ae1dfb      0xa1053b22      0xa6d12006
+       0xceb6a898      0x049abc80      0x6db27bc1      0x8d4df3eb
+       0xd8f8a2c6      0x611d976d      0x8c4eae6f      0x7100a396
+       0xc5c1a942      0x8442bed7      0x26dbc801      0x93fb6838
+       0x367c1af1      0x769f9df3      0x1701917f      0x7d858d20
+       0xe79a4a6c      0x2313a971      0xc2621a21      0xc461a40a
+       0xc6b632df      0x4e2f0dfb      0x973564be      0x971f499f
+       0xc86f6402      0xe2e82d0c      0x2e70e676      0x25fbeb1c
+       0x05342bd9      0xbbc68474      0x02398a0a      0xe14ffeff
+       0xb0fbb75d      0xf72d7aaf      0xf5e93e34      0x02df0dd3
+       0xf336390e      0x10718585      0x66d48328      0xa94d8885
+       0x376c9cdd      0xaedcd73a      0xb7983c7d      0x9a4941a3
+       0x3a1f5677      0xd831409e      0x847c7ddb      0xcce1a9cd
+       0x91da6966      0x41dd20ba      0x14f45c08      0x3ad73dcd
+       0x566987ba      0x0ffb5606      0xfa307a12      0xcbaa12aa
+       0xe77c1800      0xcaf6803d      0x8d14a697      0x5fcaf843
+       0xf64337e7      0x923221b9      0xf3fd2ae0      0xc07434bc
+       0x55374784      0x94e00513      0x0a75c488      0xe3d21454
+       0x4d778a55      0x4aec547e      0x3afb918c      0x21b7db37
+       0xfc771fb2      0x041f4889      0x14d2d362      0xbcc9d9f6
+       0x5bd50edf      0x753ed319      0x5b8abcf3      0xb875a346
+       0xce7669f4      0x348957a2      0x9684ae1c      0xbc19e9b3
+       0x8790be92      0xc6cc9763      0x3c082777      0x617f4ca5
+       0x6fa609a1      0x9405e535      0x41094a74      0xeb925ff2
+       0x0f4f8e24      0xee2a20e4      0x381da058      0x9fe70438
+       0x7f1161e7      0xdb54d051      0x190b1779      0x21466eda
+       0x3b6c810e      0x0e0b8114      0xb497c673      0x4f644bfb
+       0x19a46e35      0x4a4eeab4      0x4b976b6d      0xa087157a
+       0x6d1e6349      0xc78eb29d      0x165225db      0xe666f808
+       0xc5d8f270      0x8267633f      0xba1265a3      0x4be87190
+       0xf8c520fb      0x9370a515      0x4bf66dac      0x950d23fb
+       0xfd63a000      0x44100c9f      0x04c60526      0x4c06cd8c
+       0x0677dfab      0x59bedc3d      0x94dc14ed      0xc0771551
+       0x4456060f      0xba490544      0x62fd88ac      0x5f5c9628
+       0xe1d30606      0xdb74bffa      0x875d1eb8      0xf08c15f5
+       0x09d59196      0x74411971      0x522cac21      0xc4f8e753
+       0x882bcec6      0x686491cd      0x9a6d2132      0xcc82e038
+       0x379115c6      0x2b398972      0xc80ef665      0x8fef530a
+       0xd77eeff3      0xeb5b3d42      0xbbdea33f      0xf7cbc015
+       0xf4dfce22      0xa06f23cf      0x07006697      0xf556def9
+       0x5b53668e      0x871ce2ff      0x640b7be5      0x21e3a27f
+       0x50bbeff1      0x12c5b662      0x3493f835      0xc2379e8a
+       0xf455167e      0xb0b7052e      0x0d8392cf      0xcbd6e6ce
+       0xa6d47313      0xd543a23c      0x5fd4b1cc      0xf41165e0
+       0x29c74588      0x4b1a4e76      0xa710a86a      0x32fd6f8c
+       0xd6f18e0c      0x7a33704f      0xfffa38d7      0x65e3524b
+       0x6eb533d0      0x680e3b72      0xa6a5278e      0x1334fbeb
+       0x4b37a445      0xc75cbb1d      0xa3414ca6      0x826ced4e
+       0x44c2dfbd      0x486dd171      0xac300a00      0x5a0e7367
+       0xe2db128b      0x2b9eb0b7      0x2a7c6c40      0x1a22daf2
+       0xee429275      0xc1d37a9e      0xb6bb1b69      0x98642f28
+       0x169a17ad      0x80c499e1      0xe8228188      0x74b9d65b
+       0x378fd8b9      0xf608cfe1      0x8299d0dd      0x1e4c4f02
+       0xdc45635e      0xd94a3b44      0x40671628      0x378e2949
+       0xdaf573f7      0x73c29e3b      0x3bfdad1a      0xca154ac2
+       0x999ef0fb      0xd7d19f58      0x7a4ddb26      0x613f2678
+       0xfea80fb5      0x6a85d7ed      0x9aa90f39      0xc8bf26ca
+       0xc325cce7      0x89328ef7      0x59a19dea      0x453b40b5
+       0x16d3f3d9      0x41215f42      0xce8d0110      0x83b79c31
+       0xfecfa5e6      0x9da5153e      0x0d505941      0x9f3582bc
+       0xd71f5c26      0x74f3e604      0xc9fe57d8      0x14394881
+       0x82cc16f8      0x3f656a38      0x5cde1d58      0xeb3505bd
+       0x27ed1c07      0x7de82a2d      0xa20b44a2      0x4bfbffe4
+       0xf306e134      0x3d8900f2      0x401b307f      0x90d666ef
+       0x2524fcfe      0x4e5deb9b      0xe53d0a84      0x873f8c55
+       0x32e7203b      0xc221ee56      0x1a2b8b2a      0xce64dfae
+       0xa367000c      0xe32b29da      0xc35fc2e9      0xc5d223a8
+       0x765d240e      0xb12e76c5      0x8652b6f6      0x8a5622f2
+       0xe069cdff      0xd7a29ae8      0x8e6b1c5d      0x3df93d30
+       0x5e19ed46      0x3f41779b      0xe7578355      0xbeba23d8
+       0xbf74fff2      0x93c39591      0x453990bf      0x0fe4c433
+       0x693bfe7f      0x6265fe37      0xd046f718      0xe7034449
+       0xf7084ee0      0x29ff71af      0x3397c1e4      0x3f0627a6
+       0xedffdb2a      0xa7f3b3a0      0x8917f4d7      0x2376ca2f
+       0x91028844      0xfecdca85      0x19879720      0x2e3a92d3
+       0x93839b26      0xbcdcf470      0xb9d25259      0xb85a15ad
+       0xf9ff7edb      0x46d4e283      0xe0239cc4      0x76c51481
+       0xd7e83208      0x6d6660c2      0xf8889044      0x5501d81c
+       0x0369307a      0x5aa53905      0xb728237f      0x06124625
+       0xeda46bb8      0x0e418323      0x487636a8      0xe153e0d7
+       0xa91106ca      0x24d8bef8      0x89d4d734      0xff8af7d8
+       0x6611efc6      0x70fc6dcc      0xb406b914      0x7c37ea68
+       0x4b0453d9      0xc4ec6bc0      0x6a25b97d      0x8ee010dd
+       0x1dccc74f      0x15341da9      0x62708075      0x9168d676
+       0x0f7ef6aa      0xdeff3a44      0xb54a28ed      0x1d2d0aed
+       0x28cddc63      0x9ab141fe      0xeed7550c      0x933f3834
+       0xac5e9e28      0x1ef0068d      0xec789605      0x303d24de
+       0xdcfebf7a      0x3642e133      0x076756ff      0xa76f1a4f
+       0x5cb3458b      0x3c87d40f      0xbe5e5339      0x53607f72
+       0xd4f628c8      0x053afd01      0x2e5f55a9      0x32a6f765
+       0x91168ba3      0x3bca077d      0x056250ec      0x29074f83
+       0x1c65eeb8      0xcae51635      0x41980e14      0xf6032fc0
+       0x62f5475b      0x546b384d      0xe33f4fb5      0xe95a0bc9
+       0x6be2cce3      0x78ba9a41      0x9341244e      0x568580ab
+       0xdfcca0fd      0xca3cbb24      0x1fa3a05f      0x9d62ace0
+       0x61697465      0x9819c572      0xcd26dce6      0x9761b0dd
+       0x05fdea68      0x8a8068e1      0xa8a5dd29      0xa3855d2d
+       0x18f83355      0x3ddf22c2      0x57bbec09      0x4e6c9d19
+       0xdd11d921      0xab279dcf      0x21fba151      0xd1992b47
+       0xc9ac75d8      0x6bb91d86      0xb7684d46      0xe1c1e196
+       0x9b02d10a      0x7034338d      0xc3e4a66d      0xd714ad9d
+       0x53a38f0f      0x82577d3a      0xbe396553      0x80c01189
+       0x65e59020      0x3f5e139e      0x5b474bd2      0x8fa77f3c
+       0x5b8ba009      0xfb31f5db      0x3a3750b9      0x2ea7b5e9
+       0x70967373      0x12af64ad      0xa88933e7      0x266e913b
+       0xb9b5ac81      0xba7eb48d      0x5f538d3a      0xcef65fc4
+       0xb87596c7      0x1841d61e      0xaddbfe29      0x357b84ac
+       0x0285ece7      0xfc4029ee      0x20f68f16      0x0570df7a
+       0x01d5fac7      0xd27d456f      0x921ee30b      0x7f3e1080
+       0xad13face      0x69890c00      0x3c11a1d9      0x14314c2f
+       0x47ec8d26      0xa64ac87a      0x9b375047      0xf1da938f
+       0x9e525923      0x83340489      0x2db83950      0x0d0df33b
+       0x2457985e      0xb5ac76ee      0x0b5d5892      0xcecd03a8
+       0x1146ca0d      0x54c28037      0x8fb9a6a7      0x1f626a66
+       0xdf0b6569      0x6d4bd562      0x1703d847      0x42f38af5
+       0x40c5f6bc      0x3806c13a      0xa52175a0      0xfd2f4814
+       0xa1a87143      0x5a3df656      0x12c937bd      0xe1108f2b
+       0xbd2af1cb      0xde4b3129      0x680cd797      0xd2d56d49
+       0x8a06d1de      0xb629e1de      0x73539c32      0x25b956be
+       0x817d8963      0x6d997e12      0x9d26c5dd      0xe0a1174b
+       0xa4233f86      0x9e1694a3      0x4fc8067b      0xbd1e7860
+       0x98af3007      0x65029e65      0x9658fb2c      0x7474ea1c
+       0x61883b2b      0xc0d95154      0x9a4fc748      0xcf9b6c01
+       0xde96d302      0x19f1ef0a      0x0dfac53e      0xb8bd5069
+       0xd596a1a3      0xb57273bd      0x39642eca      0xc252601c
+       0xfad293e3      0x9e8a64e8      0x55187031      0xfd13aeeb
+       0x940f07a6      0x818dab99      0xb9482ee7      0xf396a9d1
+       0x19eb94d5      0x72064a70      0xaa9c3266      0x814a7dec
+       0x3e138363      0x6e348287      0x8f70398a      0x8363ea0b
+       0x7737edcc      0xe08adede      0x87efe04e      0xb5e792a2
+       0x66311793      0x86a663e6      0xcd0bc4ec      0x81617887
+       0x8c93d56f      0xd0eef3fe      0x7c9a9c0b      0x37985c27
+       0x131db40f      0x2226f0fe      0x4829b9b9      0x24f9f28d
+       0x687ddc5b      0xe02e3d91      0xb9a50924      0xd1faf2f8
+       0xaedcdfc4      0x15d9de80      0x73974337      0xb3a8f3f4
+       0x2787eadf      0x164f12fc      0x093b2cf1      0x274f0718
+       0x7f98d839      0x92a12eb8      0x553db255      0x645fd979
+       0x7c37aa09      0xc70f7ebd      0xe1f39374      0x7ec2ba46
+       0x46e871fc      0xe3e15703      0x12324d6b      0xbf8625b1
+       0x1be2baa1      0x7f6ede5f      0xad6011b3      0xa2fe7edb
+       0x3d2ce3a2      0xbef298da      0x7ae87965      0x3ce8f403
+       0xfc0a9fc4      0xcd70601f      0x87ce5750      0x97ce7f79
+       0x1e832ab4      0xa2e82726      0xf8e7efd7      0xe40154ec
+       0x4f2b50f5      0x60012916      0x84b94bf1      0x34244ca5
+       0xb0a5a186      0xe1deb138      0xada43194      0x678ca2c4
+       0x121d9204      0x93676935      0x6499f72a      0x84d07869
+       0xf1bc1b7d      0xb89bdc40      0x69f37106      0x2863c0a6
+       0x00e15275      0x7d640b71      0xeb5193b3      0x87a20844
+       0x09c03e15      0x9646f0c8      0xe23a0644      0xa468c1a1
+       0x916a42c3      0x23b15ede      0x39e40968      0x117a2262
+       0xac044026      0x32585734      0x774db481      0x436c93ba
+       0x02a88471      0x83808b1c      0x1b2b216b      0xcfd03aad
+       0xe5448453      0xa0cc7d64      0xbedf4877      0xc7c3a2e9
+       0x76d8aab4      0xf7ff3890      0x97b62db8      0xe84cc1eb
+       0x55d64ada      0x9dba0059      0x2f473a5c      0x1e34bfeb
+       0xf0cc6002      0xee0e7062      0x9442a9fb      0x88b12c79
+       0x46fb7118      0xa15d7181      0xb30f5ce3      0x3e17a5ea
+       0xa15ee2ca      0x45aadae0      0xae610e36      0x71f26322
+       0x3fc3e51c      0xc714957f      0x2c7b54a2      0x23aa0fdd
+       0x942fae8d      0x0e8fee54      0xee846617      0x73305ad8
+       0x39d3d521      0x36224232      0x2b73f92e      0x27e962f9
+       0xd8193d48      0x2e0187bf      0x6d461b15      0x4b5207d0
+       0x8308ffaf      0xe1d7adaf      0x1a076838      0x0c795196
+       0xdccf9dca      0xb5e09b6c      0xd5522d96      0x532263ce
+       0x0fdd41fb      0x2216fbad      0x89a4e893      0x870930ef
+       0x1356e0fd      0x9c65a038      0xfa6e1d6a      0xdd0d8d0e
+       0x3dc5fc13      0x5014cafc      0xc82b0070      0x9f099b5f
+       0x7a39d54d      0x439b563b      0x9cb03122      0x0cfc9e04
+       0x7c017cd7      0x03f725d4      0x4d51f12d      0xc2fb3abd
+       0x9859c799      0xdefcdd82      0x5d9a9477      0xdd372929
+       0x8df7d5e7      0xdda4f6d6      0xa29031e3      0xe957cd15
+       0x4997f6d1      0xa24230d6      0xf920f6ec      0x392e930a
+       0x4bd3c02f      0x5a3fa5d3      0xde4fc5a0      0x145a7a72
+       0x578c39d3      0xac5fed2e      0xbcbe3739      0x75135d4b
+       0xcf7f58af      0x9971dd3f      0x2ed4365d      0xa38a79fc
+       0x74e3e1ab      0xc6bc1825      0x618896c0      0x0d517d78
+       0x3a87c682      0x1e08260d      0x8f45cf39      0x9ec155ed
+       0x134aa7b0      0xd6cabfc3      0x3cad6ac1      0x3e4e0de9
+       0xd2c0cd91      0x44845ec2      0x814f443c      0x9e1c4db9
+       0x4616ef30      0xca3c78bd      0xa211ee1f      0x08178d31
+       0x3a2ad599      0xeea97244      0x3648329d      0xe92f887f
+       0xd410f135      0xf617be72      0xf744f3ee      0x9c490092
+       0xe9d63d11      0xd5e07b97      0x4567fe12      0x7f9144e8
+       0xf2b8ce45      0x8e013339      0x7cecead2      0xdff53155
+       0x7a2ff59f      0xf02eaebe      0xfab33d15      0x5eb4bf88
+       0x28a72b4d      0x63fff963      0xabaa1c52      0x6177a027
+       0x9c14b8b0      0x335557c8      0x2b33180e      0xb613732d
+       0xbe08b72b      0xb197c710      0xd42c2c3c      0xe4ec967f
+       0xf8c1e10c      0x907483a3      0x57a9ff5a      0xe9ae9d13
+       0x1e0e42af      0x9c82cb11      0xde19b06f      0xe7379b1d
+       0x93ead83a      0xde52a625      0x763fd504      0x526816c8
+       0xd317a1e1      0x80158090      0x280d1508      0x24d45c2e
+       0x1bea6c69      0xa52fa27b      0x59322181      0xc1633372
+       0x8c8a03ad      0xdda781e7      0x67d994f6      0x1fe753ff
+       0x02e07f9d      0x3bbacfd2      0x448b2282      0xfcc0f1d4
+       0x579dc5ab      0x8166a776      0xb35ea37c      0x729add2d
+       0x17442ebf      0x46949807      0x3d863a9c      0xe83b9c92
+       0x9e9b6078      0x1323c135      0x0630bb03      0xc3adad8b
+       0x062fef3d      0x00256ee2      0xec5aca51      0x80d772da
+       0x81caf683      0x0bd30f14      0x90bc3205      0xb6f69582
+       0xe77536de      0x531ebe48      0x1ac226b4      0x10384a9b
+       0xb4b8148d      0x6fd5d330      0x88ee3876      0x92056102
+       0xbdd947af      0x9a7ad0cd      0x02312b78      0x93d9ce9f
+       0xfa703409      0xcf61b3f3      0x19b1c925      0xa7fff41f
+       0xf7d24b53      0x58565238      0x7b9318ee      0x0d4dbf70
+       0xefce22aa      0x8dda1627      0xda1c2d5e      0x5c30e824
+       0x9974a148      0x80f18dc7      0xe5aedeef      0x7754225f
+       0xcfe917de      0x8c52d64f      0x391f00c6      0xc2beecf5
+       0x7a78794e      0xf947b05e      0xaf33f3ae      0xbf97fcce
+       0x9565380a      0x6e35c159      0x47008d6e      0xa643d183
+       0x51bf5509      0xb9f530bf      0x2b7626ae      0x7f99d145
+       0x4a9b7027      0x72e4c211      0x908f5921      0x33b6d752
+       0xa338ccd8      0x42516085      0x342285e0      0x7421a747
+       0xf3946993      0x96bafa36      0xd2f47ff0      0x466d760d
+       0x0de58397      0x9a60732a      0x51da69dc      0x5e75833e
+       0x06bfbe37      0xee1b0b16      0x1fa9e22a      0x1471ac29
+       0x91c17bd9      0x61019572      0xda534447      0x5c8bacc1
+       0x2f21d658      0x88dfbbfb      0x4513522e      0x48e757c0
+       0xf01afc25      0xd2f2e9f6      0xb26d6dc0      0xed7228b6
+       0x0c14e015      0x166667f4      0x93b72285      0xc15004ba
+       0x583a442e      0x1a32a22e      0xe68d3f1b      0x98428797
+       0xf6642555      0xe31b2450      0x408bc05c      0x6414a0ec
+       0xe240c794      0x8e5f2799      0x82433391      0xd6ac689f
+       0xdf4da142      0xd4b138c8      0x38d48ccc      0xfe8de2a2
+       0x1e006414      0x93b20007      0x4a8364a8      0x157eb018
+       0xa2f9f92f      0x615fef5a      0x87b855ed      0x759eb5e4
+       0x39abe477      0xd7a3ebcb      0x2e80ccf7      0x94dcf71d
+       0xee4abe26      0x20585e99      0x654b270a      0x1cd75ca0
+       0xc67ea827      0xc5fbe73c      0x61dfa344      0xc4484973
+       0x3af93dfe      0xfee9add4      0xf4ee580d      0xb89c9012
+       0x4c40846d      0xf36214f8      0x3f3a51d7      0x26c06a31
+       0x43a86900      0x46a43d66      0xae1c5e8e      0x944153b5
+       0xb484539f      0xed2ade58      0x7be6ef52      0x224ab290
+       0xbaa44cbf      0x1de20200      0x3909df18      0x003e0d4b
+       0x09f04a8b      0x5c00be4b      0xc95caadd      0xa3cec080
+       0x732baefe      0xbf6ea34f      0x80232801      0xdd600fd4
+       0x1b33bfb0      0xe7fef75d      0x9b6fff5d      0x7cedaab4
+       0x158ffc0c      0xd8437113      0x8cc693d4      0x31358783
+       0x4242f7a7      0xca4004f6      0x212c48ed      0x54c1cd26
+       0xc15b9401      0x47a58cb8      0xb7d3b18e      0x269363e7
+       0x47bb4e32      0xe522fbf1      0x537da9db      0x9c7fa5a4
+       0xc5d61a7e      0x2baa4230      0x6bb65617      0x3a2197a4
+       0x57eaba91      0xd28da650      0x58e52bf1      0x2496e235
+       0x9d6e8b60      0x2a027aba      0x566e7d1f      0xa036dc49
+       0x83f8c580      0xdf4e378e      0x04ada75a      0x4d0dab78
+       0x0d8bbc02      0x86d2ff63      0xdd27ee32      0x0ae082ae
+       0x15343e58      0x8eb50be6      0x83b77044      0x3b521fe9
+       0xeb61da85      0xd507cae1      0xcf000a6b      0x6fc9726e
+       0x0a62b7cb      0xdcdd7c52      0xcf5508fe      0x91ef5bf9
+       0x4f44740c      0x4ea45d80      0x9a76c0b0      0x6d103972
+       0xd869146a      0xa5142a9c      0x0341497e      0x8643a451
+       0x34ae7a68      0x5abe7e76      0x1054c9ef      0xbbc48bd6
+       0x7cdce445      0x55717c41      0x0f85655e      0xd6d0c389
+       0xd0e4ea04      0x8e6738c0      0x0aa9d964      0xbd0714fe
+       0x83a80b5c      0x0584b1f4      0x8f15a37e      0x7e7c9032
+       0x298b2db6      0xc9c3d8e2      0xcd7bc65b      0x75fcac55
+       0x1a43278c      0x399666c4      0x624dd366      0x2a0288a1
+       0x7b84f00e      0x6721d3fa      0x155bddc9      0xa5832bf5
+       0xf73d2bce      0x29b9523e      0x4c1cd6a1      0x5e8d8b89
+       0x701c5e9d      0xb57001f7      0x0a84f98a      0xe30922e8
+       0x58026df9      0x5d4107be      0x237dab8a      0xbcb893e2
+       0x93931352      0x592aab19      0x95b5bc39      0x0ec276e5
+       0x3c609401      0x922036a2      0xadb4cfcf      0xe6521586
+       0xe1640a6c      0x24bf8313      0x4ba05eeb      0x56ef987a
+       0x33b9f215      0xb65797a9      0x1536019b      0x723536a0
+       0x25a6b487      0x2db59f88      0x7746718e      0x0cbf4fe8
+       0xe632ceca      0x3039f430      0xdcf6fb51      0x573d18cf
+       0xb4cf7b89      0xea361eef      0x85f75a46      0xb77f2f71
+       0x55d2d1a3      0xe8e4d3e9      0x17932aee      0x3e42d407
+       0x807fead7      0x27c406c0      0xbf6cbdf9      0xf13b9496
+       0x20fbfdb1      0xa4b6e59f      0x1bb32d9f      0x758dd09c
+       0x27d79394      0xa1c38206      0xc9ffa516      0x8f143420
+       0xa7a954a2      0x15e24879      0x4157d333      0xdd08fe8c
+       0x7f8f4c7c      0xd9929f79      0xf08c56ae      0xa89ccc7a
+       0xa4512c38      0x4ca4810b      0x1c61701a      0xf3c85c94
+       0xbf07823b      0xf757db8c      0x28e3dc21      0x249065ff
+       0x5a64d769      0x8d6281c7      0x2d058499      0xd8730aab
+       0x808506c8      0x720c3a2d      0x817dff34      0x0de91ab2
+       0x7d93c64a      0x8849feee      0x471f53a0      0x07aa5a0e
+       0x5f8a8da1      0xda8888f3      0xf2e18c3e      0x57abfbde
+       0xcbd09b52      0x587b1a74      0x643d5a15      0x7395720e
+       0xb2189014      0x37b43781      0xa1841e74      0xcbf7f9b2
+       0x9d9304d0      0x1dbf98c5      0xde999d02      0xdc1753a9
+       0x69160a3b      0xaf3519d4      0x0c866572      0x5130921b
+       0x5c6881de      0xbc1bd626      0xe2b955f1      0x69948d87
+       0x054b2369      0x20f9ffdf      0x480b0fe9      0x756ffee9
+       0xc0771524      0x7e6aabc8      0xf7500779      0xf13ea1ea
+       0xb67c8e04      0x29366e64      0x841a3277      0xb7eed14e
+       0x0589cf6e      0xcf893298      0xfff9adff      0xb70798ff
+       0x062db27d      0x5f6a647c      0x083bfc45      0x3e18c09c
+       0x36febc70      0xe36a0092      0x7d493db6      0xdaf466de
+       0x979f8206      0x1cdebec4      0x3cd78f6c      0x4fb52a20
+       0x874bfd02      0xf59240a0      0xa95ac48b      0xcd89c378
+       0x298099c8      0x52ab614d      0x48278ee4      0x8f16c49b
+       0xe9a16134      0xc36db612      0x51d2d2e4      0xdbfa3c70
+       0xbcb42a2f      0xc16f2b27      0x4246c14b      0xdcb73b13
+       0x1d1dc6a4      0x002e5926      0x6708e93d      0xfc3aba78
+       0x90f75cc7      0xcf937c0c      0x9cba6d7c      0x6d3fb343
+       0x0674f7bb      0xf9b34e66      0x93be5de0      0x78ba46c1
+       0xb194b20a      0x0fef85b4      0x1d3ffd61      0x7badb331
+       0xfda07586      0x6731dc9e      0x675da1ed      0x0ba561a1
+       0xc0425299      0x1e4baad7      0xe3d32df7      0xc8b37cd9
+       0x0c4c44ba      0xd5da35ce      0x68cbeea2      0x3e387b81
+       0xd4ef03df      0x3e3a3bfc      0x1ad8316a      0xb6e40b8e
+       0x0ca7e866      0x6a6cd5c8      0x97665bb7      0xae5952ab
+       0x5cb5e9fd      0x27c81a79      0x3f75d956      0x701fc9d7
+       0x093378b8      0x5985d0d9      0xa9935020      0xde7b61de
+       0x3d9dc834      0x54a5095d      0x9fd6f41a      0xe4d9c24a
+       0x51b1b8b6      0xffc2ff47      0xe6685ed7      0xa5fd8248
+       0x9e18046f      0x289e9a2e      0x09f657bd      0x482cacb2
+       0x4dc32fd0      0xf9b458a0      0x23027c36      0xad32d113
+       0xc5036fb1      0x6b2a8e3a      0x3eb74ccf      0x77b4c572
+       0xecc8d2f8      0x92f44900      0x90048b89      0x9cce0583
+       0x6dcdfe85      0xca040af3      0x61df87cc      0x5beddace
+       0x11877f8f      0x512943dd      0x21e2bf44      0xb7517252
+       0xc9785d37      0x5d2b9a4e      0x13e202db      0xcd3a137f
+       0x0293505f      0x41ec9a3c      0xeed2b586      0x183b40bb
+       0x14c48ee7      0xc2876c20      0xcd7dec3c      0xa459edf6
+       0xdd67d9a6      0xf706894b      0xd9818e07      0x8a461cf5
+       0x15adfd23      0x7cb4cd17      0x39aa1f7a      0x4df5d26a
+       0x840f184a      0x9686d301      0x31d29c9f      0xa7180296
+       0x965002c6      0x3e9544a5      0x1206f370      0x75c18c0e
+       0x57912849      0x053fa29b      0xffd30572      0x2e6fbd99
+       0x17eb3a5f      0xe18c6318      0x2d07ca7b      0xafbd5771
+       0x58fb3970      0xdbf048ed      0x718e0239      0xdcc0b959
+       0x22273bd4      0x1f8f1eba      0x62fa54f1      0xe056c81e
+       0xe3a51e11      0x5dc1fc3d      0xa8e39e23      0xce488068
+       0xed91ea12      0xcd3ccd6f      0x7046dca6      0x337a781e
+       0x688269ef      0xa4668369      0xbd83be39      0x347ba242
+       0x19d996b9      0xdd0fea66      0x23f9b272      0x6a16d880
+       0x728089a6      0x5e5bdd31      0xed31e22c      0xceb72578
+       0x79ea1871      0xf0b3c9ce      0xdb305b7b      0xb54bf9a3
+       0xcfa7f7f3      0x40e28548      0xb803bf79      0xff547750
+       0x2fa6362c      0x9b1d1389      0x09b7495a      0x13cb10ea
+       0x9ad42dbe      0x37aef678      0x12530cda      0xeae3e2e0
+       0x65925024      0xc6de6ce8      0x1ffd7394      0xfb0f2364
+       0xdc169b6c      0xb76fc725      0xc6c3a74e      0x78d79ee5
+       0x730a3ef8      0xd7a0ec86      0x42d7a185      0x66428e6b
+       0x1094381c      0x845e1941      0xc4b1a33a      0xf0925496
+       0x1ed09d84      0x1ecff42e      0x1e3387d4      0x37d647f5
+       0x5936e0c4      0xdb4f3ef0      0xd38b44f3      0xd5149695
+       0x06047449      0x837b50c1      0x421328f9      0x1bd9ded5
+       0xd784284a      0x0f5d63aa      0xb326ce4b      0x3fecef33
+       0x75122695      0x6f30c185      0xa29f84d1      0x39f76a0b
+       0x9443b53c      0xdc90f13b      0x70047cfb      0x67f6c4f1
+       0x1ed2d922      0xce38688f      0x3f141c9d      0x0d4f91d3
+       0x375ac756      0x482c7cab      0x90fbfce9      0xc3490ae0
+       0x3a69cebd      0x6d099850      0x91c349e6      0xf526002c
+       0x5896d0e2      0x6ac50c7e      0x39dfdbe3      0x7c40fcc3
+       0x379cad28      0xae961cf4      0x6a758433      0x841a4d85
+       0x63861939      0x0a946680      0x6da8701e      0xd550bdb3
+       0x201496f2      0x62ca33ca      0x7ae7bf3e      0x198f5463
+       0xb22fbd34      0xdd39f70c      0x25263379      0x9e95c66c
+       0xd84bf5a5      0x2b9aded9      0xa6147b6e      0xb89c2b3b
+       0xf8b10abd      0x3003ca93      0xcbe94d2d      0xd9617213
+       0xa931de10      0x33f1ebfe      0x23fe0186      0xc24d7340
+       0x5d614af4      0x6cc048e8      0xac818a18      0x52fa7af2
+       0xa09419be      0x2b7c82f2      0x770ee19f      0xbc7e65a8
+       0xbbbb8a4a      0x6d146b52      0xbd6211e6      0x15c7da07
+       0x0cf2faea      0x8b2cb87a      0xc916bc44      0x6d66d212
+       0xb5968598      0xb3e99615      0x347947b9      0x87492f23
+       0x3eabb960      0x2b91e737      0xc0c9b619      0x766f8e74
+       0x25b476f6      0xe3a24df7      0x23f981dd      0xc9fbf78a
+       0x0af89fe4      0x45738d27      0xd489af00      0x5c061815
+       0xd12b2164      0x57bfbd74      0xbfef9b7d      0xeb511275
+       0xd2898c5a      0x06be111b      0x4731a2eb      0x456b42a5
+       0xb2cf1dda      0xfc4deace      0x7be324db      0x9babddb3
+       0x01a14e3f      0xf7ffaeb1      0xb04125b7      0x9b7b86d3
+       0x9c5fa4cb      0x9f797971      0x854823da      0x2022e056
+       0x0a8ba859      0x8a1934d0      0x619e7f51      0x0f4fefc7
+       0x54afe297      0x2393e4ab      0x719b8926      0xfce7747a
+       0x771f92f5      0x006e53dc      0xffcb61ff      0xac5a4741
+       0x43d4b5b8      0x7728b3cf      0xed066443      0x99c09a5c
+       0x8f42a70b      0x5e51ea91      0x187fccae      0xec4dac4f
+       0x07d0e8b3      0x16fcc343      0xb0590a64      0x8d649106
+       0x1877d52f      0xb6e45491      0x10d0ac72      0xaf06409e
+       0x3f9cf640      0x5413ddc6      0x02a31403      0xd288da1b
+       0x32847b74      0x8622b38f      0xfcbc1c7d      0x148985a3
+       0xb6344b5b      0xaf7eb8cf      0x3384f1fd      0x8a4d913b
+       0x3172065c      0x23bb59f6      0x3c2fc870      0xf4c76793
+       0xfc5aa31a      0xa0ee8d53      0x85efb8a1      0x72466119
+       0xd7a3d404      0x22f99ce9      0x97d0f88f      0xe4e07da6
+       0x88163c96      0x051b66c7      0x6eaef0ca      0x75f52358
+       0x9f3178f3      0xf5bd5fd4      0xfa6c0e5c      0x780729b1
+       0xdd39de9a      0x31780770      0xc584ce18      0x71ecd3a7
+       0xe82629d0      0x2e7a76a8      0x3a2dd546      0xb1237f4b
+       0x7487891e      0xcecf432d      0x58265ae3      0xe194d5a5
+       0x3aac66ef      0x6b4bd7b5      0x323a3d50      0xd01e60c1
+       0x699457a1      0xcd489c34      0xe4adced4      0xd34cb642
+       0xb94a4d62      0x80887b89      0x8ea234ac      0xfc88385a
+       0x8c146f06      0xae8777f4      0xad46cd3c      0x401fed10
+       0x8467748c      0x41c40b78      0xbbc37f38      0x18c84e06
+       0x4945938e      0xa2908255      0xf687f4ff      0x2e732e2f
+       0x1cdfeded      0x92fffab1      0x7ebc780b      0x979889b7
+       0x8489f724      0x3945b49a      0x7aee3355      0xbb674afe
+       0x828780af      0x971413eb      0x0902a6af      0x042c45df
+       0x7f4af12e      0xe5f5249d      0xe25468e3      0x97818fcf
+       0x1451cae4      0x30062b26      0xe8630a7b      0x8368771e
+       0xbbc6a3bc      0xefc83f27      0x4934280a      0xabdfbd97
+       0x1feea1ee      0x9f7897a1      0x6156bffc      0xdd8b58bf
+       0x76395beb      0x7c338f9d      0xbc83133e      0x3dad63ec
+       0x35742863      0xe1a1d456      0x7f5e7be6      0xd0a82ccd
+       0xa7b16e9d      0x725b7f04      0x1339b223      0xe3e47cc6
+       0x83cec424      0xbf3f0513      0x90d0f35a      0x8488188e
+       0xf5c34eb7      0x7c82bc37      0xcc18d1ab      0xb443dfc2
+       0x8493c257      0x7900420f      0x558a7c66      0x520148e3
+       0xdbc027c0      0xf0bdce00      0xab02c2bd      0x80599ae7
+       0xe620de2c      0x57c571a3      0xc5174627      0x2fde78b6
+       0x9e01c562      0xf1bfe2fb      0x4d7e6cbd      0x2c56832c
+       0x8fd80c09      0x3f55416f      0x3fa0fcff      0x483ba427
+       0xc3ad39c4      0x5c408df6      0x34f755fc      0xcf3a5b6e
+       0x4874f343      0x7c3a9bc1      0x5a4b01c7      0x4b31d661
+       0xb50e957b      0xb2015fc8      0xfa64a6fe      0x6a082854
+       0x4843c2d2      0x0c0571ee      0x45440895      0x75c11e5c
+       0x212f11e3      0x88f95e34      0xfb266b4b      0xf0ddedd0
+       0x8974aef7      0xd0fc9e68      0x1bd8add3      0xf682e0e7
+       0x812b5c0d      0xf80b04e6      0x6daf3553      0x14b781e2
+       0xb8a82efc      0x1329ae71      0xe82a99b9      0x79049efb
+       0x76e72456      0x85f4eff3      0x87c9c832      0xb91c8318
+       0x6ca9b268      0x8148b2a7      0x8510a526      0xbf2cd1a0
+       0x347d4302      0x0b461b0f      0x544e2e94      0xf164b15e
+       0xd1c77890      0x49852d4d      0x6c843c90      0xc4ffcb5a
+       0x498c8fc9      0xc84ce753      0xba759251      0xa8c79423
+       0x52342dd3      0x0f8e0153      0x37b28a54      0x7902ea4f
+       0x8b525eb1      0x87ea4eca      0x76957985      0xc6bd5dd6
+       0x663d215e      0x09ebbd86      0x39c9926c      0xdb36c2c3
+       0xa11cf17e      0x7eb4d71c      0xefa5a070      0x78dc513e
+       0xc3f162ee      0x5b84a5da      0x206a3d2a      0x27f8f48c
+       0x659748c4      0x7ef8623b      0xbdf27ebd      0x3dfec3c8
+       0x90a3b8de      0x5fd6e300      0x438697b9      0xca0c237e
+       0x50cc24f5      0x22561e83      0x5b25c46c      0x2be72162
+       0x0711a609      0xeceb1b54      0xa12431f4      0x09e8916f
+       0x2b6f666f      0x99664c04      0x570ced8e      0xa9a98f8b
+       0x57bf0caf      0x1a745ac5      0xa74c0abe      0xcadd1e86
+       0xd33c0b9d      0x1e9051dc      0xcfccf19a      0x5c2137c6
+       0xa867c560      0x936836fb      0x0f23b44c      0x738bf270
+       0xee440dad      0x4e391beb      0x314caed7      0x1aaa607a
+       0x415bbbb7      0xc04a2145      0xc9702577      0x39f63162
+       0xa10b9b1b      0xaf3c2d1a      0x0f72e304      0x51a79bbc
+       0x32d1995a      0xe34a9575      0x9bdf9dba      0x85101f2a
+       0x9d8276b6      0xb8b879f7      0x0ae3ca65      0xe3d66918
+       0x80aa293f      0x43d82c64      0x393deec0      0xab56cd2c
+       0xdddc8a45      0x1267081b      0x295f8dfd      0x767ab942
+       0x115379c6      0xc5a4585e      0xc07a66fb      0xe45c5d75
+       0xb1a842ee      0xa9236277      0x9770c838      0xcf9c4134
+       0xe16c0094      0x38f0ea9e      0x57b1eac2      0x8e6fcb6b
+       0x7f0d3305      0xe774ef92      0xbd5503c8      0x97c8e8ec
+       0x975be29d      0x146418cf      0x3a3adaa1      0xff5ef035
+       0x723accc5      0x66aff96b      0x380204df      0x47587815
+       0x1aa400ee      0xa08ceaef      0xcaee738a      0x16f03cdf
+       0xe4256ac2      0x135739e8      0xde31864b      0x82cd4032
+       0xc5265659      0x9604a7da      0x5d8afd1d      0xaad5ff28
+       0x1c00e2a4      0x1581833b      0xa968b62d      0x8b38d1b3
+       0x593410ef      0xe7e8a71f      0x1e1c9fb6      0xf925cbbc
+       0xdd3e85e8      0x3b3aadd5      0x84d9f74c      0x581eb7eb
+       0xe63cfd53      0xff75c2e3      0x013c6dc5      0x0ae97c86
+       0x7cb6d0c5      0x6ec256b7      0xe8b4eb84      0xd96b8306
+       0xe36a96c5      0x2e7b1b9a      0x6a49a9cb      0xf28e3f2f
+       0xb41a1c16      0x375eeaf4      0x9a9dd4b7      0x8c32449e
+       0xe622e795      0xab519da3      0xb2d48b0f      0xef484cbf
+       0xd5864f8a      0x2e393970      0xdbb14998      0xa8c1a6fd
+       0x6112642c      0xf5870498      0x3a8230be      0x54b4bb44
+       0xfc88a620      0x29fbfd7f      0x5801330a      0xd78180b0
+       0x6521f702      0x3f3e78be      0x86a68549      0xf6c5986f
+       0x9def0e3c      0x9e55bf81      0xbf0bb5d3      0x712547de
+       0xc2d5d10e      0x9b675f25      0xae6a4781      0x91031255
+       0x6143136c      0xcf05f24b      0x61695810      0x1bcb6f26
+       0xb9e6ca6e      0xf678e6a6      0x4df61b82      0x87c54c86
+       0x2505beac      0x118b81d4      0xfca2c297      0x4b7a4453
+       0x8ce182ad      0xf10f4e80      0xf99b11c4      0xc5f5caa3
+       0x216d0e58      0x3db50acb      0xbf96e2ab      0x618fa2d1
+       0xb38f35a2      0x0f0f74de      0x8dd58c72      0x00d9b368
+       0xfe320abd      0x49b6ec6f      0x4030acc2      0xbef8a356
+       0x2bd9bfc5      0xef8dbffe      0xf13b0244      0x00188161
+       0x25406dd2      0x2f4f3b56      0xf203c447      0x0a1fb4a6
+       0xc2334ae2      0xb9e4053b      0xdd5c2ebb      0xbdc81af9
+       0x3e263722      0x92c82d89      0x0a58d018      0x0badb1ac
+       0x1a4bd0bf      0x0b865ec3      0x5fddb3f5      0x7153dbbb
+       0x2c97c00c      0x86037016      0x36b52725      0xd6e0def9
+       0xd837759c      0x07531fde      0xc680b671      0x30966b39
+       0x934fa92e      0x35ca8826      0xd1c24287      0xc0cdccef
+       0x8192b827      0xc1af2fed      0x98cebf84      0xc04d894a
+       0x2118989b      0x564e4b30      0xcffb342d      0xd0da699c
+       0x7aefca3d      0xb83d950d      0x8a8ed0f9      0x7ef0b8a2
+       0x2f84f600      0x0611e9ea      0xf35eef74      0x6e9772b4
+       0xefc0dbe9      0xa21a7716      0x460e247b      0x94837360
+       0x55237b02      0x90cec742      0xf0678d6d      0x5dec7e87
+       0x5a851a95      0x6fe8198b      0xbfb9d8f1      0x95f301d8
+       0x4ad12482      0x8b6d3161      0xec76075b      0x86ce5788
+       0x0bed2394      0x6951b46a      0x718d9222      0xd4c095ee
+       0x601a6a12      0xf29fc33c      0xcdec895d      0x2246a903
+       0x436a9939      0xd04706b4      0xd60feeb9      0x3f1ca1ea
+       0x899ba86b      0x20d1dbb9      0x10ba8e23      0xf2072cb9
+       0x2c196fa4      0x43771b0c      0xcbbc9f73      0x67508afc
+       0xfd73af1f      0x6fbc312a      0x8bc64a14      0x03acba7b
+       0x7e8df10b      0xf8cc4ebd      0x0ee3a40e      0xc41665bb
+       0x3b6ab57f      0x36e15963      0x4c995096      0x5ec9e1fd
+       0x615c80e4      0xae174d53      0x24f02023      0x234d7be1
+       0xd843e2c1      0x38f04f48      0xb737dd73      0x6c4abf98
+       0xa0c250b7      0xd6e1276a      0x9ccbd1f7      0xd220e1d8
+       0xe84ad760      0x8c8e7b85      0x05a8e087      0xd3af7af5
+       0xd63d7b73      0x41dc53d0      0x173b1805      0x1a8292e6
+       0x2e5efaea      0x09a26302      0x44574882      0x925c5b49
+       0x6c9d4585      0xbe6e6701      0x344c5d7a      0x31f138d2
+       0xf4747381      0xb6acc603      0x7409221b      0x1c326479
+       0x0c5ff2de      0x0b736e2f      0x7ed9ec3c      0xc0cd899c
+       0x31d35abc      0x2273ecc8      0x07abfa00      0xe9de35ae
+       0x3a1c9f3f      0xd26041a6      0x35f9ea8d      0xf1d83b6c
+       0xfd1c4592      0x61a951ef      0xbee8a672      0x45381d14
+       0x7dd69c43      0x01c366f8      0xa6ccdab8      0x1882f58b
+       0x8d59cc58      0x4a09c9f1      0xd736634e      0x0558b347
+       0xaf9b4711      0x61e6cdaa      0x32632483      0x5487d992
+       0x237f49e2      0xefd0e0f2      0x7dcf0e32      0x70f61400
+       0x63773baa      0xc650192e      0x580ad366      0xe693dddb
+       0x77b85837      0x2e40ea78      0xc21ca746      0x445d70e0
+       0x8624ebe8      0x7024de3d      0x7cb47e65      0x2190aa52
+       0x2f065d3a      0x83c321ca      0xb7fd28f1      0x5af8cd99
+       0xc7668eac      0xff944a06      0xef3b6fcd      0x27596de4
+       0xcb47335e      0xc6764e25      0x1da450ee      0x11033a43
+       0xc4b6613d      0x9333b968      0xacf9c56c      0x811955a2
+       0x97c36cc6      0xf7d1a167      0xd444df3c      0x8be97e7b
+       0x4bceb48a      0x36b72f60      0x7e468e7a      0x6512aa67
+       0xea90171f      0x0fca7605      0x47ad8dea      0x4e37457e
+       0xe2cdcb3f      0x4c37177f      0x765af06f      0x7bc40e00
+       0x07c42553      0xd7080699      0x427d7a9e      0x0198c797
+       0x1ff1f142      0x895a24ab      0xb8c244b8      0x9efdcfe6
+       0x3f51da58      0xd8c589a9      0xf3d2799f      0x2144e2cf
+       0x67024f6b      0x6b8d7b7b      0x9124fcf7      0xd85918f8
+       0x689cdb05      0x391478f7      0xccc51204      0x0eb5602b
+       0xf6ce4b1f      0x62359edf      0x22c7d65f      0xf487e7ef
+       0x0581f150      0xdb1682da      0x820c8de7      0xc8bd9662
+       0xa4b44927      0x54f052d6      0x6e36da6c      0x5236de3b
+       0x033b779a      0x453b5329      0x5623f6a0      0x932bd405
+       0x23b8ea2b      0xb12cdfb6      0x75a58619      0x30ff7414
+       0xce0d2b7a      0x8116a90c      0x9a3ab506      0x85b458f6
+       0x6ef7fd0d      0xa3347c26      0x677f5d8d      0xa49943d2
+       0xe7d0451f      0xc5a2344f      0xbd93baeb      0xb602539e
+       0x67eb6c3b      0xb49f9d0b      0xfb1e5678      0x2227adf1
+       0x85d0aeb1      0x9186533b      0xfbed8d1a      0x982393ce
+       0x3991dfe6      0xa46b85ba      0xfa66fc1d      0x7a08974c
+       0x1ebac9d5      0x81e389ed      0xc9fdef00      0xe245f8b7
+       0xeaef6ef1      0x9869d841      0x49605657      0x79484187
+       0xe784d76c      0x2048836b      0x08d186bb      0x71e1c341
+       0x8672925e      0x3a92f29d      0x63511a07      0xe5b99c9f
+       0xf1390106      0xedb7e533      0xe3810327      0xcfeae39e
+       0x3543a1c0      0x4035f741      0x6a0e6e5b      0xa992edf4
+       0xcd5075f3      0x5aa0588c      0x1156081a      0x2e658154
+       0xd9d802fa      0x307100ba      0xf551fdce      0x3ac37a44
+       0xd12d492a      0x60fd1a36      0x0de5da06      0xd1566fbb
+       0x5ddacb3b      0x58154da7      0x5cf2c397      0xba7b2f62
+       0x99c49d68      0xc62621ed      0xccdb1ece      0x011ebe69
+       0x6e089b29      0xd994627b      0xbfbed610      0xcdafbaf1
+       0x528085c6      0xad428c6b      0x4f161e6d      0xb679f4fb
+       0x6a4c28fb      0xc507e998      0x8676cd92      0xc8a46ebe
+       0x1182919b      0x21f8de23      0x5787fb73      0x88f1e5a5
+       0xdce59fa4      0xfb3bcdaf      0xbaba656d      0x2fcc5b3a
+       0x2c034c87      0x43b672c5      0x9648b968      0x8960ebf2
+       0xf9a4536e      0x235e54ab      0xf3355fcf      0x1ad9631d
+       0x91ffbd7f      0x24178b15      0x6741ac6f      0xce41b802
+       0x46fb00db      0xf9916002      0x25d7bc7e      0xaa260863
+       0x696ec48c      0x8fc4c555      0x8ab04e22      0xfdab9946
+       0x1860a1a7      0xa54b2749      0x866eae4e      0x0d2960ce
+       0xd11b2ff1      0x35a30836      0xe0e977b8      0x7a1b0cee
+       0x3798eaed      0x043d20b2      0xbab6f830      0x143620b6
+       0xba51c31a      0x97d71294      0x67aa7e3b      0x82377a7e
+       0x64ecaf0e      0xe88947d1      0x81a520ae      0xdcaa9b97
+       0x02620cff      0xe48f7d0f      0x98f41ed3      0x4f176760
+       0x17b3d315      0xb5622b46      0x41e2d4a9      0x39dd3a8e
+       0x44005aca      0x417a4b70      0x88dc7def      0xcfd427f5
+       0xa2a728a5      0x07946606      0x8c1d8be5      0x14460fae
+       0x78ac2a44      0x589583ca      0x3742ede8      0x9f2c5d2e
+       0xe64ce0c2      0x86ab899c      0x21a5c3ab      0x8726195c
+       0xe75e2f14      0x80806d99      0x41b041a5      0x35cb36ec
+       0xec62882e      0x8c03147d      0x365af3be      0x5c798fe1
+       0x47be4bf2      0x3e8c84b0      0xa718d0f2      0x8b7e1ef6
+       0xbfe89676      0xa0252b85      0xee3e6cad      0xf4fce8ab
+       0x24951aff      0x2a352a61      0xd2a74ae7      0x1dfd5343
+       0xc15702cd      0x33486702      0x7ad81d76      0x38ab7636
+       0x0c7f4c95      0xf4094ee7      0xb99baa10      0x77cb9d3f
+       0xd2161629      0xba35abcc      0xe9611023      0x66cbe446
+       0xff956a02      0xd71625b7      0x89db7f99      0xe697f643
+       0xed4272c7      0xa6651c16      0x7477c7ab      0x1815fc23
+       0xc475b6af      0x652f761e      0xfc9e3230      0x0953cf95
+       0xf87d8ceb      0xa78a341f      0x4c6fb1d3      0xfce381c7
+       0xd0cdf3a2      0xd96c1310      0x3b1f32da      0x66699230
+       0xdd8fa942      0x4f99eae5      0xecb6f129      0x64e1ce70
+       0xde40daf6      0x3f295bc0      0x76aa3066      0x3a228445
+       0xbc4c5910      0x309aed06      0x20fc3956      0x7a9c6582
+       0x98f3c114      0x13996295      0x620dd144      0xe11bec57
+       0x0cd0bc65      0x7fe3fe69      0xd59bcdb6      0x05f2b5cb
+       0x20bf1ffc      0x3898ad90      0x0e42fa17      0xc697b4b4
+       0x594ec2fe      0x34aa0c86      0x0b79c42c      0x267e6ed2
+       0x29f55757      0xd6ffa5d0      0x155d861c      0x0a71f478
+       0xc048e6ff      0x381b2716      0xdcf4874e      0x73ff9095
+       0xb94331a0      0x8a6e4b25      0x1f5f0681      0xbc348b6d
+       0xa96a67fc      0x392140f3      0x869c68d5      0xc22ad0e8
+       0x9d1d8c92      0xc1879dda      0x1d996cf2      0x24606e73
+       0x4c34247e      0x4de6c562      0x51e2cbe4      0xb7bd266b
+       0xd11bd794      0xa31c2cfa      0xf8463471      0x6e19c4f3
+       0xc800068d      0xf06e8679      0x8b03ad40      0xbfaa42a3
+       0x98b1042b      0x01a1433c      0x51119333      0xcfefb50d
+       0x33197716      0x5f4b5198      0x9045452f      0x705f8baf
+       0x3143b8ac      0xd1a97568      0x945fe0d1      0x9eca20fe
+       0x944320f6      0x8364d909      0x9e837057      0x270dd85f
+       0x464e1cbc      0xf8a096e7      0xc82abe62      0xd9f20af7
+       0x3c3678e8      0x232f4829      0x919f0bfa      0x361fd9ff
+       0x9d645eca      0x81f28a57      0x953bb917      0x3bb21f02
+       0x17160c9a      0xfbdbe204      0x34952372      0xe24e2feb
+       0xcf946f11      0xd573ba3a      0xa9d15745      0x1c6d7bcf
+       0x877bd4c8      0x150119ee      0x9103a2bf      0x44070992
+       0x5a3418d2      0xecd4c8bf      0x7e7a8fa6      0x11f4e04f
+       0xba9069b4      0x71b77487      0x3ba09dc2      0xe4bde5a1
+       0x20e3611e      0x98d8647a      0xb78c7046      0xde91346f
+       0x68ffb9b4      0x7d01b221      0xf779cc1d      0x27b35ff2
+       0x0ca094de      0x19befae2      0x36b66504      0x338a990c
+       0x2b50e06e      0xc2066c0f      0x819abe30      0x628baedb
+       0x2bac03f9      0x4e477b68      0xa297fb12      0x35d4540a
+       0x30acc8d7      0x4090e4f3      0xbfac512b      0x7f4340a6
+       0xf01b5a5b      0x877e9140      0x44d87f50      0xd874d7f4
+       0xad9801d9      0xeee50e0b      0x0cb32eed      0x9400e0d1
+       0xd8ac5a17      0x27bd037e      0x7cba2a3d      0x2a3951d5
+       0x8f25428f      0x4a605d41      0x16f489ab      0xbc799c85
+       0xbc69b822      0x51b315ce      0xe74603a4      0xd0c0c52a
+       0x092474cf      0x3ce4f32c      0x9fe627ed      0x7d20a42d
+       0x1adf5396      0xdfa06d63      0x13cb8d88      0x7662cb37
+       0xa95f4c87      0x424102a5      0x8dd27019      0x873d08eb
+       0x615a6652      0xbac7f0cb      0x5fb19bf8      0x221331a9
+       0xca573b32      0xf8550c24      0x40be12b8      0x1094694c
+       0x53fa3885      0x99b40ca2      0xfa6eac06      0x3a9a479a
+       0x421fbabb      0x770221ef      0xf34bae93      0x846eec91
+       0x34fbf8a7      0xa08f3c79      0xd2d784bb      0xb81c5306
+       0xbd479e8b      0x9dfbed60      0xbc375a3f      0x618f10c1
+       0x82146d54      0x98a4c283      0x6200b4e1      0xe90e920c
+       0xa57a25ce      0x5921a075      0x19004d24      0xaa3d1c31
+       0xa9185a87      0xabb99eee      0xbb657b87      0xf975d31d
+       0x342cef63      0x75bc7574      0x9e4fe8ee      0x23a2836e
+       0xda9e131c      0x18492ee8      0x6643425a      0xc8b5cba3
+       0x468eb004      0x7aaa857e      0xcd503368      0x1607235c
+       0xffe96110      0x1596128f      0xcc1ebf3b      0xeb46d018
+       0x5b05336a      0xce241af1      0xcf71cbea      0x491db611
+       0xef516c09      0x4fc4e1e7      0xb2762ba4      0xfec8cc8d
+       0xc0d243c6      0x64aa0029      0x59ec36e3      0xcbc12453
+       0xa6af3186      0xa36d80de      0x7bd57003      0xb7c1d83b
+       0xc6faf4de      0x4e57b3ac      0x3854c0e6      0x9cde6e92
+       0xf7be88f8      0xf99bfc54      0x81faba59      0xe2e98a84
+       0xbb648cc5      0x5fb76295      0x0764a71f      0x442db4c1
+       0xe8ff003e      0x03466725      0x1eaefd90      0x50321f63
+       0xf644e2e6      0x6d534da8      0x6dae2669      0x81dc8bfb
+       0xfff6073b      0xa86372ff      0x0ead4d0e      0xf11714df
+       0x4e9705af      0xf608fda3      0x25729bfd      0x5db11661
+       0x5ef3cfe4      0xcc146a88      0xf91ecc3a      0x50733fd7
+       0x3cf50543      0xde49cdfe      0x611cb9cb      0x93ea5a66
+       0xbdd95966      0x2ccc917a      0x19d1ee2e      0xa2b5aef9
+       0x241cabc1      0xafdfc7f3      0x80895cb4      0x48c93472
+       0x038ba423      0x3c5f258f      0xc15c2ad3      0xd26cf152
+       0xa8f00a7a      0x7c430545      0xb8eaab99      0x5c3d449e
+       0xee42eb2a      0xb1961033      0x9cf87c89      0x21145d40
+       0x81a037d2      0x38e40261      0xbd56bb28      0xf9e8dbed
+       0x46514c0c      0x3b97a0da      0x944f86d5      0x77c9999b
+       0xdb87d7a8      0xc03ce15c      0xdd3269d9      0x5fb76adc
+       0x65cfb61a      0xc8152ae3      0x0f0d5f27      0xb5585e2c
+       0x4744d600      0xe4385327      0x5c89f731      0xe1096acd
+       0x5d8fc264      0x093f63e5      0x2d3c19d7      0x5cebc066
+       0x1f0655c7      0xc1395fff      0xc40f0c11      0x56016d53
+       0xaa383e0c      0x5db7710c      0xe6be574c      0xaa2be895
+       0xef0dce09      0xa8240a4f      0x9c5a33e5      0x7be3a281
+       0x2dc5c082      0x9ae1dc16      0x42a49f6a      0x3e24b386
+       0xb7c923eb      0x497593aa      0x1cd99918      0xcb000c44
+       0xa40b0763      0x9719e9bf      0x9eedafc0      0xf493ff35
+       0x55ae26f7      0x3cd58778      0x68b59e30      0x1f4697b8
+       0xbe0f10ab      0x35f44468      0x9da6c1cc      0x365e542f
+       0xb02409be      0xdea3f90f      0x36df462d      0xe4eafba8
+       0x03dcde13      0xe57a1eb4      0x47ca29e9      0x818c952c
+       0xfc34a27d      0xa170b2d9      0x1ce39622      0x68244a2e
+       0x371c7726      0xeb077fff      0x4eb089a3      0x395c64aa
+       0x9756b333      0x68da35ff      0x43dbe173      0x2ab61b97
+       0xdbb99ec2      0x972cb31a      0x250aacee      0xd5f6e367
+       0x246d3c8c      0xebf892a7      0xd3769f8a      0xf6321d4a
+       0x8951b942      0x7130e776      0xda497251      0x5b04bb53
+       0x40758cd1      0x70d1c6da      0xe8dad90c      0x65f403c1
+       0x24b0d323      0x588af410      0x92b835be      0x8377f84b
+       0xdffdcd3b      0xb9d59608      0xafed6cf2      0x173e9dad
+       0x5aff2885      0xdf79aeb2      0xbfd84988      0xc7cc7459
+       0x7f06424f      0xf9474eb9      0x0809e3e8      0x2442d5d7
+       0xa21b3e56      0x55875de1      0x9806a895      0x351f212e
+       0xa57e1a51      0x68f04da1      0x2a84e833      0xe27b77a5
+       0x3ca3292b      0xa61a1fb8      0x49740b7b      0xbfb5569c
+       0x1046bd22      0x5b476ee0      0x6296a26a      0x357cb225
+       0x40da65e8      0xb325f52d      0x629dd277      0xb24242de
+       0x56d51cef      0xe71fb9bb      0x76f7eb8a      0x0259cfc8
+       0x4cbbe47a      0xf1237f7e      0xf5fd440a      0x8984d330
+       0xf2daec44      0xad9db68a      0x3d52247b      0x00cf4338
+       0xafb80404      0x98c1df9d      0x74d3aea5      0xdd756dcb
+       0xde16a5c5      0x242e270d      0xb751ed97      0xd5caad99
+       0x2fb67de5      0xc85683a1      0xc32777bb      0xc6dd06c9
+       0x1e6c342e      0x3f211514      0xef96a291      0x19bcdf8a
+       0x58cd072a      0x6f9de153      0x38418da4      0x0527e346
+       0x8355e14a      0xdf92720e      0xf958b32f      0x190145ef
+       0x1745190c      0x0285e8e3      0x7b6b7aa5      0x544ef530
+       0x9d5296b5      0x3f5e113f      0xa5c85c4a      0x1e8a3c6a
+       0x935dab20      0x6858d152      0x4618ed8b      0xa2a137b4
+       0x7b08d9dc      0xa6d60f47      0x357fbaca      0x449351ae
+       0x99f91683      0x24a56e7a      0xee480687      0xdbe356f2
+       0xa5ee5986      0x37463d5f      0xd44bebe6      0x46cd2c4e
+       0x5445d044      0xccd76946      0x8923790c      0x7d136437
+       0x4a330ae2      0x415689eb      0x2f61d0c8      0x3d16fe12
+       0x78efadba      0x8281fea0      0xb834b5df      0xa9fb0d25
+       0x70d7bc60      0x140e82db      0x4d41874a      0xc20aeebf
+       0x5512fadb      0x0329ff4f      0xc837fc56      0x2966e442
+       0x60e9272f      0x5c274f74      0xa1b7c7d9      0x1a455e99
+       0x252ab092      0x8eb3342b      0xb8f3942a      0xabd4e1ea
+       0xf4544aea      0x1a613b41      0x9e98b5a6      0x82bef7ea
+       0xbe465e94      0xac1f3d52      0x191ab8e8      0x047cc1c5
+       0xd418ebfa      0xd6638536      0x31d8d719      0x0a1fdb7e
+       0xe7555120      0xece47d38      0x69cfc4e3      0x5f96de68
+       0x87eaf094      0xcded6048      0x0180d5f3      0x291186a5
+       0xb0b29bd6      0x82459eb7      0xf85f79b4      0x822408c3
+       0x83d75e39      0xa3288963      0x1d5e50bc      0x48bb63a1
+       0x156ba375      0x44cb00cf      0x7ce58e27      0x10f2b467
+       0x5d246aa4      0x6bd8bbd0      0x816c152e      0x3e5eee98
+       0x44791155      0xe6ddb7a0      0x12bc6e0c      0xd93be5eb
+       0xac98a9f3      0x3988215b      0xe1aad8de      0x3d978c7b
+       0xc0e6d8a8      0xd9cfdd65      0xb93e2e9e      0x539eaba3
+       0x2c7f4f92      0x05a1f15c      0xbdbcfc9a      0x9aa52400
+       0x3df183c3      0xfb3655ed      0xf9596b88      0x01286991
+       0x429b807a      0x50806501      0x6e5a4966      0x9efb7597
+       0xbd4c57e8      0xeafa1a6d      0x8903d162      0x7bb40d8c
+       0x423f899b      0x33f873d2      0x82487c9a      0x2d7f72c1
+       0xbdde0886      0x358dd6e4      0xf9144435      0x83780cb9
+       0x8d1b0ff9      0xbab38bce      0x8914fba7      0xc6a57afe
+       0x2f946753      0x9cd6d258      0xfc8dcadc      0x0e8dce12
+       0x87411620      0x58ca5b04      0x686f7ea6      0x89e8f315
+       0x4f3de4c6      0x81e09d6c      0x40e60225      0xce6e0584
+       0x97d586b9      0x5ece30a8      0xc5dbae59      0xa3821324
+       0x420799ae      0x2307200e      0x7b5689a2      0xd7a61685
+       0x9fa7f042      0x854c1b08      0xb78fc244      0x6980c696
+       0xd5218ad3      0xfa259d5d      0xec0df961      0x5b956c2d
+       0x6dd986be      0x63de9edb      0x18be4cc2      0x6499b8c2
+       0xba41cfb4      0x38e3aaa1      0xd7cfaaa5      0x13182793
+       0x68b21f98      0x9b2db84a      0xd9aa1d69      0xfafa3520
+       0xe5fc7365      0xb71f70aa      0x3d959892      0x46950845
+       0x0e35a6c7      0x1d356229      0x664d9ea7      0x85e7b139
+       0x0c0a288d      0x219f5dbc      0x354b6862      0x2e08b2d6
+       0xa04cdfa0      0x1c0c9535      0x3c7b382e      0x75741964
+       0x6c3a4da1      0xd36c4560      0x1c8aee89      0xb0776546
+       0x333e78b0      0xe8e0015b      0x7b5f5416      0x84a02be7
+       0x538f045e      0xdf512ed9      0x87860bf6      0xae791e66
+       0x051f3632      0x774ef031      0xbf64967d      0x74e3f460
+       0x824be685      0x39aa94a1      0x921e59dd      0xadaea534
+       0x9198c5e5      0x6fba31d9      0xa4a37005      0xbf054ccf
+       0xf5b2a9fa      0x9de511f1      0x2acacb40      0xbae1b52f
+       0x1cde721d      0x32b05dc3      0x0d119372      0xdb5cf890
+       0xd345e8ac      0xac335030      0xe7af918e      0xf6ee2b7d
+       0x004f636e      0xd068b99d      0x615c97a6      0x10236e8c
+       0xdd58f2b1      0xf6bc1e23      0x3f11d896      0xc30ea16e
+       0xa5004ed4      0xc7405f8a      0x320646ee      0x8b7d9a9b
+       0x5b4fc5e6      0x51609d94      0xb833d2d6      0x3c75f456
+       0x786be713      0x035a3105      0xabef806f      0x17788e0a
+       0xde88134b      0xaf029542      0x58fa003c      0x052c1f84
+       0xf37dde54      0x52fc32d1      0x96b72579      0x9dd1b0e0
+       0xa4a39564      0x8aed127e      0xa47c630b      0x388e786c
+       0x54f9d309      0x1910ef02      0xb59425ed      0x026cfa61
+       0x6e0f95a0      0x3ebec1bb      0xaa89972f      0xf70c867b
+       0x4201d9b1      0x8c573cee      0x2310ead1      0x82249efb
+       0x62a322f4      0x873eb079      0xabce9df4      0x996c6f78
+       0xca0f3ff9      0x75698aad      0xff5762e6      0x4e52ccdd
+       0x40689a6a      0x257d8355      0xd90ce88d      0x16809385
+       0xdb41d890      0x5d5c0f25      0xfa7b0543      0x8cb8cb05
+       0x811b1779      0x62ab96aa      0x84e6bef8      0xe0f7e758
+       0xe7e52cce      0x5ebec748      0x9b68ad1c      0x1362c049
+       0xbc5cde27      0x68445b32      0x35117d00      0x741c982f
+       0xe254f07d      0xce0b9466      0xb6940a37      0x6559d627
+       0xf324c0c8      0x101fcde6      0xb9731c06      0x71a6e9e7
+       0x18b9143e      0xef938ba0      0x74c23b69      0x99bd8ad5
+       0xf77aaa12      0xea095a6c      0x0d108239      0x3f6cdb99
+       0x3dbfa345      0xf0334210      0x026298cb      0x4804b3b6
+       0x38b7cc2e      0xbc386020      0xf09f2756      0x0447e4ca
+       0x9add32d8      0x25389b9c      0x2749f04b      0x9269f823
+       0x33d4ebbd      0xf3ac8dd0      0xef63c582      0x521aff63
+       0x8e0d75c8      0x920e7cbf      0xa6fcb2bb      0x27c00509
+       0x4b37a1f7      0xfca11e3c      0x331e869f      0xcc3fb236
+       0x07e7c054      0xe97554d3      0x89bea7cd      0x488db07a
+       0x8fb18918      0x3aa3dade      0xf257738d      0x68eb51f4
+       0x03c4635e      0x90300007      0x3dccd582      0x0ced580f
+       0x2d99a51c      0x1299ea42      0x798a3b7e      0x91b52c3d
+       0xa8fc9be9      0x4bf7c900      0xbe332555      0x555e4742
+       0x2b5d4ae8      0xa91f5e85      0x244776cf      0xbf54f159
+       0x0d0b10ff      0xf0616048      0xfffd60ac      0x4004016f
+       0xb5280641      0xec6dfcd7      0xc5db16d4      0xd3ed3319
+       0x4a991c5d      0x3a72e0ad      0x624776bc      0x6b2a46a0
+       0xc8a04e73      0x94e8cce5      0x76405dc4      0x14d6e67a
+       0x97aef6fa      0xb779a41f      0x90cc1391      0x1cc168f7
+       0x33b87c53      0x44aa57b8      0x3fe7d204      0x6727e569
+       0xf9083a86      0x181d935a      0xabda2133      0xff7784d9
+       0x9808d117      0xf89ba19b      0x8d27632a      0xf96fcd9a
+       0xc7a2c826      0x686ed065      0x066705e1      0xf30580cd
+       0x0e84642b      0x66330ea9      0x3a526904      0x5450a3ce
+       0xee0ede87      0xf37940f4      0x68746ef4      0x813cf9bd
+       0x67e297f3      0x19e7f602      0x51d7c429      0xe3d3b4d3
+       0x06955ad9      0xbf2b1c4c      0xbc090d0b      0xca870e3b
+       0x5314e9d6      0x459e2f44      0x246c1ea5      0x341cbe56
+       0xba0d09dd      0x042310bf      0x77c0bba2      0x08993ad0
+       0xef12acff      0x7ed654fe      0x7fddd922      0x846887f4
+       0x966891f9      0x36136123      0xb44850c4      0x6e195454
+       0x50e04902      0xb2715177      0xa2b41fd4      0x5ce22c86
+       0xdff8b6ce      0xfc554058      0x0e2935cf      0x9eca9263
+       0xaa96f95a      0xb09e52a0      0x7b27970e      0x623be3d7
+       0x6bdef7e1      0xe495efca      0xf744c829      0x3aba1bc3
+       0x8d56b59e      0x44759deb      0xbfb30205      0xb9cb3a1e
+       0xbe6461b9      0x39654447      0xc42dfd3a      0xb5a79f79
+       0xc4a90b9a      0x4f01a59e      0xcbb71c35      0xa31d22ce
+       0x49bc206a      0x6e04046e      0x8ee74197      0x97215f67
+       0x034db94e      0xc11eb716      0x1459f3d0      0x9b14b5ee
+       0xc45693c6      0xcb2c182d      0x3565d2f4      0x7ee32c58
+       0x58dc30f1      0x8630c6d2      0x719010ee      0xbe012e71
+       0x8271a456      0xed652511      0x882f40ce      0x4ddf02d7
+       0xc67a8e0a      0x4811c88a      0x72cee120      0xa08fab13
+       0xca3a64bf      0x4e5a1278      0xf912ba7a      0x393c008c
+       0x1cb7080f      0x07a469fa      0xa8f74a4f      0x633eac50
+       0xa41a0c86      0x72f0ffc3      0x1c6bcd6d      0x4f7b5ddf
+       0x6c481d42      0x8bf6e5ba      0xd574503f      0xceed8e8a
+       0xb5f6d809      0xf37b2260      0x24d1b6e9      0xc85044dd
+       0x95f5677b      0x9d6b1640      0x45328493      0xe5253a77
+       0x49a7cc7a      0x8d9be125      0xde28f113      0xa7d7795b
+       0x7fb7d42f      0x069f3287      0xc1fea02d      0x698307d2
+       0x5a3e7c2d      0x278e7f6a      0xa18d5f7d      0xfbdb9ea8
+       0x8fef2832      0xaf9f309e      0x2fcd2656      0x4b50c851
+       0x98fad9d6      0x9a44a31f      0xbcb0e851      0x3a85043a
+       0x24e82166      0x051b1dd0      0x7f89a562      0xde1bc7c2
+       0x1eb95680      0x429433cc      0xac6c5f6c      0xafbc3411
+       0x79bf3735      0xe2048733      0x14a2afc2      0x80069a16
+       0x30d483db      0x58742e73      0x6fc8ad56      0xb503881a
+       0x8f141424      0xc8167c63      0xbd277b7f      0xfac019d4
+       0xd0ca6c57      0x5f5398f5      0x2f45edf7      0x9144cf57
+       0x23f3a679      0x5a64dd70      0x35ee3e79      0x1b7d6b5f
+       0x48c9639a      0x1bfacca6      0x9e089b85      0xfa65c048
+       0x32f4730f      0x5f2464f0      0x4df941bf      0x6bd6f2b7
+       0x05292b73      0x320af866      0xe828ac00      0x3af499ea
+       0xada16128      0x432f4299      0x01dcc1a8      0xc56f07af
+       0x7d84f35e      0x46be77d1      0x7270a955      0x496f4d42
+       0xd90dc01d      0xa2e77cea      0xc5a966e0      0x3c5b9adf
+       0x37e08155      0x6d52cbec      0x52feb4f0      0x4f2a7434
+       0x1fce299c      0xf6d188f8      0x53f4af1c      0xf89e8b9d
+       0x3993aac7      0x8cea8f26      0x2ee2090f      0x1619d4d2
+       0xe45da14e      0x94d55488      0xf4c6b2d9      0x826d3015
+       0x7af57189      0xf6ace4ad      0x2f46056b      0x915037b4
+       0xc2222334      0x55b796cc      0xb65a044c      0xb2fb399f
+       0x8ce60200      0x6b37f137      0x26fa3366      0xbe302fbd
+       0x9277949e      0x3cf1c345      0x3841c52a      0x2e3a7512
+       0x3130de1e      0x7961d00a      0x88c9b862      0x5a630bcc
+       0x43e7d5f4      0x928f5358      0xf5c34089      0xe92d42e0
+       0xaed2fffd      0x094ee05a      0x7274ba00      0x75a9f3b2
+       0x6ef65875      0x7d00bc88      0xc609d7b6      0x8e90c34d
+       0x241833e0      0x5d2ba7f8      0xafb64328      0x9df08520
+       0xf0eeb551      0xad42d417      0xb8e17033      0xf851c449
+       0x29b19535      0xff7d0fc5      0x2b30645d      0x92ace5c5
+       0x4a66a2b5      0xadcc90ad      0x7b29189b      0x038c5470
+       0x88d32f2f      0x312882c8      0x985c5602      0x7ee684e3
+       0x28c09d9f      0xfcaf86df      0x230feb68      0xb56f0671
+       0xcf591176      0x05ecf079      0x638c253c      0x28736801
+       0x20b8a3f5      0xfb1b1f2f      0xb4385544      0x53348dbe
+       0xfc2c878a      0x711999e7      0x659d946a      0x1521af64
+       0x0812e71f      0xc8203d37      0x29a7f5d4      0x958f34d8
+       0xb6cbed8e      0x4358f076      0x2a423f75      0x3c356d5c
+       0x197f3fee      0x032a0d70      0x56000bc5      0x027fa2f7
+       0x8eb13b65      0xb89d6266      0x8493e74a      0x11b1eeef
+       0x2ef00f51      0x03e757df      0xfc2c1678      0xbc6e9977
+       0x9a38df8e      0xcd11cff0      0x2c269834      0xb997958f
+       0xb32ff8bb      0x9bcff1cd      0x801dbce5      0x9768f02f
+       0x38231c6d      0x338f7b3c      0xf12cbc4d      0x60e9c44e
+       0xaa09ce8f      0xd6b58269      0x75ff5b6e      0x7039abcd
+       0xf2cb9471      0x1093a2b2      0x618d39f1      0x47a7752c
+       0x862e26bc      0xb8600cd3      0x0ce5a0b3      0x2afae97c
+       0xf0053c3d      0x2e4003ab      0xa672060e      0xf06a2be6
+       0xb97f0b4b      0x92375a88      0x037bcb1f      0xfd9a4b01
+       0x15f8f271      0x9a9d186a      0x3ce6d235      0x2f1d18c3
+       0x126a57e5      0xb1b44c87      0x78948684      0x843898d8
+       0xa79e8665      0x222947ca      0xecb9d548      0x10d7625c
+       0x4a3695a5      0x9ea5b48b      0x01299640      0x7951fb14
+       0x4dd34ffb      0x1c654f92      0x8970cef4      0xdca89d00
+       0xbff56ca5      0xda5c53a3      0xd860080b      0x58fb736d
+       0x8c61a830      0x1a12dbd8      0x42b588a4      0x779da738
+       0x3e92ee98      0xabd14a57      0x276193a9      0x48cbd267
+       0x4c126241      0x665d83fc      0x2078bb6f      0xd3848b9a
+       0x53b7f977      0x2edd260f      0x6b477827      0xdd7ebce2
+       0x2c044944      0xf091ead1      0xa39aba93      0xadb6ad6d
+       0xa02ad5bf      0x41ab5d42      0x375224c7      0xf42f3e7d
+       0x1c0b528f      0xc3c2d705      0xe7c09e2c      0xea2fe19d
+       0x85bfc53d      0xfe2b0e47      0x94df7ec6      0x7ab703ec
+       0x407d00e6      0x47d61156      0xc0b7527c      0x98a3480f
+       0x91061b8e      0x8d52a8c9      0x7126ba2b      0x55f44b5f
+       0x98e1d428      0x7dc3d2e5      0x1e4c1d39      0xf5feeb85
+       0x28f76e4b      0x3822f307      0x054a14aa      0xf267738e
+       0x34a65fe6      0x2b1757f4      0x6beeffbe      0x350b4c49
+       0xb890d208      0xbd8e0a6c      0x673b7408      0x42894542
+       0xa3a87f72      0xbd39c48e      0x8d306798      0xaa9b91dd
+       0x1aeece30      0xc00883c8      0x01803861      0x54f91e34
+       0x45981e4a      0x8b818484      0x0332e964      0xf918582a
+       0x99c4f34a      0x890afaa0      0xc6f6dc3b      0xa9271d74
+       0x5a8453de      0x5e92554f      0x479bf1a9      0x7c6f8358
+       0xaa0b8bc2      0xa5199f81      0x94a91e08      0x30008ece
+       0xfca46e08      0xb519aa53      0x4a341f4b      0x60698887
+       0x1e00cb4b      0x8905ccbf      0x87fcd005      0xe6049bc2
+       0xe8264448      0xfa2fe06b      0xae981189      0x2c40f71a
+       0x51011676      0x80a7ce52      0xebe83473      0x33f6e6fc
+       0x7673fdcb      0x7cac2b00      0xd3256641      0x5f2a9578
+       0x41cc8670      0xdf5f662c      0xd42c59d7      0x4564e3de
+       0x62a51e7d      0x9ed383a2      0xa2fa5977      0xd7b906f5
+       0xbc1af102      0xa2cb35c3      0xe596af48      0xeb584e54
+       0x8df8da61      0xbbe11869      0xba5e3a67      0xcbfa3acc
+       0xa432523f      0x98ec0105      0x0c4d3f23      0xe839e993
+       0x3d380d3d      0x8501b0b1      0x233ed8c3      0xd67e434d
+       0x6b56fef0      0xfe376708      0xc2ea0f72      0x9f8dcc30
+       0xac2c85f0      0x35283c61      0x22e354c4      0xb6a15eb9
+       0x6f237d7e      0x8f6ebbeb      0xda1a2754      0x648647d9
+       0x07404cb4      0xaf22c410      0xf14018e0      0x0af8cfa7
+       0x9faaa273      0xe60a36aa      0x056e738c      0x719a0d68
+       0x09ce5c5c      0x692fa9e5      0xafe860d9      0xf595c31d
+       0x0de5bcf9      0x7df5ee42      0x5d53d0d1      0x3313aa5e
+       0x78ba479c      0xcb33cf99      0x217b1838      0x18a19803
+       0xa8c1c26e      0x282aa101      0x5f2bd95c      0x7089f922
+       0xf061de08      0xd4b41ac6      0xd7f696fd      0xb40b0be3
+       0x3f152cb5      0x2efb8244      0xd704a6af      0xe7556418
+       0x6846f530      0xba3b5fbc      0x450ecdcc      0x98f656fe
+       0x3fd2bf30      0x4ff4f378      0x7da84334      0xef205a74
+       0xb1611f37      0x40d6418e      0xeeb3fa8f      0xf316ce17
+       0xa52c51d0      0x7f05d21b      0x705d8557      0xc2555ce9
+       0x669eff19      0x2894092d      0xb8232046      0x5e23fe50
+       0x34189bd5      0x0ff4ef8f      0x7a7a1e52      0xe801f840
+       0xf452159b      0xa55d67e0      0x582552c1      0x9c22979b
+       0x046c821f      0x6d5e4c26      0x31173819      0x43793399
+       0xb125da6c      0xa3ff301f      0xc2b336bb      0xee8946fb
+       0x978ee873      0x9400f42b      0xac4ee454      0x6e5763c5
+       0xfd1a8190      0xe67c691c      0xcd9012c9      0x1b3c8bc9
+       0xc83d9eeb      0x8a2b8818      0xc130bb2a      0xb3b84e6e
+       0x9da3b263      0x2b2bbe17      0x82892688      0xa4e415e4
+       0xb34abd61      0x199ab6b6      0x7a98c614      0x82cbd39f
+       0xe6fd92c2      0xc34c59d2      0xdc1b98da      0x260667db
+       0x85e38107      0x06f7fcfe      0x694ec698      0x536b8a72
+       0x2c520c3a      0x3a635176      0x75cf01cb      0xe49840c5
+       0x26cb9b25      0xe14e4656      0xb78fa730      0xa52107f2
+       0xb2ab5e5a      0x039cb57e      0x86d19969      0x35a3d367
+       0x10ef5a1d      0xdafe5c52      0x2b1641ee      0xb1003ede
+       0x6f9dfb48      0x552de3b2      0x42f6481c      0x265e4243
+       0x68f80be8      0xab240b69      0x1040ba15      0xa4f537c1
+       0xcf902312      0x7e87036b      0x24908e7b      0x317fcff0
+       0x11ece36b      0xdfecefcf      0xae6d315b      0x6b755b77
+       0xc16fc4e5      0x94a2d8f5      0xb256249e      0x3e195cbd
+       0x51921ffa      0x4fe77749      0x7dba7c6e      0xd1d204a4
+       0xa1eeb4eb      0xf54d8122      0x64df07ad      0x7b4ff6a1
+       0x2c15619c      0x8e06336c      0x58807c29      0x8f91e547
+       0x57c7fe5e      0x9cd6dc5a      0xcb196fe4      0x0f8bbc9e
+       0xa4fe9a7f      0xda247b8d      0x46219462      0x04030f72
+       0xe9278418      0x1c357565      0x415d5bb5      0xc6969fa9
+       0xe5408809      0xe1993b26      0x7e50ad6f      0x0fab56c4
+       0xe561f44d      0x3dd422b4      0x3718be1f      0x4e3c1589
+       0x341494e8      0xb1e17790      0xd5a4aab1      0x132ffbe3
+       0x5dcfa00c      0xe492eb3c      0x6ef3d999      0xa3b15e11
+       0x2382a161      0x27fd8575      0xc2f47571      0x2b6e8acf
+       0xf16eafa8      0xe0a4d3de      0xf1ac66c7      0x3f344de3
+       0xa21f3ad5      0xa16dfb14      0x98b8cc07      0x3f835cc2
+       0x88522657      0x728c8017      0xd5ce1855      0x950d3c49
+       0x3ecbda68      0x20d59694      0x7e4ecee9      0xe7b6948a
+       0x6e40d777      0x5cc5bc4d      0x940563ea      0x847719c5
+       0xf1c3e4bc      0x90b7078a      0xeeb9ea16      0x4d70ea7d
+       0x2de86bac      0xe9d44bc7      0x8d5d5f83      0x337be334
+       0x8709f043      0xfc548262      0x7c288102      0xe306c122
+       0x4c3706cc      0xccf4e0e0      0xe0e139ad      0xafcd392f
+       0xd6d46889      0x22ac5b40      0x40630668      0x46e0364e
+       0xe3fc723d      0xf2244f2f      0x23b9ccdd      0xcaa416de
+       0x491512f1      0xb81e2a55      0x6a4e13cb      0x68a92102
+       0x1acb5d35      0x9dd4b349      0xbc79a6ee      0x53486c8e
+       0xc0b782c0      0x38ba5b65      0x083856ce      0x8bbc8166
+       0x832ae44e      0x6d1a7821      0x9440a2b2      0x50856005
+       0xd58acb6f      0x8458be69      0xb5e3e12a      0x8fe5c418
+       0x2bab1868      0x5fdce26a      0xb055b5b5      0x3347963c
+       0x01778244      0x94632954      0x0bd2f410      0xeea46465
+       0x5f2e6606      0x3d3b5b8d      0xe22cf626      0x22b05fe0
+       0x985a8242      0x37f05e43      0x081f8f7e      0x48160fe0
+       0x7b31d3c8      0x9131115c      0xfdd4d60f      0xe49b7cbf
+       0x8d1c324a      0x03dcb09a      0x4b075ec5      0x2161f6bb
+       0x22a73927      0xa03df0b0      0x3312f32a      0xef29918c
+       0xb4f45af5      0x08d7ad75      0xe3b10cf6      0x9f038cff
+       0x38187cff      0xe6b8640a      0xe25e6816      0x09f360e6
+       0xe723e6d8      0x3e54a97d      0x839833b2      0x50870a6d
+       0x15d28f5e      0x1502d9a6      0x09e3a446      0xf384e317
+       0x0b52d1d8      0x7bdac6c2      0x9bcafa94      0x6130a3e0
+       0xaff0a77a      0x455e3f06      0xe7ec673d      0xb6fd34a4
+       0x79586f9f      0xf8a774f1      0xbefe2e7f      0x0c1f366d
+       0x723ce30d      0x9ef5c33f      0xe6291746      0x928494a4
+       0x8f36fc92      0x00b4cae2      0x2662aaaa      0x14025de3
+       0x6ca2e231      0x465da855      0x7dcbaf24      0x438ecc22
+       0x6405847c      0x39bd34d8      0xb9102808      0x52adc27c
+       0xa436b8a6      0x1c8e9627      0x7c514a11      0x2c95eaed
+       0xf3d78737      0xcd70b289      0x00ecae75      0xf48a5c2f
+       0xcfc314ae      0xd4d23c1e      0xbd3611c8      0x41dfb4b0
+       0x09321b0b      0x49d323c7      0x0ac45ced      0x92d8a2e9
+       0x45649117      0x38289144      0x98b60c78      0xefbca700
+       0x8385eeaa      0x150d1d18      0x9fe76248      0xd040677c
+       0xae640755      0xa27263db      0x0bb183c6      0x3cc9e42d
+       0x4395c88d      0x358a8380      0x7e123cdc      0x6cf3d1f9
+       0xfdc6215b      0x949ee303      0xf417ac31      0xc3b90a56
+       0x9ecba65a      0xbfa39c82      0x834a7416      0x2872d073
+       0xc7e45f1a      0x5e265a4f      0x57dd0057      0xda31d555
+       0xc2e3125f      0x154a94ad      0x7a257e54      0x21afa615
+       0x1bf7d2e2      0x9c53ecf0      0x03644304      0xfb272d9e
+       0xa1308603      0x7b6a6995      0xa7b53c52      0x99785141
+       0x717ec8c2      0x90a3a34d      0xaf773803      0x13149c46
+       0x84969711      0x650bc0b2      0x090e7282      0x5f5b52f0
+       0x317765d4      0x1eced54c      0xcdacf3fb      0x1a4d998d
+       0x96dbe788      0x2c83c1c1      0xc3c6060a      0xb47b022e
+       0x7f0a2461      0xb2c6833f      0xa28ef21e      0xcc7f08cd
+       0x6276cab2      0xf2c28561      0x3f8a341d      0x0dc2ce23
+       0x5a7c6095      0x0de2c81a      0x30b2396a      0xdb9f1abd
+       0x77aa1c88      0x0b1a58d7      0xeb65b5a2      0xe8a8c26d
+       0x1fd13326      0x98f9b8da      0x0b60d4c4      0x283d53d9
+       0xf2c85b54      0x959abd77      0xc1402998      0x82ec4bf9
+       0x2b2822f3      0xdc3e5b73      0x4f9b363c      0xf0de3afb
+       0xd4058608      0xbe225786      0x08ac049c      0x810c38b7
+       0xfa275712      0x8a3b3b18      0xe2014f37      0x9d7e84cf
+       0x837430fb      0x9d268d6c      0xdacfec30      0x4de714e2
+       0x651d1443      0x83868ebd      0xd35f410b      0xa8189c28
+       0x6eef00e8      0x133eb94f      0xff511292      0x48f7eda0
+       0x586f5a01      0x1f35a55f      0xdc739391      0x5643e66c
+       0xb203ce9b      0x02da8c64      0xd33f419e      0x9d3dded1
+       0x1894ece5      0xe3044813      0xe30856ad      0x981090e8
+       0x449a75fa      0x4741c87d      0xa3eeb1af      0xdebed7bc
+       0x63d36cf9      0x0c662c7d      0xded8eae5      0x462cc7e4
+       0xedea5e09      0x18de0808      0x2d45caae      0xaeb97a8b
+       0xd77e497b      0x96290389      0x629bf169      0xf6e6f176
+       0x7b824f3b      0x456d5afb      0x3ec297b8      0x02f66afc
+       0xb06732d1      0xfbc15c02      0x31cd5d46      0x8d5f6836
+       0xaf8458b6      0x63dff3a3      0x6a6778cf      0x6ccdd64c
+       0x384945a6      0x9edea46d      0x441a7d5b      0xa36fa901
+       0x713e66bc      0x1d7d2c95      0x465f8ec8      0x00940a0b
+       0xbd5193ef      0x2183dc17      0xe580206b      0xc31829b9
+       0x552b9c22      0x4cccc102      0x3e4c999a      0xbddf5759
+       0x46818e3b      0x572278d9      0xd5d472b9      0xbf44051f
+       0x5bcd9d4d      0x18b150c4      0x579b4f53      0x8e2d2284
+       0x3d59efb5      0xbb29d05c      0x8142d678      0x3e4e009f
+       0xda9d9683      0xc7624dc4      0x3c21df4a      0x5bcc17f1
+       0xff19d9b1      0xdb4c6d42      0x45c43a0b      0xa1901783
+       0x88dd43ea      0x3fec2821      0xb37ea79d      0xc48fed64
+       0x7ced3131      0x0ab60cbe      0xaaad69bc      0x5b8e0945
+       0xae8a56fb      0x5966785d      0x9ff02083      0x7b032ce6
+       0x8efed925      0xbdd319b4      0xb46a1dd7      0x1ed4a73d
+       0x679394d1      0x692e3cc8      0x1dbdc2db      0xc0e1f4e9
+       0xe86c32d5      0x0cde1e9e      0x14c7d904      0x57b0b968
+       0x646914fd      0x70984932      0x1d6e5da0      0x35ae3ce7
+       0xc6b4b7da      0x3b103957      0x4ee8ea6d      0x3498c59c
+       0x09ac5c5c      0x600f9a79      0xe74fd1cd      0x3b273adc
+       0x4aaf4eae      0x664e6213      0xf828611e      0x3c7ec70f
+       0x2105ad64      0xf16f02a9      0x7daf897e      0xdc3e4c8c
+       0x14f49242      0xaa03a96b      0xb3015ffe      0xd1213cac
+       0x82a51c21      0xe1859816      0x249d328c      0x7bd8a3be
+       0x1874e84e      0xbf8ace44      0x8c052f76      0x591b6e4a
+       0xc712e62b      0x350ebc97      0x330fc6c2      0xed4a2318
+       0xc260d922      0xe66421fa      0xdecf6bbd      0x69537478
+       0x8a4f6c68      0x7e33740d      0xb5c79fb4      0xe42fc7ea
+       0x64986a83      0x4af721fb      0x4228fbff      0xe00db003
+       0xdf9c785f      0xa833bce3      0x07a39f1c      0xa09077ae
+       0x2c24872c      0x00ddcb5b      0x61689e74      0x019b570a
+       0xe62fc616      0x6048d96c      0xe0879492      0x9f20adc3
+       0x750238f5      0x00b30a8a      0xed16556a      0x7e0f2660
+       0x04cde130      0xc48b7090      0xf6867ff0      0x9bcfa048
+       0xcdc389df      0x15782910      0xa7fb9c4d      0x5df2ba44
+       0x57f5f6cf      0x116e9d63      0x3a2a34fd      0x69ffb436
+       0x4330770c      0x2623b655      0x92aa0610      0x146ed3ed
+       0xe4f33f7f      0x12480673      0x791f1af7      0xe374c82b
+       0xbc591988      0x73e19e74      0x4a692627      0xacb6599a
+       0xb9e364ec      0x636b8fed      0x57aeeb35      0xdde4c110
+       0x3d32b541      0x2c8ce305      0x1cbbb467      0x17e21691
+       0x234ec6a4      0x5c2ab507      0xeca83639      0x81132994
+       0x63cd6d05      0x52c7c0eb      0xb24bb6fa      0x6ca949b3
+       0xe612b60c      0x637af946      0xa5eb9c8a      0xd8abf616
+       0x5a3cc348      0xe2e97af2      0xc9404712      0xd18bcf2a
+       0x8c2a45d0      0x5e6e0fbe      0x9fbd894a      0x86641a1a
+       0x1540f11a      0x33bfbdb7      0x8411fcfc      0x2e028d1f
+       0xa8eec52d      0xf8b4df05      0x6d95227b      0x67ee103d
+       0x1e82ddc7      0x29bbcfde      0x846d2c98      0xcbb0b4a2
+       0xf7d4014b      0xf1bf579a      0x31d8c825      0xdb8e5ced
+       0x5fedd954      0xd34461d9      0xa30b43bd      0x270892e8
+       0x39a0f23a      0x0294ac24      0x4b3f9eef      0xd1bde6c7
+       0x19a2253e      0xef39ad0a      0x25667125      0xdc1f8783
+       0x60663a21      0xea9a2dff      0x2b9b70ed      0xbda0f119
+       0xd2bcc1ad      0xa6a3c214      0x7e110a63      0x03054fea
+       0x38869655      0x665c6db5      0xb2e1598d      0x4af4544c
+       0x9d5ad473      0x2813f572      0x5b34d77f      0x2b6a4991
+       0xc02d2724      0x57aab26e      0x1e73ddd0      0x6876174a
+       0x26b216b2      0xfd47c5e6      0x7637487b      0x83dd88c5
+       0x84ed74a3      0xad0fd5af      0x7e54d329      0xb81f89c3
+       0x096e31b0      0xca82055e      0x93fdd796      0xdde95e3e
+       0x270f28c0      0x75e430ba      0xfbfa701d      0xcdaad076
+       0x88f75410      0xd2f285ac      0xe7bb7afa      0x217cca34
+       0x612f28e3      0xa8216d4a      0xfe499570      0x3a0f2239
+       0x1d5822df      0xab511a4f      0xc89c8fc1      0xf2363058
+       0x8db8c643      0x1a41f69b      0x91b92d7b      0xc3b594c5
+       0xeef08b27      0x0ed4fd46      0xd1249b98      0xae503313
+       0x42ef4416      0xb5c0c3e8      0x77badf2a      0xfc4d2592
+       0xd03a8c29      0xfdcd34a9      0x5751fb68      0x10e9dbab
+       0xea38b7c7      0x47013225      0x5734eeb1      0x664b9965
+       0xdfdb5b24      0x42544b2b      0xb0368177      0xcdd7fd65
+       0x0245a4d3      0x583c1178      0xb1daf428      0xaf7363fd
+       0x454218d7      0xfd349719      0x518a639f      0x725e0f31
+       0x0414577a      0x967e7d0a      0x555969b4      0x140e85e8
+       0xe3938e1b      0x70ee21e1      0x86b18f76      0xe8108b69
+       0xe3ae5493      0xf27ae045      0x873ace86      0xd48fb78e
+       0xe7eddaa7      0x2b88f431      0x221a5d60      0x61c01e66
+       0x82cd0a4c      0xd3e9dc97      0x266c18b4      0xfc585350
+       0x0f120ef3      0xc4a24ad6      0x7f02152e      0xaf47f02d
+       0xa9ce53b4      0x0f55b1f5      0xb9ec47da      0xcd673d94
+       0xc4b60fe3      0x5f56bcbb      0x05f115fb      0x63444136
+       0x8e588685      0x9555fbf1      0x1bdd435c      0xe188dde5
+       0xe9738b16      0xfb2ae508      0xb2d9d78d      0x796982c7
+       0x9e875155      0x60147d37      0xeb317502      0x92c29986
+       0x639170af      0x56da3868      0x9912a537      0x9b63618b
+       0xedfa5898      0xe151fb3f      0xcbd5427e      0x3d6dcd3e
+       0x811273ad      0xaa90ba33      0xdefafb01      0x009d7449
+       0x295ef072      0xd8b67355      0x529a01c4      0x74ca4584
+       0x866664ea      0xf8c8b458      0xaa4ab16a      0xfe988c59
+       0xc58d072b      0x54119dc2      0x50358fd7      0x54983d5a
+       0xe6c15754      0x726a5f16      0x0ebe004b      0x9d623abb
+       0x6c88eef7      0xcc851413      0x4307feeb      0xa5da6e33
+       0x8457b842      0xc8a7332f      0x8951c594      0x0aaa4bb7
+       0x3accfc82      0x4864f9da      0x56483d4e      0xc46053e6
+       0x018c47ef      0xa279c96f      0xd1f3d3c1      0xd0b203f5
+       0x35052ba8      0x70b32239      0x1df89081      0x7bfdf671
+       0xc7996b1a      0xd5ed7557      0xed503f8b      0xc557f81b
+       0xd048f722      0x554e29c1      0x936b0699      0x8aa23925
+       0x4b3c7a7d      0xfabd4f21      0x2c02b0c6      0x5b8009f5
+       0x0563c1a1      0x898aa452      0x73b29ce7      0x798fd3d3
+       0xc5dc75be      0x7599dd0e      0x797ffd6b      0xccff6ec7
+       0xdf73d8a9      0x8d1334b8      0x52710c43      0x6c0a7dcf
+       0x9e855916      0x709b1835      0x1b44d0c2      0x22d8bb03
+       0x12dc9286      0x5d2b739d      0x52d469d6      0x540d1947
+       0x25f75edc      0x3fea9589      0x8dfe2007      0x892d4f25
+       0xe67129d3      0xc358b651      0x4dc9b1ea      0x25761253
+       0xb3098396      0xb068cc53      0xf8c8bf22      0x48e27cfd
+       0xeaf19f48      0xc8a40778      0xaee9c616      0x0024a40d
+       0xfede7631      0xad81dada      0xdb8cea60      0x929c3442
+       0x250399f6      0x51f1c010      0x18ef9559      0xfa27cfbd
+       0x163d0c03      0xd575a689      0x4d4594ab      0x6bd8bf94
+       0x329a1f8f      0x81beacf4      0xe5af6537      0x737d254d
+       0xf6bb6bd4      0xe70591fe      0xe7a2c66f      0x58661b43
+       0x2b984d33      0x997f1f4a      0xe394e796      0x40effba7
+       0xbfb54ae0      0x1c7dea09      0xed55d2a6      0xeebcee4c
+       0x75a0fea0      0xb9649edb      0x68a86630      0x5a80f63e
+       0x5e7dcea6      0x1a039cb1      0x22bb884d      0x6e0fc84a
+       0x4b8e4a59      0xcd7367cc      0xb742cfdd      0x8a99aa92
+       0xb2e2466c      0x48b5e5d5      0x8d39a375      0xc925f825
+       0x728073b6      0x56970db0      0xf33dc778      0xf70a3c02
+       0x9f1a4977      0x5d18d43e      0x508ecf01      0xb87cb169
+       0x80e9f7ac      0x578393d6      0x1733c507      0x03cc47dc
+       0x097de77f      0xf3da7314      0xb9d07a2c      0x1420c666
+       0x054564e5      0xab2b429d      0xb5209da4      0x4112060c
+       0xf413eea3      0x93813942      0x6a43af2b      0x1a68b0a3
+       0xdf7a714d      0xa6324c42      0x539e4d35      0x6636118a
+       0x943feab0      0xfb4eaa60      0x93c28171      0x467572a5
+       0x5d4bfd37      0x0caafdfc      0xa3041fa3      0x90931037
+       0xc44810e5      0x0dd66557      0xfdd770aa      0x5847a8c0
+       0x96ddcbd4      0x4b6a4fce      0x9bcd061a      0x3932e8d0
+       0xb69d4a57      0x9af47cf1      0x46736b55      0x29e55e34
+       0x7300375b      0x179a9a21      0x307b0689      0x96ae5d9e
+       0xa853f570      0xf841c73f      0xbd94ac9f      0xa64b9114
+       0x947524f2      0xe38f6e68      0xf1ca7c83      0xce6b034f
+       0xb9fde58b      0xa706e0c4      0xda3996c1      0xecd1f6b5
+       0x161fb63d      0xe5536bc3      0x1c07dc6d      0x2805b076
+       0x0903eb62      0x354107a4      0xe90ff4a3      0xa2054d33
+       0x1f2a632e      0xd03cb8ac      0x1d8f344b      0xc1ec57fc
+       0xcaacf346      0x23acbc65      0xfdf934ac      0x49033711
+       0xc73bc97a      0x5b25c7b8      0xa1ee9a56      0x5a2f95e6
+       0x9b486eba      0xdac28dae      0xbaed0e0b      0x3e6cab39
+       0x2a95e4d1      0xc7a7dd82      0x74348dcd      0xbb95024e
+       0x53bd88c1      0xee00d042      0xb5d577ae      0x6082285a
+       0x484d5a35      0x2d93c0f9      0x9bce2a6d      0xe3955fb0
+       0x428133cd      0x07377886      0xb3797f0d      0xa342fa77
+       0x5834cde1      0x522c80f6      0x7bc9f92b      0xb2237d8d
+       0xaa9bfa50      0xd00b0490      0x874c71dd      0x139292a8
+       0x367145e6      0xba90a80a      0xce06e0dd      0x7cb49f4a
+       0x5bc3e38b      0x4bf1dcf8      0x11213f42      0x99b0a5b5
+       0x0458e96b      0x7c329c9f      0xc50c5e61      0xed935b3b
+       0x2c94aef8      0xd9797f93      0xab1cc1ba      0x8a7dc27c
+       0x2fda9eb1      0xfb865d65      0x9ea8f1f3      0x30a307b2
+       0xc373502e      0xb3bb752e      0x0b609f6b      0x955ecfce
+       0x946646fb      0x76b5f628      0x37a00871      0x7a3da0cd
+       0x0e87e034      0x85500d3f      0x31db1de9      0x30f5832f
+       0xe30224e5      0x4ebec8a5      0x99ca0ce8      0x418c26d4
+       0xa264de66      0xec9ff883      0xb690b887      0xfd29d0fc
+       0x68a93e17      0x3aa30ee2      0x070f19fd      0xd2005cc6
+       0xd47a807c      0xb93ac4da      0xa3726bc2      0x88d58f3a
+       0xa91555c7      0x8437fdc1      0xf462a9ee      0xb2554c71
+       0x4ee039fd      0x361749b6      0x9176114b      0xfb339f0c
+       0x85c474f3      0xcae87770      0x4c2e9f89      0x2e8b9634
+       0x415568db      0xde7c55b3      0xbaa534b3      0xa211d29e
+       0x05e95d73      0x95145b12      0xf1f095f0      0xa16d176a
+       0xdd7497ea      0xa1079a8f      0xb3b445f6      0x04c63340
+       0xcfbeb747      0xcfc12f02      0xa29d4ebd      0x70f97ab0
+       0xcafc8b79      0xdaf6418b      0xd0dd9a11      0xe29dfdfe
+       0x61615382      0x30f4d07d      0x6d0d520c      0x79624ad0
+       0x41b07e2f      0x42fca262      0x97994ce0      0xd1a8e339
+       0x42913134      0x18e4473a      0x893509ba      0xba73d8df
+       0x90e342b6      0x2205f686      0x71f76660      0x41464649
+       0x876b6481      0x06622a67      0xb16962ab      0xd709a0fe
+       0x3f8169f7      0xbc5bf617      0x2ef29aea      0xafbc9dff
+       0xc99285d8      0x1737fe89      0x7d32ee92      0xd841ccd2
+       0xa18eb29d      0xb48aec94      0x039987b0      0xc3a9f403
+       0xa3626dfc      0xfb71f00d      0x9629f7c7      0x612a19be
+       0xf679ca41      0x89745a20      0x5a9767b7      0x124fe621
+       0x55eaa08b      0x7dd29949      0x36850483      0x17473919
+       0xe9a4d0cb      0x36f15505      0xb74c42ae      0x898c4348
+       0x95f6e4a5      0xdb5c4f19      0x0d2c0fb0      0xd5e62865
+       0x98d1822f      0x84fbf5c9      0x6a9d0dd2      0x98a5d7d9
+       0x6b05ec03      0x61e1dca4      0x57681251      0x6bf77c79
+       0x6bd89da7      0x30ea009e      0xb6479a71      0x11e737c2
+       0xa619a10b      0x70b16943      0xce2a3af9      0xf29681f5
+       0xa50db0da      0x2ce2522f      0x64806d0c      0x7e9a0852
+       0x541ca68b      0xf5deba66      0x57e038f6      0xa1fe4d9c
+       0x4a2c97ee      0xd1ccaf77      0xee5aa1e7      0xfcbbbbf1
+       0xc59521e9      0x1d527843      0xbf08121f      0x72d67cea
+       0xdd1c22a1      0x9d0c51a0      0xd3d5cc37      0xc6737e98
+       0x0c33deb4      0x5ae1ea98      0xe3f6bb8f      0x0f9e4998
+       0xdbe9da9f      0x8ecb8d39      0x6b98346e      0x7f229bcd
+       0x4e1e1537      0xa8afb742      0xd58a85b0      0x232f6bd6
+       0xa2672db1      0x05d64425      0x9a351d62      0xa8d4ceba
+       0x28b10a12      0x9ea04603      0xbe969e87      0x238a228b
+       0x6281a77e      0xf22ec5a3      0x88660a2a      0x81dbb399
+       0x07106406      0xf3f8e110      0xb1b909c6      0xe5a86a1b
+       0x0bff6f8f      0xf668d01b      0xe82e9a6f      0x0f7fae47
+       0xbff65826      0xd31668b4      0x51d1a640      0x807cf8e0
+       0xa9e7479c      0x1087538d      0x90c8e4c1      0x9f5bf12b
+       0x50319e47      0x4ec285cc      0xac679b45      0x3a53c86d
+       0xda2e37e8      0x6c42329a      0x3ae623f7      0x00df9e58
+       0xa43a58ea      0xefb494e3      0x2a2ddf62      0x1ae04284
+       0x1088fae3      0x8bfcee8c      0xc85c9efd      0x633cee0b
+       0x95fdf98f      0xa38c4b7f      0x63da55e2      0x4f3bb32a
+       0x51e939d9      0x499af23a      0xc09f5791      0xfd4a792c
+       0xf511d3db      0xf28c1aa0      0x175fcb8d      0x83abc579
+       0xbceca9b4      0x0ab223df      0xde6f2e30      0x16248550
+       0xcd361a21      0xfe901788      0xb2e562f1      0x77ac5ded
+       0xe0d06bc7      0x631c94d6      0xf31d83f7      0x42d22d58
+       0xd8477e89      0x2c610d19      0x520022a0      0xdfb5ac06
+       0xd463055d      0x1857521a      0xaa12bc72      0x3e125f69
+       0x8f409c7c      0x50e55b99      0xa17ac715      0x28d0341f
+       0xdd31dd1e      0x06632b18      0xf58f5ebf      0x69903d86
+       0xa1c5b456      0xa783e4bb      0xc407bc15      0xba9f8619
+       0xcf061535      0x69151522      0x99f5f300      0x8891be7c
+       0x9fd407c7      0x67e56a91      0x47b89f11      0x0afeace4
+       0xe5bc3fb4      0x3c8af0a0      0xb034e54f      0x3d0fae58
+       0x7daf3ee2      0xcfc30806      0xedb46947      0x8f053ec5
+       0x3bc38e12      0xc7405f8f      0xf7be65d4      0x1e60ba9c
+       0x38136225      0xed02190d      0x9142a560      0x59d0c540
+       0xc6b80e9b      0x818b36ba      0x5f63c642      0x4c420bc2
+       0xd5347fcd      0xfb418dfe      0x0bd6be6f      0xcb978de7
+       0xda009d22      0xc1bc14c1      0x63b2cf06      0x6e595cc9
+       0xb0e51376      0xf8e16970      0xe7b14a24      0xc2fc0520
+       0x8ef3442b      0xf8db738c      0x4e19708b      0x2b8e30ed
+       0x6393b9c4      0xfb229c75      0xca190ae6      0xcedfd195
+       0xe75bfa92      0x6e532cea      0x2429aaa4      0xf3b043a7
+       0xc025b207      0x17d66042      0xfc5c8576      0xb298c410
+       0x80710b2a      0xf1b32af9      0x5d63a95d      0xcff13167
+       0x8c5ec446      0xf5927065      0xdc90ebda      0x35126e6b
+       0xc9604d65      0xbb3742ca      0x7e4b726a      0xeb97d309
+       0x7577a1c5      0xfae1831c      0x28297aee      0x395b3ec2
+       0xcd3bf725      0xdb4573f0      0x41f3d4a9      0x316283af
+       0x1c7deed7      0xb478d2d2      0xf379ff50      0xa447e404
+       0x15465174      0x8104e6c0      0xe6880b94      0x89361cf1
+       0x1378a030      0x2e29eaf3      0x911238b1      0x3b66bbd5
+       0x9267486f      0xa58a4d79      0x43f421cf      0x4b74e99f
+       0x4a837bb5      0x070b6cd4      0xdcfe2588      0xf26c612d
+       0x1cb4cf0e      0x9544a3b0      0x81ec2db0      0xdc0b4b9a
+       0xea69a377      0x3fa3c81d      0x576cf512      0xb5991f4a
+       0xa0e39100      0x1b2fc704      0x3ae2ec5c      0xde55ad73
+       0xe3de17ca      0x78455914      0x9e000992      0x602eebd6
+       0xd53066ea      0xd2fea4af      0xc0808eff      0xe7571192
+       0xb12fd785      0xc61a8a48      0x4876c57f      0xde3b4fb9
+       0x21d59d1b      0x77e55c0b      0x47fea192      0x09ec05dd
+       0x8cdda4ed      0xd07d827e      0x30792c19      0xe6a249a2
+       0x0ab09c15      0x709b15d3      0x41f6a1b0      0x39222672
+       0x9eb2db55      0x7cf9e5a8      0xdfc72e5f      0xbf53242f
+       0xddaf4628      0x52fb1b29      0x212ba450      0xeca2ae62
+       0x23a79905      0x830f4375      0x935a384d      0x741b1831
+       0x1f5b374d      0x135eaaa7      0xa12d4801      0x688a49cc
+       0xf3ab834c      0x2f437388      0x77051494      0xf7d5dc40
+       0x73b9ae86      0x57cc1469      0x6e017e06      0xcd2a35c4
+       0xd4b7d26c      0xbec9bfb7      0x6dbf6d62      0x5c802611
+       0x251cbf05      0x0749f9af      0xea361170      0x9d5a561f
+       0x22ee92a4      0x419bd3fb      0x6f0c10d9      0xb9c50f48
+       0xbd6173f7      0x738a654d      0x00d606e0      0xaaafe42d
+       0x1e5d141c      0x6a081224      0xf8f84471      0x9284a71b
+       0xb36c9f34      0x5bc3cbda      0xbbd8296e      0x63dc9354
+       0x4ee4e87c      0x7bcca0cc      0xf0431cc1      0x6244b0ab
+       0x36df6624      0x985c6e27      0x3268c9d5      0x59fdb579
+       0x974301b8      0x46cf11c0      0xadc121ad      0xdc3b8804
+       0xe4c4be6c      0x75fafdf1      0x8a063c69      0x498cf19c
+       0x0ad8518b      0x3c0d49a3      0x04124718      0x4b4af21d
+       0xd88b0cc0      0x2a31dbab      0xd419298d      0xc625f2c0
+       0x034c1ce2      0xc66aa1a1      0x47b5cf9f      0x2e2c0597
+       0x448a266b      0x850e89e8      0x63fd2ca3      0x9d8d2798
+       0xaa782d19      0x0e5772f3      0xad61cd01      0xd02548ec
+       0xd9ba4c3d      0xfe11122e      0x45f6c671      0xa751459c
+       0xde2f54a8      0x50b0a23f      0xa76c8331      0xd43865cb
+       0xe682f57f      0x9576ece5      0x993008e3      0xb630ea07
+       0xf4456220      0x6edd836a      0x3065f85d      0xdf3a879a
+       0x50098784      0xb0d8ed1a      0xf7c5e468      0x67a3ac63
+       0x6bbe8a10      0xd8a3fe90      0x95e59763      0xab20bf63
+       0x917c2bd6      0x6cb8941d      0xe4850103      0xc01e8eb0
+       0x8191a18a      0x957b65fb      0xc5386e7b      0x7ebbe153
+       0xae923977      0xb8307243      0xdc249419      0xdffc3c54
+       0x3ecab7ab      0x906bbfc8      0x8775aa1e      0x62476cec
+       0x1fd5b9e0      0xca51a7fc      0x3c2b7f21      0x73c3ba73
+       0x16197c1c      0xecfb2470      0x9afae107      0x476a3680
+       0x0aeef302      0x10e6ff0e      0xf9d26c2c      0x321b693c
+       0x6631a566      0xc3159f11      0x5220ca36      0xae16a624
+       0x15228e05      0x3a0e0c7e      0x95abbf47      0x97d035b5
+       0x3dfb2c57      0x1c449f22      0x161bb69f      0x4c9a334c
+       0xb7cf2717      0x0066444d      0x6654a9fe      0x09591653
+       0x8b5b70e7      0xd54200f1      0x0b73e933      0x72fb76f0
+       0x28d263ef      0xafd00a3d      0xfa5dd759      0x08c4d2cd
+       0x95439811      0xe819f8ae      0x2e4a8449      0x1f924127
+       0x05b8eae7      0x65af5b24      0xa51f1b52      0x54d9dca3
+       0xdedc6e38      0xd2dcba1b      0xdaecf27e      0x93c51700
+       0xeea32dd3      0x9db8347a      0xa6a58eb1      0x7c097ac2
+       0x040d3ded      0x8752cf61      0xcaf09da1      0x855d91ea
+       0x90376107      0xccf430ad      0x8f5b608f      0x61b2d6c5
+       0x3b7cbf6e      0x139c6b94      0x24794bfa      0x8c39d7c0
+       0x1ef0a524      0xcf5b7d94      0x0209d271      0xdee02cd3
+       0x0f1af81a      0xbe9b4cf7      0xd509cf9c      0x2fc088ab
+       0x1b0d3a93      0x3be3df49      0x6edd166b      0x7b5f00c9
+       0x6ad579e3      0x97ea1c1d      0x256d1964      0x4c450442
+       0xf7d65fe3      0xe9f864c6      0x7b5b0cc5      0x02d13af0
+       0x127b46a0      0x272e7f0b      0x9a4af66e      0xc1538ffd
+       0x89438219      0xc5fbfda8      0xd7111981      0xc150fca0
+       0x69cc6bc3      0x3f34a55e      0x3e54ee9c      0x20cf58ea
+       0x4e4193bd      0x5e299bdb      0xb58d48fc      0x32b8399d
+       0x4f54a5c3      0x066d0d6d      0xf0de2923      0xf2ad5145
+       0xbd606fd0      0x2e94a5ca      0x44812a53      0xa54983e2
+       0x7a371445      0xacb230e4      0xbf26afff      0xd2d6e689
+       0xd19ef29b      0x687f6230      0x7c4d14e5      0xd5b3a33a
+       0x9e35e3c2      0x4a431c1c      0x38beae5d      0x38f1d918
+       0xf78bc898      0x996a8439      0x78ed60b7      0xf78dd0ae
+       0xc01feb81      0x33800ee4      0x052f09e5      0xd247411a
+       0x385464ba      0x11c3f9d2      0x305fd9fa      0xdff2def2
+       0xa90c76e7      0x140945b8      0x10f33abe      0xc00f77e6
+       0x54f6844f      0x826a12cf      0x33474a58      0xde2b7ebd
+       0xe28abd2d      0xf8107730      0x410a0c2f      0x71902891
+       0xff7199d9      0xa46e3539      0x6087cbfb      0xb123c666
+       0xf246206c      0x81dddf8b      0x8d33ca1c      0x647d40b7
+       0x7ff9e364      0x623aea75      0xb839bf91      0x78add7e0
+       0x9554d372      0xa160cc75      0xe3b028ec      0x47059b9a
+       0xb250818f      0x261b9303      0x3673e559      0xf26abc26
+       0x2f94fbd8      0xfa815b57      0x17471b5a      0x28e31a21
+       0xbf5b8654      0x08eb2da5      0x5ec7fe01      0x2607b68e
+       0x65f7b4ff      0x60bebcc0      0xd7a7367b      0x29dd0f2a
+       0xafd7aa3d      0x78cf6f36      0xf143f863      0x1f6bb8bb
+       0x191e3d04      0x1c98660a      0xa13b16ca      0x5bb60bc5
+       0xdb384357      0x078b2125      0xd85c1f6c      0xac0c0ddc
+       0xd2bc3fef      0x9bdeba33      0xf2cc03a2      0x12c73d2d
+       0xc8aa452f      0x641dcf0e      0x5b3144e2      0x26f3b3b6
+       0xb8fa61ec      0x8be854f8      0xf8be5bd3      0x370ce815
+       0x77aa5ef1      0xb4fdf0fc      0xb5006075      0x5752a3cd
+       0x9d61154d      0x5b3d86c2      0x1760e58a      0xd18f5c6a
+       0x6d6ec175      0x7f858ccc      0xc3df52a8      0x42f4dbaa
+       0xc35573b9      0x5158f16b      0x8d5ca72e      0x85110274
+       0x2fe27489      0xbd40ab31      0xa85ea42c      0xbfe3f636
+       0x8c08b37c      0x0aea1ddf      0xa50cd8f0      0xe559318a
+       0x2a280158      0x43847f6b      0x3a078777      0xec615237
+       0xa56396af      0x696ae4ae      0x4d855505      0x007ff90f
+       0x47d03918      0xa7d310ba      0x6e53e746      0x149e77d7
+       0x975feab7      0xfe1c7b97      0x9a8abf4e      0xbb3c7a37
+       0x84038c2a      0x954d20f4      0xee5d8ed4      0x11da739f
+       0x20eecc04      0x5226db0c      0x8c5369d1      0x78ed6585
+       0x8dd1cdf0      0xb46c10ef      0x141a96db      0x92ad7d97
+       0x4e7e0836      0xf1cffda9      0xad2fdc2b      0x6843beff
+       0x9c59468e      0x94217ef1      0x1d49c692      0xa498e16e
+       0xa135ecde      0xe7adddbd      0x54bc7af6      0x6585df75
+       0x4f7e2c7d      0x1c9a2488      0xd9dd192b      0x0b263684
+       0x08be6e1c      0xab6002d9      0x2c6cf690      0xbba8405e
+       0x4c3e7c5e      0x35dc1a2f      0xa56dd38f      0x5674802b
+       0x41c87fbf      0x99fbc6b1      0x47b51a74      0xd51a67e6
+       0xb499a89f      0xe0d1a3c4      0x38deb3d1      0x68f4c97f
+       0x2422bda9      0xe879354d      0x57c1863b      0x10c6ce01
+       0x1d9a72dc      0xe5cd2133      0x2ddb9094      0x6e92e0a6
+       0x26f6dfec      0x0e68265a      0xb6c2f28f      0x08817db6
+       0x3cfb4255      0xabe020c3      0x45259016      0xa8501b1d
+       0xfaeade6e      0x7de9daa0      0x34e019b1      0xb22d2a5a
+       0x84a6f3f2      0x1d970bc3      0x53ac86d0      0x177c49f9
+       0x79ca257e      0x0657c1aa      0x791594c5      0xb15d7c7e
+       0xcd111b31      0x20bdb043      0x3d31dee6      0xffd66121
+       0x0a8f413d      0x7a1bd1eb      0x58340242      0x434aeb92
+       0x03bc4a31      0x9471e1d5      0xd4f3c2ba      0xfff0d8b1
+       0x9bd13e3e      0x7cd0a853      0xe3d6f849      0xe1017a2e
+       0xd925ea81      0xb22e87ad      0x0512c884      0x58854850
+       0xdd9f682c      0xe94b2977      0x2161cbc8      0x0e253a5a
+       0xda691f0d      0x05c8e4fb      0xae2ba23d      0x8f5297a9
+       0x279f4c37      0x63cc89ed      0x928d2eff      0x08c231a0
+       0xc2748444      0x192845d2      0x0754964e      0xd2845816
+       0x06933750      0xa4c9163c      0x634ebd9c      0x2a9cfec2
+       0x477cb9c4      0x03f50d10      0xbdbe4f84      0xe9736708
+       0x6e48bbcd      0x8837479a      0xcf8b2793      0xc4188ea7
+       0xa342d8a6      0x94ea9d9c      0x8e44db11      0x9c086ff7
+       0xd8b8678d      0x5c90df79      0xb7d837c4      0x839db0a5
+       0xfa26efcb      0x5bff775b      0x8599f333      0x2e4c99f6
+       0x32c3f18e      0xe6e2e6c1      0xaa2df9da      0xb346c52b
+       0x24f2ff8d      0xe2da722a      0x1e163221      0x013bd00e
+       0x72853bf6      0xdeff1305      0xb85f22ee      0x880ed484
+       0x8a006bdf      0x8a5636d8      0x25b3559c      0xc76d7673
+       0x63545968      0x13d65171      0x00a2ce44      0x06d87d03
+       0x6ee7639d      0x9613e4c5      0xa93b5e85      0x100d6a2e
+       0xa131e34a      0x1adf9840      0xc6654177      0x2f07a13f
+       0xb7ef41e7      0x2230a4f3      0x810d8b9e      0x73851a6c
+       0x05624fcd      0x9bd58867      0x628e8263      0x48c59a8a
+       0x52758d7c      0x06f156ac      0xebd23187      0xec5a26b4
+       0x66ee70a7      0xe6ef0cae      0xfe2d03ff      0x90d11944
+       0x042622dc      0x285c0075      0xd4765aab      0x4bb300b3
+       0x7138d3b8      0x40ad4f50      0x98095640      0x133645d5
+       0x9ccf9b91      0x263756ce      0xf88d9aa2      0x18022ea0
+       0x9fe4cd01      0xdb2dd0ae      0x43fea9ad      0x3e420109
+       0xf4d75e7b      0x3a350693      0xba2af5ea      0x65ab5787
+       0xf170d42b      0x3186e0b6      0x02003a01      0xf606588d
+       0x0fa8746a      0x31c76bde      0x61dac6c8      0x2f8741e9
+       0x10204434      0xef31c0bc      0x37862053      0x16f3aff9
+       0xbdc93959      0x06113d52      0x05647a65      0x154ea551
+       0xdb8c097c      0xa8a23927      0xeb4cd475      0x8ef48ef5
+       0x7b8896c9      0xa9911410      0xdd9376f9      0x14a2c712
+       0x8ee98697      0x00435529      0x96f1929d      0xf965796c
+       0x868df4b5      0xa9a9949f      0xbaa8e792      0x8cec9579
+       0xa2546f3a      0xd324b50c      0x76a77cbd      0x8e324208
+       0xe4b0577e      0x9a10e51f      0x84746ea0      0xb90a795a
+       0xc2664e9d      0xb5b5ecde      0x0e25e165      0x550ddc30
+       0x2c60d566      0xd65327da      0x52ee1c96      0x5c99b4aa
+       0x90582271      0x1beb1ef2      0x76c95767      0xfea6fe91
+       0x446c8801      0x3e028055      0x4867364d      0xe4aeb591
+       0x1c19ac36      0xc69a5dc0      0x9b611e0c      0x332c3288
+       0x200a1cfb      0x0ebbb255      0xa5f61529      0x350c8644
+       0xedccefa3      0x4385fb5c      0xba009b5c      0xa5de8f29
+       0x70988978      0xd67053e2      0x6124b992      0x30499dc0
+       0xef642b9d      0x8828a259      0x4edca94e      0xebbc2986
+       0x37977b75      0x3501bc3c      0xbdd23c96      0x4bed7e8d
+       0x2e80a7b4      0xe6cc07e5      0x15099be4      0x394497dd
+       0x4e534eab      0x9afb903d      0x09036115      0x0a1d7a1c
+       0xb5e0a5fe      0xf12ff4de      0xb22f3c00      0x0513ceba
+       0x8b148c80      0x4ea14c55      0x2fc18fae      0x15a0e676
+       0x1f408a3b      0x9678064a      0x350ec108      0x36f652c9
+       0x9220195f      0xbe718685      0xe792afa6      0x259c3b51
+       0xad820d8c      0xf9caf47d      0x32e5ff95      0x00e6f06e
+       0xe81f1a95      0xa5f97ad7      0x350b2e6f      0x4838b3b6
+       0xdaa037a4      0x6ce2194d      0x2b076b6f      0x27e7eee9
+       0xb781298a      0x9990ae04      0x4a4f4708      0xeb7ce242
+       0x2ab8ad07      0x52d044a2      0xac8d193e      0x6d791816
+       0xad7c794b      0x44d78639      0x91b5162e      0x57aaa1ca
+       0x5e6ff7fa      0x3873ad1f      0x41328c73      0x7d3c66dd
+       0x4cd194c7      0x4557bc1e      0x27dac112      0xb617bd0f
+       0xa24eaac4      0x069d5819      0x4e21ebd1      0x8f2a90c1
+       0xe0b28919      0xfa11d5cc      0x66b0fd7f      0x6db8dd9c
+       0xb747bfa8      0x43a3b201      0x0fade0a2      0x2d0116ba
+       0x253f9ab7      0x6ae02746      0x01b7192c      0xccdeee30
+       0xf3cf3221      0x5a983db0      0x97990f27      0x1438f1d6
+       0xef7f94d0      0x2c393d1e      0x66c502c7      0x471fc8bc
+       0xe3267158      0xb5582cd1      0xae56aeb2      0x54c43f93
+       0x846297eb      0x58b6ad13      0x1df7d00b      0x8b1b5524
+       0x01bf5010      0x93b77b5b      0xcce61136      0xe2793e61
+       0xe673bc9f      0xdf16f114      0x79a1b96b      0x8c03a05e
+       0x5c176d75      0xf75ea263      0xe3d750d5      0xce53b6b3
+       0xd92e7564      0x000a1ad1      0x96f88a71      0xbd820682
+       0x29c17ea2      0x4b36c1e0      0x21329442      0x248d464f
+       0xc4c38dca      0x1e8f055e      0x9e599834      0x1004a6eb
+       0xadb8b9f7      0xb9cf7630      0x913afa99      0xe0977242
+       0x230eedf2      0xd126d72e      0x00d1fe3d      0x033acebf
+       0xe416523f      0x1e9b5e6e      0xfdb78e69      0x9fff4953
+       0x570b41c5      0xd2e47e82      0x22233676      0xb89da5b0
+       0x9742b8b7      0x8d33deb3      0x07157406      0xc5114ab3
+       0x787f2e65      0xad24323c      0x23f2911f      0x37c589b3
+       0x793411f9      0x4d0356a5      0xc6cca656      0x3e4dd7f5
+       0x8c2df38b      0x0b758f7d      0xd218e47d      0x39c1c194
+       0xdb0e18fd      0x19a1518d      0xffaf2297      0x99f30028
+       0x67951418      0x90b6f209      0xd5a711ad      0x4aadf909
+       0x21e9e1ac      0x9f85f773      0xd76d159a      0x24994f98
+       0x4c194536      0xdd86aaff      0xd0f74edc      0x741c554b
+       0xc25a7fb0      0x8a4a4292      0xb133d05f      0x2b33fd66
+       0x03cc58ec      0x09e15000      0x9f720886      0xfd131f33
+       0x67f4b431      0x4bee4aec      0xadbbeccf      0x4d678c46
+       0x42c9c72f      0x2b73e922      0x3faec5a7      0x0138b3e3
+       0x443193de      0xf0b949ed      0xf283cb89      0x22b28882
+       0xa29dcebb      0x8c0d1c73      0xc3daea22      0xf50acb6a
+       0x67b06286      0x33094641      0x9e8fbe70      0xfc052237
+       0xc538eea7      0x525cf5a7      0x1efe9ab9      0x8c21b545
+       0xc9c0088d      0xbbdd52b2      0xbfc15c89      0xee8cf0f9
+       0xc2916f7f      0x0a442773      0x1f067f1d      0xd54fca53
+       0x1eecf171      0xfb4fa5ba      0x276f45a7      0x7510c282
+       0x64cfb998      0xbd969384      0x264db253      0xdcd7ed53
+       0x163a2bc2      0x6bd6bfcd      0x43735319      0x2228a09f
+       0x7f4d28ab      0x8fd9e6d8      0xc18753ac      0xdf0df0b7
+       0x6840ca57      0x17edb14e      0x8d2517c1      0xa7cd3870
+       0x65940658      0x382b14f4      0xfb9ea817      0x817f16bf
+       0x0c25f424      0x848ed419      0x4b7e7167      0xcebc30f1
+       0x98f7bf89      0xc224284e      0xa99c99cb      0xb8b90159
+       0xdbe97c71      0xadebf568      0x15b1a7c5      0xcb7c3642
+       0x44c47cdd      0xc6c7b478      0x018ff834      0xbaa64b64
+       0xdc0e482d      0xedbcb019      0x23589e7f      0x7166836d
+       0xba733222      0x9d7ef1dc      0xf1d4ea52      0xbe21fa73
+       0x41f00e61      0x8dd0fcf7      0x9ae06374      0xfa21c5cc
+       0x6ba9148b      0x3ffee3f5      0x896c451d      0x1fe6b43f
+       0x632ca681      0xa795b698      0xeeb0d107      0x9ff78e0f
+       0x72971a84      0xbe663043      0xb001eb08      0x24e917a0
+       0x7bdaf512      0xb40cd0e0      0x59ed30e6      0x2f635261
+       0xcf762a6c      0xcf781328      0x08c7627e      0xd6e14cc1
+       0xc03aa675      0xa376a246      0xaae23178      0x95f70090
+       0xedf90ba0      0x8cda6565      0x2e6261be      0x5d4946a1
+       0x60153db2      0xb54657ce      0x5d49d847      0x458449f8
+       0xdc7c3328      0x561e2cbd      0xbad5cf83      0x8e99e7ff
+       0x69008abd      0x84414ea3      0x63506a20      0xc524448d
+       0xc276be82      0x6f0f31d8      0xd9c611b5      0xa127120a
+       0x7f88a013      0xebd4f643      0x633a626c      0x35379824
+       0x5f962a57      0x8a668612      0x3d246d96      0x95b47fe8
+       0x546cded4      0xa9c6e986      0xe80774ef      0x78c678a5
+       0x7275593f      0x111eb13a      0xf1a89c2e      0x5886db2c
+       0x3af60fe7      0xa307a283      0x54ec2412      0xacad4002
+       0x3690a492      0x4d670a97      0x1df719f8      0xd53736a4
+       0x1ce1985d      0x0be32571      0xf50f4774      0xc8db8b5d
+       0x37ff1298      0xeb95a35a      0x27ae0b93      0xb74430b3
+       0xe8df4d1a      0x3bae1697      0xb69cc560      0x3a7d46ad
+       0xf1a03663      0x98cd1809      0xc5c138c2      0xea8bf120
+       0x5d238c1d      0x871bd60f      0x7cdb6d30      0xf744fa50
+       0x90973d60      0xe8fed7dc      0x9081b4db      0x7ab73dfc
+       0xae12622f      0x80430feb      0x7ac39c71      0x7a345a34
+       0x672b0550      0x15fd64c9      0x5b9dbbe1      0xc2334a32
+       0x8f0d1dbf      0x1cc62305      0x99a6a3ac      0xd24c1124
+       0xc3f6c035      0x5ed2e9bc      0x82d59437      0x4f00d4b1
+       0x146886da      0x5c21fbdd      0xa07f5135      0x1f018efd
+       0xbd680c54      0xf02713b2      0xec5ef134      0x1bde8262
+       0x2d2444d7      0xf9131281      0xa947d0a1      0xf4129df6
+       0x89c35065      0x0c3d5ad1      0x60e696b8      0x0fc55db4
+       0xdc758cd5      0x82a84515      0x814c1b5f      0x7498d93d
+       0xfb3c4409      0xb832cd16      0xac239a91      0x49064edf
+       0x59fc8e3b      0x0324c18d      0x30a36f75      0x9ef23737
+       0xae3b6b8c      0x6896faaa      0x4cd93534      0xc8920a2f
+       0x3fed0f6d      0x8e8d2da2      0xfeee93b0      0xffd4834b
+       0x0b88a1b7      0x9aea4e4c      0xdf7b41e0      0xc9f35c19
+       0xb3dae0c8      0x340c0982      0xf4070909      0x4664b23b
+       0xd6734d91      0x9be09b71      0xc2a8e1a1      0xab15460e
+       0xfc5bc1ab      0xcf95f3d8      0x09a83b2d      0xfe81cbd8
+       0x0c06d827      0x0a8bb0c4      0xb1f0552b      0xde60c26c
+       0x3abf0a63      0xca2afce7      0xaa11d850      0x28d866d8
+       0x6d8a0e80      0x7bcc5705      0xadca3aa8      0x06a26ae3
+       0xb1477649      0x7328d96f      0x7d483848      0x53082689
+       0x7c0e5568      0xb49decdd      0x851de7e9      0xba15c25e
+       0x0b9f0e30      0x465e4921      0x8152ab4f      0xe62880c4
+       0xc3b6b869      0x1acda063      0x45733b33      0x4b40b8e9
+       0x58f506d2      0x6e8be867      0xeef7fb60      0xb7ed8306
+       0x30b4a0d1      0x0a3c07c4      0x91e3abf6      0x118fde6b
+       0x20ed11f0      0x2978d6d2      0x6ab8dc87      0x16ab61ba
+       0x556cf833      0xb2f5c1c0      0xe87dd9c8      0xb015c2f7
+       0x1dc9ef29      0xd9f171fc      0xc9f5e442      0xb6912d66
+       0xaf6dd636      0xf8582905      0x0faae085      0xc87d4004
+       0xfa94e438      0xc2f1880b      0x154c7079      0x3e27171d
+       0xfc248d10      0x1b595188      0xe415add8      0x4315d693
+       0x724ebc18      0x2dfc4a77      0xded78c2d      0x570e4ddc
+       0xd88a1c25      0xb11a0496      0x2ac230ba      0x864e053c
+       0x3c376fc8      0x5afbe1ac      0xe0ccd689      0xaa9264bc
+       0xd966fbb0      0xa1a4bb29      0xc6e9748a      0xcec607d1
+       0xffa72d3b      0x5b61b779      0x18d55e21      0xf5a5e9ac
+       0x13895dac      0x0c01e53a      0xcefe8daa      0xece628fa
+       0xb2020ce1      0x895cd83c      0xe32d1283      0xfb192758
+       0xa57d64e6      0x78ad9183      0x3ce3220e      0x6ee76140
+       0xfd84b385      0x6016b54d      0xdfa35264      0x4cbdb8dc
+       0x349fe6c1      0xf5fd349b      0x3feaa7f0      0x6a00146f
+       0x69790627      0x19dba070      0x2e5ac7f2      0x44dc51d9
+       0x0dc9964d      0xd1c8a3bf      0xbcb213e9      0x62708b00
+       0x67c6e855      0x2fc3c32a      0x0ec04e0a      0x5053f5a8
+       0x6f8411e6      0xb399d84e      0xaa5ae55b      0x05bbd2f0
+       0x02b4d130      0xe88178bc      0xf2e68c0f      0x4aabdf1a
+       0xb683e6a9      0x775ba61c      0x36633c31      0x67ec74b7
+       0xf093c02e      0xc45f244e      0x46476822      0x4250586a
+       0x516fabf7      0xb6377c04      0x5f278798      0xa1068782
+       0xa55916d5      0xc4ad5f97      0x60a5e69b      0x98119ce5
+       0x76fc3f59      0xf8e46ee4      0xaa28a397      0xfc325000
+       0xa70f3091      0xa5ca51d7      0xd69bbab5      0x20c64fcd
+       0x2b378365      0x80c58577      0xc0962ec2      0x48b0fb39
+       0x054e046b      0xcde8e446      0x566f37f3      0x936fd623
+       0xf18c729c      0x09220d87      0x929fb871      0x7a6c4db6
+       0x62620ed2      0x5f9ce765      0x0d0c5d2a      0x6260a50e
+       0xe7399a16      0x6357e512      0x6b781814      0x5d4d4a63
+       0xf94b0172      0xa77bf890      0xaae5e81b      0xc1ebe8d6
+       0xb4874555      0xe4263fb3      0x22030975      0xa50d2c79
+       0x4faa81ed      0x81777d4e      0x9f7fbe6f      0x7448bbc3
+       0x42ea31f4      0xc8c26fa3      0x6701902d      0xf2f286a4
+       0x2040990c      0xe2058471      0xd58263fa      0xde37591d
+       0x2870ca90      0x56881bea      0x09052b3c      0xd8de66f8
+       0x3a8f1e47      0x9ca9676a      0xa6767532      0x5f3dfae8
+       0x17f7a245      0x93bcffb1      0x192d9a5b      0x07f0c3d7
+       0x9fca4550      0x7b97103c      0x1e7f070a      0xee31d420
+       0x88f4fc4c      0x18df3074      0x4840065c      0x70801f9b
+       0xf0d6f2bb      0x51995f3c      0xe2486bad      0xccc10902
+       0xe6c9e135      0xa8224250      0x7f55294c      0x001884e7
+       0xd6010027      0x572d3941      0x51eb6de5      0x3d25faf3
+       0xcc1f170c      0xeb25e5a2      0xd8d10187      0xd91cc741
+       0x63f5f7cf      0x241e556b      0x5875f757      0x2a86f545
+       0x778ff93a      0x6643fbe3      0xdf07a6f8      0x3e11e40a
+       0xd93c6e6b      0xe329e272      0x3f874626      0xdfe61dd8
+       0x7fe956e7      0xde945710      0x0af24d62      0xb6554577
+       0x7d874ee0      0x6c0cdf4d      0x9c0d53af      0x5b053be7
+       0xa0c4529d      0xb6fed9d0      0xc01a138f      0x67c644b8
+       0x57aa439e      0x0035775c      0xc9f8a8e2      0x35975f57
+       0x14a11132      0xf0ed9e83      0x9c02cdce      0xefd3c079
+       0xd740ccb1      0x6aa5e5a1      0xf4645565      0x0bfa46ef
+       0x3a17a81e      0x5ffa56a0      0x94fdaf5d      0xa8e7afb2
+       0xe5b7c2b9      0xcf6d846d      0x8655fecb      0xd4e8e697
+       0x42e0b2d7      0xd96d8078      0xe7683d61      0xe00f6e63
+       0x3ce9e37e      0xcc570a3e      0xca16e27d      0x56fe882d
+       0x0e8b75fa      0x5b543aa0      0xa4ee347a      0x436fdd0d
+       0xd10f01d0      0x996cbae9      0x1242e354      0xe6af0ffd
+       0x8dee4a7b      0xd7b8c02a      0x1b600476      0xe3b9848e
+       0x9f8638ee      0xbc6411fd      0xd2abe239      0xa911b870
+       0xd25d8edd      0x9dac4009      0x415262ca      0x8086ac62
+       0xeeaf0402      0x93ad90e4      0xa4b907ea      0xd82fa99a
+       0xa3be7fc5      0xf3008912      0xa14a7be3      0x7f18097a
+       0x98011536      0xfb6f5aaa      0x353b0592      0xb0099fd7
+       0x7ce6ebaf      0x0a5d50ca      0x0e5170ad      0x55b9b7c4
+       0x7647e14f      0x1c53ec4e      0x0f649237      0xf4c8a704
+       0x0cb77104      0xa93b3965      0x1e0d4e4e      0x3f4c655f
+       0xbbc12d00      0xebaf8942      0xd3a7d859      0xbd9c5ed7
+       0x5dd26423      0xedaa0468      0x43ab3093      0xb1a592f2
+       0x6376fbdd      0x0c09822b      0xee093680      0x9344f19d
+       0x886f3fdf      0x156b18ef      0x0a68374a      0x9235b0bd
+       0xc1b73296      0x23346073      0x95b1c61f      0x315ad69f
+       0xe511947b      0xbbbffba3      0xd7bc8761      0xe391da80
+       0xfd6b5f18      0x8e701be6      0xfd0e9497      0xd1dd69f3
+       0x11162d48      0x7e42681f      0x3dc8f5c8      0xcfed2aad
+       0xe398244c      0x72877aaf      0xad97fbad      0x9460384b
+       0xef192c6b      0x475b0941      0xa71eaf40      0x126ac591
+       0x6c09e2f2      0x70c1f80d      0x0a1e37e4      0x47e318d9
+       0x2dcc4467      0x0dc45110      0x3790f0d6      0x9eec3632
+       0xa1c9d51d      0x929233b3      0x70036b1c      0x3314c529
+       0xc50b5feb      0x49a1c810      0x4390f561      0xaa2536e1
+       0x3afa43ab      0x6d099434      0x1ba2d09b      0xcffb902d
+       0x86a25119      0xcbbbc618      0x0416cc6a      0xde1e3001
+       0x4fe993ca      0xd74274a7      0x287ba439      0x1ee5e5c4
+       0x410c3fa2      0x10e7893f      0x6007874b      0xa7540560
+       0x6d9b1a86      0xb9bfb618      0x8f68bc50      0xf96b9da7
+       0x3c73bdfc      0xef2a83f8      0x616edf09      0xfb2160c1
+       0xa27a35de      0x71287947      0x17722ae0      0xc670a323
+       0xb96c4cbf      0xd2361a92      0xbd0c3913      0xb1315762
+       0x4f462140      0x6b7a3473      0xb4cf5725      0xa9159313
+       0x0ffec555      0xa8dc36c3      0xd3b855ce      0xd21e9b35
+       0x83404c24      0x980a8108      0x92aa9331      0x8f46cd7b
+       0x71a4fe47      0xdb707645      0xf6e61196      0xdd292a49
+       0x0102d727      0xbf0885ae      0xd2731f27      0x1474503a
+       0x393bb25e      0x3935f820      0xe27f70e1      0x863b68f4
+       0x1f6a1476      0x0ca52e45      0xdf5c0782      0xcf837ef6
+       0xb39f8ba5      0x983c4c86      0x2fd37a76      0x80cfbbd3
+       0x1372c7e0      0x3fbf087f      0x9c6cb8dc      0x17c43488
+       0x7957e195      0x929ccea9      0xf1e821bc      0x8b3f7506
+       0x7046f2e7      0x4559cfea      0x853ba7b1      0xca19b920
+       0xa6b2f987      0x41c7711f      0xbcf81c0c      0xcbb42d22
+       0xaf132f3a      0xb8f46a2e      0x53a390d8      0x717b172b
+       0x0582849e      0xe71702cc      0x2aebdc71      0x03b0208d
+       0x887bbfab      0x7797e8d1      0x76bfe070      0x7550a939
+       0xc33376f9      0x7cb173f6      0x931a578f      0x99960aa9
+       0x758ff5be      0xc58beee1      0x63777d94      0x1220dc29
+       0x4da97584      0x6c8d686c      0x40d46332      0x043f78ef
+       0x7d602ee8      0x348fe2e2      0x8a3e167d      0xa5f2435c
+       0xa9d1c73b      0x301363dd      0x07578742      0xc997b680
+       0xb000c89b      0x981a8a9c      0x6567829d      0x4b9750e8
+       0x27634808      0x811b5d35      0x5519c0ec      0xad00c70f
+       0x417c2317      0xc8782d93      0xc9accc54      0xd867de4a
+       0x6b9a83f6      0xfaf1546a      0xfc49986a      0x9c5c038b
+       0x327cc0cf      0xd1290d48      0x3077ea8f      0xd4949041
+       0x873bcbb3      0x7e9016e6      0x8a84424c      0x1b88c983
+       0x3dfa44fb      0x8eaa7f32      0x05f5aabb      0xffe970cc
+       0x7aa14ac9      0x666ab28a      0x4baafbcb      0x0642f672
+       0x1e8bc896      0x7b8128ba      0x1be68a85      0x2696df42
+       0xe8cf0ea2      0x8298c7b4      0x3425a85b      0xce460218
+       0xcb65ea8d      0xc6200c9a      0x01a1672a      0xfd49e891
+       0x18fcdb44      0xca73729b      0x4056a413      0x16dc8bd5
+       0x87be0bf8      0xe3106ab4      0xe5319b2f      0x930a1b26
+       0x254804a5      0x4088ac10      0x8581aed8      0xe40f6bad
+       0xb9ead8aa      0xa7abeaff      0x500785e0      0x2c707afa
+       0xa561968e      0x378866bd      0x55a67cf4      0xfaa68c33
+       0x82055d2a      0xb4481f33      0x326b5fa7      0x1db474bc
+       0xae894f21      0xdecdfafd      0xf9411b19      0x9a8947a6
+       0x0c6baf46      0x215aba04      0xc2b175d5      0xf67300dc
+       0x7f421ff4      0xfac75b42      0x101ff909      0xd57ad5b9
+       0x7278981f      0x58065ac0      0x895e14e8      0x7896dc2f
+       0x3ad7ce32      0x78fba2ff      0xa2d72bed      0xabec76be
+       0x00fea962      0xdcc0c142      0x0804f109      0x978331d8
+       0x8ac9bca6      0x590373c5      0x9a1e5701      0xbf14e8bd
+       0xb7a7c018      0xa1f899cd      0x39aa72ba      0x115eae69
+       0xa68d971c      0xd8bbd9c0      0x558288f8      0x5d23047c
+       0x90a17c2d      0x865b74c0      0xf4002788      0xbbc54132
+       0x8067d761      0x35e99e73      0xa54e4f96      0xfed8426a
+       0x4fd78d1c      0x30d474e0      0x8a568169      0x1ee9566c
+       0x7e029e9e      0xc2a01e4e      0x2d7c4cad      0x6d7ed9f1
+       0x52c8f409      0xb294db7e      0x6786422a      0x1c72d1c6
+       0x9d0eeef7      0x550189b7      0xf40e3406      0x433c7dc1
+       0x01d9e35d      0x5481f069      0xe74f8018      0x48838c41
+       0x3e9957c6      0xa8503414      0xf6956426      0x94b7ae28
+       0xd2fec0d4      0x369fa1d3      0x3bece7fe      0x2fc55ff1
+       0x8e778511      0xaf6f26d1      0x1793d266      0x10855993
+       0xcfd10bd8      0xc42cebc7      0x8a823d22      0x0edc6d62
+       0xdee868ef      0x75ee74eb      0x16ebd54e      0xc607e8ee
+       0x7c279bb6      0xf4834322      0x9f788766      0x0e826e3b
+       0x943cd7f7      0x0903d01c      0x6ddb7cd4      0x4f39e33f
+       0xc893b860      0x79839901      0x77d1cdec      0x9be4a741
+       0x9cd9e1b0      0xe5a560ba      0x23123fbd      0xe116354d
+       0x65f7a549      0xfed35af4      0x4696626f      0xb5308a11
+       0x99b6681a      0xb062578e      0x7692e3ba      0x9ffc6640
+       0x6c77099f      0x2bbd6944      0x540b15c4      0xb87a5b81
+       0x403854b9      0xa1ff1832      0x5c0d39ef      0xb0c2f3cb
+       0xc88e7a47      0xc9d3a08f      0x0602ad28      0xed10a525
+       0xf1bc7158      0x74fc3b5a      0xd27e2488      0x7d10527c
+       0xe6564780      0xb047d1ab      0xeb3d26c0      0x8caf9cb8
+       0xb4400f3b      0xa183efd2      0xe1fc540b      0xc7951df4
+       0x6f4652e0      0x2cf8f3f9      0xe4b1135a      0x83c0e6b8
+       0xa908b003      0x60ebf691      0x9a4e7b21      0x3ee9660d
+       0xc9a0e97b      0x0a8dafe0      0x694c2d14      0xd118c90f
+       0xc652e0cc      0x1eecbb3d      0x7722833a      0xba6ab804
+       0xd8bcb08d      0x7631e04c      0x606ed699      0xe430a0ca
+       0x4cd5344f      0x460ade64      0x365954dd      0x48a94382
+       0x2ef6b381      0x307026f0      0xfccbbaba      0xa1cb149b
+       0xcfaca235      0x7573cf3f      0x59e30226      0xc34754de
+       0x4836647c      0x234f6b6e      0x296623b9      0x39f9fad5
+       0x30fb6818      0x37f0caa4      0xa611329b      0xa305e080
+       0x52518c08      0xd4cf686a      0xf9443a8a      0x2f2c6edc
+       0xd7c6da54      0x508dad11      0x34c97df1      0xc9e112b5
+       0xa4c55bf8      0xfde85123      0xec1995ad      0x4b159772
+       0xcdb9a9e3      0x00e59bd6      0x949ff262      0x6870ea55
+       0x53e01298      0x7f1af410      0xd612c321      0x50890531
+       0xabdffeb4      0xe90e3a7d      0xb0a21b46      0xd8a4381f
+       0x05efac53      0x7828ab6d      0x97ea883c      0x9b1791f9
+       0x916c1312      0xe9a6a482      0xce2354f8      0x3f88ac00
+       0x627f11b7      0x5146f6ca      0x076619ef      0xd12a9579
+       0xb6bae5a3      0xbe467c99      0x373377c4      0x9f603c7e
+       0xf94fa407      0xef84def6      0xe212c11f      0x5b367294
+       0xf1b4d822      0xd41ffd05      0x796b994d      0xfdac8700
+       0xaa9f21a7      0xaa29bd36      0x27f6a0c9      0xe3c24d00
+       0x01457132      0xd365542f      0xabc67f64      0x22be8484
+       0x96996a6f      0x491d1511      0x46119041      0xe4661409
+       0xece6fea4      0xd8cc7bdc      0x1ebd7316      0x196342a9
+       0x9a4b639a      0x2a3d4a91      0x40ed9b55      0x0f1b6e64
+       0x1d87f823      0x0a39b16b      0xdadb12fe      0x17681fce
+       0x9bc6d11a      0xd16b2739      0x140ae9b4      0xf7113bf8
+       0xa46d1e3d      0x30fcad8a      0x74a51593      0xce47d530
+       0x36147ece      0x9cc3d588      0x65cf29e8      0x0f53d6d3
+       0x0e395cc9      0x95761b1b      0xb9d2459a      0xb731a236
+       0x0c2e674a      0x7122028a      0xd97d5d6b      0xe8bf97d3
+       0x20818d68      0xbfcdedfa      0xfbd356c2      0xf188ed5b
+       0xde98b65d      0xf7cc0cdc      0xa9850a26      0xb72adde4
+       0xfbdc55b6      0x25302654      0x96be612f      0xda23e5c0
+       0x69a73ee1      0x8238db8e      0xa96dcf06      0xac59ea7d
+       0x02c65753      0x4f70b819      0xe776a631      0x069addb7
+       0xf490c4b1      0xf371c06f      0x6ec67932      0xa6330f04
+       0x27cd9f4a      0xd83c1c5a      0xc5694a43      0x325dd140
+       0x447db53c      0x7396f3ff      0xc7880953      0x5c549557
+       0xe2f4b5ce      0xb0e76e9a      0xfc00d782      0x8486f191
+       0xf233b315      0x0a012053      0xecab1590      0x44dbd9a0
+       0xda6fdb6f      0x72fb14d9      0x29a510a1      0x872477ae
+       0xb68c69b3      0x7bc5c5a1      0x65b8eaf2      0xb8df1f74
+       0x763a249f      0xcac51253      0xb1262ba4      0xda0240b7
+       0xbc5d5306      0x8145ffdc      0x18de6fa7      0xbad3d62c
+       0xa4704d64      0x49937584      0xb6e23070      0x1a52daab
+       0xee4d6d3f      0x114316da      0xcfe1f9ed      0x113f059b
+       0x866276a4      0xb44bfd0c      0x9a3814e7      0x94cc5b56
+       0x33d97b0c      0xe039e9e2      0x3a50af65      0x90d0a868
+       0x8b0bef64      0x3bb9ad2f      0x8cd6c272      0x9eb8dc74
+       0x28ef58af      0x7f148173      0x30ae7e14      0x2b195aba
+       0xc06f2611      0x285dc687      0x4e478b83      0x68ba56a2
+       0xc8621a4d      0x677c1ed4      0xea608196      0x56db4818
+       0xeb1a991d      0xe831ce79      0xaf0a73fa      0x824af713
+       0x716c7ff3      0xbada6d94      0x5c527a29      0x0fbcc995
+       0x19e46890      0x98d9ed33      0x7346e056      0x38ef97ca
+       0x61954b61      0xd7f6262a      0x66958560      0x7f819169
+       0xb2b4507d      0xd3195569      0xb65343c6      0x8f41a137
+       0xef451985      0x4c1d64d4      0xc11073b1      0x70fa9ad1
+       0x9267ba0d      0xc81d9c45      0x6d1752d5      0x478c366a
+       0x1012d652      0xee249e82      0x78e6ba3e      0xcb606c77
+       0x183bcc85      0x981591eb      0x688dd24b      0x39c0dc8f
+       0x18490bd2      0x2988f05c      0x0198a8a4      0xb726e7db
+       0xb8b22960      0x5a98d5f5      0xdc573a70      0x0c067bd0
+       0x14158bcf      0x0758e6aa      0x9540ff4b      0xe04d6072
+       0x0a60b4f6      0x2e854f09      0xa661a639      0x7603ee18
+       0x482ba591      0x5fd484d5      0xc7ac02b8      0x451e0fd6
+       0x9f2664ab      0xddc1292b      0x983e51ee      0x083845eb
+       0x58cba0cc      0xbcc0839f      0x95d80521      0x4ec6ecb8
+       0x131f7f90      0xc80028a8      0x522e2f62      0x7913cdb7
+       0xa0aedbe1      0x689ac9f0      0x1d18af9e      0x191a35a2
+       0xeaad470b      0x31b9f01c      0x9876b1ea      0x3dcd966a
+       0xb60c1c25      0x00e65e53      0x7d937058      0x2e364755
+       0xbb51ade9      0x8fc87b67      0x97201168      0x74f62b85
+       0x6b5535a0      0xb2fd7002      0x16d7259b      0x415845c7
+       0x9ff14fa1      0xd1bc7f94      0x229902a4      0x6529a970
+       0x8a8a5ad0      0xff260d37      0x6ef8b883      0x05909698
+       0xa26166d4      0x2c80f99b      0x21dff93f      0x18d3a4b0
+       0x2a22f2fa      0x450d310a      0xbc680337      0x3a894074
+       0x4ab8f0c7      0x35f0ec7f      0x1e700765      0xc9b45e45
+       0xc5e5cd92      0xb9bf35fb      0x2c1283a5      0xbc17d662
+       0x36be245d      0x312c7793      0x173a40f0      0x2716b170
+       0x18c94462      0x12cd09e3      0x1bbc3e56      0xbc2d8db1
+       0x4f5c1910      0x5b03a6ea      0x4adbdfa6      0xf6510e03
+       0xcffa5b3f      0x32f1dfeb      0x5151fca8      0xaa899aa6
+       0x095163c7      0x034a2dc6      0x119ccc45      0x5089ba30
+       0x8f605161      0xfca7b679      0x0b0d3cfc      0x17667004
+       0x5991b404      0x168f0961      0xea0a6032      0x80a6e02d
+       0x518dd20a      0xa33fba9a      0xb448524b      0xde77f2cb
+       0xf0bb2fed      0x2e344125      0x8cd3bbd6      0x4be001c4
+       0xd59940a8      0xd75b88ab      0xebc55155      0xe15a63eb
+       0xb25b3baf      0x2a503a20      0x1cc7b5b6      0xf4781bda
+       0x8fa6c80b      0xfe9bc60e      0xbbc20a81      0x34fc30e3
+       0xc160951b      0xfedb32ec      0x6226dea7      0x394b55bf
+       0x6ef58d68      0xda88652e      0x3dd7e95a      0x53eb3784
+       0x023e6f7e      0xcf3fce9f      0x788d1782      0xc9cf4764
+       0xec4fbd7d      0xba5ed578      0x3db7b6c5      0x4f9a2913
+       0x692b39f8      0xe19fba7f      0x1e4635ae      0xb96750f3
+       0xdff7f86c      0x266e0859      0x6fe19f49      0xf03c8d64
+       0x411b1e7d      0xaf2d0738      0x949c2d8c      0x64dd3e1b
+       0x88f857f1      0x7cd7d82f      0xabf654f3      0x7b08709f
+       0x4d667d83      0x0dcf9a64      0xe9510ab9      0x1cac7a7f
+       0x9ba52176      0x4b116870      0x653c69c9      0x4b04c2ba
+       0xc264a49c      0x2a2d17fe      0xbf793418      0x9c43ebc0
+       0xcbb51084      0xbe23359c      0x969bbda2      0xe8f18626
+       0x9496cb51      0x49e4e3f3      0xf2a0e552      0x85f73f27
+       0x2d73397a      0x67a9790c      0x30b56dd6      0x3d3c4339
+       0xde7d3b49      0x35df9146      0xad463797      0x24ff300e
+       0x70eabbad      0xec91b2d2      0x3edbddf9      0xc7d1ec6c
+       0xdfd36d9f      0x0ef9f5d6      0x2c93a79c      0x0881c5ed
+       0x1f917edf      0x83c9e7f3      0x7fe3a8cc      0x63ea6979
+       0xeb2592c0      0xe34ea996      0xacfe886a      0x9841349e
+       0x72d33942      0x3d7994d0      0xefb87989      0x5e919048
+       0x117bf886      0x78c4bd90      0x2518dd07      0xa9f4ba8f
+       0x824c7761      0x715e2b8f      0xabc1d28f      0xe8d11551
+       0xa0ebfcf5      0xc4e8e475      0x4aedaf53      0x3eba506f
+       0x9efbd03f      0x65930a1b      0x54162482      0x13bc5795
+       0xf07d4219      0xbe96bb9c      0x3b0652a8      0xff9bc37a
+       0xceb3361b      0x45ef9496      0x0d679c2e      0x54b90bf9
+       0xe1e6f7ed      0x399fca25      0xa1edcc32      0x69da91ef
+       0xfbb0519f      0xf939a80d      0x5b4418e5      0xb87c864f
+       0x71f29282      0x8af506d5      0x0f6a1769      0x7a453a63
+       0x2a1a4d28      0xe3af59c5      0xc343e93c      0xbe190abe
+       0xda0cec62      0xf562b05d      0x1c9f969d      0xada2b4f8
+       0x9f9d639f      0x0ca15660      0xd600753a      0xf10bdcbd
+       0xe8d94653      0x27607854      0x0ec38c17      0xa2fcb299
+       0x7bda5fdb      0xfda12488      0xa51d5737      0x61e276dd
+       0xb203a049      0xa2253af6      0xed6a68c0      0x347fe408
+       0x6c889e60      0x91537e12      0xd6b090ac      0x5241ec82
+       0x46b47a47      0x22ba24cc      0xd390918c      0x57b7f9b3
+       0xb28c2647      0xb0884c10      0xf9442a57      0xed297050
+       0xc25a169a      0x29f969c0      0xc8e6e374      0xbe45f5be
+       0x8254008a      0x03d600f2      0xe20b0159      0xdcf69252
+       0x04a2f075      0x64cc0458      0x2a5d1e2e      0xa756d276
+       0x45038103      0xa6946d8a      0x72471fc4      0xc32219ad
+       0x123e790c      0x889ca543      0x274f179e      0x30a6dd69
+       0xc3436de5      0x5ee6c85a      0xc98bb4dc      0xc7a1640a
+       0x6d480d57      0x89ace207      0x0022e802      0x7baa70b4
+       0xc14939cb      0xc82e3e3a      0x5700dd7d      0xae8a85d7
+       0xfac3f05b      0xc660876c      0xa7acbad9      0xe64b9bd5
+       0xa4a3fd88      0x96b5b5db      0x0b2c458a      0x350977b8
+       0xf8ba5d2e      0x5ccf71bc      0x559f6cc3      0xa587703f
+       0x79916dbc      0x1641d1f8      0xd95b6190      0x6b1adf04
+       0x108b4f7d      0x639480d3      0x6e3e9153      0xb558d84f
+       0x39bee031      0xfed4cf3e      0x0f926ee2      0x6f293d71
+       0xadb974d7      0xa4af8308      0x04ebdfd9      0x4d72c486
+       0x7189fc9b      0x88aac2eb      0x8075004f      0xa4cca679
+       0x297683a5      0x404fccff      0xc81fa29e      0x869b42a4
+       0xe6befa09      0x7988f040      0x7726b931      0x6f7ab84a
+       0x65415536      0xff448bec      0xdbc9faa4      0xb8d99cc2
+       0x05c4119e      0x8a71c8b4      0x77dfd31f      0x43965cc1
+       0xf24b4a0e      0x607f9e17      0x1ebb9b1d      0xe0c8f95f
+       0xb6677dc6      0xdc7813e5      0xb72ad65e      0x63aeb087
+       0x2da79eb1      0x4f39c354      0xe28d2d2f      0x0f1e904e
+       0xa84941c0      0x0deabd41      0xff332281      0x1ae46042
+       0x54b90c03      0x77d5a3d7      0x4136b5a9      0x54055050
+       0xbbbcad66      0x01237f9f      0x6796b0bc      0x72d4b550
+       0xea1489e6      0x84127d77      0x685db4f5      0x1b579f48
+       0x1b0cb80c      0x7ddeeae3      0xe1b04653      0x7cb328f6
+       0x8b53c4b3      0x26b38fa6      0xd9ea9db2      0x97d07575
+       0x5325e316      0x3e4865a1      0x7605f5b0      0x2b2c432a
+       0xbf2a4911      0xd3f098da      0x8ec35801      0x972ff2a3
+       0x7498b7ff      0xb347e5da      0x9d319a41      0x68d55b0d
+       0xc38b06c7      0x06236699      0x5b50a289      0xb04b5593
+       0x258220f7      0x52f79ed2      0xfae73314      0xbc146ffd
+       0xc8ff7536      0x4a7bd89b      0x35d7820c      0xc52c327d
+       0xad70c777      0xdc9ab7ee      0xf59059de      0x8a202a38
+       0x841616de      0xb50fbb2b      0x15db36af      0xc6292480
+       0x05d33a0e      0x2b8e0f35      0x270aa710      0x0d450937
+       0x28fd506e      0x5fce3b04      0x0dcae2fe      0xef5e5d20
+       0x7a123a26      0x21787b80      0x83ae38be      0xbb44f0ad
+       0xbfe52dd7      0xbd8cb263      0xf08eee72      0x7d0b5481
+       0xd67b0e59      0xeb83bf7c      0x08f45985      0x6db3d92f
+       0xf7d444d7      0xde90570d      0x376012e5      0x103f6713
+       0x6bbec763      0xa6a53541      0x6ab0e563      0x62c3a5b0
+       0x3729c63e      0x5e5e5255      0x0956e38a      0xcddcce0b
+       0x862029a4      0x43ce75f0      0xde44bba9      0x025a4bc0
+       0xb56373bc      0x801d2752      0x7b8e43c4      0xc1c4f98e
+       0x5b3ced72      0xb12b6d0e      0xf831eea5      0x86fe9cd8
+       0x49e97afd      0xf57778ac      0x6ffb8af2      0x785c4068
+       0x5028671f      0x6e0f7f2f      0x9fbc8287      0xe612d670
+       0xbe06c51c      0x5961a0e4      0x296ab25b      0xe545f4c2
+       0x8d6abeda      0x36236cc9      0xd42f13a9      0x9bfa1f5c
+       0xc3dea740      0xe48a8ecb      0x24f8958e      0x6c47104a
+       0x993a7ab5      0x5968bc52      0x424d7ca6      0xa4bab037
+       0xcc874d2d      0xb8c035ca      0xee9dab38      0xfe6eeb13
+       0xec2e2888      0x6f1a25ac      0x47079ed3      0x64448864
+       0x9c3abce8      0x39554f34      0x4fdc2516      0x62e83b0e
+       0x89ae118b      0x830dbe87      0xd690788c      0xc8cc9080
+       0x3a42ed7e      0x183d66cf      0xbeacb93e      0xc1a7f489
+       0x908a957a      0x3b26b582      0xea796e6c      0x0126ee1c
+       0xcb1ddba7      0xd0abf353      0xb84f703e      0x320ae8ca
+       0x294ef6c7      0xb5392b49      0x14349529      0x77d35a23
+       0x8716cbd3      0x30366d70      0x4111270d      0xb0eab53b
+       0x0af79f25      0xf5055b55      0xf0f405c4      0x1a4b5f3c
+       0x834dc5c4      0x28a6a94d      0x66afc445      0x6b919abd
+       0x879cb288      0x1302d221      0x8506e8cd      0x8ea7f251
+       0xe630b16b      0x7f5ff8bc      0x025613c4      0x8e39dff7
+       0x2f37fcf9      0xdea4d4a7      0x0d142386      0x3474db56
+       0x6e3f8281      0xe85e9b0d      0x35802ead      0x78df0490
+       0x9f07130a      0x1e5ebba4      0xe3c4eb8b      0x53a643fd
+       0x3cacc272      0x9c350f45      0xa9ffc6f0      0x33505268
+       0xbf9cb138      0xe84f5f72      0xa70b5d31      0x270d7255
+       0x9b7d1b27      0xa3ae79cd      0x1a5daca2      0x64d248f1
+       0xfde0526e      0xb6cfab0b      0xcaa5153c      0x8b5bc478
+       0xbbd48c11      0xbce8c336      0xd9927e55      0xfb830699
+       0x959cdc2c      0xf82c8dcb      0x6a0922c0      0xe0d731e2
+       0x4ef480d2      0x6abfcdfa      0xb1fcac91      0xae5d5570
+       0x93fd9108      0xd87be502      0xe66b673a      0xb423f9e0
+       0x50312a00      0x8227fb4f      0x23f8fe77      0x045be66f
+       0x949dfe02      0xd89ad331      0x01f0d93d      0x298b0bbe
+       0x8564e712      0xa8a0c3dc      0x34da9c65      0xd98403da
+       0x63583086      0x5ac590fb      0x388f235c      0xc7090997
+       0x2359701a      0xdab76a4f      0xc501b263      0xb3306224
+       0x77bdedb4      0xa1d5ed6f      0x83158d8c      0x108f24c2
+       0x99bdb36d      0x62c37d36      0xa2ca0ad4      0xe2a7157d
+       0xc1e42c60      0xebc6bd09      0xc64014a5      0x6e54c35b
+       0xff07c3eb      0xe0224076      0x197d14ad      0x15ff9320
+       0x57e80375      0x6dff371d      0x7ef4f618      0x56f3d7ce
+       0xb5f5a648      0xa03a659d      0x228fbe9c      0x90a947df
+       0x64e0c7ea      0xa048640f      0x81286c34      0xcb623e91
+       0xeb3c3fd9      0xdbcfbb16      0x514e3d18      0x8e8949a8
+       0x328a537b      0x78e6bc3e      0x644976d9      0xf594ed10
+       0x9063943c      0x4a326109      0x5d22ca4b      0xa8a18e45
+       0x3b595bfc      0x279941cc      0xaf068b0a      0xc4a187b0
+       0xab6a6326      0xc2de2ee6      0x7818b4bc      0x7152e588
+       0x3510f808      0x5a622603      0xea234cf2      0xdca5bcfe
+       0x83ff3c4b      0xfbc24843      0xf025c9a7      0x57821ade
+       0xfcc774eb      0xafbc2016      0x384cb8b9      0x83af43b8
+       0xb2ebf04e      0x26713404      0x995d1dc2      0x900fa7e7
+       0xa4deb71c      0x975dbf56      0xa48fa012      0x310620df
+       0xc5598e91      0x6f45a7fd      0x5740bd08      0xbcd195d9
+       0x9fc787a5      0x5f7b8497      0xd29dfd42      0xc90ff52d
+       0xf343cdb2      0x1cfef760      0xf6a02280      0x36713753
+       0xc0301693      0x621156a0      0xbe327c2d      0xbe57f87f
+       0x121f3a07      0x4d2ca830      0x1a2ef579      0xe86282bf
+       0x94b32361      0x1bb08daf      0x20fc1ab7      0xc51e1307
+       0xe7c478d2      0x3c745aab      0xb10152e1      0xa9cf7c19
+       0x89855a05      0x5b704936      0xe36c89c4      0xbca1a384
+       0x91e82ff9      0x411b14b2      0x1552702e      0x80c5af7f
+       0x16c3f0e6      0xb7d8c710      0xc5b230cf      0x2de00aa1
+       0x93e5270f      0x329d3ecf      0xe83c3c8b      0x9bd37e80
+       0x13bb17a0      0xae432b8b      0x59b7358a      0xdd84498b
+       0xe9ea3be6      0xf9548f7b      0x43a025f9      0x6f3f3278
+       0xac4994f2      0x29d409f1      0xfa324b13      0xf4bf0104
+       0x4b868bb5      0xeba9cc94      0x74775fa5      0x4fdec109
+       0xce1a1b1d      0x86ab89aa      0x5473e3c5      0x684b1ccb
+       0xf68461ce      0xd006c423      0x097ea953      0x23a61db8
+       0xc8c56849      0x337bc22e      0x78b0916d      0x5f0eb33c
+       0x9a8e2d61      0xb8ab4e25      0x294f3db3      0xb5020fd0
+       0x0f43b95f      0x23076282      0xdfd9f6c3      0xb6b208a5
+       0x7df4b794      0x8d2375c1      0x18e026da      0x4f3522de
+       0x910b4556      0x0cc98fb9      0x68589bd8      0x50bb610e
+       0xf29788c7      0x563b4441      0xe7c4e0d0      0x68dbba01
+       0xeb69f724      0x019944ba      0x9bc51602      0x67ad65ca
+       0x31c651b8      0x3621cdfc      0x27a77d52      0x8a0edd16
+       0x7418e206      0x1430bd7f      0x53759d95      0x460226b3
+       0x30fa67f8      0x44c40861      0x3e22f99e      0x40f3e0d9
+       0x4cc0e0f7      0x03b1a264      0x32e26344      0x4ef8f76e
+       0xdcd4b02d      0x62484f68      0x904d89cc      0xe60e8ea6
+       0x1823d081      0x77c356dd      0x38de841a      0x8f9c3276
+       0xf73f3a7b      0x2c38808c      0x0b18b659      0x7cf5a2cb
+       0x45c3f848      0xa5cd8536      0x9168592f      0xc5a7830b
+       0x31d6e527      0xabfbee52      0xe4f41303      0xb1798316
+       0x624d1b54      0x39acf8ba      0x250c9a4f      0xb1ec2879
+       0xc51f3935      0x7bbe7772      0xde143dfa      0x35f62871
+       0xa1ac9091      0xa9b4fe98      0xdd25a0b9      0x1a49582a
+       0x42abd4d0      0xe68090f2      0x3be4e0c8      0xd7a98dfb
+       0x9415e78c      0x0e2f25b6      0xe2517c54      0x8212fd75
+       0xa1493204      0x57c6c0c0      0xa51c5338      0xa72602af
+       0xe26e502f      0xb5cdc20e      0xd711026b      0x0d4744c2
+       0xa75f1f5c      0x7e98dd5a      0xfeb81356      0x4ff292b6
+       0x52858f48      0xfd5a2f28      0x05c1b427      0xdb5071b2
+       0x4d9aa9e0      0x43e7b11c      0xfcf9da70      0x397ee628
+       0x1325a404      0x869bf482      0x5d4284ab      0xe59039b1
+       0xb2f472b9      0x6cccf2be      0xe5860615      0xe1c20ea6
+       0xc30bffeb      0xf86aab5c      0x446775e4      0xb62213a0
+       0x960f81b7      0x23ad7c64      0x8a22c1a7      0x4af56b4a
+       0x39a5b6fd      0x5f16c382      0xcd54fbfc      0xf4a8047f
+       0x708963c4      0xd1d91e1e      0x635e3948      0x3db3e84f
+       0x9e38efa8      0x59031133      0x79599df8      0x83b7811d
+       0x573a60f5      0x9fce4a92      0xe550dd56      0xa491f069
+       0x7c50dc04      0x38ef5b6a      0xa88ee00a      0x4d021489
+       0xf82d4f13      0xd2e795de      0x80bcbf5c      0x365fd054
+       0xb862cbe0      0x634e92b5      0x1871c57a      0x55b6028c
+       0xd2d70f4e      0xdeccb131      0x7888c633      0xc6486b0a
+       0x67f528de      0xa710f46d      0xa84916f6      0x88188cdb
+       0xbb72ec33      0x6685b1e2      0xafca9c5f      0x4b4ff1df
+       0xb84a26df      0xb5fafa79      0xed525284      0x46d4932f
+       0x69116a8a      0x49b167f4      0xa01ef38c      0xbc85cb0f
+       0x25f77bd4      0x8f8a549d      0x1ca73743      0xf5757669
+       0x2f302bf7      0xf5f89a9a      0x850bbabd      0xd85f2611
+       0x1370b3ef      0x3194d277      0x4e9104f4      0x6c757e5e
+       0x00422879      0xa5bedbd8      0xda29c3cc      0xda0df97f
+       0x4986d231      0xd9a24305      0x35359723      0xe2e2fc93
+       0xdfa20ccf      0xdb202187      0xdd4dd677      0xaec9fa31
+       0xcc5de9d3      0x3d3460d1      0x48814829      0x72bb3ed9
+       0xd33fea2c      0x9dd872b2      0x0878cfce      0x6dc204a3
+       0x1a0dc040      0xfe15f8a1      0xeb165407      0xa9236b28
+       0xbee03665      0xbf6fb1d7      0x4f3e87c4      0xe0c58e45
+       0xa065b3da      0x5708d811      0xc266476c      0x9bf4e0ed
+       0xa009cf43      0x7e1678df      0xdb1cd3bb      0x11a4d5a3
+       0xb3721b58      0x4665e493      0xcf7b5bbe      0xdbdef294
+       0x98d670d4      0xaf774cd6      0x66c1056f      0xa51d6b95
+       0xbee90c56      0x6c2a920b      0x77822353      0x8b20fc95
+       0xb2e9f29d      0x111bbbbd      0xacc7a3cc      0x5bfa6e52
+       0xf548020f      0x306e7ba7      0xc14ede01      0x1a9a20f0
+       0xfeeda674      0x441655fe      0x130b52e1      0x7fe59c0d
+       0xd6e4a90d      0xa4653fa9      0xb4575119      0x64896de5
+       0x475f2780      0xff765b43      0xadeb9ed1      0x989bdcd8
+       0xf44b6c79      0x75549280      0xb093079e      0x9139ab67
+       0xfa370961      0x9f0db1e1      0xb8b7a467      0x640ab754
+       0x0d9e5503      0x23fde51a      0x55234ec4      0xd8174f65
+       0x5665c027      0x43b50f76      0x95306f9d      0x7231c9dd
+       0x30722113      0x19f4294c      0xe82883c6      0xbe15602d
+       0xac3e5845      0x4dbee450      0x9bfcaa49      0x02a5ec77
+       0xbeb8c2db      0x3ecd47a5      0xa4505c0e      0xb57a1dcf
+       0x4e6157c6      0x726e81c4      0x724417a3      0xa845ff42
+       0xd092f15f      0x457acdfd      0x021e4490      0x63d0ab88
+       0xa91a2dc8      0xd4018359      0x37957d6b      0x03916903
+       0xa9d4b39e      0x61ee3040      0xc0973510      0x876fe7c9
+       0xa7829080      0x9f747a29      0xefd1fa92      0x4d4adf60
+       0x96c15b07      0x2fb1a011      0xf0513da2      0x384992e7
+       0x8b0eb4d8      0xa56f7d38      0x9f924e97      0x8f78460f
+       0x7a3ee93f      0xe2831c12      0x3cdb42e8      0xeb44f1f5
+       0x9883ab8c      0x29bc9b34      0xb1f32100      0x27ab14cf
+       0xc13d9735      0xb5084ca4      0x340b41cb      0x94e588a7
+       0xf95c347f      0xd9f09df4      0x1fdf7f5f      0x7a484ecb
+       0x314abdd1      0x5d97adcf      0x8f9b457b      0x72d89c5a
+       0x7ecd4d97      0x3e13b400      0xb4ae4fa2      0x26b28084
+       0xc6b580eb      0xc59f8e20      0xa209204b      0x41486eb4
+       0xdb34330e      0x5a2d83d8      0x9c194f64      0xa331ae66
+       0x65b33445      0xdf5b0598      0x425eb210      0x011686eb
+       0x0aac53d2      0x7de4871d      0x8053f014      0x518266e6
+       0xcfe9855f      0x6c62e9f3      0xda2f8d5f      0x8522507b
+       0x1aac59df      0x93ca496b      0xaf50e69d      0xfd4000d9
+       0x91b4a050      0xdbc05f1a      0x1f16613b      0x365756d0
+       0x314ecad2      0xed4da0c0      0x3f04494f      0x4d0487a5
+       0xfe0b97f6      0x0e5162f4      0xcf57c254      0xf7becd61
+       0xdb0d3617      0xbe713ff9      0xdb9d96b8      0x2b4168cd
+       0xa2ac42b4      0x964cb886      0x150716f7      0xce8348f5
+       0x503f4c5f      0x03a1a8e6      0x6b0e90f0      0x2ea85d46
+       0x8204eee0      0x969c6d74      0x0e5b18ab      0xb683d620
+       0xfc9b44b9      0x729b1784      0x2f843558      0xf183fe38
+       0xe2e99f2b      0xa9ae04e2      0x3a60d35b      0x2d345909
+       0xca2c5694      0x12f45060      0x7028db3f      0x07f99dab
+       0x960585b0      0xe5dbc6e2      0x5b8333c5      0x2b77f77b
+       0xc8e70635      0x3b0d7224      0xaa76a60e      0x543807ba
+       0xbecc8819      0xf70cffc4      0xf0932f38      0x7f999e10
+       0xc88672a1      0xd9b885a9      0x4b613e9c      0x7875a265
+       0x2ac88b77      0x240d3c64      0x3de65ac9      0x03b8ce0b
+       0x1c0a3859      0xec94f5db      0x6ceb845a      0x3e9d648c
+       0x1e6c80f6      0x5ee477de      0x30d37b65      0x697b5489
+       0xe8f84f71      0x3a5aad3b      0xd093bd75      0xf27813a8
+       0xd850c6ce      0x7c699f67      0xb32b5d26      0x4604321b
+       0x51a9024f      0xf817aebd      0xf27aaa31      0x20157d53
+       0x866dbf73      0x72d2f58c      0xd5fae491      0x04cb4f4d
+       0xf2c06b8d      0xbeefec8f      0x274302fc      0xde6e2b68
+       0xee8520fb      0x44fa81f5      0x9e4055d4      0xa3dedb68
+       0x9c40949a      0xcaa4b068      0x2ac6c7bc      0xab627d4a
+       0x415a2c59      0x6e14347c      0x5da07b6d      0x1c1be5de
+       0x8fc0f7af      0xc100947e      0x11db7ee7      0x120c92f4
+       0xcd4f972c      0x590ff1d8      0xbc1e7a7d      0x51697cd8
+       0xe48b3420      0x4ea3a431      0x7dd0c153      0x5391d2d4
+       0xd5c5c82c      0x5967e1ce      0x3d44c2a2      0x80f79d91
+       0xe90d518f      0x2cb4956c      0xd9ed5294      0x5cef41e4
+       0xfadd2823      0x8974a1e9      0xd376fad3      0xb192a385
+       0xe48e2a26      0xc8df7700      0x043c9ec4      0xda39fe0f
+       0xea574fb0      0x7ad30f35      0xe9154ca1      0x474e3d20
+       0x6e6af557      0xfddf5772      0xb96fc3e4      0xa39a3f3b
+       0xfb108495      0xd891364e      0x6f8dceef      0x9f4921af
+       0x3310b829      0x6670dfe8      0x0662e875      0xabfb9b48
+       0xb5ae9c13      0x2603e556      0x88c7cd3b      0x9b1beb93
+       0x254b9fbe      0x32042c8d      0xa5e305c4      0xe1a69795
+       0x02b81164      0xe2969e8e      0x7a8334c7      0xf19489a5
+       0x205e36f3      0xdc863e7b      0x513d2b00      0x66368a3b
+       0x7088ab84      0x4907bbdf      0x318ec4a6      0xd89c5d2a
+       0xb5a796e8      0xc0044431      0x017a5037      0x2d3b22bf
+       0x53bb1800      0x2519bada      0x961b8b5f      0x6f8aa8b1
+       0x13a0ec62      0x1e89cff7      0xcd6ab65d      0xb187e96f
+       0xf09827b9      0x8972b571      0x09f1e590      0x7bfb46a4
+       0xa49cbccc      0x71e0777e      0x33c08a90      0x9999922a
+       0x7d18dd73      0x5dc04a9c      0xd578531a      0x9996dc76
+       0x56e7e2b8      0x18e5c221      0x90c07367      0x353e133a
+       0xfc70611d      0x5c89f9e2      0xe9d83fb0      0x42d8ce60
+       0xc0fabf53      0x6481010b      0x6840f4bd      0xac103abf
+       0x2e574f00      0xa3a2d595      0xa96bdc16      0x4627aa4e
+       0x405f6973      0x4faa2d6b      0x861834e8      0x45b6aa35
+       0xa8c437f7      0x13184d3d      0xe7a2d71a      0x2d8e591a
+       0xc5315a50      0xff13cc9e      0x1a249f13      0x9748fd21
+       0x8f17f18a      0xe86acedb      0x061fb9a9      0x43fcbd4d
+       0x0013d58e      0xb832aa50      0x23dc785f      0xc2088707
+       0x7a5a0011      0x93cb4118      0x30804a87      0xc0410f49
+       0x96588905      0x2598c587      0x76a3e974      0x3ae34f59
+       0x9e113af3      0x718ead7c      0x8a85d4c1      0x4fd9c57b
+       0xf6b1d5a0      0x297aec3d      0x0a98d4b5      0x98c7e81a
+       0xa1196f44      0x4e601b2c      0x09307ef4      0xb766e44b
+       0xb184082b      0x9e2d9eb9      0xf8f96c72      0x2558ca03
+       0x24598851      0xaab04461      0x0af930ff      0x5902e1ae
+       0xca847d84      0x96cda635      0x5676016c      0xc4fc69e2
+       0x8d86599c      0x3bb10688      0x7f574931      0xd4c1dc88
+       0x2538bcc8      0x77bf368f      0xe9482551      0x205b869d
+       0x8b226ad5      0x3e02371d      0x6b0640c3      0xe6c4d539
+       0xb88fa4e0      0x98fadb9f      0xdc4884f2      0x049eeac6
+       0x7412f993      0x7f04835d      0x337bcd06      0x492e1391
+       0x118ad88c      0xb30a1834      0xd810970f      0x37b6ec63
+       0x152c4a59      0xbc3e88f3      0x18ae1d16      0x86b98276
+       0x4dd2c554      0xdfad199b      0xec00978c      0x7206c96f
+       0xb440b8df      0xab8ab54c      0x0aeb14c3      0x6693147e
+       0x952fd529      0x97e2311d      0x8f8be60f      0x06aa4644
+       0x88c56174      0xf4f6092f      0x8b724d86      0x6e413836
+       0x6376c213      0x81271734      0xe9ae97d0      0x58ea9606
+       0x27ee585d      0x2de93684      0x1b4841b5      0x57be1727
+       0xf1856cfc      0x10e169db      0x86c47dbc      0x846b1cea
+       0x074cd88b      0x3ce62663      0x908149bc      0x85223107
+       0x3e653140      0x2932e51a      0x61af5c5d      0xfccd7c88
+       0x207b9a28      0x5fdb3d09      0x10e7253c      0x09fa8ca1
+       0x4a5df2f5      0x634333d5      0xf8e69c5c      0x65a237c9
+       0xcc54062d      0x12321c07      0xef854638      0x17b3d78e
+       0x06142660      0xd0d7380a      0x8b13fe7b      0x56d2c264
+       0x1382267c      0x1d1adff9      0x3f824692      0x15438a97
+       0x0abccda2      0x96ea33bf      0xbbc8a37a      0xa393e1d7
+       0x7cec239a      0x897b3a52      0x233158c7      0x095177cd
+       0x1ec2739b      0x166fdfd0      0xd0d1e4a5      0xf6af17b0
+       0xbd232dd3      0x18bd1a0f      0xe71b4284      0x4ed47f7f
+       0xc4d85b74      0x35987b84      0xff192061      0xb1d857f0
+       0x0b823de8      0x475261df      0x47af3bf8      0x117e5872
+       0x0196dbc3      0xb91af7d4      0x849b43f7      0x954a4444
+       0x9ee6c355      0x32be0405      0xb0db0ca9      0x3ad808f0
+       0xe2fb9582      0x1c28a00f      0x71d0505d      0xe35ea260
+       0x82ff9335      0xb8bb879d      0x255777af      0x68d92ebc
+       0xc88d983f      0xaac601e5      0xb9c7abd2      0x04159fea
+       0x1d07c075      0xf1d54b03      0xfdddb32c      0xfc66b0f6
+       0x795938b7      0x943422a6      0xc3100357      0xf2eda566
+       0x16e494f3      0x43482258      0x12de39d9      0xdc23e6ba
+       0xf2faf851      0x27993ab3      0xb6060964      0x7b538f2f
+       0x2aa982b0      0x56d36ebe      0xd6263aec      0xd07724ab
+       0xa634f8b6      0x09ade1e4      0x9d810aa3      0x92a2506c
+       0x9064204a      0x9988c438      0x3189d92d      0x444761db
+       0x496b52ed      0x8c9100d0      0x73cc0243      0x03ff75a1
+       0xd3a8fa51      0x225196ae      0xa0f436fe      0xc6bacf3c
+       0xbb41be3e      0x51179e19      0x58d480e0      0x2a44db04
+       0x3a315e9c      0xc06d982c      0xc9d23539      0x8ba55f8c
+       0xa0c31f24      0x7d3fef38      0x43a887f4      0xbe7f6023
+       0xb1c09c4a      0x5bc4ba37      0x2ce4ffb3      0xd5d61ba9
+       0x2bff836f      0x9bbb9580      0x6f242a1c      0xd6d89009
+       0xe983fbc0      0xaa970583      0x40eb3de5      0x7c40e189
+       0xed9a773a      0x2a3134ef      0x2e8a8ac7      0xf5af3ad5
+       0xa578b242      0x3e53c982      0xd2b771ee      0xf59f36df
+       0xb88f203e      0x6067b8cd      0x0d64069d      0x52d9f38b
+       0x56b494c1      0xb8d8aa7c      0x1fa90e67      0xa172b5f2
+       0xf002343c      0x7bc06d40      0x58dbd091      0xe91e517f
+       0xfc1e5577      0x0359a36c      0x8fd54f85      0x1144ba34
+       0x5a3609b8      0xe910c559      0xe336a70f      0x1c21a8db
+       0x4e3b75d1      0x50d1fff2      0x66117a25      0x2a02db19
+       0xf959d30d      0x92b6a248      0x20c0706a      0x9b95885b
+       0xcda96b17      0x86e17242      0xd1281912      0xff909d5e
+       0x95da411b      0x22a43d49      0x1534c9f4      0xc2fa71d4
+       0x717dcdcc      0xedc2e724      0x64ea2049      0x721429f3
+       0x661dd588      0xf5da23cb      0x435fd9a9      0x7def1a28
+       0xa3b047e1      0xee17b194      0x0d02202a      0x1b4acd9a
+       0x0f557183      0x54538c92      0x7c6973e0      0x59a4f60a
+       0x2994418b      0x7f7ec9e4      0xdddf6a28      0x2ce8de09
+       0x896156d8      0x2b3544ba      0x0b3a4f61      0xef295210
+       0xe68612b8      0x38ee0ed2      0xfdb842e1      0x4bb338ec
+       0xe72f65c3      0xb06e48ac      0x9e5fd457      0x605cc320
+       0x782a871c      0x25415859      0x03aa12d4      0xce27ed0a
+       0x0fb5cecd      0x85cf5146      0xd92c6d21      0x693fd927
+       0xa1154c7d      0x3076d66a      0x5a94ada8      0x56a77573
+       0x7c821b67      0x666d549e      0x0976d365      0x547195b4
+       0x22a6efa8      0xa5d79006      0x83722c02      0x23e3849f
+       0xba38804f      0xa634d1d7      0xfca40529      0x0d99747e
+       0x2e04eda1      0x62640645      0xd4eff1c4      0xdab1eb94
+       0xbc2421b0      0x4f2816ab      0x5339df08      0x76717945
+       0x3d90e768      0x2fc5ef40      0xa6d1a2e2      0x4670d792
+       0x64d02442      0x56d8ebf8      0xbe8a1827      0x36f1ceb3
+       0x4f8e962f      0xe39e58ec      0x8247a21b      0x957ab902
+       0xf390026f      0x84cec387      0xdd1f248c      0x9c91a08d
+       0xa4ce5c31      0xcedb63b8      0x55f7e028      0x8bf3cf8e
+       0x124c7ee0      0x9005abab      0x0d4da93d      0xd54253a6
+       0x4a6301ef      0x64d643d9      0x4ed41ae5      0x8e4c83a9
+       0x21598234      0xf7389a30      0x100eaf77      0x5bdd2cb3
+       0x88c39874      0xfcea8089      0x493acf72      0x57d25c5c
+       0x3e2cc2d3      0x1b01208b      0x49eb120a      0x5eb7e34b
+       0xf96a31fd      0x93315c7e      0xda6fb4b0      0xd2dd6beb
+       0x48adcca1      0x5ef9a30a      0x6f94c49d      0x1f1ff810
+       0x37eb4707      0x68b8ea8e      0x6b8a5847      0x8bbc9103
+       0x2e6c4d87      0xb333cf9b      0x5b2c0178      0xacb02b34
+       0x53ddfda0      0xf4fa98be      0x602e0fe3      0x2b3c25f5
+       0xd27a9991      0x8c116b9a      0x43b35362      0xe25fe05e
+       0xed9dead8      0x67c67277      0x43860823      0x094d4e78
+       0x558ed96d      0x8382a93e      0x20c30e0f      0xcbd4ea8e
+       0xb971c329      0xa8b7ef2b      0x7445e0fd      0xf6f1ef07
+       0x23071d6e      0xbca31530      0xd27aad91      0x297d1b7d
+       0x2559361c      0xf486d25d      0xb75bf444      0x2dab4bfa
+       0x9d8db753      0x4aabda7f      0x81d11c75      0x3c4a859d
+       0xd0b60f2a      0x6edbea57      0xd9f3b42b      0xd252f51c
+       0x13875ff3      0xaa5c1b7c      0x979fb0ac      0xb40c9ce4
+       0x3079d900      0xe952d852      0xeae46ae5      0xf0b90a1e
+       0xaf518b37      0x9d52a851      0x2d8c1a8f      0x57780e8a
+       0x50f9628a      0x1100c756      0x69d6192d      0x448988ef
+       0xc3a3fea5      0x21803245      0xb203c756      0xcc5b1215
+       0x9245c37b      0xa08e799e      0x0db9b26a      0xc5b66236
+       0xb9311e31      0x4b19038a      0x1f3ff253      0x09d63d6c
+       0x75f31ef0      0x76248710      0xa0099017      0x4250ac6b
+       0x254a8707      0xa7569943      0x3b439a3b      0xe288d09e
+       0x672f5a88      0xa68084b6      0xcba91f48      0x448db9c0
+       0xdf10551b      0x84a10f35      0x008b4af1      0x4acc57ed
+       0x36724f17      0x0ec2c1b3      0xc9b135e2      0x2c0638f3
+       0x20c3f50d      0xf0c06eb7      0x1f6bbfac      0xec637e1a
+       0x0145b13f      0xce7fe14c      0xb9381bb3      0xa136bff5
+       0x7b2c9888      0xce8472dc      0x5057fd00      0x3eb0d7fe
+       0xbb02fad9      0xc7916753      0x823abec5      0xe17b2320
+       0x2c090cd3      0x815bcc43      0x99b3d95a      0x30034606
+       0x6a15812b      0xd0f1e2f0      0x942b74bc      0x17ac6a8d
+       0xd1a11423      0x2de79a31      0xd88cf121      0x9b36fed3
+       0xb492889f      0x43c3fcca      0xdb7844ac      0xefbbf35e
+       0xaa7d5b92      0x0b6f30b1      0x88e110c9      0xeff4f11e
+       0x7633adea      0x3dda5e7d      0xd3c89c70      0xa3a07393
+       0x9e3c59c7      0xb65578a7      0x7bbf4db2      0x6d5000e8
+       0x7f870540      0x2362a068      0x101459b1      0x9d820d27
+       0xe6b1d38d      0xe3f1a0a7      0x2ab84484      0x025bf524
+       0xc61703b3      0x949a9e3e      0x9434c15e      0x8a5c91db
+       0xb9ea0679      0xd2af96cb      0xc7a0d345      0xe5dff74d
+       0xd3cf50aa      0x928eff16      0x8ba74a28      0xf3e8dfed
+       0x20c2badc      0x0ec3a976      0xabbea975      0x527660c3
+       0xa4011b5b      0xbea12a60      0x45148e21      0xacb6115e
+       0x4260086f      0xbca635a2      0x5840c38f      0xb627d589
+       0x6b192e20      0xecf49f5f      0x16e3aa54      0xcecdcfe6
+       0x882f8001      0x63eef92f      0x5f9f7509      0x78cb7be6
+       0x0f7ca5e1      0x1dbec4b8      0x28b3b964      0xf7ba8d41
+       0x45f651e9      0x96ca3669      0x6037154c      0xd5ea1924
+       0x3b96a8e0      0xf7d1cfc1      0xefb681f2      0x1e0c2da0
+       0x18801718      0x52a4577c      0xe62d976d      0x0c91d3a6
+       0xdd69ee59      0xf3d3e5e8      0xd41bf236      0x453139d4
+       0x6331a2d7      0xd8199629      0x147d4a25      0xf28f9387
+       0xd0b8dcb4      0xfbf0b395      0x48bb2300      0xbbbaab21
+       0xc492db08      0x3f3dfd1f      0x369eee48      0xbedacfbe
+       0x61757c6e      0xc38119f5      0x96e06a31      0x9f1484f8
+       0xb3252479      0x4e81ecaa      0x779e1325      0xf36b14a3
+       0xe1537d49      0x8d428cee      0xd3193ae5      0x9e9b534b
+       0xb6220228      0x19669905      0xe45ddc93      0x375be8e8
+       0xb8b48aa2      0xd7d66075      0xe85aae5c      0xde09b76a
+       0x0017cdbe      0x05f4853b      0xa400880e      0x5eb1d8e6
+       0x2942a29d      0x9f05eb18      0xf61f40ac      0x23c597d2
+       0x88667773      0x9d115d43      0x1a7f9f37      0xf9eb4fc6
+       0xb193c4fa      0xc498f6fc      0x758fb29f      0x4da3ed95
+       0x5c703a90      0x090155e2      0x6a332a01      0x2c5c766e
+       0x4ae57380      0xe84bd64b      0xf4f33a8b      0x8bc4b91b
+       0xefd3a254      0x04bfbb7e      0xfead0e9d      0x8ac41203
+       0xc7496ae7      0x84f274f0      0xfd1fb7c8      0xb2b3d329
+       0xf3b37346      0xbdbd437e      0xafc67884      0xc0e6cbf2
+       0x70a9cc27      0xf818e439      0xa637a529      0xd3f9e36a
+       0x890751cb      0xbd75f152      0x4d8a05d2      0xf050a2a3
+       0x56148db8      0x087b5cc7      0xd81c4fac      0x05ae220e
+       0x6c609d1e      0x1238e2eb      0x6ccc9ddb      0x2e2b84f4
+       0xd8b944ed      0xe3c13d24      0xdb178633      0x445b8c30
+       0x9dd3c53c      0x6e12a4a2      0xe9707282      0x86f336f9
+       0x0b82de22      0x723c4c44      0x29a19995      0x97590aa5
+       0x4897f90e      0x1c9992f8      0x17ef1185      0x74a1edeb
+       0x0e8599eb      0x963c882a      0x9d28dc60      0x2ca48e25
+       0x75716ea7      0x73cd9332      0x50dfe0ea      0x91f44e55
+       0x6b18b072      0x44f17e11      0x2b3c0408      0x8f167451
+       0x1c96fc39      0xf5708789      0x9a67042b      0x53a55dc8
+       0x00d62c04      0x6b4197d6      0xad4f8b95      0x31dd6a2a
+       0x5ff83f8e      0x1a20b399      0x94e62de1      0x2b6707ab
+       0xd8475628      0x1756e992      0x148f1514      0x8cc89880
+       0x66df6344      0x075745ca      0xde2b3539      0x9c0daa3c
+       0xe4f33dd7      0x66e6440d      0x340b259b      0x0e461961
+       0xc5f9871a      0x48c13c45      0xf7de0700      0xd4ebc695
+       0x5a81d5f7      0xf43f6a12      0x0dfecaee      0xa7258a8b
+       0x029ab98a      0x09d335db      0x6d15b80a      0x561408be
+       0x78c24a20      0x293fcb8f      0xb59d5c53      0x62e474a9
+       0x8a16cac9      0xac96a195      0xda46263f      0x8ab714e3
+       0x28eb2de3      0xaa6b2e24      0x4c28a02e      0xfbc0b03e
+       0x015ce311      0x4fb4cb94      0x75e0ade5      0x295fd817
+       0x7083903d      0x583b627f      0x9379517b      0x90aae152
+       0xadc926f8      0xf729d766      0xb6308cdb      0x7457cd1f
+       0x015acd84      0x6cf61675      0x20cae13d      0x9eacd8cb
+       0x6ffdaeb5      0xfc75ba5a      0x9ca40b7d      0xc0bd650e
+       0xd2920e28      0x3ba043e7      0xbfc24013      0x868e9d97
+       0x2b8ec5c0      0x0e792e3a      0x019dcf75      0xc1ba6633
+       0x4ed5d5b6      0x00abc7ce      0xa00ce6cf      0x09aabb6d
+       0x3ca6bcdb      0x101ae811      0x3f1c8918      0xe3e8c440
+       0x448ef7ab      0x09352730      0x531da8c6      0x71b6fc26
+       0xf1c7205d      0x3b06f2d9      0xbbe6daf8      0x8ffd291f
+       0x05e3a037      0xabdb19da      0x09b8dd0b      0x9458cd20
+       0x1532c626      0xbe7857cf      0x30b00814      0xf9f58c9b
+       0x8cfa3417      0xbfcb8dcc      0x04215266      0x62e7edef
+       0xb8cbf96c      0x23177b29      0x41f114f1      0xc2040cb7
+       0x56447ca4      0x1f2f3dcc      0x822ec94b      0xc23a7cbf
+       0x32660e99      0xd7f16c48      0xf008d9ec      0xe13b7d78
+       0x63ff83ec      0xce778320      0xd711836a      0x00f800b9
+       0xaff6af4e      0x590fd4ce      0x6cd83b93      0x96b9a6e9
+       0xb75f478f      0x295f9409      0xc6581fca      0x2b21290c
+       0x2b4e7c35      0x84c0a1fb      0x41ebf009      0xb1272092
+       0x8055e060      0x3ae9304a      0x2178abb2      0xb59c5b38
+       0x33df9632      0x9b9c1fa7      0x76225761      0x51d5c9d8
+       0x898e2c9d      0xe281ccf7      0x86a4f00a      0x673d0c4c
+       0x32206572      0xca0f1317      0x5f29f948      0x6fb394d1
+       0xb17ff591      0xef614b93      0x0e0f420d      0x91a6bc63
+       0xab44427d      0x93268daa      0xd99882f0      0xd69565d7
+       0xd892e0ac      0x5db25ff1      0xdcef6bbf      0x56cd014d
+       0x880ac90b      0x2900c6ba      0xe4c200ed      0xfad2d057
+       0x79fb4fc1      0x135d9bea      0xec59a73d      0xa6ebc18c
+       0xda3ab47f      0xdb77c2a7      0x69c2caf4      0x83991de1
+       0xfafe44e3      0x7e8d9a7e      0x934b316f      0x5e421ddf
+       0xca24ce98      0x00d98df6      0xe46b5814      0xc6e081b5
+       0xa776dfdc      0x3e3f6990      0x34f7ac2d      0xe752da77
+       0xcb190e9e      0x59b28768      0x48221cc6      0x43619429
+       0x8d1cb372      0xc9377ddb      0x83d7f02f      0xe3f48f16
+       0x4ed6bd43      0x7d52904a      0x83de2c5b      0xd3d8f656
+       0x63ce2cde      0xb38f2d61      0xd27031b9      0xdf3c03d4
+       0xc68db5ec      0xb9e3514c      0x00795bb5      0x100a012a
+       0x800e332e      0xe19aacde      0xd4b6038f      0x4be062dc
+       0x4660a0a8      0xcc5759af      0x897878f7      0x22342fa0
+       0x1e4d8aff      0x41f3dae0      0x5a7b62f6      0x3cd3cdf5
+       0xea6f51ca      0x0e983e67      0x5b766696      0xf826b059
+       0xf09a0b0d      0xd84ac2b3      0x5aeeb3e8      0x3bf5dbcd
+       0xb79672e5      0x06fa7030      0x5ed30c20      0x5fcaa290
+       0xb2c4f2a1      0xa75961cd      0xf1b4e982      0x7872d0fe
+       0x8a62669c      0x33ed98f9      0xee12c734      0x1c70d204
+       0xcd52cb65      0x12892202      0xee056788      0x70f99a76
+       0xeb97991f      0xfff0bca1      0xb906b029      0x4963b1f6
+       0x887c4310      0xdbcacc55      0x7725788d      0x8cc2e199
+       0xd0ef5c53      0x6f44fad3      0x5287d500      0x05308b66
+       0x9eb8ade8      0xf9dc7b1c      0x0d4d3ffc      0x7429fbca
+       0x15af3491      0x9955697f      0x4228e39a      0x463a55a9
+       0x00d95f8c      0xe51c9ae2      0xebdfccf4      0x3be66295
+       0x629034ed      0xabad2be2      0x44aeabec      0x3d7080a3
+       0x4143a1ee      0x5b9ffb49      0xc183639b      0xfad3fb69
+       0x29f6f62c      0x36f226e9      0x5b703d69      0x18ab5b12
+       0x5c8d77a2      0x98649f8b      0xd581758c      0x0cd7f8b4
+       0x4327b2d9      0x95368a1a      0xd115fb1b      0xf40af796
+       0x89d290a5      0x89492e3f      0xf4e43595      0xbd5b6fd0
+       0x4f09a4ea      0x38479d4f      0xfc98aa54      0x6bec3ac0
+       0x62488652      0x5582af82      0xa0a75ca5      0x43314a89
+       0x6dbbf38b      0xb2788393      0xda27176f      0xf7254172
+       0x2af59ed0      0xf5554836      0xe34b5b7d      0x6153404f
+       0x4489677a      0xeff85730      0xb043b04f      0x53b5e756
+       0xf0a03313      0x4a4be252      0x8386b940      0x51c826e9
+       0xddf89c5d      0x2c71fdcf      0x5a108bf9      0x2feb29e4
+       0x5a763c96      0x36296f86      0x4960f0d8      0x219d21cc
+       0x7bb793b4      0x1326468c      0xef50e659      0x02f9fa0e
+       0x28315921      0x92db3e7e      0x5d7d318c      0xd7bf1467
+       0x61eab0f3      0x20891bf5      0x0f674975      0x9764cdbf
+       0x6729d881      0xe2aba927      0x732ff326      0xb0e434b1
+       0xe488f46f      0x29ed16cd      0x585515d8      0xd6a9aefd
+       0x450eb992      0xe6950aea      0xe3857d2c      0x495e9d92
+       0xba9435ca      0x42c8a4ee      0x940d4c33      0x10310bd1
+       0xa7c3dab2      0x1b70c734      0x3f6b40a2      0x7917ecc0
+       0xe3156ea2      0x01b359f6      0x3ea144da      0x9257bb9e
+       0x6f0b078c      0x0b405c47      0x0f5619bc      0xf9f7a7b1
+       0x89253558      0xc7f05fbf      0xbd7f1508      0x5dd43c97
+       0xa88d03d8      0x7bf54345      0x93f4a4cd      0xcdb8d598
+       0x781065ec      0x1a09d10c      0x4ed8699a      0x92420a61
+       0xab559e5c      0x19a1ac82      0xb46595fa      0x7c13ac60
+       0x013d2099      0xa7b46aa3      0xac24aa06      0x2e1d2dd0
+       0x3bae2b03      0x32f2bb34      0xd650d334      0xa901f08e
+       0x79e81800      0xe37017c6      0x8fc55b6f      0x8a12dfd2
+       0xe52ce701      0x5c7f3dd5      0x1201ecbe      0x08d2dfe4
+       0x0a2eb2a0      0x1af945b0      0xe6bbe773      0xe2d51489
+       0x8b6a388a      0xecd81b15      0x0dad9088      0xc46537a6
+       0x88f720e2      0xf63af877      0x52ef02bc      0xe99a2b37
+       0x5c0c4616      0x5102326d      0x358b2295      0xe99ab5f8
+       0xe00db448      0xe0a79207      0x25a9ff03      0xb038291c
+       0x88b4c168      0xeb898740      0x103eaa80      0x058cfed7
+       0x3fa4fd00      0x6908bd9a      0x4777e2cf      0xce7d4589
+       0x114d4674      0x695d4ce1      0xe764f690      0x6fa820fe
+       0x0f276846      0x8b4ec1d8      0x0c96ebac      0x03094822
+       0x0c18d4fc      0xb291cb53      0xb7872f2e      0xa0993d96
+       0x2e236716      0x96c8b169      0x662e6dfa      0xba55cbb1
+       0x2d8fb09e      0x6d163664      0x8a9f5f48      0x81a94df4
+       0x9eb4fc04      0xfd76098f      0xbf259198      0x0bac8969
+       0xfa96ad2b      0xad00cc31      0x10ce7679      0xefe9617c
+       0x0a5fd0e0      0xe475933d      0x0c78a62e      0x91c21a56
+       0x788642c3      0x462802da      0xa1a1ab9a      0xa71ddeca
+       0x1550359c      0xf029aee5      0xd0715dda      0xfe871504
+       0xa687b423      0x2b09bbef      0x9c0fd356      0xd7637e14
+       0xa32decdd      0x951b0fef      0x627f7a81      0xbd7a596b
+       0x8bca5b3e      0xf64a3209      0x9f42065f      0x5a4f061e
+       0x15d45530      0xb48d9116      0xe5e3e11d      0x487053b2
+       0x8cbbd18a      0x4b44d87c      0x93e8d394      0xde496daf
+       0x1755614e      0xd28c28a7      0xe26a4b69      0x03744bb4
+       0xb0e9c714      0x77c3c4f1      0x0cbe3eee      0xa243a10c
+       0xdacbc970      0xa262e44e      0x513a38d1      0x28c65954
+       0xd875dc63      0xf35484f8      0xb8b991f8      0x4989b753
+       0xaffa7212      0x32bd36b8      0x9b9e8a92      0x4fe36b10
+       0x3f01653d      0x85b0b3bf      0xde42056b      0x51e6b399
+       0xd4379c83      0x368aadd3      0x8753ffcc      0x37301bdd
+       0xbaeb3642      0x5fc623c0      0xf7c7173f      0xd6ad14a2
+       0x61da411f      0x28c6fb52      0x2fb2941c      0x0edb5b6a
+       0x3fd16bb7      0xdf0c7726      0x74a2de09      0xe88062f7
+       0x2bc7f6cb      0x90465a23      0x993ee4fd      0x5a269a35
+       0xceada35d      0x3ee2052d      0xe0083e9d      0x247c577a
+       0x42134fae      0xa93a745e      0xa703c551      0x31843951
+       0xef4cc6f5      0xf566068c      0x1d55b4dc      0x42c1ed36
+       0x350d2d94      0x6257c7eb      0x11f834d2      0x96bb27f9
+       0xc88c66eb      0xe08a40db      0x468084b7      0xe9fa8359
+       0x60b25036      0xcee481a3      0x452a6cda      0xfdca0d0e
+       0x1c3bf3a8      0x3a971457      0x3d98531f      0x2c813831
+       0x501964ea      0x349acb79      0x44e875b5      0x53a292eb
+       0xf9588c50      0x6f423eef      0x040be49f      0x9b4e78fd
+       0x8499d9cf      0x5b0d86c4      0x6a0f9858      0x42e458d2
+       0x605a3d3b      0xabbf3f04      0x804f2723      0x5a769afa
+       0xd1492b12      0x22a64c24      0xbd7e0c25      0x28086942
+       0xf3c1e264      0x88b3278a      0xc9d3d58a      0x637e02c4
+       0x1297f21a      0xfbffc9b9      0x2319b83b      0xd32407d4
+       0xa14784ae      0x8eaede6b      0xef9cf10e      0x3d3e00c5
+       0x5b1c1bde      0x9d91a209      0x69cbaceb      0x2c6f8b84
+       0x59dc443a      0xd7e6b99d      0x416c43fa      0x3ad2958e
+       0x3d1822d4      0x4c00d378      0xbafb167e      0xb2468dba
+       0xe29e961f      0x24fe6e79      0xdaad60d7      0x2f011002
+       0xd139c430      0xd23be70f      0x99254a89      0x9451c64f
+       0x954455fc      0x05bd2f14      0xbfbc820b      0x66156aa2
+       0x96934d0a      0x613ff796      0x30a64031      0xfd696ed4
+       0xad6c8015      0x00ae5a59      0x04b44690      0xab7303d6
+       0x227af390      0x93c13b09      0xb59763ec      0x4662c256
+       0xb44526aa      0xa6467137      0x147e75ae      0x8a6c7ed1
+       0x68b61559      0x995abc17      0x20545ce6      0xd712f95a
+       0xc49d70d0      0x6e4b4f32      0x51b6b0b5      0xcf6b6fae
+       0x912c5098      0x5311442e      0xe7f2c750      0xcc8f91d9
+       0x0635e736      0x885cdf7b      0x5e96c066      0xdc32d35e
+       0x0b94de6a      0x4063f416      0xdb0351d0      0x905eccf2
+       0xf164d279      0xb3b28b2d      0x243fe410      0xe383f233
+       0xebed9419      0x72d8ab58      0x5e0a95a0      0x2394041b
+       0x51d0b849      0xd53dc6ff      0x135442b8      0x2b1a50c0
+       0xc89aa5d9      0x366700fd      0xdd4b4e2e      0x36a5ba7b
+       0x25c8735f      0x5b0689ee      0x014ad466      0x2fa0d27f
+       0xe7677338      0xa29b9a7d      0x113f312e      0xf0a51d0e
+       0xc29026a6      0x5ac62386      0xe1f08ba7      0xe2e352f7
+       0x9530644e      0xc10dcb9f      0x96a4c1f5      0xdcf458eb
+       0x807bbd1a      0x17a8ff52      0x5d21220b      0xb29d084a
+       0xede98100      0xfe972081      0x905b9e4f      0x0c163982
+       0x68b51b09      0x4c2d2ba0      0x6b19bfce      0x99db8997
+       0x440039da      0xcda5a6e1      0x037b541a      0xc71fbace
+       0x0ea0288d      0xa0521229      0xa4df10f0      0xf00963ca
+       0x8910ad0f      0xbb969091      0x8aebec79      0xf3f23a4b
+       0xe303ed65      0x7ac7a310      0x7d352efe      0x95ba541e
+       0x57c12da1      0x3e71d397      0xec7cc279      0x5dbeaf8b
+       0xfd328b05      0x4143c12b      0x5c1d47af      0x9b17b429
+       0x4bdea442      0xd075af6f      0xc96f9995      0xad8883c5
+       0xa4ae65e0      0x66cfe62f      0x1626ad8c      0xf90230cd
+       0xa146cab2      0x3a12da95      0x516145f8      0x46a40261
+       0xfed06327      0x5d01ea51      0x1f374eee      0xc53edd43
+       0x3b05ded1      0x4fdace33      0x88d6008c      0xe5552e69
+       0xbf839f05      0x2c048e0d      0xad48b0ab      0x8ee97494
+       0x46ce2e55      0x271a1c6c      0x00b7c0ec      0x7749a5a2
+       0xe362046c      0xe9b62470      0x02495144      0xadb16f01
+       0xb39a0a84      0x0597a94c      0xfef71155      0x2b16a519
+       0x39a08e03      0x32beade8      0x3a6c620d      0x52de396d
+       0x58c4a974      0x8341dc8f      0xd2e0662d      0xc31313c9
+       0x26b9d04a      0x45a09750      0x17ae15f7      0xfcdc102f
+       0xa80ccdef      0x0c91eab3      0x8fc07faa      0xb3d49786
+       0x71b50412      0xe1c5d21a      0x9de14c8e      0x020cda1f
+       0xda603e28      0xd16d700e      0x2cd8d241      0xc4464b2f
+       0x10767b1f      0xacf951fc      0xf1af4811      0x60f203ef
+       0xfe2fdda7      0x587d2066      0x61ed0d33      0x999c2aac
+       0x0c976170      0xf9ba73e6      0xa099d76d      0x0d0fd35b
+       0x9d785bb6      0x29244f0c      0x18c1c4ef      0xad166abc
+       0x305e463c      0x28bc7845      0xc37c2187      0xc06f9683
+       0xa43a493f      0x5358d2e8      0x040e19c2      0xa2f5c830
+       0x6a82664a      0x616c181e      0x5a0edf83      0x515c2d33
+       0x5e0f195e      0x0ca1e76c      0xff5129a3      0x0f1e4068
+       0x9cf970cf      0x6cb8cca7      0xe97060da      0x08568143
+       0x3a1610eb      0x3524ddb9      0xb01ae711      0x414811ae
+       0x93ab7ca7      0x0220578c      0xa6890d60      0x3ffc773e
+       0xf2569e5f      0xfe7bc137      0xba54416f      0xcb09f9fe
+       0xdfc9e943      0xd351ddcf      0x3804eb61      0xfd217c55
+       0xe8e5312a      0x5d2f72c3      0x77d7c53c      0xcb928d7c
+       0xa3e41d33      0x6654f69a      0xdb7305f6      0xc16b160a
+       0xcccff80f      0x9f824e66      0x441a353a      0x092d18f6
+       0x57287b8a      0x8e4f53ed      0x7ac092c1      0xab538ad2
+       0x3ee0f6ae      0xfc5d2362      0xdd9886c9      0xefca45d0
+       0x3bcf7d2c      0x3c13007f      0xb3486310      0x28d85956
+       0xe73b79f7      0xb2826693      0x4a1689ef      0xc7c75bb9
+       0xc6dcf278      0xb7e5889c      0x499a9294      0x40d3cbbe
+       0xb192ba4a      0x07184194      0xc1c4b09f      0x3a56e539
+       0x0b1d95e0      0x7f017eb8      0x34492123      0x87b49dd3
+       0xd18f58b2      0xffeeb628      0x87f933a3      0x5064e080
+       0x0f5ca746      0x0fa6a21b      0xba871262      0xd8e61931
+       0x3b2ecb5d      0xb917a8f0      0x86db03d0      0x98c6ad13
+       0x8af29fa4      0x31246abb      0xbf5fbac2      0x0f0bdec6
+       0x000a67a2      0xda471b18      0xd2878316      0x8032555c
+       0x07a0c57f      0xddef9dc1      0xbf93b2e4      0xccc53229
+       0x6ac5694c      0xfcf56e7b      0x25dd8274      0x61bb506e
+       0x9680824c      0x2108c113      0xc4b99502      0xe10c4403
+       0x7e4a00dd      0xdd9dddbd      0x81b007b6      0xed0e2bef
+       0xcde1384c      0x31ac9186      0x423466ec      0xfe3cf19d
+       0x23fec5f7      0xbc43b9e0      0x168a64ab      0x778d537f
+       0x31aab49d      0x0ef7f7f9      0x8e2972e0      0x7674399f
+       0x06ba8c5a      0xa5d5aad1      0x233fa49a      0xd9ea5761
+       0x34aaba4e      0x76292aac      0x0fd6d9f3      0x4aa42343
+       0xd8a605f2      0x6c377ddb      0xe7cec8b9      0x5ca585e1
+       0x381b2afe      0x56f2f0b9      0x7d6e7858      0x97e0f9b1
+       0x107ce0e5      0xafe55426      0x39b22485      0xe09e7f23
+       0x3edf761c      0x5bfaf7c7      0x777475f0      0x1f859031
+       0xffc7695f      0x9a5921c3      0x70e526e5      0x8464b2c9
+       0x034e8e18      0xbe1ff735      0xd102ec62      0x042f43f9
+       0x3ebca006      0xdf556000      0xe36a069d      0xba211941
+       0x11ccb113      0xd3cd8e1d      0x38720e11      0x6bdc393e
+       0x58981401      0x55d99eca      0x9688007c      0x121e215a
+       0xa0ceecdb      0xebc3685e      0x08ee9340      0xd9b6e22e
+       0x03ffa516      0x758b7f83      0xccbf682f      0xb78a5f57
+       0xb62f97ec      0xe695a1c9      0x2330f7eb      0x14fea517
+       0x40461809      0xd4ccee15      0xd7f9ecef      0x8802908f
+       0x4541cb1f      0x8a5e5b93      0x90febc1a      0xe7c4b957
+       0x72e0d014      0x6706cb38      0x4f51b134      0xa1a42c4b
+       0x83fa8197      0xa518fe44      0xbb486372      0x4c1b1c78
+       0x034490b2      0x18a8b011      0xf554c068      0x5b61d5dd
+       0xbba8379d      0x1d14c707      0xad1d2b75      0xf45d8707
+       0x97bd03ee      0xa071851b      0x006e6b4b      0x0868372f
+       0x8bab261c      0x0cfe4ee2      0x15b51279      0x82f9ccf5
+       0x2cabbc6e      0x6e711b59      0x4891dac3      0x28e148af
+       0xf2fe8b83      0x24c3188a      0x022c4bb0      0x2e248b82
+       0xab97c5c0      0x7f68e907      0xeffa4236      0x0fa4201f
+       0x16a00933      0xda13af63      0xa5b4fec5      0xa4bcfbd4
+       0xb60bb5ad      0x8b32ab4c      0x578c127f      0xf586cebd
+       0xd81f4378      0x723fc323      0x1d229f26      0x05152eca
+       0x31cd4451      0xfc3ced8c      0x18a32d87      0x2d55977c
+       0x0be31b1c      0x79d45df2      0x96c946e6      0x5ce56238
+       0xd22c156e      0x65c2c291      0xb4002bc0      0x5d901028
+       0x729cfe3c      0x47933bad      0x69b1e791      0xf513f3b4
+       0xa325caab      0x23506c6f      0xc8bfc381      0x465fa544
+       0xde615fe6      0xbfe24eee      0x932030a2      0x961a308b
+       0x3cb79a7d      0x8a0250db      0xedec9ede      0x1939ef34
+       0x0206409b      0xeb223f4b      0xdc1ad860      0xf08aaf2f
+       0x67c8cdb3      0x7708d5fb      0x909da6c9      0x723e0e9e
+       0xbf6c013d      0x8a4cf22d      0xb3819e44      0xd7dbc597
+       0x46c72921      0x3ac0b590      0xc4b84c99      0xf8a92e97
+       0x1ef40c6a      0x03203085      0xc346a05b      0x38a3de79
+       0x933b2243      0x614536fe      0xc86051a6      0x88d033c1
+       0x4df02fd7      0x717ad53f      0x98f037fc      0x3d4306bb
+       0xeb1c9a59      0x94213860      0xa0c7dd34      0x6f27b633
+       0xd1486b30      0xf86dd433      0x0b395d8c      0xce53a2f2
+       0xa22fb45b      0x968facb3      0xacf297dd      0xd9c5703f
+       0x576ba00c      0x9e7b9b8c      0x2be66d48      0x6508dd69
+       0xb980c11c      0x93bf667a      0x1e881337      0x1ce801e8
+       0xc1f5fc7d      0x273be22f      0x4fa2d821      0x0510c637
+       0x5f6b635e      0x427d7347      0xf40c1758      0xdffe201c
+       0x7a22edf2      0x25916bab      0x18a99236      0x623f2063
+       0x41ca5444      0x63cf267b      0x6734b211      0x18f1c06d
+       0xa104bd94      0xe9e62583      0x1a4da3b5      0xe048de3b
+       0x80dd5832      0x0396017c      0x39dfab82      0xbbfa6fdd
+       0x72e64ec3      0x1d3a6dd6      0x1f6d9460      0xf385f9bd
+       0xdd076e5f      0xf11df430      0x435c9682      0xbc0c0ac9
+       0xfe3b3b6c      0x4516edbb      0xc42aa77b      0xb7ae091c
+       0x4c143663      0x14bf8df3      0x677383e0      0xcd548ba9
+       0x93792f8f      0x3ad9bfc7      0x2f0c6751      0x133a1a3d
+       0x7010a505      0xb1d48044      0x8a481507      0x13e3a32c
+       0xc5fe24af      0x2b7476b4      0x5dd06527      0xd0f8389e
+       0x25de4e9d      0x9fd61436      0xea7b7879      0xe1c5cd0b
+       0x503d9ce4      0xcde0934f      0x1d9ea9ef      0xe7b2b1d5
+       0x000e0491      0x5d78c53d      0xaa696cc5      0x37ad7f6b
+       0x90df174d      0x9e9fe66e      0xab922d53      0x6a3d19fb
+       0x4eb7dac0      0xf27589aa      0xd19af92f      0xcff88a14
+       0x853f8371      0x0e4bf2b5      0xe1fd1d07      0x9d8f8570
+       0xf4971b5a      0x4159ff3b      0x120a65fe      0xa1dd5dca
+       0xe01663e5      0x59a0ef68      0xcb4dd853      0xaa83b180
+       0x67f849ef      0xf54e52f5      0xca703ced      0x5c210fd8
+       0xf47fe815      0xa25695ba      0x98e947e3      0xfa884608
+       0x2f79457b      0xdf818a2e      0x96d2f2c8      0x61456df6
+       0xc36f5523      0x9aedaf63      0x6fec7f02      0xaf753d1c
+       0x354065df      0x06655daf      0xfe489775      0x194e2422
+       0x1749457a      0x0463aaf1      0xf6ffa473      0x98b465ba
+       0x1fa85d3c      0xb11cb5fc      0x66abff1f      0x55db4357
+       0xd97d1609      0xe443de5a      0x286d07f7      0x5c0ce355
+       0xbae53951      0x5e63e69b      0x7ffd7424      0xae841fdc
+       0x1bb38220      0xa27200b9      0x579e44ca      0xf38b6216
+       0x1d82a2d7      0x8337aaa7      0x8aee45f2      0x7fc829ab
+       0x276b7476      0x695a124c      0x02aad7ba      0x7233cbca
+       0x283e463b      0xaec6e3dc      0xb3af78ee      0xee8cba4b
+       0x8c07a98c      0xcc4ebe61      0x0e86abfc      0xca32e797
+       0xbd24baae      0xa1c5e302      0x658244c8      0x9e78627b
+       0x450bcaff      0x7405ff5e      0x4bdb233c      0xde2995f3
+       0xb3e8331e      0xab082e2f      0xea83479c      0x2a352f38
+       0x3972637d      0x9ae9139f      0xb6a80e19      0xe17db52f
+       0x4eac9610      0x81609e06      0xb50d2491      0x60d958b4
+       0xfbc203cc      0xdb7d26a5      0x349142ba      0x0ab5f7b9
+       0xf62ab392      0xb0f1e31a      0x8136e852      0x4a3d2268
+       0xc584d58e      0xe224860b      0x58d79eb8      0xfbe5fe43
+       0x3d18e4a9      0xac2f776e      0x6b131761      0xd5564fbe
+       0xac7c3ca9      0x3a9d9fdb      0xf5fe28c6      0xd52ec196
+       0xd030a6bd      0xeaf1b5b6      0x73bb036d      0x7a2b9257
+       0x12b62687      0x844c8e63      0xc59291ac      0x8e1c87a5
+       0xc4f0cc7b      0xccc30d12      0xe787d139      0x46b8abe0
+       0x952f5853      0x72b48e77      0xf2e3f0d3      0x58800758
+       0x686c8d8c      0x7dc80ea3      0xc55d2de5      0x8e14a550
+       0x0e8de947      0xa74161f6      0xf6b320d8      0x3573a3a5
+       0xff479169      0xf3137dbd      0x8dc20185      0x38adec68
+       0x78a69188      0xdeab0159      0x4ad2a2c4      0x2d63666e
+       0x1279e322      0x3925b58e      0x60a7c009      0x17de2a16
+       0xebbbc69e      0xeeea14b4      0x6c54c727      0x3a307309
+       0xce93b448      0x7e4c6dfc      0x669ae34f      0x35323865
+       0x16bd8def      0x2937048d      0x16d8d64c      0x5d694add
+       0xf6ecf6f5      0x1238ae13      0x6239dcd6      0xcc3b281e
+       0xce0a63c6      0xb89621e9      0xebcbd980      0xa5cbf1d4
+       0x70df4f8a      0xe0980438      0x4aa731c1      0x0f7975c2
+       0xb0ead74f      0x61974f82      0x384db0b9      0x2cb4e9b1
+       0xb5d8214e      0xbebe8264      0xe36f034c      0x2b753309
+       0xfad36dbe      0x2620e3c7      0xbd66ce2b      0xc53a2e3e
+       0x6714449d      0x831ebcd7      0xb7b5f2d6      0x57a69535
+       0x62515a6d      0x1645c968      0x37b205b0      0x76675ce2
+       0xde00e787      0xb036534f      0xfe1e054c      0x11f88e38
+       0xab787e9c      0x5a158df8      0x161e1662      0x9f545e6d
+       0xf3490aba      0x837ef55a      0xcd4bb007      0x61aae9a0
+       0xba4ab6bb      0xd769baa2      0x42615ea0      0x0bde749e
+       0x57d5ff9a      0x9b5497de      0x24be1c44      0x6d327458
+       0x50e963ab      0xaaa5ecce      0x612f244d      0xe73db30d
+       0xaa337f92      0x1995b6a8      0x50e157cb      0x4bad2f3f
+       0x0c4316e7      0xa5d9b41b      0x0cec474e      0xabc9acda
+       0xfaeed025      0xe274dd94      0x0b4925cd      0xf99467af
+       0xf381ad99      0x812e58b3      0xe07afa8c      0xdbf890a8
+       0x45961d55      0x27988b0d      0x70f0b2cb      0xfe8c512a
+       0x7bd10263      0x8ec2eec3      0xc5555d48      0x99ab8132
+       0xb070a5d6      0x9e172ffe      0xeb0e9e7d      0xa2a49fb9
+       0x6c280b32      0xca6f5235      0x81c37eea      0x5662fae5
+       0x4a4658d4      0x568cd6fe      0xde557c0f      0xe9db63d8
+       0xc719ef53      0xe0faf84a      0x8af06cff      0xbe3e4346
+       0x18f6bc0a      0x9706da71      0x54dcad4e      0xbd9448d0
+       0x9555e097      0x884e4bb8      0xbe0f0c46      0x837db52d
+       0x39d5085c      0x97578886      0xb933b7e3      0x013b4d7b
+       0x987fd07c      0x4ea7e9d9      0x20b16946      0xbb48b9fd
+       0x6aa637a2      0xf7ac0b91      0x85f198e9      0x2d4baf49
+       0x24ec0411      0x4994aa7d      0xa7c7f51c      0x2393ac06
+       0x5d4571c8      0x6e174904      0x63a5ccaf      0xf72a1a40
+       0x59159d31      0x9a019d51      0x512ae9d6      0xb7e04828
+       0x98fe54c8      0xc55d1c8f      0xfa4db367      0xf0ab2bcc
+       0xbc8018ba      0x23f3bf8e      0xc2176f49      0xcf1e432e
+       0xcdafd7c2      0x82e55995      0x7a9e080c      0x7658e1ba
+       0x6a0f09ae      0x8f16a1e9      0xeba0f77e      0xd0c52ff3
+       0x13a9c1b6      0x1a340c20      0xabe6e15a      0x3da73697
+       0xf1b934de      0x4e52b7cf      0x752f59a8      0x7d76fdc7
+       0x3bb20b01      0x9a8dd5b4      0xe4166bf3      0x98eec94b
+       0xe4354c8c      0x23ada159      0x95a44d3e      0x15478874
+       0x0d8ba705      0x2d4a4de2      0x708ab9e8      0x25e4e3a6
+       0xc0f5f48a      0x52eb242a      0x1718fb82      0xa40cfd32
+       0xd8734956      0x72cd9c88      0x2e208319      0x58c1d73f
+       0x3f37c213      0x6ec72127      0x7fc2139f      0xf11f3bac
+       0x4431769a      0xe4ca8f04      0xc30c02b9      0x57e3f89b
+       0x4d1ab101      0x1c4962d5      0x1227c388      0x24253d2c
+       0xc3d46a2d      0x82430c1c      0x7a0258c5      0x6c96d00f
+       0x45a15ec8      0xff43c82b      0x6e014181      0x0132aaae
+       0x006e4d97      0xeaae7c32      0x29d7df63      0x705a3bcc
+       0x66741778      0x097ccf9d      0x3de6e616      0x5b3acd76
+       0xaa7b79bb      0x34e3b316      0xc3989dce      0x25cda16f
+       0x7d07a9aa      0xee780a8b      0x6544d377      0x07e3a1e8
+       0x6295aa83      0x6f250b8c      0xb1f93f05      0xa2e17f9b
+       0x3f1a3612      0xc8bb56bd      0xcd495e52      0xafe78658
+       0x0bfc26a5      0x76ea5add      0xa8d8cbc4      0x45446df2
+       0x7b19f465      0x546f5543      0xa0dc30cc      0x74de6501
+       0xeecb9b6e      0x298935a4      0x885b1b26      0xb9143423
+       0xcce93223      0xe5b5e087      0x13908140      0x6281677b
+       0x7701c82c      0xad3d74a1      0x80bfa37e      0x33ed0677
+       0xbd4168f7      0x4d3354f4      0xc0cf30c4      0xe3289b44
+       0x0d47aad5      0x94747441      0xdf744f8a      0xa461d3b1
+       0x87790d45      0xb730305a      0x0cafcf3d      0x5603c0f2
+       0xd7173faf      0x81912836      0xca7a5352      0x8e49ff99
+       0x89760ee2      0xc82e08dd      0x5bb91452      0xab382cb5
+       0x83779503      0x92330d0e      0xcb5d625d      0x4ee912a2
+       0xe1392681      0xc53a1814      0x13a53dbc      0x0d292998
+       0x1b5fcae5      0xd0ba4d10      0x52b6c109      0xaee5c7af
+       0xec6c5278      0x3f2fdcb3      0x7c306821      0xaa5dcd52
+       0xb1a7d58b      0xe03556f5      0x766767b1      0x4c197a70
+       0x6ac372b6      0xcff9741c      0x0edb006f      0x645ec6e5
+       0x9c5c9749      0x2c03397d      0x98688628      0xdf6400a6
+       0xb3f0a94f      0xb0044905      0xb58c8ed6      0x5fdf2ead
+       0x89c6e941      0xe57f3640      0xf2991830      0xf81efe51
+       0xc19a8bb4      0x3035fc08      0x77c8cfba      0xe821d2c5
+       0xeb464e3a      0xbc585b43      0xdc346221      0x507e5859
+       0x78123b69      0xcb9a448d      0x0682cc21      0xe1b0bc67
+       0xe127f626      0x2cd2f1c7      0x858db418      0x019523de
+       0x6fc85edc      0x58d67a6a      0x1c34ae12      0x1e0738fc
+       0xd9e2b7d9      0x5956f0d9      0x76ffbb5e      0x8ea99a03
+       0x4f28dc4f      0x4f377244      0xe295aec5      0x6ea98b60
+       0xf00b2493      0x2260b535      0xc0810f7c      0x33188d47
+       0xf105cf3c      0xd8ff2c55      0x205f5f16      0x69f94e83
+       0x5e145007      0x07d02195      0x22f1c594      0xeb813738
+       0x3ec889bf      0x344c6aa0      0xe3fa138d      0xc6776c53
+       0x9a0941b6      0x57acabe4      0xf6b79e0c      0xc1a61dc8
+       0x9c3a4175      0x9a525797      0x7ab647d0      0x815c5b02
+       0x843dfd1b      0xc9124fef      0x7da29da3      0xd1cdb4e2
+       0x7d653eab      0x5369353e      0x6b9ec980      0x50d1b2e7
+       0x3bcc95ab      0xc6b78936      0xc0d6f8db      0xdaecd71f
+       0xbd0233b8      0x362fd051      0x63aa338e      0x22902c76
+       0xadf9081e      0x765a075d      0xe8d43ed4      0xdd6c35d8
+       0x4ba6a975      0x119690f1      0xd7e6b01e      0xd8dca103
+       0x4e22374e      0xbc8ec469      0x57b00417      0x18e8d991
+       0xda02c93f      0xb0228936      0x6ab10d11      0x722b5a1c
+       0xf6363195      0x75785c34      0x5139025d      0xf7a69b80
+       0xb1492176      0xad952fe7      0xe82d0408      0x448916e6
+       0xbdfea2b3      0x856e72cd      0x417e78a0      0xac28fab2
+       0x27c13cdb      0x0b930623      0x12f7b26e      0xf0aed34d
+       0x1f8f749c      0x35222817      0xcac9bacd      0x7f777e74
+       0x97a3e115      0x8f85c9f2      0x1452e0fe      0x7e2ed8b3
+       0x587ed189      0xbc188f85      0x0142c616      0x3444faa6
+       0x01818417      0x2124ff4c      0xeb7197e0      0x63118334
+       0xb29b2be7      0x5ca49b49      0x06f468f7      0x70179c4b
+       0x1e9dd3c9      0x3c7a32b3      0xd92aafd9      0x4dfb63c1
+       0x7fd439fe      0x4058c739      0x9b521f02      0x31825fb4
+       0x3bbe4125      0xaacc1cb0      0xa514cce6      0x68d2cc09
+       0x38b567d5      0xe227ecc3      0x0b24c16c      0xe06c6dc2
+       0x46068fcf      0x5c00e286      0x944697fd      0xc5edfda5
+       0xdf8636fe      0xf282f091      0xd1e8711b      0x6665c15d
+       0x855da354      0x1e62debf      0xda022ca9      0x3c0c64a4
+       0x7562ee7a      0x4acd07ed      0x22508388      0x70630601
+       0x15a16675      0x57b86658      0x5a102137      0x480ad6ed
+       0xa9184349      0xc705efdd      0x48999b87      0xf6e6ba1d
+       0x749e7bed      0xacc5a5b2      0x310b2c7a      0x7861d6fa
+       0xbc55a09f      0x19e737a8      0x2bc6513e      0x3fc6bca3
+       0x4dfea26f      0xe24d8b91      0x83629535      0xd1052687
+       0x20cc4383      0x7aa1e7d7      0x75b153bd      0x2f2a9ddd
+       0x48873223      0x4791b746      0x8fe42fb3      0x9fbbedc9
+       0xd43f965f      0x726a4e05      0x65185962      0x6740ba54
+       0x0b656909      0x581f22c4      0x779c19b1      0xba293041
+       0x26a745c2      0x8ea1971a      0x9ff74024      0xc227ddb7
+       0x5b5ee97a      0x1ae82d7b      0xefc5dad1      0xb5ee41e2
+       0xc8485664      0xd41e7c0b      0x8f8427df      0x6ff3e568
+       0x362a80a9      0x6893e2dc      0x2bda7f0a      0x491e3fc4
+       0x550e8b7a      0x185ca646      0x82760f19      0xe3f78d81
+       0x980ac0a1      0x42933c59      0x88424db2      0x99a6e1c3
+       0xeb739d1a      0x4aca1f81      0x795f7ff9      0x21d4e69f
+       0x1d80bd9f      0x2be3a32a      0x3c0b3c65      0xfb303676
+       0xff635b42      0x294744ea      0xc848d076      0x640370f7
+       0xd35a60af      0x12417850      0xec1ed4cc      0x07667b00
+       0xa76d46f1      0xf932cc84      0xb11f5ec3      0xbd9ac4ae
+       0xf23dc67c      0xa66ea9cd      0xe7e7c4d8      0x492e5337
+       0x5dfa2c73      0x0b4d7290      0xb50d334c      0xfcf14143
+       0x86046298      0x4e1cd1b0      0x4f3a7b97      0xd073633c
+       0x95814eeb      0x6c1fa6b3      0xed98842a      0xee2299bf
+       0xe80ae8c1      0x78757d9a      0x6b053062      0x46ffcd36
+       0xfa60e6d3      0x5390aaff      0xc81a0a94      0xd26e396b
+       0x3cac31cb      0x4c381753      0x18de6247      0x9297661e
+       0xd6825ce0      0xfa31f8a5      0x5e800708      0x737a5a11
+       0x66dc1fd5      0xc67d1f7f      0x778da819      0xa049e76a
+       0x5aab1c1d      0x05c6f21e      0x8b573cc9      0xe44fd3b4
+       0x2490cb7f      0x65905197      0x040e1ff1      0x8a0192a5
+       0x0d46ab54      0xde0e6d81      0xa093f87e      0x819d8b7e
+       0x9b0f2745      0xb66b8de1      0xac8c5c80      0x0dc5313a
+       0xd840809e      0xbc414760      0x4e06e034      0x9d8366da
+       0x4ef6f4dd      0x7488a4c0      0x83ee53fe      0x2011285c
+       0x98ab3f5a      0x300432be      0x4fdd5dec      0xb2748763
+       0xe40d3aed      0x848d99ca      0xc86aaf2e      0x717ecb92
+       0xba543092      0x3f440cd8      0xe4d927ec      0x9cb09261
+       0x426c46ae      0xac3a9a36      0xfe83b64f      0x6947e370
+       0xbc7663a5      0x7debc201      0x651093f0      0xa2962378
+       0x619f6068      0xa06d007e      0xd0c48de3      0x785efedd
+       0xd633152f      0x4ea99c02      0x33fad1d3      0x9c9b3c98
+       0x942fe460      0xfca551f6      0x16a8f197      0x2ad918f3
+       0x94f02ef3      0xd6524fad      0x72d470fb      0xf84e52f3
+       0x8722801e      0xefe0a8a9      0x8e593529      0x019f9d30
+       0x96dc0ace      0x1b768040      0xa49f11e3      0xcff9cbcd
+       0x58b36b7c      0xe29ea1d6      0x455f4346      0x74f0c613
+       0x5a8bf97e      0xda51b363      0x6c576397      0xe9252092
+       0xffa92b65      0xdc2ccaa1      0x30065dbe      0x2b7f108f
+       0xa84346ce      0xc91916ae      0xb4c5ee03      0x416f4879
+       0xcdef4c5a      0x76332689      0xbd319e93      0xb8bcf385
+       0x5e77a40d      0x05de0696      0x52fc9818      0x08faa0ab
+       0x1e67d791      0x25ef893a      0x9f937fc0      0xbed5bfac
+       0x93c5f640      0x0abf759d      0xc0d4d7ce      0xc4ddcfaf
+       0xcd9befd6      0x20ffe316      0x1c07fd48      0x7cfb08fb
+       0x4f28a8d2      0x18678aa9      0x1a2753c1      0x73006703
+       0xb3fc95f3      0xfc0cd3e5      0x7fd92714      0x9fd4671b
+       0xec12027e      0xcf9e56c7      0x7dc68849      0x31e717ee
+       0xbe531bf5      0x94d45305      0xfb405c7b      0x9ad135e1
+       0x723c100e      0x37e302ff      0xa036eac3      0xb3a77e75
+       0xf4c34278      0x349e3c04      0x66df304f      0x2dcf838f
+       0xd82a3e00      0x5bd6e392      0x83b9a9a3      0x14dfba4e
+       0x3873144e      0x71c3347b      0x7a4e65fb      0xcd3ba935
+       0x1153574e      0x83fdf44a      0x49a48aa9      0xe1f9083b
+       0xa8119f21      0x05209f0f      0x14384d4b      0x27bcc004
+       0x745fa1da      0xba6eed19      0xcb47e66d      0x91d6a558
+       0xbad8add2      0x4f1d5fb3      0x4dc75258      0x966f48e2
+       0x120c1609      0x9b13a6d6      0xf0a16805      0x1898766c
+       0xde1b9ff3      0x5a9d507d      0x4a565e8d      0xbe88c31d
+       0x16936be5      0x1f44c02b      0xc23f0825      0x9269546e
+       0x00e3de36      0x5d47f411      0x0b46ab97      0x95e0f199
+       0xe0b995a4      0xb8c3beb5      0xa4432016      0x10cea427
+       0xd300cb4f      0x924d8a9f      0xaffcb88d      0xd1e1e4da
+       0x7da61ca2      0x8bc8f183      0x780a0c28      0xe518dc05
+       0xeba38ea9      0xeb7d767c      0xdaa2103a      0x23364f67
+       0xf02ee3dc      0xebfcfb0b      0x0f22e18f      0xea8fda82
+       0xa23ae037      0x3722e408      0x6738483f      0x33e8165e
+       0x3e9c6495      0x5882f406      0x04ac661d      0x1e85cd16
+       0x827d5265      0xff8d3fc9      0x3d948b6a      0x18801705
+       0xd9347fad      0x30f8f3f6      0x1ea4d500      0xd5f3c765
+       0x828b37f4      0xf15d533d      0x73df58f9      0xe870426e
+       0x928607cc      0xcc5fd660      0x0fb578db      0x75db215f
+       0x8fcebd47      0x48e3e363      0x0f5d9d96      0xa9d0116e
+       0x1503a34d      0x1ff75383      0xe3e24a22      0xfda79fe0
+       0x2661dfd1      0xc1d34c3f      0x971e62ff      0x817f1f64
+       0xb03fc646      0x0c74b735      0x2e81d310      0x701fe3a0
+       0x6d6e6b96      0x0ebf1774      0x604e3178      0xb3737445
+       0x64d91cb5      0x990caa97      0xb977e546      0xabae4409
+       0x4ccddbe4      0x34d7fa5b      0xfe227368      0x95c83782
+       0x52b2408c      0xa20b8018      0xac5db689      0x3ee04364
+       0xffc63f30      0xcc81d116      0xeea99fe6      0x61c785af
+       0x15a718cd      0x24134c77      0x4146e78c      0x75dad204
+       0x7ebc0c8c      0x39948f39      0xcb38fc43      0x9c1e1f63
+       0x48168b5b      0x1c97e121      0xab09a405      0x1cdfbf29
+       0x4334229a      0x9480fcf0      0xc34091d4      0xa44e0419
+       0x546a720e      0x8ba3ee43      0xc8cb3289      0x9d123fd9
+       0x1519a7f7      0x2a585ee3      0x69fc1b81      0xb42ab658
+       0xd231f924      0x2b55834c      0xfae439cf      0x6816fed5
+       0x4728350b      0xff2664dd      0xfe0d8f6a      0x3ed2f728
+       0xc4e4ad5e      0x50347bf7      0xcb8231f2      0x82e044f3
+       0xccfb78c7      0x5c022555      0x481136cb      0x79dc4fe3
+       0xa687f0d5      0x07d65c8a      0x66bca01d      0x9bde6dee
+       0x85a64c04      0x519940ca      0xb22f6e13      0x2b21382c
+       0xbb81c8fb      0x64c04056      0xc73b33c3      0xcf9a79f4
+       0xe6e4b7e4      0xb4152ee3      0xee23a4c4      0x157801be
+       0x543017db      0x95bb0125      0x42511510      0xf557fdbe
+       0xe374e3e4      0x31f68073      0x0de44372      0x38fed503
+       0x57cabf0e      0x34288cda      0x7661344d      0xc2e63fa4
+       0x7f3d4dd9      0x140190e9      0x15d48c13      0x784659de
+       0xeb682991      0xbe375ace      0x2bc63394      0x0d19af78
+       0xbf2bb9a7      0x282380e8      0x74ebb09e      0x11a6a055
+       0x342a3522      0x33d85fa5      0x6c396814      0x303e6ec8
+       0xde031b17      0x191695c5      0x5fe07830      0x62f1b548
+       0x5438d408      0x2cfb1c0a      0x67920f0d      0x9d590b84
+       0x16e7f74f      0x97828a47      0xaf4dcdb3      0x2f6317e3
+       0x6a7a91e1      0xff788f24      0x8e940bc1      0x473842da
+       0x0cf70214      0x7090b9e0      0x71261810      0x3b7df990
+       0x3e669354      0x8759af39      0x77c72d8c      0x0bc8c22b
+       0x7f1b8ba1      0x281fcaef      0xd16accc3      0xccdba102
+       0x1e931718      0xcd67cb44      0xcd19710e      0x7a7f0f36
+       0x375f6e2c      0xd78c5578      0xf55e87a3      0x3ef95e3e
+       0xea710ceb      0x5a072489      0x61fbbf4f      0x5f1d0fc9
+       0x598edde1      0xd7042d39      0x1673d192      0xe6973f99
+       0x084c3ef0      0xbde1539b      0xcdd1bf5e      0xca42632f
+       0x777a38b7      0xf8fecc39      0x8549e0a4      0x625dce14
+       0x6655a073      0xb04e383a      0x44f016ac      0x866c7973
+       0xbb46d5fe      0x994a5098      0x4c3bd918      0x21c73df6
+       0xc1fd4b52      0xd0a9e113      0xa2f03acd      0x974451f9
+       0xedd42ca9      0x38870eec      0x2f3e1b4a      0x79c69186
+       0x15eea43c      0xc90855b9      0xace00357      0x60ce8e33
+       0x80d117ef      0xd854a15a      0x84cd676e      0xa31d1739
+       0xa0ca6d4e      0xe84a4524      0xde0136a5      0xdd79e656
+       0x88b7eaff      0xbd93d15b      0x30ab675e      0x6207f62c
+       0xd5490adb      0x7480e321      0xea81773a      0x387136b1
+       0xd5c22105      0x6e706735      0xa4eb2744      0x0ad9a079
+       0x83349037      0xc330d3fb      0xa81ee533      0x3125b1c8
+       0xd1414bd7      0xa30afc4a      0xd99525e6      0xdaf73c51
+       0xd3b98ee3      0xf5b290c2      0xeb799214      0xc7e9133e
+       0xf8f0076d      0xf445bfe9      0xbdd0518b      0xa30c24b9
+       0xc5d25b6d      0xa25ba659      0x79234f3d      0x86c8e684
+       0x8066483a      0xd961e632      0x832d1959      0x44a38ea1
+       0x9cd3e3a4      0x6b1abcdd      0xe4a7fa59      0x46841d79
+       0xce38e676      0xc2757fed      0xea7f7e78      0x779eff59
+       0xf7ee861b      0x0eb695d9      0x3fe9eb7a      0x6c6290a5
+       0x63cecae9      0x7cedb7e6      0x18878277      0x8008091d
+       0x1df089d5      0x9bbe0075      0x7f59089e      0xde5aa796
+       0xd06bb3e1      0x02e9c5e3      0xcfba6549      0x1bd9fb0a
+       0xb44ab1f1      0x35f7999a      0x95d63438      0x083b9457
+       0xf328d4d5      0x16f37ae5      0x82beada7      0xe26e4fb1
+       0x85864258      0x0192a536      0xd0f8b4f1      0x5ecfb19b
+       0x025fb800      0xee2aaf36      0x792c49aa      0xdd0187c3
+       0x498647b8      0xe1b41a63      0x09ebfd9c      0xc96f26f5
+       0x3fc48981      0x8c68303a      0x47a867b4      0x643df6f6
+       0x84892cef      0x28516233      0xe4c27a44      0xd3129381
+       0x493d3917      0x7062877f      0x74bde3f9      0x72f9e8c6
+       0xa2bb3b66      0x712c2227      0x386d2f0e      0x458392eb
+       0xaebdce7c      0x22555760      0x37c7af5c      0xc651c231
+       0xc8a649b4      0x7d15f31b      0xdcb9328a      0x36ea9cab
+       0x3ada09f8      0xe01b773e      0xb7697f5d      0x917aef7e
+       0x8190eaf6      0x83b98ef2      0xeef18e70      0x697c4607
+       0x0906b079      0xdf06e862      0xf05b4850      0x2ce2f7f5
+       0x0540ca6b      0x682a2bf0      0xbb8263da      0x1422b9f9
+       0x17f35559      0xe2fbcfbe      0x7e8169a8      0x91b8db24
+       0x42856196      0x0be5a1b4      0x28999d2c      0x2f6be076
+       0x5269e8c1      0x48cf5766      0x03591611      0x5b72dbbb
+       0xad300303      0x9eb1aa63      0xb7166a5e      0x6c274e92
+       0xbe0c6a40      0x69fee3ff      0x5a8dc033      0x40cee68b
+       0xab9b80f1      0x2395bfc6      0x4afb3b5c      0x9bfd39bb
+       0x4aab7a4e      0x23df70a9      0xf6c340d1      0xf0f3848f
+       0x90e7fd19      0x25e0a7ed      0x31074934      0xcddd2fb1
+       0x6ea34d68      0xe0f3778b      0x7c860177      0xa26b92e6
+       0x4437a325      0x70fd57a5      0xfc2cfa9b      0x13485039
+       0x1bd4e4e2      0xaaeea86c      0x4de37971      0x75d20efd
+       0x34e1ec93      0x5ad122f3      0x6e2f668b      0x6ea6aac1
+       0x3b94f845      0x8f61513e      0x2e485e46      0xab7132fe
+       0x5e9e8bfa      0x50ab19ec      0x0285e572      0xbe3ad39f
+       0xc478eb3b      0x19a94c85      0xf557c5be      0x36597029
+       0xd37529a8      0x5f0a58ab      0x6417f0ab      0x03d94597
+       0x70120a10      0x2b6db78c      0x3943d9e9      0x66acedbe
+       0xf6b6badc      0x471decb4      0xb73d3e40      0x69502e0b
+       0x341820b7      0x3c2c79b8      0x0a7b038f      0x4a3343ae
+       0x3ae5458f      0xf6848486      0xcbc982dc      0x2dee4059
+       0x35a21444      0x7c8e0bef      0x8a8cfdee      0x1534c92e
+       0xb432312b      0x05b6fa03      0x9b83cf74      0x379159ed
+       0xc21f11b3      0x7282ff01      0xcf0740dc      0xd879705b
+       0x173817fd      0x916f3350      0xa496225c      0x65ddbff8
+       0xd61d525a      0x982e0fce      0xf58fa7e9      0xaf6312f1
+       0x499fa2f0      0x1f793638      0xb03eb6dd      0xd821309e
+       0x4f4a5ed0      0x0cfc458c      0x9b65653d      0xd7c822a0
+       0xe46c1f97      0x5c27b2f6      0xe6354696      0xc4ea6beb
+       0xaf06e287      0x6e8c0b9c      0x74175332      0x11cf494b
+       0xf079ce99      0x4be03c9c      0xa95c2dd5      0xcfdafa90
+       0x3177ca27      0xb2dcee84      0x9201dcd3      0xabebd63c
+       0xd2fc184c      0x37f40e4d      0x77e93ad3      0x0112f0cb
+       0x72f682b8      0xf6f3fc87      0xe6abce78      0xc7cf5e60
+       0xabfd3462      0xe667595d      0x98870028      0x0982701f
+       0x80b9062d      0x6e044289      0xbe7d907a      0x44d68dbc
+       0xc9167700      0xf6c5ec5d      0xc5b4ce20      0x2e1015fe
+       0x55442dfd      0xd7ca7610      0x841c88d3      0x9903db7b
+       0x95ad7edf      0x9ebf0021      0x4fc157ec      0xf600c811
+       0xf1ad1f59      0x0d77c2f1      0x89b8d3d2      0xdd9eee7a
+       0xffb17d22      0x4fca690f      0xc4c1f2d8      0xc8afc94a
+       0x0c7c1745      0x4bb621b6      0x3d75ceda      0x6f9746f0
+       0xf44dbe8e      0x9b850efd      0xaab6180a      0x57527cb7
+       0x3534dd3f      0x1ff6e803      0x76bb9cfc      0xcab36e54
+       0xf385f182      0xffac20da      0x5b8a43bf      0x5fbf4d2f
+       0x2b77642a      0xec1e5c93      0xb0504cac      0xee0e922b
+       0x5e01b38c      0x42dc278a      0x843ab524      0x6992589f
+       0xf6a2af67      0xf346ead1      0x505098e9      0xb00a139c
+       0x2eb081d9      0x3b4cd203      0xd9413240      0x9990a5b6
+       0x5676de55      0xf3adf5b9      0x830c656b      0x79c55512
+       0x369b7724      0x1afeb32e      0x8118eccc      0x07c0c588
+       0xb1a09254      0x2bfed2e0      0x214222eb      0xf502928c
+       0x1bb4ca24      0x6187288f      0x670b0606      0xcbaf70c5
+       0x807f7d2d      0xe78611ab      0x8dd22008      0xb73fd276
+       0xa341efdd      0xb6d8127e      0xbe9fc22b      0x55be147b
+       0xa695937c      0x7708e3e6      0xb725bf90      0xd7c3b12b
+       0xb33f78e1      0x3955a329      0xff0958a8      0x743e23ba
+       0x97e9de7b      0xcc7a689b      0xb151a7de      0xe4984eba
+       0xf195140f      0x4dc261e4      0x6c71f17b      0x093af5c2
+       0x60744fc9      0x0fa1278c      0xda239485      0x038c1f90
+       0x87986901      0xd2357350      0x81fe692f      0x31124229
+       0xc8203adc      0x815d2334      0xc5fd3cf6      0xe2b42ac3
+       0x9c029ef5      0xfe7ac665      0x14e38a95      0x3ebddbef
+       0x28a90740      0xac71efc4      0x94c6a80b      0x4bdf6813
+       0xafee9d1e      0x7fadc051      0x73411618      0x764783c5
+       0xf6060dda      0xbec13966      0xff5875b9      0x324a6ee6
+       0xbf1e3746      0x8c3f5217      0x98c5c05d      0xeb471a9e
+       0x39d7c5db      0xdb2177ca      0xe571d2e1      0x29c0d496
+       0x2023e0df      0x2c96706c      0xe71db3a2      0x8cffa8ec
+       0x8116a4fa      0xb4b69138      0x24b7f4ff      0xaa6378ef
+       0x6046cba2      0x844d9636      0x7aab4c05      0xedc065eb
+       0x19cf7b8f      0xae8a03bd      0x0ab6ab51      0x0bedbda3
+       0x85b64a54      0xceac8f63      0x75125a25      0x955b497d
+       0x465edb99      0x2007e0a9      0xeee988ac      0x1c0643b9
+       0xc7f956f0      0xbf0630a2      0xf7a6c53d      0xa7432f9b
+       0x80d2d9bb      0xe1787fee      0x0aaa4f57      0x06f4272b
+       0xe7493a41      0x2dcd4866      0x30e70a10      0xe955370b
+       0xf0235059      0x01ae1e21      0x963d6d77      0x960cfd6d
+       0x75be5eeb      0x4a86dbab      0xcabc4b66      0x3236c834
+       0xa45290b1      0x659787ff      0xc131650e      0x48d2d9dc
+       0x1a8f7c4c      0x63998c37      0x06c454a9      0x1ef993e1
+       0x41aff645      0x00eb2b91      0x101894e7      0xf9b1a117
+       0x0ed070a2      0x290180da      0x9a14be60      0x6e3d03b1
+       0x4d3d4ecb      0x80d8ef94      0xcf339b07      0x388cf142
+       0x8cdb06fb      0xb617e890      0xfac0d770      0xd1fcf799
+       0x95d67721      0x5ea6a7e6      0x85128e9e      0x7ec079eb
+       0x29717fa8      0xbf09763e      0x0ebd8399      0x3f480024
+       0x87d3e528      0x16dda779      0xb7ac97a9      0x86d52702
+       0x936317c3      0xa5947d34      0xad5cbc91      0xdf5e64bf
+       0x0a8eb1d9      0x715a4b03      0xb808be4c      0xe2765963
+       0xdc2a6110      0xff7d6f90      0x5c739c74      0x155c8b7c
+       0xf395f600      0xf40a488b      0x7fb36cca      0xe9682285
+       0x83ff1c7b      0xe91b8074      0x2a46668f      0xe273d76c
+       0x5dd8c7c8      0x3f8abd13      0xe97e90fd      0xbccca860
+       0x6f0ccf46      0x9c188444      0x61999556      0x8b977e47
+       0x46174143      0xdbadc2f3      0xeb6ba578      0xc4897ba9
+       0xf07a464a      0x36f4753f      0x3364e813      0x36d5c7e8
+       0x4bf18a52      0xdfc3a153      0x1ad55f91      0xfea1e967
+       0x0c85fd48      0x5384a6b0      0x6b8de6e1      0xa151346c
+       0x3e7a6851      0x152d49e1      0x78ceb464      0xca23843c
+       0x6c9d37fe      0x260ce22e      0xcc079bc2      0x7d566992
+       0x668a3668      0xf4279295      0x656265c0      0x400012e9
+       0xc27edd8f      0xc152a52f      0x07bc0d7b      0xe6d35b5d
+       0x8b03c2aa      0xb3766dd3      0xdc3bc28e      0xf34fb1f4
+       0x38dedbed      0xafa38639      0x6e0fe8b0      0x2dd874d0
+       0x5df7dae6      0xaf0d2384      0xeefe7264      0x6a478257
+       0xcdf1ff32      0xa2334718      0x8dd5b342      0xee98b780
+       0x617fb349      0x864925cd      0x46b3c744      0x8040c26e
+       0x3353a788      0xcf239c08      0x02d1cc8a      0xe9dcb96e
+       0x275423ee      0x644ee983      0x3ee92c68      0x89b5ead6
+       0x4a602133      0xd9b3a33e      0x30de9de7      0x3eff27fb
+       0xed3b1293      0xd5a05946      0x372e88c0      0xae88aaff
+       0x91246608      0xce011ebc      0x94550884      0x9d3a85b7
+       0xdda9250d      0x20542a8c      0x94e4af41      0xe1f80d11
+       0x2d82a816      0xba9f7aff      0x582c84c7      0x5c43393e
+       0x8ca04919      0xf5629c65      0x45054732      0x64385e70
+       0x39383a84      0x3f0e29d5      0xfc1e597e      0x79177f66
+       0x233e2caa      0x3ce767ca      0x79637b04      0x416d574c
+       0xb9569e38      0x3b7dac61      0x2f1f86a4      0xe1360d10
+       0xdf186d84      0x1543027c      0x98b43803      0x5b9b960f
+       0x0a591f8c      0x8d76209a      0xc4cfca15      0x073a398e
+       0x66dccca3      0x48719052      0xbf563d06      0x006b07ba
+       0xed497412      0x084caf89      0xc7f1d375      0xf95e97ce
+       0x2e5fa564      0x59c414e8      0x313a7bd9      0x3b8c87b2
+       0xc4963711      0xd6a6f603      0x82ee462a      0xa88093bf
+       0x67e41f29      0x4512ee1e      0xc38e3a82      0xb3ced654
+       0xb75a798d      0x881ef18b      0xc204a60a      0x27f7cc5a
+       0x8d35ad28      0x55594352      0x48a42223      0x259d8299
+       0x499d2033      0x08f5ea05      0x886a5b5f      0x36b20afa
+       0x9d49a192      0x01c82790      0x861342a1      0x60e0c409
+       0x10805370      0x77d499ce      0xa4c7dd65      0xadcf7d07
+       0xb1dde041      0x875c3723      0xd9dee136      0x2ef52a50
+       0x4f604958      0x460a4cdf      0x90c070a6      0x717db9a5
+       0x2fdb4939      0x93e75075      0x5299f7c8      0xa73e1cab
+       0xdd00cf51      0x534c76b3      0xf2f7b53f      0xb1523453
+       0x31e9493c      0xa3257b99      0x879cd2a4      0xd74ad3d2
+       0x5919c860      0x4799f960      0xcf5d884b      0x3c6993c0
+       0x10b6ea4a      0x86fbf23e      0x8c7be0e1      0x4d573966
+       0x1a893b58      0x3d91ee3c      0xdf041806      0x7654f684
+       0xcdb8a2e3      0x790b3d04      0xa9cb7d65      0xfca1b3ab
+       0x143c2c58      0x7595bc5f      0xaf4b4a40      0x57e69cc1
+       0x0dd31961      0x303d1795      0xa2a63e3f      0x20dcc683
+       0xf374c161      0x72105c7f      0xbf2faa0c      0xdfb12f28
+       0x8396721b      0xd75fbb08      0x6941bcfe      0x46c7fac6
+       0xfd526b99      0x72e68fe2      0x0950f9b1      0xbf298858
+       0xd8c0f08b      0x9bf1aa3b      0x21048aa0      0x8a90fb0a
+       0x12036d46      0xe4ca93da      0x7e2cb27e      0x4beaf867
+       0x8d62c893      0xea10003e      0xecac918f      0x86205028
+       0x3b54abeb      0xff5d6617      0x1c267469      0xc68f5c5d
+       0x1f1659c7      0xfd478aca      0x893e1748      0xc7998d21
+       0xd230ec24      0x394ddb56      0xcca6aae4      0x3f2c2f4e
+       0x248ae819      0x67b13e4b      0x5864309f      0x0beff2ce
+       0x33198654      0x4baeb6f3      0x342ada7e      0x4803dd05
+       0xea8892e7      0x5bb0efc9      0x19c01d97      0xa7aeafa5
+       0x70fe7a60      0xc32bca1d      0xbf231477      0xfd38a5d1
+       0x5dda8f7c      0x4f81a2c8      0xf1f60ac8      0x4e5ce4a2
+       0x65e9d910      0x0c874bf7      0x74c3c85c      0x344f381f
+       0x15030e53      0x70127334      0x51c5d7ca      0x044ae0ae
+       0x66f10350      0x3aa8df7a      0x21880a75      0x260d14eb
+       0x133da4c8      0xbbc8e897      0x76756741      0xfe69c06b
+       0x6c95899b      0x411fd880      0x552b7d85      0x3b30d292
+       0x77435e89      0x1355beee      0xdf003991      0x6a15a772
+       0xc5d80050      0xd5c9382c      0x84cdda29      0x94cd9965
+       0xb5a84a3b      0xa08abb0a      0x7a9d6141      0x9bae52cb
+       0x8c07ff9b      0x28061f0f      0x5a0c5e6d      0x9eabdaa1
+       0xc97f23f3      0xead6928f      0x7269206e      0x884229c7
+       0xc7d771c1      0xa3aea19f      0xbbf0ceda      0x4140012e
+       0x8cf90bca      0x5b2d3152      0xf287f031      0x41f8d35b
+       0xa103ebc5      0x5aa73c70      0xacab87c7      0xdcaf712e
+       0x78410214      0x2d9cfdaf      0xd39dfba8      0xadc67ad2
+       0x73cd67c4      0x7aa75914      0x6571e799      0x39adddc2
+       0x8546ffa3      0x6b4bce4e      0xc2e8a1b3      0x1b104196
+       0x55cb07f0      0xb90bc06f      0x0f230543      0xfbadd0aa
+       0xd098422b      0x0e34eafa      0xbee3ddd1      0x4df90b34
+       0x3f29b4db      0xc87e2f94      0xeb54be37      0xc374ff38
+       0xac22f71f      0xa8aebf4e      0xea310c0f      0x6c21369c
+       0xd244dd2a      0xa68d4f48      0xdc6a92e1      0x37caf199
+       0x66082e5d      0xcb124920      0x70af34bf      0xc5796cdc
+       0x368a9147      0x149f376b      0x4e69caae      0x33f33e7e
+       0x5724c343      0x05b13f9d      0x01b87bfc      0xfc263eb4
+       0x3c5f38cc      0x0a5f6033      0x2e4a54df      0xf530e3ff
+       0x3d1c60de      0xa4ba42ba      0x9726de09      0x0046806e
+       0x9791823b      0x4d64cdeb      0x88d5e42f      0x597daa59
+       0x1c55c15a      0x39e015a8      0xc538e916      0x00ab7195
+       0x9071b51e      0xd97ae2f7      0x9807d116      0x5cea5164
+       0x8d74c00c      0x6b251b56      0xbf58fbaa      0xac250c07
+       0x945daadc      0xda7917d9      0x7c068d3c      0xc004802d
+       0x0296b4fb      0xe1b1a5e8      0xd5ddcdf5      0xd7b6183c
+       0xe5bd6c42      0x2299abf3      0xfa87e2cf      0x3686128c
+       0x82cb8d29      0x6654136f      0x3e9ab17a      0x44dd6e32
+       0xb44b0faa      0xfafa413f      0xec73d96e      0xce064861
+       0xd411bf46      0x8e4e4621      0x2218e385      0xc535040f
+       0x6cd85d4f      0x514bf4a3      0x9ea8d8aa      0x8ba6bb48
+       0xf46738b1      0x3f04c9a7      0x52c13abe      0x83ced633
+       0xd7664fef      0xfdcdc5ec      0xc1f2e432      0x889da687
+       0x620ecf91      0x7af5d799      0xe69493b7      0x5b738999
+       0x4d2cc130      0xa30be59f      0xe9b5473e      0x71896548
+       0x906b8a23      0x5a76224f      0xda560e42      0x3b92f7b2
+       0x4a90e2b4      0x6c2a9744      0x0a0219ad      0x845e3b08
+       0xf3fe408b      0x4745a6dd      0xbfa574d2      0xfa49e8fa
+       0x44940ff1      0x086b919f      0xefb7460f      0x550eb161
+       0xb032a166      0xfa434888      0xc4cc385f      0xfd2ff664
+       0x3d4c1f99      0x82c06f59      0x2de837b1      0x6b52dd0f
+       0xb6ad23b1      0xd05151b3      0x0a2871e0      0xe85226f7
+       0x9043c92d      0x79058576      0x33a962f5      0x17cff6fe
+       0x0b78888e      0x6622d840      0xbbe1be04      0xa50efc0e
+       0xb53934a8      0xb4ea37d1      0x9f4436c7      0xfb53b5f0
+       0x6e68d93d      0x30184ced      0x14fcfaba      0x38a492a8
+       0xe6f0a8cf      0x9099de6f      0x5765d144      0xe111d965
+       0xa473138d      0x3be66029      0x1d365c34      0x4deb53d2
+       0x5e9c4f90      0x68b67bf3      0x0c897ffa      0x93b561a5
+       0x8f5eac9e      0x091c8c8f      0x4fa0298b      0x7e38101b
+       0x34c62801      0x0f735c36      0x419ff5a9      0x9d8e68e3
+       0xd8038989      0x1bee76c9      0x38089cfe      0x7d19097c
+       0xbf31a9da      0x33bb0d59      0xc76b443b      0x1ee83f21
+       0x807f8f06      0x0ee9612b      0x3f459f79      0x103d2f72
+       0x8da89260      0xacee343c      0xa46b2d58      0x2a60396b
+       0xd117b1b9      0x612c34e2      0x591fb909      0xc8144a5a
+       0x0d779add      0xb6b76e8c      0x7d5e1708      0x55f21741
+       0xeeeba67c      0x0eafa75b      0xde498575      0xd15fb914
+       0x6ddf1959      0x7bc7b6a6      0xc144abc1      0x26afb10f
+       0xb29b7512      0x7815d027      0xbec51943      0x7d6583b5
+       0x8f26a407      0xb7bfd258      0x8cfcf59a      0x0a7a9e66
+       0xde51a634      0x3f787f74      0xcaa26da4      0x736c83ee
+       0x4634c5e8      0x66b64dd5      0xae95b8bf      0xe2bd2894
+       0xfd8ba4ec      0x0c20a2c7      0x813a64ad      0xc60af07a
+       0x732dc477      0x601e0197      0xe04ac001      0x564bc90f
+       0x4a9d25e7      0x11f65eb9      0xe6fea958      0x223da6c8
+       0x8581f601      0x88145d23      0x1bd42c0f      0x04f2d28a
+       0xe24654c9      0x5b08d2cb      0xf6546ffa      0xa5a744df
+       0x4cb791c2      0x61f5f89c      0x6b803a24      0x5f546567
+       0xb1199d2c      0x2a22c0c7      0xd2ae5c0d      0x090c6055
+       0xe1037d8e      0x7b41db99      0x7514e362      0x17fd5157
+       0x34ad8c90      0xff662bf0      0x1f01570e      0xe6169186
+       0x54d47ec5      0xdab4af4a      0x7fb2d49a      0x9e2e4a49
+       0x32c44e3f      0xa6bf1ee2      0x1faf2814      0x29282a53
+       0xd0b72abb      0x2ffbd0f3      0x21006432      0xcd46d7dd
+       0xf64b0313      0x1d03fa9d      0x4389c1d3      0x3703ceec
+       0x36aacd09      0xfef7884d      0x7047cbe7      0x8954f663
+       0xbea645bd      0x2c6b3f10      0x029b36c9      0x96759c04
+       0x10ae8d9b      0x4d85f973      0x756b5ec1      0x2eb35037
+       0x3100e803      0xd01905ad      0x448c28c9      0xbabe98b7
+       0x788d6d6d      0x71da1dab      0xa4927839      0xa56ab98d
+       0x0087dfe0      0xe1337450      0x65585e30      0x99b63afe
+       0xefcaf038      0x2d099c4d      0x32407de0      0x9b094c50
+       0x6ece7c59      0x6d86ec20      0x6a2160cc      0x0bc3e325
+       0xa54f792c      0x0544d34e      0xebaeb072      0x7638ba3d
+       0xc8fc882f      0x0f532d93      0xd77dd024      0x65d4edda
+       0x9c2e5637      0xf73c0d0b      0x16e3d323      0x7de101fe
+       0x91f87849      0xefddd1bf      0x8b24af18      0x233cd450
+       0x2785dca5      0xd2214427      0x59459371      0x7ae571f5
+       0x48ce3223      0x080f86a3      0xd308cefc      0xed2e45e1
+       0x5b6a4315      0x1466f286      0x83ac8bc1      0x5567eed5
+       0x8090b29c      0xeae1d679      0xfc238d76      0xc1eb7c42
+       0xdfdec1be      0x7fdaa172      0x8016c65c      0xe89476ac
+       0x599236f5      0xaa124bb9      0x515ea6f7      0xf16851bd
+       0xa3fa9be1      0x401feacb      0x516145f2      0x77b305e9
+       0xd8cff8b7      0x4300572d      0xa6c42289      0x4a73a9f6
+       0x21e2894f      0x4af4dd20      0x43fc544e      0xcfac2867
+       0x66fc9def      0x7332fdfd      0xaaaed04a      0x32ce1d6a
+       0xe6725a79      0x50206ae3      0x2eb4a6f2      0xd0c7df73
+       0xd1bd6097      0x15774ebe      0x4e104db1      0x2f5cfd5a
+       0x3e74d537      0x65716c73      0x08458a3c      0x0b74ce34
+       0xce8d90f2      0x21afc2d5      0x72216251      0xa0f312e6
+       0x253644fe      0x42b7facc      0xe3f4fd41      0xcfc21f7c
+       0xc455fe9d      0x706fe56f      0x8c04af77      0x70751b53
+       0x7df3a3cd      0x43712289      0xe5882298      0x8afd8557
+       0x76462a24      0xbac24d74      0xe165ad81      0x23b9a538
+       0xa71c0137      0x6fb1cbf7      0x0b51ebc8      0x114a447b
+       0xd6e07bfa      0xf0a6c415      0x8cb99dc5      0x2e0e31e9
+       0x1bc18710      0xe4b96a4d      0xdac3872a      0xb741211f
+       0xfe9e7a77      0x76e645b3      0x4852ec86      0x1d6d982a
+       0xfde19d14      0xb6da8f9c      0xa951999d      0xb3086f10
+       0x8aebf978      0x8ee3286e      0xebd52207      0xf1e2a866
+       0x228798dd      0xc8087195      0x2315b21b      0x9b500be0
+       0x9ab8d442      0xf152d839      0x85a8e3ed      0xadcab2ca
+       0x1ebe2197      0x5126e698      0x3dff6302      0x2941336a
+       0x28326340      0x61880041      0xeb2fd2a3      0x3de1e2a2
+       0x1234da0e      0xf3b1549a      0x1f283cd0      0xf3821c39
+       0x59754e35      0xcbb933a2      0x4436d243      0x54ca0de8
+       0xe632538a      0x23869338      0x4d35d0b3      0x285377d1
+       0xbd299300      0x515d7481      0x09b2fc0a      0x98b5bf50
+       0xbab2b7ee      0x8780f346      0xafdfeb1d      0x22ab972c
+       0x71fce448      0xda57ebad      0xfe0a2785      0x01da0d77
+       0x375aaed0      0xa3d414b7      0x4fb19891      0xc707aff2
+       0x8ca1d94a      0xa6d23c03      0x04d6dd16      0xa6b3f879
+       0x1eaae384      0x9b99d588      0xc689af4d      0x4fcc25c1
+       0xcdd7eb3a      0x75b95712      0x62703e21      0x116d06dc
+       0x631c9abc      0x2d3f0c11      0x696bec86      0x7c5c2fbb
+       0x2409cde4      0x6dac2db6      0x3f9bee2f      0xe7e54a27
+       0x56768bcb      0xc0368fbf      0x93fce0d3      0xe92313e4
+       0x093a7b97      0x5d2af760      0xdef2ab6a      0xbf3863a1
+       0x6106d416      0xc434bd1d      0x06d63078      0x2f1c8c81
+       0x755f8476      0xecb494ca      0xb08c6ceb      0x5d593d08
+       0x40c2e068      0x54d3308b      0x936c1d1a      0x4c96a092
+       0x6fa95de8      0xc12a9b48      0x9eb5e5eb      0x98c087b7
+       0x508ce106      0x0915df8f      0xcb43a306      0x05e72250
+       0x21e16fa5      0xb00fd201      0x962639e4      0xb0893d78
+       0x514b8a14      0x8b151be4      0x2fdeffdb      0xa450fe7f
+       0xf0e63b7a      0x4aa0ebff      0x8a8275ef      0xef853a85
+       0x7efab0ab      0x0a4fbd19      0x697ddf85      0x8df6998f
+       0x5e69b745      0xc64c3a08      0x79829f24      0x460e3a41
+       0xcccbdfb3      0x8da90a90      0x39f81dec      0xce305d2b
+       0xbb35f3ff      0xe399aa1e      0xace951a3      0x1bd210df
+       0x5ec90597      0xf325cd5a      0xcbd78d03      0x9d04c0cd
+       0xa86595a5      0xfeefc2e0      0xc0d28407      0x4e9f69cb
+       0x4d4f1bed      0xc970f33c      0x62186944      0xa6c6354e
+       0xde435280      0xc8ea7a55      0xeab20041      0x0e95491c
+       0x78b3821a      0x763ee3b7      0xc8100ce7      0xce83c316
+       0xcc1a0c8c      0x13d1a74f      0x39ecbbde      0xe98145db
+       0xe302f8f5      0x22eb6a20      0xa8f74af8      0x41ddf49e
+       0x8433cd5b      0xc456c28e      0x6afb686e      0xa5db1c39
+       0xc83cb0c9      0x4419fd52      0xd44db362      0x20cd4d63
+       0xada966c8      0x3bacda86      0x437d4ac5      0x13973b39
+       0x4a49b85c      0x99b48075      0x23f0c25b      0xdac8cf6a
+       0xdaab7730      0x19a518fe      0xd95b8162      0x71902b5a
+       0x70013771      0xae97283e      0x4444c4dd      0xfc275dfa
+       0xc29f21fe      0xa39f3abe      0x7cb3e13b      0x35d6cc56
+       0x056ef713      0xe2dc81cf      0x8fd0c22c      0x6db640d2
+       0xfe3ebb1f      0x531c8302      0x80cdaded      0xa9fb8c4f
+       0x274bcf29      0xf62eff4a      0x12bb82b4      0x7e4ad163
+       0xd8b1f0d8      0xae5bae34      0x2165bcef      0xf50ba211
+       0x68557956      0x7e67449e      0x99ee2ccc      0xb8b69f15
+       0xd9b36a24      0x63b27cc6      0x4badcb12      0xea899076
+       0xf975b6e9      0xfe58ebcd      0xc5ff654f      0xcaa7d6fb
+       0x5ea2e405      0x90ae7199      0x72ec3b9a      0x2a453106
+       0x47d3b1a5      0x361d8aa6      0xa149a23f      0xc8f8d390
+       0xe5d7318c      0x326a2bba      0x9118a5a6      0x6c219a33
+       0xe05fb376      0xc9004bd0      0xabe44e0d      0x3870fe2f
+       0x3c728447      0x84406b26      0x318c800a      0x0235ac0f
+       0x16c01806      0x27c4d984      0x8f14f125      0x658b3b5e
+       0xdb28aefc      0x630b641b      0x3fb5ebc4      0x634a85cf
+       0xe80ee19a      0x33e0826b      0x518e6a12      0x999713c8
+       0x667f8d0b      0x0cc9a577      0x508fb0f3      0xa5d6e73d
+       0x20e61c9b      0x50f4f2e7      0x236c8a4c      0xade76a7c
+       0x0fa450c1      0x0c54f03e      0x72fe04be      0x8ff73d80
+       0x392bee56      0x15b5b4c6      0xa62b7a0b      0xb796b3a3
+       0xbbcbf54f      0x80417daf      0xe574a712      0x28001ea8
+       0x5e30a497      0xa6a25c14      0x32ba16c6      0xd661e4a6
+       0x817f509e      0xa496d2fa      0x1e4f8cf4      0x90f78f96
+       0x163925c7      0xdcb0d33d      0xaa865639      0xd3e387a4
+       0x14fcf5ec      0xc21eda73      0x923784b0      0x097bcd98
+       0x0fcda2d8      0xbbb9ebad      0x5f064dae      0x40dc2c31
+       0x7f0a08f9      0xe7dbc5ef      0xe77aac9a      0x591de70b
+       0x2cc62bdf      0x47a345ff      0x81edc110      0x53d48b75
+       0x566557e4      0x0c42d611      0x9edd448d      0xe5f4814a
+       0x27dac99e      0x3f135f84      0x84f9493d      0xd4f2b218
+       0xdbd3f692      0x78c3348e      0xb5af1757      0x763a3c8c
+       0x876b14ae      0x806a90c7      0x4e7f5dc0      0xb4591516
+       0xc91b6579      0xf3df296d      0x3dc74e23      0xa08e7b7f
+       0x14057ec1      0x5871291c      0x5062175d      0x85a85b54
+       0xebf56545      0xc0a81211      0x2598fcfe      0x7eb97d02
+       0x9a854167      0xfd613310      0xfd850f78      0x1fc72c95
+       0x45c218c2      0xd44e9a3c      0xca586f12      0x57c3f9f4
+       0x44802040      0x80064ad7      0x23fc4c50      0xeb9ed0f3
+       0xdcae36be      0x38f6e23f      0xf3385950      0x0e101cae
+       0x1bd16945      0x232547a6      0xf42c3231      0x3711c4f3
+       0x1f7e8a4c      0x31004985      0x12da4ae8      0x543c4828
+       0x7f6818d5      0x921559f3      0xb8d51d29      0x52e0ff15
+       0xfa8fe0c9      0xb828d1e2      0x4521a9d4      0x186f4757
+       0xeaab0188      0x61cb1636      0x516a3dd5      0x9d3f2958
+       0x02b28e7b      0x434d010a      0xb5169c95      0xb65d4e5a
+       0x6321b3c1      0x890ac766      0x308f6b60      0xe54788cd
+       0x9e90752f      0x7036f8bc      0x86f97de0      0x5ec031ce
+       0x14857989      0x9da1e45d      0x5216f2b6      0x4c589080
+       0xfb55177d      0xf671424d      0xfce77383      0x950281b0
+       0x401609f3      0xd9516273      0x219e07b4      0x06a5a04b
+       0x190f2f10      0xbd1c7956      0x0476d223      0xae30e102
+       0x9c5efc75      0xe156c478      0x6f004a43      0x00333843
+       0x6d8e6818      0x382ccf95      0x4c82bfeb      0x7ab758c0
+       0xa459cbd0      0x7be79ec2      0x9cfeed10      0xa9d0caf7
+       0x7192124a      0x902f0cec      0xaa932326      0xb8e7c76c
+       0x130deb5a      0xeb354197      0x7680bf6e      0x54e7bf33
+       0xd4307c79      0xbd907fb3      0xe72b54cd      0x32255b9a
+       0x5a535257      0x3b9d7736      0xb30d0792      0x96b18203
+       0xc4ea711c      0x97fdbc19      0xc59eda9a      0x69cc67fe
+       0xadc51de0      0xfe2a0dd6      0x806cd25b      0xa466a58f
+       0x200f78de      0x1089a442      0xeaa6bd5f      0xc84ac519
+       0xf1e80f62      0x58636f84      0x48f3438b      0xcf725f01
+       0x5a82943d      0x8dbd5a00      0x5c989265      0x60b58123
+       0x80f6d70d      0xfd1d61f9      0xa171fd28      0x5618614a
+       0x841f993f      0x705228f0      0x04016a43      0x56594302
+       0x9828b756      0x50e2ea9d      0x118e59ff      0xc356bb3e
+       0x9f946380      0xf715706c      0x885ef6a1      0xf5f81e59
+       0x98b6f836      0x9a375f8b      0x2842891b      0x85462288
+       0x0669f199      0x25fe39d9      0xec1eff0a      0x78d8116d
+       0xc5973c6d      0x3008a2d8      0x57e18637      0x57ffae27
+       0x3c4ad88e      0xd8e93dc7      0x52ff67e3      0xe5cd75a4
+       0x421c56bf      0x6b15b0f5      0x7f41f7c8      0x60e92dcd
+       0x67c81bd9      0x927b1693      0x245ae76a      0x809aa48a
+       0x15b746ae      0x22bf4dc1      0xbcf5b625      0x9a3c4bac
+       0x14451f53      0x5aad23ab      0x97c9c618      0xdc76caa4
+       0x929066f9      0x4d3d818d      0x6611708f      0x3ce63234
+       0x1b349745      0x5262efcd      0xaefab5a1      0x2306ce0a
+       0x57977451      0x277663b2      0xf772cde9      0x384dd60b
+       0xd8b4b7e3      0x5b3a187d      0xb7692fae      0x45bfff07
+       0xa2043035      0xf851c7fd      0x1a8b848a      0x66b8f87a
+       0x0ae0a524      0xad92f9d6      0xd7565a73      0x5ea51378
+       0xa2319d9e      0x488c427a      0xe9a39c18      0xe2b183de
+       0xfd778117      0xad88bc56      0x14f76023      0x6589b358
+       0x257130a6      0xcb6184d2      0x4aa80502      0xcd5605b7
+       0xf53e19a9      0x9953e7bd      0x669d6448      0xeea8c2ee
+       0xc7b213b6      0x079a1cdd      0xad1d5103      0x5561fb0c
+       0x3bbe50b9      0x9ffa0693      0x78051ade      0x7b73c195
+       0xb414ddba      0x47899188      0x18026d9c      0x2bdbe5ac
+       0x9f65cab3      0x91950d72      0x3dfea1de      0xdd61569c
+       0x6604206d      0xf4ba96b9      0x20820f66      0x7f0b0243
+       0xa6a0f325      0x5eaeb2d9      0xf789bc01      0x1373f654
+       0xd4a47473      0x04425ded      0xdd9a7f3a      0x3abf275a
+       0xe263ea14      0x8f6169ff      0x3a63a3b2      0x87ba15ee
+       0xd0a5a156      0x26bde235      0x931edc59      0x03c4e928
+       0x323aca3c      0xfedf8396      0x209f2f4e      0x1aef810a
+       0xb3f2679c      0x3316418b      0xb553434c      0x8634c005
+       0x30a100ab      0xc245675a      0xb206ea0c      0xedfa5ab1
+       0x6b4b846d      0xfd5fd128      0x29798aec      0x5fc41f53
+       0xb15722b5      0xbe1d3033      0x223adb78      0xc1fe8904
+       0x76de3953      0xaee33aa3      0x10dfc850      0xa6e4a584
+       0x8920dc0d      0x21174399      0x0a5afe74      0x94d90916
+       0x86ecc3da      0xf656eb02      0x85857ecb      0xe3f5ca94
+       0x7cf0e460      0x4e0bf7f3      0x1a04ae50      0x73372cc0
+       0xcccf3b51      0xcdd169d6      0x22b9106a      0x1fa60507
+       0x6925bc91      0xe36356de      0x359f7032      0xe86f8dd8
+       0xc327a0cd      0x2ca53f93      0x6e315548      0xe73a3e92
+       0x8c42965e      0x8645d7ba      0x4770dad3      0x1a7886dc
+       0xec8e8307      0xc8ff6dcc      0x1557a35a      0x4c1b527b
+       0x435da150      0x32bf6ecb      0x6d0bf563      0x3284be9f
+       0xb9b23587      0xa33477da      0xfce96214      0x47972a39
+       0x1fbbf2ca      0x25627d43      0x12f86a56      0xde86b0e9
+       0x124c5903      0x6b86de58      0xf7952a1c      0x1a6b63d0
+       0x9f8bc4d7      0x030e5131      0x44f06ade      0x4f71d355
+       0x2e965410      0x40ca062e      0x70111389      0x660d6267
+       0x678a5c80      0xdc1ad7a2      0xb29961d8      0xd2f26196
+       0xcf275c02      0x3190a61a      0xd45b4aa2      0xbbf7b9db
+       0x7829943c      0xb8f7274b      0x0c1c0585      0x163d0476
+       0x6efc76b5      0xc5fef0f7      0xa75c14f3      0x2cb9fe8e
+       0xd399ce15      0xd2a184a4      0x0768a954      0xcb80d980
+       0xb95cd729      0x4e901b18      0x9eab3bf0      0x7237b401
+       0x6225c6c9      0xc7495145      0x35c2942a      0xf447bcbe
+       0x9a32be83      0x558e59a7      0xb5af8b87      0x0a2d2d98
+       0x8374f2c4      0xf177c03a      0xbb19cdc1      0x01a613fd
+       0xff39389c      0x0e17ed79      0x0475abdb      0x5de4a8d5
+       0xf6b4171f      0x6e8edd0e      0x776b40da      0xb5509e37
+       0xda6f8a3c      0x75fc2c3f      0xd53e31b5      0x66de7c7b
+       0x3406c2f9      0x517bf87a      0xea6ecd3b      0xcfd09c66
+       0xb72b24ff      0x37435510      0x90be4cf0      0x03a452b8
+       0x553e8ca1      0x24214c39      0xe5c0fa12      0xcd1c9c3d
+       0xec7a7231      0xb4fa832c      0xf5de6468      0xe784a3d6
+       0xb9423f69      0x354f9fe3      0x41521557      0xfadd5984
+       0x39ca80ba      0xcbe6c652      0xf3b45a2f      0x6992bbb7
+       0xa4c72b39      0x6854594b      0x82d2ef15      0xd584e39e
+       0x6b3b4fcd      0xdd492030      0x867cd856      0x249b821a
+       0xb0379bed      0x4100e222      0x7312537f      0xcb521849
+       0xceb72aaa      0xac51cc81      0x7586ae8d      0x71f92cff
+       0x311fdbcb      0xd4116dbe      0xab717f42      0x791414ef
+       0x70d4d8f6      0x91f1f135      0x30bc99b3      0x36da6d95
+       0xc48c49c5      0xc803d576      0x5f495677      0xe4262583
+       0x68e4b23e      0x976ba635      0xa0243fbc      0xab04ac6f
+       0xfeaebdf7      0xa81d7fec      0x6b3d049c      0xc3221da5
+       0xe96e56be      0xf858386c      0x562b0da6      0x3e4766ea
+       0xb353cee5      0x94d008f3      0xabec8b06      0x51bf82a8
+       0x7cc0d89a      0xb9cfd0f0      0x13e18bfd      0x6bd00069
+       0x6daedd19      0x6abafb5d      0xbf34f37c      0x2d90a21c
+       0xe9f4d292      0x0a66b943      0x7f1a60d7      0x59ef101c
+       0x54fc6b3b      0xce03a480      0xa08d6b8e      0x06baa20f
+       0xca03542f      0xf0ff27fa      0xc5ece348      0xe47d42c0
+       0xa0d8b8b0      0xed01b33d      0x8dd63d7f      0x5fd02a8a
+       0x81f83853      0xba341238      0x0a63ceb5      0x86406ecf
+       0x7d665976      0xfeba74c4      0x258da3ea      0x204cc408
+       0x11582f04      0xfe3cd7b4      0x3b714588      0x3dc97528
+       0x7f9887dc      0xdd2f6d06      0x7e4d19c9      0xc552514c
+       0x424e75fe      0x7ae62f2c      0xdd9222f2      0x3ba811e5
+       0xd7a0ab49      0x625090f6      0xe5850c24      0x707013ca
+       0xb8ace70d      0x95dac4a6      0x62577f26      0x01d632d1
+       0xa3cf47eb      0xf9b4055f      0x32624c4e      0xff941d8e
+       0x9e5af670      0x93f99de7      0xbbb3954a      0xb227af2b
+       0x3e4ab087      0x02f16e48      0xf28c64d7      0x758792f8
+       0xb21b32e1      0x8f24ee98      0xfd415342      0x456b2172
+       0xdffa483a      0x2a38036f      0x21f6a971      0xdb479757
+       0xbfd259ed      0xcd38e863      0x05279d93      0x09d71d11
+       0xd8e0257d      0x494071d0      0xf157a892      0x4510edd4
+       0x685357ed      0x0390b056      0xbd746b34      0x1d337902
+       0xaeb9ed88      0x112f875c      0x0ed6bf0b      0xecb8fc59
+       0x9bf72b5b      0xa4740376      0x0213572f      0xa8e00b6b
+       0xdc393631      0x4963115b      0x1b6e6818      0x0e73d2f6
+       0x8e954a23      0x9390c58e      0xa983e79c      0x7350ee9c
+       0x96d8a259      0x4a01e546      0xf9868dc6      0xbdf42faf
+       0x7aad50fb      0xbfbba165      0x4f51a747      0xb3bfa5bd
+       0x53809dfe      0xadef7a2a      0x445390c3      0x67725c26
+       0x9b260e5b      0xc2b8e005      0x8cddbee4      0x96d47ac5
+       0xfb60e03a      0x8b52f81e      0x0995ab9b      0x84057106
+       0x2becaca0      0x0fd09571      0xe01aecef      0xa119ab8e
+       0x485f4536      0x595fad9c      0xb9b1ebdf      0xbce19699
+       0x36731f9d      0xe4f16794      0xf6c5aa03      0xbbce3355
+       0x5d93a8a6      0x33383e61      0x050f50f6      0x769d6b3d
+       0x83212d78      0xd149ab11      0xec478081      0x54cc8540
+       0x7201178d      0x1c843939      0x85c75091      0x4f6a9a78
+       0x2759be97      0xf1376629      0x4ce2901c      0x02ec8e45
+       0x6eac63c4      0xb22fa33d      0xb2a7f661      0xfaa77004
+       0x01d9237f      0x10aaa035      0xff7f3513      0x196d1dcc
+       0x7430bda1      0x69b71e23      0xd74a90b6      0x65d74784
+       0xc6490de7      0xd6e9f2e2      0x0b87f40b      0xe8849c1e
+       0x617a85a5      0x92b4512b      0x2d73aa4d      0x899d01fb
+       0x8e982fb6      0x117b432c      0x715f3f5a      0xda4272dd
+       0xf08ae063      0x1218725b      0x95377933      0x3c7b26b9
+       0xf21d2042      0x45c2ba68      0x10809214      0x86daf0a5
+       0x43f02612      0xa33e0ff4      0x3d695563      0x6689b249
+       0xf3cf7710      0x9d0a39b5      0x2aa45670      0x85a326d3
+       0x0af694e9      0x08a6b8b6      0xc8a83fe9      0x6914713f
+       0x08f30177      0xd2c29d1d      0xddda35c4      0x769e7700
+       0x1986d959      0x6689ed32      0x3fdac901      0x70caf3c5
+       0xe63bcab1      0xbcdf809f      0xff6a878c      0xc3d343ef
+       0xd6452e17      0x7177a0ad      0x32ff3fd9      0x1297df84
+       0x9b84eba3      0xba5b1465      0x494ffd04      0x5dbe7244
+       0x21e61112      0xb8b4cd36      0xc7dcd6ec      0xa6c0c3f4
+       0xca16bd6a      0x00a6971f      0x835bc69f      0xd8dc4a5d
+       0x98d10553      0x24f1d85d      0xf4a3956f      0x8ee7dcee
+       0xacc0ed5d      0xe16d9960      0xbe3a381a      0xc0cc0d60
+       0x559ef1b7      0x39d86162      0x93a4cb6f      0xafe29854
+       0xf8b48577      0xbb9d2550      0xafb458ba      0x849c35a9
+       0xa3e207a6      0xa030e543      0xc8e935da      0xe5f32787
+       0x3ea91533      0x1745f72b      0xfdf08a17      0xe89e9f1c
+       0xef67d2de      0x0694671e      0x2f5e3907      0x9fe6dd96
+       0x925640ac      0xde272aa6      0x1dac04ac      0xf94a0f54
+       0xdefabfec      0xe955871d      0x23a1aa04      0x6bf36852
+       0x2211162f      0x5bc98c83      0x3f6924f6      0xb64e7f2d
+       0xea3a8302      0x2110af91      0x75304d77      0xe82d2a4b
+       0xdd7d4da6      0xa98c038b      0xe3a315c4      0x7e5b999c
+       0xf025fa4f      0xf1b7b69d      0xbcb13965      0x96dfcbd7
+       0xd41309a2      0x32ff856f      0x6d37bef7      0xc8bb6095
+       0x66cb32aa      0x1f6162da      0x90bd942a      0xf412e06b
+       0x776966e3      0x387582d1      0xd71a7e8f      0xd75f3b6a
+       0x53734892      0x88eff90d      0x69220b7e      0x3045352f
+       0xdf533e9b      0xc91845da      0x298cc6fa      0x8ba5e6f6
+       0x0f9167de      0xc5978c4d      0x6ea85f96      0xc77f10cc
+       0xd796bf8d      0x480d9931      0x56174c70      0x02174000
+       0x6cc4521f      0x1715f38b      0x913546d0      0x84585357
+       0xc83dc565      0x8e957fc4      0x07d3474e      0x42983e88
+       0x0ff84d07      0xe56208a7      0x16709afb      0xd607f6d2
+       0x6e445f5e      0x73d95fa6      0x712035df      0x4b8fc909
+       0xe5af4df1      0xa758d797      0xf2b9273d      0xc4b62d39
+       0x729c23da      0xc7253a08      0x62b12859      0xcb3fded4
+       0x1454ea1a      0xe8e7e773      0x55924cc7      0xf73f5e6a
+       0x797cac9b      0xbd48c20a      0x4ff6f18e      0x8407e804
+       0x4ab04803      0x5a5334ee      0xfcd7cd6f      0x5ec80f18
+       0xcd164a55      0x67ac6dc3      0xf6e49a75      0x2f69bc0e
+       0x4c0f0211      0xd5ae1cf3      0xf5103445      0xf27bf657
+       0xdf432f9a      0x6eef249b      0x0598d382      0x15109505
+       0xe872af5a      0xd2428b36      0x657d55f9      0x04732810
+       0x3cf097d4      0xb8ef402a      0x62bb44ff      0x665b05f8
+       0x11abb02b      0x42d2aaef      0xa149aa71      0x529ecbea
+       0x683cd7c7      0xb2f09135      0xade28ede      0xc8e59a7a
+       0x803e4b2b      0xa623a7f9      0x3953e208      0x93d4144d
+       0x842aca29      0x58caf86e      0x549d425e      0xf7709fc4
+       0xb50284bb      0x6dbbce3d      0x7796d7b6      0x4899750d
+       0x3382194a      0x19a7bea8      0x73e5465e      0x93ba1c22
+       0x9aa1f2bd      0x7f5691eb      0x3b950058      0xf02cc3ee
+       0xa8f28dc6      0x789cf720      0xd441c4d7      0x35b1c8b1
+       0xc8e842a4      0xff10fe2c      0x425306ff      0x4d6a191c
+       0x22daa4e6      0x519c5fb6      0x2cc4cb10      0xe7120144
+       0x9f4a7d69      0xe6d5fc30      0x75ec0eea      0xa7de2cbe
+       0x5fa59098      0x9df3a6dc      0x52de5d2a      0x82963f9b
+       0x3709a412      0xd626c435      0xa8f00f34      0x3a512069
+       0x006983b6      0x3b0a697e      0xe90bcaff      0x19297264
+       0xf9fceda6      0x18d9d689      0xc9e69d7d      0xbd9710c4
+       0x135279fd      0x4a359c26      0x11166e2d      0x804ad089
+       0xe6d18178      0xd90f71c3      0x0d9a0a8a      0xb7180f54
+       0x6d70facb      0x361be428      0x041f3f0c      0x4cb0c5ad
+       0x614e8d27      0x6527e2fc      0x97ac698e      0xe58d7c00
+       0x1cec1d90      0xb321bee4      0xf3beb812      0xc255076b
+       0x2c4acfff      0x706b6ed9      0x7fad6b11      0xe306510e
+       0x2fe3ddb3      0xb2f08024      0x62e0e2cb      0x5a4f90dd
+       0x210d2a16      0x092c0832      0x9eb04a23      0x96838a58
+       0x12caf300      0x63aa4aee      0x11b6a93d      0x7cb752e4
+       0x435311b8      0xd00aba1a      0xef846a02      0x4ea790a7
+       0xf29ebc8d      0xc336a707      0x630de4a7      0xe45708db
+       0x20db2e1d      0x57cb316c      0xd479b609      0x9af6571d
+       0xdb970db2      0xc9fce654      0x96f09aa5      0x225ba7d4
+       0x2891a63a      0x9b9162eb      0x799def38      0xc6643e22
+       0x44b31cdf      0x8c0a493e      0xaf71100e      0x84127a59
+       0x6f91a01c      0x803ab9dd      0x28e9fb3d      0x161a12b4
+       0xf59c264a      0x29b43833      0xa7aafcf2      0xf6c720d2
+       0x5202b6e1      0x0318c41d      0x7d0ff022      0xe827a277
+       0xf6abd6c1      0x29e0eb01      0x9ab11402      0x83328f75
+       0xb7cb13bd      0x84fb5817      0x5e85ebc6      0x8d99fa64
+       0xff2938ea      0xfa96fc30      0x038fef42      0xc90de80b
+       0x71a9eae0      0x20049e42      0x049ac066      0xdf3e3519
+       0x1b2d5a75      0xbab5f077      0x685f20d3      0x215b1298
+       0x10a9e784      0xae8f4b2a      0xd8dca751      0xbe8c6ee4
+       0x6773524a      0xb2f04d49      0x3c6bff85      0x799ef406
+       0x5c656296      0x801122e6      0x6a1d81bf      0x595fccd2
+       0xcc12da8d      0x4c5e3b60      0x3437b239      0x518f817f
+       0x8e467efc      0x9869a104      0x2461a353      0x3c28f835
+       0x0e67618c      0xc29e23b6      0xfaf34214      0x143cf0b4
+       0xf5a69276      0x4feb63c1      0x704d989c      0x9db3e3fd
+       0x6ba1398a      0xcf57d34a      0x725911bf      0xcf4c858f
+       0x56d964cf      0x0d5fa849      0xe886cca5      0x8e9ea46e
+       0xacd4b8e7      0x95bfe216      0xbb88491d      0x7c88e59c
+       0xeffb9ed3      0x49a4b758      0xefb24fde      0xc0232164
+       0xb4b7ccb1      0x679b78af      0x4d21dffe      0xd45a35d4
+       0x160823de      0xf65e4066      0x341fb2ab      0xd6f614d6
+       0xfbf17ba7      0x5afd13a6      0xa455273d      0x453821f8
+       0xf8f37428      0x2090963f      0x88e8b836      0x38dc985f
+       0x510c17fb      0xe2deebcb      0x069a2f4c      0x1ccee426
+       0x8c443999      0x34eb5aba      0xae95c92c      0xb7f83819
+       0xe4827abc      0xcf417efd      0x2ddc73d9      0x128a6e68
+       0xf46bb0e8      0x64d7bdcf      0x9d8772ee      0xb943c873
+       0x2b0f0c3f      0xab1fbe06      0xca0c4bb7      0xa300b28d
+       0x0c8060b9      0x000484d9      0x5f274f61      0xf9358725
+       0x1aaf33a0      0xb102f1db      0xe86b39cf      0x9e11d9b3
+       0xa0881ca4      0xa3024006      0x46a99267      0xfff365e1
+       0xd2d48d38      0x86d9d95c      0x49c0bfe8      0x1963c548
+       0xe91ca0d1      0xb84e3c1b      0x195eb0a8      0xe3646e97
+       0x916a186a      0x667a2a25      0xa7ab38d5      0x183d43f9
+       0x70bffcc5      0xf154bcb2      0x14c046bb      0xf9ff26e7
+       0x69d79ced      0x48a05fba      0x372a5f9a      0x35b5c9a0
+       0xe0e358db      0x8b5f0dc5      0xc22f701b      0xe683f48d
+       0x5b034911      0x0fed5e7f      0xdb683998      0xd6a9a700
+       0x1badea0d      0x173f4bdb      0x83168ab9      0x1f1923f3
+       0x32ba4e68      0x4c9e79ce      0x8f1f299e      0x7b4f20b3
+       0x1243e98f      0x599dbc27      0x74f24d56      0x0f773707
+       0x09f1e68b      0xa6fdb723      0x29e6e470      0xa3997247
+       0xafa009be      0x742282a1      0xb36642d8      0xb8aa17b3
+       0x3c9af066      0x50b94ed1      0x4761835d      0x8fe20805
+       0x7b858120      0xe440c815      0xcd52cd4b      0x18d6edc6
+       0xa41772fd      0xd148ee14      0x2009222c      0x46c65426
+       0x2795c9df      0x21eb100d      0xc2bd3803      0xfe1d9d76
+       0x7a9d1821      0xbdacbc01      0x1fa45260      0xfb631eda
+       0x894eae94      0xf4b5070e      0xa8d7a16a      0xe98b428b
+       0x1a476a36      0x741e97ed      0x1c77247e      0xc0a72a45
+       0x5427f854      0x4b64d7dc      0x6242e4ee      0x55e328f5
+       0xb248d583      0xcc4cfb27      0x8d86039f      0x7f41761a
+       0x2efd22ca      0xc70922d8      0xc4b573a4      0x15820152
+       0x1c0ba97a      0x6496dbf2      0xb76018bf      0xba84c083
+       0xeff0e5f6      0x763db7db      0x775345a3      0x9b3c003d
+       0x01dbf9e8      0x3cc5b87a      0x47684026      0xd63b0b9f
+       0x0d83eb4f      0xece68b2a      0xdd07b7f1      0xd303743c
+       0x630027b2      0xfef29b84      0x03683911      0xe707c285
+       0x8ebae47c      0x5c19641b      0x35f08e66      0x6cdbc761
+       0x65f0c3dc      0x760b9893      0x8025249c      0x8abb720e
+       0x37dca4c0      0x9694f8d1      0xa1b5805e      0x091749ce
+       0xd8978f50      0xbd4ad496      0xd52d5e2f      0x0fef221c
+       0x6c867aee      0x56c39956      0x223895fb      0x8068532b
+       0x60df98b6      0xb6dd366b      0x5a17e3f3      0x81fcce53
+       0x488c6fce      0x814349f8      0x89cb9ba6      0x3b53e5f6
+       0xe9da7bc2      0xf80568ed      0xab234165      0x371349e7
+       0xd9a947d6      0x1cceec36      0x8573f942      0x7290f0d8
+       0x5f161a82      0x70e3e105      0xa6c26088      0x469cd6ab
+       0x134c630d      0xc5464ce6      0x571a0351      0x8e21b837
+       0x3665d020      0x667bacd3      0x9d196b21      0x111a868e
+       0x0aed7801      0xb97e3b65      0x6808e4a1      0x113eb51a
+       0xa37bb421      0x7c56fd88      0xcd22277f      0xd9c895f1
+       0x68ee5f3b      0xc043f5bf      0x41494580      0xd5b242eb
+       0xc4825a66      0x7c7a56a3      0x0693064e      0xf12d515d
+       0xee675338      0x7b86749a      0x02dd1685      0xa66647fe
+       0x9f5d1795      0x473579b4      0x4ab09d77      0x0dc10dc5
+       0x44026e86      0xdd35ead4      0x8fb96400      0xfdb30e9a
+       0x0588e53c      0x39d80fc9      0x324ad652      0x913a457b
+       0xe669b8dd      0x3eb47660      0x7041bf1a      0x62f98e20
+       0x25968303      0xa02c8b5a      0x6c075fcb      0x1fb183f8
+       0x2e9a679e      0x16edc9c4      0xbd2c4d02      0x422fe595
+       0xa83913d6      0x383e0b59      0xd1447684      0x3cf2b3ab
+       0x66e67b30      0x8cd1527d      0x80a9bb5c      0x4abc2c5c
+       0x66d06ea1      0xb7a64fc9      0x2e539496      0x27555c5c
+       0x9ec3ee3b      0x61a32d28      0x50a76922      0x45ed1f81
+       0x38743d4c      0x9f1eb599      0xce331719      0xc995e2b1
+       0x74dd1277      0x44743eeb      0x6521d577      0x8e76beb8
+       0xea7af3bf      0xdb7f2ffc      0xa630105b      0x89fe0f28
+       0x7a977152      0x9f092cd5      0x5b927403      0x28305b13
+       0xab3c67db      0xcd7f3033      0x16ca25d7      0x8e3f57c3
+       0x8caae435      0xce4b7269      0x3688b9d1      0x369a8493
+       0x6df48a4e      0x0489dd7b      0x5b2e807a      0x3925185a
+       0xcf305c92      0x986b562b      0x60c50830      0x0f4dbf84
+       0x0576611b      0x3839e3ce      0x9af0007a      0x4709eaef
+       0x3d1ad6c4      0xc1eab1bd      0x0a58b099      0x45c204cc
+       0xbf2a5251      0x93cac875      0xd2cfbfde      0xfdd58e30
+       0xe37bfd04      0x3a5263de      0x435cbcb6      0xe09e54f8
+       0xf33cdfb1      0x0b5abf2e      0x0a3c3188      0xc5e37648
+       0x9a7a5ddb      0x1159c4b0      0xe7be16f5      0x0116786d
+       0x96657ab6      0x747e553d      0x5f4b9ec3      0xac693308
+       0xb3415d8d      0x3b685a30      0xf1c42e72      0xcda1f5bc
+       0xd687153a      0xe45ced9f      0x6b2d5657      0xea7c3117
+       0x175104db      0x284929f7      0x13f1c0ef      0xc2a5f183
+       0xeed273f8      0xc92f15db      0xd5f95bd4      0x69885d65
+       0x9c3fb788      0x8b930eea      0x88086995      0x7aab4028
+       0x8a14792e      0x257ec30a      0x2231b1c6      0xf91df891
+       0x2fb015e7      0x1d4bb578      0xff4d6f2d      0xc2c3db5b
+       0xad03584e      0x19a1b1c3      0xf153fe52      0x7ae7f48e
+       0xb8f4c0f8      0xb5d48c52      0xa94fef1d      0xd43eff71
+       0x7bbfd2ba      0xa5f8ea89      0x576fd7b1      0xb2903342
+       0x4273485d      0x131e2843      0xb377d9db      0xfc8ff297
+       0x30a2ddba      0x44a1b8dc      0x01bf515b      0xc0da16e2
+       0x508d9f74      0x7a90a4f1      0x57568e63      0x11a09bdb
+       0x51a604c2      0xfe12e1e8      0x6a9607d6      0xb1a0a789
+       0x6a76e484      0x258166b7      0x8ad6b887      0xc444addc
+       0x517ebf69      0xf79397ff      0x0049f65d      0x9e145a13
+       0xe0068f55      0x027a0364      0x5a0057c7      0x1e6b6f8d
+       0x41698aa4      0x58f4c1f1      0x641caa0b      0x84a9d59e
+       0x8b651eae      0xfbf026a1      0x054304a6      0xbf66fd74
+       0xc00a93fa      0xf863127f      0x52d37b5f      0x46c214dc
+       0x630b5b22      0x091351c2      0xa247c4a7      0x1eacbcfa
+       0x9bceaa14      0x4367f8ee      0x83b3d3bb      0x2b1f13e6
+       0x69643070      0xafc8472c      0x17c26523      0x50edcc79
+       0x3b15944d      0x3c5a1363      0xbf0b4701      0x4f194d5c
+       0x3ba74203      0xf7e493db      0x13f070d4      0x4f42d64d
+       0x5e7a6127      0xca3ba6b4      0x2ff001ae      0xe9ce2be1
+       0x1c584947      0x917fa2fd      0x25b9c328      0x376192fe
+       0xf8f9eaf3      0xb6ec754a      0x58d16bfa      0xf093cc7a
+       0x9f9e6fbe      0x0e02ffdf      0x8dffad5e      0xd72e0790
+       0x0151e220      0x91b565cc      0x7ad2c99c      0xc1955fb0
+       0x12fd0a43      0x9efd7fb3      0xf6e3997b      0x3eb490fd
+       0x708cbf53      0x5dcd89f0      0xd9cf7780      0x507d6bbf
+       0xa7161efc      0xc3723ce7      0xdec81ada      0x276b5d15
+       0xe953f82f      0x35f30ebc      0x1ab1dde1      0xfaeec970
+       0xc7f3f073      0x14e819ea      0x21e2f1d7      0xd559bf86
+       0x772e14e1      0x0eb88848      0x00e69e61      0x8a497d1d
+       0xa963ee2a      0x8ff10aa5      0x37c194a1      0x6a000265
+       0xb55dfca1      0x69f61cea      0xfb2c527c      0xe6d64f5d
+       0xf732b4a1      0xba8c9ff4      0xcaa5d101      0x81053249
+       0x6658aa41      0x857699bb      0xa2f13d14      0x1361bbbd
+       0x2bf2a199      0x00398645      0x070abac4      0x5cce57de
+       0x8267bf14      0x4543d732      0xe47218ae      0x30aef0bf
+       0x2d5edd4b      0x440f9aa8      0x4126c00c      0xb6d99d96
+       0xbb36d858      0x46d38282      0xf8a43705      0xa75557ee
+       0x04327972      0x5bea1e19      0xff8becda      0x2e0a7a49
+       0x574c643b      0x7a5302a1      0x7c2ff01f      0x1257edbf
+       0x15bf9b62      0x03c74cd7      0xd22e143c      0xb891f41b
+       0x533876b2      0xf73f9635      0x19dc3428      0x2c673ac2
+       0x6b682d9f      0x1aeafa18      0x9af0a22c      0xdc43c8f1
+       0x2b786385      0x10f98eb4      0x8aad0a78      0x77d5c4e3
+       0x61a5f667      0xb4aa1847      0x8789a085      0x007ff3d8
+       0x06c7a5db      0xeb3c591b      0xd0a8fef3      0xb9470f57
+       0x9174392f      0x594f6001      0x017a8569      0x10aad33e
+       0x04815079      0x69ea4901      0x076b6aee      0xed30c5d2
+       0x06fc650c      0xf574a085      0xb9c1e1b1      0x3ebb08ce
+       0x285e57fd      0xc24570ed      0x7460c123      0xfd985bb7
+       0xc478bfde      0x877bcc7f      0x493062ce      0xb4cc6a9c
+       0x880e2028      0xa589365a      0x962f15c5      0x703cbe4d
+       0x0d56c4ef      0x193d4d90      0x276b4569      0x9ca9eace
+       0x6d7a304e      0x7c50f0d4      0x5ff737cf      0x46bfd681
+       0x59cdb9d1      0x1f437987      0x17177ff7      0x39e83454
+       0x48fee875      0x5d48fa8e      0x2705b465      0x3c478202
+       0xb199ec9a      0x0108d7f6      0xa43f30ad      0x1576cd45
+       0x59849348      0x0701b1d2      0x32827168      0xf654bcf5
+       0x288297a9      0x533ad0d4      0x9d9696de      0x0f498526
+       0x8fe5ab96      0x957af30e      0x69ffbf6d      0x3b13652a
+       0x46ddd99c      0xd673e4bf      0x97f13d07      0x51b78a76
+       0xb220a001      0xad4c5bdd      0x99d90d52      0xfd892417
+       0x60034f0f      0x1e412240      0xa8197499      0x9995f0a8
+       0xa38cba7e      0xb800d542      0x0e783e44      0x88129fce
+       0x4809663f      0xfec5cb0a      0x52f61a9d      0x14d12170
+       0x2bd8cd03      0x09bf9435      0x73734b1d      0x219ea5d9
+       0x74ed78b0      0x95994396      0x9415ab93      0x3d13a09e
+       0x6fe96774      0xacf99169      0xb4f051c3      0x07f0ea49
+       0x36980427      0xed285a17      0xde1a0009      0x1a7a5a29
+       0x0d609fca      0xcd460bcd      0x7693718a      0x73f57373
+       0xd48e6402      0x2d1d78e0      0x9a77cfc3      0x37909719
+       0x1644b501      0xfd90123c      0xeb4251f2      0xb503e033
+       0xff3e1f6b      0xbe265870      0xf3f21485      0xacb23ea8
+       0x48225e94      0x2fa168a5      0x85fd8d79      0xd93d3433
+       0x00e124e3      0x753715e3      0x493b849b      0x682a18cf
+       0xc0018f99      0xc710e6bf      0xc8e3fa66      0x286bd828
+       0xe17e8c66      0x4721a38a      0x70df0ce3      0x16bdc77d
+       0x66a1f048      0x53328406      0x70f75e77      0x7cd05511
+       0xca4cbb1e      0xb0fbe0ff      0x21f5dc79      0xb447587a
+       0xbe077a4b      0xc6845495      0xad48a151      0x3765dc3e
+       0x6a49324b      0x251b88c1      0xed59bad9      0x5f8f0267
+       0xb59ce794      0x16452ef6      0x5c50ba3e      0x7ed68ede
+       0x84db7efa      0xcaf2ea3b      0x5fdb4ff1      0x6a286fe0
+       0xe94297d6      0x27590c49      0x6f3e12ae      0x19e41cf1
+       0xa0f0502f      0x3cd2e909      0xb2aef610      0x78c5b2d2
+       0xe49209c8      0x6ebe18c5      0xf137a7a7      0x4f4eb99b
+       0xe6d79941      0x07d2bb35      0xd4b7d8f4      0xb25a1399
+       0xb57dc708      0xe59b2408      0x1b5df50c      0x7e0b3879
+       0xcf7b61db      0xe996a300      0xd4dde50d      0x2e55ba95
+       0x8083ceaa      0x2fdf351c      0x6273920f      0x7faed796
+       0x10958965      0xad134825      0x34c002c6      0xaaca47a4
+       0x725f8421      0xac5a6cd3      0x75e0848b      0x5b0df598
+       0xe8d27993      0xfa909486      0x2e298288      0xea3f0e20
+       0xa6339ec0      0x54a648f6      0xa7a801da      0x7c710a28
+       0x68f427a8      0x3af716a2      0x764ca04e      0xfde6554e
+       0xec662cb0      0x8718d0eb      0x0471d858      0xb30d0f68
+       0x80b04ea0      0x7d863a99      0x78f19cd6      0x4916d80a
+       0x89175a16      0x730eea74      0x3746aefe      0xfa1cf6b5
+       0x61adef3c      0x501f951f      0x13745487      0xd1b3ff32
+       0x6884d5e2      0x02496686      0xf83c84d3      0xcae1b806
+       0x83edc94d      0xc7d9566e      0x1433eb37      0x89969700
+       0xa954cc67      0x8ef1253e      0xede17011      0x19f95b50
+       0x170bfd83      0xa2f9ae15      0x1f7ab3ef      0x433b7cbe
+       0x46542510      0xcb24c0c4      0xb6192b4e      0xab31ac5f
+       0x12a28bf6      0x9b30c0a9      0x639cd074      0x6c7ab249
+       0xb34a412e      0xf17389b8      0xf18dde36      0x633b6868
+       0x78830066      0xbcc82cdf      0x60b934e6      0x9353d93b
+       0x294b8e89      0xa81635bb      0x494b2335      0x0ab73edf
+       0xe9252637      0x325fc7f5      0xb40a24e0      0x0523577e
+       0x06b432d9      0x5fddc685      0xfd7acfac      0xace4443d
+       0x569a1a6a      0xbc445236      0xecc5cc92      0x151182ec
+       0xe574f5ec      0x2c56e2bc      0x2af5abce      0x4339c30c
+       0xb55188b9      0x23698d98      0x60820baa      0x93ff7340
+       0x94c3333a      0x20f0e87f      0xab1d9fba      0x35834bea
+       0xd154a699      0xe320890a      0x85bf556d      0x42a2849c
+       0x7ba110dd      0xaee94e55      0xc790062b      0x78a8c168
+       0x66b1329d      0x0b527436      0x012da168      0xd2f0ee39
+       0xb679c867      0xca0a6921      0x940ccadb      0x6946498a
+       0x768d5174      0x5e7fba38      0x383f7c89      0x5c567fb2
+       0x310f24d4      0x4db03e90      0xd1bf21ac      0x8f15e7d0
+       0xa4d86530      0x8044a876      0x91f5130d      0x398f16ff
+       0xc7c1e0e6      0x9938b166      0xe3268899      0xefc1713a
+       0xe57529c5      0xfc878166      0xecf72ded      0x95ddaadc
+       0x0b391002      0x48d721e1      0xc5d1c59c      0xe7b1bebb
+       0x32fc2599      0xef46e6af      0x988769f1      0x71acab79
+       0x490080ac      0x10056692      0x2e11eb27      0x5acacf81
+       0xeae43c4f      0xc9e639d4      0x42d4c5c4      0x950606cc
+       0x3724a3dd      0xaced0ab2      0xccf75ff8      0xa27ca076
+       0x3bd73ecb      0x843f6982      0x48bc7011      0x460fa891
+       0xff7040a1      0xefdec3b5      0x4e32c53c      0xee9410f1
+       0xff88acac      0x38ceac92      0xcd7eee13      0x0fb5c53a
+       0xe6051d62      0xae5cecac      0xe98ab365      0x3c6f4ab6
+       0x3805e767      0xe0afc6cc      0xbb50a97e      0xd77e3cde
+       0x11461b04      0xe3596b3e      0x2462e279      0xd3ce1706
+       0xf5d951bd      0xac5d54e4      0xc5b0e96a      0x4d278b29
+       0x32bf069d      0x5af0d8c8      0x774c9588      0x86541549
+       0xb784a57b      0x62041d1e      0x84fec5e2      0xe7a02d73
+       0x1d74f2a9      0x611e0553      0x3b1d3821      0x1145d1fa
+       0x6c9eb1cc      0xa206315e      0xd144fc48      0x73847ca1
+       0x5029d400      0x7cd55815      0x1b144927      0x9cf7c04c
+       0x9643ea87      0xb16eb72e      0x3aa8837b      0xe8da7e89
+       0xe7da78db      0x5e50528c      0x3da12100      0x1b485ad1
+       0x1b21c0b9      0xb7bd623a      0x01350aa0      0x9ef31e71
+       0x2fd41bdb      0x7c65f063      0xe643f189      0x855b2c38
+       0xfd39766e      0xa29166da      0x85cb19c3      0x0553eec2
+       0xc3981002      0x05c026b5      0x0e6d7f4e      0xe45eda9e
+       0x4a8d4a53      0xf7c0d328      0x7ec10195      0x48aabc2d
+       0xa5162132      0xd673f0d3      0x28370129      0x386ca94f
+       0xc5e4fcab      0x63c14f79      0x156e44ff      0x4ef699dd
+       0x636756ef      0x4e4d0bb3      0xd29b405c      0x91efa47b
+       0x97ed6b3d      0x00f84348      0x0fcc73d8      0xbf412254
+       0x9e13a7e8      0x4fe9d1e1      0xa5f6f2cc      0x41d448a0
+       0x7ec7bad5      0x47656169      0x306ef8e0      0xeda02d50
+       0xc2fe9304      0x7ea7402f      0xb2165f5a      0xe36f3293
+       0xd2bf7174      0x64c1d01c      0x35331b08      0x8815ce43
+       0x0a860ec0      0xf000b1e2      0x22bba533      0xd2466bfc
+       0xfb50c4ee      0x59c255a6      0x08ede5c6      0xae11af6b
+       0x21c567f8      0x2deda390      0xf582c770      0x32a71f68
+       0xe5ca38bd      0x9911a225      0xeff94cde      0x66620d38
+       0xab8bc0c1      0x1682c8bf      0xf4822ea9      0xbbcd0d23
+       0x33bfde90      0xaee20724      0xa257d4ab      0x11802b6c
+       0xb1b1b529      0x31c2d8e8      0x00aa517d      0x4289c462
+       0xfa2fa42c      0x72557fc0      0xb0a54dbb      0xd5fc3e96
+       0xc07e39c3      0x93c0971a      0xa3abd61d      0xb5ad71de
+       0xb195e2c0      0x90e6594d      0xf86668b4      0x1c2f6270
+       0xc77d4f3b      0x6a37da20      0x420517a3      0x1cb5a1f4
+       0xdd65a884      0xd25f8295      0x7e4b9e1a      0xf9218723
+       0x14c15112      0xf5494da7      0x115c0604      0x2ebe1653
+       0x38a7a4c9      0x65d309e1      0x699bd062      0x3ac861b8
+       0x27172a07      0x1bf1ef7d      0xe84020c7      0xf6789173
+       0x9b74b780      0x925900b9      0xd05be0a5      0xccf0d5f9
+       0x7aa80fbe      0x590af161      0x12d33a9a      0xc301a2bb
+       0x27852617      0x277ba895      0xaf4925e4      0xed32ceea
+       0xa577e5e1      0x7d8ee645      0xf7e7afab      0xf4399460
+       0x0f2918e0      0x6f3ebf38      0x6b850f99      0x220658ae
+       0xbbd7637d      0x650f7053      0x7cf7d110      0x9ccea7af
+       0x79a727d6      0x80e9ed94      0x1bf513d8      0x1ab6e5f6
+       0xb4d31711      0x7912ac20      0x9e27d831      0x322ffb9b
+       0xdd8ef385      0x9738f2c6      0x2fd86982      0xf4e8c2c9
+       0xde9db8b1      0x5539d392      0x677fc7a6      0x2c5eb135
+       0x6db4c192      0x9da897e6      0x627d966e      0xed9b7993
+       0x969ca010      0x784e3016      0xda8678d3      0xdc1f0963
+       0x4e7ff6f5      0xb14d0966      0x552e1b93      0x68a43b8c
+       0xa2236345      0xa9b56c06      0x2d07cd9c      0xb6956632
+       0xd779e7a7      0xeccd2305      0x6bf60f0c      0xea0b32ad
+       0x14ea130b      0xb30ee5a9      0x8e076029      0x473f2043
+       0x051b275e      0x415bf046      0x9428b049      0xfa732499
+       0xd8419bf6      0xd4841843      0x2bf32829      0x3fbe2cda
+       0x6faa0fcf      0xfb282345      0x6ed0c2f3      0x08b172fe
+       0xd78bb73e      0x850b4c41      0xd3e9b902      0xc606fc7e
+       0x069dcaf6      0xc8ddc1f5      0x07f3fe56      0x98f43217
+       0xd111880b      0x7280be17      0xc19c6d05      0x28546554
+       0xb38a24cb      0x933951fe      0xef7b0e5f      0x2c0c01cb
+       0x7a8436df      0xee6b863c      0x8f33f6d4      0x861541a1
+       0x53685709      0x86f04b0c      0x7d592b84      0x04846350
+       0xb67cede9      0xdc297b9b      0x08e1ed70      0xe9306e22
+       0x013e379b      0x6635c475      0x00b95612      0x37514ad9
+       0x8c86123e      0x69c21346      0xe7b3d1dc      0xc09150a5
+       0x94b115c8      0x5799e5eb      0xf69cc4f8      0x3646b963
+       0x05e73f71      0x056f7937      0x4858bd19      0xf0cdbcbf
+       0xb7aac562      0x716a0b2d      0x849328dc      0x79bf0fa8
+       0x5092c51c      0x4b43622d      0x10d60769      0x6f981f1c
+       0x163b2b7e      0x210b0d12      0xc905e28b      0x139c2e1b
+       0x39e7ac9a      0xfdea5974      0xd240ee81      0x00b605d6
+       0x5cf6da6d      0xf6e5864c      0x538e2b3a      0x0b68a4d9
+       0x1542f8aa      0x22fdc4b0      0xce0727d9      0xc00509c0
+       0xe2e9da83      0x85e58cd3      0xc3a4cc2a      0x05b733d9
+       0xd142b1b8      0x9b50b224      0x24a4f235      0x7e26e4ff
+       0x72d74616      0xa8118811      0x845249c8      0xb385bea6
+       0x9ae48f64      0x4f3fc38c      0xfb92d503      0xb348fd91
+       >;
diff --git a/arch/x86/dts/microcode/m01406c440a.dtsi b/arch/x86/dts/microcode/m01406c440a.dtsi
new file mode 100644 (file)
index 0000000..6fdf211
--- /dev/null
@@ -0,0 +1,4308 @@
+/*
+ * ---
+ * This is a device tree fragment. Use #include to add these properties to a
+ * node.
+ *
+ * Date:
+ */
+
+compatible = "intel,microcode";
+intel,header-version = <1>;
+intel,update-revision = <0x40a>;
+intel,date-code = <0x12182015>;
+intel,processor-signature = <0x406c4>;
+intel,checksum = <0x5807e19a>;
+intel,loader-revision = <1>;
+intel,processor-flags = <0x1>;
+
+/* The first 48-bytes are the public header which repeats the above data */
+data = <
+       0x01000000      0x0a040000      0x15201812      0xc4060400
+       0x9ae10758      0x01000000      0x01000000      0xd00b0100
+       0x000c0100      0x00000000      0x00000000      0x00000000
+       0x00000000      0xa1000000      0x01000200      0x0a040000
+       0x00000000      0x00000000      0x18121520      0xe1420000
+       0x01000000      0xc4060400      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x624800aa      0xf01ac54c      0x5a84228f      0xcc79131d
+       0x9feff6a3      0x4a87b5a3      0xac874956      0x7dfe6197
+       0xef44e4c3      0xf91d4958      0x230883b7      0x7382ab6e
+       0xf14324ef      0xf94c28d7      0x9131d196      0xebcf2faa
+       0xc049cb37      0xd1577abd      0x5edbe45a      0x17e1ca1e
+       0xbe9a92c3      0x1c8e1790      0xb3c08b8a      0xca799851
+       0x3f2a8c92      0x1b7e15d8      0x1f44ecb2      0xaeda1838
+       0x0ace8669      0xae9d497e      0x424c680c      0x21b3a3ed
+       0xd924acfe      0xddc126a2      0x26363596      0x21cd999b
+       0x193f9df3      0x037d1953      0xf97a3dc5      0x4c94ad7e
+       0x98b360f0      0xeb90461f      0x438e6d2e      0x30851a0e
+       0xfd623681      0x18782d3c      0x702938c5      0x462df0dd
+       0xf7d67cc1      0x161076a0      0xf06e5db3      0xd861a76b
+       0xa40b06bc      0xed37c69b      0x2b25f98b      0x2b67887d
+       0xbf0131b5      0x571b7c25      0x34eb3752      0x992e406e
+       0x031ba8e7      0xccfc5b1d      0x33f487e9      0xeccc3098
+       0xe452737b      0xb38cc286      0x817bc58f      0x852a7fde
+       0xcbcd1b19      0xab11894a      0xa1f278d7      0x360829c9
+       0x11000000      0x242e4460      0x190ba541      0xd3a20d0c
+       0x7de0fc1d      0xafbe0a08      0x3233d6f4      0x82d82901
+       0x12c67fea      0x927c5686      0x8d45c03e      0xdb650016
+       0x88e39816      0xa493cdea      0x81a87c12      0xadbd5724
+       0xd402794b      0xdde114da      0xa32c6058      0xd820b63c
+       0x712726d9      0xf99787b2      0x1b8628b6      0xbd4c94ff
+       0x70952446      0xa00d56ba      0x36911787      0x5f3ca7d7
+       0x7cc87a67      0x10c77f6f      0x63bb3eaf      0x85f294d3
+       0x3283b281      0x71c85eb4      0x69a72f05      0x5e0f08e0
+       0xdedd727a      0x8f300d0e      0xe1998f90      0x340f0e3f
+       0x8ce037fa      0x801f7160      0x671b364c      0x09c2ba50
+       0x6d506296      0x4760ba91      0x046e581b      0xd5711e70
+       0x58c7279b      0x4376b9b5      0x63cabe1e      0x9c22ec14
+       0xb6752bf0      0x1b4da16f      0x09a0c65f      0xc6dbaf78
+       0x04e7d9aa      0x20895400      0x9516e20b      0x8cb87942
+       0x16f1e580      0x4dc7b3c0      0xec4ea2a3      0xd57a22c3
+       0x51306f3f      0xa9ef572d      0x261efc37      0x9d9e7b4a
+       0xe3024514      0x4a2e2c58      0x3a77c165      0xafab4790
+       0x6ce34d1b      0x04f0ab75      0x2d437f08      0x1d790312
+       0xbac94faa      0x976b9ce9      0xf770def7      0x6ed8427c
+       0xce8a6521      0x1ec7251b      0x10379d55      0x882b8ef8
+       0x58c4e197      0xb2c48b35      0xb3311655      0x8ccdf15a
+       0xf4368e46      0x5e41fe36      0xc6eae59d      0xe4b01c2d
+       0x506e5bc1      0x522095cb      0x32c19087      0x67d400ab
+       0xc46ca675      0xd1b4dc87      0xc41aaf74      0xb75e5de1
+       0x53588482      0x6e168b15      0x3cf9d2eb      0x2a26c991
+       0x868d92e6      0xefd21291      0x0d7d393b      0xd28a6693
+       0xbf850f8b      0x8bab78fa      0x06ef9ab5      0x96bf071e
+       0x4de55407      0x72997fcb      0xc6416709      0x9ba6d026
+       0xf8d588bc      0xbbacd314      0xdbb65892      0x49ce4e3f
+       0x9f7f23c6      0xf3bfb271      0xe3b039ef      0x9721d9d2
+       0xcfeff460      0xf9770555      0x8ecbd41f      0xdbc8de19
+       0x7f16eff1      0x50702a87      0x4e893e88      0xd0fe5546
+       0xd75c268d      0x3b325a3e      0xccb8f848      0xf116b116
+       0xd53bc36b      0x69c3fbca      0x78fca5a7      0xde29e62a
+       0x087fe22c      0xa2341056      0x4d8e470c      0x0897e8e0
+       0x1231c549      0x29fe1948      0x1510df78      0x27dfdf9f
+       0xfa7ac39d      0x02a2d8a3      0xf4e92fcc      0x65f8a856
+       0x0a620586      0x9d8168c6      0xfc2b73e8      0x51aa73cf
+       0x790d1ff2      0xe2eec1ee      0x2b6bf6ae      0x016d719f
+       0x4299ce1e      0xf5b6fb08      0x616eeef7      0x58e7838a
+       0x983a59c5      0xaab03473      0xb493c5cc      0x8f895d01
+       0x7eeb95ed      0xc751e74b      0xd56b648c      0x73397d44
+       0x2044779e      0x76ebf0ac      0xde6e453d      0x314e2211
+       0x75da63a0      0xaebc257e      0x3ed500ca      0xcb90731f
+       0x0e061298      0x202e853c      0x5475c57e      0xf7d590c9
+       0x50d855ad      0xa9a1740a      0xad86458c      0xac935753
+       0x443950f0      0x679449c7      0xfecdc458      0xda126f52
+       0xf95db8ad      0xce83faca      0xd50e170d      0x8985c89a
+       0x21300e90      0x45681348      0x77d41f24      0x7771eae6
+       0x7c649019      0x776f433f      0x1176f3a2      0xba7771a5
+       0xac9add02      0x80a77d73      0x9d532385      0x32a3bf43
+       0x3812be26      0x5f0b64e2      0x661150bf      0x1cda3da3
+       0x25901706      0x5566fc2a      0x4196324b      0xdaf55897
+       0xa182d0d1      0x27753c5c      0x7ed91479      0x670dd712
+       0x79f5e8c5      0xc2a882f7      0x99387af4      0xfbc30997
+       0xb2cbb413      0xe205d416      0x9c380f50      0x3ba30c90
+       0xf80b317f      0x06b74c14      0x5b8780de      0x98735ad4
+       0x335d6f43      0xb2de8a5b      0xeab51ec0      0x6b9bb87b
+       0x49f621d9      0x6dee0720      0xa5a5fbf8      0x576383ad
+       0x8d9fb03e      0xc7c6836f      0xc2b98f2a      0x157973e9
+       0xc3054865      0xb5d5a8f0      0xb2a939d4      0xda7d660c
+       0x5bea5713      0xcd9fb93c      0xd04225a5      0x469c6ef5
+       0x6e1b2189      0xec2038a5      0x48d864c9      0xf96ad8b8
+       0xc311c9f4      0xf293d447      0xda23084d      0xc0cec16b
+       0x4fa98f1d      0x1d65cb44      0x25241ce4      0xec6e71ba
+       0x5c060508      0x864e7590      0xa7bdf4df      0x05fb9183
+       0x70a2ed5e      0x8a7bdfd5      0xea411027      0x19a6c9ff
+       0xcbbc17ac      0x401aa669      0xe6bf3370      0x72f681cb
+       0xbe77a1a9      0xbc6ae060      0x8378299a      0x926ee257
+       0xff603c73      0xdeecde51      0x519d6956      0x5c4c6dd0
+       0xfd29f3e6      0x846667e5      0x2105ef33      0x158f5778
+       0xb894867e      0x162fe780      0x70d1570d      0x27ce89cb
+       0x3bad8e45      0x439d8dce      0xe8667d8b      0x4d47880a
+       0x652c7019      0x5f414acc      0x4339c1a7      0x833ca27c
+       0x32c92aa1      0x243b00bf      0x8e50fe5f      0x7efc7591
+       0x2e0d41f6      0xc67c978f      0x87f2eb1b      0xdcf5e604
+       0x801c6f5c      0x3caaf323      0x82d252d6      0x99fe2e39
+       0xb76a1e41      0x134d9628      0xfc095714      0x45a0825f
+       0x48c60f59      0x2c959a36      0x3d60f4d7      0xe24a8f04
+       0xa3b5f596      0xd9e67450      0x186af1d5      0xa1a1bb77
+       0x031cbf72      0x273f96e1      0x6938dbd2      0xc9613d71
+       0x786056b4      0x41bfff37      0x90dc1359      0x88291b7e
+       0xe087ea2f      0x2a307121      0x8f9ce425      0xeaf83930
+       0x63b737a2      0x63e23ab1      0xbfd9e458      0x423603de
+       0x3fc30a6f      0xcb6142e6      0xa64299b4      0x61c68b5f
+       0x1ba06ed2      0x91887c3e      0xb9aff67f      0x64784f73
+       0x34b0824c      0xc12f97e1      0x94441a34      0xd2080b65
+       0xe1c21c9a      0xa74732a0      0xefa59483      0x5d8a01a7
+       0x1dd6c22e      0x4d480d8f      0xb63a8354      0xa72c3581
+       0xf1df301e      0x5b3f517e      0x26b2082b      0x2b41052b
+       0x9154629f      0xabc7702c      0x1025b356      0x9e85e8ba
+       0x1f544d99      0x2c8ec998      0xe4440160      0xb0deb1a3
+       0x201e3fe8      0x70a7792c      0xfcf41de1      0xe2b2e6aa
+       0x10fc055b      0x373e9fbf      0xffee3e7d      0x2d1baa79
+       0xdb411a57      0xf30ea568      0xe30497de      0xb4682d8c
+       0xb458fbd2      0x5d1d68de      0x02da095c      0x71471bce
+       0x543edc68      0x52187bde      0x98743b08      0x0674aa49
+       0x5dad1705      0x74b009a2      0x765840c7      0x3e1cf377
+       0x3ecbb54e      0x6d5934b9      0x8a67c9ac      0xe1a15fbe
+       0x6e096703      0x24fbe4b3      0x99c9e345      0xd2d520f3
+       0xc5aefea5      0xe9e828b9      0x4e8f47b2      0x92653def
+       0xa7b8249d      0x5f53eb02      0xe3233073      0x1c933c46
+       0xcb682c30      0x7e6e4f1a      0x42015257      0x8cdb5897
+       0xc9cb6caf      0xfd8834a4      0xf353bbb4      0x6a37526a
+       0xadf7562d      0x151f071a      0x960a244f      0x7ca3adb3
+       0x9408588d      0x54bfc516      0x8b66a80b      0x2ed849ec
+       0xf408d6f8      0x20bf2961      0x38131c67      0x79f4be5c
+       0xe439ce8e      0xa497411a      0x75e67d7b      0x89e55132
+       0x5775d8d7      0x945cfe97      0xcb3fab49      0x0f776050
+       0x6a6d6600      0x669e6d18      0x9e919045      0xa4fceac8
+       0xcb9cbb97      0x44ff0303      0x5ab4c9f4      0x6356e012
+       0x153c7cfc      0xd6e436eb      0xff02c626      0xb8c6b9a0
+       0x649e7186      0x7ca5666b      0x7d79feff      0x96a659b7
+       0x52c99b9d      0xcfc545ff      0xe694e092      0x0978951e
+       0x23c1fa45      0xa196acc1      0xfa43a0e7      0xd02e58ac
+       0xa437a7ed      0x928bee99      0xab7a4203      0x476afb0e
+       0x85720b30      0x24c1aa4f      0xf0f5aa46      0xb370c71b
+       0x72c28056      0x6476c6bc      0x371e15a9      0xf1dd6370
+       0x20c99f9c      0xd41af717      0xed13673c      0xcb6c24c9
+       0x76d3038f      0x13ca83ec      0x92f89264      0xf15f7b8f
+       0xf58caccb      0x8c35c1e3      0x09ab9fbb      0xe43b29c3
+       0xab4ea87e      0x38115de0      0x6907638b      0x42348cc1
+       0x46c0541f      0xce20b070      0x85f96b9e      0xfa6a55e2
+       0xde7508eb      0x9f8f1b4f      0xed64d64c      0x440fb418
+       0x58ddfb97      0x13762796      0x7a19e78c      0x1f4532a2
+       0xd77581f6      0x95d2e36e      0xb43f3e07      0x4ee36289
+       0x8e02424c      0x59413984      0x25a857b1      0x85d7f421
+       0xad16de66      0x89889e00      0x41a2419a      0xaa4d9734
+       0x054c611b      0x163792a3      0x5024a4a7      0x28e8c480
+       0xd8d0a170      0xac2789b6      0x9e901eac      0x8dd4c756
+       0xb7e7a78a      0x09cb2f8f      0xcefbf036      0xd76d6b90
+       0x97195548      0x2cb9a698      0x0d8bf470      0xd47a53c5
+       0x7cde7ca3      0x86752d36      0x2b247ff0      0xf88824a6
+       0xffa16b3b      0x6cdce7fc      0x3b4616a0      0xa10175d7
+       0x9582056c      0x430e2b58      0x87fc2c37      0x9f6e818c
+       0xbc1139f1      0x84760da0      0x27a89d38      0x71c5e1af
+       0x131dc64a      0xadd87cc3      0x1e803420      0x742fd011
+       0xd72bd1db      0x0fb75ab1      0x94b49dee      0x72c056ad
+       0x5e6792a0      0x6d555dd0      0x74b1b90b      0x6ad51aca
+       0xfabbeff2      0x100ac64a      0x4809c8d9      0xc34c3576
+       0xea9e97da      0x16e7c254      0x67bb276e      0x051352b1
+       0xa876828c      0xb9050b68      0x220b1342      0x194adca9
+       0x91c155a0      0x13840fb9      0x3d84c855      0x0f556748
+       0xec5c095c      0x843a3203      0xa481fa2c      0xfab143e4
+       0x21644052      0x8c78b21e      0x9aebfce8      0xec06d25f
+       0x3de84e4f      0xf6fcc4ff      0x14939e02      0xdbc002bd
+       0xaf9bb5fa      0x2b2577ec      0xb58e2198      0x8695c42c
+       0xbd4134b3      0x339ad83d      0xb068e618      0x55a79546
+       0xa9d25584      0x8c2686dd      0x65c1fa6c      0x1b923e1a
+       0xf85508f1      0x35405141      0xebc72b0f      0x61dad5d5
+       0xd494ef56      0xce496144      0x95ac0f6a      0x22feb180
+       0x314fa6a2      0x6fdb5569      0x3b545d45      0x04993ded
+       0xcbde0b29      0x79f8402e      0x438f03a4      0x697a2395
+       0xa60c9399      0x6773e016      0x0239bd45      0xb481fb75
+       0x9fa5c550      0x411ef264      0x67860ed6      0x27b2c816
+       0xb51d6798      0xad6fd700      0xc3bda74e      0x56aed35b
+       0xd8c5ccc3      0xfe5f41e4      0xd6bf9729      0x823aced3
+       0xea7be38f      0xab1dc712      0x5cd0bf3a      0x668a68bf
+       0x28456fbf      0xa2dac02b      0x20ace936      0x95b0ba3d
+       0x377b8a1e      0x0dd9c396      0x3c7f2925      0x76818503
+       0xc359dc77      0x00ac4c3f      0xc51174cf      0xc75b0427
+       0x9cddf343      0x5976c090      0xb940ae71      0x67b3149a
+       0x2126db25      0xa0c32f5c      0x0d4478ad      0x7fefc9b0
+       0xb142782d      0xa150a3cf      0x64ad041f      0x0fca8532
+       0x0e8e5348      0x969950ad      0xdd3d8704      0x8ae1c3d2
+       0xc9110da4      0x8d1d9e53      0xdcf5ccd2      0x283b2954
+       0xe9bc7d4c      0x4e3dacfd      0x2101a11f      0xc8931fcb
+       0x248a7c32      0x2f1bad2f      0xa4d4ba90      0x842d6a97
+       0x9688a63e      0xca0c8ad2      0x9f580417      0x46e7fd85
+       0x2d3ebc79      0x47aa9462      0xebbe843f      0xd78153e2
+       0x909560b2      0xf46c5e3f      0x7c290a30      0x56b869f4
+       0x41fd075e      0x0a5b6e52      0x36d2d38a      0xd18b2b9a
+       0xce905361      0x421cdd95      0x8a12d791      0x95ffe01f
+       0xa0164308      0x49a9ee60      0x1905f05a      0xd7d654a1
+       0xf3231a7e      0xd0576e98      0xc24f44e1      0xe2860d3c
+       0x391bd3ef      0x9e69bf4f      0xe72c6172      0x59500290
+       0x3d34636c      0xbd04b4fa      0x895b8094      0x5cc90dd3
+       0xc199504e      0xe9fd3199      0xbc45079f      0xe90b08d1
+       0x73e17406      0x28173cdd      0x99cbd64a      0x7b6d0f22
+       0x841d5dfd      0xdf5ac032      0xd4816d36      0x1f4a3984
+       0xeae96366      0x50ed8bb9      0x4d33650b      0x7128cee3
+       0x37277426      0x471cdd80      0x25fff263      0x6f474b74
+       0xe9aa07cd      0xe1d7efb2      0xc22815f8      0xc608745e
+       0xdbefd2d1      0xd153fcb5      0x6e6bc7f9      0x4882ccfe
+       0xc81e1310      0x81cbd86b      0xbababff2      0xd907a1fa
+       0xcd8cc1fd      0x6189dcb3      0xc09856b7      0x561b5eb7
+       0xca1a86ca      0x44d14be5      0x09e0d9b1      0xabafa3ec
+       0xb195d7ee      0x6bd4ac69      0xd96ca290      0x4646b3de
+       0x946a8de5      0x62e7811f      0x8576b1df      0xd801d15a
+       0xea3b3d1c      0x4b5d2213      0xac6d698d      0x4e6688ba
+       0xa8bd3c7c      0x61b00447      0x636290b7      0x21ea494d
+       0x3f54301b      0xf3fd3625      0x761ee539      0x940e3e52
+       0x83170a07      0xd22f0a78      0x953dec00      0xa38ab91c
+       0xf92c8998      0x67009969      0x87672384      0xe491f9cf
+       0x6b6ddf09      0xff109fa0      0x76a8b76a      0x180ee54d
+       0xcaeb9a0a      0x92c5648f      0x85ff11e2      0x9b2df67b
+       0x4201d9b8      0x8aaf347b      0x4a9dbe10      0xec862b6a
+       0xb71c8b69      0x18b610e6      0x74308a4a      0x48f932f0
+       0xab89e3cd      0x7c8f0ea8      0x1bb5f1bc      0xcdb4357a
+       0xaaf85d77      0xade08dcb      0x590d0607      0x193b1e39
+       0x4a2c0ad8      0xb537ede3      0x18028be0      0xdfdc9b3e
+       0x4ed44a28      0xd99088fb      0x5f463afa      0x30b3406f
+       0x9a841acc      0xe99b8e91      0xd7b8a939      0x681ffaa2
+       0xadbb1fd1      0xfcad4167      0x0112b6f6      0xdc7f9eef
+       0x9fe2e8c3      0x2a6c0b92      0x52455d9c      0x6c8d1640
+       0xbde4c4f8      0x898f0c75      0x888be513      0x547d135c
+       0x1eb060b3      0x065d0c94      0x29dccb26      0x7e8c7b31
+       0xa5447074      0x284dfd0e      0xbf1d6663      0x18c99457
+       0x00347d9b      0xf61a7399      0x97295200      0x5b8496d1
+       0xcbafa538      0x5d98baf9      0x90cee1e6      0x96ff22c0
+       0x18c2a3ac      0x543af7ed      0xeea413c6      0x5bae5343
+       0x8e448ca0      0x6e7d4242      0xaa3f43ce      0x28215051
+       0xf64810cd      0xb5a7e727      0xd7f81460      0x35308099
+       0xeebca740      0x01df1f57      0xb7e65871      0x3ab3b9e9
+       0xee122b31      0x1ac1db5e      0x5e99528f      0x564692be
+       0xea2b238c      0xfee52d82      0xbf986e8f      0x822c1414
+       0xca6d9632      0xf9a2f73b      0x26991573      0xdf31a166
+       0xefd371c8      0xe6a8c9e5      0x98ec2cd3      0xe36a2f4b
+       0x64f72616      0xa7d08fd6      0x93363a09      0x05601635
+       0x1f525f29      0xd63ac5e1      0x6a09abe8      0x3992b4fe
+       0x1d0aaeee      0xb32d924e      0x2d364a4d      0xcc3676a1
+       0xa3570ad3      0xcc42a28e      0xe1209e02      0x5a7a939e
+       0x8baae5a7      0x37970d2e      0x9ad75409      0xc3fe31db
+       0xcbb9e37f      0x00e73ed5      0x03d10ffe      0x7e1abed0
+       0x6184e0a1      0x04dd9992      0xe1a4c0ed      0x1accdc34
+       0xf75029e1      0xeb908c2d      0x7182338b      0x153c755d
+       0xbd920e61      0xb7d99e35      0xd76b3cfb      0xc48e4427
+       0x4918ffa7      0xc3f70d6d      0x7d5b47d4      0x20e585e5
+       0x846d305e      0xd1953927      0x9ecd3367      0x7ea7af8d
+       0xb99c02b9      0x9ff7bcb9      0xe2f9dd77      0x91f7c422
+       0x0b6d6df5      0xb52ee017      0x0c7ac175      0xba7f84a3
+       0x940030e8      0xf3361cf3      0x2c79691e      0xf9f4cbb6
+       0x2adbcc7c      0x4e3216fa      0xeed50c23      0xdfc14253
+       0xf773ac08      0xb7a8fae8      0x8d321ff2      0x9eb7ba88
+       0xfdd06639      0x5edc8612      0x198977c7      0x8d8e1163
+       0x47466343      0x32ef6f8c      0xd61e51c8      0x696e19a6
+       0x03d0d4d8      0x0b06ce47      0xb5f0d0f6      0xc82a4f88
+       0xaad06d48      0x663c5d5d      0x8af24640      0x07bfa68f
+       0x886c17f6      0x6e3f131d      0x74f642e2      0xddcd55d0
+       0x2f30f2f6      0x8411fd8d      0x6d16c414      0xef747761
+       0xdcf2e965      0x005f15bf      0x3cb4cf17      0x47489073
+       0x436c5651      0xb762078b      0xed30e15c      0x1a7d5f47
+       0x908482ad      0xbb10cf3d      0xc11ab477      0x028d5ddd
+       0xd312ea2f      0xe7dcf336      0x99b07e30      0xe3dcee9a
+       0x4b93c17f      0x7b1a1423      0x2f23ae0c      0xb6913cfc
+       0xb4a9c590      0xbb37ea60      0x5a914eac      0x476b180b
+       0x942673d8      0x01f92634      0xf80a805b      0xb27dff69
+       0x6ae95b74      0x29f3c9d4      0xc100c578      0x4bba9461
+       0x84415667      0xc08eb87f      0xe9ebceed      0x0f81f386
+       0x2c9ef4b6      0x7377e8a2      0x786a5395      0x240f944c
+       0xc473d377      0x51e7ab41      0x9c7c062c      0x9ae8812a
+       0x92e249b9      0xec9ecbbc      0x32ec3b85      0x1e1219b6
+       0x5de07061      0x709f8adf      0xa2617686      0xdfc04de9
+       0x2d9601a5      0x17b91303      0xc2c3b25c      0x6c68286e
+       0x69b80bd5      0xe9170aa7      0xa4e769ef      0xcd59002e
+       0x03c62f50      0xaecaad82      0xa0446f52      0x7235f286
+       0x25842cc2      0x568daa6a      0x745f3c5c      0xb7da088e
+       0xbb7ce303      0x5a26aadb      0x0f300768      0x8075224e
+       0x041a1fc2      0xc42d3a48      0x65e1d2b3      0x0c425eef
+       0xf0be77bb      0x158f5e71      0x4f3b7aed      0x4dc49cdf
+       0xeabf7a1a      0x89ba777b      0x58633b37      0xa1ade7e7
+       0x5636aae2      0x4fa6ebc2      0x53b69d2f      0x08045872
+       0xe7aaa910      0x85b2a487      0xd0efc26e      0x74552637
+       0x094fdaba      0x53d7892b      0x4bc020c7      0x8ade858d
+       0x79ea282a      0xf26d298e      0x3b045781      0x934b0106
+       0xc9079aa7      0x97119415      0x66e6a403      0x89537b45
+       0xe73dfdb7      0xebf01300      0xde74994f      0x02088618
+       0x1b0e2af2      0x5772ed57      0xb602065a      0x17d9a1fc
+       0x1f586b71      0xa97c7aac      0x787bf657      0xc2624036
+       0xe43d1b5d      0xff1a581d      0xd2a70d71      0xe5c6f837
+       0x1b310855      0x58b1cfca      0xb16ac7c8      0xbfdcdbcd
+       0x08d08749      0xbea8c9d7      0x54dd52eb      0xda29929e
+       0x0520bac8      0x8069db1d      0x024e2433      0x2f58dd5b
+       0x2675d219      0x07a63f8b      0xb434bea2      0x9de76b17
+       0x42a9ba44      0x24643707      0xd44e6483      0xda2acc9b
+       0x35ec2061      0xad77a18c      0xcb5297c8      0xe4205cea
+       0xc6c373af      0xf54fa587      0xcd7e17da      0x746b1c4a
+       0x6f2622fe      0xfbb62c51      0xe6c2e806      0xf0783a39
+       0x310894c9      0xe45a1590      0x9e16bf7a      0xc8b3e0fd
+       0x3926836c      0x7703d031      0x460b069b      0x4bfa3cdb
+       0x8d5d2129      0x9785ecb9      0xe1e1599e      0x10ccdc77
+       0x7523c7ca      0x04b71d48      0x460a5b56      0x20276dee
+       0xd2ddb422      0xa647fac5      0x5a6b9c9b      0x7ae06c9f
+       0x804a66b1      0x4198f056      0x54bd34a9      0xa2911284
+       0x381172c1      0xfe4c4593      0xb3eee29d      0xf1df50b6
+       0x1fa0521f      0x1bae484c      0x400bc170      0x2284b14a
+       0x36378b02      0x474cdb9d      0x125ce7b4      0xccf8ca2a
+       0xcad1435a      0x6b3ef3ad      0x07911869      0x5d2af5f9
+       0xe890a391      0x84db947c      0x92a296bb      0x5e47a853
+       0x8f8e9b02      0x8217b798      0x5d0c8fdb      0x4b82a1bf
+       0xbb9d9ddc      0x5c3646de      0x38409ae3      0x5a0334f8
+       0x0ca6ae23      0x7cf66ad7      0x0bc3c769      0xdd7e58bf
+       0xee9348a7      0x29c5df89      0x310819f8      0x624f6de8
+       0x08ed0bf4      0xa3c790ab      0x7289c4da      0xc1a68566
+       0x7061e620      0xc0c7fbcf      0x13f31266      0x0644d951
+       0x763284dc      0xb201e4f9      0x9b21465e      0xfa49ddcc
+       0xe3af7f77      0xf27536fe      0x40f5e4ff      0xaa8433f7
+       0x319dd056      0xeb2b211c      0xd588d768      0xef8c823e
+       0xa743d935      0x107e2582      0xc23ce2ff      0x99fdb245
+       0x0965cc02      0x73ce4b97      0x0118f1ab      0x28c575b6
+       0xa3655e07      0x48409d8c      0x3bd10f75      0xd3634366
+       0xcd293761      0x15db1b25      0x1fccb21f      0xe8141f3a
+       0xbcd89ad1      0x53ceb99a      0x39e80422      0x95592406
+       0xe56956af      0x26e87b88      0x47ef03f3      0x37220d2a
+       0x092e1bab      0x5b5984c9      0x6dea2c0f      0x7cad0369
+       0xb4f0dbb7      0xc18cc43f      0x4195b382      0x4f5f7d63
+       0x0f6cfdbe      0xf5a3df66      0x9e25dced      0xfd2310d3
+       0x2f137c49      0x33986698      0xd4ba0c96      0xae11d033
+       0xe8b72cb4      0x70e814ef      0xe978353f      0x1b568ba4
+       0x89889582      0x0387b214      0xc58d0ae0      0xaf8ca49f
+       0xc3fbc17e      0xc30d40d5      0x9e74edac      0x12f94383
+       0x68d6f1ce      0x8dc5d480      0x3a3d7eb9      0xf03046c3
+       0x722aec23      0x6d4f55f5      0xf3ece7fe      0x6a8d9df1
+       0x749060b1      0x9c170b8a      0xe6281454      0x748ce6d6
+       0x2d91dc4d      0x5b173596      0xf359c629      0x2c6f17b6
+       0x0aed39cd      0x31e749b6      0xd0b8f062      0x0813d11b
+       0x189fb015      0x3cab2e97      0x058fba0c      0xfd1b6651
+       0x9a8e844b      0x50524773      0xb2db8548      0xf254761d
+       0xf0e00ce5      0x246621f0      0xc0bc81ae      0x035b8d5a
+       0x5cd39846      0x65210952      0xde9c544f      0x94b50762
+       0x959c2d0e      0xf7966e26      0xeb92273d      0x25fbb61e
+       0xb8af3176      0xe0ee6870      0x86ee2b1d      0xd4f9666c
+       0xfda83623      0x49c6fbeb      0xe14b19c8      0x89c83059
+       0x5bc697bd      0x2e873505      0xb7763e5e      0x5d802426
+       0x6aa1770e      0xa14f4b15      0xfc01f148      0xb55a8463
+       0xc77766b4      0x83d46980      0xabc67a90      0x4581c639
+       0xb24332ae      0x8a6a6a3f      0x45460e3c      0x2f979301
+       0x9da26d46      0xf2d82fc0      0xfcb6d2cf      0xb43d6be0
+       0xba5e1c4c      0xe4a12772      0x2ec2edd7      0x384bb800
+       0x46463f92      0x1ecb6517      0xfe795d3b      0x2b813434
+       0x7f07d577      0x58c2ef7b      0xf7ef6c45      0x5ef14dba
+       0x68d32f84      0xfd41125c      0x1d60f95f      0x80634cad
+       0x7cf1e3af      0xd8e0eecf      0x18ffe0e5      0xfac38b40
+       0xa1470b5a      0xfc573f25      0x71b379e1      0x79ada1cd
+       0xd6202f3a      0x2064d260      0xf81b4a78      0x78bcb6ce
+       0x0a51176c      0xe6f9cca8      0xb6a412ea      0xad2a2046
+       0x3d48bce8      0x248e5b1c      0x58730463      0x3eb87aec
+       0xb2a5d6ae      0x7a6bd456      0x82603999      0xd0419841
+       0xbf3382d3      0x841d04ff      0x31dae79e      0xb44d0cd1
+       0xee88b3ba      0x1ef37747      0xf4e7b3b9      0x7f7588cc
+       0x1ec2693c      0x4cbe2715      0xc1ec14ed      0xa2acbc8a
+       0x5a929034      0x6a6f1665      0xf16a280b      0xf42a69a3
+       0x6fadf80a      0xee4eb89f      0xd4dd24e6      0xc75b26c4
+       0xf6a9f084      0x78eaec74      0x86201788      0x24ea2ef5
+       0xc1d8fa87      0xcc5ff140      0x57caaad1      0xbdd82355
+       0x742f0e34      0xe444c652      0x3e96b2c4      0x2c920561
+       0x0577df04      0xb1f5c5df      0xcd5c19c3      0x9c725e0e
+       0x2154c6da      0x400b719e      0x2bbd900f      0x6f2af9b4
+       0xef235247      0x34ff3448      0xa2203ba7      0xe95a3cac
+       0xa3a75edc      0x0cb75c83      0xd4d58f54      0x9c5d8ed8
+       0x2e198c12      0x68228d38      0x0810e408      0x8f6fc1b6
+       0x17375775      0xbf9b8b3a      0xa4b20362      0x271de049
+       0x27d66314      0xdb8eff9d      0x472b462d      0xa2753e61
+       0x4b08a2e5      0x003fd8a7      0x7132b0aa      0x86cf745d
+       0x04a74a16      0x3f187b59      0x3dec12b6      0x1685ae21
+       0x09cceb45      0xea3f4249      0x18896fc2      0x7b596781
+       0xc3b00701      0xf45b2348      0x9157f33d      0x373afce0
+       0x5ab0f7e7      0xd11dd144      0x789e4a3f      0xa2cf8cc8
+       0x2763e381      0x297093ef      0x1e18ee87      0x5670f2ea
+       0x3870a085      0x7bb26ecd      0x8be4ae47      0xc90a2838
+       0x90253b64      0xb64f3213      0x90316e77      0xa1065312
+       0xc701bfa2      0x78b8b393      0x195f8062      0x455ffd63
+       0x256cae7d      0x14e41781      0x89ab05a3      0x9d06f374
+       0x13ce2d15      0x02e9c362      0x32e3f1cd      0xb5b721cb
+       0xdeadbdcb      0x204cab64      0xbd778fd8      0x8f9099eb
+       0xe99a4ed0      0xbdd90d0a      0xbd00b922      0x8eb31a92
+       0x87bdeab3      0x6b9cf5f0      0xe021d51f      0x2474352e
+       0xd901ebe0      0xd04c0ec0      0x1cfb5498      0x3ef1da8d
+       0x9f5ea3cf      0x919b794e      0x2234462d      0x60a12913
+       0x2b516e1c      0xeb5d63ef      0x59163e77      0x9d0b6c15
+       0x06d29864      0x0ab3e5ff      0x84e5c751      0xededa5d4
+       0x6f2646b8      0xc5343089      0xa1274e11      0xc80fc0de
+       0x25d198bf      0x0cc3c67a      0xedfd0e21      0x3d083ae0
+       0x1e118379      0x5bf6e94f      0xa1d7e95e      0xde69bb24
+       0xf413ebda      0x6230cf49      0x5d2b9510      0x53f7b612
+       0x62c7eba8      0x0f2c0a46      0x68689315      0x66170fd8
+       0x69e271a5      0x227f306c      0x070e6d48      0xcb363e6e
+       0xac73d4e8      0xa86c53a5      0x521e4087      0x723e7829
+       0x030d34ac      0x3a692250      0x7fe37a11      0xd222b160
+       0xb692ab81      0x29711c32      0x63badd8b      0x0c5f88e1
+       0xf9b84e79      0xeeb8d616      0x0fc9a7ce      0x3ac0a073
+       0x04df6e70      0x653ba8d2      0xe7c0fc18      0xca5f74ec
+       0x53b8a32f      0x41f20b6a      0xfa088ea0      0xc236a349
+       0xeb2668ee      0x9a716606      0xb81026ac      0xede58e14
+       0x93577dc1      0x26d623fb      0x2f46d6d1      0x36792a07
+       0x6942680f      0x2eba3000      0x3eb54815      0x9662a861
+       0x1c72420f      0x38ab7e35      0x046e8870      0x1b6ac99f
+       0x9ef80a86      0xb4536aab      0x3018741d      0x4a5f6fd5
+       0x9238b8e4      0x0fff6bfc      0xbc070e77      0x998c5bf8
+       0xe5da6078      0x1f3bbd88      0x45ede937      0x5df05dda
+       0xfadd003d      0x9dc951f8      0xf1b9ab8f      0xa61899f0
+       0x824e94d3      0xc722d831      0xb5b589f5      0x260162b5
+       0x37f56eab      0x28ddbb24      0x9099aae3      0x6a0569d7
+       0x17521d8a      0xfebed88c      0xe0b17f90      0x459d1261
+       0x71720437      0x7774706c      0xdbd8296b      0xe2e930fd
+       0x533108af      0x4ed99a97      0xdb411394      0xd7fc6f52
+       0x2d400e97      0x62179749      0x403b1bea      0x782b58c6
+       0x721a8d7c      0xc16e050e      0x6fabfb33      0x3dacccdf
+       0x1b44eaf5      0xccea00d7      0xaa9db3d4      0x2049ec4c
+       0x8b8fdb66      0xfbe0ae38      0x30fb344c      0x2ffa90f7
+       0x0d5124c6      0xde1167e7      0x75950723      0x7d04f094
+       0x9b4fbfb4      0x30dd0a25      0x678d8e05      0x1593b586
+       0xd6c681c6      0x334d4b89      0x52f1dfc2      0x555e1dd3
+       0x1ef04ae6      0xf6abb115      0xade9597b      0x9a278bc9
+       0x0bf22078      0x91c2e9af      0xdcca425f      0xaa3083d2
+       0x6b743fde      0x50d7a3e2      0x2e896bac      0x99b328c2
+       0xcf5f7b6e      0x637cc0f6      0x1697db57      0xf6861788
+       0x5bc8c0fc      0x2efd58c9      0xe21f95e0      0xf2c37414
+       0x1d6e3802      0x5216077c      0x935067ee      0x0ebda837
+       0x0d9247ef      0xb80cf7db      0xb1d059cd      0x6a2f13a4
+       0xd67a58e0      0x794bdff4      0x5d231283      0x61bf4994
+       0x91b0d200      0x41535f81      0x5b16aac6      0xc07b7c3f
+       0xd8fba065      0x12075029      0x6514862c      0x6b51c7d2
+       0xf0a9945c      0x5d230573      0xe3e465a1      0x9f62b179
+       0xa082de80      0x6f321158      0xd23d6f6f      0x52e89e06
+       0x567a7a26      0x702f271c      0xad6d1773      0x868a4951
+       0x12215303      0x90a03402      0x62cb847b      0xb27525ff
+       0x49143560      0x91295f7b      0x8e55438c      0xf3b89dc5
+       0x42ed6a2e      0x0034b9dd      0x2acdeca8      0xbec43836
+       0x9fb17e97      0xe58b0fa7      0xfa145934      0x85fbb9ad
+       0x95de5881      0x26b0a0d5      0x104f7aa2      0x854eb51e
+       0xb933973a      0x731e627a      0x2993c363      0xcf786c52
+       0x8a4fc24a      0xa595abdf      0x78384c3e      0xb9fb1df4
+       0xf9e57ca0      0x65127da2      0x5a79decc      0xdf4cbeba
+       0xb114bad1      0x337de172      0x0e3ea702      0x6b81da6c
+       0xcd6fcec9      0xfbd9b0ad      0xc64ab9cc      0x7e4a2cfe
+       0x57e95205      0x657ab502      0x5accf277      0x1929a188
+       0x5da83ef9      0x80e6d771      0xf1a53333      0xcf6e37c3
+       0x699e5a6d      0x3347df35      0x2622f61b      0x3cf94535
+       0xa07ec501      0xe54f7046      0x63c5332c      0x2d3820e2
+       0x053b6076      0x0b010f4f      0x7ec1d8c4      0x45b55100
+       0xf30d9a07      0x40d20ca2      0x7f412a03      0xcda1dd71
+       0x275ec460      0xa40f7f27      0x7864652f      0x9df5a051
+       0xdf289605      0xb711264c      0x4361fbb3      0xa0d2f988
+       0xbf6a36d8      0xecc6820e      0x4b55e0a2      0xcf2c9924
+       0xe07bcf08      0x8c377f0b      0x99345c94      0x0134a900
+       0x56f1c367      0x5dcfbfac      0x25360a09      0x49c5ccf6
+       0x922aa36e      0x276eac5f      0x8710bcac      0xc6ea8cb0
+       0x01231ef2      0x8ad4b783      0xc301b63e      0xe2050fca
+       0x03bb94b4      0x4ade55df      0x9d352042      0x125b0dbe
+       0x927cfc5b      0x2a1a4c22      0xa8df1087      0x48f4fcac
+       0x11a9146c      0x9050d4b5      0x50ae4db7      0x3d55d36c
+       0xcda2ab9b      0xaeac16c6      0xd2aba445      0x6e67bb31
+       0xc5e2bc39      0x74b22d9c      0x9ab21d96      0x08c9d930
+       0x644b849a      0x01afe0eb      0x404bc2da      0xc9a72a81
+       0x99fb4563      0xe7c76b3c      0x85c61427      0x5f8965c2
+       0xbac7e3cf      0xb0c0874c      0x5b74d24f      0x7c6b65b6
+       0xad2a6956      0x9b28819d      0x12cb73be      0xb20186e4
+       0xd620106e      0x541cd7bd      0xea9ecc4a      0xf13f0fce
+       0x46c54ec4      0xd152c3ab      0xb2c3f44a      0x1fd51335
+       0xe8700691      0xfb37e2d7      0x9b460ed3      0x02bc94eb
+       0xe6d3c07c      0x5d14b59c      0x4caa9b64      0xc1d5e067
+       0x091822f6      0xcc05772a      0x0582b394      0x26eface0
+       0x2cc18131      0x9c185a07      0x85e1c51e      0x0002022c
+       0xebfe882c      0x0a789198      0x9a08ba3c      0xde2cc070
+       0x2bbd9cfe      0x284afed9      0x0c7379e4      0xf93de40c
+       0xbd37bbe3      0xa9ecefe4      0xf9a158ac      0xbc908d2d
+       0x2bfdd088      0xa361662a      0xb1c0d365      0x8beb7d9d
+       0xfedbdee7      0xc79f3876      0x9960ba9d      0x2034d88d
+       0x958e019e      0x41f39110      0x64da9bc2      0x816abb18
+       0xe63629a5      0x20794d8a      0x662616b8      0xfe9f46d1
+       0x071aac55      0x30d84d05      0xa06cc26b      0xa824df49
+       0x5f14495c      0xabcd0785      0x83179f84      0xf8a0d3e0
+       0xe55eaac9      0xa0c1d5ca      0x57bf9c29      0xa7c88077
+       0x26a94994      0x1d24439b      0xe5bed5dc      0xeb7c690a
+       0xa0b18552      0x7f76b756      0x750a0a29      0x558f21ec
+       0x78bef53e      0x32ccb511      0x151c3954      0xef46ae12
+       0x67ffef39      0x052a28c3      0x22bef7f6      0xf85d4c0c
+       0x7f1f720f      0xf3f17037      0x46dd1bee      0x888db6e8
+       0x341815f3      0xf06776e8      0xdb259c33      0xf9b0e8d6
+       0xd4006773      0xaf315b70      0x9fae82bd      0xb0d94ef6
+       0xe44e2e9d      0x3874a840      0x4b5edbd0      0xafbcf23d
+       0x6f471b90      0xe20da874      0x2d2b5672      0xbeaf33f7
+       0xafed4e5b      0xe8026760      0xf7d5816f      0xdb6a0104
+       0xee342d91      0x3fd028e2      0x46c9d97a      0xfcbbfbb2
+       0xaec52ec7      0x26a53cf0      0x2316bff5      0xc4437f42
+       0x6375d058      0x58a6250d      0xca6a79a1      0x0aeb2a2b
+       0x6aa9e430      0x94fd7d5e      0xb4febd86      0x2e2c543c
+       0x487d8f6b      0x86456252      0x4f4f5113      0x3e754682
+       0x9b06f61e      0x2cd59fea      0x75dfecaf      0xffa22da8
+       0x8d19266a      0x4989fd18      0xeb914d90      0x51c5c90e
+       0xcb93443a      0x5430cc60      0x7505ed40      0xc846f4a7
+       0x6889f168      0x2e4a2483      0xfd343421      0x5f840378
+       0xb1fd6683      0x72cbc8c5      0xa6c3dc64      0xa62b7e66
+       0x0bd334ba      0xd3325eef      0x4995c33f      0x70807fcd
+       0xc00f74f8      0x95bc9b96      0x5d5c427e      0xa4e61238
+       0x4bd67f30      0xb5f77587      0x394d8fef      0x388f2157
+       0x821f9605      0xd9d6c839      0x397448f6      0x909c7fce
+       0xfa33419c      0xe76f2a93      0xd8d82a0a      0x958ad737
+       0xacc2db98      0xde83b149      0x8fdeb3fe      0x22f50686
+       0xf5f12f19      0x995ed87e      0x01e991ea      0x7de09abe
+       0x709cb382      0x1889a44f      0xe08aadff      0x7baaad92
+       0xeebdb9d2      0xd56d750a      0x695ea096      0x5a058e43
+       0xda042ea8      0x65298703      0x9dd245f2      0xe9ad47f0
+       0x7d190a49      0x830be058      0xf04924af      0xb870703b
+       0xea03bf4c      0x9c0cc87f      0x7a17fe68      0x4d116013
+       0x1054c702      0x55c3cf0e      0xa217a2c6      0x7d4ce193
+       0x88b348c1      0x72a4ab9e      0xa354465a      0x766fe13f
+       0xef614370      0x8a144eb7      0xf45c4941      0x6cbde577
+       0x27bd3e2c      0x33858ccb      0x1ff580bd      0x43d9033f
+       0x40836392      0x783ab27e      0x5706c509      0x18bcd812
+       0xcc132c39      0xc3059b54      0xd3c5b401      0x9e0f318c
+       0xffe7fd5e      0x3443ef1e      0x0263afc2      0xa782e17c
+       0xcc606b78      0xe7e5ee02      0x148e0eeb      0xafe85cb7
+       0x9fd7a869      0x46af1217      0xf50b4e8a      0x17aa5daa
+       0xde454b83      0x56cee58f      0x96c2bac1      0xd12e1575
+       0x81af14e2      0x8be3cf30      0x9aa3d338      0x1924840d
+       0xf6e2f7b6      0xd48dd26a      0xf0107e1b      0xe477207d
+       0x21ce17be      0x8cc2ecb3      0x0794ec9d      0x16939e22
+       0xfbf477f5      0x77dae996      0x1b778d69      0x83f0e9b7
+       0xb9864a5f      0xf235d47e      0x11881d8f      0x75250d33
+       0x4ff84f64      0xe6ab23f8      0x3fe1e0ea      0xa1235fb9
+       0xf794936d      0x3cb45af8      0x6741e3fe      0x267beb14
+       0xe9feddc1      0x69644d8c      0x8c4c159a      0x81ef74cf
+       0x7e32e357      0x4577b760      0x6c9f2a13      0xf2b40a0d
+       0x9907e9dd      0x732dbd8d      0xb9bc75e9      0x97400142
+       0xc3a04231      0x8a4b0c8f      0x0892560e      0xbe279fd4
+       0xcbccef1a      0x3a7f36bd      0x6bb2bec3      0x74916369
+       0x6750eb0c      0x0adab860      0x29caab76      0x22278996
+       0x43044e80      0x01ec2031      0xb73889d2      0x883a69ae
+       0xfa282963      0xaba2e3dd      0x28211b19      0x93d2d65d
+       0x925a8da5      0x6938296e      0x56e4a090      0x55e01f10
+       0xc1656a69      0x2ad00f4c      0xf4cc31a4      0xf482cc33
+       0x4db0ab44      0xf7e2fcbe      0xa1b056a9      0x8dbc69d4
+       0x94a0ab45      0x1039c33b      0x22ad0f89      0x96c324a4
+       0x772e8e21      0x4be19286      0xc334d7d9      0x8fe52e6b
+       0xdc575fc8      0x55e093dd      0x4072b164      0x455f5953
+       0xc1be8a20      0xc909e3c8      0x4e014a31      0xd262c165
+       0x3b8c6f36      0xb325686c      0x2a9a5be2      0x2c9d6391
+       0x5833eb46      0x809a3e39      0x79afe57f      0xda8f5d9d
+       0x20edcd04      0x916c1c5b      0x18a08965      0x1237b0e3
+       0x1d306141      0x963c4107      0xe7d19f5d      0x3646a554
+       0x70ddd647      0x347ae7e9      0x6c93751b      0xb8140f9c
+       0xc87a899c      0x9009637a      0xa2121286      0x70274bc7
+       0xfaa6bdd4      0x6a8058c5      0x69288fbd      0x5d99c8f8
+       0x9c17265e      0x627758c0      0x3d0b4a49      0xa0e7e889
+       0x896ca47e      0x2604f3d0      0xf74e9f29      0x5c67cbca
+       0xd182c0c0      0xbb53e30e      0x1760ac60      0x8479de69
+       0x81dc43c9      0xa3502737      0x7a494ce3      0xbf15690c
+       0xf01bbc02      0x11b409ec      0x11f9ae61      0x5ea7db7d
+       0xc6acad70      0x8354f8e8      0x33abdb39      0xc180c9f0
+       0x1bb2bc26      0x8ace959a      0x47bfbf28      0x7260d8f9
+       0x26718357      0x0baec766      0xde8a5471      0xb9363d8f
+       0x7721337c      0xf3058007      0xe1943bbf      0x6c099927
+       0x255ae5c7      0x40f53571      0xbf2730d9      0xb59dcbb5
+       0xe5f30f40      0xb409cf50      0x59bcdad7      0x781c882d
+       0x869ec8d8      0xb7c6da37      0xc90c80ae      0x0fa16b77
+       0x4299f827      0x2994df77      0x5f4bc5d4      0x4fccc675
+       0x18f3397f      0xf361abbe      0x4bab0e91      0xbd254234
+       0x2dc1633f      0x260dfabd      0xdbcd00ee      0x8c4efd98
+       0xec29b992      0xf64a1525      0x07c67439      0x4f94e202
+       0x5faea3e0      0xb92afe2e      0xab4cdaa9      0x626ed8e0
+       0x4dea08ab      0xf9f9bb95      0x7e7c464a      0x387bc35f
+       0x7ff891cd      0x72f159a4      0x850a58d8      0x3ca73efa
+       0x19f4c978      0x68ecb807      0x3a55cbfd      0x6d0befcb
+       0xddd7fb88      0x8907e3e4      0x8b9316ca      0x0c526804
+       0x04e2a4e1      0xe6171958      0x7e1c66b4      0x3541ddd8
+       0xe343d15e      0xb2508465      0xf752e13e      0x6d0080dc
+       0x1d8f4ae8      0x24da3465      0xeb5943f1      0x5fe28985
+       0x6f982104      0x2d0d972d      0xaa8c451c      0xb7e48698
+       0xf669229a      0x7195af34      0x67bcfec9      0xfc5799b7
+       0xfc256d6c      0xc9095e36      0xc29020a0      0x9141b686
+       0xac0ae23f      0x76f0b463      0xecb76e68      0xdca1c5a1
+       0x2d4fca83      0x8953f692      0x31d1912a      0xd816f824
+       0xcb04f062      0xfdbbd34d      0xcf163dcc      0xdb9cff91
+       0x9db9bce5      0x4ca42841      0x4d88103d      0xaf6f09d1
+       0x646928b2      0xb71056d7      0x32560e11      0x6454d746
+       0x0c17c2a9      0xd265ab20      0x01f017ee      0xfc67c395
+       0x5b1acd70      0x3a6c8cf5      0x71e2d110      0x2ca5bb0f
+       0x626734c2      0xac0e5db1      0x4c7a3df8      0x0443be75
+       0x812f4e5d      0x5535bd41      0xd64093bf      0xbcced37a
+       0x37338d6b      0x83b901d6      0x8f13585d      0xa0c32a10
+       0x850091fa      0x24864a2d      0x2daef36b      0x3c9b2a64
+       0xe05bca8b      0x35c0c539      0x5b507233      0x588861d9
+       0xae0000e1      0x12c4f5cb      0x2f6f1d92      0xf861b587
+       0x4cb13ea5      0xc685fd44      0xaf3e79eb      0x6894ec24
+       0x6cbdc6a2      0xe8043d1b      0x0bae6d8f      0xeaaf8aa1
+       0xbd258899      0x6fcf2c4c      0x8c3b38d3      0x74479897
+       0x02ef1ae9      0xf252194a      0x4305fdff      0x096dfe12
+       0x52ce0e33      0x7a444340      0xb98aa819      0x8d402d73
+       0x2324c799      0x0e383c16      0x4f5ea7f0      0x18f3f716
+       0x079a5941      0xc275f1c3      0xf38a3b57      0x7967ba58
+       0x24d824ce      0x870c135c      0x9147bfed      0x87446edf
+       0xe6a5d5cb      0x6325e4f9      0xcbcc4a39      0x89b77802
+       0x40ae8bb1      0x0e25732d      0xe146cd6d      0xe2857df0
+       0x7d4c4d4a      0x5e015167      0x4b29072e      0x9de040ab
+       0xfbe384d9      0xfa2d1bcd      0x6d15bd11      0x3d374222
+       0x31ed6491      0xcfa242a2      0xcbbd5cf4      0x009a4aa3
+       0xf03912a3      0x8206d3a2      0x57693b50      0x5dc3629b
+       0xc4a557fc      0x8e1916ba      0x9a94d4ae      0xd8ef98d4
+       0x60987606      0x5722c9ac      0x85dff228      0xefe455d1
+       0x1b93dc34      0x3c3f5839      0x4794ed4a      0xe5f4cc96
+       0x8d2be902      0xc766218d      0x7c5ca4fb      0xf75c46dd
+       0x4c294ead      0x9c26cce6      0xa5af7967      0x33df7c94
+       0x8a3ad2eb      0x7db3b432      0x6e961c53      0x38596cb3
+       0x4c7401f1      0x174b07f2      0x3fddb615      0x8eb8fe06
+       0xca1d5e31      0xc2e5b4f9      0x68cb83e1      0x157ab415
+       0xfcd4f635      0x85a625b8      0x45a5d073      0xb8737726
+       0x8d66d90c      0x22374ea2      0x5048665f      0x741d4084
+       0x95ca85f1      0x3e9ec723      0x11020c1c      0xb197ffec
+       0xe1f584aa      0x59a7b34f      0x7a8757a9      0xb49376a7
+       0x0af698b0      0x2aa7ad32      0x5118eec1      0x805f60de
+       0x7fcdecf9      0xd99f5243      0x6fc3f111      0x10b12af2
+       0xa71778f5      0x62679d7d      0x8c648f68      0xa82ef346
+       0x1af396a4      0x279b2f9a      0x9ef3ea43      0xcb5ef78c
+       0x486bb8af      0xa619b664      0xafa5e5a1      0x9ad5af77
+       0xc56f1a36      0x33fdbced      0x07a5e6d3      0x60988d83
+       0x5cde15f2      0x58cf910a      0x670336cc      0x6a8ea3d7
+       0xb2d3f8e6      0x107b7afd      0xa616021a      0xa1d95c02
+       0x8bd9d9e3      0x31c99a87      0xf92136d9      0xd3e00422
+       0x21f98c6f      0xccd4ca9b      0xe0b0b097      0x8f96cb8e
+       0x1a241a03      0xc8451b34      0x9ab68eeb      0x89f27e16
+       0xabfd9614      0xbb1e5d95      0x33add3a2      0x69ee5ea7
+       0x2d525a1c      0x6ea2fa35      0xe2bcfd31      0x8d29feb5
+       0x1bbf2ceb      0x4dcf92d0      0x31a28a88      0x33262872
+       0xf9b2cc0f      0x3e17d56f      0xc4bd98ab      0xdc65811c
+       0xd15ec7d9      0x2926cc47      0x17eff4a8      0xf285a14f
+       0x5beddbdd      0x911bf1de      0x4d29d23b      0x5b2a57ab
+       0x9b18d6c5      0xec838995      0x203ac465      0x4b71acc7
+       0xc9d70c1a      0x1f42f685      0xf8d68e39      0x7b0be69d
+       0xae2ad5f0      0x14861118      0xe4d67c0c      0x2a7a97ba
+       0xd1dded36      0xb0aef347      0x94435d9e      0x6c77193f
+       0xbdfee9d5      0xf2926e0c      0xe9cd2c1f      0x48b0a0b2
+       0xecc37a3c      0x6a7357ee      0x35f26462      0xd4787e94
+       0x85159c0e      0xd300df63      0x68fc81d7      0x70214c8b
+       0x4d8eaf04      0x0ce45314      0x2a57e90a      0xefad38bc
+       0x61d26191      0x538a438d      0x2a9bf8d0      0xf417e6be
+       0xde2b8fa6      0x7d51432f      0xc953ebdd      0xa35e3d4f
+       0x422606d2      0xf96ea32a      0xfd741ba9      0x3c1068b8
+       0x83d7fb0a      0x820ecd14      0x8293f025      0x69eb4478
+       0xb38688f4      0xc37c7c15      0x423c41a4      0xbaf87529
+       0xf13a689a      0xc99683f4      0x5d307068      0xf540802e
+       0x45e4e2b0      0x7461c823      0x9242c577      0x3bb20e57
+       0x2f9b460d      0xb5ca4e7a      0x8f243f1f      0xcf2b115a
+       0x02e42b62      0x1f735558      0x61de9c7b      0x3080e0cf
+       0x56898a0c      0x286b4a43      0xe17d1858      0xfdb0d21e
+       0x9a0998bd      0x6f3793b5      0xe7a4b2a9      0x1a9ef7a7
+       0xf022a829      0x91a8220f      0xd35f6564      0x5689758e
+       0xa9723d93      0x01e17c3c      0x9e797d6c      0x931448b6
+       0xd4e8430b      0x0dba9b8d      0xecd995e4      0x95ec825e
+       0x87aad51e      0xc9f158b7      0x32942d39      0x541a555c
+       0xa4ff1310      0x60a03907      0x2194852f      0x111f4a75
+       0xdb1c720a      0x095dcca0      0xf3dd7dff      0xc7ca3304
+       0xb5eeb3f7      0xcf0d0c72      0xd808a0a5      0xac1075f0
+       0xbc561609      0xdc72b6a2      0x54885b6c      0xe7efd131
+       0xa1a5a25c      0xcbe4ff3c      0x28f97f18      0x4012e7ea
+       0xb179d1b7      0xc809f1f2      0x03ec77bf      0x95e2b32b
+       0x3037ee61      0xfaaaaeef      0xa962f075      0xad708299
+       0x773e64e1      0xec4393b8      0x78f3a010      0xb64f4526
+       0x0371e230      0x8190f9c8      0x6ebf110a      0xee32985b
+       0x3d9224f7      0xda849ae1      0x0e374bf4      0x66d520ee
+       0x19e8a010      0x3eed7ee7      0xdbf76747      0xa7da62d1
+       0xeb485f92      0xf90297e8      0x36a32248      0x82a0b444
+       0x0072c4d7      0xf31919b2      0xf63b3ca8      0x78729ede
+       0xc2c3c36f      0xd170210d      0xc1d19649      0xad9eba3e
+       0xb8ad7754      0x0af0eed6      0xf7c5a835      0x788ca836
+       0xd9ef72eb      0xfdfa039c      0x88398d5b      0x20f22f57
+       0xa9a8b93b      0xa5ebca5d      0x28f209ff      0x07e32e21
+       0x9656f67f      0x6d3c5fa7      0x110eb8f9      0xe15ed9b5
+       0x866d4470      0x3c60e896      0x156b88ad      0xe03f5d01
+       0x4b71a715      0x5b635aef      0x233a242e      0xafaa190b
+       0x4dabcdc9      0xca4f7fb1      0x2af45681      0xcdb6acd2
+       0x445ea28d      0xeb2375ae      0x332b2a88      0xf4c09b6e
+       0x9735d52a      0x05246fe1      0x155ec9ca      0x28e12827
+       0x02eb26e5      0x5e34c38a      0x14f65c83      0x570c33ef
+       0x083f8f84      0xafbed213      0xd8de70f3      0xb846bc36
+       0xd9dbe621      0xafa979d1      0x3e1e9824      0x19042871
+       0x32f7cb39      0x0855c3ff      0x6bcc596b      0xb1bd6c61
+       0xf2eef2e0      0x4266114e      0x2af9f232      0x638ee7be
+       0xead00f9d      0x1eb23029      0xb7a696f5      0x3dca0c76
+       0x18d10791      0x6d0b8421      0x11265a7a      0xa94e0ba4
+       0x7ead64f6      0xebe66308      0xdf484ae9      0x4bd2aaf5
+       0xc4524a77      0xef077907      0xbf3611f7      0xdd200d07
+       0xe74763ce      0x48471278      0xa16800c5      0x057a9c8c
+       0x8351bce2      0x01f13e2c      0xea354df2      0xebab56c8
+       0x35131ec5      0x91b89076      0x089a3f82      0x2febf67e
+       0x6371f8e9      0x47875c38      0x68068d1a      0xa9ffaca9
+       0x981fe8ad      0x3cbf3d90      0x0f595206      0x4819c74b
+       0xdf34f481      0xbe9bee8e      0x75a32f6e      0xa2fa22c1
+       0x831c50ad      0xe926e034      0x9eaabf41      0x85fc1fdd
+       0xa0e03c72      0xc03afb52      0x714b2c07      0xcf6ea676
+       0x4570c3a2      0xcc59d874      0x88b7bb1b      0x9f290e3e
+       0xe1bc799a      0x7cb7feb1      0xf6cf2a64      0xee527235
+       0x6fae46de      0xd1718027      0x8887b0a6      0x4d2ba919
+       0x8ffe8517      0x23cf9380      0xd2740cc1      0x608bb9df
+       0x10a6a677      0x40cfb2b3      0xda8f22fe      0x371fbcb6
+       0x2930ffa5      0xa71d9c73      0xd30539d7      0xe5c2a5d4
+       0xbbe79909      0x09c8dd8f      0x6ebb55d0      0x07987f3a
+       0xfc2c9aac      0xeffd1fd6      0x0d3f17c0      0xc6202654
+       0xaf1811cd      0x7a0ccefd      0xf6c0a796      0x9f26e794
+       0x573bebf0      0x56e55fe2      0xcd7a3689      0xb9bfb1ed
+       0x2b114c33      0xe7d85aa8      0x8e11b760      0xb7aa684b
+       0xa9cea609      0x26e91a1d      0x36d6bd2c      0x7e4b06af
+       0x990f23c2      0xa7c9b36a      0x791c6816      0xb7c873b8
+       0xb9b22ba4      0x3b12ce3d      0x19c88243      0xa23c93b5
+       0x6c879c45      0x612dee26      0x205ac600      0xc941d786
+       0x5aec21a0      0x628a03cb      0x29f6b021      0xa9815280
+       0x0b7f80ae      0x9626928b      0xce7fe692      0x74debb2f
+       0x1b0f48b5      0xedf656b4      0xaf90977a      0x7f298c97
+       0x599de972      0x2455b833      0x1b0e8a97      0x68e3cfb4
+       0x2af88b8e      0xaf00bf4c      0x576f0615      0xac27d941
+       0x3a3915c1      0x11980b31      0x36e6df96      0xcdce8ae3
+       0x596aaa5c      0x9902fb8a      0x437c5dd8      0x78fa4402
+       0x6e0499a1      0x20d91a0b      0x90185f3d      0xc7ec9381
+       0xc09a6965      0x1332c6ae      0x533d678e      0xe0d5bfdd
+       0x638fd40f      0x2413c57f      0xb4479fa7      0x8ce09a6d
+       0x141a584c      0x9ad2e9ec      0xbce7d66c      0x66f87de2
+       0x652ed9ba      0xe5a3e8d6      0x3438f95d      0x34455629
+       0xa2cd73ee      0xc72352a1      0x861dec12      0x05657b8c
+       0xb5788820      0x0f147d8a      0x58bd7e0c      0x95ec08d7
+       0xfbba26b4      0xa8cafa3c      0x60679191      0xfbb5a740
+       0xd062635a      0x27691cc5      0x19a7a5f9      0x0720cd0b
+       0x5998bd90      0xb89b4377      0xc0b6cff6      0x9d2cef91
+       0x10506588      0xbc6758dc      0x4d608503      0x5a699cd3
+       0x4e1074f8      0x705ae566      0x693f055d      0x7fffa4cf
+       0xa938f3d5      0x68d378dc      0xbbbcf3c2      0x3025fd31
+       0xf11955eb      0x335580c5      0xc14fb547      0x8ca8b7cb
+       0xbf488ec7      0xd65643d5      0x3ab48e8e      0xeb2a5a9d
+       0x8d4634b3      0x53d3c415      0x26ecd313      0x45866732
+       0x5ca6800a      0xa95a5003      0xb6a4a0ae      0xcf61181b
+       0xecce7a4b      0x6bb2617d      0xe6f6cf30      0x2ca484f7
+       0xfc041327      0xecfb38c6      0x8da2da87      0x04d6df0a
+       0x1da682fd      0x7bcc8939      0xb3211ba6      0xfed462eb
+       0x22d0bdb2      0xc81a03c8      0xc6cef99e      0x4a07f162
+       0xf47081cc      0x6b9f9f79      0x5255ed2c      0xc6664862
+       0x0a0d0fe0      0xce0a3c43      0xee29901b      0x08b1ebf7
+       0x3f6e20de      0x29d73ca8      0x19fbef40      0x35b805aa
+       0xe41c9fb3      0xdaab78c8      0x396eb246      0x7942b8b5
+       0x94b3bea3      0x44addace      0xd8c3b55d      0xa07d52f8
+       0x810d6bfc      0x84efa9c5      0x55cc3d58      0x31a721e9
+       0x818b9866      0xbdb4e594      0xcf9ef3a0      0x3ec34d62
+       0xc5f646ca      0xe03ff91f      0x5b7d6ac6      0xc965abc3
+       0x5d0a4b45      0x523b07fc      0x4ad23688      0xeb25e21f
+       0xec42f996      0xeac4a305      0xd083a034      0xf47e421f
+       0xa57f6115      0xc89869e7      0xad127bac      0x5766f2fe
+       0x73f8f406      0x66a164ed      0x57ce5b92      0xfe0543a7
+       0x3d01ea2f      0xbb5c4582      0xa0187dc6      0x0bac43a4
+       0xe3762160      0x53f709af      0x72a79d9a      0x8b131235
+       0x40144439      0x7f4b638b      0x740cb6c8      0xa267d4ad
+       0xe75e3d28      0x1936b8a0      0xf595f923      0x2653e6fd
+       0xeeeb0a5c      0x126c218f      0xf787c637      0x6e68d9a1
+       0xbb7a371d      0x70a542ef      0x6d6ca7ed      0xf4c6aeb0
+       0x7ecd1488      0x29b9f964      0x033cf786      0xcd34a0ed
+       0x4d09bf44      0xf94697cb      0x9fc11acd      0x4faec4de
+       0xe427a1b6      0x814c4083      0x75b5bcf2      0xf77ecbac
+       0x84f98a7e      0x67be3e94      0x547715fe      0x91134de4
+       0x1a258be0      0x4f1b0657      0x5d9a5451      0x6184d23c
+       0x2b0ebf79      0x45957241      0x327d3072      0x571b4e7f
+       0x29a93f26      0xdd3b33f1      0xc764cdc2      0xfac837cc
+       0x08dd03e7      0x7e20c4c2      0x2c706329      0x6a595b37
+       0xa399940a      0xe62996dd      0x410a43fd      0x8422504a
+       0x83c9047c      0xda9342da      0x0fd8d28b      0x10363a28
+       0xe583b580      0x7f865d38      0x53049b61      0xe2244969
+       0x1654cf74      0x3928b71d      0x92c56873      0x89c9f802
+       0x700f0112      0x06294872      0x5398b3f5      0x7ea9c78d
+       0x5e3dd947      0xdad37580      0xa4e7392a      0xe915e856
+       0x9253d5ee      0xa6c48e3e      0xf3712d98      0x2617d308
+       0x0b42e7d1      0x219ac5a1      0x934263c0      0x3b47e88d
+       0x5be1bac0      0x1ceaafe9      0x3ff3404a      0x89566b7a
+       0x68bfc8c9      0x8c7a1f86      0xfbbeab00      0xbd72bd86
+       0xf095a97d      0x4001537b      0x7231e146      0x65323fd1
+       0x29a7d447      0xbcdc2739      0xef8e77eb      0xbdec1572
+       0xba8d38ea      0x8be0df9c      0x14c9e008      0xccb500fe
+       0xf4f4aad8      0xa71ebae7      0x3e80c57c      0xb16084b8
+       0xd697a5d3      0x4102600e      0x14b09a48      0x929600aa
+       0x71f7d884      0x339dcba5      0x8b655661      0x68fd1ca3
+       0x79e428a9      0x13b38380      0x6e03dedf      0xcfc74cc5
+       0xd38273db      0x38f7e269      0xafcf0d11      0xe6efbc51
+       0x07559ea7      0x184f0ce9      0x5a0f1eaf      0x0890f392
+       0x0aac937c      0xaafe4395      0x635f04eb      0xbab57b9f
+       0x25ffe623      0xe63b2795      0xb0f990bb      0xb9dd0f23
+       0x72dd05d7      0x8b4afed9      0xad93aa8d      0xed6650dc
+       0x961af304      0x79ed2e65      0x64baf219      0x59cac07a
+       0x30a71753      0x6329158e      0x4df28920      0x4bccf1e3
+       0xdbf26ce6      0xdaf5b01e      0xe6d6ddf8      0xeb3b0b8f
+       0xf21c4078      0x383703b6      0x31b3eb29      0x8a4722b2
+       0x6da9cf03      0xde9b68d5      0x9fb81a8a      0xb9b7b225
+       0xbbf25f2a      0xfcbbcf77      0xf6b349e0      0x55e2a946
+       0xaa0ec8e8      0xe0c3f755      0xbb5317f5      0x42d49d16
+       0x955020be      0x57663a99      0x27f6472d      0x0db9e8fc
+       0x73e868b5      0x221726cb      0xf88d7a67      0x1afabd43
+       0x1c416d42      0xa7c8c7f9      0x2d53d211      0xa4b16994
+       0x7994098c      0x1196457c      0x1041d6ed      0xc3f3b526
+       0xdd6233d9      0xe5afe646      0x3eaa4645      0xb2f4be8b
+       0xa041a2d1      0xf56f06b6      0xe1a2b3cb      0x10f2ee3a
+       0xb4b80873      0x1f31a3c3      0x00a702f9      0xcc024339
+       0x0f11db60      0xe41963e2      0xee888ba9      0xe68bdba0
+       0x233f9cab      0x1011efb5      0xd0f9a956      0x63c01b4b
+       0x8f86b442      0xba153a6b      0x1886f0e8      0xc8cd92b2
+       0x6dee78a6      0x5425709a      0xb64fd26f      0xddd0d0fb
+       0xf543b459      0x6c853b90      0x7510f0e7      0x76d8a652
+       0x60ca661f      0xe9252e55      0x5a29d60f      0xe1fd802d
+       0xb3e9acdf      0x9af447b6      0x5eaf51bd      0xdfb0d9f6
+       0xa7c530c0      0xc8ecf367      0x0ed05b4e      0xc228d0de
+       0x564b4190      0x7a4211d4      0xfb7a7c13      0xde76c43b
+       0xb4984c7e      0xf3fe0221      0x066070ac      0x6e651083
+       0xd05fc9ce      0x1233ddc5      0xcbceea78      0x2a5bd303
+       0x8e085a72      0xede7cd74      0x3d62b29a      0x29774643
+       0x64c254f9      0xf117a1b4      0x3b557f53      0x4f6eae39
+       0x23da390f      0x6a8464b8      0x6ea39bb5      0x087f7f2f
+       0x43842be8      0x586ef6e9      0x37d3689c      0xbec7fa83
+       0xe85a0b9f      0x675c93ed      0x2d9f0762      0x4e7d5a3c
+       0xe6e54fbd      0xad3b58b3      0x81a4c6b8      0xb2da4172
+       0x4d992b63      0x8672774b      0x0f41f386      0x0d59a903
+       0x37fe2435      0x1d0dacc7      0x3c44c47c      0x56e00c7d
+       0x445d5b27      0x0ac7091b      0xb4b51593      0x21fb0537
+       0x9134c389      0xa5f7ac5d      0xb94b47b2      0x7bad6b13
+       0x573c7e83      0xcafc2dd1      0x09566a61      0x7b3d531e
+       0x3f0f399f      0x6c74ffde      0x4ffb2bba      0x1c59ce82
+       0x799d9fbd      0x3f64b5f7      0x595607c1      0x1366684a
+       0xff162fbb      0xe682e121      0xe07eb26d      0x5193e3bf
+       0x6d1d9de9      0x20c82cbf      0xc84a8e1d      0x73b5816a
+       0x590e6335      0x452c8c1f      0x19b2335c      0x4fa2145d
+       0xff0cd6eb      0xa5e683c7      0xc62b7cf0      0x66dbd8b7
+       0x886af340      0x1d661d53      0x45c3407b      0xe258129d
+       0x5738bc38      0x4e468671      0x8ef5dfbf      0x169d51c2
+       0x5e264507      0x33bf23b0      0x83df12f9      0xb23ca69b
+       0x050f29aa      0xf100c178      0x8eec6db0      0xafa51051
+       0xa31b4988      0x90a05b3e      0xf39b878f      0x1489a7ad
+       0x86726bf3      0xbc5679f4      0xcea42088      0x071984a2
+       0x9116773b      0x374ea03b      0x58ff0b61      0xb1fc9e12
+       0x527d73d3      0x2851a8fe      0x7dd6bfb6      0xe6df4902
+       0x1bbba42c      0x99af720f      0x097b9713      0x7bb88ff4
+       0x58f5f053      0x0f842f16      0x3d1e721b      0x887eed55
+       0x5c041320      0x378f42b4      0xd3c1ea60      0x4daaa4a4
+       0xa8ae1598      0x5dfd04c6      0x5e13f51d      0x8f2bc005
+       0x8112d8fe      0xd980f816      0xe60ed7ae      0x6d81784f
+       0x5ee9bbd5      0xdc72c993      0x5e4ffd01      0x2fdf5ca4
+       0x364c7ba1      0x8b957fe2      0xecf88970      0x1c948513
+       0x64e317f3      0x6d7ab225      0x70f168c7      0xb3d8f41e
+       0x54727fde      0xc180072b      0x52b62642      0x53d59c35
+       0x0756424a      0x84e736ea      0x403f01ef      0x7737edb8
+       0x0968aa7f      0x629b8453      0x54f02e23      0x40cad2cc
+       0x4712c678      0xcc0f73d8      0x9ce3491e      0xa93ad225
+       0x4fc3c353      0x9702a179      0xcbd42840      0x2a2d55f5
+       0xfb153530      0xd2aae06e      0x3b988b1b      0x215defa2
+       0xb7cb3a4d      0x517e11bd      0x116743c7      0x60f89947
+       0x96955aa2      0x8ef1616b      0xc7a86367      0x7962234b
+       0x80da3dc4      0x33327b35      0x076a2bd4      0xdd7a4bbc
+       0x685a08b4      0xa7fdcf7c      0x65bf1d86      0x1917a9d2
+       0xdca93ed0      0x48a391ef      0xd70a8cd8      0x86d52919
+       0x2dbe56b9      0xde8815b2      0xd5e0477d      0x4e111ddb
+       0xf5ef2878      0x17c5692e      0xd4937594      0xc071b1c2
+       0xd7151f2d      0x1ba686c3      0x54c38767      0x6501d7cc
+       0xbc16a74e      0x909dd991      0x858cf3ee      0x4fad895f
+       0x5975eee4      0x6ca600e5      0xabd86999      0x7a4c5051
+       0x9e023f91      0x2a581273      0xfc1856b0      0x717a9500
+       0xc814682e      0x868635eb      0x5567ee04      0xdd0fa821
+       0x7dd71e2c      0xaa29e440      0xfe7fa170      0xa6975f2d
+       0x7db13286      0xf80ea7cb      0x65440c80      0x1bbc88c2
+       0xdeeb5a2c      0xc1477a30      0xafbf244a      0x198402cb
+       0xcdee31e8      0xbba5e44d      0x83e50fc0      0x145c0c4c
+       0xe28d07e2      0xec6292b1      0xf03845da      0x04f887df
+       0xf8cf9658      0x9055eebd      0x7e433402      0x46b83e87
+       0x32c1d8e5      0x953b989c      0x27f6253b      0xedfb4f91
+       0x6f1ae0a6      0x70a2df8b      0x091a55f5      0x8758b4dd
+       0x1bda1ece      0x7a284685      0x4d63c11c      0xf22826ef
+       0xf0ff2763      0x4f10103d      0x8b9aad7e      0xda3a748f
+       0x86ba49ee      0x4a48f0c1      0xb4258bb6      0xb892aef4
+       0x2e1eec09      0x658af08e      0x03609f72      0xe067efef
+       0xd599a0d8      0x27043e1c      0x76610816      0xbd1a9b56
+       0x047cfef9      0xa7159a70      0xc82ced0e      0x44901cd3
+       0x19dea1d6      0xea24e644      0xe645f856      0x6e8fd665
+       0x25cd03ed      0x987368fb      0x95a04c97      0x4aaf44de
+       0xd232decf      0xdd2131ed      0x6602bdc6      0x8a42bd18
+       0xf839fb2a      0xb65785f7      0x7a6ff4c6      0x899830d5
+       0x46e993fd      0x09973f39      0x83cf23cb      0xb2f26770
+       0x8c531c1f      0xd97b41fb      0xf572173b      0x7a1404a7
+       0x61d85f57      0xa0702253      0x48afa948      0x8f2aaba3
+       0x1252a999      0x1a1e4171      0xe287d10f      0x121ff861
+       0x544d166a      0x7adbdffb      0xc2dadb3d      0xf88b86db
+       0x087f1dd2      0x3260bf71      0xa4b9881c      0x2b8f6795
+       0x2812e4a0      0xce728d9d      0x9ab3081a      0x3d2fa8be
+       0x61bc77dc      0x530464ab      0x36fda196      0x4efceb71
+       0x04aa6f81      0x8032ce30      0xb9c33455      0xa07c5b61
+       0xbfdddce1      0x16ffa34d      0x9f7f8efe      0xf6308df6
+       0x071fa35a      0x948978e1      0x35124fb9      0x2786d40b
+       0x62f06ff2      0x1409d3ae      0xc0223171      0xf524409c
+       0xd143e8f3      0xe87832fe      0xf5f46599      0xd0302b71
+       0x7259891f      0x83f9158d      0xa0b3ca08      0x37f0b6f7
+       0x8da1abef      0x869bc166      0x0891274e      0x1c99caa0
+       0x84f5c390      0x174eff0e      0x450caa3d      0x53704c05
+       0x14e2404e      0x5a050d3b      0xe3e1d53f      0x059293f1
+       0x4ebcc617      0x7278707e      0x3a0f589c      0x462178ab
+       0x9448eda5      0xc7ec4df8      0xc104df6c      0x0e7651f9
+       0x301ac757      0x5571a9e4      0xa1845d20      0x9bcaf8a2
+       0xee184556      0x54cd32f9      0xc64d37bd      0x87821019
+       0x0bf5eef7      0x88c05039      0x73f0c7ad      0xd9743149
+       0xe8ac4c1c      0x18d90782      0xfc38561f      0x3478b897
+       0x86ce7d3d      0xb465bea3      0x75101723      0xca9c4a8e
+       0xf3eeb88f      0x47221789      0x8561f74a      0xc5c69e0e
+       0xdff3c1d0      0xde80d4cf      0xe9098800      0x519678d6
+       0x0eadd078      0xb85293eb      0x891b8db3      0xf13980c1
+       0xd1ded2ef      0x57aba1f9      0x2be45501      0xe1e0b6d7
+       0xce304444      0x03a5dc2f      0xc55fcc35      0x66f3e426
+       0x507998c2      0x1ff98a40      0xd214ad6e      0x29f5da1e
+       0xa09ba361      0x4375dcd0      0x17a3e9c4      0xf43aa48b
+       0x279324fb      0x5355ef2c      0xd07c0a40      0x4a801679
+       0x3ccce904      0xbd1fccb5      0x72d23024      0x40bf2d1a
+       0xad66d845      0xd3b06ab6      0xa02e0454      0x6b8bb9f6
+       0xa0f01e02      0x7083871c      0x22a240b3      0xbc595e6e
+       0xec3ae893      0xc129dc83      0x305c6133      0x6478ca71
+       0xc3e31f2a      0xa672d383      0x25d1cdc1      0xa43ad0cc
+       0xc62762ff      0x524e0786      0xc8266cf9      0x4c1dce61
+       0xf401db3d      0x4731884f      0x2e74c74d      0x580d1361
+       0xced44e75      0x9cfbed1c      0xa4a118b8      0x3fc49536
+       0xc7ed335d      0x557bd121      0x99f6096b      0x105313eb
+       0x12d814e9      0x140bf537      0xfde60a3f      0x8fbb2142
+       0x290c9253      0xde68576c      0x1b6a453b      0xff076026
+       0xfb76b4b7      0x5e0b8e4b      0x1a5c4d8f      0xed50c7ab
+       0xe769b705      0x359af5cb      0x3b59367d      0x354ecb98
+       0x4779cbc9      0x19ed0073      0xc02a8af7      0xa7785920
+       0xbbabe7a6      0xd6088727      0x8e8ab30c      0xbe870ea8
+       0x4ba0119c      0x7d62815b      0xd2463123      0x07090f2b
+       0xb0ddb91c      0xf7b729c7      0xc6de14fa      0x5858ed16
+       0xd9ae0f53      0x413f2b4e      0x1d82480c      0x3d6ace1b
+       0x40276887      0xdf499b6d      0xe2f27cbc      0x7e3f27aa
+       0x881fbbd0      0x17f170c2      0x1b155736      0xb5474620
+       0xc245161b      0x6e0b4d6b      0x002e9fce      0xf7f5dc75
+       0x7110bf54      0xee5540ff      0x9beb5aaf      0x3140dd10
+       0xca6527ae      0x1eff473a      0xc21e9ed4      0xb90e2c31
+       0x1639bcb4      0x79299082      0xd8569456      0x9d55a257
+       0x4cdf608a      0xb763062f      0x33132bb2      0x95048255
+       0xfa7a56df      0xc4c25dc7      0x5acfdf09      0x01b4c169
+       0x65a39270      0x6a07cdad      0x5c1322ae      0x0a547a52
+       0x5b88ad05      0x2795f9a2      0xa878eb57      0x831c6d35
+       0x8de77363      0xef454c49      0xcc483e00      0x98d30ef7
+       0x5cee6411      0x59ddda14      0xdcad4568      0x63ce2a5a
+       0xc78a4f40      0x56c6a389      0xdca6fb34      0x4019a066
+       0x223145f1      0xc05df1e2      0xac849b7a      0xff73ca98
+       0x76de09cb      0xbb4369ac      0xe7145267      0xb07b456b
+       0x1fdf145a      0xde56e1c7      0xc5e9e8cb      0x64e69739
+       0xe5a32181      0x55ee6c8f      0x86521149      0xabae431e
+       0x10f5a7e6      0x2ad18917      0x12b1a65c      0x4ff84a9e
+       0x8068860f      0x610a0bf2      0xd331b49c      0xc92487f2
+       0xab54424f      0x968608ca      0xf6152bc9      0x17fbe76a
+       0xfbebd48e      0x33eae855      0xbe20e3fc      0xff5567e5
+       0x37cbf19b      0x76ed0c82      0x8b4607cf      0x4a659fda
+       0xab5af02f      0x98dbab4d      0x0098bb06      0xd17b1f16
+       0xe472636a      0xde2da4b6      0x6d9f8ed9      0x805ebfaf
+       0xedf89d3f      0xdc4e2ad0      0x3a30d17b      0xfc41ce23
+       0x4ff0c7da      0xdb3066b3      0xe60f5cf3      0xe6acb2c6
+       0xae51c542      0xbef39ca2      0x2d38d866      0xd4d7998e
+       0xff668ba1      0x577045d8      0xd3e7b383      0xf22ccabb
+       0x75752791      0x61bdaaa5      0x0cf06032      0xb6373ff7
+       0x0c074a20      0x09042638      0x92dd83f6      0xe4577636
+       0x6d64a8be      0x597d896c      0x2fa05214      0x4d410aee
+       0x6f3c5da8      0x611bd40f      0xfe674796      0x7b0f1129
+       0x460e765c      0x3e65fdf4      0x5069c2af      0x6d7f7ff2
+       0x2906295f      0x1541c107      0x8d7af680      0x700d4a29
+       0x4ffebd8f      0x039bddc0      0x138c2994      0x84df9bcf
+       0xe724df28      0xaadb2e86      0x8c31c7f2      0xd0b0cb77
+       0x6c98a1cf      0xaf7d74a0      0x813f01b8      0xa5d49e0e
+       0x49e7168c      0x00c8f29f      0x6ed79b2c      0x1fac71d5
+       0xaa1d3e40      0x9ccaaa99      0x49d3cfd7      0x57e8a241
+       0x2208c379      0x8a0d30b0      0x8379f733      0xc036439d
+       0xba4f760c      0xfd17d48d      0xb687eff8      0xc16cb64c
+       0x138be857      0xa7a2ba2c      0xea6bbaf8      0xa432e0b8
+       0x2923df56      0xb9b4ff80      0xe78982a5      0x8eaa1315
+       0x28492c47      0x8dad81e4      0xba11923e      0x0555126d
+       0x5bb2ec54      0x4cb99eb4      0xfcc71c59      0xd4ea57f0
+       0x96c8da30      0x08435ada      0x52062f62      0xb464f40d
+       0xf8709791      0xca08084b      0xed31fd35      0xfc33d802
+       0x7d3a3dba      0xd4cb5ded      0x1cf550db      0x3f720ee1
+       0xf0c445fc      0xc1a92738      0x4d3604d4      0x378bc2e7
+       0xf7b7dd63      0x336bdeab      0x7a778204      0x7828910e
+       0xc2874bdc      0xa3c31510      0x9ab5c466      0x4f20578f
+       0x8e73ff32      0xd0bf1bf8      0xc28d73a0      0xa39944af
+       0x061d7674      0x7ea1ce1c      0x5a3cca8f      0x1a88f2be
+       0xd88f6adc      0xccf0633d      0x30c3b802      0xdd71dee4
+       0x8ae4d351      0x0a7738bf      0xf36e848b      0x6dec785e
+       0x58988a3b      0xdbb8b887      0x18d080b2      0x58a86f9c
+       0xcae797a7      0x96b255c0      0xd9379480      0x709d26ea
+       0x9051125c      0x295d8682      0x97c2e475      0x7e5b407f
+       0x6681fdb8      0xe16c2876      0x3345a959      0x1cad6f73
+       0xef3e3ea3      0xcb3faa5a      0xd88ed048      0xe12448d9
+       0x61295bf7      0x7b420d0a      0x1d439f5a      0xb5a9b50c
+       0x8653bf6e      0xb2dc9144      0x93036dad      0xba7d6a4e
+       0x055e559e      0x9c850951      0x6d31816f      0xd54a7969
+       0x508967e7      0x6a76cd75      0x48229f7c      0xf94261fa
+       0x4f1b2c60      0x30591684      0x619f5412      0x37a573d4
+       0x27fe764b      0x7a146285      0x6c66e646      0xb1e2889b
+       0xb0be8e7c      0xf0b6cd6c      0x0f9a006f      0xb015a2c0
+       0xcd58c3d8      0x737b0710      0x5dddbeba      0xdc021827
+       0x9208233a      0x5d325f47      0x965ac3b9      0x1fe61d1c
+       0x8d7419fc      0xd483074d      0x9c58f815      0xf8dc14bf
+       0x7adbaad3      0xe9e10bf0      0x3dc02504      0xf724d248
+       0x22b0e801      0xb90d698a      0x5e5eff9a      0x9d961510
+       0x2d9cdf4f      0x5c0088e0      0x309aa90c      0xcfa57d5d
+       0xd4de3f7b      0x3338841b      0x98312bf6      0xbcf10b77
+       0xea6c7b59      0x0336eedc      0x4fd84d28      0x04e0b906
+       0x26aa6af0      0x391fea83      0x065f8c6e      0x051b9508
+       0x4caa3453      0xdecc0ddb      0xa35dcda0      0x4ddda422
+       0xdc98138f      0x46764b42      0x78affc7a      0x53a62634
+       0xa8d37797      0xc777ba1d      0x5c682b96      0x07faf56f
+       0xe50f7e2d      0xb7e94981      0x08b19a90      0x80480c0f
+       0x1466bd8e      0x3f032f83      0x7bc67f78      0xb7f5259c
+       0xf58d4330      0x7e1e3dd5      0x82fc00e1      0x35ee07dc
+       0x384acde7      0x7cf91b30      0xc220653a      0x3e472880
+       0x98b7737e      0x5a7828ed      0x3598f86b      0x65ff2395
+       0xb057dc53      0x96819f8f      0xc6f5a8da      0x46cc05e7
+       0x4e0066ee      0x1fdf6e48      0xc6cd3d59      0x991fb04f
+       0xc359fd4f      0x2d7a356c      0x382adf55      0x7ade325c
+       0x73779267      0x86c529ff      0x814cf15d      0xc5922d2a
+       0xde99fc0e      0xeeafe58c      0x96692a4f      0x3053bdfc
+       0xe5b78930      0x601e01ad      0x568a9dc4      0x67930925
+       0x019c962c      0x4b0ecfd9      0x143c6181      0x09bc4d21
+       0xcb2a7147      0x615faa33      0x5500ec44      0xfaa814f4
+       0x4fccea84      0xe3464e32      0xbfbad0b6      0xf9126b0c
+       0xc4cf5765      0xcaff573c      0x05677979      0x1ecaa748
+       0xb2e05819      0x8e2613e2      0x91d7e9d0      0x28cf5075
+       0xb1758e90      0x56f4304b      0xc3eae732      0xc6f9668e
+       0x9f6bca3a      0x917baf38      0xb2a70b37      0x8204ee82
+       0x3758fdf0      0xc9af6ab3      0xf7e210aa      0x82df501d
+       0x881462ff      0xe4108709      0xbea770b9      0x142ce156
+       0x3c3dcbf7      0x4587c97d      0x93a9beff      0x0be1a423
+       0x8ffe073c      0x5bfac5d3      0xa37dd1ee      0x4c4b28c3
+       0x6b746ebc      0xcebf1b65      0x6da9ae68      0xf6ccbd7b
+       0x87259951      0x0df484b8      0x34d02cae      0x0cf57a47
+       0xfb2626e7      0x0e4c7cbd      0x8a794c05      0xc5bc72a7
+       0x1d5f8c05      0x8f74d29b      0xdbe61ade      0x2c40bae4
+       0x52316fdc      0xacbbf330      0x24620aba      0xbd509810
+       0xac7b2062      0xce960eb8      0xeb3cb3ea      0x951a3a3b
+       0xcbe6919a      0x15121b2c      0xbe7b4001      0x4a2e857e
+       0x60005d12      0xdfcea0a2      0x04411e0d      0x519dc985
+       0xd7557722      0xf7031a53      0x8e6bd4ac      0xf7610a7a
+       0x8c3285b4      0xd0bc660b      0xc2a35cdc      0x3e6fda33
+       0xb947c465      0xb65d70c7      0xa0f0a4fd      0xd7a49801
+       0xd43eff86      0xb0ea0425      0xc11e89e0      0x1cf1cfd2
+       0xcf52abb3      0x0b877e5c      0xed0a4b93      0x60389dc6
+       0x29e5550a      0xf09bfff9      0x6de1254e      0x76dc4048
+       0xdd3ffa40      0xa3e5d68e      0x17a2ae52      0x48be8d4c
+       0xd0ab3725      0xd22c0450      0xcc67629a      0x88f454ea
+       0x107a0eef      0xce96d2c1      0xae8fbf50      0xe5fb6d09
+       0x0057065d      0xdd432ef2      0x32a1bdff      0xb2c10866
+       0x3884658b      0x1e15fcc3      0x7d2e25e9      0x80a5ba6a
+       0xd41bce41      0xda436c28      0xa8dba199      0xe788932f
+       0x47f7f0a9      0x6980522c      0xe97b47fe      0x9d9ed687
+       0x54ccb0ac      0x1524ab70      0x86e84451      0xb466ab2a
+       0xaff0031c      0x56230e36      0x662772b7      0xc3cac3b0
+       0xf3801208      0x592050d8      0xa314a00c      0x23073044
+       0xa2651660      0x5c141005      0x75c3a9ab      0x426fadea
+       0x917b94b7      0x00e4d928      0xf0022117      0x459b8638
+       0x4d252cf6      0x50f9672a      0x4ab3c6ef      0xc78ae924
+       0x811252c6      0x71359755      0x4771731a      0xb814dfb9
+       0xbc17a50d      0x21438116      0xdc97051d      0x293354c7
+       0x989e5e5b      0xf32c7b44      0x509912ef      0x00778203
+       0x761a5968      0x139bfd3f      0xfc10aa15      0x5144a561
+       0x33e2e16d      0xb6121a7f      0xa0b92381      0x429d85fe
+       0xc523496f      0xdf05031e      0x995a9d12      0xff983574
+       0xd070af21      0xf2d0d735      0xbc2ac395      0x79f3cfd5
+       0xc7cbe59c      0x15d4190e      0x8b41e26c      0x34273bf4
+       0x08a3cb05      0x0db92689      0x80fcc3d2      0x1e44d756
+       0xb2695d04      0x8fd1718c      0xdf54decf      0x31b02282
+       0x73c559f4      0x6bdf32bb      0xb02a5d71      0x27feb1bf
+       0x02a82f46      0x4dcc864e      0x4f55ffc1      0xb8d8f2e7
+       0xfbb13ff2      0xfa097c0e      0xd8644d7d      0x7062051e
+       0x4ba6fa07      0xbc929f5c      0x21b24366      0xa20fd863
+       0xbfbe4678      0x6eb43570      0x57450ff9      0xad350484
+       0xba606d11      0xb1b80485      0xaa5b6ae1      0x4fac0470
+       0x77c3c5cb      0x802418c0      0xf5d108ae      0xd2436de9
+       0xa7dc4291      0xf5bfe6dd      0x99a31c5f      0x61f481cc
+       0xe32d2ac4      0x1caeefca      0x2028329c      0x2bba53e2
+       0x1d415096      0xbbba9e95      0x6f16ee63      0x609517ed
+       0xd2bc2b95      0x0ef9e1c3      0xf4d4c78b      0xe80f7dfa
+       0xea9a2522      0x86154997      0x8c271ab3      0x607af865
+       0x82a33550      0xde348c29      0x72414485      0x332d1fcd
+       0x4f3bda6f      0x60d7bb1b      0x37591f18      0x3bb8a79c
+       0x34df8a48      0xfd353ce8      0x9b2cc1b5      0x64849bc8
+       0x42cb559d      0xbc1d0578      0x3807691b      0xfb80da40
+       0x6224c0b5      0x2504790c      0x9ac5d31b      0x162a24fa
+       0x4b242775      0xe67afa85      0xf3f6f5f8      0x619aefb7
+       0xad5a1909      0xbe9cfeab      0xb19e8ff7      0x1778c7cc
+       0x9b72f14e      0x5a232673      0xccfa7f0e      0xcedfa0c2
+       0xa53b8a1c      0x0507bfe2      0x006a7e79      0x55e1a874
+       0x2c6f2145      0x302f5ed2      0xf8eb1829      0xe9113acf
+       0x7ed4acf6      0x8d120045      0x83d7777f      0x18806b1d
+       0xe39cbc73      0x0e458dc4      0xd1dc4355      0xa917f91f
+       0x06bd5adf      0x6700644c      0xfafedd5d      0x68597623
+       0x85998d31      0xf0fde105      0xbb59f732      0xfa90c9a5
+       0x77fd2cd7      0x58fac067      0xd1b0c8b4      0x477377ac
+       0x077d7a62      0x2ef1f7b4      0x5aec6414      0xaf19d978
+       0x78d46a78      0xfa173873      0x3181df8c      0xbb8d5af7
+       0x561d830a      0x45e3c2ab      0xc729929c      0x3705eda5
+       0x38a1ba3d      0xfceaeaa7      0xd9df7473      0x09129efd
+       0x51d1c610      0x61287d3e      0x466b1c40      0xfafa9019
+       0xba016f71      0x93f0fd44      0xf5f6dc97      0xfdbb8fa9
+       0x869f225a      0xf375e880      0xcf69a3ff      0x4e6dd47c
+       0x8b50ad80      0x76c6393c      0xc79c197a      0xf07f7fe9
+       0xd5f7def2      0x9753c9c4      0x583359a7      0xed786492
+       0x29c5ae36      0xffc244d5      0xbc59624c      0xe5272a4c
+       0x9cf42a99      0x47ef2f4f      0x26ffd2ab      0x20ed6804
+       0x6162d8f7      0xb5b41cbe      0xddbe5795      0xafa94d09
+       0x2a98c884      0x36a36cfd      0x4f3d1939      0x83310078
+       0x86defdfe      0xc6aa6db2      0x1fe02291      0x6a7ccc2b
+       0x31b28d66      0x50be72aa      0x511dd793      0x65aed937
+       0x1c0f78fa      0x955f24b6      0x182ae927      0x341c2a39
+       0x1684910a      0xfba7553c      0x7e684210      0x466c4bb9
+       0x776df978      0xe20a9283      0x1d59ccb0      0x12cdeb81
+       0x07ed0938      0x90ae4179      0xcd380d07      0x203b2f9b
+       0xae16b51f      0xc35acff4      0xcdacfed1      0x93690501
+       0x1ddcac8e      0x28508191      0x7cf2dbce      0xed9da43f
+       0x927b0860      0x91ccd0e6      0x0bf7dfe1      0xdc7d9ba0
+       0x79a68763      0x9ef7572a      0x06165514      0x5799b51f
+       0x633c76ba      0x9dd549bc      0x71ec2b95      0xff02fec3
+       0xef70992f      0x837f108a      0x6c2145b2      0xcbd64dc3
+       0x1c76ad74      0x0ec92535      0x3f44281d      0xe7906f31
+       0x8f58019e      0x6f563cb0      0x2b02143e      0x0dc40ea6
+       0xf46b09e7      0x8594fc54      0x9db830e2      0x6689da9b
+       0x5d1729e4      0xe621d473      0x8f8829f8      0x1712d3a5
+       0x8c5032d4      0xb36b8a2b      0xa08173a8      0xc719ca8a
+       0x7437c799      0x08e991fd      0x22bdaa06      0x2d91e2f5
+       0x85e1d68a      0xa610f97d      0x651efa62      0x346116e1
+       0x78fa57e7      0x60a80baa      0xcc94cd1c      0xffdc8330
+       0x669a8391      0x4c49cf5f      0xa28ec5b1      0x59d01240
+       0x7b508f7a      0xcccfc915      0x306ac46c      0xbcb39059
+       0xe90411da      0x505fb85b      0x66354da9      0x956c672b
+       0xe2bc6473      0xd5a8ca2c      0x4e15c962      0x30b76eb2
+       0x5df03137      0xe8fbd420      0x867bac76      0x209ec951
+       0xd4c709a2      0xd865c07e      0x23e244d2      0xb3b45618
+       0x5b02b3f8      0x292f0be8      0x67e5681d      0xe9002734
+       0x650021dd      0xc596ea6e      0x300d4231      0xe6df79a1
+       0x3412adea      0x64e19360      0x19e70926      0xe912da63
+       0xbfa60dac      0xe194a62b      0x818fecbc      0x2209d4f5
+       0x56072a4f      0x8ac44d25      0xb2a6f22c      0xd9a720cd
+       0x0c7d37fd      0x28edcb42      0xfcbce7a7      0x31c5300d
+       0x7b7a16ef      0x987e720d      0x4c226bd6      0x8dcebb8c
+       0xeb01942e      0xa1eb5733      0xf888063d      0x4528ec12
+       0xe5085215      0x1dd01b03      0x6eb87865      0x5f8e7363
+       0x37035578      0x3fa2dba3      0x7ed02de4      0x01d3fc19
+       0xc6a841d0      0xe656cc11      0xddfe564c      0x97af79f9
+       0x2edb1cf9      0x8f5fb166      0x8bb807e4      0xac601010
+       0x3b465d78      0x33ae7ec5      0x9b669db5      0xe3ef2d8c
+       0xfaf2eec2      0xfcb39916      0xabe03aa5      0xa145f2fa
+       0xdf35974b      0x73be668d      0x79a5ebc1      0xa53d89a0
+       0x754988d4      0x687f673d      0x7a479719      0xda3b853d
+       0x68f03ecc      0x6e6b0e44      0x740ed419      0x8fa9de3f
+       0x4ff58f61      0x8a5cf063      0xb0226c8b      0x8a9cfb91
+       0x5c9e6a52      0x75b6ad55      0x3f2c089a      0xdb7b23ca
+       0x68844595      0x258c4964      0x6253c527      0xe3e6b34d
+       0x5daa8920      0x849ccc19      0xa17fe037      0x700b8a74
+       0xb4eabdfb      0x73b1dcba      0xa349bd25      0x57de9e42
+       0xf1909e9e      0x95885ef3      0x9d395f5f      0xa38e326d
+       0xca3f1ec3      0xf3708445      0x64de4b31      0x9cc93d9e
+       0xfb69603a      0xd987080f      0xb8baa0f0      0xec3f33ee
+       0xdfd52d67      0xedba3a6d      0x2a4f8cab      0x6e2dbeea
+       0x12d24ed2      0x098bb00b      0xbb7f66d3      0xac78a277
+       0x78018918      0xc582c790      0x4d3ef0d0      0xb46bc302
+       0x2a70e09e      0xd0f7b22c      0x33ba2cbb      0x8b712476
+       0x321d99a5      0x49891850      0x3d95aebd      0xcbb8ad7a
+       0x1fc7cfef      0x30b0af9c      0x3670cfb0      0xbdbc245d
+       0x2fa63a41      0xaaf27d47      0xdbb39c6b      0xd77f37c3
+       0x0e07267a      0x5d3d8758      0xb49ad992      0xdb66d32f
+       0x48e3d291      0x3a05086b      0x5917ca45      0xb6bf4644
+       0x977d7e89      0xd8b7e404      0x7bd674c9      0x422ffff3
+       0xdb431079      0x461eb2d1      0xb62f4fb2      0xf83f1852
+       0x62c1af99      0xcb254f3e      0x801148b8      0xa98845a4
+       0xa8838d10      0xd18389e9      0x64f0a8d5      0x456b72d2
+       0x3cb4db66      0xb478700d      0x40133906      0x01477df4
+       0x99714186      0x82b0f95f      0xfb59e846      0x780a0734
+       0x0ab15793      0x5c7054f0      0xa88d1048      0xf038bc7a
+       0x6c79d43c      0x70f1dec3      0xf6c18788      0xd9071d93
+       0x02ec302e      0xe1102ac2      0x48f7f323      0xa8ac18f9
+       0xe580dcf5      0x8d3adc67      0x419577d6      0xa2b2cd7c
+       0xb8564eca      0xde3975cf      0xefd084b6      0x7a3fcf92
+       0x93bb391a      0xa283dde8      0xef590884      0xd1322fce
+       0xc9af1c92      0x5677501d      0xabe661c3      0x77faf3cc
+       0xb63fa4f3      0x72eb0ce8      0x0e7364f3      0x474a4498
+       0x1c33fa72      0x7caf20e0      0xa06d582c      0x5d730c23
+       0xa853bf9f      0x89d46b32      0x95032652      0x82bee6b9
+       0x71dfd466      0xc2f1475a      0xee3b8ae9      0xa4b97940
+       0x745369c8      0x848c968b      0x80b11fe7      0x9640d4bb
+       0xccb129ba      0xcd0ef642      0xb418253c      0x91b51140
+       0xddb1eade      0x4a9d5b6c      0x0f655c9d      0x9cf66310
+       0xad184851      0x811264e7      0xeb80b2d3      0xdc9400a5
+       0x5c0be6fc      0x4f4c3128      0xf1478880      0x0aa6d75d
+       0xaae40d65      0x1283ae73      0x93eb915f      0x17739d76
+       0xd2bc76c4      0xc4c80b26      0x5c491d34      0x885b5d22
+       0xe2bf7486      0xcec80dbb      0xb8fd71c4      0xeaa133d0
+       0xb44306af      0x975bb919      0x9add2d65      0x6de21027
+       0xbcd9c28a      0x74aec7f9      0x75f6bb9c      0x5ca8ffa1
+       0x9189bc76      0x22e7f05c      0x14f56912      0x72ccf25e
+       0xd2067b68      0x3d1f11aa      0x4717271a      0xd9d5d193
+       0x3e2fe4cb      0x3bb466ab      0x9965fa51      0x172edc9b
+       0xdade7440      0x0f6a748b      0x993413f0      0x0c1812d3
+       0xc02cd79e      0x1f791c39      0xe189ef04      0xeb61e49f
+       0x0ba3d9b0      0xa776a292      0x371aae0c      0x0250cd7c
+       0xf41758e4      0x8b8ef384      0x71b28bec      0x620e9b36
+       0x120ac178      0x6f8a854f      0x1471a913      0xa069fc61
+       0x9c4513b5      0x7c776851      0x1aca6979      0x8d31f3b6
+       0xf254b3e2      0xab44b76e      0x0112ff65      0x40eaa69d
+       0xea0a2ed1      0xefcb2a4b      0xaebb74bc      0xfbc17af5
+       0x03b74d58      0x3995bd99      0xe9f8ae4c      0xa0b5884c
+       0xea69fe56      0x58edbf35      0xd0eea61a      0x2ad90dba
+       0x118e2310      0x07218c60      0x8280e78b      0xe2afb938
+       0x6bd3d541      0x0d305da7      0xc846e977      0x7aba7e7e
+       0xcd4f2676      0x9292007c      0x739e4f6b      0x1e8d3ac1
+       0xd42503ab      0x15f01dc9      0x572a6c4c      0x66535cd6
+       0xcf9ce218      0x7dafcfe3      0xfb21c85a      0x85374429
+       0x85307f2b      0xe1358f44      0xa742f5ac      0x0c4c3c91
+       0x9143061a      0x24657578      0x5028f7d2      0x1a388256
+       0x78bb6dfe      0x2e6f427a      0x32b3debe      0x65c48f0d
+       0x1ead8389      0xd7c29256      0x0af9ab7f      0x8e78121d
+       0x6500ad8e      0x7a38798c      0xa785e9d2      0xd8b0487f
+       0xf06af944      0x55599828      0x416fa4ea      0x4a2438a2
+       0x92da4518      0xecf9cc97      0xa4c2102b      0x547005a4
+       0xa812d78e      0x346ecff4      0xc62b5671      0xa40fbced
+       0x9fd7d46c      0x4dd8d8db      0x20baae36      0xd80ef524
+       0x3a2454aa      0xdaaa7d0f      0xd2ecaa28      0xa20628ee
+       0x30267d78      0x575d527d      0x747fe51e      0xa4842d47
+       0x31b71ee5      0xf8f23f34      0x35f963fc      0x8f9ceb93
+       0x52473b8c      0x4774804f      0xff4e9655      0xb5bbc63f
+       0xadff0741      0xc07b443c      0xebe1961f      0xf9598ca5
+       0x42352c37      0x369ac508      0x8d822d15      0x4d3e72b8
+       0xfbfab060      0x62cbec96      0x5bdd24a2      0xa7a199cc
+       0x738d6954      0x0eab5c0e      0x556e3147      0x7da855d4
+       0xf253d1d8      0x9e69b00e      0x8753ce4b      0x162218c3
+       0x533ddb08      0x1ee47916      0x37d4be4a      0x9752b0c8
+       0x5c287bec      0x6d6b42eb      0xb8e72496      0x85caad93
+       0x77191373      0xc54b5b9a      0x415c96b6      0xc5bbe4c0
+       0x0751c53b      0xb352d2fd      0xf00bc102      0xcd84f522
+       0x8447660c      0x62c3103b      0x27f36752      0x31b0e45a
+       0xe4cd3555      0x90904327      0x88f68b9d      0xaa342e7a
+       0xdbb54fa3      0xb871056a      0x3c4519a8      0x7953beeb
+       0xf36e2f4d      0xd1a82d4d      0xbc028565      0xd5720d91
+       0xdaaa9362      0xadea675b      0x9d07c8f6      0x9ae45c5b
+       0xa3cbe112      0xf7d58045      0xca9b35d5      0x8f5bf9c7
+       0x40bc3c9a      0xfedbc773      0xc916d4bf      0x7de7c9c9
+       0xe398edc1      0x33339071      0xd8d088a5      0x34cedc7f
+       0xe693824e      0x664ac04b      0xd3d86f85      0x8495e903
+       0x0b7820b1      0x93cd84d4      0x73850311      0x6cc916c6
+       0xb6b39ac7      0xf3abca13      0x3d01cd83      0x3a235796
+       0xc4ecde4a      0x8954413b      0x1223b62b      0x4117c02f
+       0xf4440a54      0xbd8c4c26      0x4422eddd      0x0dfe468c
+       0xaa2ac23a      0x776747e8      0x31cc43d0      0xff1bc38d
+       0xf7aa3359      0x90a68203      0xba162ac5      0xe5fb1d70
+       0x0d7fa055      0x7d230950      0x0e555bea      0xf2c8e634
+       0xce03f163      0x9841b4e6      0x55893013      0x56bf9792
+       0xd62c89b2      0xf1b4447b      0x53ff76f4      0x39f94c2e
+       0xe90cb414      0x22af74cd      0x5222553d      0x706afb99
+       0x86b32a7a      0x83b54903      0x972d00e8      0x08a8cc23
+       0x0e0b5dd7      0x4a23c583      0x777758d5      0x6b33509d
+       0x915bf8b1      0xa818c224      0x5b38ac0d      0x1d3917fe
+       0xf305d3fb      0x5c8a2f21      0xc3d42f61      0xaaa6a53d
+       0xb7fef5a3      0x3aa1d7dd      0x8e93db45      0x221d653c
+       0x12697f37      0x0e0b1e1e      0x48154723      0xac62a1e0
+       0x019fe7a1      0x36cd456b      0xf2ca6528      0x040f4928
+       0x6770a838      0x60a12ecb      0x548560ef      0xe31cef90
+       0xdaffb967      0xc12d714b      0xca9e5b33      0x22944355
+       0x09e705af      0x2d1b7a0a      0x9097cd6e      0xb2e9bfe7
+       0xd640dbf7      0x14a44e97      0xb54347f1      0xa7a3e4e3
+       0x08cb77b8      0xb53e473f      0xf803036a      0xddd720de
+       0x85e5b1d3      0x321c8b53      0xf9a645ec      0xc19fc693
+       0xd181890e      0xac6e6a5b      0x028b1f6e      0x718bf5ff
+       0x2068c47d      0xea1ee003      0x24e5e6ff      0x0395ce67
+       0x501472e3      0xcdbcaea8      0x7143f0c4      0x963473f1
+       0xc2d32a61      0x25b77183      0x926f7391      0xc1b9bec2
+       0x235ecbfe      0xce2bfd3f      0xf94c3482      0x7556dba4
+       0x20b958fb      0x7696cbba      0xbdfffd80      0x931d15a7
+       0x27899680      0x8843c47a      0x9b8bbe63      0x63d2844f
+       0xb2c965af      0xd8bed411      0x5251f3ce      0xcc9a2b98
+       0x333624f4      0x674b8921      0x630d672c      0x3c211d4c
+       0xd3651499      0x5b6102f6      0x71de73cc      0x62cb38ac
+       0x0b8ef96d      0x7c211efb      0x462d7fe4      0xfa427451
+       0x3f0793b0      0xef1d32b1      0x75a6c7a4      0xb6d312d2
+       0x8882bdc4      0x4cb44a2b      0x6c2dcc86      0xba3bee30
+       0xe49d8fcf      0x6a6f6e85      0x4bad2807      0x0a90f701
+       0x3bf0d0ef      0xf39c2c70      0x24c13f7b      0x32f91421
+       0xdd86a8e5      0x5bd98912      0x296192b6      0x0a3161e6
+       0x6c4bb90c      0x09074da3      0x844f7a00      0x43ea9d82
+       0x261918ba      0x90a25580      0x427ea834      0x0a9b2df4
+       0xcae515eb      0x86909d3b      0xd09ec51a      0xa437a800
+       0xb3e2c472      0x1fffbee0      0xc287d852      0x90e69648
+       0xed4af77a      0xc7863fae      0x09ccbc07      0x1e0dae50
+       0x4dfdb2ee      0x63c8bfbc      0x6e3c4be2      0x0eba65bd
+       0x2d3020f1      0x4185d9cf      0xfd307d41      0x38f281de
+       0x3f52929a      0x45e7fc34      0x41b70485      0x46994292
+       0x616183d0      0x4e97cdf4      0xcb0d3573      0x88ab95f8
+       0x580d3343      0x2d899c19      0x934c2c83      0x996eb67c
+       0x93af7041      0x76eff4ae      0x306bf9f6      0xf0583bbc
+       0x2950854a      0x8cb6985d      0x0dbbaa35      0x94752d5a
+       0xa960b2a2      0x99e7eeaf      0x04103312      0xc86ce32b
+       0xd7328adc      0x455cb9ec      0x9c3a8b8b      0xb9570f3a
+       0xb44e6dff      0x63a0e324      0x08ff5a24      0xfebbd317
+       0x4d2d2250      0x35ba9a14      0x7f036830      0x0b5b47a6
+       0x15613fcb      0x77773e65      0x13dd43a3      0x17dbf143
+       0xddde6126      0x5e5eb3f8      0x4c227240      0x741246b4
+       0x433fb072      0xbb816f4a      0xc2aadc5d      0xe099a124
+       0xccbb1ae3      0xf6925d81      0x05bf98e3      0xe85ada2d
+       0xb9d3cbb4      0xce98bffc      0xff1345ca      0x7c911c00
+       0xcca8a7e7      0xf1bddf15      0x909e4cff      0xcf9e807e
+       0x5158e784      0x1d277247      0xd04da5e2      0xf273e0cf
+       0x7807707f      0xddc68a60      0xd19ce0a3      0xbff8416b
+       0x1d8b4b63      0x7c0973f0      0x686fe206      0xd341d352
+       0x1357f0cc      0x65b8ec3d      0xaf10451e      0x65792664
+       0x6a2e7fd0      0x30e52919      0xd3d8334a      0xaa126b88
+       0x03618083      0x66861d88      0xc9a6f447      0xa38f931c
+       0xb6c81114      0x05ba6529      0xfc24abd6      0xcf965251
+       0x3f2d6d3f      0x899d7122      0xa267e82e      0x86bc523c
+       0xdc287579      0x41323ce6      0x8674328b      0xde39514b
+       0xb73080ee      0x46db8f86      0x236d455f      0x948e8b31
+       0xc617f609      0x8407e4d8      0x58898c23      0xaa0fee77
+       0xe208a647      0xfe93943d      0x6142bee3      0xa5ee20ba
+       0xba71945a      0x5d1319c3      0x2cde8323      0xddff5e23
+       0x2938e99b      0x57781e69      0x65f18537      0x59d3813c
+       0x612dcc67      0x8221186a      0x74346a0f      0xf9b5e8b2
+       0x51a8a89f      0x3f719660      0x27e0a4ad      0xe1f53c48
+       0x75071497      0xd89258c6      0x5df36dae      0xb088d1fc
+       0x617d59d9      0xf6b02c55      0xf481cf7c      0x930ec40c
+       0x840d9d72      0x324d28f2      0x866396ed      0x8c7008f3
+       0xbe6562c5      0x6541389d      0x29032124      0x4a4b1bfb
+       0x939ab296      0xaa3420db      0x51586947      0xc8080583
+       0x74a53a76      0x3969c752      0xc316993a      0xc1865a5a
+       0x4e2dff5c      0xd9e640b3      0x8afd0055      0x2df0df5b
+       0x50399e64      0xbda466e8      0xd393eba2      0x64501f82
+       0xb2170330      0x6905ca9c      0x9545875b      0x2a716bf4
+       0x3d84fb86      0xfc6eb3fa      0xa3f19240      0x3fa1b1aa
+       0x38a26342      0x36cc1a64      0xa9ea4a6f      0xfe1221f1
+       0x0d2c0874      0xd039600f      0x4733ee63      0x779b9d0f
+       0x1f6d5ba1      0xadce4232      0x7ef1d927      0xc7f50ab9
+       0x1803224e      0x735ad0ca      0xf90ce6ee      0x43fafcd2
+       0x5d18f867      0x8baede71      0x06b19914      0x4a2afb9c
+       0x4361cbfc      0xe4fe48ab      0x2a30bb42      0x8d1793e9
+       0xd2d2272e      0x93a2495b      0x30c3aa6d      0xf61d2d61
+       0x9d03a325      0x1212f8ae      0x04d3d802      0xcdf17fb4
+       0x1a2c3f53      0x631e5918      0xdd5da4ad      0x2049edd5
+       0x4cf33d66      0x69fe3c6a      0x09fb25ea      0x14038f9c
+       0xf35f8fc6      0xae85bf48      0x4f66dcdd      0x36a38ef4
+       0xda7f166f      0x7a480d5e      0x2ee96e00      0x62aeacd6
+       0x7db7afc1      0xef452e08      0x35fc1947      0x267c71c2
+       0x32cd85cc      0x47fa693c      0x1c4451cf      0x69aa65f8
+       0x892bc9f7      0x0ef79729      0x7341568f      0x0b097c7e
+       0xba49383f      0x971c9a86      0xf087b5b8      0xd6633391
+       0x13ae6f8b      0x4ac59d4c      0x3bf66d77      0x2c44ef5c
+       0x46affdff      0x5d31ca59      0xb839227c      0xf17d0ab2
+       0x61828055      0xe8627dba      0x86741273      0x3ce25788
+       0xf93b9718      0xf607e235      0xc81960b0      0x09c83c2b
+       0xa6dd7a55      0xbb442bc7      0x40996c51      0x79618023
+       0x3baeb067      0x016145c6      0x35c74dd4      0x87eb8f72
+       0x2533565b      0x6c677920      0xe98959b0      0x740600ce
+       0xd3276f05      0x9cb59940      0x48206ccb      0x42d91f21
+       0xd3fad546      0x2fd7bd71      0x4d0ceb21      0x2cf4bdb9
+       0x49b7eb2c      0x1491b3d2      0x1d32a4aa      0xed8eddfc
+       0xc46a4109      0x0ff7904a      0xa3fa1477      0x4b541901
+       0x6d17d28e      0xc9f5e6ec      0x550f9aa9      0x5be73ffd
+       0x527aa7a8      0x3dec2fbc      0x06f4e253      0x280c4970
+       0x5b252fc0      0x28c7a99e      0x6be0ade3      0xc912fb59
+       0x6df2b558      0x1e7115ee      0x0d3674d0      0x73982cb9
+       0xd5130d14      0x95d2eb94      0x90e824c3      0xae63dd69
+       0xdc1cc2f6      0x6f625222      0xb56650dc      0xa0804801
+       0x83de64cf      0x300ee3a5      0xe61d6b08      0x8af407be
+       0x2e3b5458      0x13d5d61c      0x96b97c27      0x3ff2b138
+       0xf55f15fb      0x05367ca9      0x2dfe48d3      0xd475a775
+       0x8adcddf6      0x08a87984      0xb9d8db95      0x4c64dc69
+       0x7678e5c4      0x3f787436      0xe77f3c9c      0x51ead76b
+       0x08a0a17c      0x38c26de9      0x393f7667      0x019e26fa
+       0xdc18902e      0x8464c93c      0x9b2159d6      0x7bc83716
+       0x02473747      0x22760f8f      0xba56250a      0x69d8b7f9
+       0xcaef54f8      0x3ab04f04      0xb5d69ead      0xb557222c
+       0x89d7407e      0xa2023064      0x9b12df4a      0x6e6e6282
+       0x1e2c01a8      0x1f32ecc2      0x15b8d009      0xbcce68dc
+       0xa73b44b5      0x67c5fa56      0x77b9a68e      0xdb309031
+       0x89fd86c9      0xb5cf0533      0xb9767bc4      0x13706941
+       0x6a371170      0x75c6b2d8      0x1a793e9e      0xa384a62b
+       0xf2f10dc9      0x443d44f5      0xe50121d7      0x91427c16
+       0xce395518      0x319a79a2      0x2f4ddc05      0x03e6038b
+       0x84c351ad      0xdb75f333      0x16fe4d23      0xe069473e
+       0xec11fee7      0xa6fbaa35      0x95562e11      0x00073ff6
+       0x3a9cdaa4      0x5dddbdd4      0x6e811efb      0x245067f3
+       0x2175c41d      0x1a2c9570      0xcfdcac6a      0x6d7f4003
+       0x756539d9      0x286e393f      0x7296856c      0x0298c64e
+       0x40583fe6      0xf56c48cb      0x79906451      0x69878ad7
+       0xc89360d8      0xf41521a1      0x5468606b      0xf2ac0952
+       0x05c2aaf8      0x0c281f8a      0x926d08d5      0x66500ebf
+       0x8766c806      0x44940d66      0x24598745      0x2c751d18
+       0xa1295019      0x2f5a4797      0x8f74a4a1      0x1d8f0938
+       0x79cf29c9      0x6ed43a8b      0xa39f1716      0xef8d551d
+       0x20396951      0x96b039cd      0x73c90ee0      0x3be74718
+       0x3c6d6915      0x0d2bae34      0x115a48ce      0x7ae08b90
+       0x75333b3d      0x2b1f77c4      0xaa2b4e8c      0x01771e17
+       0xbdb3b763      0x53490c21      0xc413efe8      0x77eaef46
+       0xbf241246      0x68b80f5a      0x68daeca9      0xda0d8421
+       0x4d93cff8      0x8312ba53      0x59d221d7      0xdd9f993e
+       0xe153d55a      0x5465c8a3      0x512cf45e      0x09817be4
+       0xd9180ad3      0x3878720c      0x63cf7022      0xcf9a9000
+       0xede3792e      0x09047d82      0x86a35e16      0x6a51c408
+       0x99b14cfe      0x798b41c8      0x1014c9dd      0x99437aee
+       0x43a41b04      0xc417b87e      0xe58fb27c      0x732b2e2d
+       0x5d181e1e      0x69614981      0xdcdb6d12      0x4c2c4094
+       0x2c134d4e      0x757b0752      0x14c8337a      0x8a63b65b
+       0x767b11f1      0xe4597e9f      0x8d2f8046      0x5c71a95c
+       0x07d458c5      0xfa490cac      0x19ad3653      0x38ebb812
+       0x879f6091      0xa4b06da4      0x97d530ac      0x493cef7a
+       0x34472438      0x2f7bc03c      0x7a0e971c      0x4de4c4da
+       0x722567a1      0xeefaa9dd      0x0ff4289f      0x78ee158e
+       0xb74dc660      0xe43d44cc      0x37fdf8ac      0xf0aa80cb
+       0xc9bc302b      0x62bc2b14      0xe05400d1      0x50d9b3d1
+       0xb2fa1a08      0x3319310e      0x1423ed01      0x9d21ffc8
+       0x96b302f5      0x44e14bbe      0x48139d6f      0x00469f63
+       0x1fc9e79a      0xe53dfe55      0x6e5fd22f      0xba9db817
+       0xf06bd8fb      0x368e5fe3      0x57e1d023      0xbf2b7331
+       0xe645dbb6      0xc3e9e1e4      0x33d992b5      0x71820083
+       0x141a3f11      0x75bf460e      0xaf3940fe      0xba6a1b70
+       0x1904207a      0xb9a59626      0x01c0e10a      0x3c799256
+       0xe2f0a070      0xe49873c9      0x043f19a6      0xea15fa4c
+       0x3914389c      0x5759106c      0xe8ef98ce      0xd48114b8
+       0x998a8829      0xe2526434      0xc00f2cce      0x2077cbf7
+       0xf44b9744      0x69693d18      0xb16a0880      0xf1fdd3f3
+       0x32c3f731      0xa499472e      0x67dc721c      0x1d798259
+       0x48d7a406      0xb8ccc13c      0x2ef181bf      0xb8ae2873
+       0x47eded1d      0x29165bd0      0xd018f6a0      0x370fe96b
+       0x9aeba42e      0xc070e6fb      0x7a65c9d1      0x4787b944
+       0x873dd192      0x42c37903      0x12e9769a      0xe2678bab
+       0xa6e3929b      0x265c037b      0xd7261fe0      0xbb6c295b
+       0x9b833704      0xb2355808      0x5d56f79e      0x79f654a4
+       0xcc125216      0x01908561      0x9b320df4      0x548c4f88
+       0x7110e20e      0x0517f94d      0x03c2d0c8      0xba351956
+       0x4275f6ed      0xe9c9d940      0xd680828e      0xef4d4fc8
+       0xb0b32bd2      0xc6ccafd8      0xf696004a      0x4fdd7879
+       0xfeb1fcb0      0x9385422b      0x3c2b9dd9      0x8cf18b07
+       0x62748860      0x5bcb9e8c      0x899a2937      0xf9f501ae
+       0x186eb5a0      0x959a3714      0xa400f6e3      0x5c27eab4
+       0x50b42e84      0x51a7121d      0x94ea1f42      0x083edb1b
+       0x9aa9ffcb      0x4d93db79      0x5a50e2cd      0xdad2b9aa
+       0xdfc1993d      0xac0ef252      0x3ebea017      0xde8adcf4
+       0xb83bb50e      0x8be07c3e      0x43e22441      0x2e4ffe0f
+       0xacaea888      0xa96b1ae3      0x29b05f78      0xda38c661
+       0x9e1c1c98      0x3be89982      0x686eeb2f      0x52ac0e93
+       0xc13ef398      0xf6114090      0x72d74a13      0x0e4c5162
+       0x412e4801      0x5664bb09      0xab8eff3e      0xb29a5ee1
+       0xca4a0709      0x0c20eebe      0xbd266fc0      0x15ca28da
+       0x80a96d8c      0xfef90527      0xaaa85e1a      0xcc457c17
+       0x25dc38b8      0x8ce9769f      0xbf255314      0xc8400177
+       0x089fa961      0xbd232721      0x53ca8254      0x5469aad2
+       0x0bf328e3      0xfbc9cff3      0x9cbd2560      0x59083d00
+       0x263b476c      0x2034b217      0x7b1b96df      0x71e2b5b5
+       0x739b6488      0xf868f2ce      0xb4c2e558      0x2363c171
+       0x66d12327      0x48055332      0x247b62c7      0xb9e86728
+       0x71797ee9      0x9233b437      0xfdbab962      0x226ebe50
+       0x3c646aae      0xccc66200      0xe2279855      0x54bd9796
+       0xbc41d857      0x19b80e89      0x6d69a007      0x41e31450
+       0x72688b6c      0xdb1d95f4      0xd3de621b      0xfae7e454
+       0xc82d6c6e      0xd3a34aab      0x8d31bf7d      0x1e1baae7
+       0xe554cea4      0xc1fe98b5      0x43e83432      0xb393a1f2
+       0xff64dd99      0x0a798857      0x4d9508eb      0x6d5e520a
+       0x5c028b0b      0x846461aa      0xd9d910ff      0xdc45a169
+       0xfd6c7b05      0x39dfe286      0x48fea115      0xda5c22a3
+       0x06df1f67      0x295c426b      0x2f57643a      0xab317e96
+       0x5a97e35c      0xc35c99ea      0x616daed6      0x4a5a7e5b
+       0x86db9179      0x2e31bebf      0x67c1bfd4      0xab70ad35
+       0xc23d6e89      0xb86cd4af      0x96f15490      0xb4926f42
+       0xd8eb2b04      0x36865b27      0x1bebc0a3      0xd320bb6a
+       0xdb3d99ca      0x67f1eac7      0xf00cbfd9      0x88ff5de1
+       0x9d6761b4      0x58c9665b      0xcf208f37      0x2e72850a
+       0x75d6a311      0x1d9f6cbf      0x1ff2c8b7      0x0ac4974b
+       0x9ffddb15      0x844da134      0x4385f83d      0xef3d5636
+       0x1c46e418      0x282b5a69      0x33c19be1      0xbea4ca0c
+       0x3430e6da      0x27bd1cbd      0x24f53db7      0xe7de5573
+       0xb9df0cc8      0xd3608acf      0x3461d906      0xb98954e1
+       0x4d17c0d3      0x6ff05d1f      0x4ffbd387      0xcc418845
+       0x52691ea6      0x9fc82771      0xa0d4fe96      0xb246d371
+       0x0c925598      0xd4f9c6e5      0x089c436d      0x462488b4
+       0xc66bf983      0x80710b31      0xdcdd92ee      0x9b23344e
+       0x893534fc      0x9b0958b2      0x2d972b53      0xc903891b
+       0x5d3fa8f2      0xfad9f3da      0x025fceb2      0x0936f5c9
+       0x22c60c28      0x022cbb55      0xbf64b03e      0xa2741a40
+       0xc39839c1      0x689957f9      0x55016547      0x980be48c
+       0x32f79347      0xc3b007c6      0x14b02b4d      0xaa7abdef
+       0xbeef96bc      0xcac44a9e      0xd189581e      0x64c1678a
+       0x842f7725      0x899ecd96      0xe6bd35af      0x9ff16743
+       0xf9810444      0x937d2dcb      0xeef3745c      0x463d697d
+       0xa9177296      0x922606ad      0xc589e4e6      0x7fce85f5
+       0x0e282c9c      0x45772b2f      0x4f9e4ad1      0x1d8c18d3
+       0xf6b7cecf      0x39f252a5      0x7a6517a9      0x43b531a7
+       0xa1b70c15      0x4890149d      0xb77b41c6      0xc6273a81
+       0x31fee2e3      0x5574b062      0x9030ac68      0x08be1c87
+       0x7a28470c      0xb5d77506      0xbeb246aa      0x4ccfb5e2
+       0x73cc0f3a      0x061ba338      0xb02c2910      0xd2cb7dc6
+       0xb5fcb59c      0xfffb7494      0xcc1fb080      0x038da62a
+       0x6f1e9c33      0x10c160b2      0xf92f9e46      0xe88e325c
+       0x707a443c      0x4483717c      0x1bc3a65f      0x9cd36553
+       0x0dce8fa5      0x6949cd99      0x27764ea5      0xf9aedd67
+       0x3cf14fc5      0x4e7b2b8a      0x1648e477      0xe9ab5d58
+       0x9a01ef8a      0xe4bb6451      0x4826c42e      0x429e43b9
+       0x9ea26a2b      0x2a04324b      0x1b52a414      0x7b0e6263
+       0xbdbaa603      0x6de2bd68      0x6e3f1ec1      0x58c33715
+       0x125f33ef      0xb71d200f      0xd16aa410      0x2556e9e0
+       0xc195b12b      0x8cc60255      0xae797629      0xabfc8c32
+       0x3eb521a6      0x92e7c9c1      0xe2448157      0x9f6f8a7f
+       0x731eb492      0x2712ae7d      0x89609926      0x0687a6a2
+       0xe7f628c3      0x4f65157c      0x7d7b305d      0x841d3626
+       0x391c386c      0x3e3a9d1f      0xabcd68c6      0xfd0cd231
+       0x39c1e3db      0xfada45e3      0xd5b6d1aa      0x18fe646c
+       0xf742a96d      0x74d26ac6      0x8467351c      0xafef9c1c
+       0x7ff9d24f      0x51b28bf5      0x239ec2ac      0x648bd90e
+       0x184f5241      0xd5173b0c      0x99f9e0e4      0x2ef7a3c2
+       0x4631836f      0xe363f943      0x4daac20e      0x7e332266
+       0x34474b72      0xfee7f6cd      0xa861b458      0x2b390bc5
+       0xf33c2713      0x58bac7ab      0xfa560247      0x4444434a
+       0xd183c11a      0x8b397b13      0x5f42ef20      0x5a7bb80d
+       0x535492f8      0x1e3c479d      0x22af7d02      0x9ced1d00
+       0x20509deb      0x287059b3      0xbf620a20      0xda7d4d23
+       0xb628f464      0xb205b5de      0x3df7d96e      0x05a1d1d8
+       0x68881dbe      0xb2f37cb8      0x3542778e      0x866b8e2e
+       0x3d3c6243      0xfdbb75fd      0x398aa395      0x065b5e04
+       0xbb8517b6      0xd9b51782      0x99bac363      0xf3166a18
+       0x7c7fccca      0x1dc86d20      0xc7ca3c16      0xa328650f
+       0x5ae266c7      0x893f5e21      0xf5b33e6d      0x42d75218
+       0x7f70aec1      0xbdbf56a4      0xdca9dee3      0xaca87462
+       0xab03ee81      0x9cb3170e      0xd047dc9a      0xf1a33dc2
+       0x765ed8ef      0xbe7db712      0x8d24efc4      0x4f94db8f
+       0x8e9054cd      0x5f130d0a      0x393884c3      0x9fa1aba2
+       0x5d208022      0xff5dd2ab      0x10f2ff7b      0x031b14d9
+       0xc42ecf87      0x9d8c51c5      0x93c53e6a      0xd950dc97
+       0xca85f453      0x9e6167df      0x3d4b38e4      0x25334dc4
+       0x7b2def4d      0xd88dd7ba      0xbc4c0164      0x1f8a45ab
+       0xf2849ce8      0xb4afb52b      0x6994aa4f      0xa48811a6
+       0xe59c8535      0x98e0459d      0x96baf624      0x49ef84f0
+       0xc729f178      0x9690406e      0x91d494c3      0x7ad4b29d
+       0x957735a3      0x44ff4c6c      0xa64673ba      0xf20e8b54
+       0x62ae6437      0x3b8a767d      0x7187a2c8      0x5322dd0a
+       0x2ed99b7e      0xb43e8e63      0x29abb7e7      0x41fc0edf
+       0x62312c07      0xb310bbb5      0x8ebcab75      0xce246520
+       0x38a3fcd5      0x2f9f0fb7      0xbc26a8b4      0xf1e90186
+       0xb15c7de2      0x1178ab54      0xd5f76c38      0xe971da6d
+       0x13556df7      0x61ce53a4      0x5b6c0704      0x2bae03c1
+       0xe82fa850      0x8a6ab6fa      0x0ed05fc1      0x835927ac
+       0x3849db78      0xcff4dfde      0x9804cd75      0x697f18a2
+       0xbe604bef      0xc202738c      0xf2e8a4a5      0x8b6361d5
+       0x0469300a      0xf89bf5c0      0xa9fdc209      0x2439fc79
+       0xbda566aa      0x6b02ebf4      0x7daaeeca      0x5e845429
+       0x79a52787      0x76c18921      0xf2157580      0x0e51c37a
+       0x34f1e505      0xbef79b43      0x60f589c6      0x31d9e178
+       0x66d77003      0xe2596de7      0x324531b5      0x9b08836b
+       0x29d7b288      0xd66a8661      0xf99bf376      0x830d4e97
+       0x43d19589      0x501f49ed      0x282a1103      0x6fc3f1e2
+       0x17000117      0xd423646f      0xfd6d45d4      0x7c5eeb84
+       0xc478e828      0xf8cbe08d      0x7cd41d18      0x74987bb3
+       0x351c2305      0x703e9a90      0xda95a103      0x4675977b
+       0x964c6719      0xc83f01a6      0xdf5816df      0x0711073d
+       0xad788488      0xa2bef75c      0xd1bc3134      0x31e1ae80
+       0xe47cd8dc      0xd6e997ac      0xbc64037b      0x6b693af3
+       0x3e28d3f5      0xaa60b35a      0x6ddf3034      0x89cafc81
+       0xeee00cf9      0x35298933      0x8b85e3ae      0x4e1ed6ad
+       0x95c9a627      0x4cc27068      0x8c9a4667      0xab9984f2
+       0x1be75381      0xea018e83      0xde3e9771      0xbd91f6b6
+       0xc1ca440b      0x8384a0ce      0x531c3ee1      0x42d9a41c
+       0x21cf18ec      0xba39f43f      0x9c6189e1      0x77134ca0
+       0x1c6c9d89      0xea999a2b      0xdbdb0bb3      0x8f90e331
+       0xbcac15df      0xa5e1ce4c      0x41872886      0xa134dc47
+       0xe7b2e5fe      0xa60ea19b      0x0c242c64      0x1ee241cb
+       0xe357a99e      0x4f169427      0xeeef270a      0x0a97b188
+       0xe901a495      0xce68f434      0x87412b2b      0xb2797d07
+       0x8453a00c      0xdf6a4506      0xb69b478a      0x760e3aeb
+       0x6a450b2c      0xf29ce4d0      0x33b9b409      0x59dfb002
+       0xa1885e8b      0x114c2cd6      0x4946c941      0x6aef1d0f
+       0x09f2eb78      0x0230e56a      0x14fa9652      0x71ceac31
+       0xf149957e      0x0c7fc978      0x3c4de046      0xcfaf111f
+       0x8e806a58      0x90f589d7      0xadc9cfd5      0x76c98405
+       0x45267b7a      0xf23080ed      0xfee4b22d      0x235c9d68
+       0x61cddf25      0x94b24dbf      0x707b12de      0x039ddadd
+       0x6d8ced8c      0x74a9aa61      0x55bd5d4b      0x0001267d
+       0xc6bd2165      0xa8580393      0xa21380af      0x86f57fac
+       0xdf225e98      0xed4a8bde      0x278ba930      0xdb0eb6f9
+       0xd546baa4      0xa0d0eddf      0x3700d0ea      0x8623fbf0
+       0xb5de4159      0xcd987abd      0xcdbb7d42      0xda51a7d7
+       0xa2ed5b76      0x7fa8d049      0x0ff9cfb6      0xfe741c53
+       0xe67ca66d      0xf87c80d6      0x0e338d5f      0x2816ab54
+       0x9bb5111e      0x5908c471      0xc929d548      0x2e09a3b9
+       0xcf996e71      0xb3feb32c      0xa6a3ded8      0xf1de159e
+       0x8e7912c2      0x9117ea62      0x8a2bc677      0x62019360
+       0x0a37c87a      0x68f7d20b      0xb20a6392      0x08dfd29e
+       0xd1754a6f      0xf4e9b799      0xe8cb4097      0xea12996f
+       0x4ee6b302      0x6b2222ed      0xc48f1def      0xae0ec530
+       0x3f7dd4c3      0x9c0c89ff      0x10e5a030      0x3a7fe7d5
+       0x591a1887      0xb896a6d4      0x5eebe287      0xcc6a2931
+       0xf93a3d12      0xfd0c973a      0xd3ed2395      0x8856712e
+       0x2dd3d153      0x71604f81      0x6d43dcae      0xfbd5a60a
+       0xd3642cf8      0xcef67e72      0xf92679c5      0x5978a0df
+       0x31e52d4c      0x2c99afd3      0xae5508e4      0xd80a2026
+       0x9f8c2e26      0xca5678b0      0xd4457ed3      0x40eacefb
+       0x30159f2e      0x787719fe      0x77bd38ae      0xc0c959b3
+       0xa8fcdf83      0xeb2f35a0      0x12c3679f      0x0e6cdb49
+       0xf4c2c1b2      0xec3cc30f      0x15393130      0x28666bfe
+       0xb0280fb4      0x5e731016      0x87fc6fd6      0xd6ed815c
+       0x5102dc55      0x01d1457f      0x42c20f03      0xc97c799f
+       0x0898c8a8      0x236c74ab      0x59007c31      0x8671d1e6
+       0x687d10c2      0x90596194      0x88737c04      0x6ba246ec
+       0x9fd21a96      0xb31a0e22      0x06760d52      0x46376c4c
+       0xd0377d10      0x27f327a6      0x7172371d      0x3278d768
+       0xd5e4a4aa      0x9496b184      0xe1598e55      0x79b81601
+       0x5e6504f7      0x65953db2      0x827e535b      0x2a9845b0
+       0x0ebd585d      0x34fda4d3      0x9aa5f56d      0xc604a643
+       0x04667d2e      0xdfaa3144      0x8b697070      0x1071b6e4
+       0x59a62213      0x0aad9262      0xdd85a2c1      0xe78158c6
+       0x5e597679      0xafc95247      0x8562ac76      0xbe724287
+       0x95df26b1      0x631f95b8      0x4b273544      0xfe4c8205
+       0xfcd0b2a3      0x6a648810      0xcd00fbc0      0x6d7ae7de
+       0xc55dc711      0xd2c54140      0x7205328d      0x61149749
+       0xa18ca6cb      0x465cd12e      0x4256c600      0x78e3994c
+       0xa08f0d5e      0xeadfda4b      0x4144bef7      0xc2bbe8c8
+       0xf9727a45      0x45aaff8c      0xdf55ff6a      0x1679e624
+       0x08a0a4c9      0x3d850fe9      0x935371e3      0x4c8ee65a
+       0x87489f22      0x922bc4d5      0x2a79234d      0xd3f4b9bc
+       0x0428dc1e      0x0b56cf51      0x832be5e6      0xbebc05c6
+       0x46a0229f      0xc096889e      0xc1eb7dbd      0x60583e8a
+       0xbc916869      0x84f334dd      0xd1cd949a      0xd0b60e81
+       0x14dc9282      0xc3260066      0x6bca5262      0xed65da4b
+       0xf4afac17      0x20d3708e      0xd570d02a      0x0a5c4624
+       0x458553e3      0x080670bb      0xaac9fe22      0x29635d29
+       0x984543c4      0xaa46fab8      0x88f51422      0x7b0c922b
+       0xe03f8571      0x253065be      0x7eae75ea      0xe0ad3531
+       0x6e39a2d2      0x5e20398d      0x44c6eca8      0x5a99ce6c
+       0x4bf0652a      0x1d87158f      0x5fa6ee5a      0x0d1ecef1
+       0x9aeac19d      0x1291e54f      0x4ef5e8fe      0x201568c2
+       0xac928887      0xdb213ab7      0xa5b23ca0      0x7aa36dc1
+       0x9f459a01      0x6925051f      0x51166d69      0x17391074
+       0x5f4dac0c      0x3c65c5ed      0x82410dd3      0x11dc9554
+       0xc2ff2440      0xd145f7aa      0x88c580dd      0x2d665fe5
+       0x8b459149      0xa6a3d63c      0x8119542c      0xe4ea4830
+       0xc943ee11      0x11c81007      0x8b192b2b      0xe111fadf
+       0xbf24f2bd      0x85688f72      0x395060e6      0x9a6183c5
+       0x8f2c9397      0x7428bd10      0x81fbcc32      0x95e477cf
+       0x6f7aca36      0xbfb729be      0x5692929c      0x55fec4fb
+       0x2b7238f6      0x745c622d      0x7c306fc7      0x3aae5f89
+       0x527ee3c7      0x124adeaa      0x3ef2a62a      0xf3d1f3a1
+       0x1e29a164      0xf2fd7fed      0x779f38d6      0x9d781240
+       0xb114b838      0x5acfbd0a      0x603db973      0xdb26d966
+       0x2bb6d838      0x38808300      0x9968a93d      0x2d3b7a2a
+       0x0b87310b      0xe1075e16      0xf99fbda9      0x26c80868
+       0x4b3a0e16      0x489a041d      0x93fe522e      0x2f3d9f35
+       0x65fcac62      0x784a79cd      0xf659ee00      0xc7115cee
+       0xddb43dba      0xf7417c81      0x18bb0b76      0x4a65ed21
+       0xd449cf4c      0xadef0ca2      0x8df488bf      0xa45ed893
+       0x786074f0      0x63c8c85b      0x9ba06767      0xf91d6c4c
+       0x8c296e0b      0x3e713400      0xf08a1a8a      0x3f85bcb0
+       0x13a9a240      0x4af2097c      0x31e8c19d      0x8a5632ac
+       0x4a7f3a01      0x27b33fbd      0x3eb57a1f      0xc41a9f9e
+       0xb02e9d8b      0x3cd5c551      0x344459d0      0x82208b42
+       0x7b5080a8      0x7297da72      0xcf099c27      0x7e9d8f08
+       0xff89d997      0xcf4aadd2      0xbca31063      0x6e776ddc
+       0x86887a48      0xd1e14c52      0x477a5c1e      0xad4c813f
+       0xee8ee579      0xac0ef345      0xa2ca0189      0x9f3d2890
+       0x551d307a      0xbe1186ff      0x47ec9093      0x282a217f
+       0xb69a904f      0xc039cb02      0x6275b24a      0x198e63d7
+       0x581315e8      0xe06273a1      0x83435257      0xd88f5344
+       0xd0c09528      0xbcfd89ac      0xd10aeaac      0x7f40cafd
+       0x6ee9d7e2      0x71c661c6      0xf43585a7      0xe77b33a6
+       0x6459076f      0xfaa6bdb6      0xc094c451      0xda9581d5
+       0xc4fb8bbc      0x279b815e      0x2ad06a46      0x85f16193
+       0x157e2cd9      0x60603d40      0xbfebba5e      0x8f5602aa
+       0xa99b67c9      0xc14940a5      0x63e5b0b8      0xdade3f40
+       0xfea0e352      0xa838d4ca      0xfd49f7d4      0x411e92b6
+       0xa59ecabf      0x56f5cd99      0x38464815      0x134d4834
+       0xac5b045c      0x313225de      0x09f9d422      0xf13b59ba
+       0x90c6e2b1      0x033cc601      0x05212579      0x50650085
+       0x3e1ed885      0xfb55cf1a      0x514c188f      0x862d6542
+       0x87b0a8ca      0x0dbbe2bf      0x1f062bd5      0xb9db5921
+       0xb3956060      0xe1011253      0x02ba0715      0xb712d976
+       0xa56effba      0xecfea4cd      0x998a8fa2      0xbac2040c
+       0x78f810cd      0xf49cdded      0x1b1ecbf9      0xa39324e8
+       0xc9c9d170      0xdbdf031d      0xffa22fd2      0x228fb0f7
+       0xdeebbdcd      0x2ab87788      0x7733aad7      0xa0903ccb
+       0xdfbe960c      0x4fb66a32      0xc4116a1a      0xf6f6fcb8
+       0x34607f80      0x3fa5d765      0xeeb7d3ee      0x9e82916d
+       0xec558818      0x57c1b40e      0xbcd7b5ee      0x41284e1a
+       0xe4fcffa0      0xbe6994b4      0x081bc597      0xbfd2ae67
+       0xdd3d45a3      0x8597efb1      0x1e32ed7f      0x916a2b59
+       0xd9bfea8d      0x817c52c9      0x8e69978f      0x3260c8e1
+       0x2e68361b      0x77121ca5      0x379afc8d      0x566f84df
+       0xd671bed4      0x963ebea5      0x9e13a13e      0x149226b1
+       0x54dc3e91      0x9d9d88f9      0xecf40a88      0xd11588d1
+       0xdf1ce683      0x0a4c034a      0x0c0288e0      0x95d27196
+       0xb70fcddd      0x390c6608      0x932c30fe      0x1421b40b
+       0x3e6a8f12      0x720c37b4      0x131f84b0      0x9366cee0
+       0xbeb1e54e      0xcb87807c      0x6eb511cf      0x51327e74
+       0x9a14428e      0x7f85f990      0x32b49454      0x35e54147
+       0x56485202      0x6098b209      0x47adf064      0x56e6b38c
+       0x248bc21f      0xb4fb0248      0xb119ecd1      0x4adc92f9
+       0x14121b5e      0x7960a2c6      0x5becea6b      0x4ada0b2f
+       0x1392c419      0xc867fe0a      0x6d0a0ea3      0xb1693186
+       0xd5f8c08f      0x5aef27b1      0x0a4cc1cc      0xa908727a
+       0x479c6cee      0x8a2166ec      0x5004c1ae      0x5be28a85
+       0x58345dc2      0x582fab3b      0xeb588d86      0x5ded5c7b
+       0x62de5ee4      0xde399717      0x7eb71367      0x6711ca46
+       0x25a067f1      0x4189d51d      0x8136cfa8      0x3fb2a63b
+       0xa93bd63b      0x31ded695      0x138b4c19      0x7b3e3321
+       0x00f85c16      0x99c9ad46      0x9c61c855      0xb590bd91
+       0x9fe86d17      0xda40a5e2      0x8d6d5468      0x13390dee
+       0xf9e04dfb      0xc1081395      0x2b9764a3      0x2002f0b5
+       0xb8fb1a86      0x3a17ac03      0x63adfa9e      0x56070ed8
+       0x70913109      0x506154ec      0xfc97e231      0x14e97084
+       0x847acb88      0xdda65a5d      0x8852793f      0x3340d3a0
+       0x178d6cb5      0xf88a3a72      0x2bd6cc4e      0x627bcc10
+       0x2d84b6fd      0x8a4e0d9a      0x79e1656c      0xd5688a96
+       0x339bdf6d      0x4cd371fb      0x0be9c919      0x3edbfa5c
+       0x3b9ff9e8      0xc011e66b      0xeb07abe0      0xd957cf0b
+       0x4b9b59ed      0x185df1d1      0x5b359154      0x0eafe888
+       0x7a9ec4e4      0xad73fb84      0xbe680eed      0xab6bb5e3
+       0x2fe7f672      0x12917f24      0xdf2f06bf      0xf2f15066
+       0x653d7392      0x448f4958      0xc57b3616      0x7554c753
+       0x477f344d      0x53cb815e      0x92432979      0x995f7c5b
+       0xd444613d      0xbfc375a0      0xa558b193      0xb9a04fa7
+       0x5dc44f73      0xd2794e11      0x67afd4db      0x2f33a486
+       0x9f494f9b      0x4dbd615d      0x51467f59      0x4f8ade7d
+       0x7d690d61      0xfc4e4cf0      0xd445fa4f      0x52a1963c
+       0x976ba746      0x031ea65b      0x5c510fc7      0x6a6ecb39
+       0x07341321      0xb2231470      0xa8c53448      0x398e6423
+       0xf6ad9f7d      0xa0960bef      0x9d10e113      0xe492c051
+       0x1fdbad33      0x5b5a5221      0x81e84600      0xc3960bd9
+       0x670b29f0      0x6dcf1584      0x902b6b4d      0xd8d57f9e
+       0x350a633a      0x60a76401      0x0ad8d075      0x819237de
+       0x51a49f68      0x2e731581      0x36466063      0xbb6e0ae2
+       0x842c2b84      0xd55e6c15      0x76db4240      0xd532b2c2
+       0x88ee2b09      0x960820a1      0x12c128f9      0x50eb2d48
+       0xd0899ebe      0x9aab2e87      0x431c5f0f      0xf0ad6572
+       0x170d8286      0x3141f694      0xc599df60      0x88c369fe
+       0xb185106f      0x19ddbb39      0x05abf400      0xa8c6e8af
+       0x5c7c37c7      0x538e2704      0x7ff774e5      0x2a525d31
+       0x5e86c8e1      0x6f1cab4d      0x9432754a      0xb31e7345
+       0xda8c0ebe      0xde1e8f4e      0x22b8a5c7      0x2d43845c
+       0xbc44ff6e      0x5a6a9f74      0x9245eb1c      0x05cf9997
+       0xd9e54326      0x93c04441      0x89b64c83      0xd3c9502c
+       0x1d77b35c      0x20c37f3a      0xf5ec242a      0x594235ad
+       0x62445010      0xd43e4b0f      0x9945420e      0xe8808c53
+       0xc4ec3486      0xccac8e69      0x85b742d9      0x05d14091
+       0xd35044b1      0xe71d1900      0x721d137e      0xdf0b24d6
+       0xc75b8cde      0xf7228766      0x2787c27a      0xf6810632
+       0x4d326f1b      0x8ea69f7c      0x7013ae81      0xec071128
+       0xa2ce8886      0x527c6e4b      0x7b792611      0x992426ce
+       0xaa8bf49b      0xde77f138      0x675dcb46      0x81df02b8
+       0xee38dbd7      0x82699815      0xe8e97881      0xc3c7dfbc
+       0x080bdcfa      0x57e97143      0x728e27c8      0x773a7186
+       0x617b8e48      0xe3bbdd6e      0x8aa36f10      0x39b5b9d3
+       0x43949cbc      0x18ced620      0x4cbd3a25      0x7413db27
+       0xd8f38237      0x60d8f30c      0x96174aa1      0x9d6e3762
+       0x45e86e75      0x9302858d      0x02929f0c      0xcee92d8b
+       0xe444d794      0x1850664b      0xa6f133c7      0xcdb7228c
+       0x5f7e1457      0x2e906b98      0x3669d3b7      0x96152f85
+       0x68683995      0xead5a65e      0xa3097397      0xbea543f4
+       0xe7bdb225      0x42af47cb      0x75391ced      0xb23e26aa
+       0x631443b4      0x9682298b      0x68b78e0c      0xa5b0c501
+       0x30f14a74      0x11b5b8cc      0x124cc79d      0x0755ece8
+       0x694730a1      0x8edba746      0xecb345bc      0x15e6c073
+       0xb682ceaa      0xe9bbd0e5      0x035f0b8f      0xaa0df5e3
+       0x14f09fad      0xc4716593      0xf5dad2b5      0x9e10b4da
+       0x4386da92      0x7f990a4b      0x3eae9576      0xd00677d7
+       0xc1d62609      0x5a01f3ce      0x3b155993      0xbc8a7f57
+       0x4c7682f7      0x99c0bbf6      0x8ed9484d      0x802ac94b
+       0xa67555b4      0x2004f6d6      0xe2082653      0xf44548f1
+       0x09ac6801      0x6dca2a9a      0x6e4cbab5      0x815c7887
+       0xbd79cff4      0xd88bbed5      0xb2f01ea0      0x159847ca
+       0x947e16eb      0xaf80fc20      0xc7628ccd      0x7a8ae02d
+       0xbf0ce15f      0x1290de82      0xe81e202e      0xe7d8a3b4
+       0x8b905ca3      0x26627404      0x3ae0ac3b      0x0c6073da
+       0xc12450b0      0xcb79a7f0      0x8bd5ea61      0xfe47b334
+       0x7cfd9de8      0x74c89bb6      0x71f383ec      0x8661ad30
+       0xb4b63123      0xebc613b5      0x15fff519      0x442bb4d9
+       0xad59c517      0xc7ab8e33      0x0cbc7901      0x41199274
+       0x45f306cf      0x3ad61c62      0x9e912bf6      0x44114ad6
+       0x191d1ec2      0x2eccc397      0x905b1a54      0x8d8919c6
+       0x4e87bac9      0xabd4a7a2      0x5b6b3993      0x0f6f18ee
+       0xa7fe213f      0xd74bcde6      0x3d3f0482      0xb85a10e0
+       0xa0e0b08e      0x5e9ecece      0xc2930a83      0x7595604d
+       0x1cec8002      0x84b4c720      0x3033d9e3      0xc3cd9b62
+       0x56ee9e9a      0x58aad2dc      0x535ca0b1      0xf5eef580
+       0x280e12e4      0x1cf53a6b      0x4b63d5e5      0xfea73389
+       0xe8aa9aac      0x29bdcb44      0xb408cc52      0xf1385801
+       0x0de3b337      0xae8fd591      0x32f6469f      0x077d0b03
+       0x5103a792      0xe6c861fe      0x5647e012      0x70ccc977
+       0xcf32790e      0xf7fadf72      0x3770019e      0xb02dddda
+       0xdda4f5e6      0x0b0d5e4b      0x26843a72      0x47ee4965
+       0x1603077e      0xcc06f743      0x4d7748df      0x31c908ad
+       0x3c19b991      0xb490ff50      0xacf9b2ba      0x37205591
+       0x55db532c      0x75813338      0x5eb0a0c3      0x5f3e45e1
+       0xd0d2ed2a      0x66886d7c      0x41e716e6      0xf3507079
+       0xe734772e      0xe39dd270      0x4fcc1c4a      0xa957f121
+       0x4ba2c853      0xf4570af9      0x52424fa8      0x95ca0993
+       0x0f905db2      0xee96d160      0x85b6b8a2      0x8b1301b1
+       0xecffef26      0xe1b87fb4      0x968bea1b      0xdad2c510
+       0xd175726b      0x34a828d8      0x8310584b      0xdfca6d9a
+       0x3b73628d      0x49fae2bc      0x55550fe1      0xa3a7df7f
+       0x51210aea      0x6aa351cd      0x7b0f31f3      0xe1256629
+       0x6669d296      0x50552e01      0xfc9593be      0xae90a4a3
+       0x86225932      0x5fbe2f37      0x5befb997      0xd2f71acf
+       0x2bc86954      0x60246751      0x727c9ac9      0x3ddb54ba
+       0x80941a52      0x40a3a81c      0xca3000f4      0x9baf3d5e
+       0x773bb476      0x023572b8      0x2e84af85      0xf666f7ba
+       0x1743896b      0x073930d9      0x004acd2a      0x717d9896
+       0x7d354494      0x999a492e      0x8eb4bbc3      0xf4b5d775
+       0xc6e70e22      0xad2cfeca      0xa6cf04b1      0x8f9bc1f2
+       0x09ba4743      0xc00425cb      0xfc02322d      0x5bc27d0e
+       0xc77103ee      0xe12f5df9      0xa805e67e      0xc2b05c95
+       0xb6cf2316      0x3ca44583      0x5fae6582      0x01129109
+       0x2fb7b0ea      0x5b5a180a      0x9f94d616      0x90671f22
+       0xd84c534e      0x14815deb      0x222b7be5      0xe4fb51ed
+       0x73511682      0x752efee0      0x61ffb0c6      0x892412a4
+       0xa20138e7      0x769f4a0c      0xc56a3237      0x72f5249d
+       0xeb04b59d      0x6d286aba      0x53f9fe15      0xc0505c34
+       0xc99cd600      0xdd3e61c8      0xaf3366e8      0x47ce1fe7
+       0x068546a2      0x0bd4e6e9      0x0ff92967      0xc7e87eca
+       0x65bfde25      0xe3692b7f      0xacbc4d7e      0xf0d81fa2
+       0x2943a25b      0xce0feb3b      0x0b4d2f35      0x1ce4f67e
+       0x297478ea      0xe4df25c4      0xc38fd905      0x7cc95c7e
+       0xb430cdd7      0x1e3438da      0xf2ad2634      0x36e68548
+       0x04b5db72      0x8792e32f      0xf54a6f45      0x2af52be7
+       0x3c023453      0x2dd259c3      0xb2a684a1      0xd7c3c833
+       0xfd471eb1      0x8fbf3928      0x4a5c71f2      0x4f2d58fa
+       0xa024508e      0xb36d7589      0x6d553d5f      0x33181e8e
+       0xc8b0fb4f      0x85ba3b03      0xbc209589      0xdb081c6f
+       0x34d215c0      0x08be5c71      0xc1e0292e      0x76836c13
+       0x2ddbaae1      0x5df4c244      0xec448d6c      0xf7c641b2
+       0x2a5e53fd      0x66112ece      0x8da6d580      0x856de3d3
+       0x6c1e473f      0xbfc60f19      0x2f144016      0xf6c55199
+       0xe89642fd      0x6777f35a      0x5d1acb6b      0x6691b481
+       0x528dd544      0x1411f2a2      0x2adcae8f      0x8c740190
+       0xc6773d78      0xee996a7f      0x96d58502      0x72bd466b
+       0x9cc4335f      0x0203bea8      0x1885d52f      0xdad7b494
+       0x60b41e2c      0x3312c32b      0xbe2908fb      0xf69f2dd2
+       0x484f658f      0xe48093d1      0xba75cd97      0x7e657376
+       0xf1c92b0b      0x2be471eb      0x24f62fff      0xb99282ca
+       0x3d7b5783      0x2513d204      0xea884d02      0x458f0cf1
+       0x7e40f424      0x658a7a85      0x581b11ac      0x5bb5fc34
+       0x1fcd272f      0xaa3972d6      0x9a1f8079      0xc59af67f
+       0x7a827fc2      0xf472c0a1      0x84914900      0x3fd551c8
+       0xa38a1f95      0x860a3b77      0xd00b08ad      0x08e5277d
+       0x7a8c26ea      0x47b0a735      0xa1e99cd1      0xce1bc648
+       0xbe1c41d4      0x66f6d2d4      0x4275938f      0x2fee7589
+       0x707be4d1      0xaee4bd13      0x24c6345c      0xdbc54f29
+       0x7efecbc4      0x0bf2230d      0xbb8cb923      0x27d2cdb2
+       0x5e2a0541      0x35ab1727      0x98875039      0x35438620
+       0xaa9c49ab      0x426114b9      0x84c40696      0x3cb66935
+       0x431c4fd8      0x588f2dbb      0x092a0fcd      0x548185ae
+       0xf23eb2b0      0x188b6f02      0xe9651fb2      0x1d0f74f0
+       0xfc7f570b      0x180f1646      0x9f718a58      0x7401d5f7
+       0x0aff98a9      0x4eaccf59      0xbca42e90      0x35d321db
+       0x594b693c      0x818d9a17      0xbded7192      0xa9c1ea87
+       0xd47e9a1d      0x9beea5ee      0x4e2fee03      0xc166ad28
+       0xe55fc422      0x93a14122      0x010d35d4      0xe781c8cf
+       0xc4aa6471      0xa8b96e7b      0x14dd565d      0x2dd9a026
+       0x22d8075d      0x876a7c93      0x83694f2b      0x06c7eff1
+       0x24acb7bb      0x2deb19c1      0xd4ba9956      0x2e806677
+       0xba566fe0      0x81cd6103      0x246f9f68      0xe6113763
+       0x804aeb1a      0x2173e433      0xc505dce2      0xf9319b55
+       0x41fca4ff      0xf0714f4a      0x1a15e070      0x5db9c70b
+       0xf34db1c8      0x183d533a      0x3d6c0f22      0x0f76ca0b
+       0xd9039430      0x62ac91f6      0x2499efa5      0xf4ff76a5
+       0x858aab83      0x9e986655      0x1cc8ff10      0xe8d4ce19
+       0x0d8e2de3      0xa6cfcf48      0x181df14e      0x89a52eb4
+       0x6816adb9      0xa2b66717      0x41b0fa96      0xfbe1edb7
+       0xad668573      0x6d67820e      0x91cbf5ab      0xd1b9fc33
+       0xeb331d5d      0xcf7628a3      0xfee9a9b8      0x66ab2d8a
+       0xb672b6cd      0xad58e906      0xb4a39452      0x6f92f95f
+       0x6cdb843a      0x56401c71      0x19f4aee9      0x57d76653
+       0x5afa2e82      0x3ef7cdd8      0x296f5209      0xdecd3cdf
+       0xc3951f94      0xe38326eb      0x25472f3c      0xbb5dce4c
+       0x2ce8210c      0x9e5fc4aa      0x7f3fca3b      0xa5f17340
+       0x44887cb4      0x8f5c6f26      0x55b54a21      0x988f1a27
+       0x419be353      0xc535835b      0xfa904fc4      0x5de08b6a
+       0xbcaeb6d9      0x705147a1      0xfb30755d      0x9fd7be17
+       0x92724e90      0xbb3f29cf      0xc7ef74f8      0xfbc2c998
+       0x71ad2c3c      0x87143833      0xa1187339      0xf660197f
+       0xea84662b      0x67ea863b      0x70c34e51      0xcedb2bf6
+       0x52cc9f7e      0x2ac9e77d      0x94eb7648      0xc8f6aaab
+       0xef5186e7      0x3c4ceb87      0x2ca11ea4      0xd7c8540f
+       0x4109e17a      0x45c3bd71      0x44554ebc      0x345ae1e6
+       0xd8780f5a      0xc451138b      0x0bc2a7f4      0x6c412554
+       0xa7fe4f95      0xe607cae1      0xda1d4ad4      0x6db5340f
+       0xff64ebc4      0x55534be0      0x0bfc0c92      0x60601125
+       0x95cb006b      0xe3be4649      0xa5e140f6      0x37fc9f93
+       0xac38f0b9      0x0f6dad8b      0xe923c34a      0xb8ea4ad2
+       0x6e654e52      0x2d08fc87      0x03cbb421      0xef78a443
+       0x1b85fb58      0x7b3b36a9      0x18d7272f      0x28c34d93
+       0x20383e57      0x27b58dd8      0xb551f954      0x55e1f411
+       0xab483488      0x93e07e94      0x2e2a16fc      0x12d9e06a
+       0x832c23c2      0x278cb7d5      0xb8e22e64      0x8394ef0e
+       0x17ac0ceb      0x64931c52      0x077fe430      0x68002c2c
+       0x27e18e68      0x45cc9e1f      0x4c49ec24      0x2980d740
+       0x80a7c5c1      0x2b50eedb      0xbfd64ed9      0xf81983bd
+       0xb678a219      0x1e5092b1      0x3dd6d628      0x19360275
+       0x7de6641a      0xfa7cf7cb      0x98f62648      0xe688ae51
+       0x018e7dc9      0x6a61f236      0x41f4b242      0xa495d0ef
+       0xd4a94da6      0x106f1641      0x017cc5b7      0xe89f8bc0
+       0x573153f1      0xc985e3ff      0xd0fdc851      0x7dc62089
+       0xf8ea9ee2      0x9fe1ea26      0x8c54a7f1      0xcb8069c5
+       0x54a86dbc      0xbf7a66e0      0x999c1285      0xaf2c2d4b
+       0x0c6cf2b4      0xb4465271      0x846f28d6      0xeeded0f7
+       0x6c43c6b0      0x703fdcbf      0x49c6db1a      0x78e69e7b
+       0x542c298b      0x08b5b873      0xcf72235b      0xbdd9ae81
+       0x69e1e6d3      0x5e9aaf66      0xece06ce0      0xcc525e97
+       0x787f9a51      0x45121369      0x26147ba2      0xced126d6
+       0x455777a9      0xb9064788      0x7ab26d13      0xb74a9aed
+       0x82dd23f0      0x410eebbf      0x73cf78f7      0xf29953c7
+       0x427b0421      0x2c6d40e1      0x546375ec      0xad8165ee
+       0xb29484e0      0x96a2531e      0x46712333      0xebb63bf2
+       0xa9823123      0x1b72caff      0x7947bef3      0x57051ad6
+       0x3b936c87      0x80dacfc3      0x5ee40eac      0x0a229d01
+       0x865767ff      0x8e12afa8      0x7b285d32      0x0ee31093
+       0x3168bdd1      0xdd837dc4      0x58eacde3      0xc55084b3
+       0x51ec771f      0x23006e9e      0x5c4c767b      0x908cd8ae
+       0x722cadb0      0xcb9304b0      0xec60d811      0xcdae744e
+       0x81cd4855      0x10ae6f5e      0xaefcea80      0x67f222bc
+       0x30d0cc5b      0xbd1e2c25      0xd3b32426      0x43a2be34
+       0xb002f12c      0xe9f73775      0xf5c9c2bf      0x739327c3
+       0x2a7242e3      0x33bb27c4      0x2b7889c9      0xe342346a
+       0x7acf80b8      0xda71648f      0xdb2cbd46      0xe16371a2
+       0xede2cebc      0x7b589198      0x44e86d55      0x7bbffe83
+       0xc83a3f65      0xcc901957      0x5ae5e6ca      0x23de3c09
+       0x67aa277d      0xf1b63e69      0x85b99976      0x7a2ac4e7
+       0x92b79fad      0x0d0a5277      0xddf4e562      0x46b66691
+       0x6b1de610      0x263ca0b3      0xfb1e0f84      0x8f6fd83a
+       0x6b3c2b45      0xe49ad81d      0x9885d8d4      0xf7746c4b
+       0xfd84f3ab      0xc11a0bf4      0x4a828a3b      0x1e2e9b16
+       0x1deba99a      0x18483669      0xb1e4f415      0x8ecfe51d
+       0x3ecb9cc6      0x4e02175b      0x67e5c08f      0x6b5c6263
+       0x8cebe442      0x8f3ff29f      0xb0813c4c      0x4bb7aaca
+       0x1db39f19      0x9dd02910      0xe1f8a066      0xf7e56073
+       0x6b86d18d      0xeb54eba8      0xeb0b8cab      0xeb7c9438
+       0xe9a8c30e      0x7eb57257      0x53f8c8f8      0x4f9c89ef
+       0x4443fc93      0x2813d51d      0xa58cf82f      0x75757120
+       0xed4fee21      0x98eec7a9      0xeef67a47      0x3ae2111b
+       0xbd391d55      0x67ca7ab7      0x404aff85      0x121f4671
+       0xd8f6b365      0x36e7062e      0x215299f3      0xcf4fbef8
+       0x1543e277      0xcb33df8a      0xda484268      0x9c494e61
+       0x572d9b53      0x58abe627      0x7fe97f1f      0x028ca45b
+       0x7c7dfacd      0xb51f1eaa      0x7e98a7ec      0xe832234c
+       0x71deb341      0xc9e060f1      0xbe9f875c      0x354a853f
+       0xf26b00ef      0xe6c87730      0x7eec122b      0xa9892426
+       0x87918b08      0xc9946396      0x173115a1      0xf51ea146
+       0x03b077ed      0x2a264d65      0xe01f4cc7      0x5e171457
+       0xcbe5c3f7      0x95f6d140      0x326c8c47      0x9e6caae3
+       0x18f5b4f6      0xdcd5c464      0x9eafb305      0x6e4c2aba
+       0xc39392fb      0x57100051      0x2130483e      0xe08ba409
+       0x7da42422      0xabafe0fb      0x9200f115      0x3e7322c0
+       0x13e9fc90      0xe376444d      0xd68fa418      0x5583d5bc
+       0xa852a3db      0x05197d2f      0x8345e9e2      0xc1f0982a
+       0xebf67593      0x198eedd0      0xc8b5c671      0x85293c86
+       0x0b50b9dc      0x31e2d510      0xb626cbd6      0xc83d16f1
+       0x2c07b32e      0x4984ddf0      0xebb19417      0x817f99b3
+       0xb4eafbe3      0xd0026855      0x6db93d14      0x009f298b
+       0xd306be84      0x8abbe023      0x81b60efa      0x049be80a
+       0x07401a52      0x4203bc93      0x0785562c      0xc01ab373
+       0xd8da3195      0x28ecd4a4      0xfca10ada      0x17712048
+       0x69553628      0xc7724f43      0x0dc923cd      0x172558d2
+       0x752abeba      0x7bd7ffeb      0xc3ed6971      0xb0cf358b
+       0x404d896b      0x4612dd1b      0xccaedd36      0x2638e06f
+       0x928d3af3      0xc71eb9d9      0x023a73c3      0x8d103c49
+       0x2d995e18      0xfa00c44e      0x44913889      0x0e876063
+       0xb54f63b1      0x4d082825      0x89d834c5      0x0fe4a8d9
+       0x0e85b58f      0x3f99f925      0x765883e5      0xbcc43dca
+       0x4ee291f5      0x35b74dcf      0x027571f0      0xa0c5295a
+       0x0c68069c      0xc7327b3c      0x4cc45fed      0x1f472e12
+       0x2a63026b      0x4c4c17c1      0x9fa86708      0xe9c38a3c
+       0xce8e9812      0x2b604fa5      0x38d5d1dc      0xe91846a5
+       0x5747aed5      0x591f15ed      0x0fb619bb      0xd39f6bb5
+       0xbc53e945      0xa02f3949      0x06b27e95      0xa23c46e7
+       0x0d8362f8      0xfb6877fd      0x15c69e66      0x7b2933f5
+       0x2bc45df5      0x1764196f      0xa8c55a88      0x37fded9b
+       0xd6c3534c      0x36fe6a54      0x4badde31      0xd032c75a
+       0xd8d2e57b      0x3c99cd0c      0x8d75e750      0x648d0106
+       0x32a41039      0x254c1680      0x3b6fe699      0xcdabc95c
+       0x46d47692      0xf4d969fe      0x84ba45b8      0x372f3232
+       0xb3f9852c      0x924c3c28      0xf003b67b      0xee85c8b6
+       0x8a2738ff      0xabca2de0      0x8da0f860      0xa9d95969
+       0xedb3f8ee      0x554a358a      0x53528d45      0x31162b28
+       0x0e50555e      0xcef1d0ae      0x5b805749      0x66bc69e1
+       0xe368a0e2      0xed8c60c7      0xd2a2aa26      0x5e39e565
+       0x397f03fd      0x07e64f11      0x9457fc30      0x9f265bdf
+       0x19fcb18d      0x2fbd473b      0xf3b2ae8d      0xe86d9296
+       0x1a317024      0xa27b86d4      0x6da73cab      0x914fb453
+       0x3e5b9c14      0xf056ca1c      0x4e37c21b      0xc21bdc68
+       0x8bd12ce3      0xada89078      0x8a0fc7f8      0x43892038
+       0x18b3ead8      0x0311158a      0x6345ccfb      0x719030f1
+       0x246dabe5      0xe1976ed3      0xc473da4e      0xf94d22cb
+       0x9801bca4      0x4e4f1f9e      0xcd20b543      0x34d10800
+       0xb62152d1      0x80b915a7      0x95c37fe9      0xebba8088
+       0x87cd39ad      0x10f384ee      0xfd0e10ff      0x043ad9a0
+       0x38ff5849      0x7e8f5a56      0x8b1de4c2      0x72c06d94
+       0xcd6d4237      0xa8d5cac1      0xe1413995      0x76dd6ef5
+       0x7d9d7bc4      0x5eb7b0bc      0x88b8af0f      0x46a2b10b
+       0xb17d2429      0x95ec4595      0xae518994      0x3d7509f0
+       0xe2aa249d      0x10740833      0x2b97c557      0x2c605939
+       0x86f79340      0x1af2be26      0x540a70e9      0x1cbbeae6
+       0x05a301f9      0xc88e12f1      0x1564fc42      0x68fb0e27
+       0x2c7f4eb6      0x158883d5      0xd4dc1717      0x2cc658e5
+       0x246c17f4      0x6a389e58      0x83c5343a      0x46db0cce
+       0x4da840cb      0x97b918e5      0x285a067e      0xf243a6d9
+       0xbc3af972      0x5b8edeb8      0xcd710e36      0x6ab486f4
+       0x133fd0ab      0xd9e9a245      0x8779538c      0x3c0933f7
+       0xc81841b1      0xaaaeea59      0x765f3fad      0xd8fbe536
+       0x8176bd94      0x728bf97c      0x8e471350      0x513a44bf
+       0x82353032      0xc20654ae      0x49ce3d85      0x64ee2518
+       0xd5cfb23f      0xac189ee8      0xe1b9f468      0xb7a9ea8e
+       0x877cf20d      0xc755983f      0xac51129a      0x7df719b3
+       0x8a483f26      0xcfcaa3c8      0x5afa0ee5      0xa2c593aa
+       0x4d2cdbe7      0xb5cd8283      0x7e4ff6a6      0x6e801a68
+       0x980b13c1      0xe979630e      0x7f632d1f      0xbbf743b1
+       0xcedab613      0x7677947c      0x734d3f1e      0x11ef770c
+       0xf9da69c7      0x3b97ddd0      0x62b49df5      0x5a2acd51
+       0x068cfa4b      0x198a348e      0xed809399      0x02b056e3
+       0x5e9554c8      0x2512559d      0xb7b30621      0xe515c9c3
+       0xf5648bd2      0xa31e6638      0xd5b42cae      0xb4b7bbce
+       0xd2f350f0      0x98b99f9c      0xf7e24f3f      0xba8afae3
+       0x657a798f      0x17ec9409      0x1c636dfb      0x7a3e3fe7
+       0xa3eb6835      0x0a14b2b4      0x74a152fe      0x57fc6043
+       0x3d17a5cb      0x31e650e0      0x356c3821      0xb38bdc0c
+       0xf6b738ea      0xc412fbe5      0x39018b62      0xf1f14a7d
+       0xb68bce4f      0xa4c5c887      0x2733400e      0xbd4e5111
+       0xd41d010b      0x959850e7      0x426cc29b      0x79c53136
+       0x281cd990      0xd0afa74e      0x9c74f6fe      0x59fcd65c
+       0xfc580644      0xfa9a5fe5      0x597d59f5      0x5ce5a557
+       0x75a46fa5      0x736b73ea      0x3e17ca48      0xfb87bbe5
+       0xf28030c1      0x923a926e      0x2c175c37      0x798007e9
+       0xae5599cd      0xaab93107      0x3001e588      0x7678c6c7
+       0x153fd89d      0xd63c7bcb      0xd1960041      0x90c9e3f6
+       0x45651ecf      0x0528e353      0x75581bda      0xf116c906
+       0xc0051330      0xeb329e89      0xe6fecaae      0x2e45827d
+       0xf3899797      0x0385fcde      0xe4d84770      0x0e7545c3
+       0x5e873caf      0xc674aee3      0x62f2b5d6      0x84458ebf
+       0x4c8fcc65      0x3db6dd6c      0x995d2eeb      0x25790fab
+       0x581bf7c3      0x2ffca726      0x3dde038e      0x6cb21c71
+       0xce236f54      0x21c1b5c9      0xd9bca960      0x77de5cb8
+       0x3b836174      0x63055abd      0x698f1c45      0x92bdd9b8
+       0xc0d92f66      0x35538d1a      0x2ac46829      0xc2f3e8b9
+       0x733a7f24      0x7e21bf3e      0x8f67417a      0x058d5e78
+       0x025f6fb8      0x71ac9975      0xeeca3bb2      0x422c52fb
+       0x17b98771      0xb7ba7045      0xf57344d8      0x3aecb087
+       0xcd245d35      0x69f94fac      0x72da3e1d      0x9f391828
+       0x481a2454      0x73a39c2b      0xacbbec83      0x0cf4d2be
+       0xc209b260      0x11f34b5f      0x3cf5159a      0xdefee9b5
+       0xb900a60f      0x82f6341c      0x07b719f5      0xe2b1eef9
+       0xeaa07132      0xd46a1746      0x7faad831      0x0ca7cf01
+       0xe4e512c0      0x73663db9      0x0beeb604      0x5170a87b
+       0x739f3a64      0x6527add0      0x6b05aad4      0xaf6a07ea
+       0x9e5fc813      0xb80c957f      0x1509e086      0x1a652f9b
+       0x83c4a31a      0x645479f3      0x271bdb57      0x5f04c0e4
+       0x4bd8bd13      0x367ca8ad      0x1e1ada34      0x924e75a4
+       0x135df414      0x8f326276      0xf5d23b38      0xd85902b3
+       0xbd7a4ccf      0x12255ba2      0x09b164e5      0x1acdcaf5
+       0xb753b78e      0x57ee136e      0x6ab95b37      0x2d3fe7bc
+       0x368c8433      0x43c3d9fb      0x77a153ff      0xe835064e
+       0xbfd8822e      0xc2d34f86      0x1c06b25e      0x32bdcb59
+       0xb54691e1      0x665be085      0xa227ee6f      0x1e2a3563
+       0x558fe4c9      0x4a11ebe6      0xd36046af      0x427329aa
+       0x55155033      0x0c5ef912      0x9344a17f      0xb035f571
+       0xf190b199      0x4daffefd      0x3b4ec3d9      0xfbb69438
+       0x075eaedd      0x4dcd780b      0x82476d75      0x38a29a7b
+       0xbd8b9199      0x28c97621      0x09f3bb4a      0x992b0120
+       0x3ce53394      0xb81f6125      0xf24b8710      0xdb8c7e5d
+       0xe66aa544      0x9e59db26      0x4bf601c1      0x6956438b
+       0x7936284e      0x42c09dbc      0xb4286de2      0x3433fb38
+       0xa65b462f      0xc453e362      0x38cf5031      0xcf2ddb81
+       0x9a9b4d57      0xe5746cf8      0x15130f65      0xda1932a1
+       0x00b830e2      0x250eef55      0xa066afb4      0xc1d32bdd
+       0xb28c8daa      0xe60486ed      0x398f63d1      0xd8bf6630
+       0xd784e9c3      0x0021aa08      0x34118453      0xb14561af
+       0x41a6a25b      0x661e54b5      0xd919e480      0x2d006b11
+       0xc58fc132      0x0f8c73c2      0x86b321e2      0x4ac8c451
+       0xc5acfe6b      0x8a3ee820      0x96aafe6e      0x117fe9c5
+       0xc53a77d7      0xe6289308      0x254d7010      0x10979262
+       0xb0ca2fb3      0x9392e7f6      0xc3f7795b      0xdbc8e897
+       0x66bc320c      0x46652a3b      0x51987bb6      0x0151620f
+       0x479bd58b      0xb9831ae1      0x5e6758fa      0xe1db9a18
+       0xe585362e      0xa214364f      0x79283b25      0xe41e5688
+       0x449aff9d      0xa3748569      0x1ab77d53      0x423c1af7
+       0x85a21770      0x717d72c9      0xc11a9d00      0x350c545a
+       0xe7246cc8      0x591973dd      0x65c3c2c0      0xbb156877
+       0x18b332ae      0x083b7792      0x7f5300ad      0xe2bc6462
+       0x0ff80c64      0xe9cdffe3      0x81f5a179      0xc51b21e1
+       0xba8cc80f      0x5528cce2      0x07af48a5      0x312e50a2
+       0xb849b72b      0x6162eaba      0xb6d67046      0x8713a459
+       0xefc571e2      0xaf1d17e8      0x7f5f4007      0xa6b689d8
+       0x9524706a      0x3aebc3ce      0xdb8ade06      0x5af5b102
+       0x7723648d      0x81a2fb99      0xc51abfaa      0x6276c2bc
+       0x18f42359      0x4c2e0bb1      0x8a2e26fd      0x03ba8dde
+       0x917479bc      0x4f23cc82      0x441501aa      0x47d16588
+       0xe46bbb26      0x76cebde9      0x9d06c5ed      0x2fb19333
+       0x74c314b3      0x6f70828e      0x1e747727      0x1c8b38b0
+       0xad22a517      0xc2c306b3      0x9b0e8c1b      0x2a1b0cbf
+       0x5ef93990      0xefd567a2      0x15d41c0a      0x3e759035
+       0xf5bf6598      0x55ba183a      0x232bb2ee      0x7e2a518c
+       0x2f55f023      0x29f9019f      0x4dcd1d87      0x66873fde
+       0xa513b0d5      0xd2df839d      0x2e48a91a      0x88f5a4cd
+       0xc1f41e63      0xe57c9470      0x2d54f4b7      0xadb6540b
+       0xac93446a      0x0226acd8      0xa2852b58      0xe9b79d59
+       0xc64035fc      0x0b1bcc74      0xbff993d4      0x31de54c2
+       0xc34b2da3      0xd7500287      0x59cce868      0x4bfaf38f
+       0xc3fdaff3      0xd1eeddb0      0x0579c161      0xeda22a64
+       0x2a88d9a0      0x12b506c5      0xe496968e      0x55e6a7ee
+       0x60fb7faf      0x96e9d3f9      0x59ff4cb6      0x2ff00e00
+       0x8347f760      0x635a5b77      0x392dd6fc      0x8e633333
+       0x5f951ca2      0xff656885      0x1c9d9178      0x27fdb652
+       0x11c19001      0xb56c9db9      0x8f4d53ba      0xa14b6f68
+       0x42e43f8c      0x29a84b0a      0x5dcc30c3      0x066c8304
+       0xf049fdec      0xa9aeb741      0x47141e86      0x922e0d70
+       0xa1e2af5d      0xa9ad9db3      0xcb0446ef      0xc097e87c
+       0x929e5c1f      0x03cf9baa      0x19640d38      0x036b2ed2
+       0x8a0468d5      0x6f38889e      0x9d836d46      0x6d460e63
+       0x1a7e242a      0x81e1d569      0x26c0cc55      0xffaa2075
+       0x2689857b      0x9c3123e1      0xde69b9ac      0x68678c56
+       0x07c31945      0xbdcd09a8      0xb984128f      0x6b141f3f
+       0x57e30d2e      0x77dbe7f2      0x4f43684e      0x28b0b495
+       0x1f1b156b      0x03c1c0b5      0x24d5f20b      0x6677d692
+       0xc68bba29      0xbace23ef      0xa0caea05      0x4a292b48
+       0x54b28817      0x36711c31      0x8f43827b      0x9065cc31
+       0x92ffc7dc      0xee4560da      0xeddf2c0a      0xf7e05169
+       0xc8429620      0xe11ba6c6      0xec806b6b      0x0ad456bd
+       0xcf3d955b      0xe064d178      0x7c81f9b0      0x369a2e98
+       0xf946a8b3      0x26647955      0xb31e91be      0x22f79668
+       0xcc8bcd27      0x33804fa0      0x054c3d3e      0xc65d1aa0
+       0x8e8ebb9c      0x78e50c77      0x10a71e03      0x6f7eb5d7
+       0x69fad4c0      0xe0c3d868      0xaaa27815      0xe787de22
+       0xb28b0b72      0x140e140b      0x42350f96      0xb82dadb5
+       0x63ed346b      0x5a53e8d5      0xd8e172db      0x15be3f66
+       0x4efc8812      0x966a1085      0x8810f12a      0x5a9cc86e
+       0x0f2101e1      0x4df822cb      0xe0e22c55      0x9b40ab87
+       0xc185ea33      0x24da3227      0xbf6da297      0x7e85c299
+       0x423d9723      0x82bf5a50      0x3f129df9      0xff71db6d
+       0xdd9c61b7      0x6d61b223      0x5001f056      0x70def3cf
+       0x9aa6b53f      0xa385409b      0x97a369b7      0x3aafcaa9
+       0xc3ae08c3      0x74741a86      0xd08542bc      0xa8e6cad8
+       0x4c9635be      0xabcebc1a      0x9cce5c40      0xded2f2c2
+       0x71bb00df      0xb87228a6      0x29efc748      0x3723f6dd
+       0xe772c299      0x1b1dfafd      0x8c13dd49      0x1779c8f3
+       0x88743605      0x00eaa426      0x4295b019      0xd4227e8b
+       0xe62da964      0x59c6c883      0xeda9b50e      0x0ab68434
+       0x23f8dfc7      0xe52ca7e8      0x9fbc286b      0x80d2f140
+       0x72b97700      0x15595da5      0xf8b17a11      0x35700095
+       0x0748d3ef      0x048afd7f      0x1a79c6b7      0x22cfacda
+       0xa64baaca      0xd7f134d4      0x22ec940a      0x8891592a
+       0xa6a0ebfb      0x951ece3f      0x1bec1abd      0x18a9bc48
+       0x6280d1b0      0xdf8f77df      0x3304a405      0x85dd1146
+       0x5b9e51a2      0xa536471b      0xf2dd932c      0x59242994
+       0x7ee5be81      0x28975f6b      0xf871ac4e      0xd68b0df4
+       0xb6dd4ced      0xcf5c922a      0x79e744e9      0xd6aabebe
+       0xd0a4eb03      0xe628ba02      0x2e640b6d      0xa3f74566
+       0x3a87439b      0xb7620ec2      0xdf666f8c      0xdb402f56
+       0xcb48744b      0x1e4c252c      0x0802b11c      0x307ef6d2
+       0x7d6c35d6      0x094c0212      0x99a9505d      0xdde8e0b9
+       0xd8a85e18      0x23d48407      0xe8fce481      0x57d2da6d
+       0x189fb636      0x3bc4e436      0x64d1f5b3      0x873672e7
+       0xeb0d163f      0x3e7699cb      0x77843424      0xb39cc2b8
+       0x33b384fa      0x34c098b1      0x0dec103f      0x938175c3
+       0x7a4fd9f5      0xe4fa138d      0x86e7945b      0xd6bc0b68
+       0xa0384822      0x455c4e87      0xa30d7331      0xc55a986a
+       0xa3fd77ba      0xf4ae89d2      0xf75c0de8      0xbcf4b02f
+       0x1982c49b      0xa0895efe      0x4eb8b46a      0x8617cc9b
+       0x7c77138f      0x4c734ec0      0xe80a006f      0xb42e0fd1
+       0x612d5d62      0x6e3b28f7      0x128c5148      0xca9269c1
+       0x54cf44b6      0x3ef8c71e      0x1902569e      0x47ac1243
+       0xb59487c1      0x0a8bcd5c      0xe8376295      0xa185c2ed
+       0xf48487a7      0xd2eb422c      0x60c8906b      0x85626bb5
+       0x8aff9c01      0xeca98486      0x32642805      0x3dba00d1
+       0x0f44b6e7      0x7f36d3e1      0x169159a5      0xc6f5f3d2
+       0x70b2d883      0x30392544      0x89a1f11f      0xc4fe6666
+       0xd7a644d1      0xc28c1925      0x3540c25d      0x83933376
+       0x9564c63c      0xbc7e96bb      0xd9aed315      0xa627db55
+       0x27b5dd12      0x9adf3a24      0xb8a31788      0xf1e1b75b
+       0xb2d0f7c0      0xa11a109d      0x4bb6d538      0x65c11840
+       0x69ea67d1      0xf39270bb      0x0b45559f      0x6237dad5
+       0x6d584cc6      0xbbf3d720      0x3f06e546      0xfab204c5
+       0xf60c2e78      0x2fd60875      0x414825d0      0x7de66f9c
+       0x70296c29      0x3d3dc98b      0x4e780816      0xefedb2ab
+       0xada68af4      0x1c0c4e2f      0xb1c5c088      0xddac785b
+       0x006e46a2      0x91ea694b      0x23d17c88      0x9df9e192
+       0xdacb38e3      0x6346671c      0x9c1063a7      0x52a0f4c5
+       0xb7488fbc      0xe69b1d28      0x0b8be40f      0x7767cb3c
+       0x4e53e5ea      0x88f93fd5      0xd289a3ae      0xd52b34d2
+       0xc06a6abf      0x1f0d3393      0xfc697604      0xf8a9d142
+       0x13456e9a      0x54fd7c2b      0x23e0d2c5      0xba20acb4
+       0xb5d13f7e      0x51720fa1      0x7aa11a19      0xdb18b444
+       0xd832d72b      0x82bd98c0      0xca345d75      0x8b53a7e1
+       0xb78a9fc9      0x835c91b8      0xa721f269      0xb4228ada
+       0x2a1332ef      0x9d2c3297      0x8ac605d5      0x101d0e3e
+       0xc51da322      0xced12e70      0xfde53ead      0x1208f219
+       0x0014ca96      0xddae88a9      0xaa157dff      0x3aa78eea
+       0x98fee8f3      0xe6e0a663      0xe33427e7      0x9db0451c
+       0xde9e1f4e      0xb1c81e9f      0x171ea5ee      0x289aa1bd
+       0x3f02d9f0      0x1789641f      0x929c74e7      0xef4a720d
+       0x75cecbd7      0x5d1bc327      0x9edb9707      0x93edf8b0
+       0x906ddcb0      0x2d4ec3f8      0x2bb8019c      0x3a8fa6e0
+       0xe9c95679      0x7938bfa2      0xd4377880      0x2b1fb187
+       0x53105f1d      0x93e54541      0x15c293c0      0xc39f44d1
+       0x4c022717      0x950d1bd6      0x809b4475      0x6fa53fa4
+       0x574658ff      0xa047d562      0x1c991013      0x5f9908ae
+       0xc31c56d6      0x53f51225      0x70d329c5      0x499fe938
+       0xe3eba31a      0x3cf614df      0xe0565508      0xaa76d026
+       0x68369afc      0x159a5063      0xfa9e8303      0x4989f72d
+       0x697788fe      0xd44cf5e0      0xb787582f      0x9ae61831
+       0xc13b900f      0x8682ad74      0xb8270369      0xff527834
+       0x8075c909      0x4ab9fa91      0xfec8c247      0x2983dd9a
+       0xaf5e88f7      0x31fa0dda      0x96a94e34      0x7cdb2fc7
+       0x585d0f70      0x61959e38      0xb657af8b      0xe860a37c
+       0x76efd5e7      0x75d4e4d0      0x09aad491      0x0f96d3d1
+       0xc5362add      0x30db88ee      0x6505011c      0xed815b2f
+       0xcd65a7be      0xff8c8933      0xf8e4dbae      0xb452c8b0
+       0xba8c9650      0xfc4e4470      0xff434eff      0xeeff1c75
+       0x3b572a54      0x6d299a57      0xa3f93ac8      0x81d7966f
+       0xc3d0371f      0x45a67ec1      0x758b5c09      0xd6e9e0e0
+       0x060ceb96      0xd9abe780      0x55aebdef      0xf8968395
+       0xa7458357      0x40f928a3      0x839f1295      0x65c301da
+       0xc29d0c27      0x12f440f1      0x501242b0      0x3d6901cc
+       0x0f3763b1      0x9f8a13a2      0xf7d98cce      0x68bf2708
+       0xbe8c6054      0x6a2887da      0xa89e2ab0      0xfddf5050
+       0x7faa6323      0x45d441d7      0x5670f16f      0xc5f8ecc1
+       0xfc055e8c      0xc9f823f0      0xf536c387      0x21cabfda
+       0x1f48d7d8      0x42d8c548      0x0ae06ce7      0x40ee30ee
+       0xb5f3c702      0xd15ccbe0      0xe1cc92a1      0x6432acb9
+       0x269c6913      0xa1b410da      0x4c3dfa9f      0x6e188a15
+       0x65fd9a6d      0x9ed8bc7a      0x3a56f184      0xe5235bf8
+       0x13f0d45a      0x7c5e4c0b      0x7bee841c      0x05c8b28d
+       0x1b073094      0x5bcf3dce      0x48b71861      0xdd507cfc
+       0xc0a7ed57      0xb3d9d3a3      0x4a7bc06a      0x37cf37d5
+       0x745b9217      0xc85943ce      0xd9d118bb      0xd199caa2
+       0xa3cde3c2      0xb26acb43      0x3815bd9f      0x70b68e98
+       0x350a0efe      0xb30f66d1      0xe0d6e822      0xc2133287
+       0xa2488940      0x55dc3068      0xbcdacbe5      0xe650e03e
+       0xcdc47780      0x886e5444      0xc4633856      0x3b5a9117
+       0x862610ee      0x88f20b48      0x5c22e59a      0xf5b73c89
+       0x8b2d1496      0xfdc285c1      0x6627f736      0x5cb4f02a
+       0x9f2a3aed      0xd0d40bdc      0x6d860720      0x2c0cfd98
+       0xf77e2507      0x7b5b71a2      0x43dddf53      0x8e1b9b95
+       0x7bb26763      0xdd562c1e      0xb97f535e      0x0ff5a63d
+       0x4b9143e5      0x03af7570      0x2a8cfddc      0xa641eca0
+       0xa5e88d84      0x40bf55f9      0x43a44471      0x01a28153
+       0x9a493986      0xb8640c31      0xba638a10      0x236594aa
+       0x0964049e      0x6c580e70      0x9702093c      0x11717846
+       0x8f84ee25      0x963bd0d4      0xee8aecbc      0xceb308c9
+       0x7e87fefa      0xfe29eaf3      0x081bf223      0x39f50aee
+       0x64426842      0x97a17f9e      0xb9be289e      0x388891bb
+       0x4ff7d1e1      0x9ce9f261      0xa93271b8      0xe035f412
+       0x2200e0b4      0x512b25b5      0x45ae8b23      0xd29ea962
+       0x667f62e3      0xfabb6736      0x5b877b6d      0x053c7b61
+       0x076cb3eb      0x601e232a      0x0e468161      0xed8adec0
+       0x5f77e7b3      0x33cc6297      0xc012f67a      0x4e7eb479
+       0x71c41e11      0xc022102d      0x968c4181      0xe3378a34
+       0x921f1a7c      0x747b3223      0x2424eb3a      0x14a6099b
+       0x2c21bfec      0xf931fc54      0x8834adce      0x8ea89281
+       0x7149822b      0xf9064226      0x9035c603      0x5ae59126
+       0x09a9bef5      0xb602bf8c      0xccc76158      0xe1462d73
+       0x2fdad828      0x63b629af      0x73844cb8      0xb408c4ac
+       0x94c1d64e      0x907b2a2e      0x9fc1b634      0x6afd654f
+       0xa0edfdc0      0xbc29a7d6      0x767b1b0b      0x7138e98c
+       0x352d8b21      0x0927d5ca      0x4d41ceb8      0x9fa9e4ff
+       0x04756e49      0x62b06eed      0x8c0bce0e      0x4f6c8fb6
+       0xcf5c7009      0xc367e6a0      0xb0bdb7fd      0x647be9e5
+       0x6f996e46      0x197a8e3c      0x17799ba5      0x70b5aef9
+       0xa41ce63d      0xc0d9086d      0xb71cb59a      0x453fe0a9
+       0x68f36324      0x42165087      0x917f6c86      0x25cb02ea
+       0x3a80eb14      0xf2026099      0x09f64835      0x2587641e
+       0x0973460d      0x552774b0      0x20465def      0x4822a5ad
+       0x992f6abb      0x954d1b87      0x3a6e15b0      0x279b5b30
+       0x2151ddfa      0xccc18116      0x9720fdf4      0x2ed42fcd
+       0x5b3c3664      0x5a55c3b1      0xfdd0416a      0xd5eed81e
+       0x8a2e1433      0x24113038      0x4735a373      0xb3ff6425
+       0xfcb08279      0x33293359      0x322b74c9      0x38c5a700
+       0x4304badf      0x6eb9b90f      0x080ca3e1      0x43786a88
+       0x0ffec938      0xfe4e5743      0x67e3c861      0x348ac552
+       0x11414ac9      0xda0a9520      0x633f535f      0xff97a48f
+       0x8fbea6c6      0xfbd2e2ab      0x677a91ab      0xecfdb8f9
+       0x56b7cdfd      0x861106f3      0x1367b28e      0xac0ea350
+       0x2957095e      0x0e15134d      0xd465f129      0x7e111986
+       0x6903ffe5      0xe37ac087      0x6f13c15a      0x62fbaf84
+       0x16bc67a0      0xe238771b      0x714ec75a      0xb09e2feb
+       0xaf3ec6d3      0x8842008b      0xacc45f3a      0x1433cc4a
+       0xebee23d6      0x13b9e003      0xf20a265d      0xc485064e
+       0x0c72f0ad      0x6bc8bf06      0x74246c1c      0x6bf0bc64
+       0xe03fc104      0x49581c87      0x35326bda      0xf617407f
+       0x60d7d19c      0x1b94bb2b      0x8767c5f5      0xa8f373ad
+       0x6c7ee825      0x6fb4a03c      0x5d1a75a8      0x86f425be
+       0x7c60739f      0xce3a459a      0xa9e3c0fa      0xa0ff2952
+       0xb8929242      0x520db900      0x0bc756cf      0xfb2df381
+       0xd9616091      0x1685f62a      0x9580d893      0x2e09a90d
+       0x60385df6      0x4763db61      0x005b1896      0x5e306c49
+       0x13f53931      0x2785ab69      0x892b6765      0x8fbf4042
+       0xe45495c8      0xf12880f6      0xc07df0b4      0xbd80dfd8
+       0x677c7bc0      0x08aefbb1      0x415420af      0x1b4f7083
+       0x0b8afd31      0x157a36b6      0x96f53d12      0xa85da83d
+       0xb5276d89      0xe7c9f2e9      0x8fd0e291      0xad7d1fae
+       0xda951bd1      0xb4b44ca3      0xebd72c28      0x57f90f7f
+       0x677584b0      0x84e8d695      0x97fa0306      0xd21c4b77
+       0xc52a0f4a      0xd9d74407      0x7211d537      0x53537228
+       0x19397df4      0x71a91efe      0x74c01c0b      0x706877f3
+       0x184f5d34      0x20dd060b      0x890fdaf0      0x52d19f60
+       0x1217b122      0xc5615f70      0xaf9d2c8c      0xb272b296
+       0x019449c8      0x3345644e      0x3c3b1e72      0xe4620518
+       0x61f2150e      0x8a823141      0xe167e84a      0x114e05be
+       0x2ebd17e7      0x1be2bb7a      0xb5b23ba3      0x5090f028
+       0x5fc6aa04      0x2d1c5e65      0x9065b402      0xf0ec9ea2
+       0xe872712a      0x420a4ddb      0x75b4cc28      0x065698ae
+       0x0d7658f0      0xbfb57451      0x78d83c3c      0xa1929b6d
+       0xe7189ecd      0x9f733a3b      0x2c3dbfbf      0x6a1751fb
+       0x1ccd0a1d      0x015b9ab2      0x89ef1b81      0xa433137d
+       0x6d1963fa      0xabc41008      0x292f7135      0x11230f69
+       0xa3903eec      0xa10cbf4d      0x20393216      0xc8da597a
+       0x99ca932c      0xf6e173e7      0x6b76f01b      0xa09e1ff8
+       0x0318a1dc      0x49e27984      0xdd1b06d0      0xfb292259
+       0x2d785d58      0x70aa6f16      0x446a6894      0x78f9e6fa
+       0x6697bff4      0xb955fe3f      0x7d8c869d      0x64732d78
+       0x0786c98d      0x8381fd3b      0xd6390e4e      0xc7993b9b
+       0xe5e1f8c5      0xaafe569b      0x7d8a78a0      0xb89bd783
+       0xf54c207b      0x2e939a1e      0xdf143293      0xae6ff8ae
+       0xb2a91716      0x59968c88      0x39bf23b8      0xae6f4de8
+       0x25036bd8      0x80aec9cf      0xf0ee7e3f      0x317b4da3
+       0xf8fd7859      0x08df3ed8      0xa71e6b8b      0x3a3462fd
+       0x25bc7455      0xb13fbb3d      0x9d2724cb      0xc7b31258
+       0x29065213      0xb281d1e6      0x3106fb33      0xaa6c1ade
+       0xb638c936      0x356ae429      0x13c86ee0      0xbce90444
+       0xf9c0d88a      0x518c013b      0x62b04106      0x4ac7ee0b
+       0x3c616332      0xf0c22f5b      0xfc27ee0d      0x4ce9b5c9
+       0xc905c353      0x4e11e45d      0x20256223      0xcfea482b
+       0x8af1d33a      0x6640b197      0x270691df      0x7475f179
+       0xc1be0ff1      0xfc21a6dd      0x786b980e      0xc72ca8fc
+       0xb767d852      0x7ac8af42      0x7d72c6b6      0x5a19fd11
+       0x5716bd2e      0x82b53504      0x85b83ccf      0xf811ccce
+       0x09f4fc3d      0x26d5ee64      0xeaeeebde      0xec395bd8
+       0x63b1e856      0x72d766d9      0x48735ba3      0x05c17cec
+       0x84ec9d2e      0x4799a35f      0x4db934c1      0x1a739a95
+       0xcc76a3b1      0xec0380c6      0x9fe51ba6      0x3a50a27d
+       0xf87acb98      0x341361c9      0xfacfcb38      0x5d4b6c17
+       0xf895d893      0x5ddba6e1      0xde76e175      0xdd13201e
+       0xf3ad93be      0x2f5b8221      0x59e89ac6      0x1a747325
+       0x296066ba      0x4d85ed20      0x17622be7      0xa8a5a7bd
+       0x2d4622c0      0x35bcbbf7      0x6adfc5f3      0x81df2b42
+       0xfc506e18      0xb2abbd05      0x850204c1      0xdf349905
+       0xfd16cf46      0x95a65c40      0xf522fd5f      0xc46bc0b2
+       0x972d3bf7      0x63cd3d05      0x5c0cdba9      0x0a2b5665
+       0x70b5d650      0x471c9665      0x5b46d2ca      0xe03dcfed
+       0x88ad25ee      0x28b79b36      0xd4876196      0xff45ddb9
+       0x3f6f97fb      0x84297dd7      0xf674b99b      0x53c88ca3
+       0x120ea529      0xf2b960c1      0xc38b3d15      0xb51c0647
+       0xa2730c34      0xd4165f60      0x9985dd8a      0x077643e9
+       0xd59044ab      0x88957ef8      0x711688e1      0xb1037691
+       0xfee7269a      0xf9d31f46      0xc77af041      0x3f37ffc5
+       0xa4d46180      0x1bcf34b7      0xd3d0eaec      0xbfa88a90
+       0x48263e38      0xed557ffb      0x1af3d3b2      0x0316948a
+       0x4af71ae0      0x7517cbcd      0xe1b2d099      0xdc83d657
+       0xa725bc70      0x355417cd      0x8ecdee8d      0x24007bfa
+       0xe6849596      0x857cbf25      0xab6561de      0x4f5eefe6
+       0xc4906bdc      0x6eaa8b85      0x56fa64f5      0xcaff294c
+       0x17649e98      0x0a841bdc      0x9bf4f213      0x1b341d28
+       0xdbe8cb6f      0xc39466e2      0x3bc747da      0x5649f344
+       0x03cd04fd      0xfbe13795      0xbd77ede6      0x7021258b
+       0x3ddb01d2      0xcae06294      0x9e078842      0x99f6e391
+       0xafb9f4e0      0xbf598407      0xfff330f8      0xffb3b210
+       0x818c3811      0xfb212c5a      0xddc8ffc9      0x395554cd
+       0x1ae3fe4d      0x8d9222f1      0x26f8d43b      0xae69cfa5
+       0xe4c894b3      0x67eb4bc0      0x652cfea7      0xfd4df537
+       0xf5cc0cfd      0x6bf05b5a      0x27385c62      0xc836f0e7
+       0x0c31c339      0x75906219      0xbb82f59d      0x3ad4d28b
+       0xe482643b      0x527c4116      0x9da57e94      0x40a040b2
+       0xc06cb4c2      0x3eaf28f6      0xc32fbf31      0xf539696c
+       0x4941c01e      0x663106bc      0xeaeb376d      0xb9be9f1b
+       0xc72e0c52      0x043a4216      0x306a80c3      0x4acc7adf
+       0x770ec027      0xfeff9cc3      0xd3758d92      0xc2f4b4ab
+       0xcdc5212e      0x7e8d4723      0x8bfa11ce      0x1820669d
+       0x9f64641a      0xd0be018a      0x8155e867      0xd83a02f2
+       0x3cb5f6fd      0xacde0504      0x6901ddcc      0xc07c6558
+       0xf4e6e1ef      0xa00eeef1      0x700f082d      0xf3c0850b
+       0x2a0847df      0x4c29c837      0x7362f81d      0xebde2f1c
+       0x69ef6173      0x5f74b6b4      0x6c816252      0xb0594c53
+       0x5aeeba10      0xe37de616      0x5bd89ef2      0x4d604d46
+       0xf07b9ba6      0x590d4b3c      0x5eaed047      0xf2e80e52
+       0x77d78870      0xadffbef4      0x82f2ad9a      0xc24df650
+       0x4f9fee73      0x9b6e3248      0x40220a7a      0x66e18e7c
+       0x4aa7303e      0xc4152aa7      0x7881cb37      0x94dbf10f
+       0xfe390997      0x2ebcdf4f      0x31a1ba58      0x30a652a7
+       0xc0a1e533      0x868c9169      0x5adacc98      0x65b64557
+       0xb6a21b69      0x85c27fa7      0x8561bb37      0x7cbe2e5d
+       0x4ac12213      0x2c820597      0xb5bed145      0x8393fe9a
+       0xaba4bc10      0x1480dee4      0xc3651295      0x5ac05ae4
+       0xea9223cb      0xe1683bff      0x25eabf57      0xc5f911f9
+       0x69961525      0x21ee6e4a      0x36cfaa3f      0x58c44058
+       0x654f8f59      0x63c179c2      0xbe0dc7cd      0x43edce6c
+       0x75bec268      0x8b451b1b      0x65488a4f      0xf2ab82c6
+       0x473dfd11      0x09c9e208      0xc92e032b      0x319c92cd
+       0xb0016818      0x6cef2d44      0x9fc0d134      0xc375eb03
+       0x3cbeb3c0      0x4e12c415      0xeaed2bcf      0x98489ec0
+       0xd332bee8      0x8865b77c      0x986ae566      0x46ae627c
+       0x43cf7d2c      0x4786a470      0xf8c23b0f      0x7f420546
+       0x49947085      0xb5fa542a      0xfeb619b7      0x0062eb47
+       0x964e7643      0xb4b20dc5      0xe6830b7e      0x42d7b4be
+       0x367e45fc      0xf8a770e4      0x89381661      0x61dd19ae
+       0xb16333f8      0xc22bd1f9      0x76f2f244      0xcf536bd0
+       0x4b9d2004      0xfe5f8a48      0x64bafdf5      0x25eacc27
+       0xc831c205      0x6e9d5c74      0x6700468b      0x72e451c4
+       0x474d1e45      0x313fdd60      0xd8f23c79      0x052613d2
+       0x8c1c6562      0x87b0988b      0x6da5d909      0xd286a27d
+       0x369e1f5b      0x2eee77e9      0xd7942a63      0x83daa4a4
+       0x0395eea1      0x75640f29      0xaf66cd73      0xe08f6de5
+       0x5d4a2544      0x1845d47e      0x7447bb8f      0x91c82985
+       0xd2df8d81      0x396cefd9      0xdb3b2ade      0x4c3dbd33
+       0x9d3abe58      0xbcdeaa39      0xa904cd8c      0x87849f6c
+       0x3827fbd4      0x00c17a56      0x9e1f3c93      0x36e83c68
+       0xe803a822      0x537f11a6      0x8a6485dd      0x9ed17fad
+       0x0ebde5e5      0xaa5e4856      0x49b58252      0x53619b36
+       0x167e4702      0xca402b44      0xdecab152      0x1dfaa766
+       0x1257140f      0x3069091b      0xd92374d1      0x3ab0597c
+       0xb52bcc31      0x620e60d8      0xd83a5471      0x61006f3b
+       0x629d6ad6      0x982149ef      0xcc96105e      0xfdd6f0ac
+       0x3141869d      0xc5ea6866      0x9ab04e17      0xe46cb130
+       0x3dcb70d7      0x5c8f384f      0x81e38fb3      0x1318faeb
+       0x3e69c9c0      0x6fa70a9e      0x8b6d5450      0x26301b3e
+       0x6df0df6e      0x3b50b066      0xc894e340      0x3ff53894
+       0xd6fe09d2      0x69187a50      0x958df3c7      0xfade4e07
+       0x5980b30d      0x4634b779      0x0dd4f80e      0xe1ea49e3
+       0x55516c63      0x2d785418      0xbfdc1981      0x13467164
+       0xc3d81d6e      0xda687d88      0xc0a15af1      0x572ebde2
+       0xbfec27b9      0x2d40276e      0x72651cd5      0xc87b84df
+       0x483543c9      0x9de39ef6      0xbd8b4606      0xeba1a3e2
+       0x9b549679      0xa6c5918f      0x1ad8e96a      0x88f31d85
+       0x29eb2208      0xee470626      0x0cb1aa35      0x0c8262da
+       0x97dc5b4f      0xa1e06d7f      0x5818e64f      0xabbab4a6
+       0x817c3816      0x7faff78f      0x5050c52a      0x7b8de34b
+       0xf32f77bb      0x34ee341f      0x8d3a9e4d      0x39b1ada7
+       0xef322bd2      0x29190d44      0x415bdfb8      0xd779ec97
+       0xca058f42      0xd5912e76      0x96b1f11e      0x331f6fd3
+       0x9fee7289      0x3fe204b4      0x1a629c6f      0xcbf9aff1
+       0xff789191      0xa50a3890      0x7afe9809      0xfd9208da
+       0x46d21823      0x74073593      0x23d4523a      0x10e8e98f
+       0x566f17de      0x1df7aca2      0xad6237be      0xa48f877e
+       0xb96513c5      0x539b4f7f      0x77e704d4      0x7812d61c
+       0x81e3d573      0x8b530d0c      0x2bda27e1      0xbd2cae27
+       0xf5c09ead      0x61b78bf9      0xcb933660      0xf8893a6a
+       0xb45fc8b0      0xebde71f6      0x9fb14aa8      0x18950fd9
+       0x6d8bb51f      0xf140c194      0x885f559f      0x10d049b9
+       0xdd5ff1cd      0x3f589620      0x84f30dd3      0x70beec51
+       0x75b70a1e      0xd3415405      0x096a9360      0x39c54abf
+       0x83507ac0      0x39191f54      0xddb76cce      0x0054ba33
+       0x6345d176      0x043fa87d      0x33b121ee      0x0e451b51
+       0x1ee8412e      0x821ee12a      0x1aad0a1d      0xd49f63d8
+       0x07ef3812      0x90fe7617      0xc2ad0712      0x68311c5e
+       0x2dcd3471      0x928b6248      0xe20fcf7e      0x99e3c939
+       0x9cc965dc      0xd4b9e274      0xf3fc93ed      0x80d127b5
+       0x078c1604      0x2b65a809      0x4030853f      0x234febca
+       0x9fa441f3      0x0c3b264c      0x53eac391      0x98cd202d
+       0x7e50a035      0xbac1b949      0x47429a0d      0x62e0b0c5
+       0xdaa182e0      0xd3bf57cf      0xce7cc318      0x6a07ae43
+       0xf1127353      0x82156f15      0xd4e7a574      0xbc22b57c
+       0xa3114d16      0xcdccd132      0xc47962bf      0x5ed0e4b6
+       0x11c70012      0x4a50e501      0x80dbe1c9      0xe4d7bd1c
+       0xe802a5fc      0xc6d127fa      0x50842812      0x5d9d4d93
+       0xbdb3108e      0x41f7ff27      0x33478a4f      0x1c38e1d6
+       0x7dc1bc3b      0x7b8f17b4      0x2115e253      0xbf8f1ac5
+       0xd639ffa5      0x238876ed      0x7dba90b7      0xaa0d2c45
+       0x3d3d383c      0x4bcefe30      0x99eeee70      0x22fd7f1b
+       0x6ce141db      0xe8065fe0      0x4ac120da      0xe8abf231
+       0xc353e26e      0x4d7d344e      0x1b704e29      0x9ce0bcb7
+       0x9cdd3fe4      0xe5585f2d      0x2b5ae25e      0x820803e1
+       0xb61f0734      0x1f088f07      0x91ba90db      0x89a64f71
+       0x6c0bae11      0x777c2242      0x52f88f57      0x4e066af9
+       0x3a306836      0xaba6d24b      0xa1d3848f      0x0409eef2
+       0xab97e370      0xa6419863      0xd9c71cdd      0xc2cfcdec
+       0x52c87221      0xe64b7ff1      0xb2cfb829      0xaf6a1164
+       0x31f49fbb      0xc9b55773      0x1512b8fa      0xf52d1715
+       0x4d443b40      0x3a0e15ff      0xfa810f9b      0xdf150287
+       0x69d07a24      0x408cded6      0x8a1bde41      0x4d61714f
+       0xbbcb8345      0x6bfb4c19      0x915fda61      0x771c9172
+       0x5d11e873      0xf6ca0bb9      0xfbe5f5dc      0xa59cfeeb
+       0x23fd2965      0x77af31b3      0x8bb691bd      0xc4131646
+       0xc03178d4      0xf5bfbc1d      0x5e44cde8      0x373f8ac4
+       0x89e0d0c5      0x60e45013      0x5f9d3eb6      0xb2694ef4
+       0x5c90bd23      0x81b21d02      0x9ccbda7a      0x113837e1
+       0x2e7a5eef      0xcc2b0c93      0x986d7017      0xc6d4341f
+       0xed83411f      0xfb3be8ea      0x65df7285      0x43f71d3c
+       0x98db6b47      0x356d3fb0      0xc28c0c3f      0x5bfa8b9c
+       0xb7dc8574      0xf3e85821      0x5e618232      0x57eb8e09
+       0xfa577d69      0x3256b9c0      0x23925882      0x049a62c2
+       0x8bf9ea56      0xcf4a26ea      0x3ed441e6      0xa58b6e6a
+       0x2c177862      0x3287e567      0xf23ca964      0x261c9b17
+       0x22465daa      0x4ef9f195      0x046a867d      0xa38898ea
+       0x912c0b81      0x2c54e834      0x4c7d8e9a      0x749b8caa
+       0x44a0ddde      0xe3c28d2c      0x0e973992      0xf69f0a04
+       0x12eedbeb      0x07d58a27      0x06335f41      0x5858009b
+       0x02e0d44c      0x91b3f425      0x6f485a0f      0xcfbcfed0
+       0x28ecae95      0x820c3d43      0x17563bd6      0x2eeed266
+       0xefc66054      0x00cfb51f      0xc7725be0      0xda64401d
+       0xaf62184b      0xc7c7e121      0xc2fcbccf      0x80bfc1ec
+       0x7f881507      0xbf1d8cb7      0x762d74dc      0x8114836e
+       0xb1f06f4e      0x6f601cfc      0xe180598c      0x78fdf809
+       0x83a3c7f8      0x5b1836f9      0x6dba011d      0x00c8ae4b
+       0x1835d8ae      0x5ed6e662      0x9c844738      0x2fb27fed
+       0x0667707a      0xa9b346f5      0x9cebb524      0x924fc582
+       0x606a13d1      0x16720fb9      0xf2ace147      0x2075637d
+       0xcd1e83ed      0xb19b8945      0x96466650      0xccddef5e
+       0xc32a83e1      0x12fb7523      0x401edbcc      0xcaa03bcd
+       0x4d1a84f1      0xa5c725c3      0xd4707e6d      0x2ef4fa20
+       0x7055c032      0xe1085516      0x7c18f940      0x1f82cb9d
+       0x7bb59fe0      0x096736a8      0xb537886a      0x5abb9208
+       0xcfcbc80c      0x3f5d2ec9      0x067dd2d6      0xacdb69b4
+       0x76d00d90      0xeace3ae6      0x596c4c15      0xa5022191
+       0xa3b9853a      0xdaad430e      0xb2b954d3      0x6e22758f
+       0xb2970653      0x606ddc84      0x9c4e0b95      0xf5e75a19
+       0xb499080b      0x8b42112d      0xb8108a0f      0x6bdca24e
+       0xee8dfb1d      0x767b2f57      0xe37bced2      0xae936071
+       0x66d2f8dc      0x7741efb5      0x5c77e0a7      0x865122a4
+       0xd6e83d1e      0xcf928435      0x3de624e8      0x462696db
+       0x10d1f807      0x541bb0d7      0x184e3d7b      0x5ac43ad4
+       0xb3090fdf      0x4d3a3d94      0xcd924076      0xee2c0699
+       0x17fdfa1b      0x03655b76      0x48d97db9      0xf1ee5304
+       0x208bf840      0x8dd4e4bf      0x6b740615      0x22dc0f33
+       0x9fda2f1c      0x7691c188      0xf7cf64f9      0x3a60d388
+       0xeb1e7a76      0xe7788522      0xf0fb39ff      0x5e9cfc57
+       0x76d58502      0xb432345e      0xeef3ff5d      0x380c0bba
+       0xfab7de41      0x7d0479f1      0xa82a18c8      0x9bea9dda
+       0x29daf1ba      0x0478713e      0x235875b2      0xb1e94931
+       0xf725e488      0xccbb3665      0x1d1e12f8      0xe3169ac0
+       0x0e353155      0xec0135af      0xb2f5bbb9      0xa1413c4a
+       0x32dd6a50      0xa613ce43      0x34e8b451      0x90e2975e
+       0xbd463ae6      0x530c5722      0x1e6882c5      0x375adec7
+       0x1193cc50      0xa6d207e8      0x4d1d54eb      0xba27d393
+       0x80e10ee4      0x79bb8587      0x49bd8647      0xea7617ad
+       0x624ff2a2      0x71a1fd3a      0xb241b33d      0xf1ae8102
+       0xf491156f      0x0f2ea561      0xa324bc38      0x2f7ee0b7
+       0x00636490      0x25570a6e      0xefadb85e      0xa6d2d3a1
+       0x157c3b64      0xd2ff1c1a      0x69ac4cbf      0x87d4fee8
+       0x6aba8dd1      0x22d2a609      0xf8a2bbb9      0xbd2e4b14
+       0x70b1ef68      0x27ba55cd      0xe9ce37ad      0x28d8ce39
+       0xf87da8c4      0xd5f87821      0x7ecb7dca      0x85f3c622
+       0x7d6cc927      0xf8475902      0x08c72487      0x14075f9b
+       0xf38c8386      0x5589faee      0x6fb3277f      0xa33daafd
+       0x463ee430      0x452c08ea      0x5a971195      0x8d58224e
+       0x76d0bcf7      0xd477f886      0xb4afa33e      0x20db6f47
+       0xd3f06a30      0x94a45d9a      0x17d13401      0xff77b1b5
+       0x3f5b358f      0x695a48ce      0xfd6d6011      0x5d490878
+       0x89e9b0a2      0xe5d579a0      0xa6b9d30d      0x689b78e3
+       0xd54559ad      0xf4faa8da      0xb39c5d09      0x7d087d64
+       0x6d61c287      0x8a57fce1      0x21e247d2      0x67c79473
+       0x4e0d7780      0xa8a7b8bd      0xbb4bcc3d      0xd5e9398d
+       0xb9520607      0x634867a1      0xe2499ffe      0x659217b9
+       0x661b2857      0x653dc708      0x0c43a1d4      0x7fc3d14a
+       0x2a9ea2b1      0x8ae5ea88      0x150f8219      0xcdce21d6
+       0x942a487b      0x969bd34e      0x9e7f4407      0xe2a26c6b
+       0x7129d6af      0x94869bbf      0xf65154a2      0x2ef48faf
+       0x0602abd7      0x21755d3d      0xa4b8ae1f      0x37d4ced3
+       0x29c5ae07      0xbb1196ae      0x658c8ff1      0x4cec0ccc
+       0x604acb40      0xb1cd3d35      0xac4486bf      0xac3113d8
+       0x45b82f3a      0x7d18f6b8      0x1f40801c      0x38c2afdc
+       0x69435265      0xaf338c8f      0x37472b04      0x90f05195
+       0xd94b6110      0x72e45ffb      0x0f985a7f      0xcaedf2da
+       0x2f941a33      0xff093077      0x2ff5741d      0xf3cd640d
+       0xfbea8b3b      0xe88d69f0      0x1868e3d2      0xde237ce5
+       0x0e87e8a4      0xeab1ddf5      0xb402b367      0x623ac9ad
+       0x0c3b6838      0xfeb50a00      0xe7b21c55      0x76a28adf
+       0x14563da6      0x9e1999bc      0x163831cc      0x48187995
+       0x041e1368      0x7b20c89b      0x3e8f237c      0xff90dff8
+       0xaee1a97b      0x54665385      0x80577ab3      0xce8ce668
+       0x3911cf3a      0x80b3354f      0x759f967e      0xa9c81de1
+       0x361abb2f      0x3f413da0      0x74214313      0xb7a9e9fc
+       0x340ca8b3      0x37172ad2      0xad3270ad      0x09be725d
+       0xadc54991      0xdab7b984      0x0f13dae5      0x76268ed8
+       0x59060e51      0x1f5c0188      0xb6b4c162      0xde7b2c61
+       0x86bfb062      0x9e22d595      0xfc307f39      0x1630f78a
+       0xdf479d05      0x52dbe41b      0xfc4dc8ea      0x208f1808
+       0x32e07fd1      0x52c02977      0x8024fca0      0x801110b2
+       0xa2c7b65b      0x32a59164      0x4242212c      0x47173b8f
+       0xe14769aa      0xa60dea63      0xdfb10ed7      0xf2ae55fa
+       0x152829f6      0xb48d4237      0xc9a6874a      0x96c2e600
+       0xf6af04d5      0xa190d45a      0xe70fd3ef      0x44f23ab1
+       0x3e855121      0xc0110062      0xd1f3edc7      0xba502f36
+       0xa631d8e4      0x61e84d5c      0xff62a94e      0xb95ed76b
+       0x59839a61      0xb85ea38b      0x2c52ce8c      0x299bcc6d
+       0xa4093132      0xb7adee0d      0x2aa2e418      0xf3901449
+       0x8bc8db20      0x9ed30a6d      0x079de39e      0x85c380d4
+       0xf8ef66a3      0x3c4b3f4b      0x9bf5c780      0x32bd0dc6
+       0xf3b65908      0x6cd47c06      0xf63419b0      0xe4e44829
+       0x808b5e12      0xc9b0a33b      0x2147c554      0x352284bb
+       0x7b94105c      0xe3bb1add      0x6bd5f31e      0xd5ebdebe
+       0x56e01b27      0x0748c388      0x09281d79      0x2e68aecb
+       0x469e3040      0x67aad95b      0xa7354ffc      0xfe80f193
+       0x8dbf794e      0x3e15ffbd      0xb0eb2fc0      0x7ddf7747
+       0x81b3ba19      0xb0a2fa5b      0xeaafe060      0x7c292897
+       0xbada5f5a      0x6d3dfdf3      0x781d390f      0xf7e3f51b
+       0xffd969f4      0x7e72612a      0xa3625a5a      0xbbf34741
+       0x32680cd1      0xa79443f6      0x1caa178f      0x3f255b46
+       0x64fa6137      0xf37f8333      0x38bc8f8f      0x974d2fb5
+       0x85d49900      0xb6a5cb6f      0x5ad85aa3      0x0f5e6477
+       0x44e86ace      0x8f21b385      0x68ad33e1      0xcbc88a7b
+       0x1bf62264      0xcb53aa08      0xe6a953da      0x038224bb
+       0x184f666c      0x8cebf64b      0x73d34e9e      0x7c87c559
+       0xb130264f      0xc8094a11      0x6c8cb034      0xc4c408a9
+       0x6e999fc5      0x60edfc21      0x9d4053d7      0x17f7c225
+       0x161979cb      0x73cc61b5      0x89ea22b0      0x7887803a
+       0x73859bb7      0x4b27c011      0x08e70c9b      0xb909a1c3
+       0xb2bfea81      0xc5141b9e      0x3e0c43c7      0x12dc9fa0
+       0x35701e3f      0xd2c4f6f2      0x98eae649      0x6c783fd2
+       0x9ccf062e      0x1470ab42      0xdece3ad3      0xb8a2fa19
+       0x9f5b8519      0xe3843a3e      0x1b9f3b79      0x51268bb8
+       0x9eb0eeaf      0x49994b14      0xd2743466      0x6fb954ba
+       0x4abc9b9a      0xc66fbebc      0xe2085c56      0xadedb2fb
+       0x45722ebb      0xe4bb7d10      0xb4978709      0x226a4d7d
+       0x242c08d4      0xee93fc4f      0x931b3c37      0xeb62e006
+       0x82483dd7      0x216fbc42      0xd917981d      0x6087b346
+       0x11a54983      0xef1e3307      0x1b588a7e      0x63fa27c4
+       0xb8017cc7      0xb24a8cb7      0x7e879647      0xdc7da4b1
+       0xf74d6835      0xee620649      0xae190349      0x3c3d53be
+       0x1a4ace04      0x38002ea6      0xdc558ada      0xff3b1d52
+       0xce99f397      0xc07cdd81      0xae913e80      0x4d367dd6
+       0x13dc3349      0x8d33196a      0xbbf50e13      0x37f572db
+       0x36735184      0x09c2d71c      0x14c5a677      0x76bdda40
+       0xa48c2e0d      0x14e7df15      0x1727199f      0x795ca3d5
+       0x925b5bc2      0xcb97d364      0xeba4db16      0x7cf6028f
+       0x83755f53      0xf881fec6      0xde422b3d      0x1c085640
+       0x4f23865e      0xaff88fcd      0x626ea59a      0xf5598008
+       0x7b0ab489      0x39978fcb      0xa84191ab      0x7d2807ed
+       0xf13f4343      0x890ce899      0xd6f637eb      0x7b20e016
+       0x9909ebea      0x4bd59f10      0xbe7902c6      0x4ca3783c
+       0x57d2588e      0x2179ecad      0x85c05d24      0xcb28ee97
+       0x590771a7      0xe2132e7c      0xc640985a      0x4331a21e
+       0x6be5ddfc      0x7ec3441a      0xdea4685c      0x596106da
+       0x833b94a9      0xceb629ea      0x5a1375c2      0x41a23238
+       0x8d55d148      0xfd27d828      0x57c933ce      0x21729557
+       0xdcafe0e1      0x91b06e49      0xa6dd2635      0xcc3783e1
+       0x20e50577      0x2568a488      0xb19e1425      0x1ba20828
+       0x987bc2fc      0x62b33d70      0x1056e680      0x542b9214
+       0x49391384      0x62d6170f      0x97a84c89      0xa9911d9a
+       0xe0c98e8b      0xf6c81386      0xc7c46132      0x4a83d058
+       0x4fcebfc8      0x12441c74      0x6c87ca14      0x87f7d3d9
+       0x9cf008ba      0xa4f3735e      0x3506be84      0x3a6b6b3b
+       0x7477725d      0xade4f1ec      0x592ae374      0x310b0e6a
+       0x3e3ccb57      0xc4bfd2fb      0xcdbb318b      0x1299f706
+       0xe8636a17      0x7efec28e      0xf7661b8f      0xb900cd60
+       0xf222e768      0xabd23bb9      0xa1152084      0x2a26944c
+       0x3d8747e7      0x49e17fe0      0xc19ae63e      0xa6b070c6
+       0x81b07927      0x6e03984b      0xb117e26e      0xee1857ee
+       0xe24c52f5      0x74bb61bb      0x9d7aed8d      0x4c010020
+       0x1e3e3180      0x65287c0d      0x37481ec3      0x2995c17a
+       0xdfedb8eb      0x45c5c59c      0x9c18a582      0x6d8ac7ed
+       0x10425e79      0x18752f9f      0x1d8d3451      0xc7f2e2e4
+       0x282111dc      0xe6fb7f7d      0x6dc210d0      0x50c6769b
+       0x66e90a86      0x3257408c      0x828e3d50      0xe4b5033a
+       0xf24da685      0xafe664ff      0x39dc5b71      0x96ccb04a
+       0xbf3f04ee      0x5be42c4d      0x3f505e68      0x32c8c46a
+       0xf1db2ca9      0xdca7094b      0xd39ac464      0x334c2403
+       0x2a9a7716      0x67cf7b68      0x069e8449      0x2d809042
+       0x35fe0f2f      0xca17bacf      0x1005128f      0x3b05def0
+       0x07dede91      0xaf6c85b0      0x7e58e94d      0x053abdec
+       0xef24c1c5      0xad242374      0x0ba1890c      0xd02ebd41
+       0x0a46238a      0xd3e1c35f      0x769c6515      0x2a9808e1
+       0x95ab0520      0xeb575cf2      0x79a17f8d      0x0c51a77d
+       0xb38f3064      0x322097c8      0xc1b9197a      0x34473ead
+       0x13e198eb      0x5634ba10      0x8955ce69      0x31d88b5f
+       0x1e090166      0xed251efc      0xa7fbe0b8      0xfd4a7c35
+       0xfa96ee0f      0xaa31f574      0x105e4865      0xb5b10240
+       0x1fd08a0a      0x96199e4e      0xeff7c1c1      0x6ae9c539
+       0xe592cc17      0xe2c202fb      0xad368437      0xb76c8b94
+       0xbb330ea7      0x2b46e1c5      0x2dadc985      0x19fb2862
+       0xec3d720c      0xf4fbafb6      0x44804949      0xe547ef56
+       0xe2b5d0d7      0x82e45ad3      0xff5cc9c9      0xa34eaab3
+       0x618f8530      0xb743c062      0xbe48e157      0xcf1df31c
+       0x4eb314fe      0x84292218      0xacfa4098      0x2aaa1ad1
+       0x35611959      0xf59510f4      0xb9d585be      0x434ca16b
+       0x41b50b88      0xa8973b64      0xcf190fd2      0x59a7b2d6
+       0xc4ed282d      0x50069edf      0x2c6a1c74      0x7264fc66
+       0xc42e8715      0x866a54f0      0xcf850cc1      0x049fa76c
+       0xdb540cdd      0x5e975b4c      0xf4851211      0xebca9bf3
+       0x56ab93c7      0x6c3644e4      0xbbb3ce6b      0x9bd0886e
+       0xd622d87e      0x29ff56fa      0x7fedeb3e      0x11ca822a
+       0x964fd55a      0x64815d1c      0x5de299d1      0xc0344d87
+       0xe6f03380      0x2b76d1ec      0xdac63777      0xfc82f6f7
+       0xdc29bab6      0x3a345889      0x8e66f31f      0xa85c5b95
+       0xc3590441      0x96cd06e3      0xbde2ff32      0x886e770a
+       0x407078ec      0x6fb41a33      0xa2d809ff      0xae36137d
+       0x6226694b      0xf69b19b9      0x8994ec81      0x27a845df
+       0xf656a2d9      0x1468d119      0x2df7830e      0x307fea6b
+       0xff39ec85      0x067328fa      0x1a2f5fc4      0x0eb1826f
+       0xeccce43d      0x8eb43122      0xb4421608      0x857e02f5
+       0x0e812ce3      0x6323b5b7      0x34ead2f8      0x4df21513
+       0x8d9a0520      0xe7004fb6      0xf72e814f      0xf077cce3
+       0x6388e042      0x7d748151      0xdfbcbcba      0x7d172571
+       0x24990a40      0xdfd173f9      0x68cd2161      0x80f8ee00
+       0xcb7bf35c      0x73c33c94      0xd8b7c28b      0x42415b96
+       0x535e263f      0x7b5a4419      0xa869acdc      0x859832f6
+       0x63b51b84      0xf0ce1fc2      0x4827d03f      0x8279c75e
+       0x30e83aaf      0xc359670f      0x7373eafb      0xcd8a51cc
+       0x3158dbf2      0x65d7ce0d      0x136a500d      0x6fd3cfcd
+       0x852b3f5b      0x9c84fc67      0xcb3457bc      0xb207cd37
+       0x2b9f3037      0x1b58a00d      0x30afbc1f      0x74d983d5
+       0xb35a0640      0xf615013c      0x76280a97      0x8fbbed01
+       0xf3ff8b82      0x9c8bf7c0      0xb517c986      0x8c34973a
+       0x945590f9      0xae947cfc      0x9b973538      0xfb9d7dfb
+       0x82884287      0xbff22c23      0x3d55dade      0x365c76d0
+       0x62adf496      0xa48ef1fc      0x2723be5c      0x7ac930c1
+       0x318ce996      0x120e51fb      0x969add52      0x3b296626
+       0xc64c1c5a      0x7b016b62      0x76cbd18f      0xf405f9be
+       0x46c5b3bc      0xa3ad6071      0x32cdcbc9      0x0a45c65e
+       0x89f8db31      0x0406b13c      0xfc9a98e0      0xd8dff697
+       0x275b05df      0x7314b4bd      0xf21edc9e      0x9e00e055
+       0xfc9e094f      0x51893446      0xf7800e67      0xd561ef2d
+       0x78d46bd4      0x19809124      0x342fbbc7      0xbebad398
+       0x8146baf6      0xc138ec6d      0xfcda50dd      0xee9495b4
+       0x0db40288      0xd5142c64      0x0c87d513      0x2c4eee1c
+       0xac1f2369      0x6ba344e0      0x6c4c5ece      0xa8d9963d
+       0x2c012ef6      0xaa8fead7      0x60fa4d1f      0xffe820f8
+       0xa22a632e      0xc6bd0210      0x224e4f92      0x70534e1b
+       0x5644bfd9      0xfdf6a54c      0xdc9658ed      0x2fe412a3
+       0xa2089338      0x3e1d45c1      0xf834522c      0xb01e520f
+       0x89d771a6      0xe66ce704      0x0a2c6557      0xcbf04071
+       0xa835525a      0xba9cbc4e      0x39b3c3ef      0x322fa1f0
+       0x14e96e98      0xbf48a7d0      0x5924713d      0xafe81627
+       0x7dacc6be      0x20f04d86      0x27a86e2e      0x612f267a
+       0x25e4b39d      0x02277be1      0x0befb95b      0x326a18d5
+       0x454cb039      0x1912ec94      0x5913b530      0x640c81b0
+       0xd8200108      0x70e8513b      0x4cc67352      0x4180dabd
+       0xc13fea2f      0xb75d7e92      0x43e7fbd2      0x03970abe
+       0x0192c51b      0x12175a67      0xfd0d1e94      0x5173ab22
+       0x565f67d9      0xb7301dac      0x86647677      0x6579822e
+       0x2fca90c9      0x9da0ab9a      0xe5b95852      0xb43ef479
+       0xefde3dcc      0x340e0ce3      0xac979fcf      0x5458aec6
+       0x63160461      0x5f921027      0xf820c99a      0x80f97b33
+       0x7f3880c9      0x71338918      0x62000d9c      0x45329e41
+       0xf505170c      0x47b3cd69      0xe95c797a      0x9b2952ad
+       0xafd0d397      0x4c15bec6      0x226bf7e7      0x200cec22
+       0x8fa00cf4      0x20b0c8ac      0xf7050b92      0xf72cf1d3
+       0x2ebb18d2      0xbb8ae7ea      0xabb45dba      0x01b568e4
+       0x793203b8      0x037d9eb5      0xca8cb1e5      0x9af6c43a
+       0x16d143d4      0x0e9e3aa5      0x44c2efdd      0x54363e09
+       0xe03f2faf      0xe14ce314      0xd7b99c5b      0x8b2b7de0
+       0x2b6e3237      0xf4bab1e8      0xda4f5a7d      0x0ccfb320
+       0x227f341d      0x140cb1ce      0xaa4c0e73      0xe2cf4984
+       0x3bbb3256      0xda26cd97      0x02ec6207      0x7a16fcc5
+       0x19a6e4b4      0x38c7e66d      0xc305d996      0x75c3dd71
+       0xf194a65c      0xca3c29b6      0x6dfcb70f      0x9b740010
+       0xda469aae      0xbd36870e      0x6af28ae4      0xe7c67bc0
+       0xaf9035ca      0x036bb34c      0xfcc3b2ef      0xd2a7d218
+       0xdd90b078      0x442e5baa      0xfed6c529      0x6bb624c4
+       0xe82918fe      0x9bb882a9      0x69624c47      0x4250ab3d
+       0x041061ce      0xb83149e2      0xabae7385      0xc5b6f878
+       0x343bb149      0xa5bdad02      0xfa435cee      0xed9df83d
+       0xdf030bb8      0x53c8a719      0xb8517b7f      0xba6089d6
+       0xfc8500ab      0x44a26f98      0xdce8272d      0xfea017fb
+       0x5b949a03      0xc4865cb8      0xca02bd68      0x04be3de0
+       0x127d764f      0x0075fe7d      0x555862d8      0x0fdbb430
+       0xcbe88e5e      0xdf8eea7d      0x5f252637      0xab6929bb
+       0xfdf3bf28      0xaef26e0e      0x6f4a160a      0xf8ddb2a5
+       0xb77486af      0x7ce7af50      0xd59ae204      0xe638ad8c
+       0xb806581d      0xa131a882      0xee60c9e0      0x57bf2a73
+       0x1d55c2ff      0x0677bc2e      0x98e2203d      0xa4da3b89
+       0xd10df673      0x1890d381      0x44753e6a      0xd2374be4
+       0xe1515c4f      0x31398576      0xaf29a94c      0xc833e871
+       0x83114ae9      0xf1989533      0x3d6855ca      0x321bf2b9
+       0xf03339ad      0xf119e6a0      0x08518f15      0x4bb2a2f3
+       0xa1bc6a7d      0x4281b21b      0x6e449c55      0xf0a3a10e
+       0x67713bb3      0x0971da72      0x56c40a76      0x40f962cd
+       0x2b99cedb      0x515ef3ba      0x75b9941e      0x2dedb549
+       0x40f64c89      0xca521276      0xf99ef855      0xcb871c5f
+       0x5f8b0f1c      0xcec4e935      0x3181ef57      0x03f070d4
+       0x3adf04a6      0xf368c0f3      0x0cdd9ece      0xb42575e5
+       0xf3330c7c      0xddd7c228      0x1620149f      0x5e9c6ff5
+       0x0bb443c2      0x39c16e77      0xb7914a40      0x0d6e41a6
+       0x85b3aa01      0x8034fd49      0xf5cea432      0xa40aa8cb
+       0x0457fbca      0x1edf2904      0xe2888d23      0xe7c5fb31
+       0x144fdd01      0xd05b38ec      0xbcbdb172      0xe72e721b
+       0x2dd4f673      0xf2b06bd6      0xe8744ed8      0x1f71445a
+       0x06735a89      0xb90a30d9      0xa41c3576      0x4771da3b
+       0xebb3be18      0x3063dc2c      0x6c37a2dd      0xd4e46133
+       0x2f2229b6      0xd86d3a9b      0xdc6fe0ad      0x53e6ef27
+       0x50610504      0xaa8ec2d3      0x1053e00b      0x1f7fb19d
+       0x52dddd67      0x4087cb7e      0x79983df6      0x25b89a75
+       0x0c273f72      0xeeb6038d      0x87912056      0x89d2c60d
+       0x0f9a3f89      0x466e87aa      0x81d7fb0c      0x19c4a20b
+       0x3a6d7f8e      0x7a3a853f      0xdb590879      0xa235d07f
+       0x61af2785      0x3b3512e7      0x98553ffc      0x7fe687b9
+       0x94857fa6      0x163e3e92      0xebc32498      0x27a7647c
+       0x83199806      0xe4b57b69      0xbfbec239      0xfb9f96b4
+       0x006d96ad      0x5ebb9c81      0x91d6fc3e      0x22c7d324
+       0xd3867a5d      0xf3e3c0e5      0x9396ac42      0x3e4f877c
+       0xd3713f68      0xaf65a501      0x12751ee6      0xb7657c74
+       0xe8ab984a      0x20c7148c      0xcbe78866      0x7e26ae0e
+       0x8f8dbe32      0x635c0335      0x827ec430      0x1eb65a86
+       0x2d920987      0x99b8f206      0x51794ca5      0x98d23276
+       0xa14ad870      0x01a25d21      0x6d9ded56      0x84a98da8
+       0x5241feff      0xeb0bd44c      0x7ff0d5b2      0x4eafd901
+       0xc4e5240e      0xd83a508b      0xda780274      0x2c9d31fd
+       0x16a956e4      0x80ae7dd0      0x5e2996d0      0xe0f2c8db
+       0x41f3b936      0x7097159a      0xdf8c2891      0x75d437b9
+       0x33e6812e      0x028c0693      0x73ba98b3      0x286e2cde
+       0x30dcc32f      0xfba1b8fe      0x0838f6db      0xe4600b0c
+       0x71b37e93      0x8aa32674      0x60efe98e      0x5f2aa8f3
+       0x4df96b2f      0x448ca812      0x08de8250      0x4e589a07
+       0xb1a2b4a5      0x61cc2f70      0x0ab48797      0xb8fe2fbc
+       0x41b6b009      0xd7f4f2c3      0xed49ddaf      0xaf41e8df
+       0x16f3072d      0x3dbc5bfa      0x100b0ac9      0x975ad110
+       0x5b8ba1c4      0xfb2cca87      0x5364fd70      0x657860e5
+       0xdfb66039      0xb1bb5c7f      0x78ebed1f      0x5cd6d055
+       0x783ae62a      0x770d974f      0x1ca3db3e      0xdc89476d
+       0x0b92b39d      0x6edb3fc2      0x7d197db3      0x9c153321
+       0xca82f11a      0x6ad3e144      0xc8919523      0xa904d663
+       0xc6fdbeb4      0xf31202eb      0x6973e94b      0x999d0bb4
+       0x1c00e7d5      0x3b7b3236      0x16fe019f      0xab063227
+       0x55daad0f      0xe8d8ab3d      0x0120506c      0x5b33fad9
+       0x2c5d9889      0xbc51eabb      0x7275a262      0x68c00c03
+       0xabb720b5      0xad59c4eb      0xbc5ee111      0x13e8db52
+       0xaa30b3a0      0x80c39f72      0x8e1e3556      0xd3b2ff26
+       0x1152fd6e      0x68986c71      0x6eec49ee      0x22f1efcb
+       0xf04877fe      0xad046796      0x2c0cfea6      0x856f41d7
+       0x888f2cf2      0x210913c2      0x18b66f8b      0xd8f1e849
+       0xffa3a144      0x2fbbe18e      0xdc2ee3ae      0xe4bd602b
+       0x4a57bb4c      0x103bc8e0      0x8a28d26e      0x8d5420b8
+       0x59fdd406      0xe00e081a      0x5fa22cef      0x7b27cff5
+       0x9555bd01      0x7cb74723      0xffe1debe      0x6ce4be13
+       0x7208420a      0x59dfb6d6      0x8a7a3727      0xb5fcc8a4
+       0xc2c47307      0x32dfc132      0x58555a84      0x1626ed76
+       0x1bc4930a      0x573ca725      0xdaf844e9      0x86412ed9
+       0x56edcc86      0x7ce7d86a      0x3549ff0c      0xabb32f09
+       0x142ae7ed      0x44a43c09      0x30f08a59      0x7d7ffd78
+       0xfc45e227      0x54eeb32f      0xfbe758b1      0x7c9b1c98
+       0xefefad06      0x0838c92e      0x9bd7a069      0xf6f71a42
+       0x65a2e5c1      0xeb8186fb      0xbf3c93be      0x30f3720d
+       0x4dcf7a73      0x5b1feac7      0x55ebeaa4      0xacbce709
+       0x85b24a81      0xf8003552      0x92296135      0x9c2343e4
+       0x04862757      0x24378a91      0xc2a37ec3      0xbecf299b
+       0x7950df1e      0x9e02ba86      0x7cb3d764      0xbf332b0f
+       0x305cb8ef      0xc96e973e      0xc4752d94      0x0d280865
+       0x6dd06208      0xf7c0decc      0x9f62a7e4      0xa22b9e4d
+       0x566ecc24      0xcd532672      0xe19697cf      0x31b5425d
+       0xbab80fe0      0x23338ddd      0x26469603      0x2b9c07da
+       0x86bd404a      0x1893e429      0xc84c9c31      0xb871978e
+       0x2c8dac0b      0x3afdc81a      0x66de70a7      0x0c67fcc1
+       0xb8dc0dea      0x537e7511      0xff031a24      0x7015e67c
+       0x34c12ac7      0x885268c0      0x538071e9      0x7117a5e5
+       0x5b9890a1      0x3a35a5b2      0xca0669bf      0xeb9be8ab
+       0x0514816b      0x0d615a31      0x37bc09b3      0xb6ef53d4
+       0xef635599      0x317ad54a      0x523537f4      0xa00a245e
+       0x239cd535      0x64ab16e0      0x7529df8a      0xca7cfd72
+       0xefa62c3d      0x8f3c7c78      0x8a9525a9      0x2449c3fe
+       0x04b4654a      0x52405702      0x92740c4f      0x889c4c86
+       0xbb433c1f      0xd35a81a1      0x09055603      0xa6630465
+       0xbf0728ec      0x53657965      0xbb2e694a      0x7fcfaea0
+       0x9f815c41      0xf2a9a2c3      0x1b32bd79      0x4ab37a04
+       0x396510dd      0x0595d343      0xbe46c057      0xbc70707a
+       0x479c2fe2      0x8772a36c      0xf6226f97      0x8f879773
+       0x58d1bf88      0x346f90b8      0x5adf3ae9      0x366e21d6
+       0xab951c42      0x5b441472      0x3586083b      0x6b09c693
+       0xa543d9f6      0xa35f002d      0x7349c6e9      0xd0d9297e
+       0x5ac3da84      0x1594a70d      0xe36cf8ab      0x52011943
+       0x1133cb9e      0x31721c1a      0x689367f8      0xc36e0d34
+       0xb40cd03d      0xcb4a6560      0x6fde32d1      0x3cc41337
+       0x6edadb0f      0xeb94107f      0xbdce6c1c      0xb680fea9
+       0xee5705ed      0xe8ccfd9a      0x4c2e25cf      0xaec446e5
+       0xadedad15      0xac083684      0xc09c7576      0x18500d6d
+       0xb35975d7      0xf79b4b3a      0xcc9bbf01      0x3e1c48d5
+       0x950f8ed5      0x9754b7d8      0x37a3793e      0xdec7767c
+       0xbbaf41e9      0x8c630cc4      0x4ba3442b      0x9fafa156
+       0x69d7761a      0x4a77c503      0xd735e8c2      0xd503278b
+       0xe58a4ebf      0x87b10dae      0x390a5e9a      0x14e29966
+       0xcc713fb5      0x9ce6327a      0x6010165d      0x4cc1c54d
+       0xbd12d6ba      0x775c23ad      0xddb84211      0x0f3a2878
+       0x434f4580      0x34f88ea4      0x89321b73      0x1b8c7f98
+       0x1f3e1e48      0xc4408ae0      0x5a654fe2      0xa676c04c
+       0x070b59e9      0x9b94a087      0x7a5ca30e      0x7752a2f1
+       0x1723f5bb      0x3b40c24e      0x83e91275      0x644863a7
+       0x514305c6      0xf17497e4      0x31a29711      0x75df2066
+       0xdb9dd12f      0xddefa292      0xf227d2af      0xee3984d3
+       0x564af7a1      0x470204fd      0x9490c3c1      0x58ec98a3
+       0x506d606f      0x6714b347      0xbf3b9bbc      0x3bd1fc29
+       0x91a5c7f8      0x6adbe076      0x42910be8      0xa33f4e12
+       0x5978d19c      0x1bda9fda      0x52358b20      0x2cb124c2
+       0x8a9407b9      0x003dbd72      0x95775e44      0xd3cdb943
+       0xd8944191      0xd34784c4      0x49355f80      0xe0e905a7
+       0x16b19416      0xe9ad85ab      0xac510c84      0x8763b3bd
+       0x86cc1dca      0xa0c0431f      0xef2cc448      0x7356ebdb
+       0x4bbc2a4f      0x8c4b2d83      0xa454eb11      0xf2554402
+       0xb2221af7      0xf39a006d      0x1f40db2e      0xcf1b4b24
+       0xe6ada442      0x5715edf6      0xbd88c5fd      0xf8370676
+       0x6374fa3c      0x21c43044      0xe09eba2e      0xd13121bc
+       0x235f2e18      0xe920486c      0xd6d3ed96      0x3e65592a
+       0x35b28b3e      0x968288f7      0xb1a8f263      0x2a095921
+       0xd733dd90      0xc27f602a      0x57526980      0xbcaad755
+       0xde77b9da      0x8b6f33c5      0xc6977d38      0xe0898599
+       0x665dee18      0x2af9bdc8      0xa71446d1      0xac3733e3
+       0xcd300da1      0x100af68b      0xe8ef9fc5      0xb328cd95
+       0x595c7a2c      0xc33cbba8      0x45f779f9      0x84429560
+       0x82c4b759      0x628472a0      0xa7aebca7      0x1f4d3017
+       0x9dac2596      0xbb573467      0xd474a54a      0x7b0f53e6
+       0xb931bc25      0xc3fd70d7      0xd7ec2eb1      0x2d537c85
+       0xc718e6a0      0xf8e50b5a      0x4eca90d9      0x9d839c71
+       0x23d47a3d      0xdff0d61c      0x6d04a0e8      0x0e166309
+       0x2af6917d      0x0a1252de      0x7a62f303      0x5c2e9ecd
+       0x7ac2223b      0xdce1ab0a      0x9e9cfecd      0x702a1549
+       0xd2262e68      0x52c93a56      0xd45432ed      0xe43cb580
+       0x2807a30f      0xc0aa2425      0x78ee782a      0x03ff6460
+       0xd3e351ff      0xafbbf095      0xfe016746      0xfb3dde4a
+       0xc0a78518      0x0f531fe1      0xec2b4f14      0xec05892f
+       0x01a2db8d      0x76a8db65      0x95080291      0x68cd235e
+       0xd6046324      0xc562bba3      0xe6b2eac7      0x9012954f
+       0x7918aaa0      0x34c21d45      0x3235dfdc      0x6c3e5b04
+       0x3aaf4137      0x8932ab1c      0x58b18c4a      0x2a81d2cc
+       0xa70d05fa      0xbe0b315b      0xb3ebf1ef      0x5ffb7ac3
+       0x887325e0      0x004a96c5      0x45dc30d7      0x38c52d24
+       0xca444ba9      0x142402d7      0x4a437132      0x463f40f8
+       0x5c40858b      0x90822d4e      0xc8256844      0xbcfb6faf
+       0x357b0e86      0x5110fb28      0x114a531e      0xc322c375
+       0x18cb1cd6      0xf0859c76      0x9a165fdc      0x4112bcae
+       0xf7093213      0xe8b29412      0x1da7320a      0x7faba7c1
+       0x57978831      0x45e74710      0x8ebc83d7      0x32116337
+       0xdead9fcf      0x77c48252      0x18e3becd      0xae616db0
+       0x8f5c4cbc      0xe7f7a56e      0x60e216e7      0xe2414c4b
+       0xeadc1dab      0x81d54f1c      0x230a9758      0xa695cf15
+       0xf40bc8d9      0xbdf2c94a      0xdf5986ca      0x3805965b
+       0x4ba27c7d      0x4569d8db      0xd9fd79a0      0xf22f0afa
+       0x16bb1d8f      0xc0759fe8      0x8c43e99a      0x75700859
+       0x9ffe4ab8      0xa570f2d0      0x524e3a01      0x56dad32c
+       0x85d55e45      0x85d881e9      0x3a93e5e6      0x89b03991
+       0x0bf7cf97      0xbb2166fc      0x71db8270      0x38ba2fc7
+       0x9921e2fb      0x8d590f34      0x6dc126c6      0x83bf3833
+       0x4b610fc7      0x5ea14f5b      0xabc0b232      0x621b6371
+       0xdbac1530      0xabded327      0xadc1bfe6      0x2c1700f3
+       0xed5fd6fa      0xe589d956      0x4e313ea1      0xcd3880fb
+       0x975aa904      0x4c69a30d      0xa1b36534      0xd9fbd174
+       0x81160863      0xed25e4c7      0x04856f8b      0xbdbd0e25
+       0xe77bbe49      0x58f747ea      0x1e152b06      0xc81f5552
+       0x663870d2      0x5690f730      0xac123619      0x82f38298
+       0xad13cb79      0x8b139198      0x8b990c26      0x46f43a42
+       0x13295bf9      0x14692be0      0x5aad4b0c      0x0170eef2
+       0x9e6d43b1      0x3f394d21      0xa9bb5969      0x2e55fc16
+       0x571cc833      0x2d3b886a      0x3fbdd241      0xc2f692d0
+       0x7934aeb4      0xb4758a91      0xec7840e1      0xcbeb4483
+       0x49d89230      0x8acfcd21      0x78db849d      0xdb89bc3e
+       0x23008191      0x0cf22895      0xa4f37634      0x880df3fd
+       0x6b21779a      0xe1b21abc      0xe9ffecd3      0x6b03d356
+       0x1dc13c44      0xd47e5606      0x39a45bac      0x2e0d0d43
+       0x3f6804fb      0x39184454      0x519c8340      0x3aa1de30
+       0x230bb743      0x672c5a77      0x1578491f      0x66ea9f3d
+       0x91290f01      0x241bff3a      0x96ebf092      0x800e8a44
+       0x386775e4      0x4044777e      0x32c90a90      0x091f1a68
+       0x4c3cf321      0xff7c5bcb      0x6449fb26      0x1678b234
+       0x9ca07a55      0x73bed56b      0xae871520      0x56607c8a
+       0x3d891862      0x91465f3c      0xba0a008f      0xc12647ea
+       0x3ed57a74      0x20511850      0x1dacfbbc      0x1be85a51
+       0x7c4dc3a8      0x8bf69d64      0xcd12a3af      0x7f7a8947
+       0xb782d3fc      0xd3baa39b      0x654a6f2c      0x4e8098b7
+       0xeaa2a9dd      0x7b1444fc      0x1b17a8a3      0x5477c47b
+       0x98e3989f      0xb165aad8      0x934b1a26      0x3c7396df
+       0xa0df197e      0x88402f6b      0x633b4c8e      0x188368ed
+       0xdd6ef1ec      0x10ca68c3      0xed9a9849      0x56ef27a2
+       0x25746244      0x1b5d1e76      0xbfd8715c      0xd6c1c20e
+       0xe5c5051f      0xcee2f685      0x3ad9bffb      0xf02b5544
+       0xc783883c      0xb0c08788      0xc08d85f8      0xb654b840
+       0x3801673c      0x5035928d      0x90072396      0xfc6be60a
+       0xe1d91fff      0xd4cf7946      0xa989e61f      0x6eb27707
+       0x7064ec46      0x66ed5e3c      0x7aaa6163      0x5a5215b0
+       0x1250fe8e      0x98daeb89      0x06227be6      0x926fda4e
+       0x1e5af2aa      0xcf54d342      0xb4f987d8      0xf9f691e8
+       0xa196fec3      0xf10e03c5      0x712242d8      0x516d1dd9
+       0x661ce323      0x299bea81      0x5da0a1f6      0xd4efe590
+       0x233a872c      0xde7fe938      0xa8489405      0x80cf8506
+       0xa14a30d0      0xfe0204af      0x8ec1eb33      0x45a33913
+       0xe8f5f0a4      0x7ded8dc5      0x9bcbafd5      0xf8db53b2
+       0xde7a9a19      0x2068398a      0x998c9e42      0xf83bb18f
+       0x0abca1ed      0x6af92508      0x93e5d447      0x35a52d69
+       0xee4d6b03      0x14b8f5ab      0x07e664e3      0xae5ebffa
+       0x8a9ad0f8      0x9c61e029      0x623cc5c6      0xf53f8046
+       0x299cbea5      0x329d6311      0x9d29e239      0x97254322
+       0x1ab51d60      0x6a420e7f      0x9e839b09      0xfbfd0f9d
+       0x71e79e4c      0x64db79aa      0x48312fc7      0x6aa6c163
+       0x69f5a669      0x51897ab7      0x5be56db7      0xff28685d
+       0x2bf568f7      0x2f397f8c      0xe2bd5c24      0x772d8c86
+       0x72bbf518      0xa7e00c91      0x9ce87bef      0x9a87adf7
+       0x98a234f4      0x98e6efad      0x6488536a      0xad7f3401
+       0x1965ab49      0x15f073c4      0x1a40b820      0x8701f688
+       0xaecfea30      0xf2710d99      0xf707183c      0xbabfa4e5
+       0x3c656c1a      0xc7871ed1      0xb7e38fce      0xa17c51b7
+       0xd136159a      0x500db2ac      0x6beadfcd      0x9e250948
+       0xd48185e0      0xea424945      0x3fd0ad9f      0x692c55de
+       0xb546a831      0x15ceca7d      0xb96f7585      0x329567c5
+       0xc328daa8      0x795bed48      0x8d589ec1      0x59c5039d
+       0x69b9df49      0xa3a9bca0      0x33f21d47      0xa5b4c884
+       0x1524d082      0x04b8e6ed      0x2cfac981      0x8b2bf91f
+       0xb65cab78      0xcaed7635      0xdf50f8d2      0x8d9894b2
+       0x2c7dd4e1      0x2f0ba31a      0x8a2ad05a      0xf020143b
+       0xd6443af4      0x43d99a7d      0x5932a8ab      0xf439abee
+       0x358c39e0      0xc948bdd6      0xe0a23f1b      0x6a3f975d
+       0xd0869563      0x2091634f      0x25a37a45      0xc98b748b
+       0xb4c07888      0xadf3c21b      0x91aa6e90      0xd301e5b2
+       0x831e9921      0x5cf2d88a      0x3d875085      0x3fd7e37b
+       0xd80ee010      0xd61d0af9      0x300dcd8b      0x65fc3adc
+       0xb62e5c17      0x570369ec      0x413f3135      0x4347b1b9
+       0xa653d898      0xa374f9b2      0x5ea98269      0xb85bce61
+       0x3c94ce20      0x671ce756      0xf8840f0f      0x870554a0
+       0xb2aa3364      0xd4ee24bd      0x4c0a73d5      0x2b700d83
+       0x8adaee09      0xfe9ec1b2      0x5d2a21ae      0x1e1d5cd3
+       0x1ba3e0cc      0x5a940afa      0x2d4b46f3      0xaad74fa9
+       0x1dbdb7a9      0x451f3977      0x4cba6d31      0x56fb678e
+       0xfbfc193d      0x0c7973d1      0xaef4a731      0xfce12223
+       0x11357778      0x83979d22      0x0194c5f5      0xce3dde5d
+       0xeebd0bba      0xa0a07102      0x79539b0f      0x13bd2dbd
+       0x6333c870      0x796b06ba      0x14470ee3      0x2780d6ea
+       0x5dbc7ec2      0xd0c1948c      0xf82e5a52      0x929faae4
+       0x53d79d6b      0xdec7f7e3      0xc0b80845      0xc8b63c35
+       0x4ddb5449      0x7073c226      0xf207efd9      0x69b680ba
+       0x22b7258e      0xd55168a0      0x9ff88d23      0xf80cf9e0
+       0x95a95370      0x51bb4bdb      0xc743f83a      0xfc668525
+       0x6246454f      0x1665241f      0x44216a86      0xce93a0a2
+       0x6078e3a4      0xc6691a3d      0x238c4ddb      0xe3eb70f3
+       0x6214f1da      0x6d86378e      0x0c904f40      0x5e813cf2
+       0x27ad8a9e      0x27d81514      0xe2fd4749      0x8620e50f
+       0x1316acc7      0xae68b637      0x148be177      0xf558c991
+       0x8e25a2a4      0x0e5919df      0xd9f19ac7      0xc6a0c708
+       0x042cfade      0x06770c05      0x5a76957e      0x587fd2f8
+       0xb31370d5      0x828ed6cf      0x0f3b1a8e      0x1779a530
+       0xd3b1d8a8      0x0d5aae00      0xa982cd22      0x7b82472b
+       0x8056c1e1      0x226f6f6c      0x0fd80cd3      0x97d96da4
+       0x61805e7a      0x84df2731      0x5c999636      0xf46741ae
+       0x5bafac8a      0xf871d4d9      0xde6ad6b9      0xcab5859b
+       0x77f78bcb      0x2e7a51f5      0x94e2c9d4      0x22d39537
+       0x3b3d07ec      0xb5f392c0      0xbcd94eba      0xce1fb95d
+       0xca716f56      0x5a8f7c2d      0xef9de54e      0x08845d4c
+       0x767a59dc      0xfd170b05      0x05027d26      0x1f806f78
+       0x5b66a678      0x3e137ea6      0x01e7fc4c      0x76df5d65
+       0xe9cf9ef7      0x2af76225      0x2f42dcb3      0x28a8858f
+       0x0e15b08a      0xd4e07b3c      0x02c4cfd6      0x8f2dae02
+       0x973c6f32      0x5e9dec57      0x69c641c1      0x78bec8db
+       0xbd5bc82f      0xad39bc31      0xcb10aa49      0x27ee22ab
+       0x2dedabca      0x30789cce      0x2a215f15      0x05ea393f
+       0x69757b87      0x787e3b1a      0x9c7b25e8      0x151ea785
+       0x25c93b80      0x4bf5cbc3      0x73cca060      0x6c00be42
+       0x967ef3a8      0x6293519e      0xa1007d65      0xa4ccff75
+       0xc69c8843      0xf96b8b73      0xbf338ffe      0x2750acdc
+       0x87fdbc7f      0xa0832263      0x90cb0912      0x54264748
+       0x26c87710      0x143a9d62      0x37be9819      0x7d3b4fbd
+       0x9af2eb14      0xc83b0d46      0xee1c4432      0xe156c2e6
+       0x49d5f472      0x124f050b      0x7fe3af42      0x4aee49ef
+       0x74188fab      0xca15c353      0xe774845a      0x04e7310c
+       0xdd6dd6ea      0xb5a6d613      0xeb9b77b8      0xd5947bf7
+       0x6ef9eafa      0x3aeb45f8      0x49351d7d      0xa072f018
+       0x7483e5e6      0x6f13b68b      0xdebdf954      0x50b4385a
+       0xbd5e9f33      0xfb744026      0xc1f830ec      0xac83bf60
+       0x76a9ef51      0x32d18f5f      0x795f2e19      0x6f7fa556
+       0x99c7aca1      0x69381821      0x8d44d1c9      0x948c584a
+       0xd0be173b      0x4030e8d8      0x3651bef7      0x83248705
+       0xbcb4dfaa      0x431de6ce      0xb2503d15      0x1169e47f
+       0xd213aca1      0x745ae622      0x5b56bd12      0xad126322
+       0x54704fa2      0x694f056a      0x49115d92      0x3d807e20
+       0x47632e77      0x1311112b      0xbf06daad      0x95aa4cc3
+       0x9aa92f52      0x65d57230      0x88f7aa75      0x54a57a2e
+       0x713be92c      0xbb8b3684      0x9dfecc66      0x448d2c0e
+       0x3f9883f8      0x9652fa29      0x68860bdf      0x011d897f
+       0x4b0829bb      0x4cc674b8      0x01f13646      0x00a488ec
+       0x65501a3e      0x88e128ec      0x827ec0ea      0x4b5175f3
+       0xac5cccef      0x438201ce      0x79ecd144      0x469c28e0
+       0xf91af7dc      0x97371a54      0xe29260ff      0x13a9436e
+       0x311a94a4      0xa4da86b6      0xe18b73e9      0x8ed1854d
+       0x057da825      0x34228358      0xb1063f97      0xeda2b117
+       0xbc542204      0x7cc094d4      0x82c1f257      0x34d4ab20
+       0x0e505a65      0xbb0f2cb4      0x8e5e4b64      0x67c2880d
+       0x209583cf      0xdf65f51a      0x25eab3ed      0x4b2d2ff3
+       0xbb137ce7      0x244be9a1      0x0a652ef9      0x3dd71282
+       0xdc02f2a9      0x809f3ae4      0x17b30a32      0x9ce532b5
+       0x7bde0397      0xb60616bb      0xffddcb18      0xf6f4be58
+       0xcde163e8      0xd1ad7114      0x8cb41a81      0x6f02b845
+       0x269439a9      0x70172077      0xb6f09684      0x28400ccb
+       0x48aea720      0x2e1d720b      0x6b7799b6      0x3cf03de8
+       0xb3ff42f2      0x3eb07288      0x90755be8      0xfb7b265c
+       0x0a4fdd27      0x0efabd18      0xc043b53e      0x8e0a35cd
+       0x57218045      0x66b0d97b      0x4641544f      0x889a0b79
+       0xaca4b9ba      0xc226cded      0xf8089e7d      0x18416a78
+       0x5085bf5a      0xa89f9cb1      0x588226a0      0xac3935c7
+       0x68cb7d75      0x74853fb4      0x8ee36c87      0xc72986e8
+       0x9d8aa967      0x509c1eb5      0x4d4ef31a      0xcc4f612c
+       0x709b7b77      0x5c108a3c      0x8a654bce      0x8aaf712a
+       0x398419f9      0x28cb7bdc      0xa90c4235      0x6c19408b
+       0xe0ccda3e      0x33202fc4      0xebae0f73      0x4278c68e
+       0x07273009      0x68931945      0xf9b50bb5      0xa43fc355
+       0x5fc9877f      0xde15c6d9      0xf3f095f9      0xf1bc971d
+       0x256ac91b      0xedbf0776      0x1f55cc83      0x3f422ff3
+       0x2498d1ad      0xfa8eda95      0x527d9641      0x99901d61
+       0x5c35e5ca      0xe8cffe68      0xe775e61f      0x21227b0f
+       0x3af6636b      0xaf08f8fd      0x39ba8287      0x127d3209
+       0x741bff23      0x52f5cc78      0x40e2f91a      0x51f0fa79
+       0xa942e22e      0x3ae5bcf3      0xd9bef6cc      0x455dd4ed
+       0x0b827356      0xecd8e59a      0xa80f1f2a      0xcce386f8
+       0xcfeb2982      0x13dd110f      0x607275ec      0x0c766ef7
+       0x3b4c1585      0x30cbbeb3      0x57b4ccf3      0xc063c086
+       0x7cf5a420      0xf50bf1e0      0x7e2092fb      0x6ffe6057
+       0xdbb47ae4      0x56a6d4c4      0xb47eb358      0x63d7b718
+       0x3cd7369a      0x92fdff12      0xfd869092      0x878665f3
+       0xff5a0256      0x42c2f259      0xf0cb21e1      0x658dcc4e
+       0x80e9f85f      0x4c1fc304      0x5a8f1d47      0x1abc0020
+       0xf0bb0522      0xf3294457      0xf5ea2f35      0x6681598a
+       0x14733bcc      0x212c92a7      0xfbc293b9      0x81b49d81
+       0x245d5926      0x9e58b86a      0xe1645ea9      0xeecb5059
+       0xba81810b      0xc53dfb94      0x412de939      0xf3c1b5b3
+       0x2e167708      0x3e74c972      0xfaf16b5c      0x57814119
+       0xbad6c81a      0x6e2935dc      0xf7a1f5ad      0x25b5bd84
+       0x9ddefb80      0xaa2b3a77      0xa9f91dee      0x9aaad6b9
+       0xbba274b1      0xb08d295a      0x8d84ba2e      0xb5fa3475
+       0xa8caefe4      0x09b2a662      0x8da4d199      0x194480ba
+       0xe89bf8d4      0x11e77f26      0x18084e74      0x37f48f62
+       0x7c3976fb      0x23b49e49      0xc3b5d5d6      0x25080932
+       0xb4e708e7      0x01503dd8      0xf9396ffe      0x2d9b1d51
+       0x94b14742      0xee6bc1a1      0xb5a2895c      0x1c914541
+       0xbe5980d8      0x86ed8a24      0x3d52a7a6      0x4c77d74b
+       0x8016911c      0x56b007fa      0xd1efce31      0x15326640
+       0xf5c053dc      0x7012707e      0xf183699e      0x7969c341
+       0x23b2103a      0x2fa21964      0xd549dab5      0x376dcd1c
+       0xb327b470      0x22b045ab      0x4b00cec6      0x241b2bda
+       0xf075633b      0x74d3fe57      0x661901c3      0x0fca71f6
+       0xda0cc159      0x1367aaf6      0x835816a9      0xfc98b063
+       0x7e9ca2df      0xbfe73c8e      0xa3834b1f      0x79614541
+       0x854853c9      0x95492fae      0x27603fd4      0x55e1e93a
+       0x25528bb3      0xd30bac22      0x1fecde8c      0x31002163
+       0x2f01d7db      0x8596ff2e      0x20f80182      0xc324f92c
+       0x1cd21542      0xbe094f03      0x9f43609f      0x50de10a4
+       0xfff2f867      0x46b43556      0xaa8ee529      0x1856d8c2
+       0x58656b90      0x3e7c2d81      0x8b4c6a74      0xf706c8f5
+       0xc41e8962      0xea262591      0x29c2e013      0x4422b666
+       0x86c7d6a4      0x5fa23c5c      0x32c2d31e      0xae72c75a
+       0xa3dd046f      0xbc7c5f37      0xed94a3a5      0xd9a22859
+       0x79d66f46      0xa6b4990c      0xfc49a056      0x74a1778b
+       0x73811c97      0xd24440b1      0xc626124d      0x23ef8511
+       0xa317d2b9      0xa5f9d7fa      0x326885b4      0x99e226c2
+       0xea78b5d1      0x6b58cb66      0x8b5be497      0x48e964f0
+       0x55ab4913      0x3301bf75      0x330e2743      0xd415a894
+       0xf38ed952      0x00e6e660      0x55d26c36      0x55f12ded
+       0x3846c0ab      0x63d58c09      0xfba15dd8      0x1e60bf12
+       0x62f5a93a      0xb5986564      0xb98be31a      0x6f66a4e5
+       0xdefdcda3      0x912fb317      0xf8c0488b      0xa4d941a4
+       0xeaa5a8d2      0xb1f035cd      0x95f051e9      0xe29d05ce
+       0x3e44b749      0x46fde8d0      0x39937696      0x224c3be8
+       0x5a232a7a      0x0ca9041a      0x99fad21f      0x0303cfb9
+       0x1a7643b7      0xd55d8c66      0x32060e6e      0xeda6ce0e
+       0x219c81be      0xb5433840      0xfdf82993      0xac80ba38
+       0x7772a04c      0x91f68bba      0xf42910df      0xad82db9e
+       0xb35415ae      0x1d40f2c5      0x1fd01178      0x6d7eb7e5
+       0xaaf2dffb      0x4779bf28      0xd36d0310      0xeb368a47
+       0xb8ba4d9e      0x58fc0973      0xbd9ee703      0xbf969251
+       0x1e35ae1a      0x447f8cb8      0x21757d93      0x1eb0dace
+       0xc6f846a1      0xfb64ec19      0x494891b7      0xe4d35c15
+       0xb9c50a38      0x89dd11fd      0x8bdc21f1      0x7343cf00
+       0xc3bf71d8      0xd9a8af87      0xe5dc66ac      0x1c7810e5
+       0xde98ce69      0xefd45cb3      0x6e32ddc2      0xfd6f4664
+       0x3dad71c4      0xe2fb9131      0x2b950f11      0x2f189912
+       0x0c7c01be      0x5f5dcf8b      0xf874aab2      0xe203451e
+       0xb224fa47      0x579de04a      0x997ea108      0x5fc8d34e
+       0x7bfb8a8f      0x6cb8ab68      0x7428234b      0xcfe16973
+       0x3ca221fa      0x100e1072      0x93cd8af8      0x0abc2b73
+       0x747b8f09      0x1427ec11      0x0d367b23      0x0ea4719a
+       0x1ee649e5      0xd1bab2c6      0xb46c9dff      0xaeefbee1
+       0x8de92617      0x7efb9ae9      0xb7542a1a      0x44a56df2
+       0xb757b1d5      0x60ca058e      0xc67417f5      0x137cf58a
+       0xb497b8a6      0x55affc90      0x6ad41636      0x47f53b8f
+       0xfa8af101      0x4e4af0fe      0x5b526ee2      0xf7e1d851
+       0xb2437be1      0x9d0d9600      0xd10b4e97      0xbd90a40b
+       0x966e0f4b      0x2cc630e0      0x5dcd5377      0xe4fc80af
+       0x6607c3e6      0xcc854f4d      0x65e70ef3      0x1aca994b
+       0x556e06d7      0xb57db273      0x906eb1cb      0xe5542c5f
+       0x45a0f2aa      0xa6066d4a      0xd11291f5      0xd9c392f9
+       0x05ae1288      0x569395f3      0x743327b8      0x742b1c18
+       0x795dff3f      0x00d635cf      0x0317a1bb      0x420a6ed4
+       0x648b926b      0xc3c1333e      0xd5e904dd      0x479bcfdf
+       0x8ae63fad      0xd71f204c      0x4c311f39      0x5cbdf76f
+       0xe5bd4205      0x00721bab      0x9569c091      0xc4dd5f40
+       0x739434c7      0xe6adb73e      0x34af4385      0x8627216c
+       0x9d357195      0x9d2f5112      0xbe543ed5      0x0e1037f9
+       0xddf7ac02      0x72ef5cb5      0xb8f6cbe6      0xdb1aa017
+       0x5889b094      0x05d80d45      0x2ade1d37      0x6716f816
+       0x94f6220a      0x53b4beae      0xeef5361d      0x17e7cb90
+       0x10c536f4      0x01cc42c8      0x587b6f85      0x783261b6
+       0x3e60d172      0x93d2a63a      0x20e44c63      0xa415cc75
+       0x6de5620f      0xad7c5e97      0x8ad48c9e      0xe1fbfe36
+       0x1385f1cc      0xbfc81bd0      0x7b8db259      0x00cc93e3
+       0xe79afef4      0xb245cf74      0xf7cf840e      0xe4f75bb5
+       0x6b5e5534      0x16919a9f      0x24933a7c      0x709a67a4
+       0xb06cc7bc      0x27d00d60      0x23eec9c1      0x2557aad2
+       0xd7b53016      0x6a626d84      0x837ac48b      0xfd58f0c4
+       0x9f0d275e      0xf6ff3e6a      0x608ce8de      0x69a82582
+       0xcb80c55e      0x0097ca1b      0x53a45277      0xc0d87cc9
+       0xfbbb2867      0x048a0b96      0x567bb875      0xe42cc027
+       0x1cfc40a7      0x6507709e      0x9e70a491      0x65ca4078
+       0x91473cee      0x009c0bf5      0x648566e9      0x191c8cc7
+       0x4fd72a58      0xea4823b5      0xa09ca42d      0xeba4fc85
+       0x9af017a9      0xe18fa00b      0x57dabf57      0x4b8d6557
+       0x76d9bbd0      0xfb4511d2      0x13624ca3      0x2662cab1
+       0xd9cf4ed2      0xa0927b7f      0x0593ed03      0xb2ccd2b1
+       0xb026f8d6      0x2393232f      0xaa7de1a6      0x212c2b41
+       0x6f6a502b      0x960dd830      0x5e40123f      0xa772ce63
+       0xa2b350fd      0x9be53f1f      0xb49ff483      0x6e7198d5
+       0x184d5de4      0x8caede59      0x92a69f17      0x3944317e
+       0x5b83e785      0xa2a1600f      0x88f4c890      0x7d0f0751
+       0xa4dc4724      0x306c2422      0xa55778d6      0x3468cb7c
+       0xdbc43d8f      0x97518c45      0x3786f4cf      0x59be6d38
+       0x81328f07      0xc886c08c      0xe5f5a2c8      0x805cc450
+       0x201025cf      0xcac77654      0xe03c5999      0x7f2fe9d8
+       0x2d7cd63b      0xe37bda44      0x3fdafb55      0x1baadc8a
+       0x04b9c4e8      0x05033691      0xf0542f66      0x076b9144
+       0xa95b0460      0xffd59ee8      0x4adfad44      0x5c3d4ada
+       0x85405a17      0x809bce8e      0xf76e4473      0xf2bbd4d4
+       0x76bd3c17      0x197f08ae      0xfc72d944      0x61b871f5
+       0x3cfd0867      0xd506fcf5      0x323b6c2f      0xe9a4e05a
+       0x41559058      0x2497797d      0x8239ef53      0x90c9da08
+       0x6fc6038c      0x4565e030      0x98dcf8bf      0x0d258c28
+       0xd3b2a435      0xedc58062      0x9bf5fdf0      0x418a4f4f
+       0x52493701      0x0f52bbae      0x4c1cad5f      0xeeabc56b
+       0xcc26d83e      0xc8699144      0x711c8293      0xc94977ff
+       0x64207548      0xaac1fc9f      0xb9ec2518      0xd42a581c
+       0xc5d176b0      0x76148e4c      0x57e7c22e      0x50d79d68
+       0x7261349b      0x01fc0a26      0x2e0741e0      0xd8990e91
+       0x5ccdf76d      0xf253b0ae      0x0b4cefcc      0x87905632
+       0x86c6bee4      0x34156b61      0x188af518      0xb8aa7c05
+       0x51c6c308      0x99de423c      0x3e284f44      0x1352c866
+       0xca90bb4a      0x561e0a54      0xbc48090f      0x87783530
+       0x5ecafec3      0xaa11758d      0x02a3c95c      0x5140bf1c
+       0xe710e834      0xcc792227      0x97c8fdf5      0x3d4ae80a
+       0x174c270b      0x131bcc61      0x6a2d1ef0      0x858938c5
+       0x7110b82a      0x98042869      0x658d6b34      0x2eeb4686
+       0x0489e246      0x7c6c8fa1      0x1591b423      0x70cb970f
+       0x63a77870      0xedf82598      0x6a59690b      0x22e9870d
+       0xdecdd549      0x232340b7      0x603b48a1      0x181e7fea
+       0xf62fbb42      0x44e88f9d      0x6b2dc3d2      0xc18b8c47
+       0x648fb362      0x89c05984      0xe0e48711      0xbc36bb8c
+       0x237b0266      0x38bf387d      0x975b0518      0x74fa5799
+       0x8f49e13a      0xffe74abc      0x913b590f      0x93b0b2c2
+       0x3eb3015a      0x38a0f94d      0xa62343d4      0x709b1921
+       0x759458ac      0x5c9d5b02      0xafc56a30      0x29176dc6
+       0x95640730      0xba946241      0x309fa854      0x2653120f
+       0x6125e744      0x71594382      0x59ba63ab      0xbc820a96
+       0x459d1b68      0x8addfde6      0xbd3960fe      0xcc128ee1
+       0x5f1b4726      0x505e1816      0xe9f4eff4      0xc4a372df
+       0x61d52ed7      0xb75d3184      0xf007e704      0xe80889b3
+       0x4914100d      0xdc433905      0x507dc5fb      0x91e71741
+       0xe8a8aaf2      0xa9a58028      0x8e452803      0x20d19046
+       0x45d6804e      0xc5c6f4fc      0xeaaddc2c      0x34375983
+       0x198ef17c      0x7383a724      0x1436c902      0x6cef7fe7
+       0x7dcaba1e      0x55333649      0xaca12dd1      0x9f5ea721
+       0xb524b004      0x13a3172c      0xc3074bc8      0x61a56a47
+       0xc1ff249d      0xd012ad08      0x65dd207c      0xa8d38a54
+       0xbf37ae04      0xed970086      0x03502e78      0x81faf743
+       0x028dd6b5      0xafa8dcd4      0x84aff729      0x8079435f
+       0x07433cf9      0x5acd7db7      0x63b5a865      0xedd0ecb4
+       0x38198a9b      0x306ae22a      0x7ee63ba0      0x696b2fcc
+       0x6e87ba2e      0x40a149eb      0x97bcac21      0x491e81be
+       0x5862ec1e      0x7a37a598      0x8161e060      0xf0d2ef42
+       0x0aae1b6c      0x9744329b      0xe8b428dd      0x7ecd2710
+       0x28db6ee9      0x99cdae78      0xdb6438d4      0x99777322
+       0xd99188a4      0x43c7af5f      0xb5194418      0x2ff77c3b
+       0xdeabcecb      0x6a5a52c7      0x91f8ce20      0xc9d2c8c4
+       0x855618c3      0x59479754      0x7f244182      0x688c271f
+       0x38de9c9a      0x42fd5cd8      0xc9df931e      0x1791c2c2
+       0x0006c6bf      0xefc0c89b      0x135f4fd7      0xd7ea17fa
+       0xa76acedf      0xc4824dc7      0x5e74e2d8      0x784e00ed
+       0x8c376c35      0xfd8915d6      0x63274627      0xfe4de86b
+       0x057c780b      0xa3628ac8      0xb86fa094      0xa4180313
+       0x98260bbf      0x31ffb6a9      0x346ada5a      0xf52cdb37
+       0x990a0e04      0x1dd4f630      0xbc4b09ec      0x4f511d06
+       0x827c673e      0xb16140e2      0xb4cb87a9      0x5aa641be
+       0x3d3116ef      0x88e1130e      0xca5996f7      0x4913c5e4
+       0xfef485d1      0x99899cf4      0xd2b8b8c4      0xbf605102
+       0x9012aae5      0x24c2488c      0x98225b96      0xc6004100
+       0xe9786694      0xdcf08ea1      0xe9a9698e      0x6d9985be
+       0xf6c7bbc7      0x7913dcef      0x24c541f1      0x326c0aa4
+       0xd6356e79      0x53260a76      0xa7927e05      0x16a67516
+       0x2fab1dd6      0x68108bb8      0x7a184c86      0x5ed42c2c
+       0x00d0b46b      0xcf5062cd      0xf06c2b38      0x2f1eb5f6
+       0x72430b08      0x7faed127      0x8d52bc6b      0x0c01189b
+       0x55926abc      0x5b43cb79      0xeb10fec6      0xfe3fe206
+       0xfc43ab4b      0x33339a6f      0x65918b40      0xceae08ed
+       0x23907eb6      0x8b50a149      0x3ee2d7cb      0x35a9c1bb
+       0x33b9965b      0x13d0c07f      0x6e966e00      0xff6211f8
+       0x1fcdcfb0      0xa45be5c4      0x6bb10242      0x51beb3a7
+       0x5c5cbec5      0xff3eecd6      0x2f31ed96      0xb871733c
+       0xa79abfd7      0x755ea2a3      0x5afd3104      0x632b74cf
+       0xf5533208      0xeaa7858f      0xa489a246      0x8d3db27b
+       0x80209a3d      0x6f821974      0x7a877499      0x698b0919
+       0x8b522259      0x25b09456      0xb59c406c      0x214b6573
+       0xf71ec38a      0x986e5402      0xea7c22de      0x474c0e97
+       0x1c701f5d      0x572161c0      0xe6bb8f21      0xb9d37b66
+       0x3bb33780      0x27c0b0fa      0xcd6c8ad6      0x0ccfbd2f
+       0x87cb8197      0xf8062bbe      0x1c89176d      0xd6a8cf38
+       0xfae92880      0x265d58f2      0x78416c5c      0x91a4c986
+       0x09773b9b      0x151029e1      0xdf2c9056      0xc011b423
+       0x38e01955      0xc9d3bbe5      0x3a1a8cc9      0x737e1832
+       0x8056ab36      0x5397b84b      0xb5693b6d      0x0e04bc33
+       0x55bd54ce      0x8f8afd54      0xf925eedc      0xd5735e1a
+       0xfc83706d      0xd31afd37      0x60d53ed8      0x3921b0db
+       0x27c52f2e      0x5eff5a29      0x1457267e      0xba02940f
+       0xeb87265a      0xfba11a54      0x286b3d5f      0x62c8dfe7
+       0x09acaaa2      0x7e324ca9      0xf88732b1      0x21519a6d
+       0xda939cc8      0xdc7b7a3b      0x3cea28fa      0x1ebf4bbc
+       0x481cbb29      0x4d6500b9      0x9d916185      0xc3c8abfb
+       0xd918d34a      0x98e2e731      0xf171bc7a      0x7ed1767e
+       0xb248576e      0x75b26cc0      0x32d29a34      0x4bbb60a8
+       0x15353f33      0x0e3a0040      0xde8accb9      0x40958226
+       0xad766a5a      0x1d5034d2      0x50e31058      0x020f0334
+       0x2a5a36b6      0xe1bfb70a      0x02d3feea      0x64784369
+       0xd26937c0      0x3d21e686      0xb509f055      0xdd080923
+       0x22c6de8d      0x69ad6af8      0x66d5684d      0x39528761
+       0x281d1c67      0x9f4847e6      0x52b5d5af      0x81e016af
+       0x4401e179      0x8677e61b      0xdf2681ae      0x2fec63a6
+       0xe1f26427      0xf2e91904      0x5ad56cbd      0x96c23a3a
+       0xab858070      0xd8b56be7      0xd92ea61c      0xa922c734
+       0x7a246e49      0xaa278bc8      0x7d8976f2      0x088f0c0f
+       0xbbbd5d97      0xbd52d675      0x45c1d287      0xad02c87a
+       0xe4e2b055      0x288c0b15      0x9176daee      0xb022bfac
+       0xa23fc53f      0x5b019da2      0x602a8d94      0x2222c82b
+       0x938677ec      0x09958df7      0x1d0f7daa      0x2dd8a9c6
+       0xb3450f31      0x1df9e65e      0x8d3067bc      0x5249e896
+       0xdb9f621c      0xe999d84f      0x784bb655      0x5e35eec1
+       0xe689d839      0x304b033c      0x01082ace      0xec0f9627
+       0x928ef406      0x3e5d7ba8      0x7b4c53d6      0x83735573
+       0x5ead53f6      0x09c717b3      0xecf35a9b      0x3ed01fde
+       0x1696aa1d      0xf7cb4817      0xe2fcd66d      0xee3ff786
+       0xcab1b89c      0x13a03cce      0x1327498a      0x8960e308
+       0x572a3588      0x01a84bba      0x15ed662e      0x7dc1e12a
+       0xab2be262      0xa94f4d74      0xd2f1d04e      0x387d937f
+       0xb47af6c6      0xe0d692e4      0x873c59a3      0xf60df864
+       0x600719dc      0xf2dcf1c0      0x5d4b3b53      0x0536020f
+       0x8744af7d      0x42b7647e      0x3c4fa6e2      0x27f85072
+       0x859b6c71      0xc2da0dc6      0x96880d43      0x8ebfdcca
+       0xf64fc35c      0xdc890edc      0x9ac62db3      0x03b24059
+       0x5d4df402      0x9157910c      0x71d0c724      0x6ffb801d
+       0x8138640c      0x58287f9c      0xcdfe7312      0x5d42ac32
+       0x43ee41e3      0x601faba1      0x2d98880c      0x982ef6f6
+       0x29fee027      0x6bf9c734      0xc6643eb3      0xf810f45c
+       0x09e6598d      0xe922e9d3      0x9b9cd24e      0x13adbdf2
+       0x87fafe2b      0x598153a0      0x07fe0627      0xdc9bbe63
+       0x5fcd7a0e      0x344e9d97      0xaae1ccd7      0x12cc8785
+       0x83bce154      0x81b6e4fd      0xecc54d13      0x78c16f81
+       0x161274f6      0x9a84ab54      0xb0b68efa      0x8fc36d30
+       0x44822756      0xf8b7c352      0xa3c8b5c9      0x4d79f22c
+       0x92948fa5      0xbb1894cf      0x17cc9500      0xfba63222
+       0xc09778f7      0x9dfcd0e8      0x33518208      0xbebb96e9
+       0xffba3160      0x8c72e960      0x3f11d1ab      0xb4911fd0
+       0x54bc5159      0xcaa29313      0xf7b6586a      0x0cc228d3
+       0x936503c7      0xaa170b5e      0xd64fca4f      0x1881a6f2
+       0x08e1c2bc      0x57b8a94c      0x2b9fd67c      0xc7879eae
+       0x554a3c57      0x58ca2cb1      0x58fa905a      0x0c2f41a2
+       0xf3844926      0x7d843474      0xb71234a7      0xafff1955
+       0x8cd60a91      0xa2d462ac      0xe85b7897      0xfa94f137
+       0xa52befd4      0x6f0ba1db      0x21381c00      0xbf231fca
+       0x8691279c      0x29ac9a2a      0x1a5ef8f0      0x34ebb5bb
+       0xbd3474f4      0x4610ce7a      0x4a48948a      0xecefa1ac
+       0x2e0b10ef      0xfbaa21d4      0xf40d5dc4      0x2b3f5bbe
+       0x1d360d61      0x58bd70b9      0x0a114fcd      0xf8355262
+       0x52401115      0x25d59b5d      0x747079a6      0x23801f64
+       0xfd0b0c18      0xc6e44236      0xd2744f37      0xa36fa13f
+       0x3fd25df1      0xc6821c82      0x3a0ce1d9      0xb546ff49
+       0x80c28886      0xabf85e5e      0x96910bf8      0x4f58ae33
+       0xcfb853b1      0x591a9143      0xb8292dda      0x5b83a701
+       0x35e18911      0x4d146860      0x040b53fb      0x8a5a4d4d
+       0xb6117da3      0x9012f65e      0x169d8f3b      0x51ab1456
+       0xc801485d      0x3bf357d9      0xd3c7e46e      0xd50963a3
+       0xde44d541      0x10de078d      0xe07a9196      0x8c44ee32
+       0xfbb01649      0x748edd37      0xa69ba2d0      0xfc525cb8
+       0xd8a74e49      0xc892c44f      0xed0b50b9      0x1cf62b23
+       0x2e881075      0x8f3a8b3c      0x24d8b09e      0x317548c7
+       0xb3e14861      0xfeebf131      0xf2484505      0x870a469e
+       0x59a7b206      0x7cf2f6fe      0x6d1f05ef      0x23b21d99
+       0x29589811      0xc0736a54      0x61bcd0eb      0x0135ce68
+       0x1729bde4      0x2dc96f91      0x41c77758      0x0d676649
+       0x37337894      0x8adeffa5      0xe496f4e1      0xa557cd7f
+       0xf568d996      0x57e1f297      0x92f70afa      0x781a2301
+       0x790d71e3      0x4a7b35d0      0x6f9251e7      0x55a494fb
+       0x76a6ba36      0x0e9f0126      0x046f22d1      0xea93ed50
+       0xff76fd91      0x83ed0a6c      0x15bd11b7      0x935ced68
+       0xdcc52119      0x960fcc2a      0xad91335d      0x349deaf9
+       0x225b2929      0x65b7be98      0x0659a786      0xf65b2e2d
+       0x08cbfa0f      0x7e8c3f4d      0x8a156726      0x36b5e58c
+       0x989c069f      0x5459464d      0x9fc5aaf1      0x4dd86d29
+       0x4d4ad07b      0x69c8c130      0x04e3142f      0xc95ea468
+       0xeffb4afd      0x7a211bb7      0x952b8d10      0xbd102c4f
+       0x67d7937c      0x83eb94d6      0x1ff1fdbe      0xb3bd615f
+       0x08a071d2      0x50530418      0x21527174      0x93214577
+       0xc097a66a      0x1dab8146      0xabb3482e      0x7e940eda
+       0x0663abf8      0x050d47dc      0xa32d336e      0x4e4a887d
+       0xdb987e01      0x8638c3a7      0x89b1b0a4      0x9f76d795
+       0x7c46b627      0x8384bd8a      0xf77ed572      0xc9232bee
+       0xbb45fd3b      0x12d1944c      0xb4954081      0xe771b6c8
+       0xdfac1820      0x61dca1a7      0xec8a2940      0xd1bafc91
+       0xf0bc4084      0x97c61ce8      0x7bc0ddf4      0xdf40b00d
+       0xe4ad2946      0xedbabd85      0xa0c5ac70      0x0dc53e1d
+       0xee5c96a1      0x77593635      0x7e9b23c9      0x8cee4341
+       0x81b5a33d      0xb58c7ecd      0xc62e5f92      0xf9d39d7f
+       0x122f4090      0xfee80c91      0x00fe09d7      0xb9afd944
+       0x86b3b327      0x0523e8d4      0xdfbaeec4      0x596a0e2a
+       0x97548a99      0x4774ee8d      0x8555a48b      0x73ea4142
+       0xcb53fd5f      0x6dc88895      0x9d787f56      0x60966bb6
+       0x403b9849      0xa1c13ab9      0xefd4e252      0xee8aed68
+       0x66ba7d8b      0x64d4d61d      0x5f7eb39f      0x114c484a
+       0x7713b3f0      0x8628805d      0x8a24e1a4      0x1139746c
+       0x8a99de75      0xffefa8bd      0x9f9a938e      0xe93af749
+       0x2eb9c43e      0x9e55664d      0x19ff5cb7      0x5782a442
+       0xd800f3b5      0xa5bcb2d1      0xd6850316      0x3df8af93
+       0x394ab2c3      0x6ef66c7e      0x556f73a3      0xa981f3ed
+       0x20203c07      0x5d6a920f      0xe00a922b      0xf1903e75
+       0xbf772696      0x21fc9a3d      0xe10229c9      0xe01ad2b7
+       0x78f62dc6      0xfbadb04d      0x2957db23      0x8c94c107
+       0x9ff3dcb5      0x26a3e680      0xe960b52a      0x4bbd0b87
+       0x5abdd089      0x0dfc4286      0x829f59cf      0xe2247a40
+       0x9d1cbccd      0x4e18275a      0xfc6a33fa      0x56af1cef
+       0x46a5407c      0x90110c91      0x4015089a      0x00953ad7
+       0x2c978a38      0x564c377c      0x6d6d8201      0x069e2756
+       0x0c5fff64      0x9f9774c9      0x9609b2c8      0xe6abfd77
+       0xa0580475      0x736144fe      0x05dc3c2d      0x6e5fc0a9
+       0x50e0834e      0x8fbb47aa      0x90b68cdc      0x84c35ccd
+       0xb81ee6d7      0xbfe0ce25      0x53fcf80c      0xce1cf77d
+       0x1c275359      0x1d2b149b      0x56ebbe4b      0x4faa74dc
+       0x07862ed0      0xdfb7fc08      0x558d371c      0xf2691a4f
+       0x121bc61f      0x344111e9      0x3187fbe4      0x993d7413
+       0xa8b52f7c      0x0cc39240      0x93b08b23      0x94266e6c
+       0x9a268c2a      0x9734bce9      0xac998603      0xaa35a92b
+       0xb784fe18      0xe6f629f1      0xc6ce9fa9      0x7e61683b
+       0x35f930c1      0x52667303      0x41d8c050      0x2d99f78a
+       0x3ab6d31e      0x9aab1c79      0x46c078e4      0x3f0f491b
+       0x23d084b9      0xf22a8448      0x3dd9d718      0xc31e1563
+       0x0ec2df74      0x1ad16767      0xfae2173c      0xb8752548
+       0x07b8599d      0x35324a72      0xf2a68f0f      0xf8e2d671
+       0xf442ff79      0x5c03bbd4      0x51f11325      0xe3f5183f
+       0x9eeb69f5      0x890efeda      0x2a65b287      0xb4471c55
+       0x8a45f5ac      0xe569267c      0xfeb1b0b5      0xd54913ac
+       0xf2de26e4      0xd06f867b      0x29710c74      0x5fb1befc
+       0x7025429e      0x58b8d19a      0x500f0cc3      0x65ecf67a
+       0xfb628da6      0xe784c9bb      0x250e4bf8      0x99b9aecf
+       0x5f4007c4      0x373a39bf      0x3b950adb      0x9a717036
+       0x07d7a187      0x0abd3bd6      0x41370fa4      0xcf82b052
+       0xfe5ec029      0xfb007bc0      0x63b29380      0x95b2de13
+       0x566534df      0x25b6edbb      0xa942e41a      0xbee4d9d7
+       0x70b6da90      0x91755dc0      0x612bd54b      0x9b40788e
+       0x642cc160      0x9ec848fe      0x614e3528      0x15fc410e
+       0xcc7f550a      0x7b3427ef      0xdb08937f      0x4b9afdf5
+       0x6116eb2b      0xc0328047      0x62f0d812      0x0424e9f2
+       0x0f893bd5      0x11476e2c      0xd26e12cd      0x6327ef0e
+       0x404cfd09      0xbc4598a3      0x10b55cfc      0x1446ad32
+       0x814c55de      0xf7713ff0      0x89eea612      0xfd425dd0
+       0x003dda0d      0x702cb59d      0x145d1fb3      0x81303836
+       0x2f3f3417      0xd6d1ea5d      0x4e301541      0x3d3f8667
+       0x8d406f2a      0x1b8647c4      0x388dfa65      0x88dadf47
+       0x6270baac      0xa34e0bab      0x429ed567      0x836c5e77
+       0xc08e56e2      0xce6a4931      0x68437def      0x76ad3ce2
+       0xec62349e      0x15429d20      0xc325196e      0x45a57f9f
+       0x1a20c06c      0x9afa83aa      0x327e1a76      0x6d2fdc82
+       0xd07ef3f0      0x177fe9ed      0x2bcff8a8      0xa65110df
+       0xaf3001cb      0x5633a9de      0x1df68b9d      0x696baad4
+       0xd0249ae9      0x02448e92      0x22bc4a0c      0x32ef7a1d
+       0x6585b1bb      0xa66806a7      0xe0616052      0x5c722fae
+       0xba0ab9cd      0xc8a38f10      0xbb3fe81e      0x32500744
+       0xec813994      0x788c9807      0x2e81d444      0x88165de7
+       0xd7540962      0x4346b654      0x6bc7cd93      0x99fec87d
+       0x15b476cd      0x558d0c52      0x6abc5640      0x8b41a007
+       0xc7606d9f      0xe04e693f      0x89fda724      0x5579a807
+       0xdf33a9fc      0x1d3224c9      0xca72ab66      0x0dc9efdc
+       0x1d498f9e      0xcffd4cc3      0x63f83770      0x1a6690f5
+       0xa1f3af17      0x4ca7ec20      0xa8ea1e2f      0x9b784760
+       0xd49d1927      0xb91c20f2      0x95c9202c      0xca8dad56
+       0x5234d524      0x1856f6a6      0x2ee0b3f3      0xd7b20473
+       0x091be698      0xcf478a0d      0xc6637ba2      0x5bb767b0
+       0xecaab410      0xc91a19ce      0x85d25ccf      0xcc2da302
+       0x324ee21a      0x22adbce7      0x3f2c722f      0x3f321405
+       0x009945a4      0xc3a7d14c      0xedf6f3d1      0x81cd0bb3
+       0x0a9b5eea      0xd041a2d7      0xa8e06a61      0x8997a4cd
+       0xb2898ec7      0xe768b729      0x3430b9b8      0x644fb5ad
+       0x7b90a2d5      0x48a72448      0x729dd522      0x7118735b
+       0xb0d55182      0x4ac77348      0x441ec574      0xebab3eba
+       0x11eecd9b      0x88b6612d      0xc5feae0e      0x92fcf02f
+       0x4f05d5b9      0x7803aacc      0x5eb79723      0xe009b8d3
+       0x70b544ab      0x97afb1c0      0x707a0282      0xae7c4c93
+       0x2592575f      0x73cdcfeb      0xc948999a      0xaef3f9ad
+       0xb3794bbd      0x4807380e      0x4eac29e3      0xaf939ae1
+       0x80d59ac8      0x804c331c      0xcc090607      0xdc88a91d
+       0x3b490db9      0x4f3c4eec      0x42df431b      0x56dfdcc1
+       0xda724c79      0xd8c708a4      0x234c1b59      0x8275458a
+       0x7b4981f0      0xc72ceac1      0x38e53c52      0x8fa414ff
+       0x19da4809      0xb4d3ae44      0x740693d6      0x55e70140
+       0xd21eb87c      0x906984fd      0x5702bdfc      0xd383d58f
+       0x5fedeacc      0xd4396f05      0xf8a0b6f2      0xa357b9bf
+       0x3a6a8576      0xa3c42ee8      0x442102c8      0x14a4bf79
+       0x45de2ac8      0xd6754beb      0xd22d71de      0x10c6af1c
+       0x90f4dc45      0x38e9702c      0xbaead6dc      0x2ad36a8d
+       0xad64add2      0x99b62dc0      0x78c6829b      0xdfd7e096
+       0x2dea8ea4      0x833ff4ef      0x61a6d864      0x8b2e19cd
+       0x283ac076      0x8b6be036      0xab6c6080      0x8f542cb1
+       0x314d4c84      0x0d9956fa      0xc47b5a2a      0x34b81491
+       0x4df58d9b      0x4de1fb46      0xef7a6b6a      0x7da433ef
+       0xd96082c2      0xd1a2adaf      0x14fc1556      0x86a72784
+       0x2dfec1e2      0xac788574      0x69819abb      0x2922dba1
+       0x8ab48f0c      0x9f03ca28      0x9270d2b4      0x7677f583
+       0x27248cc7      0x92d8971e      0xbc385da7      0x14cc79fa
+       0xc680780f      0x27848e1e      0x58d2b632      0x32790eae
+       0x79e8d5ae      0x224d3f16      0x0b6d341c      0x224e9e91
+       0x175e282f      0xb7c36625      0x705821a3      0x16e0bdc3
+       0x387cdef1      0x8cdaf7ee      0x5007ca07      0x6a79a168
+       0xa0db2776      0xfba26824      0x0e9bce6f      0xe600c368
+       0x488f50c5      0x79739590      0x0ece49d2      0x03fc281e
+       0xa2c8c717      0x721e90ab      0xc378799b      0x893c1a33
+       0x13b0cd73      0x0c9081e6      0x16a9deef      0xb9e72955
+       0x269e5482      0xad3993e0      0x2a10c681      0x7f285d76
+       0xa395c5c4      0x911b2a1a      0x58431aae      0x0bfddfcd
+       0xdb3559b4      0x7f49c8be      0x05039677      0x5d6e9b5e
+       0xd9ceb3d8      0x5fd01959      0x6e8da61a      0xe246a2dd
+       0x26a2bc6d      0xabff83b1      0x04b775b4      0xed358c56
+       0x15f29b09      0x79fa65fa      0xb8f8702e      0xee0f1d0d
+       0x5e724848      0x47bb200a      0x74d8a284      0x181c9830
+       0xcf70a31b      0xf845947a      0x37a9ec63      0x4b9cf5f5
+       0x003a3859      0xd9e303b2      0x4546be40      0x324955d0
+       0x0a5e4ef4      0x439a4d22      0x99372ed4      0x2794c20c
+       0x7636fa41      0x0a9b07f7      0x05b5ac3d      0xd5599050
+       0x6f04fc49      0xe1320ba9      0x8c4e067d      0x879dfb21
+       0x36465e7a      0x66f3ef7d      0x72d37f20      0x5cc376d0
+       0x532df60c      0x62c1a06a      0xfd15736c      0x92620070
+       0xb699cc1f      0xdcd068ed      0x5d8a98d3      0x6ce7f6cd
+       0xf6c13820      0x87deb7de      0x4e906b97      0x2a745e57
+       0xe69fee10      0x695a2cba      0x852cd7ef      0x99c0107a
+       0x5111becd      0xcc323dc9      0x5692f080      0x46d6cdca
+       0x2acf342e      0xbf8603e9      0x8ca56f5c      0xa72f08a3
+       0xde60bd03      0x8bc19a08      0x2fa89646      0x44d0265c
+       0x303da472      0xe491ff6e      0xad4b1072      0xeca3a968
+       0xcee2577c      0x459f5af1      0x4d3c812e      0x16e94fff
+       0xb0fb9735      0x01401110      0x242b3999      0x73c7d6e5
+       0xd2e21b99      0x613e1800      0x9eaecb46      0xe6d4191a
+       0xf698f877      0xd018765e      0x8f81c2cc      0x233b95f6
+       0x849b3acb      0x8c010655      0xb5b623a0      0xbaa41efd
+       0xf868cc38      0x253fc919      0x9f1fab25      0xda5dd9ad
+       0xdd8e6b29      0x6bc3a557      0x1b50143d      0x8a7c04a9
+       0x17631708      0x8167cd4e      0xa37b770c      0x67105ffb
+       0xb78ac286      0x29c5726e      0x11416c47      0x4dc16db1
+       0xa33efaf9      0x3b84dd88      0x570deef5      0x056a9806
+       0x7976f125      0xc2942f06      0xd4c8c28d      0x9b65a893
+       0x73995f09      0xa8548ee7      0x359ee61f      0x929fd628
+       0x7a5439a2      0x5182fa81      0x62247ed8      0x5d22235e
+       0x7aacd9cb      0x4f3cda1a      0x91311a37      0xe41d68dd
+       0x325ac748      0xaefdd54e      0x1116e3f1      0xba749d52
+       0x08b47631      0xbe4ab0ef      0x51ffa46b      0x52db617a
+       0x5ade5675      0x0027005b      0xa3d99e68      0xfcfd766f
+       0xd0824eec      0x115aef66      0x006601af      0xc1fe2c65
+       0xa36712ed      0xb52b5a10      0xa36f677e      0x0a2fb9ea
+       0xe1b458d2      0x6e444d72      0x13be25b4      0xb703ad95
+       0x96792e2d      0x13580470      0x93d3b204      0x35504bfe
+       0x720c794b      0x3d70be27      0x7655e2c5      0x6b1ae173
+       0x8de22629      0xad32e01e      0x3d3b7907      0xd84e9995
+       0x2e887e56      0x50be8126      0xf1a54d2a      0xbb1d6100
+       0x08e4b765      0xaa3b33a4      0xdd09d122      0x82741701
+       0xc1bc7d29      0x45fb5b56      0xc528a45c      0xf813f75b
+       0x0b2ba18a      0x8da98ede      0xca7f418e      0xf3682a15
+       0x1919fe33      0x65586c2f      0x7876cf1f      0x969c41e6
+       0x46d07918      0x69c621d4      0x5fca0e46      0x72d277e0
+       0x6c233976      0x9708f8d9      0xf6d28154      0xc9cc85f1
+       0x6f357fd7      0x0424658e      0xb7020947      0x55a6448e
+       0xc2e5f854      0x874ecbcb      0x17c24d79      0x707c78d4
+       0x4502fbfc      0x65f1ca8c      0x2154f6ea      0x57fe2910
+       0x7d89ac5d      0x1ce9a4c7      0x83e61a03      0xe6586a06
+       0x53c7897d      0xd2cf9349      0x8eef31f7      0x52528d7e
+       0x9a5fdb90      0xe1baaa8f      0x6f14a696      0x01909532
+       0xf1f21d0a      0x74601127      0x11f490be      0xdeda6c6b
+       0xcf85b10c      0x3562adfd      0x5504cac8      0xef8b56e3
+       0x4b33b6d1      0xa5ebb84d      0xce401e47      0x9f6cb277
+       0x72039e85      0x861ca68c      0x18950d6b      0x508d11bf
+       0x349ad2af      0xf242e2f9      0x7eb42180      0x7533f825
+       0x21a3340b      0x16e28330      0xd8571147      0xc84aebf0
+       0xc23a975b      0xb0eea403      0x2232d224      0xf21e3160
+       0xa1d6c39c      0x76c96409      0x9f5e2c75      0x222b72af
+       0x059e8b47      0x388dce7b      0x39f5b246      0xd9668661
+       0xe0a024e7      0x54edd260      0x0a270f3b      0xb6fbee78
+       0x2c039b9e      0xaf1e444a      0xa39415a8      0xe3041193
+       0xeeb26f2d      0x3b6ce988      0x58d74a71      0x608330b5
+       0xd0eef205      0xc4267cd1      0xff03a1d9      0xea8ba1e0
+       0xe4036ef6      0xa87f3028      0x90b33011      0x55242e67
+       0xc35ee189      0x56097dd7      0x87c2b5e4      0x07a7a1ee
+       0x641de89e      0x2f798154      0x491ed515      0x6e4ea602
+       0x62fadd73      0x4a660586      0x047282f5      0x7955abc6
+       0x4a1c1758      0x45d15417      0x6fdc9099      0xdc613b07
+       0xed5c167d      0xe9822538      0xba3f8c49      0xa025d455
+       0x4c0d0037      0xfd07db30      0x079cb572      0xaac6ba62
+       0x9600e315      0x5a85c6b9      0xb71d5ef7      0x7f84ec38
+       0x53bee874      0x6d9c8f80      0xf6163407      0x9239d31b
+       0xc3794be3      0x431553e5      0xff083a87      0xbe687362
+       0xb1b0e984      0xb3172474      0x7435823d      0xe49c98ca
+       0x2799f77f      0x283f3ebb      0xfe0c0a0e      0x42dbce29
+       0xe2daa570      0xf8f56b98      0xf653e89d      0x2da9466a
+       0xe821b59b      0xcd8c1e26      0x914e9425      0xef01a32a
+       0xe1ff4e1c      0x097363af      0xec455394      0x183506ce
+       0x5d4e617a      0x3e96eaf6      0x337f4962      0x4809ebcc
+       0xe7dcd960      0x0be6ea6a      0xba4f2fae      0x897c90ab
+       0x5fb20c63      0x29584db3      0x71efe4a7      0x410d5462
+       0x5852abd0      0x3282d97e      0x88c08da7      0x10517d90
+       0x8203fac0      0x9198c071      0xb75e2350      0xd5dc6f2a
+       0xfc66ae49      0xc264bbec      0x10c9a02d      0xcea6c4c5
+       0x35860e57      0x9c2f6e98      0x84395132      0xa6b960ac
+       0x2caf8028      0x8e1e5633      0xe1752db0      0xc3245b6f
+       0xbc2cec8e      0xaa15b168      0xfab0ebf4      0xcbaf83ce
+       0xbc52b077      0xacea8d81      0x82cea769      0xe581def1
+       0x76ddee44      0xf17c7617      0x1a9b4ac3      0x39edff69
+       0x9459de09      0x6d0ea754      0x6707ff35      0x98fee90b
+       0xa139af94      0x59f6b1ec      0x39ef6a70      0x782074bd
+       0x7e7d9e52      0x21db4c56      0x0e495ee2      0x184e9f7b
+       0xb278874d      0x6e72b8d4      0xaa6f763d      0x49f8e47f
+       0x08330d8a      0x02ffa0d1      0x1174cf44      0x7368cd37
+       0x19bc4720      0xe31720c0      0x2fc34953      0xc2722687
+       0xfa147a47      0x6906e465      0xcded8c2a      0x42385b71
+       0x4fa5a5ff      0xed07e0ff      0x804f76f8      0x649f8898
+       0xf4545a45      0xdca3db8b      0x8621d651      0x7bb87849
+       0x157b14d0      0x776d7ab6      0x4226aec7      0x58c370f7
+       0x49acf453      0x16e21652      0x541d581a      0x868f855f
+       0x03c06a49      0xf38e6155      0x0cb111d3      0x14e6a36d
+       0xfedd612d      0x1042b154      0x639b0d94      0xc63fb348
+       0xbe6e66f1      0xd5d9df0b      0xa9e91f4d      0x1a19f11e
+       0xc1cfc7ff      0x3aa16113      0xcea08dd0      0xa2aea243
+       0xe42f951c      0x07a6db3a      0x67eb68e4      0x235e58cf
+       0x17506a25      0x69bb3cfd      0x2bae86f4      0xa995a8fd
+       0x20f480f0      0xa25ca74b      0xca1cdb25      0xf0aa2edb
+       0xc61abd99      0x4a155ff6      0x6c083688      0x0633eb9a
+       0x5f6223c1      0xfce26987      0x931de7c4      0xfb0561c3
+       0xc52038fc      0x0571c227      0x75065594      0x676be0e0
+       0xe9d9e47b      0x556ed5e2      0x1cc8e3aa      0x7c4ce1b4
+       0x537eeb83      0x2c332e93      0xdf90cb6f      0x6da31edd
+       0xcde77ab5      0xb9948b59      0x72198548      0x6d49e633
+       0xea62555e      0x4419f41c      0x8e020cd4      0x3fcf5474
+       0x6c5f1a5d      0x34314049      0xe5e9eb9c      0x968e6127
+       0x239b603a      0x993e6c89      0xe7b67d41      0x3643087f
+       0x02d8fd59      0x145502ab      0x98f4d610      0x0eb62bf5
+       0xa2e02092      0xa21c9ec8      0x9bbdedc5      0x52922483
+       0x19085100      0x7f7e4c15      0x21fb1ed1      0xd79abd7a
+       0x1bf76b86      0x976e1175      0xff3d93db      0x9355b0ed
+       0xcdd24eac      0x3856129c      0x8c143c8b      0x1b2aaa49
+       0xcf0688c5      0xa0912255      0x1134f43f      0xf61e9271
+       0x8c1eca82      0x297344df      0x467b61dd      0x3ac90cc9
+       0x789018e9      0xc38a77da      0xff709ae9      0x72c9ceeb
+       0x357f1b28      0x15f0aea7      0x551d246f      0xbd7cc82d
+       0x672d4fb6      0xf858f87e      0x2b1eeeee      0x079689d9
+       0x955925e7      0x00a10bed      0xdda0a02c      0x10a25c82
+       0x56f68ec3      0x11fd65b9      0x0c4a65a2      0x376c4472
+       0x0feb20ee      0x86daf4ce      0x9b278dd1      0xe5f364b3
+       0x90cb0ef5      0x9f9d5fe5      0x91feabea      0xc46114e5
+       0xf1c16e32      0x83945c8b      0x7f848eaf      0xa5026dc1
+       0x3bec24e7      0x07bb910d      0xa752b3c2      0x0dcbdbfe
+       0xc78c4784      0xcbc7c202      0xd5e695ba      0xa2d691ce
+       0x828cab00      0xe1d64aa8      0xacf5d948      0x89b8861c
+       0x31b3810c      0x6ad5cfdf      0xf221332b      0x22c87d65
+       0x0a841b6b      0x16d99143      0xdd77e7eb      0xd21cfb06
+       0xcd6a31b8      0x2dae353a      0x94d85b10      0x8eef3bd9
+       0x8a76c301      0x8bdbf4e6      0x5a210641      0xd7420869
+       0x630ad1a9      0x7b6b052b      0x3524464e      0xd846fd9b
+       0xc0068471      0xfa3bbe8f      0xf084c8df      0x44226cf7
+       0xebbccdc3      0xf0984e35      0xfb35f581      0xda93b2cb
+       0x0aeee7b5      0x0dd32807      0x23c02205      0x3fb701f0
+       0x1ac5bfda      0x3bcd2ce4      0x5d811747      0xf5541925
+       0xb7375bcd      0xd882432c      0x1e478675      0x1ad173b5
+       0x68fff417      0x38a91f66      0x3d659b0f      0xc8aee8c2
+       0xd50d62fd      0x947a228a      0x601953eb      0x4d919f47
+       0x2c19bd7c      0x9d35d641      0xfc265b57      0xb74799cb
+       0x32f3ac32      0x5f595e1b      0x72a15736      0x7c077991
+       0x102b2c91      0xb32f536e      0xccfe834e      0x98e4b690
+       0x3f32d1f0      0x17fa31de      0x50422c3e      0x5d777366
+       0xeb9329ad      0x8ac92be3      0x2d67d62b      0x05b2d142
+       0xfb134580      0x1bd4fdee      0x193514ec      0xe299593b
+       0x5a916adb      0xa3a91cd0      0x53b43410      0x761c29ce
+       0x13033aa6      0x9999e69c      0x4a45d118      0x284f5624
+       0x4c293a75      0x28b66b01      0x6cbe27f4      0x9bde5619
+       0xb25856cf      0xd1ca33fe      0xe4c2b700      0x05ab2c66
+       0x361d7e7d      0x665d674d      0xb395dfa6      0x45162269
+       0xab8d300d      0x1f2f0747      0x9e1a9577      0x2c49b2f3
+       0x6f96740f      0x319eed23      0xe6a57527      0x67142ac4
+       0x8f53165c      0xb85c54ed      0x3d78dda5      0xc32be8a5
+       0x1b3b0719      0xb23f7301      0x8420a33c      0x036cab5b
+       0xb4e0d0f5      0x22839b64      0xe818330b      0x8a1763e1
+       0x97696a37      0x249e23dd      0x0d7e1bf6      0x509196eb
+       0xf6e50012      0xe5d893b6      0x48905c3b      0x05e02309
+       0x29bc4aa2      0x73b784e8      0x8e4153d7      0x527167c2
+       0x041549f3      0x4924dcda      0xbf93ca86      0xe28a1207
+       0x9d327f71      0x6ca6c00c      0xf9137665      0xe8e5dfee
+       0xa9fdcd1f      0x2349da0b      0x4c86ff7b      0x546afb66
+       0x07b23458      0xe01ca83a      0xcf41d93f      0x4bd981a6
+       0x3cff8d5d      0xd2fe6407      0xe1191895      0x400fe581
+       0x5f74510b      0x2f4f7b7b      0xd557c281      0x085c8293
+       0x251744b5      0x367b4095      0xebf6f48f      0xf2ea6d97
+       0xfe0d42d3      0x02bc0fb9      0xb64f38af      0xb5118b87
+       0x5a5b04a4      0x4642c640      0xb0500d33      0xf947778b
+       0x23365f08      0x2f34d96b      0x596dc4be      0xd8a97b42
+       0x9e44aaf1      0x91fe9485      0x76976934      0xb4e2b957
+       0x3336893a      0x4e9fffe3      0xeb2a75b7      0x35b2291a
+       0xd83e197e      0x26753fa7      0xf1993550      0x227a99ed
+       0xe8b30fa8      0x499a81ea      0xa0274b8f      0x1e0675d8
+       0x01eabc3d      0xade1ddb6      0x273caa5e      0x515ff12e
+       0x5bd43352      0xe697fe31      0xb66b3eb0      0xe02fca0b
+       0xc67fa56b      0x406219b1      0x85aec5ef      0x72fb6679
+       0x9cddd44d      0x91360fe1      0x116a874b      0xd759aa07
+       0x5330671e      0x55947d4f      0x90e8dfe1      0x9c5882f3
+       0xf08d54ff      0xb6e2eb19      0xb7b48c7e      0xe9ad8310
+       0x44af59b1      0xb2bda966      0xa61e1146      0x593928ff
+       0xf0bc46b5      0x632bc665      0x14818224      0xb7456386
+       0xb498b8ab      0x4a1bd6d9      0x09ed9613      0x912b4afc
+       0x2cde21a9      0xccec290a      0x9798e5b5      0x3532a428
+       0x825f9129      0x4ec5d6f2      0x6a2ab0a8      0x239e67b6
+       0x6ef4fdca      0xde49fbbc      0xe55fbac9      0x857a746b
+       0xa57e8eb4      0xc52d1177      0x76165b22      0x764df578
+       0xedb92bb2      0xe5e91799      0xea70b3e9      0x5f101efe
+       0xc60ccd93      0xa424ccc3      0x60f66951      0x9c6406f4
+       0xb3613fc6      0x45015da7      0x6037f51f      0x198d616b
+       0xf4885eb5      0x9e1f3710      0x37f96b58      0xd81ed7b3
+       0x1dbcfded      0x2c698214      0x3d44dbf2      0xa4736f24
+       0x280c900d      0x32a4179e      0xc91f58d0      0x78c9a829
+       0x75274aea      0x1086ea93      0x6221c7bb      0x5ba660a5
+       0xc351999e      0x9e395a65      0x676c627e      0x63d7c3ff
+       0x3b3ef626      0xe50b46df      0xac546eda      0xd029a1e7
+       0xbc2659c6      0xb3f04642      0x0a647b50      0x4261d62c
+       0x037bd7ec      0x1c6392d2      0xb89895d6      0x4cda8c14
+       0xa7cfdfe4      0xb290303a      0xe0547aa6      0xd2117ed4
+       0xd729d316      0x1374dc2c      0x85568432      0x52902d7d
+       0x90eae464      0xc9bb76a0      0x04efb64a      0x75ac68cf
+       0xbd76dcc1      0x718fc088      0x23955173      0x09c73ecf
+       0x255e4c62      0xea69bb72      0xa11a8d7c      0x9e34f5be
+       0x679d4004      0x7ed467d7      0xfb39169e      0x0b183356
+       0xe3ac01b2      0xa80039e3      0x02b6a1c2      0xfa90f1d9
+       0xf3c3cfaf      0x963ce60b      0xedf9a86a      0xdeffa99f
+       0x81eadecf      0x48e4387a      0x05cec096      0x0556b694
+       0xab8e8147      0xe508f298      0x2e80ccb2      0xf42acc8d
+       0x4f4bfe84      0xab58acbd      0xe16e1821      0xdca56a11
+       0xa6019789      0x1fc8405e      0x60d70605      0xc6be366a
+       0x5b581001      0x1b754680      0x50e79254      0xdb06bec7
+       0x9abe763d      0x4d11e316      0x10855481      0xf0038cce
+       0x848192d2      0x5275f364      0x1410439f      0xef4d0611
+       0xd2855e7c      0xaf9a1ce5      0x9d04fb37      0xa91f0537
+       0x6cd683d5      0xac4532ec      0x6dccb68c      0x5e6524f5
+       0x01d8fbb2      0x4f0506c7      0x73088bb6      0xde4258da
+       0x24987366      0x168e6004      0xb401ca58      0xe0e3ed90
+       0x7f9cc276      0xa0d0df95      0x0b829a47      0xed0cb95d
+       0x1b80e077      0xb66484f2      0x57ffce42      0x7d31d4ad
+       0x4bd625de      0xdf03b660      0xf6d1a7ce      0x6f26aed2
+       0x024e6c22      0x5a2ebf97      0x9ac2088a      0xdcf581b5
+       0x31aa8d93      0x18b0e5f9      0x4d74be23      0xe2e47953
+       0x492c8e75      0x84688df5      0xf477cf2f      0xb5c3ac43
+       0x13391bb7      0x8e12b599      0x3b3debcb      0x05a7b474
+       0x3a661679      0x60dd7249      0x9d4e79c2      0x2dd3abe7
+       0x95bb7ab8      0xc6489109      0xb843b66b      0xef9bd35a
+       0xac9534a3      0x4643e967      0xdbaea162      0xa2651aa3
+       0xef077c6c      0xceaf4094      0x6a9873d3      0x1307f6ef
+       0xc0f8ec89      0x31257a8f      0xa3ccffd6      0x954d07bd
+       0xcad4f220      0x49491562      0xcd771af0      0xb52337d5
+       0x56005903      0xfc8b8776      0x0bc5c5d9      0x77e6496e
+       0x1c5ace1e      0x23214163      0xb16404ea      0xf21d7587
+       0x3272b9c3      0x819d6967      0xf3935cda      0x5f75e7b7
+       0xd47e0a45      0x3835711c      0x65c8b9f8      0xec9216e2
+       0xca694b01      0xa09507fe      0x1321c7bf      0x09e884b3
+       0xd47b9a71      0xb5d04a73      0x347b8e0a      0x8135bc67
+       0xd203544f      0x5f0fb637      0x3b3b174c      0xf84c4e4f
+       0x8c546829      0xec92ce65      0x211c2f94      0x0f15d175
+       0x8a7a2eba      0xb2b3ea92      0x946f3cfa      0xd3af9721
+       0x28420bce      0x0d1adbd5      0x76ab261a      0x8addf98d
+       0xe0da2a84      0x96dce746      0x2a1c215d      0x69269465
+       0xcdac281a      0xb02d391e      0x8668b6c8      0xc698d17f
+       0x58fda8c6      0x5d670573      0xb6dd7500      0xc214e33f
+       0xa799dba0      0x7f9af447      0x6e44fde8      0x99086eb9
+       0x2f0c325c      0x7c3ae345      0xa53b3661      0xdd359b1e
+       0xc4cdb7ea      0x24c92053      0x0676821e      0xdc768e80
+       0x799e291a      0x4254efe9      0x245f1229      0x9fd3bc07
+       0xf57dea56      0x2cae3b3b      0xc66828a7      0xbcf094dc
+       0x946bc135      0xf3f4a5fa      0xbc6009ff      0x0315504d
+       0x1d6383e0      0x9e3b6f27      0x0e0587a0      0x77f92fcb
+       0xef643571      0xe9583f7f      0xaea0c615      0x18308730
+       0xbf12e2bf      0x500e7e9a      0xa68193e9      0x037885bb
+       0x7afa33be      0xa0215cc3      0x6f3b153f      0x0749bee8
+       0xffde3598      0xc120bf6f      0xd87c6a94      0x39cf0ff7
+       0x77e3b6eb      0xfc58b718      0x75cfaf83      0x0da3b0dd
+       0x61bd6afc      0x13f73a6a      0x015315f3      0x8ab77ca8
+       0xbd176c00      0xdbfb1163      0xafb556fc      0x586a8768
+       0x87bb256e      0x080cf4c9      0xfc3672ff      0x82434519
+       0x9ca08dc1      0xd91ef241      0xdb71c24c      0x247adc45
+       0x88d6976e      0x3644c393      0x99160c08      0x86660664
+       0x3e7c9c70      0x13bff68a      0x9d622be8      0xc27f7319
+       0x38f7bee2      0xefe2cdbd      0xb862e5e3      0xca4afc28
+       0x38615428      0xa4c218a7      0x3d5a0bbd      0x6846e206
+       0xdc60775b      0x34a8a637      0x51bdc338      0x029c47b1
+       0x12837e46      0x4cb03808      0x2c3302b4      0x6957523f
+       0x74064563      0x4650749e      0xa0a699c2      0x2b6ee710
+       0xb854168d      0xde2c5867      0x778225a1      0xc4c08262
+       0x8dab98bb      0x86588df1      0x042b34bb      0x0c975ca4
+       0xeecae2fd      0x899390e7      0x58a2cc81      0xa4663244
+       0x4283bade      0x1df2caf1      0xad5195a4      0xc82ed5c0
+       0x7a61742c      0x5f91acf6      0xece62844      0xc1e79126
+       0x9c1c0da5      0xcc986bdb      0x78d7050a      0x7bc13829
+       0x3d503e7a      0x7427d7b0      0x60a99dd8      0x69d18c4a
+       0x1773ec06      0x82e68e3f      0x23efefa6      0x34abcc61
+       0x5ffb24c9      0x550afd07      0x4d797854      0xc68d13bc
+       0xde7239fa      0x71e6e110      0xaac81aa5      0x7cda2f9e
+       0xc28662db      0x222d5fc0      0x59844c5a      0x5fb5444f
+       0xc57a4f77      0xcf258bc7      0x81c98c21      0x1b07937f
+       0x380c18d2      0xce92a236      0x597dc1e3      0x4c5e3600
+       0x598f79ef      0xcc8d5785      0x739541b1      0xc97b533d
+       0xbf3f15b8      0xa736552f      0x535468db      0xc416f758
+       0x442e1f42      0xd983480c      0xfc62acba      0xe3259803
+       0xd842885d      0x4de67800      0xe9739f17      0xccd6dbbf
+       0x2693226d      0xb53440b9      0x6a2325be      0xa73db668
+       0xc092fc17      0xfc3030a7      0x473182c3      0xe579f173
+       0xb9826f21      0x1c003628      0x7a1c0849      0x07a91ae6
+       0x1d374309      0x71137645      0xebeb0264      0xb4d0770b
+       0x0b08efc2      0x0d41d275      0x2b4bd763      0x34befc76
+       0xaf5969e6      0x8fae7eb3      0xd21ab29e      0xf311c198
+       0x99ca6131      0x07b8727b      0x705d2272      0x4aba3e02
+       0x6bcfa46a      0xcb410ff3      0x2218a46c      0x8fa79e4c
+       0xe0a7fd8f      0xad866e32      0x19f3614c      0x51c5107b
+       0x1d70682d      0xfae51d5b      0x92c8d209      0xf7e7f809
+       0xf7f298ae      0x1ed98b1f      0x8d72320f      0x4ca62653
+       0x555d761b      0x585b931d      0xea97f50b      0x4cd60527
+       0xc11470aa      0x351ea162      0x6e02aa6d      0x13a2e29b
+       0x26247856      0x53763351      0x73502e2b      0x0e72cf00
+       0xfead8af9      0xea9fed5f      0x8e29593d      0x1dffa068
+       0x35018a10      0x241b6929      0x8dd1ff6c      0xf7aafa9e
+       0x799d49c5      0x1457a9f6      0x28bf4090      0xaafa7ba6
+       0x7f96e432      0x98035b6b      0xa2bfa070      0xb47d9c1b
+       0xd4f92138      0xe5c44f9d      0x817767e5      0xb5a851e1
+       0x4abec330      0x4f3ee596      0x232f5407      0xff720a97
+       0x4bcb73a3      0xb9e9defa      0x44ace459      0xacc87ec0
+       0x6115e7ad      0x60c824d8      0xca2c910b      0x70b0a1dd
+       0x09c5dbb5      0x53fff786      0x1f49e297      0x2deb0ff2
+       0x4e7e1015      0x4a40fc18      0x7d2930af      0x641128e9
+       0xb42c96d5      0xe0a63f2c      0xa3d5b009      0xa7683f57
+       0xd1b15d72      0x5411bc6b      0xc5e3c6c4      0xa307e3dc
+       0x8619f0e7      0x87f088e4      0x90bfa9da      0xcb88afe7
+       0x41793feb      0xb36ad18b      0x09c23ea1      0x8732883e
+       0x9f9557a1      0x22d6a9fa      0x0481d5ea      0xf857343d
+       0xba41144d      0xa8b44d45      0x79752ae2      0x322edb6f
+       0xec48bdc6      0xb28216de      0xca282e57      0x773e6396
+       0xb99968ec      0xd105854e      0xf77089a4      0xea9521db
+       0x39b5cbf4      0xaee60835      0x8e8326f5      0x457dbc19
+       0x48c03f43      0x3aaa54b2      0x895b3606      0x82b8c9b7
+       0xd7943204      0x83eb8600      0xe532c12d      0xc1171d60
+       0x4ba2916c      0x2e785bc3      0x0dd98393      0xb8845390
+       0x05fd2150      0x2211c618      0xb5c2e445      0xd7ed0c82
+       0x0adf8dca      0x233af513      0x8503d749      0x488b1c15
+       0x79dff5a7      0x42e58503      0xeedfd69e      0x88f15379
+       0x1b7cd660      0xc9e9b279      0x14d20061      0x49c7aefd
+       0x5e22c5aa      0xb63fdde0      0x9465f03f      0xdc58b321
+       0x63a7289d      0x15f2288f      0xaf4532cc      0x4e4bbb69
+       0x091cfeb1      0xb5be580e      0xbbec6fc2      0x0fd821bf
+       0x0a547ce6      0xc2bcd84d      0x40a28139      0x7eeea0ca
+       0xb2feea2b      0x4fd5e4f8      0x2ccf48dd      0xb7194b6c
+       0xd22b9198      0x78ad936c      0x9460b1c8      0xdc17bbd8
+       0x3f40823d      0x4b236d52      0x14f928cb      0xd007bc72
+       0xd2f8b85d      0xb0d1d115      0x4c159971      0xda7580b5
+       0xb1ead8af      0xb36b50e3      0x0bd46374      0x2ceb5dc5
+       0xe1bb39d5      0x792e7cd4      0xc018c9a1      0xd800a972
+       0x408ed808      0xbf4ca03a      0x8960e693      0x6e890423
+       0x4551ec70      0x95cebd5b      0xcd80e621      0xeadf97f9
+       0x7696783d      0xdf6e5acb      0xe9c07318      0x5c99b573
+       0xb48f5ebd      0x45ac8391      0x4397286f      0x1384bfb5
+       0x20956529      0xf3efad7e      0xbba89728      0x81e2ffdf
+       0xfe7267a2      0xba5a0b2c      0xea564265      0x2eab215f
+       0x0585687a      0x8b321898      0x018932fa      0x79b1eebb
+       0xdf5e0adc      0x83b2599e      0x69de903a      0x0042d857
+       0x64621f39      0x916e6620      0x7edc8eff      0x0e30efa0
+       0x89e1712a      0xe2956107      0x613114e2      0xc507bf0c
+       0x18c57a2c      0x73c7d51e      0x73ed48d0      0x0134e2f5
+       0x9e7fc4df      0x9d23249e      0xd664b664      0xea0e92b1
+       0x62751e9e      0xa5253078      0x13b29a93      0x607f0ed6
+       0x6399eca1      0xad627487      0x8674256e      0x07a72d0c
+       0x64d888f2      0xb186a4fb      0x53c28502      0x3e1a820f
+       0x0e2e283d      0x29cc46d4      0x044debd0      0x264258d8
+       0xf2df4d96      0x381fe77f      0xb34e0bb9      0xa680fce4
+       0xf3965166      0xf66aa965      0xfa01274e      0x173a27c3
+       0x9372c2e2      0xaf379123      0x1d7795b5      0xd0cbea27
+       0xac2aa4dc      0xaf75cd15      0x08aafbd7      0xe1eb3ad9
+       0x73f2efba      0x7e1f8cfc      0x4fc216ce      0xc0b058df
+       0x47984d31      0xdbba78d6      0xf4322222      0x2d1332ae
+       0x1e389863      0xda868594      0x9009bcf3      0x3e3bfd37
+       0xf5c8d23e      0x659ed8f0      0xaf40d5ed      0x79334c6a
+       0x8a5fe638      0x43794c1e      0xfb797e56      0x0cfdf9ab
+       0xb9cb56e8      0x4521d561      0xb9225208      0xe640f78e
+       0x1228af34      0xde8b9a8e      0x068d9ab7      0x83e3b7ab
+       0xda2594b3      0x5788c4fb      0x482757d3      0xd2dc8c42
+       0xc2b20dd2      0x056d07d1      0xe2547141      0x1ffc298a
+       0xc3a87b06      0x41e29745      0x097beee1      0x79900e95
+       0x7b1adecd      0xb2e72144      0x4e26e17b      0x85cc1a4c
+       0x9950fce5      0xd6d98df9      0x93794074      0x824d14d2
+       0x4f0647a5      0x946ebf66      0xf7573917      0xbd8de17c
+       0x87b3e0f0      0x2d7244aa      0xc7e3a076      0x15b1cc40
+       0xbd4da30d      0x72d94da2      0x59f4bb70      0x11171bd1
+       0x7fb5b60e      0xb5c57746      0x9bc50e57      0x3f451f05
+       0xb94e5d7c      0x1a8f3f35      0x161962d3      0xdb989b4c
+       0x677fe3cd      0x11c0d3dd      0xf44e1845      0x4f0e923c
+       0xc9747ce4      0xd3e3b8f7      0xcca06709      0x22364a45
+       0xc451d651      0x61175a92      0x37c80223      0xce26776a
+       0xd84465a2      0x6f650d82      0x3c0c44c6      0x4cce06a4
+       0x9419dbd8      0x3790ad96      0x92931a8c      0xbee8a011
+       0xc6e6e935      0x90ded61f      0x2c600834      0x288d7aa7
+       0x29525b86      0xbc356cb2      0xe7990035      0x93a41510
+       0xeb1ae6f3      0xcfaebe12      0x986b8751      0xe5c12e29
+       0x97a81f41      0x0486ad01      0xe72ed202      0xb113d7f6
+       0x474b2b6b      0x84117dca      0x253fa634      0xd82a74ea
+       0x638cc440      0xa7f37501      0x6fee7b98      0x11c8d721
+       0xb546c6a8      0xb9614144      0x11f332f7      0x74cbd864
+       0xeebb972b      0x7fcfe0d0      0xc3bc74b8      0xf77b951b
+       0x48ebcc35      0x4e14d72f      0x7b953ae1      0xfbbb9ce2
+       0x42c55f78      0xb6d380ed      0x49c3d722      0x872ba533
+       0xb8e493c7      0x7ebb8ac1      0xd72cf5bb      0x008276de
+       0xac42547f      0x36d30ad9      0x73c4e5a5      0xd42a79c6
+       0xd7fc1c97      0xc1e39393      0x9d93c834      0x504deadf
+       0x507017d7      0x5e7f8596      0x64dff308      0xa1ffa86c
+       0x406863fb      0xc696762f      0x8346ab74      0xbbb26ac0
+       0x040e22b7      0xb9bd6bc1      0xb5a9662a      0x313baf09
+       0xc88a5d73      0xf89b101e      0x2df99e8c      0x66f9143d
+       0x6a15e728      0xd073efc9      0x2550f1e5      0xe6d2e0e7
+       0x201603c0      0xbedee383      0xb90eeba5      0x3c6d3689
+       0x6c221cc7      0x5e42e7e3      0x16773ca3      0xa903f046
+       0xa359c206      0x21aa9ce7      0xecc3c52f      0xfdd397dc
+       0xff0aa1aa      0x86a9241a      0x23dca3ca      0x7aa7964f
+       0xce44f45e      0x787ce819      0x102182f2      0x648daae7
+       0xfe8cef54      0xe5a2fa46      0x7858e946      0xe0f78cd8
+       0xc03dcc41      0xaa9eeda2      0xdec6ff3b      0x82503cad
+       0xe3c69ab1      0x636ecaaa      0x2842ccec      0x8281e787
+       0xc9457836      0xaaeb2b64      0x58433aa0      0xa8e90fdb
+       0xf4878f15      0xa4509d31      0x349d3d9e      0xdb41cd52
+       0xfcacc1dd      0x028cf8e6      0xe4063eed      0x4374291c
+       0x0a7b5823      0x5dc812a6      0xc559676e      0x1cccb0c0
+       0x8b5054ae      0x2c668113      0xe6ea95d8      0xebc32c6d
+       0x7c7e8e52      0x563f5e56      0x7b6ba1d1      0xbc768499
+       0x44d1b27b      0x11da187c      0xc150a0ae      0x8d549c27
+       0xef479ebd      0x1bec041a      0x2d724c70      0x4f6fff05
+       0xccc70e9a      0xcdf3f224      0xde13a03d      0x286faf62
+       0x0422a7ee      0xa1dce95a      0xa052c652      0x24ef7f65
+       0xc3d56751      0x062ca4b6      0x9c3a424b      0x4c6b8a5d
+       0x9b0760a3      0x454eb5a1      0x89d719c6      0x5d7c30b5
+       0x1875f304      0x76ccdecc      0x7f7b6f2d      0x91392a06
+       0xa4dadd23      0x3f89b22d      0xe5670c1e      0x69e5fab5
+       0x8d7d676a      0xca764743      0xee377c21      0x962ef23e
+       0x3c9776ca      0xcf94e1f1      0x90b70a30      0x82331925
+       0xac501a5d      0x9c9e78c4      0x709b0db6      0x427e02d7
+       0xf1b04309      0xa9f6f0f4      0x08ff5d7f      0x78a97bbf
+       0xab003329      0x62c425e7      0xc444a6bd      0x91d672d6
+       0x694e119d      0x0caf0d23      0xd25b4687      0x220d1657
+       0xf7ba3375      0x288606d7      0x843cf7da      0x57885fa7
+       0xedb17314      0x6b72199f      0x60781834      0x2af5db9b
+       0x30580a07      0x8624fbf0      0x7e0cd294      0x47352010
+       0x10a3b651      0x6f339211      0xc1eae963      0x35be0698
+       0x59ba2497      0x59b522b9      0x3f2f1d3e      0xca39fbda
+       0x8e75f2a9      0x0548e490      0x9f33e02c      0x6adecfdb
+       0xc5503669      0x4d5db11a      0x67e838e3      0xe9b880aa
+       0xfd649783      0xc138c050      0xd7aeaa11      0x966cc90a
+       0xaee0e03f      0x274a604f      0x8f9aa296      0x814516e7
+       0x6e196fc7      0xb73e1c2f      0x0d12e4f4      0x9ac2a2d5
+       0x8c7c9604      0x2697ef9b      0x1e29342f      0x31e4e835
+       0x24c641d9      0x11caf5ab      0x3f2e207b      0xbc84be68
+       0x053d130f      0xd9c47984      0xe876ad21      0x313d7941
+       0x4fbd8b5f      0x55da59db      0xad5f7256      0x72aad15d
+       0xa0dd11c2      0x2edb36b6      0xe2394a24      0xd1d3e21a
+       0x1bc12b51      0x3f90e0c8      0x1e931f28      0x228d3807
+       0x148253ba      0x0c92fa37      0x68cea9b5      0x8fa72940
+       0x8e168b8e      0x7917c0ba      0xca35e962      0xa24501ea
+       0xc88a581e      0xf7eec60e      0x44a2c310      0x3b6fe6b7
+       0x7157e3ef      0xc7336d28      0x94e1c1fe      0x53cae8a4
+       0xfa702348      0x377220d5      0xaf64d7df      0xd36c486b
+       0x4cc02674      0xfb4e74d8      0x5f444b3b      0xff8918bf
+       0xad443e0f      0xfb1e69e2      0x58a35eef      0x52be618a
+       0xbc32b508      0xd4bfd717      0x12c20777      0x9fac22cb
+       0xf527f00d      0xc4036217      0x076a0000      0x3e050a72
+       0x24d5bd98      0xb3df2dcf      0xb6577a1a      0x20db8dbf
+       0x81d84f2b      0x2b23bc93      0x04f5aba4      0xb89a7879
+       0x26037e61      0x8bf4c947      0x2c2f00db      0x4770fdaa
+       0x03517beb      0x7c0aed15      0x9b1c508d      0xd03887fa
+       0x612c327f      0x75630859      0xee089ebc      0x054363de
+       0xe1170da6      0xa6fbad45      0xbe5fd481      0x7170ce4a
+       0x982705f2      0x2f28fce4      0x4828396d      0x946e3227
+       0x4707b6a3      0x40b3b489      0x38e44d67      0x9baf7701
+       0xb5514d53      0x6a03ea96      0xa7edeb18      0x318592be
+       0x8077c7e2      0x54bb983e      0xba06f777      0x78ac3dae
+       0x162292fc      0x5f5a64de      0x8447342c      0xae366b1f
+       0xd40cda5f      0xa00c4331      0xc9f89e9a      0x614bfd85
+       0x13f4d895      0x351d65da      0x2dcc6c65      0xb932fef4
+       0xd979267a      0x369a3a48      0x3d69186f      0xbd36dedc
+       0x6531794b      0x5994888c      0x9c810184      0x86078fa0
+       0x019116c4      0x27c94578      0xa0f4b9a2      0x624564b5
+       0x5eaa49cf      0x6bb1af65      0xef20f1b5      0xc4e51d80
+       0xa4253cb9      0x0613e005      0x6a48efb6      0x6572d581
+       0x80e998c0      0x03d1497b      0xef167ec5      0x9778e1e4
+       0xcc81e16b      0xa690c40c      0x20e4afdd      0x85a7f7a6
+       0x036f2764      0x9899bbf0      0xb7d5ad3f      0xcea2c566
+       0xabad02af      0xb2d06c67      0x9c8d5a47      0x35c8381e
+       0xd620a859      0x37e6a29f      0x95158030      0x0f209e29
+       0x47ea5ef6      0xa4848559      0x3aff1ebf      0xe252e609
+       0x159bc4b0      0x30c2354c      0x6051bc9b      0x867842e1
+       0x16f60895      0xb62cee9c      0xa1afdd0a      0xeb91a8fa
+       0x4c711ddf      0x595d88cb      0x2b3144df      0x2dd6f0ee
+       0x1a5d54bd      0xa97fdee2      0x9acc0191      0x97b317c6
+       0x8801e044      0x008e6462      0x8bf44ec4      0xcde58a45
+       0xdc4b8ffa      0x4b99ce7e      0x98a86ccd      0x201461da
+       0x98b35c96      0xb01a44b5      0xb2873eac      0x100f0d31
+       0x8a4c4856      0x3bca7b1d      0x6692c4d5      0xd1b52a79
+       0xd0a0dccf      0xef954a6d      0xee084a14      0xf9e290ca
+       0x554125a6      0x4fe7363a      0x6582a536      0x91f95b1a
+       0x79b9a1b5      0x337b3623      0x4534e2c8      0xf9baf5e1
+       0x3bcf71d5      0x157a8e77      0x3c42836a      0x19d9e549
+       0x7b90ef15      0x3f556612      0x68b02db5      0x9a9261dc
+       0xc87ad241      0xa4783fc9      0x0b9e52e7      0x18f3a671
+       0x9c753a17      0xbb263021      0x7b79489c      0xd26d5901
+       0xda6aa081      0x6c9ec91d      0x7f51e8eb      0x63d8e990
+       0xeabd63cb      0x51a2b689      0xeec71240      0x6fd61a3f
+       0xb8bef531      0x5c579f62      0x42cda99e      0x32829716
+       0x587fe9bc      0xe2787a90      0x3caa6374      0xc6b05b3a
+       0x033b091e      0x4227df55      0x00f2ccf3      0xf8ba50be
+       0x5b3cbff8      0x2dec92d3      0xcd92b997      0x3aae0eea
+       0x58265341      0xb140c1bf      0x896bd107      0x8e134f1e
+       0xa2ab412a      0x692d37b1      0x3feb282c      0xe33378c4
+       0xb1825514      0xbb463933      0xbe4973af      0x4beec156
+       0xb3806b53      0x30544c35      0xb3d801b8      0x735a5103
+       0x9a44d96a      0xe36ce6ef      0x99ffd1d8      0x9887ffde
+       0xf36cb2a8      0xd778276f      0x16212ca2      0xac7507a1
+       0x1d37f935      0x0b3dd0b8      0xc9fbf313      0xdebbf9c9
+       0xbcb3ce18      0xc7b56762      0x326f0143      0xf670a4ad
+       0x39260fe6      0x523d5f26      0x2e2f3dc8      0x311a4065
+       0xddb07fdd      0x9c6e378c      0xaa812c40      0xb76a6682
+       0x798adc3f      0x0eb85bf6      0x085f1f36      0x9d787e48
+       0x5af6ad55      0x078882fa      0x286e6aad      0x0fbbd33e
+       0xa3a83587      0xd8dede42      0x8e0bc57f      0x830da747
+       0xe6a39721      0x5f17385b      0x130a11c7      0xf7ebf4a6
+       0x01c47595      0x0b1cd209      0x6e3fa03e      0x1c165752
+       0xe6d733a4      0xd5115cb4      0xd26bd353      0x633dc916
+       0xad32ae98      0xaf360cc0      0xcc433c3e      0xee2db5f1
+       0xbc52cb9b      0xd57d9343      0x1aea1757      0x305678ab
+       0xb706fe92      0x79be3615      0x9f826438      0xd8451944
+       0xde387b02      0xd1a7ab99      0x7e90bc25      0x3083cb16
+       0xb7457bce      0x5f3a5bac      0x4de880d2      0x799c1684
+       0x05957d56      0xe11f9a26      0x7489984d      0xc383c690
+       0x20e67701      0x67d91f20      0xe0bf8925      0x21207184
+       0x6151e242      0xe9b70cb3      0x9506a913      0x4a67bf59
+       0xd7274edc      0x5f33bb0d      0xc73eba6e      0xc90ffb29
+       0x2ac578c9      0x69b8a02a      0x79f0f3ed      0x25172463
+       0x343866c3      0x62ac94e1      0x868e8ef8      0xa2735dd7
+       0xb578b263      0x36eaf066      0x6cc058fb      0xa68329d5
+       0x6d56bad6      0xfe13ed4f      0xbc13f247      0x4ea42e00
+       0x03abe771      0xe0cfdff2      0x02b946f6      0x3e28b51c
+       0x00d1a074      0x630d047d      0x3774bde0      0xd54d848f
+       0x519df7c8      0x2f795cdd      0x2be0979a      0xffc9336f
+       0x865b9fe4      0x989ef40e      0xe8e1937f      0x70c73c37
+       0xd47ce2c1      0x84747455      0xd29ffe8f      0x7d5f7e59
+       0x54503948      0x33a43626      0xcb21bfaf      0x372754eb
+       0xf4e9fef0      0x7ef72486      0xea5981f7      0x6f460236
+       0xe562a5d5      0x50529138      0xe6a53b06      0x39b362e8
+       0x84899918      0xb9748fb3      0x8263ef83      0x5c6a28e4
+       0x081cc763      0x5635c0bd      0xf45de0a9      0xf676e138
+       0x70358031      0x0c96d004      0x9c7a26bd      0x621f7620
+       0x0f5f2d5d      0x4b884b34      0xe97c5049      0xc3dc680a
+       0xabd96144      0x581eb22a      0x9a21e4c9      0xa65945a9
+       0x3cb2eb06      0x198dfbcc      0xeed765e4      0xa79433b5
+       0x1eab8e7c      0xaf0caa85      0x1f64e75d      0xe5ac6d33
+       0x566cb0bc      0x99a1dd23      0x07488351      0x20420ef8
+       0xee4c584f      0x4b16ec16      0x9c22d1b6      0x0677a344
+       0xd675b2e6      0x3699da5d      0xfcd9c9a9      0xaf39754d
+       0xc20e780f      0x6a313594      0xad4d8e05      0x0b745217
+       0x1caeeaea      0x8d33c5dd      0xb5134401      0x25897152
+       0xabc5620c      0x5c6a6e2f      0x7f9bfcc6      0x4e23c064
+       0x915851ee      0x10cde250      0xd43ce4a3      0x77e3d669
+       0x83c5acd0      0xd556601c      0xb4b9b0d1      0x5fc0197d
+       0x6fe1b764      0x98736a2e      0x8f9c5d6c      0x5a3c73a0
+       0xbb9223e9      0x477fb96c      0x76e212d4      0x852c7448
+       0xe3df0ebd      0xd26e786d      0x5adf03f2      0x43a19194
+       0x39e95e1e      0x312c2c01      0xf28f5bb9      0xad9b066a
+       0x50c6804c      0xb3cb2412      0x27736125      0x2d75b115
+       0x878b9808      0xcee5e550      0xd3b21a84      0x7f73c6f6
+       0xf31048f8      0x9c27baf7      0xcbe28ae5      0xf16f55e8
+       0xff1d883a      0xb917dee3      0xd84bcba9      0x99d9bc06
+       0xd3254c6e      0x913fb216      0x33bae4b3      0x3ab2b856
+       0xe40edf7a      0x3f8e9842      0x6dcb2c20      0xb08a42bb
+       0xf82b32bc      0xd6e65b9a      0x8280902a      0x13bde0c4
+       0x5749ee1d      0xe09a44f9      0xa1ed7a47      0x92325cb1
+       0xba37e230      0x08bf455b      0xf7a8e6b1      0xf999b250
+       0x279eb5f6      0xae471b0d      0xe3ddc073      0x99a4a6d4
+       0x6f0c9b2e      0xea2ec118      0x6930dd92      0x76f731fd
+       0x3ced82b8      0xac77a11c      0xf6d40ae3      0x9709b288
+       0x066bee60      0x366e4442      0xc682e70b      0xcf3f5ee6
+       0xeb669330      0xb2bfec9f      0xd9d02229      0xe506c12c
+       0x5c499813      0x1acd8364      0x5dea0305      0x11b8cdcb
+       0xae9d46f8      0xe92f7cff      0xe47da028      0xa96b7996
+       0x3c24981c      0x8218d0dc      0xcdc423f8      0x5783ec85
+       0x71031f87      0x75f91d5b      0x7dbd9347      0x89320bd3
+       0x44ea6e5b      0xf52fed47      0x8cfba940      0xc568ba2c
+       0x32e64a48      0x467f2af2      0xe1c81736      0xd677c3c4
+       0xb691033f      0xf05f91ae      0x3ab34af4      0xb7f77aa8
+       0xec235606      0x2dd4f5d9      0x51918489      0xed4ccd82
+       0x7388c7e8      0x1b4c953d      0xa4dbc23d      0x47f6896e
+       0x5df966e6      0x51077388      0xdc110c3d      0xd784b6d1
+       0x16a759c6      0x23e10e0e      0x1ff60d5b      0xc8a0b014
+       0x23b0bac1      0x99a220ef      0x53af8b8c      0x07ac467d
+       0xc906cc36      0x3f94abe0      0x175fd4ec      0x18d9644f
+       0xad6ea521      0xb6c70a07      0x32f6af52      0x9f62ad48
+       0xe1f3d447      0x407b2768      0x1e081391      0x29a24dca
+       0x92d3b535      0x2a445762      0x066c94fa      0x6da4b159
+       0xbcb3c6e3      0x67127ece      0x75cb186a      0x31c96430
+       0xa8bdacd8      0x8e73d453      0xcd809a5c      0x6e651761
+       0x6b594127      0xff12aab7      0x91d08ff8      0x86080248
+       0x52107544      0x80894884      0x05e57b3f      0x80cab344
+       0xfe8e16fa      0xf65fe16e      0xe2265c3e      0xe2cbb1d6
+       0x7330dbd6      0x2c9535e6      0x6a1e434c      0xf575b138
+       0x7a6f4b59      0x24fb8bf5      0x62502c89      0x92e0442b
+       0x5c77ab13      0x1d83ce27      0xfa7e3916      0x5eb18873
+       0xcc314bbb      0x9d641295      0x7fff5b4f      0x10cf0507
+       0x4bdf7795      0x77536166      0x6746a004      0x4886b845
+       0x5aa46f6d      0xe30d9ba2      0xef7f14e7      0xdca44530
+       0x0516615d      0x43927969      0xc80235f7      0xd8473012
+       0x8b4b2e12      0x841ec702      0xfa110fbe      0xcad703e9
+       0x5df65ee2      0x947b7c2c      0x7cac7cfb      0x3282a0b5
+       0x5c67da3b      0x71459bfd      0x91b055db      0xc951eeed
+       0xde06eeda      0xaaea5aca      0x08d9226d      0x1e0c0b50
+       0x44ae07b8      0xf037265d      0x823100f8      0xa642e2e5
+       0x7f54061d      0xa0026339      0xbd969e25      0x51eb6051
+       0xb7b2b522      0x7e3a0bd7      0xd8116971      0x3e973442
+       0x8cdc35f3      0x0d108320      0x7a2f92dc      0x2c94b7a4
+       0x6ab06326      0x50b9b16c      0x9bb91308      0xacd38150
+       0x05922ec7      0x9f48a633      0x8e72317b      0x41b59d8c
+       0xc6cdfe4c      0x2f628aac      0x3874bd08      0xb4e572ad
+       0x7649260e      0x71b6aaf9      0x39dab510      0x858f965e
+       0x322ba132      0x58c33983      0x25f5a5c5      0x45131737
+       0xc9efed2a      0x43dcdc7a      0xb8176559      0x62a26ac4
+       0x1ee7c5b1      0xc0f02a9b      0x26dd7616      0x8d0c377c
+       0x9c5c57c6      0x06edf20c      0x22ad4eaf      0x5bddddc4
+       0x7e221c25      0xbbec97e9      0xf82338e3      0xbb5c5916
+       0x65885430      0x962077de      0xe52142ec      0x4c10a5a6
+       0xcbf19d91      0x825cb043      0x21b49df1      0x1407f2c4
+       0xa3cc17b2      0x796ed4ad      0x1859e928      0xeb9f55d2
+       0x2f5fb606      0x4ef1bf74      0xa00279f9      0xc9fa2517
+       0x925d9a77      0x164beb20      0xc4c52a47      0x3cd6b3f3
+       0x607d07d0      0x1791803c      0xe82123a4      0xe2409ff9
+       0xbcafaa43      0xd4809fe4      0x0ff22683      0x7ef4d5f9
+       0xf67098f2      0x215173e0      0xe84b651d      0xfff97430
+       0x9117caa5      0x9701e965      0xfb41af2b      0x2de0b345
+       0x863219cd      0x57dbfb08      0x5ed9878f      0xda9848c8
+       0xbd6a3e2a      0x78cee879      0x65a9ae31      0xd265ab5d
+       0x4d8d0a94      0x53fe3477      0x163a9807      0xe6ee333d
+       0x230ec18a      0x805befb4      0x28c735f3      0xfcea12a8
+       0xdfb36088      0x6d71eeda      0x526509a0      0x97c07aa7
+       0x505217dd      0x471bddf6      0x861c2251      0x1d4de90c
+       0xe9b9c550      0x4741fb3f      0x67d594e5      0x0f134eea
+       0x122daaee      0xab9a4171      0xf3675a04      0x68226f18
+       0xdfeb2219      0x2d558e8d      0x3520077b      0xbd89e17e
+       0x55ee30f2      0xe89bb5dd      0x5cd339a2      0x23671683
+       0x6ae7fef5      0xff85343c      0x24592a20      0xaf79aa20
+       0xa32c6711      0x2fe7d13a      0x3f582a56      0x575b9049
+       0xd117d4a2      0xfe150bcd      0xd3598397      0x3df2fab3
+       0x1259b6fe      0x7f9137d9      0x6911f18d      0xafeeeb77
+       0x1c9c05ec      0xef1c1316      0xdc90bc14      0x3f084ebb
+       0x197022a5      0xc723baef      0x8d956a3a      0x98b49ce9
+       0x368f3198      0xa9542710      0x0d9b0fc8      0xe8940414
+       0x0e4a345f      0x93d03091      0xb91a177c      0x166de3e9
+       0x0497a17f      0x3b179d21      0x145bb508      0x59dcefdc
+       0x6c00b488      0x48c5b25a      0x11ac5ff2      0x791caabe
+       0x2a69fdb6      0xd4e828bb      0x495a2e26      0xafdbfbb9
+       0x44a9c4de      0x203ebc65      0x41783cd5      0x5eec8a1a
+       0x1b0107a4      0x8ee93772      0xa5342616      0xd1aeb1a2
+       0xeb11eea0      0xa2db8d0e      0xd887bf86      0x2328668b
+       0x6f047abb      0x1a016056      0x02792c95      0x743580e9
+       0xf597f3d6      0x48169911      0x0fe7e92a      0x0d7bdd58
+       0xf7a6dc2b      0xa928427c      0x52ad1483      0xaf181b83
+       0x129dc832      0xf771c658      0x9fb4882e      0x491bfd60
+       0x756e61cd      0xad7191fe      0x1ba10ed9      0x3cf91d75
+       0xe635f99b      0x8182d8bf      0x2567117a      0x7a9c16c6
+       0x79f4ec31      0xa0422381      0x75a6ee79      0x17fcc09c
+       0x093dac9f      0x5d86884a      0x47294d64      0x9bbbbbb7
+       0x8188504d      0x499bde9d      0xac5f4d4b      0x230012a6
+       0x06e74e6b      0x9a2af42f      0x28786631      0xd9db3613
+       0x6212a02b      0xff9c9169      0x0f7d0549      0x32cb119a
+       0xdd8d4303      0x9798bff1      0xd72ff905      0xca5365a3
+       0x3cb9f375      0xfe61bc4b      0xccd0f915      0x94151776
+       0x64166df4      0xeefd90a6      0x3a0089cb      0xc4efaca4
+       0xa64cbd96      0xbc4b834c      0x4b8be091      0x72f322fe
+       0x35e67029      0x4030ed4c      0xe0cd63a3      0xda35976a
+       0x94fbc08c      0xd6d3429b      0x6ac3087d      0x57e3eb54
+       0xeba813a4      0x9bd06f05      0x2d2f860f      0x4901e70c
+       0x226802f5      0xcc8d0940      0xa8825eb5      0x1ab23757
+       0xe842caff      0x77123976      0x647068e2      0xc75de8be
+       0x0bf388a2      0x4f501ebe      0xc64118fc      0xc1cbaabb
+       0x98c9810d      0x0b4f63e4      0x641e2360      0x168bb3c8
+       0xa1cede7b      0x5fe0d436      0xa93a4cf8      0xf7b75424
+       0xf4725a08      0xe0532c1e      0xfe83bc98      0x3a43d6e0
+       0xbebecec8      0x81bd1a51      0x5525ecd7      0x384d8d37
+       0xed6ef639      0x5efe6032      0x6937ce1f      0xb3ee8dbd
+       0xa0aa97df      0xd62d6fd7      0x5acc6d6f      0xef19f5b1
+       0x3ad0d109      0x3660bbd1      0xfbf8d7e7      0x210ab474
+       0xd9cde94d      0x4cb35844      0xb287c427      0x6087b156
+       0xc04b25c1      0x78722325      0xe5937d3b      0x2477d2bf
+       0x859237aa      0xd29b1567      0xc4b6c1ec      0xb325f9d3
+       0xb59d3b11      0x54449fb8      0xba28f795      0xc72e0157
+       0xa306042a      0x974e4bf8      0x835a665c      0x4b54f87b
+       0x25b9f700      0x2176126c      0x868ad962      0xf5478e50
+       0xa82f2f84      0x1ef6e4af      0xbfaf0c9b      0xea6acebe
+       0x55965550      0x0d1a325d      0x9b786f43      0xa3a55c13
+       0x758e4290      0x0e156cd6      0xec3fa531      0x73464f29
+       0x1639e8bf      0x051d786b      0x303c214a      0x80c09001
+       0x71f5ec60      0xb5322364      0x91ea1fc2      0xb461fe47
+       0x596fbd60      0x73671c45      0x7301b951      0xb9c9605c
+       0x1b04f497      0xfbef823b      0xc621a97b      0xe55e1d29
+       0x6984e8b5      0xefce9254      0x544f7540      0xdcd81ef6
+       0xa20e4ad6      0xc80fb804      0xb96d8a3b      0x3d04128e
+       0xdcbd0f39      0xb5d4bca3      0x7720d158      0x6da9a045
+       0x273c430e      0xece0eb38      0x672e817a      0xc0d79da7
+       0x75c37954      0x58c753de      0xcbcbad35      0x786e6c7e
+       0xe260b5d1      0xc404468d      0x57cfae75      0x39b497a8
+       0x1bae57a2      0x52c7508e      0x89b127b9      0x03736bf1
+       0xd0af6722      0x10b7cad0      0xb2fec538      0xae1bee3b
+       0xb4fcc9f5      0xc7a89d3b      0xdde3aa84      0xef24259d
+       0x5adacacb      0xd7f953d6      0x0be41a0c      0x83d6fbb0
+       0x6967528e      0xb46394d6      0xf63ebf82      0xd2b3f03e
+       0x7b86862f      0x57786dba      0xeb06cbba      0x7e989a81
+       0xb9ebccbc      0xb74fffd4      0xbec943d2      0xb9a375c3
+       0xd3344f7a      0x26c60798      0x49016082      0x551f17e0
+       0x0f4bee9d      0x614303cd      0xcad6bd8c      0x5c3bbeaf
+       0x86f4d83d      0xfc4445db      0x0f1a79e5      0xb9f0ce8c
+       0xdc4152af      0x6e8fc82f      0xf2ccad51      0x8b0b7cc3
+       0xa2aa307b      0xa520ea29      0x0292bc09      0x534ffc75
+       0x1b398c80      0x5eca089e      0xc7aff269      0x0059f0b9
+       0x541aa484      0x99943f2a      0xfc1f579e      0x85da714d
+       0xd7092c5f      0x0a167a5d      0x898726b8      0x47ffe115
+       0x8990821e      0xc08ff8a0      0x0e1a2986      0x339ff1d0
+       0xedd4aaeb      0x9350e602      0x6569e126      0x5859aafd
+       0x5b0cb2c6      0x147cfa35      0x0d905917      0xf2233208
+       0xb36ef680      0x841b48d9      0x1c6a0f0d      0x8227247e
+       0xac9bbb04      0xff8bbb90      0x6fcea1ea      0x7dfbb3aa
+       0xa464bac7      0x88633a36      0x674b0362      0x74223977
+       0x139a8d87      0x1d8a5826      0xaa254054      0xeff8db68
+       0x664d29b7      0x5f1ac3eb      0xddcba2bf      0x0e73df53
+       0x08ffe947      0xbf3f1da8      0x46f1d718      0x5ab11692
+       0xf190a0b8      0x9d0e9717      0x86757018      0x97827999
+       0x573d0b1d      0x7bf3969b      0x3172eab5      0xc5dd90bd
+       0x413d1445      0xc9612206      0x43ecc87c      0x4d0af8fb
+       0xad744b83      0x8f007f86      0x44551cd7      0xaf820402
+       0x6b9a3cd7      0xed4a0a59      0xd4eb0493      0x1bde6215
+       0xa693b3fc      0x22e4fe0d      0x057a211e      0x9973169c
+       0x086516f4      0xe1e6ba26      0xb4ad5a0e      0xbf3cf264
+       0xa40e61f0      0x12eef468      0x7be11464      0x6acb81cf
+       0xa04787f7      0xdbe5ac75      0xcad096a8      0x185cf673
+       0x6e0ea343      0xe84a1467      0xef3f00eb      0xef177b01
+       0x46dd87bc      0x34309420      0x0821d1d1      0x39000215
+       0x685f4c0e      0xb80c1c87      0x9756d5ff      0xbbcaf5b0
+       0xde2d1453      0x4c9f69d1      0x56196e6b      0xef81e9a5
+       0xfc22f7ce      0xca61a7a6      0x4bf15020      0xfa080406
+       0xd0b837a6      0x7bcb8577      0xfedf367c      0xfcf81696
+       0x014ed3e6      0xf3353212      0xc062d44a      0xd813a68f
+       0xd5d7a1db      0x8c45c94e      0xc5b90467      0x6f74385b
+       0x7130a2d3      0x708b9489      0xdbbb7ce7      0xfc90865c
+       0x653c5bd4      0xac3cd1e2      0xe27bb6d9      0xd41e4d6a
+       0xae016134      0x87b7b2c9      0xd994b3e9      0x71e42004
+       0xb845d3af      0x592dbebb      0x620899c0      0x8d3b090d
+       0x9d0e6a42      0xce95d950      0x4b7117d0      0x4e32208e
+       0x379df4c7      0x73c8403d      0x9c035976      0x9fa4ab3f
+       0x0e4abd10      0xea5abdc0      0xc74b08f5      0x8ad84f2f
+       0xe6ea941f      0xedd37fd7      0x8800959d      0x4eaf1dd9
+       0xc03f8601      0x3f05cec7      0xa7dc9585      0xfc497aa7
+       0x5ab6ec8d      0xf920b15a      0x0528a3a0      0xb03478f9
+       0xf58d945c      0xf6d56911      0x9d6b8f61      0x62eced7e
+       0x8c387967      0xb9c3664c      0x703321a1      0xb0779fb6
+       0x0a5ca536      0x216262ca      0x8471e2dc      0x456035c2
+       0x1f9a3f80      0x62f7b45b      0xe0fb6e10      0xd817b0a1
+       0xb04007a7      0x8a2a3997      0xc13b2ff7      0xac042c3c
+       0x0af1158f      0xb080446d      0x22561f86      0x3c449de0
+       0xbe156e20      0x7745c38a      0x19cadbff      0xcf505afc
+       0xc2f94af9      0x720e8b00      0x1d740186      0xc411e6a7
+       0x16f99b0a      0x0b949e35      0xbc306cf9      0x67f417b4
+       0xce3e2635      0xd8f3a3fa      0x4b6fd9e6      0x63cfad21
+       0xaaf1456d      0x6c520541      0xca2dcac8      0xab62863d
+       0x150a0ae3      0xa9e92a07      0x85e51d1f      0x327253e7
+       0xa0d5d35e      0x331b43ce      0x207a336a      0x3407a0b3
+       0x975a2429      0x95d42c04      0x9ff5ef17      0xfefb14c7
+       0xa3d8f8ac      0x6a112cd8      0x2d276889      0x5f2f6ef9
+       0x611636e3      0xecc81a74      0x4d482888      0xa46a478d
+       0x7de65d9d      0x921e2a1f      0x48cca90f      0x64013e1f
+       0x45aa6b87      0x5da46878      0x39a21b74      0xa72250de
+       0xebbaa970      0xef8d31f9      0x59a9e1e2      0xd3403b97
+       0x1780ddca      0x731fa40f      0x6c2ba0fe      0x4f053afb
+       0x2cf0e873      0xb6a733a8      0xc2a2e53e      0xd2241962
+       0xcb981a05      0x4af04278      0x053d4e34      0x63d071b8
+       0x731b063a      0xeed8b331      0x05221e90      0x6705a444
+       0x2c504d6d      0x231c42ec      0x8debbfaa      0x07829ed7
+       0x50ee8337      0x17ed0270      0x4a04c200      0xf5e650bd
+       0x5bbe5f66      0x72d412d3      0x40253020      0xa949f29d
+       >;
index a4321d33de514d8e44f733aad4538635c7095a3f..7e37d4f39481f2c4e4f08928126aa70a72ddfb63 100644 (file)
                        pos = <CONFIG_VGA_BIOS_ADDR>;
                };
 #endif
+#ifdef CONFIG_HAVE_VBT
+               intel-vbt {
+                       filename = CONFIG_VBT_FILE;
+                       pos = <CONFIG_VBT_ADDR>;
+               };
+#endif
 #ifdef CONFIG_HAVE_REFCODE
                intel-refcode {
                        pos = <CONFIG_X86_REFCODE_ADDR>;
diff --git a/arch/x86/include/asm/arch-braswell/fsp/fsp_configs.h b/arch/x86/include/asm/arch-braswell/fsp/fsp_configs.h
new file mode 100644 (file)
index 0000000..4b8521d
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __FSP_CONFIGS_H__
+#define __FSP_CONFIGS_H__
+
+#ifndef __ASSEMBLY__
+struct fsp_config_data {
+       struct fsp_cfg_common   common;
+       struct upd_region       fsp_upd;
+};
+
+struct fspinit_rtbuf {
+       struct common_buf       common; /* FSP common runtime data structure */
+};
+#endif
+
+/* FSP user configuration settings */
+
+#define MRC_INIT_TSEG_SIZE_1MB         1
+#define MRC_INIT_TSEG_SIZE_2MB         2
+#define MRC_INIT_TSEG_SIZE_4MB         4
+#define MRC_INIT_TSEG_SIZE_8MB         8
+
+#define MRC_INIT_MMIO_SIZE_1024MB      0x400
+#define MRC_INIT_MMIO_SIZE_1536MB      0x600
+#define MRC_INIT_MMIO_SIZE_2048MB      0x800
+
+#define IGD_DVMT50_PRE_ALLOC_32MB      0x01
+#define IGD_DVMT50_PRE_ALLOC_64MB      0x02
+#define IGD_DVMT50_PRE_ALLOC_96MB      0x03
+#define IGD_DVMT50_PRE_ALLOC_128MB     0x04
+#define IGD_DVMT50_PRE_ALLOC_160MB     0x05
+#define IGD_DVMT50_PRE_ALLOC_192MB     0x06
+#define IGD_DVMT50_PRE_ALLOC_224MB     0x07
+#define IGD_DVMT50_PRE_ALLOC_256MB     0x08
+#define IGD_DVMT50_PRE_ALLOC_288MB     0x09
+#define IGD_DVMT50_PRE_ALLOC_320MB     0x0a
+#define IGD_DVMT50_PRE_ALLOC_352MB     0x0b
+#define IGD_DVMT50_PRE_ALLOC_384MB     0x0c
+#define IGD_DVMT50_PRE_ALLOC_416MB     0x0d
+#define IGD_DVMT50_PRE_ALLOC_448MB     0x0e
+#define IGD_DVMT50_PRE_ALLOC_480MB     0x0f
+#define IGD_DVMT50_PRE_ALLOC_512MB     0x10
+
+#define APERTURE_SIZE_128MB            1
+#define APERTURE_SIZE_256MB            2
+#define APERTURE_SIZE_512MB            3
+
+#define GTT_SIZE_1MB                   1
+#define GTT_SIZE_2MB                   2
+
+#define DRAM_TYPE_DDR3                 0
+#define DRAM_TYPE_LPDDR3               1
+
+#define SDCARD_MODE_DISABLED           0
+#define SDCARD_MODE_PCI                        1
+#define SDCARD_MODE_ACPI               2
+
+#define LPE_MODE_DISABLED              0
+#define LPE_MODE_PCI                   1
+#define LPE_MODE_ACPI                  2
+
+#define CHV_SVID_CONFIG_0              0
+#define CHV_SVID_CONFIG_1              1
+#define CHV_SVID_CONFIG_2              2
+#define CHV_SVID_CONFIG_3              3
+
+#define EMMC_MODE_DISABLED             0
+#define EMMC_MODE_PCI                  1
+#define EMMC_MODE_ACPI                 2
+
+#define SATA_SPEED_GEN1                        1
+#define SATA_SPEED_GEN2                        2
+#define SATA_SPEED_GEN3                        3
+
+#define ISP_PCI_DEV_CONFIG_1           1
+#define ISP_PCI_DEV_CONFIG_2           2
+#define ISP_PCI_DEV_CONFIG_3           3
+
+#define PNP_SETTING_DISABLED           0
+#define PNP_SETTING_POWER              1
+#define PNP_SETTING_PERF               2
+#define PNP_SETTING_POWER_AND_PERF     3
+
+#endif /* __FSP_CONFIGS_H__ */
diff --git a/arch/x86/include/asm/arch-braswell/fsp/fsp_vpd.h b/arch/x86/include/asm/arch-braswell/fsp/fsp_vpd.h
new file mode 100644 (file)
index 0000000..ecb01fa
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2015, Intel Corporation
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    Intel
+ */
+
+#ifndef __FSP_VPD_H__
+#define __FSP_VPD_H__
+
+struct __packed memory_upd {
+       u64 signature;                          /* Offset 0x0020 */
+       u8 revision;                            /* Offset 0x0028 */
+       u8 unused2[7];                          /* Offset 0x0029 */
+       u16 mrc_init_tseg_size;                 /* Offset 0x0030 */
+       u16 mrc_init_mmio_size;                 /* Offset 0x0032 */
+       u8 mrc_init_spd_addr1;                  /* Offset 0x0034 */
+       u8 mrc_init_spd_addr2;                  /* Offset 0x0035 */
+       u8 mem_ch0_config;                      /* Offset 0x0036 */
+       u8 mem_ch1_config;                      /* Offset 0x0037 */
+       u32 memory_spd_ptr;                     /* Offset 0x0038 */
+       u8 igd_dvmt50_pre_alloc;                /* Offset 0x003c */
+       u8 aperture_size;                       /* Offset 0x003d */
+       u8 gtt_size;                            /* Offset 0x003e */
+       u8 legacy_seg_decode;                   /* Offset 0x003f */
+       u8 enable_dvfs;                         /* Offset 0x0040 */
+       u8 memory_type;                         /* Offset 0x0041 */
+       u8 enable_ca_mirror;                    /* Offset 0x0042 */
+       u8 reserved[189];                       /* Offset 0x0043 */
+};
+
+struct __packed azalia_verb_table_header {
+       u32 vendor_device_id;
+       u16 sub_system_id;
+       u8 revision_id;
+       u8 front_panel_support;
+       u16 number_of_rear_jacks;
+       u16 number_of_front_jacks;
+};
+
+struct __packed azalia_verb_table {
+       struct azalia_verb_table_header header;
+       u32 *data;
+};
+
+struct __packed azalia_config {
+       u8 pme_enable:1;
+       u8 docking_supported:1;
+       u8 docking_attached:1;
+       u8 hdmi_codec_enable:1;
+       u8 azalia_v_ci_enable:1;
+       u8 reserved:3;
+       u8 verb_table_num;
+       struct azalia_verb_table *verb_table;
+       u16 reset_wait_timer_ms;
+};
+
+struct gpio_family {
+       u32 confg;
+       u32 confg_changes;
+       u32 misc;
+       u32 mmio_addr;
+       wchar_t *name;
+};
+
+struct gpio_pad {
+       u32 confg0;
+       u32 confg0_changes;
+       u32 confg1;
+       u32 confg1_changes;
+       u32 community;
+       u32 mmio_addr;
+       wchar_t *name;
+       u32 misc;
+};
+
+struct __packed silicon_upd {
+       u64 signature;                          /* Offset 0x0100 */
+       u8 revision;                            /* Offset 0x0108 */
+       u8 unused3[7];                          /* Offset 0x0109 */
+       u8 sdcard_mode;                         /* Offset 0x0110 */
+       u8 enable_hsuart0;                      /* Offset 0x0111 */
+       u8 enable_hsuart1;                      /* Offset 0x0112 */
+       u8 enable_azalia;                       /* Offset 0x0113 */
+       struct azalia_config *azalia_cfg_ptr;   /* Offset 0x0114 */
+       u8 enable_sata;                         /* Offset 0x0118 */
+       u8 enable_xhci;                         /* Offset 0x0119 */
+       u8 lpe_mode;                            /* Offset 0x011a */
+       u8 enable_dma0;                         /* Offset 0x011b */
+       u8 enable_dma1;                         /* Offset 0x011c */
+       u8 enable_i2c0;                         /* Offset 0x011d */
+       u8 enable_i2c1;                         /* Offset 0x011e */
+       u8 enable_i2c2;                         /* Offset 0x011f */
+       u8 enable_i2c3;                         /* Offset 0x0120 */
+       u8 enable_i2c4;                         /* Offset 0x0121 */
+       u8 enable_i2c5;                         /* Offset 0x0122 */
+       u8 enable_i2c6;                         /* Offset 0x0123 */
+       u32 graphics_config_ptr;                /* Offset 0x0124 */
+       struct gpio_family *gpio_familiy_ptr;   /* Offset 0x0128 */
+       struct gpio_pad *gpio_pad_ptr;          /* Offset 0x012c */
+       u8 disable_punit_pwr_config;            /* Offset 0x0130 */
+       u8 chv_svid_config;                     /* Offset 0x0131 */
+       u8 disable_dptf;                        /* Offset 0x0132 */
+       u8 emmc_mode;                           /* Offset 0x0133 */
+       u8 usb3_clk_ssc;                        /* Offset 0x0134 */
+       u8 disp_clk_ssc;                        /* Offset 0x0135 */
+       u8 sata_clk_ssc;                        /* Offset 0x0136 */
+       u8 usb2_port0_pe_txi_set;               /* Offset 0x0137 */
+       u8 usb2_port0_txi_set;                  /* Offset 0x0138 */
+       u8 usb2_port0_tx_emphasis_en;           /* Offset 0x0139 */
+       u8 usb2_port0_tx_pe_half;               /* Offset 0x013a */
+       u8 usb2_port1_pe_txi_set;               /* Offset 0x013b */
+       u8 usb2_port1_txi_set;                  /* Offset 0x013c */
+       u8 usb2_port1_tx_emphasis_en;           /* Offset 0x013d */
+       u8 usb2_port1_tx_pe_half;               /* Offset 0x013e */
+       u8 usb2_port2_pe_txi_set;               /* Offset 0x013f */
+       u8 usb2_port2_txi_set;                  /* Offset 0x0140 */
+       u8 usb2_port2_tx_emphasis_en;           /* Offset 0x0141 */
+       u8 usb2_port2_tx_pe_half;               /* Offset 0x0142 */
+       u8 usb2_port3_pe_txi_set;               /* Offset 0x0143 */
+       u8 usb2_port3_txi_set;                  /* Offset 0x0144 */
+       u8 usb2_port3_tx_emphasis_en;           /* Offset 0x0145 */
+       u8 usb2_port3_tx_pe_half;               /* Offset 0x0146 */
+       u8 usb2_port4_pe_txi_set;               /* Offset 0x0147 */
+       u8 usb2_port4_txi_set;                  /* Offset 0x0148 */
+       u8 usb2_port4_tx_emphasis_en;           /* Offset 0x0149 */
+       u8 usb2_port4_tx_pe_half;               /* Offset 0x014a */
+       u8 usb3_lane0_ow2tap_gen2_deemph3p5;    /* Offset 0x014b */
+       u8 usb3_lane1_ow2tap_gen2_deemph3p5;    /* Offset 0x014c */
+       u8 usb3_lane2_ow2tap_gen2_deemph3p5;    /* Offset 0x014d */
+       u8 usb3_lane3_ow2tap_gen2_deemph3p5;    /* Offset 0x014e */
+       u8 sata_speed;                          /* Offset 0x014f */
+       u8 usb_ssic_port;                       /* Offset 0x0150 */
+       u8 usb_hsic_port;                       /* Offset 0x0151 */
+       u8 pcie_rootport_speed;                 /* Offset 0x0152 */
+       u8 enable_ssic;                         /* Offset 0x0153 */
+       u32 logo_ptr;                           /* Offset 0x0154 */
+       u32 logo_size;                          /* Offset 0x0158 */
+       u8 rtc_lock;                            /* Offset 0x015c */
+       u8 pmic_i2c_bus;                        /* Offset 0x015d */
+       u8 enable_isp;                          /* Offset 0x015e */
+       u8 isp_pci_dev_config;                  /* Offset 0x015f */
+       u8 turbo_mode;                          /* Offset 0x0160 */
+       u8 pnp_settings;                        /* Offset 0x0161 */
+       u8 sd_detect_chk;                       /* Offset 0x0162 */
+       u8 reserved[411];                       /* Offset 0x0163 */
+};
+
+#define MEMORY_UPD_ID  0x244450554d454d24      /* '$MEMUPD$' */
+#define SILICON_UPD_ID 0x244450555f495324      /* '$SI_UPD$' */
+
+struct __packed upd_region {
+       u64 signature;                          /* Offset 0x0000 */
+       u8 revision;                            /* Offset 0x0008 */
+       u8 unused0[7];                          /* Offset 0x0009 */
+       u32 memory_upd_offset;                  /* Offset 0x0010 */
+       u32 silicon_upd_offset;                 /* Offset 0x0014 */
+       u64 unused1;                            /* Offset 0x0018 */
+       struct memory_upd memory_upd;           /* Offset 0x0020 */
+       struct silicon_upd silicon_upd;         /* Offset 0x0100 */
+       u16 terminator;                         /* Offset 0x02fe */
+};
+
+#define VPD_IMAGE_ID   0x2450534657534224      /* '$BSWFSP$' */
+
+struct __packed vpd_region {
+       u64 sign;                               /* Offset 0x0000 */
+       u32 img_rev;                            /* Offset 0x0008 */
+       u32 upd_offset;                         /* Offset 0x000c */
+};
+
+#endif /* __FSP_VPD_H__ */
diff --git a/arch/x86/include/asm/arch-braswell/gpio.h b/arch/x86/include/asm/arch-braswell/gpio.h
new file mode 100644 (file)
index 0000000..5f1252f
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ *
+ * From coreboot src/soc/intel/braswell/include/soc/gpio.h
+ */
+
+#ifndef _BRASWELL_GPIO_H_
+#define _BRASWELL_GPIO_H_
+
+#include <asm/arch/iomap.h>
+
+enum mode_list {
+       M0,
+       M1,
+       M2,
+       M3,
+       M4,
+       M5,
+       M6,
+       M7,
+       M8,
+       M9,
+       M10,
+       M11,
+       M12,
+       M13,
+};
+
+enum int_select {
+       L0,
+       L1,
+       L2,
+       L3,
+       L4,
+       L5,
+       L6,
+       L7,
+       L8,
+       L9,
+       L10,
+       L11,
+       L12,
+       L13,
+       L14,
+       L15,
+};
+
+enum gpio_en {
+       NATIVE = 0xff,
+       GPIO = 0,       /* Native, no need to set PAD_VALUE */
+       GPO = 1,        /* GPO, output only in PAD_VALUE */
+       GPI = 2,        /* GPI, input only in PAD_VALUE */
+       HI_Z = 3,
+       NA_GPO = 0,
+};
+
+enum gpio_state {
+       LOW,
+       HIGH,
+};
+
+enum en_dis {
+       DISABLE,        /* Disable */
+       ENABLE,         /* Enable */
+};
+
+enum int_type {
+       INT_DIS,
+       TRIG_EDGE_LOW,
+       TRIG_EDGE_HIGH,
+       TRIG_EDGE_BOTH,
+       TRIG_LEVEL,
+};
+
+enum mask {
+       MASKABLE,
+       NON_MASKABLE,
+};
+
+enum glitch_cfg {
+       GLITCH_DISABLE,
+       EN_EDGE_DETECT,
+       EN_RX_DATA,
+       EN_EDGE_RX_DATA,
+};
+
+enum inv_rx_tx {
+       NO_INVERSION = 0,
+       INV_RX_ENABLE = 1,
+       INV_TX_ENABLE = 2,
+       INV_RX_TX_ENABLE = 3,
+       INV_RX_DATA = 4,
+       INV_TX_DATA = 8,
+};
+
+enum voltage {
+       VOLT_3_3,       /* Working on 3.3 Volts */
+       VOLT_1_8,       /* Working on 1.8 Volts */
+};
+
+enum hs_mode {
+       DISABLE_HS,     /* Disable high speed mode */
+       ENABLE_HS,      /* Enable high speed mode */
+};
+
+enum odt_up_dn {
+       PULL_UP,        /* On Die Termination Up */
+       PULL_DOWN,      /* On Die Termination Down */
+};
+
+enum odt_en {
+       DISABLE_OD,     /* On Die Termination Disable */
+       ENABLE_OD,      /* On Die Termination Enable */
+};
+
+enum pull_type {
+       P_NONE  = 0,    /* Pull None */
+       P_20K_L = 1,    /* Pull Down 20K */
+       P_5K_L  = 2,    /* Pull Down  5K */
+       P_1K_L  = 4,    /* Pull Down  1K */
+       P_20K_H = 9,    /* Pull Up 20K */
+       P_5K_H  = 10,   /* Pull Up  5K */
+       P_1K_H  = 12    /* Pull Up  1K */
+};
+
+enum bit {
+       ONE_BIT = 1,
+       TWO_BIT = 3,
+       THREE_BIT = 7,
+       FOUR_BIT = 15,
+       FIVE_BIT = 31,
+       SIX_BIT = 63,
+       SEVEN_BIT = 127,
+       EIGHT_BIT = 255
+};
+
+enum gpe_config {
+       GPE,
+       SMI,
+       SCI,
+};
+
+enum community {
+       SOUTHWEST = 0x0000,
+       NORTH = 0x8000,
+       EAST = 0x10000,
+       SOUTHEAST = 0x18000,
+       VIRTUAL = 0x20000,
+};
+
+#define NA             0xff
+#define TERMINATOR     0xffffffff
+
+#define GPIO_FAMILY_CONF(family_name, park_mode, hysctl, vp18_mode, hs_mode, \
+       odt_up_dn, odt_en, curr_src_str, rcomp, family_no, community_offset) { \
+       .confg = ((((park_mode) != NA) ? park_mode << 26 : 0) | \
+                 (((hysctl) != NA) ? hysctl << 24 : 0) | \
+                 (((vp18_mode) != NA) ? vp18_mode << 21 : 0) | \
+                 (((hs_mode) != NA) ? hs_mode << 19 : 0) | \
+                 (((odt_up_dn) != NA) ? odt_up_dn << 18 : 0) | \
+                 (((odt_en) != NA) ? odt_en << 17 : 0) | \
+                 (curr_src_str)), \
+       .confg_changes = ((((park_mode) != NA) ? ONE_BIT << 26 : 0) | \
+                         (((hysctl) != NA) ? TWO_BIT << 24 : 0) | \
+                         (((vp18_mode) != NA) ? ONE_BIT  << 21 : 0) | \
+                         (((hs_mode) != NA) ? ONE_BIT << 19 : 0) | \
+                         (((odt_up_dn) != NA) ? ONE_BIT << 18 : 0) | \
+                         (((odt_en) != NA) ? ONE_BIT << 17 : 0) | \
+                         (THREE_BIT)), \
+       .misc = ((rcomp == ENABLE) ? 1 : 0) , \
+       .mmio_addr = (community_offset == TERMINATOR) ? TERMINATOR : \
+                    ((family_no != NA) ? (IO_BASE_ADDRESS + community_offset +\
+                    (0x80 * family_no) + 0x1080) : 0) , \
+       .name = 0 \
+}
+
+#define GPIO_PAD_CONF(pad_name, mode_select, mode, gpio_config, gpio_state, \
+       gpio_light_mode, int_type, int_sel, term, open_drain, current_source,\
+       int_mask, glitch, inv_rx_tx, wake_mask, wake_mask_bit, gpe, \
+       mmio_offset, community_offset) { \
+       .confg0 = ((((int_sel) != NA) ? (int_sel << 28) : 0) | \
+                  (((glitch) != NA) ? (glitch << 26) : 0) | \
+                  (((term) != NA) ? (term << 20) : 0) | \
+                  (((mode_select) == GPIO) ? ((mode << 16) | (1 << 15)) : \
+                   ((mode << 16))) | \
+                  (((gpio_config) != NA) ? (gpio_config << 8) : 0) | \
+                  (((gpio_light_mode) != NA) ? (gpio_light_mode << 7) : 0) | \
+                  (((gpio_state) == HIGH) ? 2 : 0)), \
+       .confg0_changes = ((((int_sel) != NA) ? (FOUR_BIT << 28) : 0) | \
+                          (((glitch) != NA) ? (TWO_BIT << 26) : 0) | \
+                          (((term) != NA) ? (FOUR_BIT << 20) : 0) | \
+                          (FIVE_BIT << 15) | \
+                          (((gpio_config) != NA) ? (THREE_BIT << 8) : 0) | \
+                          (((gpio_light_mode) != NA) ? (ONE_BIT << 7) : 0) | \
+                          (((gpio_state) != NA) ? ONE_BIT << 1 : 0)), \
+       .confg1  = ((((current_source) != NA) ? (current_source << 27) : 0) | \
+                   (((inv_rx_tx) != NA) ? inv_rx_tx << 4 : 0) | \
+                   (((open_drain) != NA) ? open_drain << 3 : 0) | \
+                   (((int_type) != NA) ? int_type : 0)), \
+       .confg1_changes = ((((current_source) != NA) ? (ONE_BIT << 27) : 0) | \
+                          (((inv_rx_tx) != NA) ? FOUR_BIT << 4 : 0) | \
+                          (((open_drain) != NA) ? ONE_BIT << 3 : 0) | \
+                          (((int_type) != NA) ? THREE_BIT : 0)), \
+       .community = community_offset, \
+       .mmio_addr = (community_offset == TERMINATOR) ? TERMINATOR : \
+                    ((mmio_offset != NA) ? (IO_BASE_ADDRESS + \
+                     community_offset + mmio_offset) : 0), \
+       .name = 0, \
+       .misc = ((((gpe) != NA) ? (gpe << 0) : 0) | \
+                (((wake_mask) != NA) ? (wake_mask << 2) : 0) | \
+                (((int_mask) != NA) ? (int_mask << 3) : 0)) | \
+                (((wake_mask_bit) != NA) ? (wake_mask_bit << 4) : (NA << 4)) \
+}
+
+#endif /* _BRASWELL_GPIO_H_ */
diff --git a/arch/x86/include/asm/arch-braswell/iomap.h b/arch/x86/include/asm/arch-braswell/iomap.h
new file mode 100644 (file)
index 0000000..7df2dc5
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _BRASWELL_IOMAP_H_
+#define _BRASWELL_IOMAP_H_
+
+/* Memory Mapped IO bases */
+
+/* Power Management Controller */
+#define PMC_BASE_ADDRESS       0xfed03000
+#define PMC_BASE_SIZE          0x400
+
+/* Power Management Unit */
+#define PUNIT_BASE_ADDRESS     0xfed05000
+#define PUNIT_BASE_SIZE                0x800
+
+/* Intel Legacy Block */
+#define ILB_BASE_ADDRESS       0xfed08000
+#define ILB_BASE_SIZE          0x400
+
+/* SPI Bus */
+#define SPI_BASE_ADDRESS       0xfed01000
+#define SPI_BASE_SIZE          0x400
+
+/* Root Complex Base Address */
+#define RCBA_BASE_ADDRESS      0xfed1c000
+#define RCBA_BASE_SIZE         0x400
+
+/* IO Memory */
+#define IO_BASE_ADDRESS                0xfed80000
+#define IO_BASE_SIZE           0x4000
+
+/* MODPHY */
+#define MPHY_BASE_ADDRESS      0xfef00000
+#define MPHY_BASE_SIZE         0x100000
+
+/* IO Port bases */
+
+#define ACPI_BASE_ADDRESS      0x400
+#define ACPI_BASE_SIZE         0x80
+
+#define GPIO_BASE_ADDRESS      0x500
+#define GPIO_BASE_SIZE         0x100
+
+#define SMBUS_BASE_ADDRESS     0xefa0
+
+#endif /* _BRASWELL_IOMAP_H_ */
index 7de4c08e36eab84edf01f2b5d44e40e67bf36d51..43073ad2524f63e7926672d97554e3c9d31d9cd5 100644 (file)
@@ -8,13 +8,9 @@
 #ifndef __ASM_X86_DMA_MAPPING_H
 #define __ASM_X86_DMA_MAPPING_H
 
-#define        dma_mapping_error(x, y) 0
+#include <linux/dma-direction.h>
 
-enum dma_data_direction {
-       DMA_BIDIRECTIONAL       = 0,
-       DMA_TO_DEVICE           = 1,
-       DMA_FROM_DEVICE         = 2,
-};
+#define        dma_mapping_error(x, y) 0
 
 static inline void *dma_alloc_coherent(size_t len, unsigned long *handle)
 {
index afafb30c147feb4c63831b4faf1591cb92cf753c..43f0cdb085a42d72f639e46f58b5430fe6b3b303 100644 (file)
@@ -43,7 +43,8 @@ struct common_buf {
        u32     stack_top;
        u32     boot_mode;      /* Current system boot mode */
        void    *upd_data;      /* User platform configuraiton data region */
-       u32     reserved[7];    /* Reserved */
+       u32     tolum_size;     /* Top of low usable memory size (FSP 1.1) */
+       u32     reserved[6];    /* Reserved */
 };
 
 enum fsp_phase {
index 7c22bcd5cd8e7448d1daffd41a28abf0069a8dfa..244f86ef3d40b139cf0503f039b9b68c92c121d7 100644 (file)
@@ -127,6 +127,26 @@ struct hob_guid {
        /* GUID specific data goes here */
 };
 
+enum pixel_format {
+       pixel_rgbx_8bpc,        /* RGB 8 bit per color */
+       pixel_bgrx_8bpc,        /* BGR 8 bit per color */
+       pixel_bitmask,
+};
+
+struct __packed hob_graphics_info {
+       phys_addr_t fb_base;    /* framebuffer base address */
+       u32 fb_size;            /* framebuffer size */
+       u32 version;
+       u32 width;
+       u32 height;
+       enum pixel_format pixel_format;
+       u32 red_mask;
+       u32 green_mask;
+       u32 blue_mask;
+       u32 reserved_mask;
+       u32 pixels_per_scanline;
+};
+
 /**
  * get_next_hob() - return a pointer to the next HOB in the HOB list
  *
@@ -242,4 +262,18 @@ static inline u16 get_guid_hob_data_size(const struct hob_header *hdr)
        { 0x82, 0xb9, 0x56, 0xa5, 0xf3, 0xe6, 0x2a, 0x07 } \
        }
 
+/* The following GUIDs are newly introduced in FSP spec 1.1 */
+
+#define FSP_HOB_RESOURCE_OWNER_BOOTLOADER_TOLUM_GUID \
+       { \
+       0x73ff4f56, 0xaa8e, 0x4451, \
+       { 0xb3, 0x16, 0x36, 0x35, 0x36, 0x67, 0xad, 0x44 } \
+       }
+
+#define FSP_GRAPHICS_INFO_HOB_GUID \
+       { \
+       0x39f62cce, 0x6825, 0x4669, \
+       { 0xbb, 0x56, 0x54, 0x1a, 0xba, 0x75, 0x3a, 0x07 } \
+       }
+
 #endif
index 4a4d627b2819e5aa0d196d7d1c8112272e252a22..60ce61d1902a499f0a3990e9299374aee460d372 100644 (file)
@@ -26,7 +26,14 @@ struct __packed fsp_header {
        u32     fsp_tempram_init;       /* tempram_init offset */
        u32     fsp_init;               /* fsp_init offset */
        u32     fsp_notify;             /* fsp_notify offset */
-       u32     reserved2;
+       u32     fsp_mem_init;           /* fsp_mem_init offset */
+       u32     fsp_tempram_exit;       /* fsp_tempram_exit offset */
+       u32     fsp_silicon_init;       /* fsp_silicon_init offset */
 };
 
+#define FSP_HEADER_REVISION_1          1
+#define FSP_HEADER_REVISION_2          2
+
+#define FSP_ATTR_GRAPHICS_SUPPORT      (1 << 0)
+
 #endif
index 61d811f70e0acbf6a1dae511c4e294fd5c9bf9d9..97a50b0a73d69b947988eda1d91ee9263d2c5b0e 100644 (file)
@@ -190,6 +190,18 @@ void *fsp_get_nvs_data(const void *hob_list, u32 *len);
  */
 void *fsp_get_bootloader_tmp_mem(const void *hob_list, u32 *len);
 
+/**
+ * This function retrieves graphics information.
+ *
+ * @hob_list:      A HOB list pointer.
+ * @len:           A pointer to the graphics info HOB length.
+ *                 If the HOB is located, the length will be updated.
+ *
+ * @retval NULL:   Failed to find the graphics info HOB.
+ * @retval others: A pointer to struct hob_graphics_info.
+ */
+void *fsp_get_graphics_info(const void *hob_list, u32 *len);
+
 /**
  * This function overrides the default configurations of FSP.
  *
index 93a80fe2b6c325d31e65caa37c2222bd0c3b8e68..fcb6853a38061a6afa0bf58259d6ec66b428eb64 100644 (file)
@@ -77,6 +77,7 @@ struct arch_global_data {
        uint8_t x86_mask;
        uint32_t x86_device;
        uint64_t tsc_base;              /* Initial value returned by rdtsc() */
+       unsigned long clock_rate;       /* Clock rate of timer in Hz */
        void *new_fdt;                  /* Relocated FDT */
        uint32_t bist;                  /* Built-in self test value */
        enum pei_boot_mode_t pei_boot_mode;
index 3ea4880a30d1836ab91cccf190c7b0c7011bfd4d..afe83dd32437ed7072a19433853b2d053061e8ba 100644 (file)
@@ -8,4 +8,5 @@ obj-y += cmd_fsp.o
 obj-y += fsp_car.o
 obj-y += fsp_common.o
 obj-y += fsp_dram.o
+obj-$(CONFIG_VIDEO_FSP) += fsp_graphics.o
 obj-y += fsp_support.o
index 25546638cf6e4b9e7f7a3d9ffe76db17ab9a7e1b..2a99cfe0d034417798f48761a25a0c740774b027 100644 (file)
@@ -38,17 +38,37 @@ static int do_hdr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        for (i = 0; i < sizeof(hdr->sign); i++)
                printf("%c", *sign++);
        printf(", size %d, rev %d\n", hdr->hdr_len, hdr->hdr_rev);
-       printf("Image  : rev %d.%d, id ",
-              (hdr->img_rev >> 8) & 0xff, hdr->img_rev & 0xff);
+       printf("Image  : rev ");
+       if (hdr->hdr_rev == FSP_HEADER_REVISION_1) {
+               printf("%d.%d",
+                      (hdr->img_rev >> 8) & 0xff, hdr->img_rev & 0xff);
+       } else {
+               printf("%d.%d.%d.%d",
+                      (hdr->img_rev >> 24) & 0xff, (hdr->img_rev >> 16) & 0xff,
+                      (hdr->img_rev >> 8) & 0xff, hdr->img_rev & 0xff);
+       }
+       printf(", id ");
        for (i = 0; i < ARRAY_SIZE(hdr->img_id); i++)
                printf("%c", hdr->img_id[i]);
        printf(", addr 0x%08x, size %d\n", img_addr, hdr->img_size);
+       if (hdr->hdr_rev == FSP_HEADER_REVISION_2) {
+               printf("GFX    :%ssupported\n",
+                      hdr->img_attr & FSP_ATTR_GRAPHICS_SUPPORT ? " " : " un");
+       }
        printf("VPD    : addr 0x%08x, size %d\n",
               hdr->cfg_region_off + img_addr, hdr->cfg_region_size);
        printf("\nNumber of APIs Supported : %d\n", hdr->api_num);
        printf("\tTempRamInit : 0x%08x\n", hdr->fsp_tempram_init + img_addr);
        printf("\tFspInit     : 0x%08x\n", hdr->fsp_init + img_addr);
        printf("\tFspNotify   : 0x%08x\n", hdr->fsp_notify + img_addr);
+       if (hdr->hdr_rev == FSP_HEADER_REVISION_2) {
+               printf("\tMemoryInit  : 0x%08x\n",
+                      hdr->fsp_mem_init + img_addr);
+               printf("\tTempRamExit : 0x%08x\n",
+                      hdr->fsp_tempram_exit + img_addr);
+               printf("\tSiliconInit : 0x%08x\n",
+                      hdr->fsp_silicon_init + img_addr);
+       }
 
        return 0;
 }
diff --git a/arch/x86/lib/fsp/fsp_graphics.c b/arch/x86/lib/fsp/fsp_graphics.c
new file mode 100644 (file)
index 0000000..a19b067
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <vbe.h>
+#include <video.h>
+#include <asm/fsp/fsp_support.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct pixel {
+       u8 pos;
+       u8 size;
+};
+
+static const struct fsp_framebuffer {
+       struct pixel red;
+       struct pixel green;
+       struct pixel blue;
+       struct pixel rsvd;
+} fsp_framebuffer_format_map[] = {
+       [pixel_rgbx_8bpc] = { {0, 8}, {8, 8}, {16, 8}, {24, 8} },
+       [pixel_bgrx_8bpc] = { {16, 8}, {8, 8}, {0, 8}, {24, 8} },
+};
+
+static int save_vesa_mode(struct vesa_mode_info *vesa)
+{
+       const struct hob_graphics_info *ginfo;
+       const struct fsp_framebuffer *fbinfo;
+
+       ginfo = fsp_get_graphics_info(gd->arch.hob_list, NULL);
+
+       /*
+        * If there is no graphics info structure, bail out and keep
+        * running on the serial console.
+        */
+       if (!ginfo) {
+               debug("FSP graphics hand-off block not found\n");
+               return -ENXIO;
+       }
+
+       vesa->x_resolution = ginfo->width;
+       vesa->y_resolution = ginfo->height;
+       vesa->bits_per_pixel = 32;
+       vesa->bytes_per_scanline = ginfo->pixels_per_scanline * 4;
+       vesa->phys_base_ptr = ginfo->fb_base;
+
+       if (ginfo->pixel_format >= pixel_bitmask) {
+               debug("FSP set unknown framebuffer format: %d\n",
+                     ginfo->pixel_format);
+               return -EINVAL;
+       }
+       fbinfo = &fsp_framebuffer_format_map[ginfo->pixel_format];
+       vesa->red_mask_size = fbinfo->red.size;
+       vesa->red_mask_pos = fbinfo->red.pos;
+       vesa->green_mask_size = fbinfo->green.size;
+       vesa->green_mask_pos = fbinfo->green.pos;
+       vesa->blue_mask_size = fbinfo->blue.size;
+       vesa->blue_mask_pos = fbinfo->blue.pos;
+       vesa->reserved_mask_size = fbinfo->rsvd.size;
+       vesa->reserved_mask_pos = fbinfo->rsvd.pos;
+
+       return 0;
+}
+
+static int fsp_video_probe(struct udevice *dev)
+{
+       struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
+       struct video_priv *uc_priv = dev_get_uclass_priv(dev);
+       struct vesa_mode_info *vesa = &mode_info.vesa;
+       int ret;
+
+       printf("Video: ");
+
+       /* Initialize vesa_mode_info structure */
+       ret = save_vesa_mode(vesa);
+       if (ret)
+               goto err;
+
+       /*
+        * The framebuffer base address in the FSP graphics info HOB reflects
+        * the value assigned by the FSP. After PCI enumeration the framebuffer
+        * base address may be relocated. Let's get the updated one from device.
+        *
+        * For IGD, it seems to be always on BAR2.
+        */
+       vesa->phys_base_ptr = dm_pci_read_bar32(dev, 2);
+
+       ret = vbe_setup_video_priv(vesa, uc_priv, plat);
+       if (ret)
+               goto err;
+
+       printf("%dx%dx%d\n", uc_priv->xsize, uc_priv->ysize,
+              vesa->bits_per_pixel);
+
+       return 0;
+
+err:
+       printf("No video mode configured in FSP!\n");
+       return ret;
+}
+
+static const struct udevice_id fsp_video_ids[] = {
+       { .compatible = "fsp-fb" },
+       { }
+};
+
+U_BOOT_DRIVER(fsp_video) = {
+       .name   = "fsp_video",
+       .id     = UCLASS_VIDEO,
+       .of_match = fsp_video_ids,
+       .probe  = fsp_video_probe,
+};
+
+static struct pci_device_id fsp_video_supported[] = {
+       { PCI_DEVICE_CLASS(PCI_CLASS_DISPLAY_VGA << 8, 0xffff00) },
+       { },
+};
+
+U_BOOT_PCI_DEVICE(fsp_video, fsp_video_supported);
index ab8340c8715ac411c4ee246d86db69059ce1da27..e0c49be6357b7663dc348b5bc3f236326eed39b8 100644 (file)
@@ -425,3 +425,10 @@ void *fsp_get_bootloader_tmp_mem(const void *hob_list, u32 *len)
 
        return fsp_get_guid_hob_data(hob_list, len, (struct efi_guid *)&guid);
 }
+
+void *fsp_get_graphics_info(const void *hob_list, u32 *len)
+{
+       const struct efi_guid guid = FSP_GRAPHICS_INFO_HOB_GUID;
+
+       return fsp_get_guid_hob_data(hob_list, len, (struct efi_guid *)&guid);
+}
index 98ed4d9589a3ce76a3743cdc132f0ef7f3a594c8..8cffb6ba8bc45e453dcdef66c98224b855753401 100644 (file)
@@ -6,6 +6,7 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#include <asm/mach-types.h>
 #include <common.h>
 #if defined(CONFIG_FTMAC100) && !defined(CONFIG_DM_ETH)
 #include <netdev.h>
diff --git a/board/amarula/vyasa-rk3288/Kconfig b/board/amarula/vyasa-rk3288/Kconfig
new file mode 100644 (file)
index 0000000..8b8c308
--- /dev/null
@@ -0,0 +1,12 @@
+if TARGET_VYASA_RK3288
+
+config SYS_BOARD
+       default "vyasa-rk3288"
+
+config SYS_VENDOR
+       default "amarula"
+
+config SYS_CONFIG_NAME
+       default "vyasa-rk3288"
+
+endif
diff --git a/board/amarula/vyasa-rk3288/MAINTAINERS b/board/amarula/vyasa-rk3288/MAINTAINERS
new file mode 100644 (file)
index 0000000..10397fc
--- /dev/null
@@ -0,0 +1,6 @@
+VYASA RK3288
+M:     Jagan Teki <jagan@amarulasolutions.com>
+S:     Maintained
+F:     board/amarula/vyasa-rk3288
+F:     include/configs/vyasa-rk3288.h
+F:     configs/vyasa-rk3288_defconfig
diff --git a/board/amarula/vyasa-rk3288/Makefile b/board/amarula/vyasa-rk3288/Makefile
new file mode 100644 (file)
index 0000000..7c0d5c0
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2017 Amarula Solutions
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  += vyasa-rk3288.o
diff --git a/board/amarula/vyasa-rk3288/vyasa-rk3288.c b/board/amarula/vyasa-rk3288/vyasa-rk3288.c
new file mode 100644 (file)
index 0000000..ceee42c
--- /dev/null
@@ -0,0 +1,7 @@
+/*
+ * Copyright (C) 2017 Amarula Solutions
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
index 903732b23b85a9856ade1ea9061fdf01afc12391..98430c4246f56946430e77bc1a566544f13fc3b9 100644 (file)
@@ -84,9 +84,9 @@ void at91_spl_board_init(void)
        at91_set_pio_pullup(AT91_PIO_PORTD, 7, 1);
        at91_set_pio_pullup(AT91_PIO_PORTD, 8, 1);
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
        at91_mci_hw_init();
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_NAND_BOOT
        at91sam9m10g45ek_nand_hw_init();
 #endif
 }
index fec93165c1b038c6f51135d3cc6a87627900300a..540adf55b61c07551be338bec7f1d8be5752bd03 100644 (file)
@@ -224,11 +224,11 @@ int dram_init(void)
 
 void at91_spl_board_init(void)
 {
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
        at91_mci_hw_init();
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_NAND_BOOT
        at91sam9n12ek_nand_hw_init();
-#elif CONFIG_SYS_USE_SPIFLASH
+#elif CONFIG_SPI_BOOT
        at91_spi0_hw_init(1 << 4);
 #endif
 }
index 2452e63881f15d1145842e9960a7a23d69d2d010..be6dd4a6d39223143af71bfd3778fa3f5358ea2d 100644 (file)
@@ -235,9 +235,9 @@ int dram_init(void)
 
 void at91_spl_board_init(void)
 {
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
        at91_mci_hw_init();
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_NAND_BOOT
        at91sam9x5ek_nand_hw_init();
 #endif
 }
diff --git a/board/atmel/common/Makefile b/board/atmel/common/Makefile
new file mode 100644 (file)
index 0000000..8a6850b
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Copyright (C) 2017 Microchip
+#                    Wenyou Yang <wenyou.yang@microchip.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += board.o
+ifndef CONFIG_SPL_BUILD
+obj-$(CONFIG_I2C_EEPROM) += mac_eeprom.o
+obj-$(CONFIG_DM_VIDEO) += video_display.o
+endif
diff --git a/board/atmel/common/board.c b/board/atmel/common/board.c
new file mode 100644 (file)
index 0000000..7e326d9
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * Copyright (C) 2017 Microchip
+ *                   Wenyou Yang <wenyou.yang@microchip.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+
+void dummy(void)
+{
+}
diff --git a/board/atmel/common/mac_eeprom.c b/board/atmel/common/mac_eeprom.c
new file mode 100644 (file)
index 0000000..60ddf00
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017 Microchip
+ *                   Wenyou Yang <wenyou.yang@microchip.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <i2c_eeprom.h>
+#include <netdev.h>
+
+int at91_set_ethaddr(int offset)
+{
+       const int ETH_ADDR_LEN = 6;
+       unsigned char ethaddr[ETH_ADDR_LEN];
+       const char *ETHADDR_NAME = "ethaddr";
+       struct udevice *dev;
+       int ret;
+
+       if (env_get(ETHADDR_NAME))
+               return 0;
+
+       ret = uclass_first_device_err(UCLASS_I2C_EEPROM, &dev);
+       if (ret)
+               return ret;
+
+       ret = i2c_eeprom_read(dev, offset, ethaddr, 6);
+       if (ret)
+               return ret;
+
+       if (is_valid_ethaddr(ethaddr))
+               eth_env_set_enetaddr(ETHADDR_NAME, ethaddr);
+
+       return 0;
+}
diff --git a/board/atmel/common/video_display.c b/board/atmel/common/video_display.c
new file mode 100644 (file)
index 0000000..39ad619
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017 Microchip
+ *                   Wenyou Yang <wenyou.yang@microchip.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <atmel_lcd.h>
+#include <dm.h>
+#include <nand.h>
+#include <version.h>
+#include <video.h>
+#include <video_console.h>
+#include <asm/io.h>
+#include <asm/arch/clk.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int at91_video_show_board_info(void)
+{
+       ulong dram_size, nand_size;
+       int i;
+       u32 len = 0;
+       char buf[255];
+       char *corp = "2017 Microchip Technology Inc.\n";
+       char temp[32];
+       struct udevice *dev, *con;
+       const char *s;
+       vidinfo_t logo_info;
+       int ret;
+
+       len += sprintf(&buf[len], "%s\n", U_BOOT_VERSION);
+       memcpy(&buf[len], corp, strlen(corp));
+       len += strlen(corp);
+       len += sprintf(&buf[len], "%s CPU at %s MHz\n", get_cpu_name(),
+                       strmhz(temp, get_cpu_clk_rate()));
+
+       dram_size = 0;
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
+               dram_size += gd->bd->bi_dram[i].size;
+
+       nand_size = 0;
+#ifdef CONFIG_NAND_ATMEL
+       for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
+               nand_size += nand_info[i]->size;
+#endif
+
+       len += sprintf(&buf[len], "%ld MB SDRAM, %ld MB NAND\n",
+                      dram_size >> 20, nand_size >> 20);
+
+       ret = uclass_get_device(UCLASS_VIDEO, 0, &dev);
+       if (ret)
+               return ret;
+
+       microchip_logo_info(&logo_info);
+       ret = video_bmp_display(dev, logo_info.logo_addr,
+                               logo_info.logo_x_offset,
+                               logo_info.logo_y_offset, false);
+       if (ret)
+               return ret;
+
+       ret = uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con);
+       if (ret)
+               return ret;
+
+       vidconsole_position_cursor(con, 0, logo_info.logo_height);
+       for (s = buf, i = 0; i < len; s++, i++)
+               vidconsole_put_char(con, *s);
+
+       return 0;
+}
diff --git a/board/atmel/sama5d27_som1_ek/Kconfig b/board/atmel/sama5d27_som1_ek/Kconfig
new file mode 100644 (file)
index 0000000..3276214
--- /dev/null
@@ -0,0 +1,15 @@
+if TARGET_SAMA5D27_SOM1_EK
+
+config SYS_BOARD
+       default "sama5d27_som1_ek"
+
+config SYS_VENDOR
+       default "atmel"
+
+config SYS_SOC
+       default "at91"
+
+config SYS_CONFIG_NAME
+       default "sama5d27_som1_ek"
+
+endif
diff --git a/board/atmel/sama5d27_som1_ek/MAINTAINERS b/board/atmel/sama5d27_som1_ek/MAINTAINERS
new file mode 100644 (file)
index 0000000..609583c
--- /dev/null
@@ -0,0 +1,6 @@
+SAMA5D27 SOM1 EK BOARD
+M:     Wenyou Yang <wenyou.yang@microchip.com>
+S:     Maintained
+F:     board/atmel/sama5d27_som1_ek/
+F:     include/configs/sama5d27_som1_ek.h
+F:     configs/sama5d27_som1_ek_mmc_defconfig
diff --git a/board/atmel/sama5d27_som1_ek/Makefile b/board/atmel/sama5d27_som1_ek/Makefile
new file mode 100644 (file)
index 0000000..4ab242c
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Copyright (C) 2017 Microchip Corporation
+#                   Wenyou Yang <wenyou.yang@microchip.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += sama5d27_som1_ek.o
diff --git a/board/atmel/sama5d27_som1_ek/sama5d27_som1_ek.c b/board/atmel/sama5d27_som1_ek/sama5d27_som1_ek.c
new file mode 100644 (file)
index 0000000..80d7725
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2017 Microchip Corporation
+ *                   Wenyou.Yang <wenyou.yang@microchip.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <debug_uart.h>
+#include <asm/io.h>
+#include <asm/arch/at91_common.h>
+#include <asm/arch/atmel_pio4.h>
+#include <asm/arch/atmel_mpddrc.h>
+#include <asm/arch/atmel_sdhci.h>
+#include <asm/arch/clk.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/sama5d2.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static void board_usb_hw_init(void)
+{
+       atmel_pio4_set_pio_output(AT91_PIO_PORTB, 10, 1);
+}
+
+#ifdef CONFIG_BOARD_LATE_INIT
+int board_late_init(void)
+{
+#ifdef CONFIG_DM_VIDEO
+       at91_video_show_board_info();
+#endif
+       return 0;
+}
+#endif
+
+#ifdef CONFIG_DEBUG_UART_BOARD_INIT
+static void board_uart1_hw_init(void)
+{
+       atmel_pio4_set_a_periph(AT91_PIO_PORTD, 2, 1);  /* URXD1 */
+       atmel_pio4_set_a_periph(AT91_PIO_PORTD, 3, 0);  /* UTXD1 */
+
+       at91_periph_clk_enable(ATMEL_ID_UART1);
+}
+
+void board_debug_uart_init(void)
+{
+       board_uart1_hw_init();
+}
+#endif
+
+#ifdef CONFIG_BOARD_EARLY_INIT_F
+int board_early_init_f(void)
+{
+#ifdef CONFIG_DEBUG_UART
+       debug_uart_init();
+#endif
+
+       return 0;
+}
+#endif
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+#ifdef CONFIG_CMD_USB
+       board_usb_hw_init();
+#endif
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE,
+                                   CONFIG_SYS_SDRAM_SIZE);
+       return 0;
+}
+
+#define MAC24AA_MAC_OFFSET     0xfa
+
+#ifdef CONFIG_MISC_INIT_R
+int misc_init_r(void)
+{
+#ifdef CONFIG_I2C_EEPROM
+       at91_set_ethaddr(MAC24AA_MAC_OFFSET);
+#endif
+       return 0;
+}
+#endif
+
+/* SPL */
+#ifdef CONFIG_SPL_BUILD
+void spl_board_init(void)
+{
+}
+
+static void ddrc_conf(struct atmel_mpddrc_config *ddrc)
+{
+       ddrc->md = (ATMEL_MPDDRC_MD_DBW_16_BITS | ATMEL_MPDDRC_MD_DDR2_SDRAM);
+
+       ddrc->cr = (ATMEL_MPDDRC_CR_NC_COL_10 |
+                   ATMEL_MPDDRC_CR_NR_ROW_13 |
+                   ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
+                   ATMEL_MPDDRC_CR_DIC_DS |
+                   ATMEL_MPDDRC_CR_ZQ_LONG |
+                   ATMEL_MPDDRC_CR_NB_8BANKS |
+                   ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
+                   ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
+
+       ddrc->rtr = 0x511;
+
+       ddrc->tpr0 = ((7 << ATMEL_MPDDRC_TPR0_TRAS_OFFSET) |
+                     (3 << ATMEL_MPDDRC_TPR0_TRCD_OFFSET) |
+                     (3 << ATMEL_MPDDRC_TPR0_TWR_OFFSET) |
+                     (9 << ATMEL_MPDDRC_TPR0_TRC_OFFSET) |
+                     (3 << ATMEL_MPDDRC_TPR0_TRP_OFFSET) |
+                     (4 << ATMEL_MPDDRC_TPR0_TRRD_OFFSET) |
+                     (4 << ATMEL_MPDDRC_TPR0_TWTR_OFFSET) |
+                     (2 << ATMEL_MPDDRC_TPR0_TMRD_OFFSET));
+
+       ddrc->tpr1 = ((22 << ATMEL_MPDDRC_TPR1_TRFC_OFFSET) |
+                     (23 << ATMEL_MPDDRC_TPR1_TXSNR_OFFSET) |
+                     (200 << ATMEL_MPDDRC_TPR1_TXSRD_OFFSET) |
+                     (3 << ATMEL_MPDDRC_TPR1_TXP_OFFSET));
+
+       ddrc->tpr2 = ((2 << ATMEL_MPDDRC_TPR2_TXARD_OFFSET) |
+                     (8 << ATMEL_MPDDRC_TPR2_TXARDS_OFFSET) |
+                     (4 << ATMEL_MPDDRC_TPR2_TRPA_OFFSET) |
+                     (4 << ATMEL_MPDDRC_TPR2_TRTP_OFFSET) |
+                     (8 << ATMEL_MPDDRC_TPR2_TFAW_OFFSET));
+}
+
+void mem_init(void)
+{
+       struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
+       struct atmel_mpddr *mpddrc = (struct atmel_mpddr *)ATMEL_BASE_MPDDRC;
+       struct atmel_mpddrc_config ddrc_config;
+       u32 reg;
+
+       ddrc_conf(&ddrc_config);
+
+       at91_periph_clk_enable(ATMEL_ID_MPDDRC);
+       writel(AT91_PMC_DDR, &pmc->scer);
+
+       reg = readl(&mpddrc->io_calibr);
+       reg &= ~ATMEL_MPDDRC_IO_CALIBR_RDIV;
+       reg |= ATMEL_MPDDRC_IO_CALIBR_DDR3_RZQ_55;
+       reg &= ~ATMEL_MPDDRC_IO_CALIBR_TZQIO;
+       reg |= ATMEL_MPDDRC_IO_CALIBR_TZQIO_(101);
+       writel(reg, &mpddrc->io_calibr);
+
+       writel(ATMEL_MPDDRC_RD_DATA_PATH_SHIFT_ONE_CYCLE,
+              &mpddrc->rd_data_path);
+
+       ddr3_init(ATMEL_BASE_MPDDRC, ATMEL_BASE_DDRCS, &ddrc_config);
+
+       writel(0x3, &mpddrc->cal_mr4);
+       writel(64, &mpddrc->tim_cal);
+}
+
+void at91_pmc_init(void)
+{
+       u32 tmp;
+
+       /*
+        * while coming from the ROM code, we run on PLLA @ 492 MHz / 164 MHz
+        * so we need to slow down and configure MCKR accordingly.
+        * This is why we have a special flavor of the switching function.
+        */
+       tmp = AT91_PMC_MCKR_PLLADIV_2 |
+             AT91_PMC_MCKR_MDIV_3 |
+             AT91_PMC_MCKR_CSS_MAIN;
+       at91_mck_init_down(tmp);
+
+       tmp = AT91_PMC_PLLAR_29 |
+             AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
+             AT91_PMC_PLLXR_MUL(40) |
+             AT91_PMC_PLLXR_DIV(1);
+       at91_plla_init(tmp);
+
+       tmp = AT91_PMC_MCKR_H32MXDIV |
+             AT91_PMC_MCKR_PLLADIV_2 |
+             AT91_PMC_MCKR_MDIV_3 |
+             AT91_PMC_MCKR_CSS_PLLA;
+       at91_mck_init(tmp);
+}
+#endif
index 9e6544bc075f00f3805650b035d34f88919b4504..c441e69ee421b55efaee1881bb976321e09eadd0 100644 (file)
@@ -196,11 +196,11 @@ int board_eth_init(bd_t *bis)
 #ifdef CONFIG_SPL_BUILD
 void spl_board_init(void)
 {
-#ifdef CONFIG_SYS_USE_SERIALFLASH
+#ifdef CONFIG_SPI_BOOT
        board_spi0_hw_init();
 #endif
 
-#ifdef CONFIG_SYS_USE_NANDFLASH
+#ifdef CONFIG_NAND_BOOT
        board_nand_hw_init();
 #endif
 }
index 3f0860c555a5d464eb44a1d164450d1900ff1e0f..57586530304531880c6a6f7b702b6d1b9d09c048 100644 (file)
@@ -8,8 +8,6 @@
 #include <common.h>
 #include <atmel_hlcdc.h>
 #include <debug_uart.h>
-#include <dm.h>
-#include <i2c.h>
 #include <lcd.h>
 #include <version.h>
 #include <asm/io.h>
@@ -161,50 +159,14 @@ int dram_init(void)
        return 0;
 }
 
-#ifdef CONFIG_CMD_I2C
-static int set_ethaddr_from_eeprom(void)
-{
-       const int ETH_ADDR_LEN = 6;
-       unsigned char ethaddr[ETH_ADDR_LEN];
-       const char *ETHADDR_NAME = "ethaddr";
-       struct udevice *bus, *dev;
-
-       if (env_get(ETHADDR_NAME))
-               return 0;
-
-       if (uclass_get_device_by_seq(UCLASS_I2C, 1, &bus)) {
-               printf("Cannot find I2C bus 1\n");
-               return -1;
-       }
-
-       if (dm_i2c_probe(bus, AT24MAC_ADDR, 0, &dev)) {
-               printf("Failed to probe I2C chip\n");
-               return -1;
-       }
-
-       if (dm_i2c_read(dev, AT24MAC_REG, ethaddr, ETH_ADDR_LEN)) {
-               printf("Failed to read ethernet address from EEPROM\n");
-               return -1;
-       }
-
-       if (!is_valid_ethaddr(ethaddr)) {
-               printf("The ethernet address read from EEPROM is not valid!\n");
-               return -1;
-       }
-
-       return eth_env_set_enetaddr(ETHADDR_NAME, ethaddr);
-}
-#else
-static int set_ethaddr_from_eeprom(void)
-{
-       return 0;
-}
-#endif
+#define AT24MAC_MAC_OFFSET     0x9a
 
 #ifdef CONFIG_MISC_INIT_R
 int misc_init_r(void)
 {
-       set_ethaddr_from_eeprom();
+#ifdef CONFIG_I2C_EEPROM
+       at91_set_ethaddr(AT24MAC_MAC_OFFSET);
+#endif
 
        return 0;
 }
@@ -285,6 +247,16 @@ void at91_pmc_init(void)
        struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
        u32 tmp;
 
+       /*
+        * while coming from the ROM code, we run on PLLA @ 492 MHz / 164 MHz
+        * so we need to slow down and configure MCKR accordingly.
+        * This is why we have a special flavor of the switching function.
+        */
+       tmp = AT91_PMC_MCKR_PLLADIV_2 |
+             AT91_PMC_MCKR_MDIV_3 |
+             AT91_PMC_MCKR_CSS_MAIN;
+       at91_mck_init_down(tmp);
+
        tmp = AT91_PMC_PLLAR_29 |
              AT91_PMC_PLLXR_PLLCOUNT(0x3f) |
              AT91_PMC_PLLXR_MUL(82) |
index ba7f9f244342dd9779e2973bd4892005a97b5fef..f32e86b0cb275bc2e1149e4dc4d714dcfe7ca0f4 100644 (file)
@@ -112,11 +112,11 @@ int dram_init(void)
 #ifdef CONFIG_SPL_BUILD
 void spl_board_init(void)
 {
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 #ifdef CONFIG_GENERIC_ATMEL_MCI
        sama5d3_xplained_mci0_hw_init();
 #endif
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_NAND_BOOT
        sama5d3_xplained_nand_hw_init();
 #endif
 }
index 88bcd876c9562e4f17ab8e77ef8096f68e50282d..6d473fc06dbd94e67cc64796d55d0a642c300939 100644 (file)
@@ -277,7 +277,7 @@ int board_late_init(void)
 #ifdef CONFIG_SPL_BUILD
 void spl_board_init(void)
 {
-#if CONFIG_SYS_USE_NANDFLASH
+#if CONFIG_NAND_BOOT
        sama5d3xek_nand_hw_init();
 #endif
 }
index 854afcb6224a00cb293ada60ea62ca538caaf0f9..9236a285492105224d3d40203f1e9f9eb3520410 100644 (file)
@@ -192,6 +192,18 @@ int board_early_init_f(void)
 }
 #endif
 
+#define AT24MAC_MAC_OFFSET     0x9a
+
+#ifdef CONFIG_MISC_INIT_R
+int misc_init_r(void)
+{
+#ifdef CONFIG_I2C_EEPROM
+       at91_set_ethaddr(AT24MAC_MAC_OFFSET);
+#endif
+       return 0;
+}
+#endif
+
 int board_init(void)
 {
        /* adress of boot parameters */
@@ -221,7 +233,7 @@ int dram_init(void)
 #ifdef CONFIG_SPL_BUILD
 void spl_board_init(void)
 {
-#if CONFIG_SYS_USE_NANDFLASH
+#if CONFIG_NAND_BOOT
        sama5d4_xplained_nand_hw_init();
 #endif
 }
index ba7974643e4397713c3d6563f8b14dbfc1d737e0..ee07038e2e4f9e2270a94351297495bae6c6dc0b 100644 (file)
@@ -217,7 +217,7 @@ int dram_init(void)
 #ifdef CONFIG_SPL_BUILD
 void spl_board_init(void)
 {
-#if CONFIG_SYS_USE_NANDFLASH
+#if CONFIG_NAND_BOOT
        sama5d4ek_nand_hw_init();
 #endif
 }
index 9d28da4ba410ec18c22f378346dcbb73d204926c..f3dff95710aa609f38599ddfa14c0faca818babd 100644 (file)
@@ -151,10 +151,4 @@ void board_init_f(ulong dummy)
 
        /* configure MMDC for SDRAM width/size and per-model calibration */
        ot1200_spl_dram_init();
-
-       /* Clear the BSS. */
-       memset(__bss_start, 0, __bss_end - __bss_start);
-
-       /* load/boot image from boot device */
-       board_init_r(NULL, 0);
 }
index 0db0609727f755b383296973ccb780f9e8e4fecd..21449ca029b0d86f00e36c52ce21c59e6c1856a5 100644 (file)
 
 /* Serial console */
 static const struct pad_conf_entry cl_som_am57x_padconf_console[] = {
-       {UART3_RXD, (FSC | IEN | PDIS | PTU | M0)}, /* UART3_RXD */
-       {UART3_TXD, (FSC | IEN | PDIS | PTU | M0)}, /* UART3_TXD */
+       {UART3_RXD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* UART3_RXD */
+       {UART3_TXD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)}, /* UART3_TXD */
 };
 
 /* PMIC I2C */
 static const struct pad_conf_entry cl_som_am57x_padconf_pmic[] = {
-       {MCASP1_ACLKR, (IEN | PEN | M10)}, /* MCASP1_ACLKR.I2C4_SDA */
-       {MCASP1_FSR,   (IEN | PEN | M10)}, /* MCASP1_FSR.I2C4_SCL */
+       {MCASP1_ACLKR, (M10 | PIN_INPUT)}, /* MCASP1_ACLKR.I2C4_SDA */
+       {MCASP1_FSR,   (M10 | PIN_INPUT)}, /* MCASP1_FSR.I2C4_SCL */
 };
 
 /* Green GPIO led */
 static const struct pad_conf_entry cl_som_am57x_padconf_green_led[] = {
-       {GPMC_A15, (IDIS | PDIS | PTD | M14)}, /* GPMC_A15.GPIO2_5 */
+       {GPMC_A15, (M14 | PIN_OUTPUT_PULLDOWN)}, /* GPMC_A15.GPIO2_5 */
 };
 
 /* MMC/SD Card */
 static const struct pad_conf_entry cl_som_am57x_padconf_sd_card[] = {
-       {MMC1_CLK,  (IEN | PDIS | PTU | M0) }, /* MMC1_CLK */
-       {MMC1_CMD,  (IEN | PDIS | PTU | M0) }, /* MMC1_CMD */
-       {MMC1_DAT0, (IEN | PDIS | PTU | M0) }, /* MMC1_DAT0 */
-       {MMC1_DAT1, (IEN | PDIS | PTU | M0) }, /* MMC1_DAT1 */
-       {MMC1_DAT2, (IEN | PDIS | PTU | M0) }, /* MMC1_DAT2 */
-       {MMC1_DAT3, (IEN | PDIS | PTU | M0) }, /* MMC1_DAT3 */
-       {MMC1_SDCD, (IEN | PEN  |       M14)}, /* MMC1_SDCD */
-       {MMC1_SDWP, (IEN | PEN  |       M14)}, /* MMC1_SDWP */
+       {MMC1_CLK,  (M0  | PIN_INPUT_PULLUP)}, /* MMC1_CLK */
+       {MMC1_CMD,  (M0  | PIN_INPUT_PULLUP)}, /* MMC1_CMD */
+       {MMC1_DAT0, (M0  | PIN_INPUT_PULLUP)}, /* MMC1_DAT0 */
+       {MMC1_DAT1, (M0  | PIN_INPUT_PULLUP)}, /* MMC1_DAT1 */
+       {MMC1_DAT2, (M0  | PIN_INPUT_PULLUP)}, /* MMC1_DAT2 */
+       {MMC1_DAT3, (M0  | PIN_INPUT_PULLUP)}, /* MMC1_DAT3 */
+       {MMC1_SDCD, (M14 | PIN_INPUT)       }, /* MMC1_SDCD */
+       {MMC1_SDWP, (M14 | PIN_INPUT)       }, /* MMC1_SDWP */
 };
 
 /* WiFi - must be in the safe mode on boot */
 static const struct pad_conf_entry cl_som_am57x_padconf_wifi[] = {
-       {UART1_CTSN, (IEN | M15)}, /* UART1_CTSN */
-       {UART1_RTSN, (IEN | M15)}, /* UART1_RTSN */
-       {UART2_RXD,  (IEN | M15)}, /* UART2_RXD */
-       {UART2_TXD,  (IEN | M15)}, /* UART2_TXD */
-       {UART2_CTSN, (IEN | M15)}, /* UART2_CTSN */
-       {UART2_RTSN, (IEN | M15)}, /* UART2_RTSN */
+       {UART1_CTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* UART1_CTSN */
+       {UART1_RTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* UART1_RTSN */
+       {UART2_RXD,  (M15 | PIN_INPUT_PULLDOWN)}, /* UART2_RXD */
+       {UART2_TXD,  (M15 | PIN_INPUT_PULLDOWN)}, /* UART2_TXD */
+       {UART2_CTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* UART2_CTSN */
+       {UART2_RTSN, (M15 | PIN_INPUT_PULLDOWN)}, /* UART2_RTSN */
 };
 
 /* QSPI */
 static const struct pad_conf_entry cl_som_am57x_padconf_qspi[] = {
-       {GPMC_A13, (IEN | PEN  |       M1)}, /* GPMC_A13.QSPI1_RTCLK */
-       {GPMC_A18, (IEN | PEN  |       M1)}, /* GPMC_A18.QSPI1_SCLK */
-       {GPMC_A16, (IEN | PEN  |       M1)}, /* GPMC_A16.QSPI1_D0 */
-       {GPMC_A17, (IEN | PEN  |       M1)}, /* GPMC_A17.QSPI1_D1 */
-       {GPMC_CS2, (IEN | PDIS | PTU | M1)}, /* GPMC_CS2.QSPI1_CS0 */
+       {GPMC_A13, (M1 | PIN_INPUT)       }, /* GPMC_A13.QSPI1_RTCLK */
+       {GPMC_A18, (M1 | PIN_INPUT)       }, /* GPMC_A18.QSPI1_SCLK */
+       {GPMC_A16, (M1 | PIN_INPUT)       }, /* GPMC_A16.QSPI1_D0 */
+       {GPMC_A17, (M1 | PIN_INPUT)       }, /* GPMC_A17.QSPI1_D1 */
+       {GPMC_CS2, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_CS2.QSPI1_CS0 */
 };
 
 /* GPIO Expander I2C */
 static const struct pad_conf_entry cl_som_am57x_padconf_i2c_gpio[] = {
-       {MCASP1_AXR0, (IEN | PEN | M10)}, /* MCASP1_AXR0.I2C5_SDA */
-       {MCASP1_AXR1, (IEN | PEN | M10)}, /* MCASP1_AXR1.I2C5_SCL */
+       {MCASP1_AXR0, (M10 | PIN_INPUT)}, /* MCASP1_AXR0.I2C5_SDA */
+       {MCASP1_AXR1, (M10 | PIN_INPUT)}, /* MCASP1_AXR1.I2C5_SCL */
 };
 
 /* eMMC internal storage */
 static const struct pad_conf_entry cl_som_am57x_padconf_emmc[] = {
-       {GPMC_A19, (IEN | PDIS | PTU | M1)}, /* GPMC_A19.MMC2_DAT4 */
-       {GPMC_A20, (IEN | PDIS | PTU | M1)}, /* GPMC_A20.MMC2_DAT5 */
-       {GPMC_A21, (IEN | PDIS | PTU | M1)}, /* GPMC_A21.MMC2_DAT6 */
-       {GPMC_A22, (IEN | PDIS | PTU | M1)}, /* GPMC_A22.MMC2_DAT7 */
-       {GPMC_A23, (IEN | PDIS | PTU | M1)}, /* GPMC_A23.MMC2_CLK */
-       {GPMC_A24, (IEN | PDIS | PTU | M1)}, /* GPMC_A24.MMC2_DAT0 */
-       {GPMC_A25, (IEN | PDIS | PTU | M1)}, /* GPMC_A25.MMC2_DAT1 */
-       {GPMC_A26, (IEN | PDIS | PTU | M1)}, /* GPMC_A26.MMC2_DAT2 */
-       {GPMC_A27, (IEN | PDIS | PTU | M1)}, /* GPMC_A27.MMC2_DAT3 */
-       {GPMC_CS1, (IEN | PDIS | PTU | M1)}, /* GPMC_CS1.MMC2_CMD */
+       {GPMC_A19, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A19.MMC2_DAT4 */
+       {GPMC_A20, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A20.MMC2_DAT5 */
+       {GPMC_A21, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A21.MMC2_DAT6 */
+       {GPMC_A22, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A22.MMC2_DAT7 */
+       {GPMC_A23, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A23.MMC2_CLK */
+       {GPMC_A24, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A24.MMC2_DAT0 */
+       {GPMC_A25, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A25.MMC2_DAT1 */
+       {GPMC_A26, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A26.MMC2_DAT2 */
+       {GPMC_A27, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_A27.MMC2_DAT3 */
+       {GPMC_CS1, (M1 | PIN_INPUT_PULLUP)}, /* GPMC_CS1.MMC2_CMD */
 };
 
 /* usb1_drvvbus */
 static const struct pad_conf_entry cl_som_am57x_padconf_usb[] = {
-       {USB1_DRVVBUS, (M0 | FSC) }, /* USB1_DRVVBUS.USB1_DRVVBUS */
+       /* USB1_DRVVBUS.USB1_DRVVBUS */
+       {USB1_DRVVBUS, (M0 | PIN_OUTPUT_PULLDOWN | SLEWCONTROL) },
 };
 
 /* Ethernet */
 static const struct pad_conf_entry cl_som_am57x_padconf_ethernet[] = {
        /* MDIO bus */
-       {VIN2A_D10,  (PDIS | PTU  |       M3) }, /* VIN2A_D10.MDIO_MCLK  */
-       {VIN2A_D11,  (IEN  | PDIS | PTU | M3) }, /* VIN2A_D11.MDIO_D  */
+       {VIN2A_D10,  (M3  | PIN_OUTPUT_PULLUP) }, /* VIN2A_D10.MDIO_MCLK  */
+       {VIN2A_D11,  (M3  | PIN_INPUT_PULLUP)  }, /* VIN2A_D11.MDIO_D  */
        /* EMAC Slave 1 at addr 0x1 - Default interface */
-       {VIN2A_D12,  (IDIS | PEN  |       M3) }, /* VIN2A_D12.RGMII1_TXC */
-       {VIN2A_D13,  (IDIS | PEN  |       M3) }, /* VIN2A_D13.RGMII1_TXCTL */
-       {VIN2A_D14,  (IDIS | PEN  |       M3) }, /* VIN2A_D14.RGMII1_TXD3 */
-       {VIN2A_D15,  (IDIS | PEN  |       M3) }, /* VIN2A_D15.RGMII1_TXD2 */
-       {VIN2A_D16,  (IDIS | PEN  |       M3) }, /* VIN2A_D16.RGMII1_TXD1 */
-       {VIN2A_D17,  (IDIS | PEN  |       M3) }, /* VIN2A_D17.RGMII1_TXD0 */
-       {VIN2A_D18,  (IEN  | PDIS | PTD | M3) }, /* VIN2A_D18.RGMII1_RXC */
-       {VIN2A_D19,  (IEN  | PDIS | PTD | M3) }, /* VIN2A_D19.RGMII1_RXCTL */
-       {VIN2A_D20,  (IEN  | PDIS | PTD | M3) }, /* VIN2A_D20.RGMII1_RXD3 */
-       {VIN2A_D21,  (IEN  | PDIS | PTD | M3) }, /* VIN2A_D21.RGMII1_RXD2 */
-       {VIN2A_D22,  (IEN  | PDIS | PTD | M3) }, /* VIN2A_D22.RGMII1_RXD1 */
-       {VIN2A_D23,  (IEN  | PDIS | PTD | M3) }, /* VIN2A_D23.RGMII1_RXD0 */
+       {VIN2A_D12,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D12.RGMII1_TXC */
+       {VIN2A_D13,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D13.RGMII1_TXCTL */
+       {VIN2A_D14,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D14.RGMII1_TXD3 */
+       {VIN2A_D15,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D15.RGMII1_TXD2 */
+       {VIN2A_D16,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D16.RGMII1_TXD1 */
+       {VIN2A_D17,  (M3  | PIN_OUTPUT)         }, /* VIN2A_D17.RGMII1_TXD0 */
+       {VIN2A_D18,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D18.RGMII1_RXC */
+       {VIN2A_D19,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D19.RGMII1_RXCTL */
+       {VIN2A_D20,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D20.RGMII1_RXD3 */
+       {VIN2A_D21,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D21.RGMII1_RXD2 */
+       {VIN2A_D22,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D22.RGMII1_RXD1 */
+       {VIN2A_D23,  (M3  | PIN_INPUT_PULLDOWN) }, /* VIN2A_D23.RGMII1_RXD0 */
        /* Eth PHY1 reset GPIOs*/
-       {VIN2A_CLK0, (IDIS | PDIS | PTD | M14)}, /* VIN2A_CLK0.GPIO3_28 */
+       {VIN2A_CLK0, (M14 | PIN_OUTPUT_PULLDOWN)}, /* VIN2A_CLK0.GPIO3_28 */
 };
 
 #define SET_MUX(mux_array) do_set_mux32((*ctrl)->control_padconf_core_base, \
index bba977ff8e2979eabcc811bde2a44f0a0354ba54..56aac60239cfabceb7f19b77956fca82f7417743 100644 (file)
@@ -336,9 +336,6 @@ void board_init_f(ulong dummy)
                puts("!!!ERROR!!! DRAM detection failed!!!\n");
                hang();
        }
-
-       memset(__bss_start, 0, __bss_end - __bss_start);
-       board_init_r(NULL, 0);
 }
 
 void board_boot_order(u32 *spl_boot_list)
index 0935abfd42abe27117087b190a5fb72251dc9dc6..bb1188b4ea2d27ed3efd8225301755b0adc1548c 100644 (file)
@@ -9,6 +9,30 @@ config SYS_VENDOR
 config SYS_CONFIG_NAME
        default "da850evm"
 
+menuconfig DA850_MAC
+       bool "Use MAC Address"
+       default y
+
+if DA850_MAC
+config MAC_ADDR_IN_SPIFLASH
+       bool "MAC address in SPI Flash"
+       default y
+       help
+         The OMAP-L138 and AM1808 SoM are programmed with
+         their MAC address in SPI Flash from the factory
+         Enable this option to read the MAC from SPI Flash
+
+config MAC_ADDR_IN_EEPROM
+       bool "MAC address in EEPROM"
+       help
+         The DA850 EVM comes with SoM are programmed with
+         their MAC address in SPI Flash from the factory,
+         but the kit has an optional expansion board with
+         EEPROM available.  Enable this option to read the
+         MAC from the EEPROM
+
+endif
+
 endif
 
 if TARGET_OMAPL138_LCDK
@@ -22,6 +46,6 @@ config SYS_VENDOR
 config SYS_CONFIG_NAME
        default "omapl138_lcdk"
 
-source "board/ti/common/Kconfig"
-
 endif
+
+source "board/ti/common/Kconfig"
index f32ce6633ad9e15dbce7969efd25dd25276e5e71..99b4786dd52eb55411416a28431129e342f6d05e 100644 (file)
@@ -1,13 +1,7 @@
-DA8XXEVM BOARD
-M:     Nick Thompson <nick.thompson@gefanuc.com>
-S:     Maintained
-F:     board/davinci/da8xxevm/
-F:     include/configs/da830evm.h
-F:     configs/da830evm_defconfig
-
 DA850_AM18XXEVM BOARD
-M:     Sudhakar Rajashekhara <sudhakar.raj@ti.com>
+M:     Adam Ford <aford173@gmail.com>
 S:     Maintained
+F:     board/davinci/da8xxevm/
 F:     include/configs/da850evm.h
 F:     configs/da850_am18xxevm_defconfig
 F:     configs/da850evm_defconfig
index c2d2e8e882919eff7b1b02eab765eee12b9d878a..516d86df5097208c7b0d93595934f44c17adf8f4 100644 (file)
@@ -133,6 +133,8 @@ int misc_init_r(void)
 
        enetaddr_found = eth_env_get_enetaddr("ethaddr", env_enetaddr);
 
+#endif
+
 #ifdef CONFIG_MAC_ADDR_IN_SPIFLASH
        int spi_mac_read;
        uchar buff[6];
@@ -167,7 +169,8 @@ int misc_init_r(void)
                                        "with the MAC address in the environment\n");
                printf("Default using MAC address from environment\n");
        }
-#endif
+
+#elif defined(CONFIG_MAC_ADDR_IN_EEPROM)
        uint8_t enetaddr[8];
        int eeprom_mac_read;
 
index 6964c131d90dd660bb6ef0d5f56c86b4cb319877..8711418fb4724e6e3dd7bba575df78214e3baec5 100644 (file)
@@ -384,10 +384,4 @@ void board_init_f(ulong dummy)
 
        /* DDR initialization */
        spl_dram_init();
-
-       /* Clear the BSS. */
-       memset(__bss_start, 0, __bss_end - __bss_start);
-
-       /* load/boot image from boot device */
-       board_init_r(NULL, 0);
 }
index 25d22d25bf80ca7857a050c79af52ade7c8e1a82..9afd1c469e42b7aa66de98586ab09629fab943bf 100644 (file)
@@ -71,7 +71,9 @@ int board_early_init_f(void)
 
 int board_init(void)
 {
-       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
+                                       CONFIG_SYS_CCI400_OFFSET);
+
        /*
         * Set CCI-400 control override register to enable barrier
         * transaction
index 97ab3400ad211fe0a2b2cc52a56032156b3842ac..406194da27facce39f494eb1df634abdd6514e1e 100644 (file)
@@ -106,8 +106,8 @@ int misc_init_r(void)
 
 int board_init(void)
 {
-       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)
-                                  CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
+                                  CONFIG_SYS_CCI400_OFFSET);
 
        /* Set CCI-400 control override register to enable barrier
         * transaction */
index a21e4c4aebc0dfd74dab1838ce152b83b53630fd..c6c1c71202e1787f846ddbf7be19d09cb6822bc8 100644 (file)
@@ -104,7 +104,8 @@ int board_early_init_f(void)
 
 int board_init(void)
 {
-       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
+                                       CONFIG_SYS_CCI400_OFFSET);
        /*
         * Set CCI-400 control override register to enable barrier
         * transaction
index d81d8abc9bf37f93bf39c4995329a2bb33136d5d..8b3f4ad78d8e944f008c9ab3d30ed82437785830 100644 (file)
@@ -204,7 +204,8 @@ int board_early_init_f(void)
 #ifdef CONFIG_SPL_BUILD
 void board_init_f(ulong dummy)
 {
-       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
+                                       CONFIG_SYS_CCI400_OFFSET);
        unsigned int major;
 
 #ifdef CONFIG_NAND_BOOT
@@ -425,7 +426,8 @@ int misc_init_r(void)
 
 int board_init(void)
 {
-       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
+                                       CONFIG_SYS_CCI400_OFFSET);
        unsigned int major;
 
 #ifdef CONFIG_SYS_FSL_ERRATUM_A010315
@@ -460,7 +462,8 @@ int board_init(void)
 #if defined(CONFIG_DEEP_SLEEP)
 void board_sleep_prepare(void)
 {
-       struct ccsr_cci400 __iomem *cci = (void *)CONFIG_SYS_CCI400_ADDR;
+       struct ccsr_cci400 __iomem *cci = (void *)(CONFIG_SYS_IMMR +
+                                               CONFIG_SYS_CCI400_OFFSET);
        unsigned int major;
 
        major = get_soc_major_rev();
diff --git a/board/freescale/ls1088a/Kconfig b/board/freescale/ls1088a/Kconfig
new file mode 100644 (file)
index 0000000..1ada661
--- /dev/null
@@ -0,0 +1,31 @@
+if TARGET_LS1088AQDS
+
+config SYS_BOARD
+       default "ls1088a"
+
+config SYS_VENDOR
+       default "freescale"
+
+config SYS_SOC
+       default "fsl-layerscape"
+
+config SYS_CONFIG_NAME
+       default "ls1088aqds"
+
+endif
+
+if TARGET_LS1088ARDB
+
+config SYS_BOARD
+       default "ls1088a"
+
+config SYS_VENDOR
+       default "freescale"
+
+config SYS_SOC
+       default "fsl-layerscape"
+
+config SYS_CONFIG_NAME
+       default "ls1088ardb"
+
+endif
diff --git a/board/freescale/ls1088a/MAINTAINERS b/board/freescale/ls1088a/MAINTAINERS
new file mode 100644 (file)
index 0000000..e1e6d4b
--- /dev/null
@@ -0,0 +1,15 @@
+LS1088ARDB BOARD
+M:     Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
+M:     Ashish Kumar <Ashish.Kumar@nxp.com>
+S:     Maintained
+F:     board/freescale/ls1088a/
+F:     include/configs/ls1088ardb.h
+F:     configs/ls1088ardb_qspi_defconfig
+
+LS1088AQDS BOARD
+M:     Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
+M:     Ashish Kumar <Ashish.Kumar@nxp.com>
+S:     Maintained
+F:     board/freescale/ls1088a/
+F:     include/configs/ls1088aqds.h
+F:     configs/ls1088aqds_qspi_defconfig
diff --git a/board/freescale/ls1088a/Makefile b/board/freescale/ls1088a/Makefile
new file mode 100644 (file)
index 0000000..bdcce9e
--- /dev/null
@@ -0,0 +1,10 @@
+#
+# Copyright 2017 NXP
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += ls1088a.o
+obj-$(CONFIG_TARGET_LS1088ARDB) += eth_ls1088ardb.o
+obj-$(CONFIG_TARGET_LS1088AQDS) += eth_ls1088aqds.o
+obj-y += ddr.o
diff --git a/board/freescale/ls1088a/README b/board/freescale/ls1088a/README
new file mode 100644 (file)
index 0000000..aa0fb6a
--- /dev/null
@@ -0,0 +1,145 @@
+Overview
+--------
+The LS1088A Reference Design (RDB) is a high-performance computing,
+evaluation, and development platform that supports ARM SoC LS1088A and its
+derivatives.
+
+
+LS1088A SoC Overview
+--------------------------------------
+Please refer arch/arm/cpu/armv8/fsl-layerscape/doc/README.soc
+
+RDB Default Switch Settings (1: ON; 0: OFF)
+-------------------------------------------
+
+For QSPI Boot
+SW1 0011 0001
+SW2 x100 0000
+SW3 1111 0010
+SW4 1001 0011
+SW5 1111 0000
+
+For SD Boot
+SW1 0010 0000
+SW2 0100 0000
+SW3 1111 0010
+SW4 1001 0011
+SW5 1111 0000
+
+For eMMC Boot
+SW1 0010 0000
+SW2 1100 0000
+SW3 1111 0010
+SW4 1001 0011
+SW5 1111 0000
+
+Alternately you can use this command to switch from QSPI to SD
+
+=> i2c mw 66 0x60 0x20; i2c mw 66 10 10;i2c mw 66 10 21
+
+ LS1088ARDB board Overview
+ -------------------------
+ - SERDES Connections, 16 lanes supporting:
+      - PCI Express - 3.0
+      - SATA 3.0
+      - XFI
+      - QSGMII
+ - DDR Controller
+     - One ports of 72-bits (8-bits ECC, 64-bits DATA) DDR4. Each port supports four
+       chip-selects on one DIMM connector. Support is up to 2133MT/s, Although MAX default
+       with FSL refernce software is 2100MT/s
+ - 2 QSPI-NOR Spansion(S25FS512SDSMFI011) flash of size 64MB
+ - IFC/Local Bus
+    - One 2 GB NAND flash with ECC support, not as boot source
+    - CPLD of size 2K
+ - USB 3.0
+    - Two high speed USB 3.0 ports
+    - First USB 3.0 port configured as Host with Type-A connector
+    - Second USB 3.0 port configured as OTG with micro-AB connector
+ - SDHC/eMMC
+    - SDHC slot and onboard eMMC are muxed together
+ - 4 I2C controllers
+ - Two SATA onboard connectors
+ - 2 UART
+ - JTAG support
+ - QSPI emulator support
+ - TDM riser support
+
+QDS Default Switch Settings (1: ON; 0: OFF)
+-------------------------------------------
+
+For 16b IFC-NOR
+SW1 0001 0010
+SW2 x110 1111
+
+For QSPI Boot
+SW1 0011 0001
+SW2 0110 1111
+
+For SD Boot
+SW1 0010 0000
+SW2 0110 1111
+
+For eMMC Boot
+SW1 0010 0000
+SW2 1110 1111
+
+For I2C (ext. addr.)
+SW1 0010 0100
+SW2 1110 1111
+
+SW3 to SW12 are identical for all boot source
+
+SW3 0010 0100
+SW4 0010 0000
+SW5 1110 0111
+SW6 1110 1000
+SW7 0001 1101
+SW8 0000 1101
+SW9 1100 1010
+SW10 1110 1000
+SW11 1111 0100
+SW12 1111 1111
+
+ LS1088AQDS board Overview
+ -------------------------
+ - SERDES Connections, 16 lanes supporting:
+      - PCI Express - 3.0
+      - SATA 3.0
+      - 2 XFI
+      - QSGMII, SGMII with help for Riser card
+      - 2 RGMII
+      - 5 slot for Riser card or PCIe NIC
+ - DDR Controller
+     - One ports of 72-bits (8-bits ECC, 64-bits DATA) DDR4. Each port supports four
+       chip-selects on one DIMM connector. Support is up to 2133MT/s, Although MAX default
+       with FSL refernce software is 2100MT/s
+ - 2 QSPI-NOR Spansion(S25FS512SDSMFI011) flash of size 64MB
+ - IFC/Local Bus
+    - One 2 GB NAND flash with ECC support, not as boot source
+    - CPLD of size 2K
+ - USB 3.0
+    - Two high speed USB 3.0 ports
+    - First USB 3.0 port configured as Host with Type-A connector
+    - Second USB 3.0 port configured as OTG with micro-AB connector
+ - SDHC/eMMC
+    - SDHC/eMMC slot via adaptor
+ - 4 I2C controllers
+ - Two SATA onboard connectors
+ - 2 UART
+ - JTAG support
+ - DSPI
+ - PROMJET support
+ - QSPI emulator support
+ - TDM riser support
+
+QSPI flash memory map valid for both QDS and RDB
+  Image                               Flash Offset
+ RCW+PBI                             0x00000000
+ Boot firmware (U-Boot)              0x00100000
+ Boot firmware Environment           0x00300000
+ PPA firmware                        0x00400000
+ DPAA2 MC                            0x00A00000
+ DPAA2 DPL                           0x00D00000
+ DPAA2 DPC                           0x00E00000
+ Kernel.itb                          0x01000000
diff --git a/board/freescale/ls1088a/ddr.c b/board/freescale/ls1088a/ddr.c
new file mode 100644 (file)
index 0000000..0ecfd65
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <fsl_ddr_sdram.h>
+#include <fsl_ddr_dimm_params.h>
+#include <asm/arch/soc.h>
+#include <asm/arch/clock.h>
+#include "ddr.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void fsl_ddr_board_options(memctl_options_t *popts,
+                          dimm_params_t *pdimm,
+                          unsigned int ctrl_num)
+{
+       const struct board_specific_parameters *pbsp, *pbsp_highest = NULL;
+       ulong ddr_freq;
+
+       if (ctrl_num > 1) {
+               printf("Not supported controller number %d\n", ctrl_num);
+               return;
+       }
+       if (!pdimm->n_ranks)
+               return;
+
+       /*
+        * we use identical timing for all slots. If needed, change the code
+        * to  pbsp = rdimms[ctrl_num] or pbsp = udimms[ctrl_num];
+        */
+       pbsp = udimms[0];
+
+       /* Get clk_adjust, wrlvl_start, wrlvl_ctl, according to the board ddr
+        * freqency and n_banks specified in board_specific_parameters table.
+        */
+       ddr_freq = get_ddr_freq(0) / 1000000;
+       while (pbsp->datarate_mhz_high) {
+               if (pbsp->n_ranks == pdimm->n_ranks) {
+                       if (ddr_freq <= pbsp->datarate_mhz_high) {
+                               popts->clk_adjust = pbsp->clk_adjust;
+                               popts->wrlvl_start = pbsp->wrlvl_start;
+                               popts->wrlvl_ctl_2 = pbsp->wrlvl_ctl_2;
+                               popts->wrlvl_ctl_3 = pbsp->wrlvl_ctl_3;
+                               goto found;
+                       }
+                       pbsp_highest = pbsp;
+               }
+               pbsp++;
+       }
+
+       if (pbsp_highest) {
+               printf("Error: board specific timing not found for %lu MT/s\n",
+                      ddr_freq);
+               printf("Trying to use the highest speed (%u) parameters\n",
+                      pbsp_highest->datarate_mhz_high);
+               popts->clk_adjust = pbsp_highest->clk_adjust;
+               popts->wrlvl_start = pbsp_highest->wrlvl_start;
+               popts->wrlvl_ctl_2 = pbsp->wrlvl_ctl_2;
+               popts->wrlvl_ctl_3 = pbsp->wrlvl_ctl_3;
+       } else {
+               panic("DIMM is not supported by this board");
+       }
+found:
+       debug("Found timing match: n_ranks %d, data rate %d, rank_gb %d\n"
+               "\tclk_adjust %d, wrlvl_start %d, wrlvl_ctrl_2 0x%x, wrlvl_ctrl_3 0x%x\n",
+               pbsp->n_ranks, pbsp->datarate_mhz_high, pbsp->rank_gb,
+               pbsp->clk_adjust, pbsp->wrlvl_start, pbsp->wrlvl_ctl_2,
+               pbsp->wrlvl_ctl_3);
+
+
+
+       popts->half_strength_driver_enable = 0;
+       /*
+        * Write leveling override
+        */
+       popts->wrlvl_override = 1;
+       popts->wrlvl_sample = 0xf;
+
+
+       /* Enable ZQ calibration */
+       popts->zq_en = 1;
+
+       /* Enable DDR hashing */
+       popts->addr_hash = 1;
+
+       popts->ddr_cdr1 = DDR_CDR1_DHC_EN | DDR_CDR1_ODT(DDR_CDR_ODT_60ohm);
+       popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_60ohm) |
+                         DDR_CDR2_VREF_TRAIN_EN | DDR_CDR2_VREF_RANGE_2;
+}
+
+
+int fsl_initdram(void)
+{
+       puts("Initializing DDR....using SPD\n");
+
+       gd->ram_size = fsl_ddr_sdram();
+
+       return 0;
+}
diff --git a/board/freescale/ls1088a/ddr.h b/board/freescale/ls1088a/ddr.h
new file mode 100644 (file)
index 0000000..a1ad709
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS1088A_DDR_H__
+#define __LS1088A_DDR_H__
+struct board_specific_parameters {
+       u32 n_ranks;
+       u32 datarate_mhz_high;
+       u32 rank_gb;
+       u32 clk_adjust;
+       u32 wrlvl_start;
+       u32 wrlvl_ctl_2;
+       u32 wrlvl_ctl_3;
+};
+
+/*
+ * These tables contain all valid speeds we want to override with board
+ * specific parameters. datarate_mhz_high values need to be in ascending order
+ * for each n_ranks group.
+ */
+
+static const struct board_specific_parameters udimm0[] = {
+       /*
+        * memory controller 0
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+#if defined(CONFIG_TARGET_LS1088ARDB)
+
+       {2,  1666, 0, 8,     8, 0x090A0B0E, 0x0F10110D,},
+       {2,  1900, 0, 4,     7, 0x09090B0D, 0x0E10120B,},
+       {2,  2300, 0, 8,     9, 0x0A0C0E11, 0x1214160F,},
+       {}
+#elif defined(CONFIG_TARGET_LS1088AQDS)
+       {2,  1666, 0, 8,     8, 0x0A0A0C0E, 0x0F10110C,},
+       {2,  1900, 0, 4,     7, 0x09090B0D, 0x0E10120B,},
+       {2,  2300, 0, 4,     9, 0x0A0C0D11, 0x1214150E,},
+       {}
+
+#endif
+};
+
+static const struct board_specific_parameters *udimms[] = {
+       udimm0,
+};
+#endif
diff --git a/board/freescale/ls1088a/eth_ls1088aqds.c b/board/freescale/ls1088a/eth_ls1088aqds.c
new file mode 100644 (file)
index 0000000..c19f59a
--- /dev/null
@@ -0,0 +1,683 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <netdev.h>
+#include <asm/io.h>
+#include <asm/arch/fsl_serdes.h>
+#include <hwconfig.h>
+#include <fsl_mdio.h>
+#include <malloc.h>
+#include <fm_eth.h>
+#include <i2c.h>
+#include <miiphy.h>
+#include <fsl-mc/ldpaa_wriop.h>
+
+#include "../common/qixis.h"
+
+#include "ls1088a_qixis.h"
+
+#define MC_BOOT_ENV_VAR "mcinitcmd"
+
+#ifdef CONFIG_FSL_MC_ENET
+
+#define SFP_TX         0
+
+ /* - In LS1088A A there are only 16 SERDES lanes, spread across 2 SERDES banks.
+ *   Bank 1 -> Lanes A, B, C, D,
+ *   Bank 2 -> Lanes A,B, C, D,
+ */
+
+ /* Mapping of 8 SERDES lanes to LS1088A QDS board slots. A value of '0' here
+  * means that the mapping must be determined dynamically, or that the lane
+  * maps to something other than a board slot.
+  */
+
+static u8 lane_to_slot_fsm1[] = {
+       0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* On the Vitesse VSC8234XHG SGMII riser card there are 4 SGMII PHYs
+ * housed.
+ */
+
+static int xqsgii_riser_phy_addr[] = {
+       XQSGMII_CARD_PHY1_PORT0_ADDR,
+       XQSGMII_CARD_PHY2_PORT0_ADDR,
+       XQSGMII_CARD_PHY3_PORT0_ADDR,
+       XQSGMII_CARD_PHY4_PORT0_ADDR,
+       XQSGMII_CARD_PHY3_PORT2_ADDR,
+       XQSGMII_CARD_PHY1_PORT2_ADDR,
+       XQSGMII_CARD_PHY4_PORT2_ADDR,
+       XQSGMII_CARD_PHY2_PORT2_ADDR,
+};
+
+static int sgmii_riser_phy_addr[] = {
+       SGMII_CARD_PORT1_PHY_ADDR,
+       SGMII_CARD_PORT2_PHY_ADDR,
+       SGMII_CARD_PORT3_PHY_ADDR,
+       SGMII_CARD_PORT4_PHY_ADDR,
+};
+
+/* Slot2 does not have EMI connections */
+#define EMI_NONE       0xFF
+#define EMI1_RGMII1    0
+#define EMI1_RGMII2    1
+#define EMI1_SLOT1     2
+
+static const char * const mdio_names[] = {
+       "LS1088A_QDS_MDIO0",
+       "LS1088A_QDS_MDIO1",
+       "LS1088A_QDS_MDIO2",
+       DEFAULT_WRIOP_MDIO2_NAME,
+};
+
+struct ls1088a_qds_mdio {
+       u8 muxval;
+       struct mii_dev *realbus;
+};
+
+static void sgmii_configure_repeater(int dpmac)
+{
+       struct mii_dev *bus;
+       uint8_t a = 0xf;
+       int i, j, ret;
+       unsigned short value;
+       const char *dev = "LS1088A_QDS_MDIO2";
+       int i2c_addr[] = {0x58, 0x59, 0x5a, 0x5b};
+       int i2c_phy_addr = 0;
+       int phy_addr = 0;
+
+       uint8_t ch_a_eq[] = {0x1, 0x2, 0x3, 0x7};
+       uint8_t ch_a_ctl2[] = {0x81, 0x82, 0x83, 0x84};
+       uint8_t ch_b_eq[] = {0x1, 0x2, 0x3, 0x7};
+       uint8_t ch_b_ctl2[] = {0x81, 0x82, 0x83, 0x84};
+
+       /* Set I2c to Slot 1 */
+       i2c_write(0x77, 0, 0, &a, 1);
+
+       switch (dpmac) {
+       case 1:
+               i2c_phy_addr = i2c_addr[1];
+               phy_addr = 4;
+               break;
+       case 2:
+               i2c_phy_addr = i2c_addr[0];
+               phy_addr = 0;
+               break;
+       case 3:
+               i2c_phy_addr = i2c_addr[3];
+               phy_addr = 0xc;
+               break;
+       case 7:
+               i2c_phy_addr = i2c_addr[2];
+               phy_addr = 8;
+               break;
+       }
+
+       /* Check the PHY status */
+       ret = miiphy_set_current_dev(dev);
+       if (ret > 0)
+               goto error;
+
+       bus = mdio_get_current_dev();
+       debug("Reading from bus %s\n", bus->name);
+
+       ret = miiphy_write(dev, phy_addr, 0x1f, 3);
+       if (ret > 0)
+               goto error;
+
+       mdelay(10);
+       ret = miiphy_read(dev, phy_addr, 0x11, &value);
+       if (ret > 0)
+                       goto error;
+
+       mdelay(10);
+
+       if ((value & 0xfff) == 0x401) {
+               miiphy_write(dev, phy_addr, 0x1f, 0);
+               printf("DPMAC %d:PHY is ..... Configured\n", dpmac);
+               return;
+       }
+
+       for (i = 0; i < 4; i++) {
+               for (j = 0; j < 4; j++) {
+                       a = 0x18;
+                       i2c_write(i2c_phy_addr, 6, 1, &a, 1);
+                       a = 0x38;
+                       i2c_write(i2c_phy_addr, 4, 1, &a, 1);
+                       a = 0x4;
+                       i2c_write(i2c_phy_addr, 8, 1, &a, 1);
+
+                       i2c_write(i2c_phy_addr, 0xf, 1,
+                                 &ch_a_eq[i], 1);
+                       i2c_write(i2c_phy_addr, 0x11, 1,
+                                 &ch_a_ctl2[j], 1);
+
+                       i2c_write(i2c_phy_addr, 0x16, 1,
+                                 &ch_b_eq[i], 1);
+                       i2c_write(i2c_phy_addr, 0x18, 1,
+                                 &ch_b_ctl2[j], 1);
+
+                       a = 0x14;
+                       i2c_write(i2c_phy_addr, 0x23, 1, &a, 1);
+                       a = 0xb5;
+                       i2c_write(i2c_phy_addr, 0x2d, 1, &a, 1);
+                       a = 0x20;
+                       i2c_write(i2c_phy_addr, 4, 1, &a, 1);
+                       mdelay(100);
+                       ret = miiphy_read(dev, phy_addr, 0x11, &value);
+                       if (ret > 0)
+                               goto error;
+
+                       mdelay(100);
+                       ret = miiphy_read(dev, phy_addr, 0x11, &value);
+                       if (ret > 0)
+                               goto error;
+
+                       if ((value & 0xfff) == 0x401) {
+                               printf("DPMAC %d :PHY is configured ",
+                                      dpmac);
+                               printf("after setting repeater 0x%x\n",
+                                      value);
+                               i = 5;
+                               j = 5;
+                       } else {
+                               printf("DPMAC %d :PHY is failed to ",
+                                      dpmac);
+                               printf("configure the repeater 0x%x\n", value);
+                       }
+               }
+       }
+       miiphy_write(dev, phy_addr, 0x1f, 0);
+error:
+       if (ret)
+               printf("DPMAC %d ..... FAILED to configure PHY\n", dpmac);
+       return;
+}
+
+static void qsgmii_configure_repeater(int dpmac)
+{
+       uint8_t a = 0xf;
+       int i, j;
+       int i2c_phy_addr = 0;
+       int phy_addr = 0;
+       int i2c_addr[] = {0x58, 0x59, 0x5a, 0x5b};
+
+       uint8_t ch_a_eq[] = {0x1, 0x2, 0x3, 0x7};
+       uint8_t ch_a_ctl2[] = {0x81, 0x82, 0x83, 0x84};
+       uint8_t ch_b_eq[] = {0x1, 0x2, 0x3, 0x7};
+       uint8_t ch_b_ctl2[] = {0x81, 0x82, 0x83, 0x84};
+
+       const char *dev = mdio_names[EMI1_SLOT1];
+       int ret = 0;
+       unsigned short value;
+
+       /* Set I2c to Slot 1 */
+       i2c_write(0x77, 0, 0, &a, 1);
+
+       switch (dpmac) {
+       case 7:
+       case 8:
+       case 9:
+       case 10:
+               i2c_phy_addr = i2c_addr[2];
+               phy_addr = 8;
+               break;
+
+       case 3:
+       case 4:
+       case 5:
+       case 6:
+               i2c_phy_addr = i2c_addr[3];
+               phy_addr = 0xc;
+               break;
+       }
+
+       /* Check the PHY status */
+       ret = miiphy_set_current_dev(dev);
+       ret = miiphy_write(dev, phy_addr, 0x1f, 3);
+       mdelay(10);
+       ret = miiphy_read(dev, phy_addr, 0x11, &value);
+       mdelay(10);
+       ret = miiphy_read(dev, phy_addr, 0x11, &value);
+       mdelay(10);
+       if ((value & 0xf) == 0xf) {
+               miiphy_write(dev, phy_addr, 0x1f, 0);
+               printf("DPMAC %d :PHY is ..... Configured\n", dpmac);
+               return;
+       }
+
+       for (i = 0; i < 4; i++) {
+               for (j = 0; j < 4; j++) {
+                       a = 0x18;
+                       i2c_write(i2c_phy_addr, 6, 1, &a, 1);
+                       a = 0x38;
+                       i2c_write(i2c_phy_addr, 4, 1, &a, 1);
+                       a = 0x4;
+                       i2c_write(i2c_phy_addr, 8, 1, &a, 1);
+
+                       i2c_write(i2c_phy_addr, 0xf, 1, &ch_a_eq[i], 1);
+                       i2c_write(i2c_phy_addr, 0x11, 1, &ch_a_ctl2[j], 1);
+
+                       i2c_write(i2c_phy_addr, 0x16, 1, &ch_b_eq[i], 1);
+                       i2c_write(i2c_phy_addr, 0x18, 1, &ch_b_ctl2[j], 1);
+
+                       a = 0x14;
+                       i2c_write(i2c_phy_addr, 0x23, 1, &a, 1);
+                       a = 0xb5;
+                       i2c_write(i2c_phy_addr, 0x2d, 1, &a, 1);
+                       a = 0x20;
+                       i2c_write(i2c_phy_addr, 4, 1, &a, 1);
+                       mdelay(100);
+                       ret = miiphy_read(dev, phy_addr, 0x11, &value);
+                       if (ret > 0)
+                               goto error;
+                       mdelay(1);
+                       ret = miiphy_read(dev, phy_addr, 0x11, &value);
+                       if (ret > 0)
+                               goto error;
+                       mdelay(10);
+                       if ((value & 0xf) == 0xf) {
+                               miiphy_write(dev, phy_addr, 0x1f, 0);
+                               printf("DPMAC %d :PHY is ..... Configured\n",
+                                      dpmac);
+                               return;
+                       }
+               }
+       }
+error:
+       printf("DPMAC %d :PHY ..... FAILED to configure PHY\n", dpmac);
+       return;
+}
+
+static const char *ls1088a_qds_mdio_name_for_muxval(u8 muxval)
+{
+       return mdio_names[muxval];
+}
+
+struct mii_dev *mii_dev_for_muxval(u8 muxval)
+{
+       struct mii_dev *bus;
+       const char *name = ls1088a_qds_mdio_name_for_muxval(muxval);
+
+       if (!name) {
+               printf("No bus for muxval %x\n", muxval);
+               return NULL;
+       }
+
+       bus = miiphy_get_dev_by_name(name);
+
+       if (!bus) {
+               printf("No bus by name %s\n", name);
+               return NULL;
+       }
+
+       return bus;
+}
+
+static void ls1088a_qds_enable_SFP_TX(u8 muxval)
+{
+       u8 brdcfg9;
+
+       brdcfg9 = QIXIS_READ(brdcfg[9]);
+       brdcfg9 &= ~BRDCFG9_SFPTX_MASK;
+       brdcfg9 |= (muxval << BRDCFG9_SFPTX_SHIFT);
+       QIXIS_WRITE(brdcfg[9], brdcfg9);
+}
+
+static void ls1088a_qds_mux_mdio(u8 muxval)
+{
+       u8 brdcfg4;
+
+       if (muxval <= 5) {
+               brdcfg4 = QIXIS_READ(brdcfg[4]);
+               brdcfg4 &= ~BRDCFG4_EMISEL_MASK;
+               brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT);
+               QIXIS_WRITE(brdcfg[4], brdcfg4);
+       }
+}
+
+static int ls1088a_qds_mdio_read(struct mii_dev *bus, int addr,
+                                int devad, int regnum)
+{
+       struct ls1088a_qds_mdio *priv = bus->priv;
+
+       ls1088a_qds_mux_mdio(priv->muxval);
+
+       return priv->realbus->read(priv->realbus, addr, devad, regnum);
+}
+
+static int ls1088a_qds_mdio_write(struct mii_dev *bus, int addr, int devad,
+                                 int regnum, u16 value)
+{
+       struct ls1088a_qds_mdio *priv = bus->priv;
+
+       ls1088a_qds_mux_mdio(priv->muxval);
+
+       return priv->realbus->write(priv->realbus, addr, devad, regnum, value);
+}
+
+static int ls1088a_qds_mdio_reset(struct mii_dev *bus)
+{
+       struct ls1088a_qds_mdio *priv = bus->priv;
+
+       return priv->realbus->reset(priv->realbus);
+}
+
+static int ls1088a_qds_mdio_init(char *realbusname, u8 muxval)
+{
+       struct ls1088a_qds_mdio *pmdio;
+       struct mii_dev *bus = mdio_alloc();
+
+       if (!bus) {
+               printf("Failed to allocate ls1088a_qds MDIO bus\n");
+               return -1;
+       }
+
+       pmdio = malloc(sizeof(*pmdio));
+       if (!pmdio) {
+               printf("Failed to allocate ls1088a_qds private data\n");
+               free(bus);
+               return -1;
+       }
+
+       bus->read = ls1088a_qds_mdio_read;
+       bus->write = ls1088a_qds_mdio_write;
+       bus->reset = ls1088a_qds_mdio_reset;
+       sprintf(bus->name, ls1088a_qds_mdio_name_for_muxval(muxval));
+
+       pmdio->realbus = miiphy_get_dev_by_name(realbusname);
+
+       if (!pmdio->realbus) {
+               printf("No bus with name %s\n", realbusname);
+               free(bus);
+               free(pmdio);
+               return -1;
+       }
+
+       pmdio->muxval = muxval;
+       bus->priv = pmdio;
+
+       return mdio_register(bus);
+}
+
+/*
+ * Initialize the dpmac_info array.
+ *
+ */
+static void initialize_dpmac_to_slot(void)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       u32 serdes1_prtcl, cfg;
+
+       cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
+                               FSL_CHASSIS3_SRDS1_PRTCL_MASK;
+       cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
+       serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
+
+       switch (serdes1_prtcl) {
+       case 0x12:
+               printf("qds: WRIOP: Supported SerDes1 Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               lane_to_slot_fsm1[0] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[1] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[2] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[3] = EMI1_SLOT1 - 1;
+               break;
+       case 0x15:
+       case 0x1D:
+               printf("qds: WRIOP: Supported SerDes1 Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               lane_to_slot_fsm1[0] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[1] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[2] = EMI_NONE;
+               lane_to_slot_fsm1[3] = EMI_NONE;
+               break;
+       case 0x1E:
+               printf("qds: WRIOP: Supported SerDes1 Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               lane_to_slot_fsm1[0] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[1] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[2] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[3] = EMI_NONE;
+               break;
+       case 0x3A:
+               printf("qds: WRIOP: Supported SerDes1 Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               lane_to_slot_fsm1[0] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[1] = EMI_NONE;
+               lane_to_slot_fsm1[2] = EMI1_SLOT1 - 1;
+               lane_to_slot_fsm1[3] = EMI1_SLOT1 - 1;
+               break;
+
+       default:
+               printf("%s qds: WRIOP: Unsupported SerDes1 Protocol 0x%02x\n",
+                      __func__, serdes1_prtcl);
+               break;
+       }
+}
+
+void ls1088a_handle_phy_interface_sgmii(int dpmac_id)
+{
+       struct mii_dev *bus;
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       u32 serdes1_prtcl, cfg;
+
+       cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
+                               FSL_CHASSIS3_SRDS1_PRTCL_MASK;
+       cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
+       serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
+
+       int *riser_phy_addr;
+       char *env_hwconfig = env_get("hwconfig");
+
+       if (hwconfig_f("xqsgmii", env_hwconfig))
+               riser_phy_addr = &xqsgii_riser_phy_addr[0];
+       else
+               riser_phy_addr = &sgmii_riser_phy_addr[0];
+
+       switch (serdes1_prtcl) {
+       case 0x12:
+       case 0x15:
+       case 0x1E:
+       case 0x3A:
+               switch (dpmac_id) {
+               case 1:
+                       wriop_set_phy_address(dpmac_id, riser_phy_addr[1]);
+                       break;
+               case 2:
+                       wriop_set_phy_address(dpmac_id, riser_phy_addr[0]);
+                       break;
+               case 3:
+                       wriop_set_phy_address(dpmac_id, riser_phy_addr[3]);
+                       break;
+               case 7:
+                       wriop_set_phy_address(dpmac_id, riser_phy_addr[2]);
+                       break;
+               default:
+                       printf("WRIOP: Wrong DPMAC%d set to SGMII", dpmac_id);
+                       break;
+               }
+               break;
+       default:
+               printf("%s qds: WRIOP: Unsupported SerDes1 Protocol 0x%02x\n",
+                      __func__, serdes1_prtcl);
+               return;
+       }
+       dpmac_info[dpmac_id].board_mux = EMI1_SLOT1;
+       bus = mii_dev_for_muxval(EMI1_SLOT1);
+       wriop_set_mdio(dpmac_id, bus);
+}
+
+void ls1088a_handle_phy_interface_qsgmii(int dpmac_id)
+{
+       struct mii_dev *bus;
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       u32 serdes1_prtcl, cfg;
+
+       cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
+                               FSL_CHASSIS3_SRDS1_PRTCL_MASK;
+       cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
+       serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
+
+       switch (serdes1_prtcl) {
+       case 0x1D:
+       case 0x1E:
+               switch (dpmac_id) {
+               case 3:
+               case 4:
+               case 5:
+               case 6:
+                       wriop_set_phy_address(dpmac_id, dpmac_id + 9);
+                       break;
+               case 7:
+               case 8:
+               case 9:
+               case 10:
+                       wriop_set_phy_address(dpmac_id, dpmac_id + 1);
+                       break;
+               }
+
+               dpmac_info[dpmac_id].board_mux = EMI1_SLOT1;
+               bus = mii_dev_for_muxval(EMI1_SLOT1);
+               wriop_set_mdio(dpmac_id, bus);
+               break;
+       default:
+               printf("qds: WRIOP: Unsupported SerDes Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               break;
+       }
+}
+
+void ls1088a_handle_phy_interface_xsgmii(int i)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       u32 serdes1_prtcl, cfg;
+
+       cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
+                               FSL_CHASSIS3_SRDS1_PRTCL_MASK;
+       cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
+       serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
+
+       switch (serdes1_prtcl) {
+       case 0x15:
+       case 0x1D:
+       case 0x1E:
+               wriop_set_phy_address(i, i + 26);
+               ls1088a_qds_enable_SFP_TX(SFP_TX);
+               break;
+       default:
+               printf("qds: WRIOP: Unsupported SerDes Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               break;
+       }
+}
+
+static void ls1088a_handle_phy_interface_rgmii(int dpmac_id)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       u32 serdes1_prtcl, cfg;
+       struct mii_dev *bus;
+
+       cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
+                               FSL_CHASSIS3_SRDS1_PRTCL_MASK;
+       cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
+       serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
+
+       switch (dpmac_id) {
+       case 4:
+               wriop_set_phy_address(dpmac_id, RGMII_PHY1_ADDR);
+               dpmac_info[dpmac_id].board_mux = EMI1_RGMII1;
+               bus = mii_dev_for_muxval(EMI1_RGMII1);
+               wriop_set_mdio(dpmac_id, bus);
+               break;
+       case 5:
+               wriop_set_phy_address(dpmac_id, RGMII_PHY2_ADDR);
+               dpmac_info[dpmac_id].board_mux = EMI1_RGMII2;
+               bus = mii_dev_for_muxval(EMI1_RGMII2);
+               wriop_set_mdio(dpmac_id, bus);
+               break;
+       default:
+               printf("qds: WRIOP: Unsupported RGMII SerDes Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               break;
+       }
+}
+#endif
+
+int board_eth_init(bd_t *bis)
+{
+       int error = 0, i;
+       char *mc_boot_env_var;
+#ifdef CONFIG_FSL_MC_ENET
+       struct memac_mdio_info *memac_mdio0_info;
+       char *env_hwconfig = env_get("hwconfig");
+
+       initialize_dpmac_to_slot();
+
+       memac_mdio0_info = (struct memac_mdio_info *)malloc(
+                                       sizeof(struct memac_mdio_info));
+       memac_mdio0_info->regs =
+               (struct memac_mdio_controller *)
+                                       CONFIG_SYS_FSL_WRIOP1_MDIO1;
+       memac_mdio0_info->name = DEFAULT_WRIOP_MDIO1_NAME;
+
+       /* Register the real MDIO1 bus */
+       fm_memac_mdio_init(bis, memac_mdio0_info);
+       /* Register the muxing front-ends to the MDIO buses */
+       ls1088a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_RGMII1);
+       ls1088a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_RGMII2);
+       ls1088a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_SLOT1);
+
+       for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
+               switch (wriop_get_enet_if(i)) {
+               case PHY_INTERFACE_MODE_RGMII:
+                       ls1088a_handle_phy_interface_rgmii(i);
+                       break;
+               case PHY_INTERFACE_MODE_QSGMII:
+                       ls1088a_handle_phy_interface_qsgmii(i);
+                       break;
+               case PHY_INTERFACE_MODE_SGMII:
+                       ls1088a_handle_phy_interface_sgmii(i);
+                       break;
+               case PHY_INTERFACE_MODE_XGMII:
+                       ls1088a_handle_phy_interface_xsgmii(i);
+                       break;
+               default:
+                       break;
+
+               if (i == 16)
+                       i = NUM_WRIOP_PORTS;
+               }
+       }
+
+       mc_boot_env_var = env_get(MC_BOOT_ENV_VAR);
+       if (mc_boot_env_var)
+               run_command_list(mc_boot_env_var, -1, 0);
+       error = cpu_eth_init(bis);
+
+       if (hwconfig_f("xqsgmii", env_hwconfig)) {
+               for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
+                       switch (wriop_get_enet_if(i)) {
+                       case PHY_INTERFACE_MODE_QSGMII:
+                               qsgmii_configure_repeater(i);
+                               break;
+                       case PHY_INTERFACE_MODE_SGMII:
+                               sgmii_configure_repeater(i);
+                               break;
+                       default:
+                               break;
+                       }
+
+                       if (i == 16)
+                               i = NUM_WRIOP_PORTS;
+               }
+       }
+#endif
+       error = pci_eth_init(bis);
+       return error;
+}
diff --git a/board/freescale/ls1088a/eth_ls1088ardb.c b/board/freescale/ls1088a/eth_ls1088ardb.c
new file mode 100644 (file)
index 0000000..853d815
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <command.h>
+#include <netdev.h>
+#include <malloc.h>
+#include <fsl_mdio.h>
+#include <miiphy.h>
+#include <phy.h>
+#include <fm_eth.h>
+#include <asm/io.h>
+#include <exports.h>
+#include <asm/arch/fsl_serdes.h>
+#include <fsl-mc/ldpaa_wriop.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define MC_BOOT_ENV_VAR "mcinitcmd"
+int board_eth_init(bd_t *bis)
+{
+#if defined(CONFIG_FSL_MC_ENET)
+       char *mc_boot_env_var;
+       int i, interface;
+       struct memac_mdio_info mdio_info;
+       struct mii_dev *dev;
+       struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       struct memac_mdio_controller *reg;
+       u32 srds_s1, cfg;
+
+       cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
+                               FSL_CHASSIS3_SRDS1_PRTCL_MASK;
+       cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
+
+       srds_s1 = serdes_get_number(FSL_SRDS_1, cfg);
+
+       reg = (struct memac_mdio_controller *)CONFIG_SYS_FSL_WRIOP1_MDIO1;
+       mdio_info.regs = reg;
+       mdio_info.name = DEFAULT_WRIOP_MDIO1_NAME;
+
+       /* Register the EMI 1 */
+       fm_memac_mdio_init(bis, &mdio_info);
+
+       reg = (struct memac_mdio_controller *)CONFIG_SYS_FSL_WRIOP1_MDIO2;
+       mdio_info.regs = reg;
+       mdio_info.name = DEFAULT_WRIOP_MDIO2_NAME;
+
+       /* Register the EMI 2 */
+       fm_memac_mdio_init(bis, &mdio_info);
+
+       switch (srds_s1) {
+       case 0x1D:
+               /*
+                * XFI does not need a PHY to work, but to avoid U-boot use
+                * default PHY address which is zero to a MAC when it found
+                * a MAC has no PHY address, we give a PHY address to XFI
+                * MAC error.
+                */
+               wriop_set_phy_address(WRIOP1_DPMAC1, 0x0a);
+               wriop_set_phy_address(WRIOP1_DPMAC2, AQ_PHY_ADDR1);
+               wriop_set_phy_address(WRIOP1_DPMAC3, QSGMII1_PORT1_PHY_ADDR);
+               wriop_set_phy_address(WRIOP1_DPMAC4, QSGMII1_PORT2_PHY_ADDR);
+               wriop_set_phy_address(WRIOP1_DPMAC5, QSGMII1_PORT3_PHY_ADDR);
+               wriop_set_phy_address(WRIOP1_DPMAC6, QSGMII1_PORT4_PHY_ADDR);
+               wriop_set_phy_address(WRIOP1_DPMAC7, QSGMII2_PORT1_PHY_ADDR);
+               wriop_set_phy_address(WRIOP1_DPMAC8, QSGMII2_PORT2_PHY_ADDR);
+               wriop_set_phy_address(WRIOP1_DPMAC9, QSGMII2_PORT3_PHY_ADDR);
+               wriop_set_phy_address(WRIOP1_DPMAC10, QSGMII2_PORT4_PHY_ADDR);
+
+               break;
+       default:
+               printf("SerDes1 protocol 0x%x is not supported on LS1088ARDB\n",
+                      srds_s1);
+               break;
+       }
+
+       for (i = WRIOP1_DPMAC3; i <= WRIOP1_DPMAC10; i++) {
+               interface = wriop_get_enet_if(i);
+               switch (interface) {
+               case PHY_INTERFACE_MODE_QSGMII:
+                       dev = miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO1_NAME);
+                       wriop_set_mdio(i, dev);
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       dev = miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO2_NAME);
+       wriop_set_mdio(WRIOP1_DPMAC2, dev);
+
+       mc_boot_env_var = env_get(MC_BOOT_ENV_VAR);
+       if (mc_boot_env_var)
+               run_command_list(mc_boot_env_var, -1, 0);
+       cpu_eth_init(bis);
+#endif /* CONFIG_FMAN_ENET */
+
+       return pci_eth_init(bis);
+}
diff --git a/board/freescale/ls1088a/ls1088a.c b/board/freescale/ls1088a/ls1088a.c
new file mode 100644 (file)
index 0000000..96d9ae7
--- /dev/null
@@ -0,0 +1,406 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <common.h>
+#include <i2c.h>
+#include <malloc.h>
+#include <errno.h>
+#include <netdev.h>
+#include <fsl_ifc.h>
+#include <fsl_ddr.h>
+#include <fsl_sec.h>
+#include <asm/io.h>
+#include <fdt_support.h>
+#include <libfdt.h>
+#include <fsl-mc/fsl_mc.h>
+#include <environment.h>
+#include <asm/arch-fsl-layerscape/soc.h>
+#include <asm/arch/ppa.h>
+
+#include "../common/qixis.h"
+#include "ls1088a_qixis.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+unsigned long long get_qixis_addr(void)
+{
+       unsigned long long addr;
+
+       if (gd->flags & GD_FLG_RELOC)
+               addr = QIXIS_BASE_PHYS;
+       else
+               addr = QIXIS_BASE_PHYS_EARLY;
+
+       /*
+        * IFC address under 256MB is mapped to 0x30000000, any address above
+        * is mapped to 0x5_10000000 up to 4GB.
+        */
+       addr = addr  > 0x10000000 ? addr + 0x500000000ULL : addr + 0x30000000;
+
+       return addr;
+}
+
+int checkboard(void)
+{
+       char buf[64];
+       u8 sw;
+       static const char *const freq[] = {"100", "125", "156.25",
+                                           "100 separate SSCG"};
+       int clock;
+
+#ifdef CONFIG_TARGET_LS1088AQDS
+       printf("Board: LS1088A-QDS, ");
+#else
+       printf("Board: LS1088A-RDB, ");
+#endif
+
+       sw = QIXIS_READ(arch);
+       printf("Board Arch: V%d, ", sw >> 4);
+
+#ifdef CONFIG_TARGET_LS1088AQDS
+       printf("Board version: %c, boot from ", (sw & 0xf) + 'A' - 1);
+#else
+       printf("Board version: %c, boot from ", (sw & 0xf) + 'A');
+#endif
+
+       memset((u8 *)buf, 0x00, ARRAY_SIZE(buf));
+
+       sw = QIXIS_READ(brdcfg[0]);
+       sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
+
+#ifdef CONFIG_SD_BOOT
+       puts("SD card\n");
+#endif
+       switch (sw) {
+#ifdef CONFIG_TARGET_LS1088AQDS
+       case 0:
+       case 1:
+       case 2:
+       case 3:
+       case 4:
+       case 5:
+       case 6:
+       case 7:
+               printf("vBank: %d\n", sw);
+               break;
+       case 8:
+               puts("PromJet\n");
+               break;
+       case 15:
+               puts("IFCCard\n");
+               break;
+       case 14:
+#else
+       case 0:
+#endif
+               puts("QSPI:");
+               sw = QIXIS_READ(brdcfg[0]);
+               sw = (sw & QIXIS_QMAP_MASK) >> QIXIS_QMAP_SHIFT;
+               if (sw == 0 || sw == 4)
+                       puts("0\n");
+               else if (sw == 1)
+                       puts("1\n");
+               else
+                       puts("EMU\n");
+               break;
+
+       default:
+               printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
+               break;
+       }
+
+#ifdef CONFIG_TARGET_LS1088AQDS
+       printf("FPGA: v%d (%s), build %d",
+              (int)QIXIS_READ(scver), qixis_read_tag(buf),
+              (int)qixis_read_minor());
+       /* the timestamp string contains "\n" at the end */
+       printf(" on %s", qixis_read_time(buf));
+#else
+       printf("CPLD: v%d.%d\n", QIXIS_READ(scver), QIXIS_READ(tagdata));
+#endif
+
+       /*
+        * Display the actual SERDES reference clocks as configured by the
+        * dip switches on the board.  Note that the SWx registers could
+        * technically be set to force the reference clocks to match the
+        * values that the SERDES expects (or vice versa).  For now, however,
+        * we just display both values and hope the user notices when they
+        * don't match.
+        */
+       puts("SERDES1 Reference : ");
+       sw = QIXIS_READ(brdcfg[2]);
+       clock = (sw >> 6) & 3;
+       printf("Clock1 = %sMHz ", freq[clock]);
+       clock = (sw >> 4) & 3;
+       printf("Clock2 = %sMHz", freq[clock]);
+
+       puts("\nSERDES2 Reference : ");
+       clock = (sw >> 2) & 3;
+       printf("Clock1 = %sMHz ", freq[clock]);
+       clock = (sw >> 0) & 3;
+       printf("Clock2 = %sMHz\n", freq[clock]);
+
+       return 0;
+}
+
+bool if_board_diff_clk(void)
+{
+#ifdef CONFIG_TARGET_LS1088AQDS
+       u8 diff_conf = QIXIS_READ(brdcfg[11]);
+       return diff_conf & 0x40;
+#else
+       u8 diff_conf = QIXIS_READ(dutcfg[11]);
+       return diff_conf & 0x80;
+#endif
+}
+
+unsigned long get_board_sys_clk(void)
+{
+       u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
+
+       switch (sysclk_conf & 0x0f) {
+       case QIXIS_SYSCLK_83:
+               return 83333333;
+       case QIXIS_SYSCLK_100:
+               return 100000000;
+       case QIXIS_SYSCLK_125:
+               return 125000000;
+       case QIXIS_SYSCLK_133:
+               return 133333333;
+       case QIXIS_SYSCLK_150:
+               return 150000000;
+       case QIXIS_SYSCLK_160:
+               return 160000000;
+       case QIXIS_SYSCLK_166:
+               return 166666666;
+       }
+
+       return 66666666;
+}
+
+unsigned long get_board_ddr_clk(void)
+{
+       u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
+
+       if (if_board_diff_clk())
+               return get_board_sys_clk();
+       switch ((ddrclk_conf & 0x30) >> 4) {
+       case QIXIS_DDRCLK_100:
+               return 100000000;
+       case QIXIS_DDRCLK_125:
+               return 125000000;
+       case QIXIS_DDRCLK_133:
+               return 133333333;
+       }
+
+       return 66666666;
+}
+
+int select_i2c_ch_pca9547(u8 ch)
+{
+       int ret;
+
+       ret = i2c_write(I2C_MUX_PCA_ADDR_PRI, 0, 1, &ch, 1);
+       if (ret) {
+               puts("PCA: failed to select proper channel\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+void board_retimer_init(void)
+{
+       u8 reg;
+
+       /* Retimer is connected to I2C1_CH5 */
+       select_i2c_ch_pca9547(I2C_MUX_CH5);
+
+       /* Access to Control/Shared register */
+       reg = 0x0;
+       i2c_write(I2C_RETIMER_ADDR, 0xff, 1, &reg, 1);
+
+       /* Read device revision and ID */
+       i2c_read(I2C_RETIMER_ADDR, 1, 1, &reg, 1);
+       debug("Retimer version id = 0x%x\n", reg);
+
+       /* Enable Broadcast. All writes target all channel register sets */
+       reg = 0x0c;
+       i2c_write(I2C_RETIMER_ADDR, 0xff, 1, &reg, 1);
+
+       /* Reset Channel Registers */
+       i2c_read(I2C_RETIMER_ADDR, 0, 1, &reg, 1);
+       reg |= 0x4;
+       i2c_write(I2C_RETIMER_ADDR, 0, 1, &reg, 1);
+
+       /* Set data rate as 10.3125 Gbps */
+       reg = 0x90;
+       i2c_write(I2C_RETIMER_ADDR, 0x60, 1, &reg, 1);
+       reg = 0xb3;
+       i2c_write(I2C_RETIMER_ADDR, 0x61, 1, &reg, 1);
+       reg = 0x90;
+       i2c_write(I2C_RETIMER_ADDR, 0x62, 1, &reg, 1);
+       reg = 0xb3;
+       i2c_write(I2C_RETIMER_ADDR, 0x63, 1, &reg, 1);
+       reg = 0xcd;
+       i2c_write(I2C_RETIMER_ADDR, 0x64, 1, &reg, 1);
+
+       /* Select VCO Divider to full rate (000) */
+       i2c_read(I2C_RETIMER_ADDR, 0x2F, 1, &reg, 1);
+       reg &= 0x0f;
+       reg |= 0x70;
+       i2c_write(I2C_RETIMER_ADDR, 0x2F, 1, &reg, 1);
+
+#ifdef CONFIG_TARGET_LS1088AQDS
+       /* Retimer is connected to I2C1_CH5 */
+       select_i2c_ch_pca9547(I2C_MUX_CH5);
+
+       /* Access to Control/Shared register */
+       reg = 0x0;
+       i2c_write(I2C_RETIMER_ADDR2, 0xff, 1, &reg, 1);
+
+       /* Read device revision and ID */
+       i2c_read(I2C_RETIMER_ADDR2, 1, 1, &reg, 1);
+       debug("Retimer version id = 0x%x\n", reg);
+
+       /* Enable Broadcast. All writes target all channel register sets */
+       reg = 0x0c;
+       i2c_write(I2C_RETIMER_ADDR2, 0xff, 1, &reg, 1);
+
+       /* Reset Channel Registers */
+       i2c_read(I2C_RETIMER_ADDR2, 0, 1, &reg, 1);
+       reg |= 0x4;
+       i2c_write(I2C_RETIMER_ADDR2, 0, 1, &reg, 1);
+
+       /* Set data rate as 10.3125 Gbps */
+       reg = 0x90;
+       i2c_write(I2C_RETIMER_ADDR2, 0x60, 1, &reg, 1);
+       reg = 0xb3;
+       i2c_write(I2C_RETIMER_ADDR2, 0x61, 1, &reg, 1);
+       reg = 0x90;
+       i2c_write(I2C_RETIMER_ADDR2, 0x62, 1, &reg, 1);
+       reg = 0xb3;
+       i2c_write(I2C_RETIMER_ADDR2, 0x63, 1, &reg, 1);
+       reg = 0xcd;
+       i2c_write(I2C_RETIMER_ADDR2, 0x64, 1, &reg, 1);
+
+       /* Select VCO Divider to full rate (000) */
+       i2c_read(I2C_RETIMER_ADDR2, 0x2F, 1, &reg, 1);
+       reg &= 0x0f;
+       reg |= 0x70;
+       i2c_write(I2C_RETIMER_ADDR2, 0x2F, 1, &reg, 1);
+#endif
+       /*return the default channel*/
+       select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
+}
+
+int board_init(void)
+{
+       init_final_memctl_regs();
+#if defined(CONFIG_TARGET_LS1088ARDB) && defined(CONFIG_FSL_MC_ENET)
+       u32 __iomem *irq_ccsr = (u32 __iomem *)ISC_BASE;
+#endif
+
+       select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
+       board_retimer_init();
+
+#ifdef CONFIG_ENV_IS_NOWHERE
+       gd->env_addr = (ulong)&default_environment[0];
+#endif
+
+#if defined(CONFIG_TARGET_LS1088ARDB) && defined(CONFIG_FSL_MC_ENET)
+       /* invert AQR105 IRQ pins polarity */
+       out_le32(irq_ccsr + IRQCR_OFFSET / 4, AQR105_IRQ_MASK);
+#endif
+
+#ifdef CONFIG_FSL_LS_PPA
+       ppa_init();
+#endif
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       fsl_lsch3_early_init_f();
+       return 0;
+}
+
+void detail_board_ddr_info(void)
+{
+       puts("\nDDR    ");
+       print_size(gd->bd->bi_dram[0].size + gd->bd->bi_dram[1].size, "");
+       print_ddr_info(0);
+}
+
+#if defined(CONFIG_ARCH_MISC_INIT)
+int arch_misc_init(void)
+{
+#ifdef CONFIG_FSL_CAAM
+       sec_init();
+#endif
+       return 0;
+}
+#endif
+
+#ifdef CONFIG_FSL_MC_ENET
+void fdt_fixup_board_enet(void *fdt)
+{
+       int offset;
+
+       offset = fdt_path_offset(fdt, "/fsl-mc");
+
+       if (offset < 0)
+               offset = fdt_path_offset(fdt, "/fsl,dprc@0");
+
+       if (offset < 0) {
+               printf("%s: ERROR: fsl-mc node not found in device tree (error %d)\n",
+                      __func__, offset);
+               return;
+       }
+
+       if (get_mc_boot_status() == 0)
+               fdt_status_okay(fdt, offset);
+       else
+               fdt_status_fail(fdt, offset);
+}
+#endif
+
+#ifdef CONFIG_OF_BOARD_SETUP
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       int err, i;
+       u64 base[CONFIG_NR_DRAM_BANKS];
+       u64 size[CONFIG_NR_DRAM_BANKS];
+
+       ft_cpu_setup(blob, bd);
+
+       /* fixup DT for the two GPP DDR banks */
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+               base[i] = gd->bd->bi_dram[i].start;
+               size[i] = gd->bd->bi_dram[i].size;
+       }
+
+#ifdef CONFIG_RESV_RAM
+       /* reduce size if reserved memory is within this bank */
+       if (gd->arch.resv_ram >= base[0] &&
+           gd->arch.resv_ram < base[0] + size[0])
+               size[0] = gd->arch.resv_ram - base[0];
+       else if (gd->arch.resv_ram >= base[1] &&
+                gd->arch.resv_ram < base[1] + size[1])
+               size[1] = gd->arch.resv_ram - base[1];
+#endif
+
+       fdt_fixup_memory_banks(blob, base, size, CONFIG_NR_DRAM_BANKS);
+
+#ifdef CONFIG_FSL_MC_ENET
+       fdt_fixup_board_enet(blob);
+       err = fsl_mc_ldpaa_exit(bd);
+       if (err)
+               return err;
+#endif
+
+       return 0;
+}
+#endif
diff --git a/board/freescale/ls1088a/ls1088a_qixis.h b/board/freescale/ls1088a/ls1088a_qixis.h
new file mode 100644 (file)
index 0000000..4790461
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS1088AQDS_QIXIS_H__
+#define __LS1088AQDS_QIXIS_H__
+
+/* Definitions of QIXIS Registers for LS1088AQDS */
+
+/* SYSCLK */
+#define QIXIS_SYSCLK_66                        0x0
+#define QIXIS_SYSCLK_83                        0x1
+#define QIXIS_SYSCLK_100               0x2
+#define QIXIS_SYSCLK_125               0x3
+#define QIXIS_SYSCLK_133               0x4
+#define QIXIS_SYSCLK_150               0x5
+#define QIXIS_SYSCLK_160               0x6
+#define QIXIS_SYSCLK_166               0x7
+
+/* DDRCLK */
+#define QIXIS_DDRCLK_66                        0x0
+#define QIXIS_DDRCLK_100               0x1
+#define QIXIS_DDRCLK_125               0x2
+#define QIXIS_DDRCLK_133               0x3
+
+/* BRDCFG2 - SD clock*/
+#define QIXIS_SDCLK1_100               0x0
+#define QIXIS_SDCLK1_125               0x1
+#define QIXIS_SDCLK1_165               0x2
+#define QIXIS_SDCLK1_100_SP            0x3
+
+#define BRDCFG4_EMISEL_MASK            0xE0
+#define BRDCFG4_EMISEL_SHIFT           5
+#define BRDCFG9_SFPTX_MASK             0x10
+#define BRDCFG9_SFPTX_SHIFT            4
+
+#endif
index 83773d0af5dd1b07f832eba250bf12575836fa2f..1842d14e87e674e65a66ae03c1014ce4f2913974 100644 (file)
@@ -226,15 +226,14 @@ int board_init(void)
 #endif
        select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
        rtc_enable_32khz_output();
+#ifdef CONFIG_FSL_CAAM
+       sec_init();
+#endif
 
 #ifdef CONFIG_FSL_LS_PPA
        ppa_init();
 #endif
 
-#ifdef CONFIG_FSL_CAAM
-       sec_init();
-#endif
-
        return 0;
 }
 
index 91f13ea71764f0f0f6cfdc6967e4673980be9dcf..8da1c6d0ae7c70ff20e519d669605bdfeec99756 100644 (file)
@@ -21,3 +21,8 @@ LS2080A_SECURE_BOOT BOARD
 M:     Saksham Jain <saksham.jain@nxp.freescale.com>
 S:     Maintained
 F:     configs/ls2080ardb_SECURE_BOOT_defconfig
+
+LS2088A_QSPI_SECURE_BOOT BOARD
+M:     Udit Agarwal <udit.agarwal@nxp.com>
+S:     Maintained
+F:     configs/ls2088ardb_qspi_SECURE_BOOT_defconfig
index 07ba0266d57cc64fe761dd488de05b56ea753f49..666562d106b178a16acc1499470f5eb38bd3b72d 100644 (file)
@@ -218,6 +218,10 @@ int board_init(void)
 #ifdef CONFIG_FSL_QIXIS
        QIXIS_WRITE(rst_ctl, QIXIS_RST_CTL_RESET_EN);
 #endif
+
+#ifdef CONFIG_FSL_CAAM
+       sec_init();
+#endif
 #ifdef CONFIG_FSL_LS_PPA
        ppa_init();
 #endif
index a681ecef3aa96d9bce12c92aa0ec2fe25dfa697e..5819b1825dcd9e9b5dfbbef305f4759048b827fc 100644 (file)
@@ -260,7 +260,7 @@ static int setup_fec(void)
                (IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL_MASK |
                 IOMUXC_GPR_GPR1_GPR_ENET1_CLK_DIR_MASK), 0);
 
-       return set_clk_enet(ENET_125MHz);
+       return set_clk_enet(ENET_125MHZ);
 }
 
 
index c2e370ba0be7dc48f43c9a6eb370d324651c884a..bdbe5e70270eb8684ecd07cfba37c14b66a5aa89 100644 (file)
@@ -626,9 +626,6 @@ void board_init_f(ulong dummy)
        spl_dram_init(8 << ventana_info.sdram_width,
                      16 << ventana_info.sdram_size,
                      board_model);
-
-       /* Clear the BSS. */
-       memset(__bss_start, 0, __bss_end - __bss_start);
 }
 
 void board_boot_order(u32 *spl_boot_list)
index bcd149f5b065a0be0d7746f5af982b6e4a4adb41..2fff27bc77529c754d768d39eed457151e982415 100644 (file)
@@ -5,4 +5,4 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-obj-y  := bx50v3.o
+obj-y  := bx50v3.o vpd_reader.o
index b25c634bb5a072a1010496adbb62e38e7d1dcc0b..c7df4ce84702ba3d7ea1d6a10545b04c6239b02e 100644 (file)
 #include <asm/arch/sys_proto.h>
 #include <i2c.h>
 #include <pwm.h>
+#include <stdlib.h>
+#include "vpd_reader.h"
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifndef CONFIG_SYS_I2C_EEPROM_ADDR
+# define CONFIG_SYS_I2C_EEPROM_ADDR     0x50
+# define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
+#endif
+
+#ifndef CONFIG_SYS_I2C_EEPROM_BUS
+#define CONFIG_SYS_I2C_EEPROM_BUS       2
+#endif
+
 #define NC_PAD_CTRL (PAD_CTL_PUS_100K_UP |     \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | \
        PAD_CTL_HYS)
@@ -528,6 +539,102 @@ int overwrite_console(void)
        return 1;
 }
 
+#define VPD_TYPE_INVALID 0x00
+#define VPD_BLOCK_NETWORK 0x20
+#define VPD_BLOCK_HWID 0x44
+#define VPD_PRODUCT_B850 1
+#define VPD_PRODUCT_B650 2
+#define VPD_PRODUCT_B450 3
+
+struct vpd_cache {
+       uint8_t product_id;
+       uint8_t macbits;
+       unsigned char mac1[6];
+};
+
+/*
+ * Extracts MAC and product information from the VPD.
+ */
+static int vpd_callback(
+       void *userdata,
+       uint8_t id,
+       uint8_t version,
+       uint8_t type,
+       size_t size,
+       uint8_t const *data)
+{
+       struct vpd_cache *vpd = (struct vpd_cache *)userdata;
+
+       if (   id == VPD_BLOCK_HWID
+           && version == 1
+           && type != VPD_TYPE_INVALID
+           && size >= 1) {
+               vpd->product_id = data[0];
+
+       } else if (   id == VPD_BLOCK_NETWORK
+                  && version == 1
+                  && type != VPD_TYPE_INVALID
+                  && size >= 6) {
+               vpd->macbits |= 1;
+               memcpy(vpd->mac1, data, 6);
+       }
+
+       return 0;
+}
+
+static void set_eth0_mac_address(unsigned char * mac)
+{
+       uint32_t *ENET_TCR = (uint32_t*)0x21880c4;
+       uint32_t *ENET_PALR = (uint32_t*)0x21880e4;
+       uint32_t *ENET_PAUR = (uint32_t*)0x21880e8;
+
+       *ENET_TCR |= 0x100;  /* ADDINS */
+       *ENET_PALR |= (mac[0] << 24) | (mac[1] << 16) | (mac[2] << 8) | mac[3];
+       *ENET_PAUR |= (mac[4] << 24) | (mac[5] << 16);
+}
+
+static void process_vpd(struct vpd_cache *vpd)
+{
+       if (   vpd->product_id == VPD_PRODUCT_B850
+           || vpd->product_id == VPD_PRODUCT_B650
+           || vpd->product_id == VPD_PRODUCT_B450) {
+               if (vpd->macbits & 1) {
+                       set_eth0_mac_address(vpd->mac1);
+               }
+       }
+}
+
+static int read_vpd(uint eeprom_bus)
+{
+       struct vpd_cache vpd;
+       int res;
+       int size = 1024;
+       uint8_t *data;
+       unsigned int current_i2c_bus = i2c_get_bus_num();
+
+       res = i2c_set_bus_num(eeprom_bus);
+       if (res < 0)
+               return res;
+
+       data = (uint8_t *)malloc(size);
+       if (!data)
+               return -ENOMEM;
+
+       res = i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0,
+                       CONFIG_SYS_I2C_EEPROM_ADDR_LEN, data, size);
+
+       if (res == 0) {
+               memset(&vpd, 0, sizeof(vpd));
+               vpd_reader(size, data, &vpd, vpd_callback);
+               process_vpd(&vpd);
+       }
+
+       free(data);
+
+       i2c_set_bus_num(current_i2c_bus);
+       return res;
+}
+
 int board_eth_init(bd_t *bis)
 {
        setup_iomux_enet();
@@ -586,6 +693,8 @@ int board_init(void)
        setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
        setup_i2c(3, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
 
+       read_vpd(CONFIG_SYS_I2C_EEPROM_BUS);
+
        return 0;
 }
 
diff --git a/board/ge/bx50v3/vpd_reader.c b/board/ge/bx50v3/vpd_reader.c
new file mode 100644 (file)
index 0000000..98da893
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * Copyright 2016 General Electric Company
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "vpd_reader.h"
+
+#include <linux/bch.h>
+#include <stdlib.h>
+
+
+/* BCH configuration */
+
+const struct {
+       int header_ecc_capability_bits;
+       int data_ecc_capability_bits;
+       unsigned int prim_poly;
+       struct {
+               int min;
+               int max;
+       } galois_field_order;
+} bch_configuration = {
+       .header_ecc_capability_bits = 4,
+       .data_ecc_capability_bits = 16,
+       .prim_poly = 0,
+       .galois_field_order = {
+               .min = 5,
+               .max = 15,
+       },
+};
+
+static int calculate_galois_field_order(size_t source_length)
+{
+       int gfo = bch_configuration.galois_field_order.min;
+
+       for (; gfo < bch_configuration.galois_field_order.max &&
+            ((((1 << gfo) - 1) - ((int)source_length * 8)) < 0);
+            gfo++) {
+       }
+
+       if (gfo == bch_configuration.galois_field_order.max) {
+               return -1;
+       }
+
+       return gfo + 1;
+}
+
+static int verify_bch(int ecc_bits, unsigned int prim_poly,
+       uint8_t * data, size_t data_length,
+       const uint8_t * ecc, size_t ecc_length)
+{
+       int gfo = calculate_galois_field_order(data_length);
+       if (gfo < 0) {
+               return -1;
+       }
+
+       struct bch_control * bch = init_bch(gfo, ecc_bits, prim_poly);
+       if (!bch) {
+               return -1;
+       }
+
+       if (bch->ecc_bytes != ecc_length) {
+               free_bch(bch);
+               return -1;
+       }
+
+       unsigned * errloc = (unsigned *)calloc(data_length, sizeof(unsigned));
+       int errors = decode_bch(
+                       bch, data, data_length, ecc, NULL, NULL, errloc);
+       free_bch(bch);
+       if (errors < 0) {
+               free(errloc);
+               return -1;
+       }
+
+       if (errors > 0) {
+               for (int n = 0; n < errors; n++) {
+                       if (errloc[n] >= 8 * data_length) {
+                               /* n-th error located in ecc (no need for data correction) */
+                       } else {
+                               /* n-th error located in data */
+                               data[errloc[n] / 8] ^= 1 << (errloc[n] % 8);
+                       }
+               }
+       }
+
+       free(errloc);
+       return 0;
+}
+
+
+static const int ID = 0;
+static const int LEN = 1;
+static const int VER = 2;
+static const int TYP = 3;
+static const int BLOCK_SIZE = 4;
+
+static const uint8_t HEADER_BLOCK_ID = 0x00;
+static const uint8_t HEADER_BLOCK_LEN = 18;
+static const uint32_t HEADER_BLOCK_MAGIC = 0xca53ca53;
+static const size_t HEADER_BLOCK_VERIFY_LEN = 14;
+static const size_t HEADER_BLOCK_ECC_OFF = 14;
+static const size_t HEADER_BLOCK_ECC_LEN = 4;
+
+static const uint8_t ECC_BLOCK_ID = 0xFF;
+
+int vpd_reader(
+       size_t size,
+       uint8_t * data,
+       void * userdata,
+       int (*fn)(
+           void * userdata,
+           uint8_t id,
+           uint8_t version,
+           uint8_t type,
+           size_t size,
+           uint8_t const * data))
+{
+       if (   size < HEADER_BLOCK_LEN
+           || data == NULL
+           || fn == NULL) {
+               return -EINVAL;
+       }
+
+       /*
+        * +--------------------+--------------------+--//--+--------------------+
+        * | header block       | data block         | ...  | ecc block          |
+        * +--------------------+--------------------+--//--+--------------------+
+        * :                    :                           :
+        * +------+-------+-----+                           +------+-------------+
+        * | id   | magic | ecc |                           | ...  | ecc         |
+        * | len  | off   |     |                           +------+-------------+
+        * | ver  | size  |     |                           :
+        * | type |       |     |                           :
+        * +------+-------+-----+                           :
+        * :              :     :                           :
+        * <----- [1] ---->     <----------- [2] ----------->
+        *
+        * Repair (if necessary) the contents of header block [1] by using a
+        * 4 byte ECC located at the end of the header block.  A successful
+        * return value means that we can trust the header.
+        */
+       int ret = verify_bch(
+               bch_configuration.header_ecc_capability_bits,
+               bch_configuration.prim_poly,
+               data,
+               HEADER_BLOCK_VERIFY_LEN,
+               &data[HEADER_BLOCK_ECC_OFF],
+               HEADER_BLOCK_ECC_LEN);
+       if (ret < 0) {
+               return ret;
+       }
+
+       /* Validate header block { id, length, version, type }. */
+       if (   data[ID] != HEADER_BLOCK_ID
+           || data[LEN] != HEADER_BLOCK_LEN
+           || data[VER] != 0
+           || data[TYP] != 0
+           || ntohl(*(uint32_t *)(&data[4])) != HEADER_BLOCK_MAGIC) {
+               return -EINVAL;
+       }
+
+       uint32_t offset = ntohl(*(uint32_t *)(&data[8]));
+       uint16_t size_bits = ntohs(*(uint16_t *)(&data[12]));
+
+       /* Check that ECC header fits. */
+       if (offset + 3 >= size) {
+               return -EINVAL;
+       }
+
+       /* Validate ECC block. */
+       uint8_t * ecc = &data[offset];
+       if (   ecc[ID] != ECC_BLOCK_ID
+           || ecc[LEN] < BLOCK_SIZE
+           || ecc[LEN] + offset > size
+           || ecc[LEN] - BLOCK_SIZE != size_bits / 8
+           || ecc[VER] != 1
+           || ecc[TYP] != 1) {
+               return -EINVAL;
+       }
+
+       /*
+        * Use the header block to locate the ECC block and verify the data
+        * blocks [2] against the ecc block ECC.
+        */
+       ret = verify_bch(
+               bch_configuration.data_ecc_capability_bits,
+               bch_configuration.prim_poly,
+               &data[data[LEN]],
+               offset - data[LEN],
+               &data[offset + BLOCK_SIZE],
+               ecc[LEN] - BLOCK_SIZE);
+       if (ret < 0) {
+               return ret;
+       }
+
+       /* Stop after ECC.  Ignore possible zero padding. */
+       size = offset;
+
+       for (;;) {
+               /* Move to next block. */
+               size -= data[LEN];
+               data += data[LEN];
+
+               if (size == 0) {
+                       /* Finished iterating through blocks. */
+                       return 0;
+               }
+
+               if (   size < BLOCK_SIZE
+                   || data[LEN] < BLOCK_SIZE) {
+                       /* Not enough data for a header, or short header. */
+                       return -EINVAL;
+               }
+
+               ret = fn(
+                       userdata,
+                       data[ID],
+                       data[VER],
+                       data[TYP],
+                       data[LEN] - BLOCK_SIZE,
+                       &data[BLOCK_SIZE]);
+               if (ret) {
+                       return ret;
+               }
+       }
+}
diff --git a/board/ge/bx50v3/vpd_reader.h b/board/ge/bx50v3/vpd_reader.h
new file mode 100644 (file)
index 0000000..efa172a
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2016 General Electric Company
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "common.h"
+
+/*
+ * Read VPD from given data, verify content, and call callback
+ * for each vital product data block.
+ *
+ * Returns Non-zero on error.  Negative numbers encode errno.
+ */
+int vpd_reader(
+       size_t size,
+       uint8_t * data,
+       void * userdata,
+       int (*fn)(
+           void * userdata,
+           uint8_t id,
+           uint8_t version,
+           uint8_t type,
+           size_t size,
+           uint8_t const * data));
index d7d950e877182b0a020a17d7128b9d252e59af14..4ebf80813fbeffdf745b42fa1d829b86880b3332 100644 (file)
@@ -18,6 +18,15 @@ config TARGET_BAYLEYBAY
          4GB memory, HDMI/DP/VGA display, HD audio, SATA, USB2, USB3, SD, eMMC,
          PCIe and some other sensor interfaces.
 
+config TARGET_CHERRYHILL
+       bool "Cherry Hill"
+       help
+         This is the Intel Cherry Hill Customer Reference Board. It is in a
+         mini-ITX form factor containing the Intel Braswell SoC, which has
+         a 64-bit quad-core, single-thread, Intel Atom processor, along with
+         serial console, 10/100/1000 Ethernet, SD-Card, USB 2/3, SATA, PCIe,
+         some GPIOs, one HDMI and two DP video out.
+
 config TARGET_COUGARCANYON2
        bool "Cougar Canyon 2"
        help
@@ -69,6 +78,7 @@ config TARGET_MINNOWMAX
 endchoice
 
 source "board/intel/bayleybay/Kconfig"
+source "board/intel/cherryhill/Kconfig"
 source "board/intel/cougarcanyon2/Kconfig"
 source "board/intel/crownbay/Kconfig"
 source "board/intel/edison/Kconfig"
diff --git a/board/intel/cherryhill/Kconfig b/board/intel/cherryhill/Kconfig
new file mode 100644 (file)
index 0000000..a4fa004
--- /dev/null
@@ -0,0 +1,25 @@
+if TARGET_CHERRYHILL
+
+config SYS_BOARD
+       default "cherryhill"
+
+config SYS_VENDOR
+       default "intel"
+
+config SYS_SOC
+       default "braswell"
+
+config SYS_CONFIG_NAME
+       default "cherryhill"
+
+config SYS_TEXT_BASE
+       default 0xffe00000
+
+config BOARD_SPECIFIC_OPTIONS # dummy
+       def_bool y
+       select X86_RESET_VECTOR
+       select INTEL_BRASWELL
+       select BOARD_ROMSIZE_KB_8192
+       select SPI_FLASH_MACRONIX
+
+endif
diff --git a/board/intel/cherryhill/MAINTAINERS b/board/intel/cherryhill/MAINTAINERS
new file mode 100644 (file)
index 0000000..6e90f64
--- /dev/null
@@ -0,0 +1,6 @@
+INTEL CHERRYHILL BOARD
+M:     Bin Meng <bmeng.cn@gmail.com>
+S:     Maintained
+F:     board/intel/cherryhill/
+F:     include/configs/cherryhill.h
+F:     configs/cherryhill_defconfig
diff --git a/board/intel/cherryhill/Makefile b/board/intel/cherryhill/Makefile
new file mode 100644 (file)
index 0000000..0dbb055
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  += cherryhill.o start.o
diff --git a/board/intel/cherryhill/cherryhill.c b/board/intel/cherryhill/cherryhill.c
new file mode 100644 (file)
index 0000000..d86dc97
--- /dev/null
@@ -0,0 +1,596 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/gpio.h>
+#include <asm/fsp/fsp_support.h>
+
+static const struct gpio_family gpio_family[] = {
+       GPIO_FAMILY_CONF("SOUTHEAST_2_hshvfamily_2x3_rcomp_7_0", NA, 0,
+                        VOLT_1_8, NA, NA, NA, 0, ENABLE, 2, SOUTHEAST),
+
+       /* end of the table */
+       GPIO_FAMILY_CONF("GPIO FAMILY TABLE END", NA, 0,
+                        VOLT_1_8, NA, NA, NA, 0, DISABLE, 0, TERMINATOR),
+};
+
+static const struct gpio_pad gpio_pad[] = {
+       GPIO_PAD_CONF("N37: CX_PRDY_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 29, NA, 0x4c38, NORTH),
+       GPIO_PAD_CONF("N35: CX_PRDY_B_2", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 27, NA, 0x4c28, NORTH),
+       GPIO_PAD_CONF("N39: CX_PREQ_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 20, NA, 0x4858, NORTH),
+       GPIO_PAD_CONF("N48: GP_CAMERASB00", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 37, NA, 0x5018, NORTH),
+       GPIO_PAD_CONF("N53: GP_CAMERASB01", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 42, NA, 0x5040, NORTH),
+       GPIO_PAD_CONF("N46: GP_CAMERASB02", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 35, NA, 0x5008, NORTH),
+       GPIO_PAD_CONF("N51: GP_CAMERASB03", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 40, NA, 0x5030, NORTH),
+       GPIO_PAD_CONF("N56: GP_CAMERASB04", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 45, NA, 0x5058, NORTH),
+       GPIO_PAD_CONF("N45: GP_CAMERASB05", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 34, NA, 0x5000, NORTH),
+       GPIO_PAD_CONF("N49: GP_CAMERASB06", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 38, NA, 0x5020, NORTH),
+       GPIO_PAD_CONF("N54: GP_CAMERASB07", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 43, NA, 0x5048, NORTH),
+       GPIO_PAD_CONF("N47: GP_CAMERASB08", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 36, NA, 0x5010, NORTH),
+       GPIO_PAD_CONF("N52: GP_CAMERASB09", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 41, NA, 0x5038, NORTH),
+       GPIO_PAD_CONF("N50: GP_CAMERASB10", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 39, NA, 0x5028, NORTH),
+       GPIO_PAD_CONF("N55: GP_CAMERASB11", GPIO, M1, GPO, LOW,
+                     NA, NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 44, NA, 0x5050, NORTH),
+       GPIO_PAD_CONF("N00: GPIO_DFX0", NATIVE, M5, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 0, NA, 0x4400, NORTH),
+       GPIO_PAD_CONF("N03: GPIO_DFX1", NATIVE, M5, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 3, NA, 0x4418, NORTH),
+       GPIO_PAD_CONF("N07: GPIO_DFX2", NATIVE, M5, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 2, NA, 0x4438, NORTH),
+       GPIO_PAD_CONF("N01: GPIO_DFX3", NATIVE, M5, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, INV_TX_ENABLE,
+                     NA, 1, NA, 0x4408, NORTH),
+       GPIO_PAD_CONF("N05: GPIO_DFX4", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 5, NA, 0x4428, NORTH),
+       GPIO_PAD_CONF("N04: GPIO_DFX5", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 4, NA, 0x4420, NORTH),
+       GPIO_PAD_CONF("N08: GPIO_DFX6", NATIVE, M8, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 8, NA, 0x4440, NORTH),
+       GPIO_PAD_CONF("N02: GPIO_DFX7", GPIO, M1, GPO, LOW, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 2, NA, 0x4410, NORTH),
+       GPIO_PAD_CONF("N15: GPIO_SUS0", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 9 , NA, 0x4800, NORTH),
+       GPIO_PAD_CONF("N19: GPIO_SUS1", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 13, NA, 0x4820, NORTH),
+       GPIO_PAD_CONF("N24: GPIO_SUS2", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 18, NA, 0x4848, NORTH),
+       GPIO_PAD_CONF("N17: GPIO_SUS3", NATIVE, M6, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 11, NA, 0x4810, NORTH),
+       GPIO_PAD_CONF("N22: GPIO_SUS4", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 16, NA, 0x4838, NORTH),
+       GPIO_PAD_CONF("N20: GPIO_SUS5", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 14, NA, 0x4828, NORTH),
+       GPIO_PAD_CONF("N25: GPIO_SUS6", GPIO, M1, GPI, NA, NA,
+                     TRIG_EDGE_LOW, L9, NA, NA, NA, NON_MASKABLE,
+                     EN_EDGE_RX_DATA, NO_INVERSION,
+                     NA, 19, SCI, 0x4850, NORTH),
+       GPIO_PAD_CONF("N18: GPIO_SUS7", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 12, SMI, 0x4818, NORTH),
+       GPIO_PAD_CONF("N71: HV_DDI0_DDC_SCL", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 57, NA, 0x5458, NORTH),
+       GPIO_PAD_CONF("N66: HV_DDI0_DDC_SDA", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 52, NA, 0x5430, NORTH),
+       GPIO_PAD_CONF("N61: HV_DDI0_HPD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, INV_TX_ENABLE,
+                     NA, 47, NA, 0x5408, NORTH),
+       GPIO_PAD_CONF("N64: HV_DDI1_HPD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, INV_TX_ENABLE,
+                     NA, 50, NA, 0x5420, NORTH),
+       GPIO_PAD_CONF("N67: HV_DDI2_DDC_SCL", NATIVE, M3, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 53, NA, 0x5438, NORTH),
+       GPIO_PAD_CONF("N62: HV_DDI2_DDC_SDA", NATIVE, M3, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 48, NA, 0x5410, NORTH),
+       GPIO_PAD_CONF("N68: HV_DDI2_HPD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, INV_TX_ENABLE,
+                     NA, 54, NA, 0x5440, NORTH),
+       GPIO_PAD_CONF("N65: PANEL0_BKLTCTL", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 51, NA, 0x5428, NORTH),
+       GPIO_PAD_CONF("N60: PANEL0_BKLTEN", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 46, NA, 0x5400, NORTH),
+       GPIO_PAD_CONF("N72: PANEL0_VDDEN", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 58, NA, 0x5460, NORTH),
+       GPIO_PAD_CONF("N63: PANEL1_BKLTCTL", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 49, NA, 0x5418, NORTH),
+       GPIO_PAD_CONF("N70: PANEL1_BKLTEN", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 56, NA, 0x5450, NORTH),
+       GPIO_PAD_CONF("N69: PANEL1_VDDEN", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 55, NA, 0x5448, NORTH),
+       GPIO_PAD_CONF("N32: PROCHOT_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 24, NA, 0x4c10, NORTH),
+       GPIO_PAD_CONF("N16: SEC_GPIO_SUS10", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 10, NA, 0x4808, NORTH),
+       GPIO_PAD_CONF("N21: SEC_GPIO_SUS11", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 15, NA, 0x4830, NORTH),
+       GPIO_PAD_CONF("N23: SEC_GPIO_SUS8", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 17, NA, 0x4840, NORTH),
+       GPIO_PAD_CONF("N27: SEC_GPIO_SUS9", GPIO, M1, GPI, LOW, NA,
+                     TRIG_LEVEL, L15, NA, NA, NA, NON_MASKABLE,
+                     EN_RX_DATA, INV_RX_DATA,
+                     NA, 21, SCI, 0x4860, NORTH),
+       GPIO_PAD_CONF("N31: TCK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 23, NA, 0x4c08, NORTH),
+       GPIO_PAD_CONF("N41: TDI", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 33, NA, 0x4c58, NORTH),
+       GPIO_PAD_CONF("N39: TDO", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 31, NA, 0x4c48, NORTH),
+       GPIO_PAD_CONF("N36: TDO_2", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 28, NA, 0x4c30, NORTH),
+       GPIO_PAD_CONF("N34: TMS", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 26, NA, 0x4c20, NORTH),
+       GPIO_PAD_CONF("N30: TRST_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 22, NA, 0x4c00, NORTH),
+
+       GPIO_PAD_CONF("E21: MF_ISH_GPIO_0", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 18, NA, 0x4830, EAST),
+       GPIO_PAD_CONF("E18: MF_ISH_GPIO_1", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 15, NA, 0x4818, EAST),
+       GPIO_PAD_CONF("E24: MF_ISH_GPIO_2", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 21, NA, 0x4848, EAST),
+       GPIO_PAD_CONF("E15: MF_ISH_GPIO_3", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 12, NA, 0x4800, EAST),
+       GPIO_PAD_CONF("E22: MF_ISH_GPIO_4", GPIO, M1, GPI, NA, NA,
+                     NA, L0, NA, NA, NA, NON_MASKABLE, NA, NO_INVERSION,
+                     NA, 19, NA, 0x4838, EAST),
+       GPIO_PAD_CONF("E19: MF_ISH_GPIO_5", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 16, NA, 0x4820, EAST),
+       GPIO_PAD_CONF("E25: MF_ISH_GPIO_6", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 22, NA, 0x4850, EAST),
+       GPIO_PAD_CONF("E16: MF_ISH_GPIO_7", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 13, NA, 0x4808, EAST),
+       GPIO_PAD_CONF("E23: MF_ISH_GPIO_8", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 20, NA, 0x4840, EAST),
+       GPIO_PAD_CONF("E20: MF_ISH_GPIO_9", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 17, NA, 0x4828, EAST),
+       GPIO_PAD_CONF("E26: MF_ISH_I2C1_SDA", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 23, NA, 0x4858, EAST),
+       GPIO_PAD_CONF("E17: MF_ISH_I2C1_SCL", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 14, NA, 0x4810, EAST),
+       GPIO_PAD_CONF("E04: PMU_AC_PRESENT", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 4, NA, 0x4420, EAST),
+       GPIO_PAD_CONF("E01: PMU_BATLOW_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 1, NA, 0x4408, EAST),
+       GPIO_PAD_CONF("E05: PMU_PLTRST_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 5, NA, 0x4428, EAST),
+       GPIO_PAD_CONF("E07: PMU_SLP_LAN_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 7, NA, 0x4438, EAST),
+       GPIO_PAD_CONF("E03: PMU_SLP_S0IX_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 3, NA, 0x4418, EAST),
+       GPIO_PAD_CONF("E00: PMU_SLP_S3_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 0, NA, 0x4400, EAST),
+       GPIO_PAD_CONF("E09: PMU_SLP_S4_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 9, NA, 0x4448, EAST),
+       GPIO_PAD_CONF("E06: PMU_SUSCLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 6, NA, 0x4430, EAST),
+       GPIO_PAD_CONF("E10: PMU_WAKE_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_1K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 10, NA, 0x4450, EAST),
+       GPIO_PAD_CONF("E11: PMU_WAKE_LAN_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 11, NA, 0x4458, EAST),
+       GPIO_PAD_CONF("E02: SUS_STAT_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 2, NA, 0x4410, EAST),
+
+       GPIO_PAD_CONF("SE16: SDMMC1_CLK", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_L, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 9, NA, 0x4808, SOUTHEAST),
+       GPIO_PAD_CONF("SE23: SDMMC1_CMD", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 16, NA, 0x4840, SOUTHEAST),
+       GPIO_PAD_CONF("SE17: SDMMC1_D0", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 10, NA, 0x4810, SOUTHEAST),
+       GPIO_PAD_CONF("SE24: SDMMC1_D1", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 17, NA, 0x4848, SOUTHEAST),
+       GPIO_PAD_CONF("SE20: SDMMC1_D2", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 13, NA, 0x4828, SOUTHEAST),
+       GPIO_PAD_CONF("SE26: SDMMC1_D3_CD_B", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 19, NA, 0x4858, SOUTHEAST),
+       GPIO_PAD_CONF("SE67: MMC1_D4_SD_WE", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 41, NA, 0x5438, SOUTHEAST),
+       GPIO_PAD_CONF("SE65: MMC1_D5", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 39, NA, 0x5428, SOUTHEAST),
+       GPIO_PAD_CONF("SE63: MMC1_D6", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 37, NA, 0x5418, SOUTHEAST),
+       GPIO_PAD_CONF("SE68: MMC1_D7", NATIVE, M1, NA, NA, HIGH,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 42, NA, 0x5440, SOUTHEAST),
+       GPIO_PAD_CONF("SE69: MMC1_RCLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 43, NA, 0x5448, SOUTHEAST),
+       GPIO_PAD_CONF("SE77: GPIO_ALERT", GPIO, M1, GPI, NA, NA,
+                     TRIG_LEVEL, L2, NA, NA, NA, NON_MASKABLE,
+                     EN_RX_DATA, INV_RX_DATA,
+                     NA, 46, NA, 0x5810, SOUTHEAST),
+       GPIO_PAD_CONF("SE79: ILB_SERIRQ", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 48, NA, 0x5820, SOUTHEAST),
+       GPIO_PAD_CONF("SE51: MF_LPC_CLKOUT0", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_NONE, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 32, NA, 0x5030, SOUTHEAST),
+       GPIO_PAD_CONF("SE49: MF_LPC_CLKOUT1", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 30, NA, 0x5020, SOUTHEAST),
+       GPIO_PAD_CONF("SE47: MF_LPC_AD0", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 28, NA, 0x5010, SOUTHEAST),
+       GPIO_PAD_CONF("SE52: MF_LPC_AD1", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 33, NA, 0x5038, SOUTHEAST),
+       GPIO_PAD_CONF("SE45: MF_LPC_AD2", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 26, NA, 0x5000, SOUTHEAST),
+       GPIO_PAD_CONF("SE50: MF_LPC_AD3", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 31, NA, 0x5028, SOUTHEAST),
+       GPIO_PAD_CONF("SE46: LPC_CLKRUNB", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 27, NA, 0x5008, SOUTHEAST),
+       GPIO_PAD_CONF("SE48: LPC_FRAMEB", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 29, NA, 0x5018, SOUTHEAST),
+       GPIO_PAD_CONF("SE00: MF_PLT_CLK0", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 0, NA, 0x4400, SOUTHEAST),
+       GPIO_PAD_CONF("SE02: MF_PLT_CLK1", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 1, NA, 0x4410, SOUTHEAST),
+       GPIO_PAD_CONF("SE07: MF_PLT_CLK2", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 7, NA, 0x4438, SOUTHEAST),
+       GPIO_PAD_CONF("SE04: MF_PLT_CLK3", GPIO, M1, GPI, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 4, NA, 0x4420, SOUTHEAST),
+       GPIO_PAD_CONF("SE03: MF_PLT_CLK4", GPIO, M1, GPO, LOW, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 3, NA, 0x4418, SOUTHEAST),
+       GPIO_PAD_CONF("SE06: MF_PLT_CLK5", GPIO, M3, GPO, LOW, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 6, NA, 0x4430, SOUTHEAST),
+       GPIO_PAD_CONF("SE83: SUSPWRDNACK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 52, NA, 0x5840, SOUTHEAST),
+       GPIO_PAD_CONF("SE05: PWM0", GPIO, M1, GPO, LOW, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 5, NA, 0x4428, SOUTHEAST),
+       GPIO_PAD_CONF("SE01: PWM1", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 1, NA, 0x4408, SOUTHEAST),
+       GPIO_PAD_CONF("SE85: SDMMC3_1P8_EN", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 54, NA, 0x5850, SOUTHEAST),
+       GPIO_PAD_CONF("SE81: SDMMC3_CD_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 50, NA, 0x5830, SOUTHEAST),
+       GPIO_PAD_CONF("SE31: SDMMC3_CLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 21, NA, 0x4c08, SOUTHEAST),
+       GPIO_PAD_CONF("SE34: SDMMC3_CMD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 24, NA, 0x4c20, SOUTHEAST),
+       GPIO_PAD_CONF("SE35: SDMMC3_D0", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 25, NA, 0x4c28, SOUTHEAST),
+       GPIO_PAD_CONF("SE30: SDMMC3_D1", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 20, NA, 0x4c00, SOUTHEAST),
+       GPIO_PAD_CONF("SE33: SDMMC3_D2", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 23, NA, 0x4c18, SOUTHEAST),
+       GPIO_PAD_CONF("SE32: SDMMC3_D3", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 22, NA, 0x4c10, SOUTHEAST),
+       GPIO_PAD_CONF("SE78: SDMMC3_PWR_EN_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_L, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 47, NA, 0x5818, SOUTHEAST),
+       GPIO_PAD_CONF("SE19: SDMMC2_CLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 12, NA, 0x4820, SOUTHEAST),
+       GPIO_PAD_CONF("SE22: SDMMC2_CMD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 15, NA, 0x4838, SOUTHEAST),
+       GPIO_PAD_CONF("SE25: SDMMC2_D0", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 18, NA, 0x4850, SOUTHEAST),
+       GPIO_PAD_CONF("SE18: SDMMC2_D1", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 11, NA, 0x4818, SOUTHEAST),
+       GPIO_PAD_CONF("SE21: SDMMC2_D2", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 14, NA, 0x4830, SOUTHEAST),
+       GPIO_PAD_CONF("SE15: SDMMC2_D3_CD_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 8, NA, 0x4800, SOUTHEAST),
+       GPIO_PAD_CONF("SE62: SPI1_CLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 36, NA, 0x5410, SOUTHEAST),
+       GPIO_PAD_CONF("SE61: SPI1_CS0_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 35, NA, 0x5408, SOUTHEAST),
+       GPIO_PAD_CONF("SE66: SPI1_CS1_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 40, NA, 0x5430, SOUTHEAST),
+       GPIO_PAD_CONF("SE60: SPI1_MISO", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 34, NA, 0x5400, SOUTHEAST),
+       GPIO_PAD_CONF("SE64: SPI1_MOSI", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 38, NA, 0x5420, SOUTHEAST),
+       GPIO_PAD_CONF("SE80: USB_OC0_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 49, NA, 0x5828, SOUTHEAST),
+       GPIO_PAD_CONF("SE75: USB_OC1_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 44, NA, 0x5800, SOUTHEAST),
+       GPIO_PAD_CONF("SW02: FST_SPI_CLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 2, NA, 0x4410, SOUTHWEST),
+       GPIO_PAD_CONF("SW06: FST_SPI_CS0_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 6, NA, 0x4430, SOUTHWEST),
+       GPIO_PAD_CONF("SW04: FST_SPI_CS1_B", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 4, NA, 0x4420, SOUTHWEST),
+       GPIO_PAD_CONF("SW07: FST_SPI_CS2_B", GPIO, M1, GPO, LOW, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 7, NA, 0x4438, SOUTHWEST),
+       GPIO_PAD_CONF("SW01: FST_SPI_D0", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 1, NA, 0x4408, SOUTHWEST),
+       GPIO_PAD_CONF("SW05: FST_SPI_D1", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 5, NA, 0x4428, SOUTHWEST),
+       GPIO_PAD_CONF("SW00: FST_SPI_D2", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 0, NA, 0x4400, SOUTHWEST),
+       GPIO_PAD_CONF("SW03: FST_SPI_D3", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 3, NA, 0x4418, SOUTHWEST),
+       GPIO_PAD_CONF("SW30: MF_HDA_CLK", NATIVE, M2, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 16, NA, 0x4c00, SOUTHWEST),
+       GPIO_PAD_CONF("SW37: MF_HDA_DOCKENB", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 23, NA, 0x4c38, SOUTHWEST),
+       GPIO_PAD_CONF("SW34: MF_HDA_DOCKRSTB", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 20, NA, 0x4c20, SOUTHWEST),
+       GPIO_PAD_CONF("SW31: MF_HDA_RSTB", NATIVE, M2, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 17, NA, 0x4c08, SOUTHWEST),
+       GPIO_PAD_CONF("SW32: MF_HDA_SDI0", NATIVE, M2, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 18, NA, 0x4c10, SOUTHWEST),
+       GPIO_PAD_CONF("SW36: MF_HDA_SDI1", NATIVE, M2, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 22, NA, 0x4c30, SOUTHWEST),
+       GPIO_PAD_CONF("SW33: MF_HDA_SDO", NATIVE, M2, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 19, NA, 0x4c18, SOUTHWEST),
+       GPIO_PAD_CONF("SW35: MF_HDA_SYNC", NATIVE, M2, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 21, NA, 0x4c28, SOUTHWEST),
+       GPIO_PAD_CONF("SW18: UART1_CTS_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 11, NA, 0x4818, SOUTHWEST),
+       GPIO_PAD_CONF("SW15: UART1_RTS_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 8, NA, 0x4800, SOUTHWEST),
+       GPIO_PAD_CONF("SW16: UART1_RXD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 9, NA, 0x4808, SOUTHWEST),
+       GPIO_PAD_CONF("SW20: UART1_TXD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 13, NA, 0x4828, SOUTHWEST),
+       GPIO_PAD_CONF("SW22: UART2_CTS_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_NONE, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 15, NA, 0x4838, SOUTHWEST),
+       GPIO_PAD_CONF("SW19: UART2_RTS_B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 12, NA, 0x4820, SOUTHWEST),
+       GPIO_PAD_CONF("SW17: UART2_RXD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_NONE, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 10, NA, 0x4810, SOUTHWEST),
+       GPIO_PAD_CONF("SW21: UART2_TXD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 14, NA, 0x4830, SOUTHWEST),
+       GPIO_PAD_CONF("SW50: I2C4_SCL", NATIVE, M3, NA, NA, NA,
+                     NA, NA, P_1K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 29, NA, 0x5028, SOUTHWEST),
+       GPIO_PAD_CONF("SW46: I2C4_SDA", NATIVE, M3, NA, NA, NA,
+                     NA, NA, P_1K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 25, NA, 0x5008, SOUTHWEST),
+       GPIO_PAD_CONF("SW49: I2C_NFC_SDA", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, INV_TX_ENABLE,
+                     NA, 28, NA, 0x5020, SOUTHWEST),
+       GPIO_PAD_CONF("SW52: I2C_NFC_SCL", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, INV_TX_ENABLE,
+                     NA, 31, NA, 0x5038, SOUTHWEST),
+       GPIO_PAD_CONF("SW77: GP_SSP_2_CLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 50, NA, 0x5c10, SOUTHWEST),
+       GPIO_PAD_CONF("SW81: GP_SSP_2_FS", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 54, NA, 0x5c30, SOUTHWEST),
+       GPIO_PAD_CONF("SW79: GP_SSP_2_RXD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 52, NA, 0x5c20, SOUTHWEST),
+       GPIO_PAD_CONF("SW82: GP_SSP_2_TXD", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, INV_TX_ENABLE,
+                     NA, 55, NA, 0x5C38, SOUTHWEST),
+       GPIO_PAD_CONF("SW90: PCIE_CLKREQ0B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 48, NA, 0x5c00, SOUTHWEST),
+       GPIO_PAD_CONF("SW91: PCIE_CLKREQ1B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 49, NA, 0x5c08, SOUTHWEST),
+       GPIO_PAD_CONF("SW93: PCIE_CLKREQ2B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 51, NA, 0x5c18, SOUTHWEST),
+       GPIO_PAD_CONF("SW95: PCIE_CLKREQ3B", NATIVE, M2, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 53, NA, 0x5c28, SOUTHWEST),
+       GPIO_PAD_CONF("SW75: SATA_GP0", GPIO, M1, GPO, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 40, NA, 0x5800, SOUTHWEST),
+       GPIO_PAD_CONF("SW76: SATA_GP1", GPIO, M1, GPI, HIGH, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 41, NA, 0x5808, SOUTHWEST),
+       GPIO_PAD_CONF("SW78: SATA_GP2", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, ENABLE, NA, NA, NA, NO_INVERSION,
+                     NA, 43, NA, 0x5818, SOUTHWEST),
+       GPIO_PAD_CONF("SW80: SATA_GP3", GPIO, M2, GPI, LOW, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 45, NA, 0x5828, SOUTHWEST),
+       GPIO_PAD_CONF("SW77: SATA_LEDN", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, ENABLE, NA, NA, NA, NO_INVERSION,
+                     NA, 42, NA, 0x5810, SOUTHWEST),
+       GPIO_PAD_CONF("SW79: MF_SMB_ALERTB", NATIVE, M1, NA, NA,
+                     NA, NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 44, NA, 0x5820, SOUTHWEST),
+       GPIO_PAD_CONF("SW81: MF_SMB_CLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 46, NA, 0x5830, SOUTHWEST),
+       GPIO_PAD_CONF("SW82: MF_SMB_DATA", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 47, NA, 0x5838, SOUTHWEST),
+       GPIO_PAD_CONF("SW90: PCIE_CLKREQ0B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NA,
+                     NA, 48, NA, 0x5c00, SOUTHWEST),
+       GPIO_PAD_CONF("SW91: PCIE_CLKREQ1B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NA,
+                     NA, 49, NA, 0x5c08, SOUTHWEST),
+       GPIO_PAD_CONF("SW93: PCIE_CLKREQ2B", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NA,
+                     NA, 51, NA, 0x5c18, SOUTHWEST),
+       GPIO_PAD_CONF("SW95: PCIE_CLKREQ3B", NATIVE, M2, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NA,
+                     NA, 53, NA, 0x5c28, SOUTHWEST),
+       GPIO_PAD_CONF("SW75: SATA_GP0", GPIO, M1, GPO, HIGH, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA,
+                     NA, 40, NA, 0x5800, SOUTHWEST),
+       GPIO_PAD_CONF("SW76: SATA_GP1", GPIO, M1, GPI, HIGH, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA,
+                     NA, 41, NA, 0x5808, SOUTHWEST),
+       GPIO_PAD_CONF("SW78: SATA_GP2", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, ENABLE, NA, NA, NA, NA,
+                     NA, 43, NA, 0x5818, SOUTHWEST),
+       GPIO_PAD_CONF("SW80: SATA_GP3", GPIO, M2, GPI, LOW, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NA,
+                     NA, 45, NA, 0x5828, SOUTHWEST),
+       GPIO_PAD_CONF("SW77: SATA_LEDN", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, ENABLE, NA, NA, NA, NA,
+                     NA, 42, NA, 0x5810, SOUTHWEST),
+       GPIO_PAD_CONF("SW79: MF_SMB_ALERTB", NATIVE, M1, NA, NA,
+                     NA, NA, NA, P_20K_H, NA, NA, NA, NA, NA,
+                     NA, 44, NA, 0x5820, SOUTHWEST),
+       GPIO_PAD_CONF("SW81: MF_SMB_CLK", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NA,
+                     NA, 46, NA, 0x5830, SOUTHWEST),
+       GPIO_PAD_CONF("SW82: MF_SMB_DATA", NATIVE, M1, NA, NA, NA,
+                     NA, NA, P_20K_H, NA, NA, NA, NA, NA,
+                     NA, 47, NA, 0x5838, SOUTHWEST),
+
+       /* end of the table */
+       GPIO_PAD_CONF("GPIO PAD TABLE END", NATIVE, M1, NA, NA, NA,
+                     NA, NA, NA, NA, NA, NA, NA, NO_INVERSION,
+                     NA, 0, NA, 0, TERMINATOR),
+};
+
+void update_fsp_gpio_configs(const struct gpio_family **family,
+                            const struct gpio_pad **pad)
+{
+       *family = gpio_family;
+       *pad = gpio_pad;
+}
diff --git a/board/intel/cherryhill/start.S b/board/intel/cherryhill/start.S
new file mode 100644 (file)
index 0000000..11af9de
--- /dev/null
@@ -0,0 +1,9 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+.globl early_board_init
+early_board_init:
+       jmp     early_board_init_ret
index 512f06da76b6565fd9d6ddea0db11fa9a0f08188..b4a68da88f239329ea642148823bdd60d50e583d 100644 (file)
@@ -596,10 +596,4 @@ void board_init_f(ulong dummy)
        udelay(100);
        mmdc_do_write_level_calibration(&novena_ddr_info);
        mmdc_do_dqs_calibration(&novena_ddr_info);
-
-       /* Clear the BSS. */
-       memset(__bss_start, 0, __bss_end - __bss_start);
-
-       /* load/boot image from boot device */
-       board_init_r(NULL, 0);
 }
index a2f804db8fee1f70a0468ae155f8c0177b5b21b9..196da46df9a0d3652020f11751624fcebbcdda79 100644 (file)
@@ -296,11 +296,5 @@ void board_init_f(ulong dummy)
 
        /* DDR initialization */
        spl_dram_init();
-
-       /* Clear the BSS. */
-       memset(__bss_start, 0, __bss_end - __bss_start);
-
-       /* load/boot image from boot device */
-       board_init_r(NULL, 0);
 }
 #endif
index 901f6094bb28579c4004bd94177bfbe99154f84a..743e500a5cab32e9b8cbf67b1519121849dba334 100644 (file)
@@ -9,4 +9,6 @@ config SYS_VENDOR
 config SYS_CONFIG_NAME
        default "am3517_evm"
 
+source "board/ti/common/Kconfig"
+
 endif
index fe3f9e664f982e7c51bcbe0c4ab5ab56eec95c77..40783c86a376e5fa7b4e57092ff20b0e8a21aa1e 100644 (file)
 #include <linux/usb/gadget.h>
 #include <linux/usb/musb.h>
 #include "omap3logic.h"
+#ifdef CONFIG_USB_EHCI_HCD
+#include <usb.h>
+#include <asm/ehci-omap.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -139,6 +143,33 @@ static struct musb_hdrc_platform_data musb_plat = {
 };
 #endif
 
+#if defined(CONFIG_USB_EHCI_HCD) && !defined(CONFIG_SPL_BUILD)
+/* Call usb_stop() before starting the kernel */
+void show_boot_progress(int val)
+{
+       if (val == BOOTSTAGE_ID_RUN_OS)
+               usb_stop();
+}
+
+static struct omap_usbhs_board_data usbhs_bdata = {
+       .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
+       .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
+       .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED
+};
+
+int ehci_hcd_init(int index, enum usb_init_type init,
+               struct ehci_hccr **hccr, struct ehci_hcor **hcor)
+{
+       return omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
+}
+
+int ehci_hcd_stop(int index)
+{
+       return omap_ehci_hcd_stop();
+}
+
+#endif /* CONFIG_USB_EHCI_HCD */
+
 
 /*
  * Routine: misc_init_r
index 9dc2eb09d1da52771045899f380a2838db1c503e..9bc13e142bdce30acc45cc247ed448829deaff56 100644 (file)
@@ -24,6 +24,9 @@ single board in board/sandbox.
 CONFIG_SANDBOX_BIG_ENDIAN should be defined when running on big-endian
 machines.
 
+By default sandbox builds and runs on 64-bit hosts. If you are going to build
+and run sandbox on a 32-bit host, select CONFIG_SANDBOX_32BIT.
+
 Note that standalone/API support is not available at present.
 
 
@@ -44,10 +47,6 @@ Note:
       make sandbox_defconfig all NO_SDL=1
       ./u-boot
 
-   If you are building on a 32-bit machine you may get errors from __ffs.h
-   about shifting more than the machine word size. Edit the config file
-   include/configs/sandbox.h and change CONFIG_SANDBOX_BITS_PER_LONG to 32.
-
 U-Boot will start on your computer, showing a sandbox emulation of the serial
 console:
 
@@ -338,6 +337,11 @@ $> lodev=`sudo losetup -P -f --show ./disk.raw`
 $> sudo mkfs.vfat -n EFI -v ${lodev}p1
 $> sudo mkfs.ext4 -L ROOT -v ${lodev}p2
 
+or utilize the device described in test/py/make_test_disk.py:
+
+   #!/usr/bin/python
+   import make_test_disk
+   make_test_disk.makeDisk()
 
 Writing Sandbox Drivers
 -----------------------
index 986abc57720bc15327d0d5e6d2f64a1194618d71..1e4da4a6b1674c4b38fbc217977a919f3bb136ce 100644 (file)
@@ -349,6 +349,7 @@ static bool is_hummingboard(void)
         * Machine selection -
         * Machine        val1, val2
         * -------------------------
+        * HB2            x     x
         * HB rev 3.x     x     0
         * CBi            0     1
         * HB             1     1
@@ -362,9 +363,37 @@ static bool is_hummingboard(void)
                return true;
 }
 
+static bool is_hummingboard2(void)
+{
+       int val1;
+
+       SETUP_IOMUX_PADS(hb_cbi_sense);
+
+       gpio_direction_input(IMX_GPIO_NR(2, 8));
+
+        val1 = gpio_get_value(IMX_GPIO_NR(2, 8));
+
+       /*
+        * Machine selection -
+        * Machine        val1
+        * -------------------
+        * HB2            0
+        * HB rev 3.x     x
+        * CBi            x
+        * HB             x
+        */
+
+       if (val1 == 0)
+               return true;
+       else
+               return false;
+}
+
 int checkboard(void)
 {
-       if (is_hummingboard())
+       if (is_hummingboard2())
+               puts("Board: MX6 Hummingboard2\n");
+       else if (is_hummingboard())
                puts("Board: MX6 Hummingboard\n");
        else
                puts("Board: MX6 Cubox-i\n");
@@ -375,7 +404,9 @@ int checkboard(void)
 int board_late_init(void)
 {
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
-       if (is_hummingboard())
+       if (is_hummingboard2())
+               env_set("board_name", "HUMMINGBOARD2");
+       else if (is_hummingboard())
                env_set("board_name", "HUMMINGBOARD");
        else
                env_set("board_name", "CUBOXI");
index a2805ee0801ff3816dff08d2ccfd0970e1d5f7b0..8af4effa7890ea82661bcd99d827be524f1356e9 100644 (file)
@@ -47,3 +47,20 @@ Remove power from the pico board.
 Put pico board into normal boot mode.
 
 Power up the board and the new updated U-Boot should boot from eMMC.
+
+Building U-Boot to boot with NXP 4.1 kernel:
+
+The NXP 4.1 kernel boots only in secure boot mode on mx7.
+
+Follow the next steps to enable secure boot:
+
+$ make mrproper
+$ make pico-imx7d_defconfig
+$ make menuconfig
+       -> ARM architecture
+       -> [*] Enable support for booting in non-secure mode
+       -> [*]   Boot in secure mode by default
+       -> Exit
+$ make
+
+Flash u-boot.imx using the imx_usb_loader tool.
index b4c9be73780607bb3feb55f2def2985d3bb10e61..67bab51dfd4d4bc471b4f231d97c9af7e8a7283d 100644 (file)
@@ -182,7 +182,7 @@ static int setup_fec(void)
                        (IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL_MASK |
                        IOMUXC_GPR_GPR1_GPR_ENET1_CLK_DIR_MASK), 0);
 
-       return set_clk_enet(ENET_125MHz);
+       return set_clk_enet(ENET_125MHZ);
 }
 
 int board_phy_config(struct phy_device *phydev)
index 47304fcba6b872195cdcfd332ccc8c70136962ac..83e4332984303c24c7f8199f4de93c855b30fcbb 100644 (file)
@@ -26,12 +26,32 @@ Build the full U-Boot and a FIT image including the ATF
 
   > make CROSS_COMPILE=aarch64-unknown-elf- ARCH=arm u-boot.itb
 
-Write to a SD-card
-==================
+Flash the image
+===============
+
+Copy the SPL to offset 32k and the FIT image containing the payloads
+(U-Boot proper, ATF, devicetree) to offset 256k card.
+
+SD-Card
+-------
 
   > dd if=spl-3368.img of=/dev/sdb seek=64
   > dd if=u-boot.itb of=/dev/sdb seek=512
 
+eMMC
+----
+
+rkdeveloptool allows to flash the on-board eMMC via the USB OTG interface with
+help of the Rockchip loader binary.
+
+  > git clone https://github.com/rockchip-linux/rkdeveloptool
+  > cd rkdeveloptool
+  > autoreconf -i && && ./configure && make
+  > git clone https://github.com/rockchip-linux/rkbin.git
+  > ./rkdeveloptool db rkbin/rk33/rk3368_loader_v2.00.256.bin
+  > ./rkdeveloptool wl 64 ../spl.img
+  > ./rkdeveloptool wl 512 ../u-boot.itb
+
 
 If everything went according to plan, you should see the following
 output on UART0:
index 214281a32990e25c573c8d39ba79f1100f5e8972..f67dfb451ffd36745a5209a83459a8337134b75d 100644 (file)
@@ -55,18 +55,53 @@ Compile the U-Boot
 Package the image
 =================
 
-       > tools/mkimage -n rk3399 -T rksd -d spl/u-boot-spl.bin spl.img
-       > make CROSS_COMPILE=aarch64-linux-gnu- u-boot.itb
+Creating a SPL image for SD-Card/eMMC
+  > tools/mkimage -n rk3399 -T rksd -d spl/u-boot-spl.bin spl_mmc.img
+Creating a SPL image for SPI-NOR
+  > tools/mkimage -n rk3399 -T rkspi -d spl/u-boot-spl.bin spl_nor.img
+Create the FIT image containing U-Boot proper, ATF, M0 Firmware, devicetree
+  > make CROSS_COMPILE=aarch64-linux-gnu- u-boot.itb
 
 Flash the image
 ===============
 
-Copy the SPL to offset 32k and the FIT image containing the payloads
-(U-Boot proper, ATF, M0 Firmware, devicetree) to offset 256k on a SD
-card.
+Copy the SPL to offset 32k for SD/eMMC, offset 0 for NOR-Flash and the FIT
+image to offset 256k card.
 
-  > dd if=spl.img of=/dev/sdb seek=64
+SD-Card
+-------
+
+  > dd if=spl_mmc.img of=/dev/sdb seek=64
   > dd if=u-boot.itb of=/dev/sdb seek=512
 
-After powering up the board (with the inserted SD card), you should see
-a U-Boot console on UART0 (115200n8).
+eMMC
+----
+
+rkdeveloptool allows to flash the on-board eMMC via the USB OTG interface with
+help of the Rockchip loader binary.
+
+  > git clone https://github.com/rockchip-linux/rkdeveloptool
+  > cd rkdeveloptool
+  > autoreconf -i && ./configure && make
+  > git clone https://github.com/rockchip-linux/rkbin.git
+  > ./rkdeveloptool db rkbin/rk33/rk3399_loader_v1.08.106.bin
+  > ./rkdeveloptool wl 64 ../spl_mmc.img
+  > ./rkdeveloptool wl 512 ../u-boot.itb
+
+NOR-Flash
+---------
+
+Writing the SPI NOR Flash requires a running U-Boot. For the sake of simplicity
+we assume you have a SD-Card with a partition containing the required files
+ready.
+
+  > load mmc 1:1 ${kernel_addr_r} spl_nor.img
+  > sf probe
+  > sf erase 0 +$filesize
+  > sf write $kernel_addr_r 0 ${filesize}
+  > load mmc 1:1 ${kernel_addr_r} u-boot.itb
+  > sf erase 0x40000 +$filesize
+  > sf write $kernel_addr_r 0x40000 ${filesize}
+
+
+Reboot the system and you should see a U-Boot console on UART0 (115200n8).
index c6f8eed0c98821ab10941cfecc02ae994986bdae..45d56cd99eb26adb15edfff8572e9ee9998972ce 100644 (file)
@@ -107,7 +107,7 @@ static void setup_serial(void)
        u8 low[cpuid_length/2], high[cpuid_length/2];
        char cpuid_str[cpuid_length * 2 + 1];
        u64 serialno;
-       char serialno_str[16];
+       char serialno_str[17];
 
        /* retrieve the device */
        ret = uclass_get_device_by_driver(UCLASS_MISC,
index 7e7056cf71c5012150a1328a0cd8defee3fd6871..f79aefd40053dd9a096b0f7e7c4e2c6770f58e8f 100644 (file)
@@ -223,11 +223,39 @@ static const u32 beagle_x15_emif2_ddr3_ext_phy_ctrl_const_regs[] = {
        0x0
 };
 
+static const struct emif_regs am571x_emif1_ddr3_666mhz_emif_regs = {
+       .sdram_config_init              = 0x61863332,
+       .sdram_config                   = 0x61863332,
+       .sdram_config2                  = 0x08000000,
+       .ref_ctrl                       = 0x0000514d,
+       .ref_ctrl_final                 = 0x0000144a,
+       .sdram_tim1                     = 0xd333887c,
+       .sdram_tim2                     = 0x40b37fe3,
+       .sdram_tim3                     = 0x409f8ada,
+       .read_idle_ctrl                 = 0x00050000,
+       .zq_config                      = 0x5007190b,
+       .temp_alert_config              = 0x00000000,
+       .emif_ddr_phy_ctlr_1_init       = 0x0024400f,
+       .emif_ddr_phy_ctlr_1            = 0x0e24400f,
+       .emif_ddr_ext_phy_ctrl_1        = 0x10040100,
+       .emif_ddr_ext_phy_ctrl_2        = 0x00910091,
+       .emif_ddr_ext_phy_ctrl_3        = 0x00950095,
+       .emif_ddr_ext_phy_ctrl_4        = 0x009b009b,
+       .emif_ddr_ext_phy_ctrl_5        = 0x009e009e,
+       .emif_rd_wr_lvl_rmp_win         = 0x00000000,
+       .emif_rd_wr_lvl_rmp_ctl         = 0x80000000,
+       .emif_rd_wr_lvl_ctl             = 0x00000000,
+       .emif_rd_wr_exec_thresh         = 0x00000305
+};
+
 void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
 {
        switch (emif_nr) {
        case 1:
-               *regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
+               if (board_is_am571x_idk())
+                       *regs = &am571x_emif1_ddr3_666mhz_emif_regs;
+               else
+                       *regs = &beagle_x15_emif1_ddr3_532mhz_emif_regs;
                break;
        case 2:
                *regs = &beagle_x15_emif2_ddr3_532mhz_emif_regs;
@@ -513,7 +541,10 @@ void vcores_init(void)
 void hw_data_init(void)
 {
        *prcm = &dra7xx_prcm;
-       *dplls_data = &dra7xx_dplls;
+       if (is_dra72x())
+               *dplls_data = &dra72x_dplls;
+       else
+               *dplls_data = &dra7xx_dplls;
        *ctrl = &dra7xx_ctrl;
 }
 
@@ -1032,6 +1063,9 @@ int board_fit_config_name_match(const char *name)
                if (board_is_x15_revb1()) {
                        if (!strcmp(name, "am57xx-beagle-x15-revb1"))
                                return 0;
+               } else if (board_is_x15_revc()) {
+                       if (!strcmp(name, "am57xx-beagle-x15-revc"))
+                               return 0;
                } else if (!strcmp(name, "am57xx-beagle-x15")) {
                        return 0;
                }
index 93d3d0b54ebab0c9b6cd63fa1cf0674528f939d8..97aae016e14cd65cf9c50cbe6ee2bcde0168958f 100644 (file)
@@ -34,6 +34,7 @@
 #include "mux_data.h"
 #include "../common/board_detect.h"
 
+#define board_is_dra76x_evm()          board_ti_is("DRA76/7x")
 #define board_is_dra74x_evm()          board_ti_is("5777xCPU")
 #define board_is_dra72x_evm()          board_ti_is("DRA72x-T")
 #define board_is_dra71x_evm()          board_ti_is("DRA79x,D")
@@ -209,6 +210,56 @@ const struct emif_regs emif2_ddr3_532_mhz_1cs_2G = {
        .emif_rd_wr_exec_thresh         = 0x00000305
 };
 
+const struct emif_regs emif_1_regs_ddr3_666_mhz_1cs_dra76 = {
+       .sdram_config_init              = 0x61862B32,
+       .sdram_config                   = 0x61862B32,
+       .sdram_config2                  = 0x00000000,
+       .ref_ctrl                       = 0x0000514C,
+       .ref_ctrl_final                 = 0x0000144A,
+       .sdram_tim1                     = 0xD113783C,
+       .sdram_tim2                     = 0x30B47FE3,
+       .sdram_tim3                     = 0x409F8AD8,
+       .read_idle_ctrl                 = 0x00050000,
+       .zq_config                      = 0x5007190B,
+       .temp_alert_config              = 0x00000000,
+       .emif_ddr_phy_ctlr_1_init       = 0x0824400D,
+       .emif_ddr_phy_ctlr_1            = 0x0E24400D,
+       .emif_ddr_ext_phy_ctrl_1        = 0x04040100,
+       .emif_ddr_ext_phy_ctrl_2        = 0x006B009F,
+       .emif_ddr_ext_phy_ctrl_3        = 0x006B00A2,
+       .emif_ddr_ext_phy_ctrl_4        = 0x006B00A8,
+       .emif_ddr_ext_phy_ctrl_5        = 0x006B00A8,
+       .emif_rd_wr_lvl_rmp_win         = 0x00000000,
+       .emif_rd_wr_lvl_rmp_ctl         = 0x80000000,
+       .emif_rd_wr_lvl_ctl             = 0x00000000,
+       .emif_rd_wr_exec_thresh         = 0x00000305
+};
+
+const struct emif_regs emif_2_regs_ddr3_666_mhz_1cs_dra76 = {
+       .sdram_config_init              = 0x61862B32,
+       .sdram_config                   = 0x61862B32,
+       .sdram_config2                  = 0x00000000,
+       .ref_ctrl                       = 0x0000514C,
+       .ref_ctrl_final                 = 0x0000144A,
+       .sdram_tim1                     = 0xD113781C,
+       .sdram_tim2                     = 0x30B47FE3,
+       .sdram_tim3                     = 0x409F8AD8,
+       .read_idle_ctrl                 = 0x00050000,
+       .zq_config                      = 0x5007190B,
+       .temp_alert_config              = 0x00000000,
+       .emif_ddr_phy_ctlr_1_init       = 0x0824400D,
+       .emif_ddr_phy_ctlr_1            = 0x0E24400D,
+       .emif_ddr_ext_phy_ctrl_1        = 0x04040100,
+       .emif_ddr_ext_phy_ctrl_2        = 0x006B009F,
+       .emif_ddr_ext_phy_ctrl_3        = 0x006B00A2,
+       .emif_ddr_ext_phy_ctrl_4        = 0x006B00A8,
+       .emif_ddr_ext_phy_ctrl_5        = 0x006B00A8,
+       .emif_rd_wr_lvl_rmp_win         = 0x00000000,
+       .emif_rd_wr_lvl_rmp_ctl         = 0x80000000,
+       .emif_rd_wr_lvl_ctl             = 0x00000000,
+       .emif_rd_wr_exec_thresh         = 0x00000305
+};
+
 void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
 {
        u64 ram_size;
@@ -234,8 +285,15 @@ void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)
                        break;
                }
                break;
+       case DRA762_ES1_0:
+               if (emif_nr == 1)
+                       *regs = &emif_1_regs_ddr3_666_mhz_1cs_dra76;
+               else
+                       *regs = &emif_2_regs_ddr3_666_mhz_1cs_dra76;
+               break;
        case DRA722_ES1_0:
        case DRA722_ES2_0:
+       case DRA722_ES2_1:
                if (ram_size < CONFIG_MAX_MEM_MAPPED)
                        *regs = &emif_1_regs_ddr3_666_mhz_1cs_dra_es1;
                else
@@ -289,6 +347,7 @@ void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
        ram_size = board_ti_get_emif_size();
 
        switch (omap_revision()) {
+       case DRA762_ES1_0:
        case DRA752_ES1_0:
        case DRA752_ES1_1:
        case DRA752_ES2_0:
@@ -299,6 +358,7 @@ void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
                break;
        case DRA722_ES1_0:
        case DRA722_ES2_0:
+       case DRA722_ES2_1:
        default:
                if (ram_size < CONFIG_MAX_MEM_MAPPED)
                        *dmm_lisa_regs = &lisa_map_2G_x_2;
@@ -356,6 +416,54 @@ struct vcores_data dra752_volts = {
        .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK,
 };
 
+struct vcores_data dra76x_volts = {
+       .mpu.value[OPP_NOM]     = VDD_MPU_DRA7_NOM,
+       .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
+       .mpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
+       .mpu.addr       = LP87565_REG_ADDR_BUCK01,
+       .mpu.pmic       = &lp87565,
+       .mpu.abb_tx_done_mask = OMAP_ABB_MPU_TXDONE_MASK,
+
+       .eve.value[OPP_NOM]     = VDD_EVE_DRA7_NOM,
+       .eve.value[OPP_OD]      = VDD_EVE_DRA7_OD,
+       .eve.value[OPP_HIGH]    = VDD_EVE_DRA7_HIGH,
+       .eve.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_DSPEVE_NOM,
+       .eve.efuse.reg[OPP_OD]  = STD_FUSE_OPP_VMIN_DSPEVE_OD,
+       .eve.efuse.reg[OPP_HIGH]        = STD_FUSE_OPP_VMIN_DSPEVE_HIGH,
+       .eve.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
+       .eve.addr       = TPS65917_REG_ADDR_SMPS1,
+       .eve.pmic       = &tps659038,
+       .eve.abb_tx_done_mask = OMAP_ABB_EVE_TXDONE_MASK,
+
+       .gpu.value[OPP_NOM]     = VDD_GPU_DRA7_NOM,
+       .gpu.value[OPP_OD]      = VDD_GPU_DRA7_OD,
+       .gpu.value[OPP_HIGH]    = VDD_GPU_DRA7_HIGH,
+       .gpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_GPU_NOM,
+       .gpu.efuse.reg[OPP_OD]  = STD_FUSE_OPP_VMIN_GPU_OD,
+       .gpu.efuse.reg[OPP_HIGH]        = STD_FUSE_OPP_VMIN_GPU_HIGH,
+       .gpu.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
+       .gpu.addr       = LP87565_REG_ADDR_BUCK23,
+       .gpu.pmic       = &lp87565,
+       .gpu.abb_tx_done_mask = OMAP_ABB_GPU_TXDONE_MASK,
+
+       .core.value[OPP_NOM]    = VDD_CORE_DRA7_NOM,
+       .core.efuse.reg[OPP_NOM]        = STD_FUSE_OPP_VMIN_CORE_NOM,
+       .core.efuse.reg_bits = DRA752_EFUSE_REGBITS,
+       .core.addr      = TPS65917_REG_ADDR_SMPS3,
+       .core.pmic      = &tps659038,
+
+       .iva.value[OPP_NOM]     = VDD_IVA_DRA7_NOM,
+       .iva.value[OPP_OD]      = VDD_IVA_DRA7_OD,
+       .iva.value[OPP_HIGH]    = VDD_IVA_DRA7_HIGH,
+       .iva.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_IVA_NOM,
+       .iva.efuse.reg[OPP_OD]  = STD_FUSE_OPP_VMIN_IVA_OD,
+       .iva.efuse.reg[OPP_HIGH]        = STD_FUSE_OPP_VMIN_IVA_HIGH,
+       .iva.efuse.reg_bits     = DRA752_EFUSE_REGBITS,
+       .iva.addr       = TPS65917_REG_ADDR_SMPS4,
+       .iva.pmic       = &tps659038,
+       .iva.abb_tx_done_mask = OMAP_ABB_IVA_TXDONE_MASK,
+};
+
 struct vcores_data dra722_volts = {
        .mpu.value[OPP_NOM]     = VDD_MPU_DRA7_NOM,
        .mpu.efuse.reg[OPP_NOM] = STD_FUSE_OPP_VMIN_MPU_NOM,
@@ -547,6 +655,8 @@ int board_late_init(void)
                        name = "dra71x";
                else
                        name = "dra72x";
+       } else if (is_dra76x()) {
+               name = "dra76x";
        } else {
                name = "dra7xx";
        }
@@ -595,6 +705,8 @@ void do_board_detect(void)
                bname = "DRA72x EVM";
        } else if (board_is_dra71x_evm()) {
                bname = "DRA71x EVM";
+       } else if (board_is_dra76x_evm()) {
+               bname = "DRA76x EVM";
        } else {
                /* If EEPROM is not populated */
                if (is_dra72x())
@@ -617,6 +729,8 @@ void vcores_init(void)
                *omap_vcores = &dra722_volts;
        } else if (board_is_dra71x_evm()) {
                *omap_vcores = &dra718_volts;
+       } else if (board_is_dra76x_evm()) {
+               *omap_vcores = &dra76x_volts;
        } else {
                /* If EEPROM is not populated */
                if (is_dra72x())
@@ -643,6 +757,7 @@ void recalibrate_iodelay(void)
        switch (omap_revision()) {
        case DRA722_ES1_0:
        case DRA722_ES2_0:
+       case DRA722_ES2_1:
                pads = dra72x_core_padconf_array_common;
                npads = ARRAY_SIZE(dra72x_core_padconf_array_common);
                if (board_is_dra71x_evm()) {
@@ -671,6 +786,12 @@ void recalibrate_iodelay(void)
                iodelay = dra742_es1_1_iodelay_cfg_array;
                niodelays = ARRAY_SIZE(dra742_es1_1_iodelay_cfg_array);
                break;
+       case DRA762_ES1_0:
+               pads = dra76x_core_padconf_array;
+               npads = ARRAY_SIZE(dra76x_core_padconf_array);
+               iodelay = dra76x_es1_0_iodelay_cfg_array;
+               niodelays = ARRAY_SIZE(dra76x_es1_0_iodelay_cfg_array);
+               break;
        default:
        case DRA752_ES2_0:
                pads = dra74x_core_padconf_array;
@@ -710,6 +831,21 @@ int board_mmc_init(bd_t *bis)
        omap_mmc_init(1, 0, 0, -1, -1);
        return 0;
 }
+
+void board_mmc_poweron_ldo(uint voltage)
+{
+       if (board_is_dra71x_evm()) {
+               if (voltage == LDO_VOLT_3V0)
+                       voltage = 0x19;
+               else if (voltage == LDO_VOLT_1V8)
+                       voltage = 0xa;
+               lp873x_mmc1_poweron_ldo(voltage);
+       } else if (board_is_dra76x_evm()) {
+               palmas_mmc1_poweron_ldo(LDO4_VOLTAGE, LDO4_CTRL, voltage);
+       } else {
+               palmas_mmc1_poweron_ldo(LDO1_VOLTAGE, LDO1_CTRL, voltage);
+       }
+}
 #endif
 
 #ifdef CONFIG_USB_DWC3
@@ -941,8 +1077,8 @@ static inline void vtt_regulator_enable(void)
        if (omap_hw_init_context() == OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL)
                return;
 
-       /* Do not enable VTT for DRA722 */
-       if (is_dra72x())
+       /* Do not enable VTT for DRA722 or DRA76x */
+       if (is_dra72x() || is_dra76x())
                return;
 
        /*
@@ -982,7 +1118,9 @@ int board_fit_config_name_match(const char *name)
                } else if (!strcmp(name, "dra72-evm")) {
                        return 0;
                }
-       } else if (!is_dra72x() && !strcmp(name, "dra7-evm")) {
+       } else if (is_dra76x() && !strcmp(name, "dra76-evm")) {
+               return 0;
+       } else if (!is_dra72x() && !is_dra76x() && !strcmp(name, "dra7-evm")) {
                return 0;
        }
 
index 2cc4be31b2a788b47bbf7ee1d854686f72f6cea0..3c3a19a0e1c2f9403af307943a2544d0d3f4ab8c 100644 (file)
@@ -698,6 +698,194 @@ const struct pad_conf_entry dra74x_core_padconf_array[] = {
        {WAKEUP2, (M14)},               /* Wakeup2.gpio1_2 */
 };
 
+const struct pad_conf_entry dra76x_core_padconf_array[] = {
+       {GPMC_AD0, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad0.vout3_d0 */
+       {GPMC_AD1, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad1.vout3_d1 */
+       {GPMC_AD2, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad2.vout3_d2 */
+       {GPMC_AD3, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad3.vout3_d3 */
+       {GPMC_AD4, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad4.vout3_d4 */
+       {GPMC_AD5, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad5.vout3_d5 */
+       {GPMC_AD6, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad6.vout3_d6 */
+       {GPMC_AD7, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad7.vout3_d7 */
+       {GPMC_AD8, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad8.vout3_d8 */
+       {GPMC_AD9, (M3 | PIN_INPUT | MANUAL_MODE)},     /* gpmc_ad9.vout3_d9 */
+       {GPMC_AD10, (M3 | PIN_INPUT | MANUAL_MODE)},    /* gpmc_ad10.vout3_d10 */
+       {GPMC_AD11, (M3 | PIN_INPUT | MANUAL_MODE)},    /* gpmc_ad11.vout3_d11 */
+       {GPMC_AD12, (M3 | PIN_INPUT | MANUAL_MODE)},    /* gpmc_ad12.vout3_d12 */
+       {GPMC_AD13, (M3 | PIN_INPUT | MANUAL_MODE)},    /* gpmc_ad13.vout3_d13 */
+       {GPMC_AD14, (M3 | PIN_INPUT | MANUAL_MODE)},    /* gpmc_ad14.vout3_d14 */
+       {GPMC_AD15, (M3 | PIN_INPUT | MANUAL_MODE)},    /* gpmc_ad15.vout3_d15 */
+       {GPMC_A0, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a0.vout3_d16 */
+       {GPMC_A1, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a1.vout3_d17 */
+       {GPMC_A2, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a2.vout3_d18 */
+       {GPMC_A3, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a3.vout3_d19 */
+       {GPMC_A4, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a4.vout3_d20 */
+       {GPMC_A5, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a5.vout3_d21 */
+       {GPMC_A6, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a6.vout3_d22 */
+       {GPMC_A7, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a7.vout3_d23 */
+       {GPMC_A8, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a8.vout3_hsync */
+       {GPMC_A9, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},     /* gpmc_a9.vout3_vsync */
+       {GPMC_A10, (M3 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* gpmc_a10.vout3_de */
+       {GPMC_A11, (M14 | PIN_INPUT_PULLUP)},   /* gpmc_a11.gpio2_1 */
+       {GPMC_A12, (M14 | PIN_INPUT_PULLUP)},   /* gpmc_a12.gpio2_2 */
+       {GPMC_A13, (M1 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* gpmc_a13.qspi1_rtclk */
+       {GPMC_A14, (M1 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* gpmc_a14.qspi1_d3 */
+       {GPMC_A15, (M1 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* gpmc_a15.qspi1_d2 */
+       {GPMC_A16, (M1 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* gpmc_a16.qspi1_d0 */
+       {GPMC_A17, (M1 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* gpmc_a17.qspi1_d1 */
+       {GPMC_A18, (M1 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* gpmc_a18.qspi1_sclk */
+       {GPMC_A19, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a19.mmc2_dat4 */
+       {GPMC_A20, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a20.mmc2_dat5 */
+       {GPMC_A21, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a21.mmc2_dat6 */
+       {GPMC_A22, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a22.mmc2_dat7 */
+       {GPMC_A23, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a23.mmc2_clk */
+       {GPMC_A24, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a24.mmc2_dat0 */
+       {GPMC_A25, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a25.mmc2_dat1 */
+       {GPMC_A26, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a26.mmc2_dat2 */
+       {GPMC_A27, (M1 | PIN_INPUT_PULLDOWN)},  /* gpmc_a27.mmc2_dat3 */
+       {GPMC_CS1, (M1 | PIN_INPUT_PULLUP)},    /* gpmc_cs1.mmc2_cmd */
+       {GPMC_CS0, (M0 | PIN_INPUT_PULLUP)},    /* gpmc_cs0.gpmc_cs0 */
+       {GPMC_CS2, (M1 | PIN_INPUT_PULLUP | MANUAL_MODE)},      /* gpmc_cs2.qspi1_cs0 */
+       {GPMC_CS3, (M3 | PIN_INPUT_PULLUP | MANUAL_MODE)},      /* gpmc_cs3.vout3_clk */
+       {GPMC_ADVN_ALE, (M0 | PIN_INPUT_PULLUP)},       /* gpmc_advn_ale.gpmc_advn_ale */
+       {GPMC_OEN_REN, (M0 | PIN_INPUT_PULLUP)},        /* gpmc_oen_ren.gpmc_oen_ren */
+       {GPMC_WEN, (M0 | PIN_INPUT_PULLUP)},    /* gpmc_wen.gpmc_wen */
+       {GPMC_BEN0, (M0 | PIN_INPUT_PULLUP)},   /* gpmc_ben0.gpmc_ben0 */
+       {GPMC_WAIT0, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},    /* gpmc_wait0.gpmc_wait0 */
+       {VIN1A_FLD0, (M14 | PIN_INPUT_PULLUP)}, /* vin1a_fld0.gpio3_1 */
+       {VIN2A_CLK0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},  /* vin2a_clk0.vin2a_clk0 */
+       {VIN2A_DE0, (M15 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},  /* vin2a_de0.Driveroff */
+       {VIN2A_FLD0, (M14 | PIN_INPUT_PULLDOWN)},       /* vin2a_fld0.gpio3_30 */
+       {VIN2A_HSYNC0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},        /* vin2a_hsync0.vin2a_hsync0 */
+       {VIN2A_VSYNC0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},        /* vin2a_vsync0.vin2a_vsync0 */
+       {VIN2A_D0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d0.vin2a_d0 */
+       {VIN2A_D1, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d1.vin2a_d1 */
+       {VIN2A_D2, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d2.vin2a_d2 */
+       {VIN2A_D3, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d3.vin2a_d3 */
+       {VIN2A_D4, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d4.vin2a_d4 */
+       {VIN2A_D5, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d5.vin2a_d5 */
+       {VIN2A_D6, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d6.vin2a_d6 */
+       {VIN2A_D7, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d7.vin2a_d7 */
+       {VIN2A_D8, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d8.vin2a_d8 */
+       {VIN2A_D9, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vin2a_d9.vin2a_d9 */
+       {VIN2A_D10, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vin2a_d10.vin2a_d10 */
+       {VIN2A_D11, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vin2a_d11.vin2a_d11 */
+       {VIN2A_D12, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d12.rgmii1_txc */
+       {VIN2A_D13, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d13.rgmii1_txctl */
+       {VIN2A_D14, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d14.rgmii1_txd3 */
+       {VIN2A_D15, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d15.rgmii1_txd2 */
+       {VIN2A_D16, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d16.rgmii1_txd1 */
+       {VIN2A_D17, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d17.rgmii1_txd0 */
+       {VIN2A_D18, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d18.rgmii1_rxc */
+       {VIN2A_D19, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d19.rgmii1_rxctl */
+       {VIN2A_D20, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d20.rgmii1_rxd3 */
+       {VIN2A_D21, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d21.rgmii1_rxd2 */
+       {VIN2A_D22, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d22.rgmii1_rxd1 */
+       {VIN2A_D23, (M3 | PIN_INPUT | MANUAL_MODE)},    /* vin2a_d23.rgmii1_rxd0 */
+       {VOUT1_CLK, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_clk.vout1_clk */
+       {VOUT1_DE, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_de.vout1_de */
+       {VOUT1_FLD, (M14 | PIN_INPUT_PULLUP)},  /* vout1_fld.gpio4_21 */
+       {VOUT1_HSYNC, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vout1_hsync.vout1_hsync */
+       {VOUT1_VSYNC, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)}, /* vout1_vsync.vout1_vsync */
+       {VOUT1_D0, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d0.vout1_d0 */
+       {VOUT1_D1, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d1.vout1_d1 */
+       {VOUT1_D2, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d2.vout1_d2 */
+       {VOUT1_D3, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d3.vout1_d3 */
+       {VOUT1_D4, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d4.vout1_d4 */
+       {VOUT1_D5, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d5.vout1_d5 */
+       {VOUT1_D6, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d6.vout1_d6 */
+       {VOUT1_D7, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d7.vout1_d7 */
+       {VOUT1_D8, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d8.vout1_d8 */
+       {VOUT1_D9, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},    /* vout1_d9.vout1_d9 */
+       {VOUT1_D10, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d10.vout1_d10 */
+       {VOUT1_D11, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d11.vout1_d11 */
+       {VOUT1_D12, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d12.vout1_d12 */
+       {VOUT1_D13, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d13.vout1_d13 */
+       {VOUT1_D14, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d14.vout1_d14 */
+       {VOUT1_D15, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d15.vout1_d15 */
+       {VOUT1_D16, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d16.vout1_d16 */
+       {VOUT1_D17, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d17.vout1_d17 */
+       {VOUT1_D18, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d18.vout1_d18 */
+       {VOUT1_D19, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d19.vout1_d19 */
+       {VOUT1_D20, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d20.vout1_d20 */
+       {VOUT1_D21, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d21.vout1_d21 */
+       {VOUT1_D22, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d22.vout1_d22 */
+       {VOUT1_D23, (M0 | PIN_INPUT_PULLDOWN | MANUAL_MODE)},   /* vout1_d23.vout1_d23 */
+       {MDIO_MCLK, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},     /* mdio_mclk.mdio_mclk */
+       {MDIO_D, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},        /* mdio_d.mdio_d */
+       {RGMII0_TXC, (M0 | PIN_INPUT | MANUAL_MODE)},   /* rgmii0_txc.rgmii0_txc */
+       {RGMII0_TXCTL, (M0 | PIN_INPUT | MANUAL_MODE)}, /* rgmii0_txctl.rgmii0_txctl */
+       {RGMII0_TXD3, (M0 | PIN_INPUT | MANUAL_MODE)},  /* rgmii0_txd3.rgmii0_txd3 */
+       {RGMII0_TXD2, (M0 | PIN_INPUT | MANUAL_MODE)},  /* rgmii0_txd2.rgmii0_txd2 */
+       {RGMII0_TXD1, (M0 | PIN_INPUT | MANUAL_MODE)},  /* rgmii0_txd1.rgmii0_txd1 */
+       {RGMII0_TXD0, (M0 | PIN_INPUT | MANUAL_MODE)},  /* rgmii0_txd0.rgmii0_txd0 */
+       {RGMII0_RXC, (M0 | PIN_INPUT | MANUAL_MODE)},   /* rgmii0_rxc.rgmii0_rxc */
+       {RGMII0_RXCTL, (M0 | PIN_INPUT | MANUAL_MODE)}, /* rgmii0_rxctl.rgmii0_rxctl */
+       {RGMII0_RXD3, (M0 | PIN_INPUT | MANUAL_MODE)},  /* rgmii0_rxd3.rgmii0_rxd3 */
+       {RGMII0_RXD2, (M0 | PIN_INPUT | MANUAL_MODE)},  /* rgmii0_rxd2.rgmii0_rxd2 */
+       {RGMII0_RXD1, (M0 | PIN_INPUT | MANUAL_MODE)},  /* rgmii0_rxd1.rgmii0_rxd1 */
+       {RGMII0_RXD0, (M0 | PIN_INPUT | MANUAL_MODE)},  /* rgmii0_rxd0.rgmii0_rxd0 */
+       {USB1_DRVVBUS, (M0 | PIN_INPUT_SLEW)},  /* usb1_drvvbus.usb1_drvvbus */
+       {USB2_DRVVBUS, (M0 | PIN_INPUT_SLEW)},  /* usb2_drvvbus.usb2_drvvbus */
+       {GPIO6_14, (M9 | PIN_INPUT_PULLUP)},    /* gpio6_14.i2c3_sda */
+       {GPIO6_15, (M9 | PIN_INPUT_PULLUP)},    /* gpio6_15.i2c3_scl */
+       {GPIO6_16, (M0 | PIN_INPUT_PULLUP)},    /* gpio6_16.gpio6_16 */
+       {XREF_CLK2, (M5 | PIN_INPUT_PULLDOWN)}, /* xref_clk2.atl_clk2 */
+       {MCASP1_ACLKX, (M14 | 0x00070000)},     /* mcasp1_aclkx.gpio7_31 */
+       {MCASP1_FSX, (M14 | PIN_INPUT | SLEWCONTROL)},  /* mcasp1_fsx.gpio7_30 */
+       {MCASP1_AXR0, (M10 | PIN_INPUT_PULLUP | SLEWCONTROL)},  /* mcasp1_axr0.i2c5_sda */
+       {MCASP1_AXR1, (M10 | 0x000f0000)},      /* mcasp1_axr1.i2c5_scl */
+       {MCASP1_AXR2, (M14 | PIN_INPUT_PULLDOWN)},      /* mcasp1_axr2.gpio5_4 */
+       {MCASP1_AXR3, (M14 | PIN_INPUT_PULLDOWN)},      /* mcasp1_axr3.gpio5_5 */
+       {MCASP1_AXR4, (M14 | PIN_INPUT_PULLDOWN)},      /* mcasp1_axr4.gpio5_6 */
+       {MCASP1_AXR5, (M14 | PIN_INPUT_PULLDOWN)},      /* mcasp1_axr5.gpio5_7 */
+       {MCASP1_AXR6, (M14 | PIN_INPUT_PULLDOWN)},      /* mcasp1_axr6.gpio5_8 */
+       {MCASP1_AXR7, (M14 | PIN_INPUT_PULLDOWN)},      /* mcasp1_axr7.gpio5_9 */
+       {MCASP1_AXR12, (M1 | PIN_INPUT_SLEW | VIRTUAL_MODE10)}, /* mcasp1_axr12.mcasp7_axr0 */
+       {MCASP1_AXR13, (M1 | PIN_INPUT_SLEW)},  /* mcasp1_axr13.mcasp7_axr1 */
+       {MCASP1_AXR14, (M1 | PIN_INPUT_SLEW | VIRTUAL_MODE10)}, /* mcasp1_axr14.mcasp7_aclkx */
+       {MCASP1_AXR15, (M1 | PIN_INPUT_SLEW | VIRTUAL_MODE10)}, /* mcasp1_axr15.mcasp7_fsx */
+       {MCASP2_ACLKR, (M15 | PIN_INPUT_PULLUP)},       /* mcasp2_aclkr.Driveroff */
+       {MCASP3_ACLKX, (M0 | PIN_INPUT_PULLDOWN)},      /* mcasp3_aclkx.mcasp3_aclkx */
+       {MCASP3_FSX, (M0 | PIN_INPUT_SLEW)},    /* mcasp3_fsx.mcasp3_fsx */
+       {MCASP3_AXR0, (M0 | PIN_INPUT_SLEW)},   /* mcasp3_axr0.mcasp3_axr0 */
+       {MCASP3_AXR1, (M0 | PIN_INPUT_SLEW | VIRTUAL_MODE6)},   /* mcasp3_axr1.mcasp3_axr1 */
+       {MMC1_CLK, (M0 | PIN_INPUT_PULLUP)},    /* mmc1_clk.mmc1_clk */
+       {MMC1_CMD, (M0 | PIN_INPUT_PULLUP)},    /* mmc1_cmd.mmc1_cmd */
+       {MMC1_DAT0, (M0 | PIN_INPUT_PULLUP)},   /* mmc1_dat0.mmc1_dat0 */
+       {MMC1_DAT1, (M0 | PIN_INPUT_PULLUP)},   /* mmc1_dat1.mmc1_dat1 */
+       {MMC1_DAT2, (M0 | PIN_INPUT_PULLUP)},   /* mmc1_dat2.mmc1_dat2 */
+       {MMC1_DAT3, (M0 | PIN_INPUT_PULLUP)},   /* mmc1_dat3.mmc1_dat3 */
+       {MMC1_SDCD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},     /* mmc1_sdcd.mmc1_sdcd */
+       {MMC1_SDWP, (M14 | PIN_INPUT_SLEW)},    /* mmc1_sdwp.gpio6_28 */
+       {SPI1_SCLK, (M0 | PIN_INPUT_PULLDOWN)}, /* spi1_sclk.spi1_sclk */
+       {SPI1_D1, (M0 | PIN_INPUT_PULLDOWN)},   /* spi1_d1.spi1_d1 */
+       {SPI1_D0, (M0 | PIN_INPUT_PULLDOWN)},   /* spi1_d0.spi1_d0 */
+       {SPI1_CS0, (M0 | PIN_INPUT_PULLUP)},    /* spi1_cs0.spi1_cs0 */
+       {SPI1_CS2, (M6 | 0x000f0000)},  /* spi1_cs2.hdmi1_hpd */
+       {SPI1_CS3, (M6 | 0x000f0000)},  /* spi1_cs3.hdmi1_cec */
+       {SPI2_SCLK, (M1 | PIN_INPUT_PULLDOWN)}, /* spi2_sclk.uart3_rxd */
+       {SPI2_D1, (M1 | PIN_INPUT_SLEW)},       /* spi2_d1.uart3_txd */
+       {SPI2_D0, (M1 | PIN_INPUT_SLEW)},       /* spi2_d0.uart3_ctsn */
+       {SPI2_CS0, (M1 | PIN_INPUT_PULLUP | SLEWCONTROL)},      /* spi2_cs0.uart3_rtsn */
+       {DCAN1_TX, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},      /* dcan1_tx.dcan1_tx */
+       {DCAN1_RX, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},      /* dcan1_rx.dcan1_rx */
+       {UART1_RXD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},     /* uart1_rxd.uart1_rxd */
+       {UART1_TXD, (M0 | PIN_INPUT_PULLUP | SLEWCONTROL)},     /* uart1_txd.uart1_txd */
+       {UART1_CTSN, (M3 | PIN_INPUT_PULLUP)},  /* uart1_ctsn.mmc4_clk */
+       {UART1_RTSN, (M3 | PIN_INPUT_PULLUP)},  /* uart1_rtsn.mmc4_cmd */
+       {UART2_RXD, (M3 | PIN_INPUT_PULLUP)},   /* N/A.mmc4_dat0 */
+       {UART2_TXD, (M3 | PIN_INPUT_PULLUP)},   /* uart2_txd.mmc4_dat1 */
+       {UART2_CTSN, (M3 | PIN_INPUT_PULLUP)},  /* uart2_ctsn.mmc4_dat2 */
+       {UART2_RTSN, (M3 | PIN_INPUT_PULLUP)},  /* uart2_rtsn.mmc4_dat3 */
+       {I2C2_SDA, (M1 | PIN_INPUT_PULLUP)},    /* i2c2_sda.hdmi1_ddc_scl */
+       {I2C2_SCL, (M1 | PIN_INPUT_PULLUP)},    /* i2c2_scl.hdmi1_ddc_sda */
+       {WAKEUP0, (M14 | PIN_OUTPUT)},  /* N/A.gpio1_0 */
+       {WAKEUP1, (M14 | PIN_OUTPUT)},  /* N/A.gpio1_1 */
+       {WAKEUP2, (M1 | PIN_OUTPUT)},   /* N/A.sys_nirq2 */
+       {WAKEUP3, (M1 | PIN_OUTPUT)},   /* N/A.sys_nirq1 */
+};
+
 #ifdef CONFIG_IODELAY_RECALIBRATION
 const struct iodelay_cfg_entry dra742_es1_1_iodelay_cfg_array[] = {
        {0x06F0, 480, 0},       /* CFG_RGMII0_RXC_IN */
@@ -826,6 +1014,112 @@ const struct iodelay_cfg_entry dra742_es2_0_iodelay_cfg_array[] = {
        {0x0188, 590, 0},       /* CFG_GPMC_A18_OUT */
        {0x0374, 0, 0},         /* CFG_GPMC_CS2_OUT */
 };
+
+const struct iodelay_cfg_entry dra76x_es1_0_iodelay_cfg_array[] = {
+       {0x011C, 787, 0},       /* CFG_GPMC_A0_OUT */
+       {0x0128, 1181, 0},      /* CFG_GPMC_A10_OUT */
+       {0x0144, 0, 0}, /* CFG_GPMC_A13_IN */
+       {0x0150, 2149, 1052},   /* CFG_GPMC_A14_IN */
+       {0x015C, 2121, 997},    /* CFG_GPMC_A15_IN */
+       {0x0168, 2159, 1134},   /* CFG_GPMC_A16_IN */
+       {0x0170, 0, 0}, /* CFG_GPMC_A16_OUT */
+       {0x0174, 2135, 1085},   /* CFG_GPMC_A17_IN */
+       {0x0188, 0, 0}, /* CFG_GPMC_A18_OUT */
+       {0x01A0, 592, 0},       /* CFG_GPMC_A1_OUT */
+       {0x020C, 641, 0},       /* CFG_GPMC_A2_OUT */
+       {0x0218, 1481, 0},      /* CFG_GPMC_A3_OUT */
+       {0x0224, 1775, 0},      /* CFG_GPMC_A4_OUT */
+       {0x0230, 785, 0},       /* CFG_GPMC_A5_OUT */
+       {0x023C, 848, 0},       /* CFG_GPMC_A6_OUT */
+       {0x0248, 851, 0},       /* CFG_GPMC_A7_OUT */
+       {0x0254, 1783, 0},      /* CFG_GPMC_A8_OUT */
+       {0x0260, 951, 0},       /* CFG_GPMC_A9_OUT */
+       {0x026C, 1091, 0},      /* CFG_GPMC_AD0_OUT */
+       {0x0278, 1027, 0},      /* CFG_GPMC_AD10_OUT */
+       {0x0284, 824, 0},       /* CFG_GPMC_AD11_OUT */
+       {0x0290, 1196, 0},      /* CFG_GPMC_AD12_OUT */
+       {0x029C, 754, 0},       /* CFG_GPMC_AD13_OUT */
+       {0x02A8, 665, 0},       /* CFG_GPMC_AD14_OUT */
+       {0x02B4, 1027, 0},      /* CFG_GPMC_AD15_OUT */
+       {0x02C0, 937, 0},       /* CFG_GPMC_AD1_OUT */
+       {0x02CC, 1168, 0},      /* CFG_GPMC_AD2_OUT */
+       {0x02D8, 872, 0},       /* CFG_GPMC_AD3_OUT */
+       {0x02E4, 1092, 0},      /* CFG_GPMC_AD4_OUT */
+       {0x02F0, 576, 0},       /* CFG_GPMC_AD5_OUT */
+       {0x02FC, 1113, 0},      /* CFG_GPMC_AD6_OUT */
+       {0x0308, 943, 0},       /* CFG_GPMC_AD7_OUT */
+       {0x0314, 0, 0}, /* CFG_GPMC_AD8_OUT */
+       {0x0320, 0, 0}, /* CFG_GPMC_AD9_OUT */
+       {0x0374, 0, 0}, /* CFG_GPMC_CS2_OUT */
+       {0x0380, 1801, 948},    /* CFG_GPMC_CS3_OUT */
+       {0x06F0, 451, 0},       /* CFG_RGMII0_RXC_IN */
+       {0x06FC, 127, 1571},    /* CFG_RGMII0_RXCTL_IN */
+       {0x0708, 165, 1178},    /* CFG_RGMII0_RXD0_IN */
+       {0x0714, 136, 1302},    /* CFG_RGMII0_RXD1_IN */
+       {0x0720, 0, 1520},      /* CFG_RGMII0_RXD2_IN */
+       {0x072C, 28, 1690},     /* CFG_RGMII0_RXD3_IN */
+       {0x0740, 121, 0},       /* CFG_RGMII0_TXC_OUT */
+       {0x074C, 60, 0},        /* CFG_RGMII0_TXCTL_OUT */
+       {0x0758, 153, 0},       /* CFG_RGMII0_TXD0_OUT */
+       {0x0764, 35, 0},        /* CFG_RGMII0_TXD1_OUT */
+       {0x0770, 0, 0}, /* CFG_RGMII0_TXD2_OUT */
+       {0x077C, 172, 0},       /* CFG_RGMII0_TXD3_OUT */
+       {0x0A38, 0, 0}, /* CFG_VIN2A_CLK0_IN */
+       {0x0A44, 2180, 0},      /* CFG_VIN2A_D0_IN */
+       {0x0A50, 2297, 110},    /* CFG_VIN2A_D10_IN */
+       {0x0A5C, 1938, 0},      /* CFG_VIN2A_D11_IN */
+       {0x0A70, 147, 0},       /* CFG_VIN2A_D12_OUT */
+       {0x0A7C, 110, 0},       /* CFG_VIN2A_D13_OUT */
+       {0x0A88, 18, 0},        /* CFG_VIN2A_D14_OUT */
+       {0x0A94, 82, 0},        /* CFG_VIN2A_D15_OUT */
+       {0x0AA0, 33, 0},        /* CFG_VIN2A_D16_OUT */
+       {0x0AAC, 0, 0}, /* CFG_VIN2A_D17_OUT */
+       {0x0AB0, 417, 0},       /* CFG_VIN2A_D18_IN */
+       {0x0ABC, 156, 843},     /* CFG_VIN2A_D19_IN */
+       {0x0AC8, 2326, 309},    /* CFG_VIN2A_D1_IN */
+       {0x0AD4, 223, 1413},    /* CFG_VIN2A_D20_IN */
+       {0x0AE0, 169, 1415},    /* CFG_VIN2A_D21_IN */
+       {0x0AEC, 43, 1150},     /* CFG_VIN2A_D22_IN */
+       {0x0AF8, 0, 1210},      /* CFG_VIN2A_D23_IN */
+       {0x0B04, 2057, 0},      /* CFG_VIN2A_D2_IN */
+       {0x0B10, 2440, 257},    /* CFG_VIN2A_D3_IN */
+       {0x0B1C, 2142, 0},      /* CFG_VIN2A_D4_IN */
+       {0x0B28, 2455, 252},    /* CFG_VIN2A_D5_IN */
+       {0x0B34, 1883, 0},      /* CFG_VIN2A_D6_IN */
+       {0x0B40, 2229, 0},      /* CFG_VIN2A_D7_IN */
+       {0x0B4C, 2250, 151},    /* CFG_VIN2A_D8_IN */
+       {0x0B58, 2279, 27},     /* CFG_VIN2A_D9_IN */
+       {0x0B7C, 2233, 0},      /* CFG_VIN2A_HSYNC0_IN */
+       {0x0B88, 1936, 0},      /* CFG_VIN2A_VSYNC0_IN */
+       {0x0B9C, 1281, 497},    /* CFG_VOUT1_CLK_OUT */
+       {0x0BA8, 379, 0},       /* CFG_VOUT1_D0_OUT */
+       {0x0BB4, 441, 0},       /* CFG_VOUT1_D10_OUT */
+       {0x0BC0, 461, 0},       /* CFG_VOUT1_D11_OUT */
+       {0x0BCC, 1189, 0},      /* CFG_VOUT1_D12_OUT */
+       {0x0BD8, 312, 0},       /* CFG_VOUT1_D13_OUT */
+       {0x0BE4, 298, 0},       /* CFG_VOUT1_D14_OUT */
+       {0x0BF0, 284, 0},       /* CFG_VOUT1_D15_OUT */
+       {0x0BFC, 152, 0},       /* CFG_VOUT1_D16_OUT */
+       {0x0C08, 216, 0},       /* CFG_VOUT1_D17_OUT */
+       {0x0C14, 408, 0},       /* CFG_VOUT1_D18_OUT */
+       {0x0C20, 519, 0},       /* CFG_VOUT1_D19_OUT */
+       {0x0C2C, 475, 0},       /* CFG_VOUT1_D1_OUT */
+       {0x0C38, 316, 0},       /* CFG_VOUT1_D20_OUT */
+       {0x0C44, 59, 0},        /* CFG_VOUT1_D21_OUT */
+       {0x0C50, 221, 0},       /* CFG_VOUT1_D22_OUT */
+       {0x0C5C, 96, 0},        /* CFG_VOUT1_D23_OUT */
+       {0x0C68, 264, 0},       /* CFG_VOUT1_D2_OUT */
+       {0x0C74, 421, 0},       /* CFG_VOUT1_D3_OUT */
+       {0x0C80, 1257, 0},      /* CFG_VOUT1_D4_OUT */
+       {0x0C8C, 432, 0},       /* CFG_VOUT1_D5_OUT */
+       {0x0C98, 436, 0},       /* CFG_VOUT1_D6_OUT */
+       {0x0CA4, 440, 0},       /* CFG_VOUT1_D7_OUT */
+       {0x0CB0, 81, 100},      /* CFG_VOUT1_D8_OUT */
+       {0x0CBC, 471, 0},       /* CFG_VOUT1_D9_OUT */
+       {0x0CC8, 0, 0}, /* CFG_VOUT1_DE_OUT */
+       {0x0CE0, 0, 0}, /* CFG_VOUT1_HSYNC_OUT */
+       {0x0CEC, 815, 0},       /* CFG_VOUT1_VSYNC_OUT */
+};
 #endif
 
 #endif /* _MUX_DATA_DRA7XX_H_ */
index 15f0f54af633c61cc6877aa4432dcfbfaa88ce38..f1c4ddcd3098e1e4b080a4a066a7518168e48057 100644 (file)
@@ -13,6 +13,7 @@
 #include <asm/arch/mmc_host_def.h>
 #include <fdtdec.h>
 #include <i2c.h>
+#include <remoteproc.h>
 #include "mux-k2g.h"
 #include "../common/board_detect.h"
 
@@ -353,3 +354,23 @@ int get_num_eth_ports(void)
        return sizeof(eth_priv_cfg) / sizeof(struct eth_priv_t);
 }
 #endif
+
+#ifdef CONFIG_TI_SECURE_DEVICE
+void board_pmmc_image_process(ulong pmmc_image, size_t pmmc_size)
+{
+       int id = getenv_ulong("dev_pmmc", 10, 0);
+       int ret;
+
+       if (!rproc_is_initialized())
+               rproc_init();
+
+       ret = rproc_load(id, pmmc_image, pmmc_size);
+       printf("Load Remote Processor %d with data@addr=0x%08lx %u bytes:%s\n",
+              id, pmmc_image, pmmc_size, ret ? " Failed!" : " Success!");
+
+       if (!ret)
+               rproc_start(id);
+}
+
+U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_PMMC, board_pmmc_image_process);
+#endif
index ebc6c12cbcbd2143e428f68090168ae611285f57..628a61dae0f77648c79f587ca8f0f004042e0cc8 100644 (file)
@@ -29,7 +29,6 @@
 #include <dm/platform_data/serial_mxc.h>
 #include <dm/platdata.h>
 #include <fsl_esdhc.h>
-#include <g_dnl.h>
 #include <i2c.h>
 #include <imx_thermal.h>
 #include <linux/errno.h>
@@ -1224,18 +1223,6 @@ void reset_cpu(ulong addr)
 {
 }
 
-#ifdef CONFIG_SPL_USB_GADGET_SUPPORT
-int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
-{
-       unsigned short usb_pid;
-
-       usb_pid = TORADEX_USB_PRODUCT_NUM_OFFSET + 0xfff;
-       put_unaligned(usb_pid, &dev->idProduct);
-
-       return 0;
-}
-#endif
-
 #endif
 
 static struct mxc_serial_platdata mxc_serial_plat = {
index 669d9123ca295bd3283d98b27edab4da89e857ae..756e3f39df1b0dc829963950cdea5957bcf0061c 100644 (file)
@@ -28,7 +28,6 @@
 #include <dm/platform_data/serial_mxc.h>
 #include <dm/platdata.h>
 #include <fsl_esdhc.h>
-#include <g_dnl.h>
 #include <i2c.h>
 #include <imx_thermal.h>
 #include <linux/errno.h>
@@ -1108,18 +1107,6 @@ void reset_cpu(ulong addr)
 {
 }
 
-#ifdef CONFIG_SPL_USB_GADGET_SUPPORT
-int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
-{
-       unsigned short usb_pid;
-
-       usb_pid = TORADEX_USB_PRODUCT_NUM_OFFSET + 0xfff;
-       put_unaligned(usb_pid, &dev->idProduct);
-
-       return 0;
-}
-#endif
-
 #endif
 
 static struct mxc_serial_platdata mxc_serial_plat = {
index 5cb14b43de76ed38153c37ad8f8748ec1badfd26..13b2b5785b321c972388277fce11e2ba98fd300d 100644 (file)
@@ -280,7 +280,7 @@ static int setup_fec(void)
                        IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL_MASK);
 #endif
 
-       return set_clk_enet(ENET_50MHz);
+       return set_clk_enet(ENET_50MHZ);
 }
 
 int board_phy_config(struct phy_device *phydev)
index 328c4c0200d09198177b9941c52f2b30c1ba8429..f850a3c98e50389d21ef7dad156ad0d797877e47 100644 (file)
@@ -129,8 +129,6 @@ static int tdx_cfg_block_mmc_storage(u8 *config_block, int write)
                        ret = -EIO;
                        goto out;
                }
-               /* Flush cache after read */
-               flush_cache((ulong)(unsigned char *)config_block, 512);
        } else {
                /* Just writing one 512 byte block */
                if (blk_dwrite(mmc_get_blk_desc(mmc), blk_start, 1,
index 3645969e4341ecf348611496a08a97d23c96ebb3..694055bd2e51aee22d9f8fafe43614a236ebd154 100644 (file)
@@ -252,11 +252,5 @@ void board_init_f(ulong dummy)
 
        /* DDR initialization */
        spl_dram_init();
-
-       /* Clear the BSS. */
-       memset(__bss_start, 0, __bss_end - __bss_start);
-
-       /* load/boot image from boot device */
-       board_init_r(NULL, 0);
 }
 #endif
index 99a02865ecf63ffacab74bef188e8b50a60d0c2a..00c75d06826ad5e7562abbf518741a00e4cf63ed 100644 (file)
@@ -300,11 +300,5 @@ void board_init_f(ulong dummy)
 
        /* DDR initialization */
        spl_dram_init();
-
-       /* Clear the BSS. */
-       memset(__bss_start, 0, __bss_end - __bss_start);
-
-       /* load/boot image from boot device */
-       board_init_r(NULL, 0);
 }
 #endif
index 86c75e78d8892a3a1f6ea45728307f61ae86b593..0c0c23eb3701e846a0614c30ddd761581085e831 100644 (file)
@@ -68,9 +68,8 @@ int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
                        ulong cnt = simple_strtoul(argv[4], NULL, 16);
                        ulong n;
 
-                       printf("\n%s read: device %d block # %lld, count %ld ... ",
-                              if_name, *cur_devnump, (unsigned long long)blk,
-                              cnt);
+                       printf("\n%s read: device %d block # "LBAFU", count %lu ... ",
+                              if_name, *cur_devnump, blk, cnt);
 
                        n = blk_read_devnum(if_type, *cur_devnump, blk, cnt,
                                            (ulong *)addr);
@@ -84,9 +83,8 @@ int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
                        ulong cnt = simple_strtoul(argv[4], NULL, 16);
                        ulong n;
 
-                       printf("\n%s write: device %d block # %lld, count %ld ... ",
-                              if_name, *cur_devnump, (unsigned long long)blk,
-                              cnt);
+                       printf("\n%s write: device %d block # "LBAFU", count %lu ... ",
+                              if_name, *cur_devnump, blk, cnt);
 
                        n = blk_write_devnum(if_type, *cur_devnump, blk, cnt,
                                             (ulong *)addr);
index d7654b2c4fd5de88c935a8cbc4e2e52be8450eb4..955a0088c6ef31f16c77e5befee761a21fdded69 100644 (file)
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -667,11 +667,10 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (!fdt_valid(&blob))
                        return CMD_RET_FAILURE;
 
-               ret = fdt_overlay_apply(working_fdt, blob);
-               if (ret) {
-                       printf("fdt_overlay_apply(): %s\n", fdt_strerror(ret));
+               /* apply method prints messages on error */
+               ret = fdt_overlay_apply_verbose(working_fdt, blob);
+               if (ret)
                        return CMD_RET_FAILURE;
-               }
        }
 #endif
        /* resize the fdt */
index 00697fc1f2b7bd8323ca0c0fb723685c1949595d..5def4ea1a29ad0b6c72bd60b3c4132c749a1d6ca 100644 (file)
--- a/cmd/mmc.c
+++ b/cmd/mmc.c
@@ -293,8 +293,6 @@ static int do_mmc_read(cmd_tbl_t *cmdtp, int flag,
               curr_device, blk, cnt);
 
        n = blk_dread(mmc_get_blk_desc(mmc), blk, cnt, addr);
-       /* flush cache after read */
-       flush_cache((ulong)addr, cnt * 512); /* FIXME */
        printf("%d blocks read: %s\n", n, (n == cnt) ? "OK" : "ERROR");
 
        return (n == cnt) ? CMD_RET_SUCCESS : CMD_RET_FAILURE;
index ad033652d4c299bbe7087f235fee737309a405d2..4d84492346dd1e3a9a4ddc7782ac0315e36a82ab 100644 (file)
--- a/cmd/spl.c
+++ b/cmd/spl.c
@@ -109,12 +109,12 @@ static int spl_export(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
        c = find_cmd_tbl(argv[1], &cmd_spl_export_sub[0],
                ARRAY_SIZE(cmd_spl_export_sub));
-       if ((c) && ((int)c->cmd <= SPL_EXPORT_LAST)) {
+       if ((c) && ((long)c->cmd <= SPL_EXPORT_LAST)) {
                argc -= 2;
                argv += 2;
-               if (call_bootm(argc, argv, subcmd_list[(int)c->cmd]))
+               if (call_bootm(argc, argv, subcmd_list[(long)c->cmd]))
                        return -1;
-               switch ((int)c->cmd) {
+               switch ((long)c->cmd) {
 #ifdef CONFIG_OF_LIBFDT
                case SPL_EXPORT_FDT:
                        printf("Argument image is now in RAM: 0x%p\n",
@@ -153,7 +153,7 @@ static int do_spl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
        c = find_cmd_tbl(argv[1], &cmd_spl_sub[0], ARRAY_SIZE(cmd_spl_sub));
        if (c) {
-               cmd = (int)c->cmd;
+               cmd = (long)c->cmd;
                switch (cmd) {
                case SPL_EXPORT:
                        argc--;
index 222be5a3576cb7aa96121b449889766550d1885d..ac9a582437d603039ec722db30d32187dd1181c4 100644 (file)
--- a/cmd/ubi.c
+++ b/cmd/ubi.c
@@ -334,6 +334,7 @@ int ubi_volume_read(char *volume, char *buf, size_t size)
        unsigned long long tmp;
        struct ubi_volume *vol;
        loff_t offp = 0;
+       size_t len_read;
 
        vol = ubi_find_volume(volume);
        if (vol == NULL)
@@ -373,6 +374,7 @@ int ubi_volume_read(char *volume, char *buf, size_t size)
        tmp = offp;
        off = do_div(tmp, vol->usable_leb_size);
        lnum = tmp;
+       len_read = size;
        do {
                if (off + len >= vol->usable_leb_size)
                        len = vol->usable_leb_size - off;
@@ -398,6 +400,9 @@ int ubi_volume_read(char *volume, char *buf, size_t size)
                len = size > tbuf_size ? tbuf_size : size;
        } while (size);
 
+       if (!size)
+               env_set_hex("filesize", len_read);
+
        free(tbuf);
        return err;
 }
index 4d8cae96109ad4e1d04dd385d469a37129a8023a..540cc9999bc6df546fcf408d188cd4d91f192020 100644 (file)
@@ -46,15 +46,6 @@ config BOOTSTAGE_REPORT
                 29,916,167 26,005,792  bootm_start
                 30,361,327    445,160  start_kernel
 
-config BOOTSTAGE_USER_COUNT
-       int "Number of boot ID numbers available for user use"
-       default 20
-       help
-         This is the number of available user bootstage records.
-         Each time you call bootstage_mark(BOOTSTAGE_ID_ALLOC, ...)
-         a new ID will be allocated from this stash. If you exceed
-         the limit, recording will stop.
-
 config BOOTSTAGE_RECORD_COUNT
        int "Number of boot stage records to store"
        default 30
@@ -62,6 +53,13 @@ config BOOTSTAGE_RECORD_COUNT
          This is the size of the bootstage record list and is the maximum
          number of bootstage records that can be recorded.
 
+config SPL_BOOTSTAGE_RECORD_COUNT
+       int "Number of boot stage records to store for SPL"
+       default 5
+       help
+         This is the size of the bootstage record list and is the maximum
+         number of bootstage records that can be recorded.
+
 config BOOTSTAGE_FDT
        bool "Store boot timing information in the OS device tree"
        depends on BOOTSTAGE
index 1b56cf9a70fc49e1fb039ee1d485319cc0d9f3ad..801ea3191f6782054dc469970ab90469440e3303 100644 (file)
@@ -63,7 +63,7 @@ obj-$(CONFIG_CMDLINE) += cli_readline.o cli_simple.o
 
 endif # !CONFIG_SPL_BUILD
 
-obj-$(CONFIG_$(SPL_)BOOTSTAGE) += bootstage.o
+obj-$(CONFIG_$(SPL_TPL_)BOOTSTAGE) += bootstage.o
 
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_SPL_DFU_SUPPORT) += dfu.o
index 104d144f41ab3703db74d20609507bd3bb38b8a4..9220815441e51f58d34eac914c570a84da206bd1 100644 (file)
@@ -952,6 +952,9 @@ void board_init_f_r(void)
         * UART if available.
         */
        gd->flags &= ~GD_FLG_SERIAL_READY;
+#ifdef CONFIG_TIMER
+       gd->timer = NULL;
+#endif
 
        /*
         * U-Boot has been copied into SDRAM, the BSS has been cleared etc.
index 61479d7f07925ab604bfe605c2e13cd978a8fb09..b866e66979e3d8577febda37141e8c5db8b1c22a 100644 (file)
@@ -18,7 +18,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 enum {
-       RECORD_COUNT = CONFIG_BOOTSTAGE_RECORD_COUNT,
+       RECORD_COUNT = CONFIG_VAL(BOOTSTAGE_RECORD_COUNT),
 };
 
 struct bootstage_record {
@@ -327,7 +327,7 @@ void bootstage_report(void)
        }
        if (data->rec_count > RECORD_COUNT)
                printf("Overflowed internal boot id table by %d entries\n"
-                      "- please increase CONFIG_BOOTSTAGE_RECORD_COUNT\n",
+                      "Please increase CONFIG_(SPL_)BOOTSTAGE_RECORD_COUNT\n",
                       data->rec_count - RECORD_COUNT);
 
        puts("\nAccumulated time:\n");
@@ -456,7 +456,7 @@ int bootstage_unstash(const void *base, int size)
 
        if (data->rec_count + hdr->count > RECORD_COUNT) {
                debug("%s: Bootstage has %d records, we have space for %d\n"
-                       "- please increase CONFIG_BOOTSTAGE_USER_COUNT\n",
+                       "Please increase CONFIG_(SPL_)BOOTSTAGE_RECORD_COUNT\n",
                      __func__, hdr->count, RECORD_COUNT - data->rec_count);
                return -ENOSPC;
        }
index 916a448c11d43a82e25155f001c919cd8b5e9541..f4f9543d5475d804e9059a51ccb199604605fc7b 100644 (file)
@@ -1655,3 +1655,34 @@ int fdt_fixup_display(void *blob, const char *path, const char *display)
        }
        return toff;
 }
+
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+/**
+ * fdt_overlay_apply_verbose - Apply an overlay with verbose error reporting
+ *
+ * @fdt: ptr to device tree
+ * @fdto: ptr to device tree overlay
+ *
+ * Convenience function to apply an overlay and display helpful messages
+ * in the case of an error
+ */
+int fdt_overlay_apply_verbose(void *fdt, void *fdto)
+{
+       int err;
+       bool has_symbols;
+
+       err = fdt_path_offset(fdt, "/__symbols__");
+       has_symbols = err >= 0;
+
+       err = fdt_overlay_apply(fdt, fdto);
+       if (err < 0) {
+               printf("failed on fdt_overlay_apply(): %s\n",
+                               fdt_strerror(err));
+               if (!has_symbols) {
+                       printf("base fdt does did not have a /__symbols__ node\n");
+                       printf("make sure you've compiled with -@\n");
+               }
+       }
+       return err;
+}
+#endif
index da4d0070815db68782bdd0731b59bbf211067710..a2ef409836535438be6c1467bcd0ff631e92e0cb 100644 (file)
@@ -356,17 +356,16 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                        if (fit_check_format(buf)) {
                                ulong load, len;
 
-                               fdt_noffset = fit_image_load(images,
+                               fdt_noffset = boot_get_fdt_fit(images,
                                        fdt_addr, &fit_uname_fdt,
                                        &fit_uname_config,
-                                       arch, IH_TYPE_FLATDT,
-                                       BOOTSTAGE_ID_FIT_FDT_START,
-                                       FIT_LOAD_OPTIONAL, &load, &len);
+                                       arch, &load, &len);
 
                                images->fit_hdr_fdt = map_sysmem(fdt_addr, 0);
                                images->fit_uname_fdt = fit_uname_fdt;
                                images->fit_noffset_fdt = fdt_noffset;
                                fdt_addr = load;
+
                                break;
                        } else
 #endif
index 109ecfaaccb79f2a6401938e2180c511e3af9eef..7f17fd1410ed8a3b37e48f33f7ddf14dd4b54f65 100644 (file)
@@ -19,6 +19,7 @@
 #include <errno.h>
 #include <mapmem.h>
 #include <asm/io.h>
+#include <malloc.h>
 DECLARE_GLOBAL_DATA_PTR;
 #endif /* !USE_HOSTCC*/
 
@@ -434,6 +435,10 @@ void fit_image_print(const void *fit, int image_noffset, const char *p)
                        printf("0x%08lx\n", load);
        }
 
+       /* optional load address for FDT */
+       if (type == IH_TYPE_FLATDT && !fit_image_get_load(fit, image_noffset, &load))
+               printf("%s  Load Address: 0x%08lx\n", p, load);
+
        if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE) ||
            (type == IH_TYPE_RAMDISK)) {
                ret = fit_image_get_entry(fit, image_noffset, &entry);
@@ -1454,6 +1459,8 @@ int fit_conf_get_node(const void *fit, const char *conf_uname)
 {
        int noffset, confs_noffset;
        int len;
+       const char *s;
+       char *conf_uname_copy = NULL;
 
        confs_noffset = fdt_path_offset(fit, FIT_CONFS_PATH);
        if (confs_noffset < 0) {
@@ -1475,29 +1482,58 @@ int fit_conf_get_node(const void *fit, const char *conf_uname)
                debug("Found default configuration: '%s'\n", conf_uname);
        }
 
+       s = strchr(conf_uname, '#');
+       if (s) {
+               len = s - conf_uname;
+               conf_uname_copy = malloc(len + 1);
+               if (!conf_uname_copy) {
+                       debug("Can't allocate uname copy: '%s'\n",
+                                       conf_uname);
+                       return -ENOMEM;
+               }
+               memcpy(conf_uname_copy, conf_uname, len);
+               conf_uname_copy[len] = '\0';
+               conf_uname = conf_uname_copy;
+       }
+
        noffset = fdt_subnode_offset(fit, confs_noffset, conf_uname);
        if (noffset < 0) {
                debug("Can't get node offset for configuration unit name: '%s' (%s)\n",
                      conf_uname, fdt_strerror(noffset));
        }
 
+       if (conf_uname_copy)
+               free(conf_uname_copy);
+
        return noffset;
 }
 
-int fit_conf_get_prop_node(const void *fit, int noffset,
+int fit_conf_get_prop_node_count(const void *fit, int noffset,
                const char *prop_name)
 {
-       char *uname;
+       return fdt_stringlist_count(fit, noffset, prop_name);
+}
+
+int fit_conf_get_prop_node_index(const void *fit, int noffset,
+               const char *prop_name, int index)
+{
+       const char *uname;
        int len;
 
        /* get kernel image unit name from configuration kernel property */
-       uname = (char *)fdt_getprop(fit, noffset, prop_name, &len);
+       uname = fdt_stringlist_get(fit, noffset, prop_name, index, &len);
        if (uname == NULL)
                return len;
 
        return fit_image_get_node(fit, uname);
 }
 
+int fit_conf_get_prop_node(const void *fit, int noffset,
+               const char *prop_name)
+{
+       return fit_conf_get_prop_node_index(fit, noffset, prop_name, 0);
+}
+
 /**
  * fit_conf_print - prints out the FIT configuration details
  * @fit: pointer to the FIT format image header
@@ -1515,7 +1551,7 @@ void fit_conf_print(const void *fit, int noffset, const char *p)
        char *desc;
        const char *uname;
        int ret;
-       int loadables_index;
+       int fdt_index, loadables_index;
 
        /* Mandatory properties */
        ret = fit_get_desc(fit, noffset, &desc);
@@ -1537,9 +1573,17 @@ void fit_conf_print(const void *fit, int noffset, const char *p)
        if (uname)
                printf("%s  Init Ramdisk: %s\n", p, uname);
 
-       uname = fdt_getprop(fit, noffset, FIT_FDT_PROP, NULL);
-       if (uname)
-               printf("%s  FDT:          %s\n", p, uname);
+       for (fdt_index = 0;
+            uname = fdt_stringlist_get(fit, noffset, FIT_FDT_PROP,
+                                       fdt_index, NULL), uname;
+            fdt_index++) {
+
+               if (fdt_index == 0)
+                       printf("%s  FDT:          ", p);
+               else
+                       printf("%s                ", p);
+               printf("%s\n", uname);
+       }
 
        uname = fdt_getprop(fit, noffset, FIT_FPGA_PROP, NULL);
        if (uname)
@@ -1641,6 +1685,7 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
        int cfg_noffset, noffset;
        const char *fit_uname;
        const char *fit_uname_config;
+       const char *fit_base_uname_config;
        const void *fit;
        const void *buf;
        size_t size;
@@ -1656,6 +1701,7 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
        fit = map_sysmem(addr, 0);
        fit_uname = fit_unamep ? *fit_unamep : NULL;
        fit_uname_config = fit_uname_configp ? *fit_uname_configp : NULL;
+       fit_base_uname_config = NULL;
        prop_name = fit_get_image_type_property(image_type);
        printf("## Loading %s from FIT Image at %08lx ...\n", prop_name, addr);
 
@@ -1689,11 +1735,11 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
                                        BOOTSTAGE_SUB_NO_UNIT_NAME);
                        return -ENOENT;
                }
-               fit_uname_config = fdt_get_name(fit, cfg_noffset, NULL);
-               printf("   Using '%s' configuration\n", fit_uname_config);
+               fit_base_uname_config = fdt_get_name(fit, cfg_noffset, NULL);
+               printf("   Using '%s' configuration\n", fit_base_uname_config);
                if (image_type == IH_TYPE_KERNEL) {
                        /* Remember (and possibly verify) this config */
-                       images->fit_uname_cfg = fit_uname_config;
+                       images->fit_uname_cfg = fit_base_uname_config;
                        if (IMAGE_ENABLE_VERIFY && images->verify) {
                                puts("   Verifying Hash Integrity ... ");
                                if (fit_config_verify(fit, cfg_noffset)) {
@@ -1849,7 +1895,8 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
        if (fit_unamep)
                *fit_unamep = (char *)fit_uname;
        if (fit_uname_configp)
-               *fit_uname_configp = (char *)fit_uname_config;
+               *fit_uname_configp = (char *)(fit_uname_config ? :
+                                             fit_base_uname_config);
 
        return noffset;
 }
@@ -1873,3 +1920,144 @@ int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch,
 
        return ret;
 }
+
+#ifndef USE_HOSTCC
+int boot_get_fdt_fit(bootm_headers_t *images, ulong addr,
+                  const char **fit_unamep, const char **fit_uname_configp,
+                  int arch, ulong *datap, ulong *lenp)
+{
+       int fdt_noffset, cfg_noffset, count;
+       const void *fit;
+       const char *fit_uname = NULL;
+       const char *fit_uname_config = NULL;
+       char *fit_uname_config_copy = NULL;
+       char *next_config = NULL;
+       ulong load, len;
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+       ulong image_start, image_end;
+       ulong ovload, ovlen;
+       const char *uconfig;
+       const char *uname;
+       void *base, *ov;
+       int i, err, noffset, ov_noffset;
+#endif
+
+       fit_uname = fit_unamep ? *fit_unamep : NULL;
+
+       if (fit_uname_configp && *fit_uname_configp) {
+               fit_uname_config_copy = strdup(*fit_uname_configp);
+               if (!fit_uname_config_copy)
+                       return -ENOMEM;
+
+               next_config = strchr(fit_uname_config_copy, '#');
+               if (next_config)
+                       *next_config++ = '\0';
+               if (next_config - 1 > fit_uname_config_copy)
+                       fit_uname_config = fit_uname_config_copy;
+       }
+
+       fdt_noffset = fit_image_load(images,
+               addr, &fit_uname, &fit_uname_config,
+               arch, IH_TYPE_FLATDT,
+               BOOTSTAGE_ID_FIT_FDT_START,
+               FIT_LOAD_OPTIONAL, &load, &len);
+
+       if (fdt_noffset < 0)
+               goto out;
+
+       debug("fit_uname=%s, fit_uname_config=%s\n",
+                       fit_uname ? fit_uname : "<NULL>",
+                       fit_uname_config ? fit_uname_config : "<NULL>");
+
+       fit = map_sysmem(addr, 0);
+
+       cfg_noffset = fit_conf_get_node(fit, fit_uname_config);
+
+       /* single blob, or error just return as well */
+       count = fit_conf_get_prop_node_count(fit, cfg_noffset, FIT_FDT_PROP);
+       if (count <= 1 && !next_config)
+               goto out;
+
+       /* we need to apply overlays */
+
+#ifdef CONFIG_OF_LIBFDT_OVERLAY
+       image_start = addr;
+       image_end = addr + fit_get_size(fit);
+       /* verify that relocation took place by load address not being in fit */
+       if (load >= image_start && load < image_end) {
+               /* check is simplified; fit load checks for overlaps */
+               printf("Overlayed FDT requires relocation\n");
+               fdt_noffset = -EBADF;
+               goto out;
+       }
+
+       base = map_sysmem(load, len);
+
+       /* apply extra configs in FIT first, followed by args */
+       for (i = 1; ; i++) {
+               if (i < count) {
+                       noffset = fit_conf_get_prop_node_index(fit, cfg_noffset,
+                                                              FIT_FDT_PROP, i);
+                       uname = fit_get_name(fit, noffset, NULL);
+                       uconfig = NULL;
+               } else {
+                       if (!next_config)
+                               break;
+                       uconfig = next_config;
+                       next_config = strchr(next_config, '#');
+                       if (next_config)
+                               *next_config++ = '\0';
+                       uname = NULL;
+               }
+
+               debug("%d: using uname=%s uconfig=%s\n", i, uname, uconfig);
+
+               ov_noffset = fit_image_load(images,
+                       addr, &uname, &uconfig,
+                       arch, IH_TYPE_FLATDT,
+                       BOOTSTAGE_ID_FIT_FDT_START,
+                       FIT_LOAD_REQUIRED, &ovload, &ovlen);
+               if (ov_noffset < 0) {
+                       printf("load of %s failed\n", uname);
+                       continue;
+               }
+               debug("%s loaded at 0x%08lx len=0x%08lx\n",
+                               uname, ovload, ovlen);
+               ov = map_sysmem(ovload, ovlen);
+
+               base = map_sysmem(load, len + ovlen);
+               err = fdt_open_into(base, base, len + ovlen);
+               if (err < 0) {
+                       printf("failed on fdt_open_into\n");
+                       fdt_noffset = err;
+                       goto out;
+               }
+               /* the verbose method prints out messages on error */
+               err = fdt_overlay_apply_verbose(base, ov);
+               if (err < 0) {
+                       fdt_noffset = err;
+                       goto out;
+               }
+               fdt_pack(base);
+               len = fdt_totalsize(base);
+       }
+#else
+       printf("config with overlays but CONFIG_OF_LIBFDT_OVERLAY not set\n");
+       fdt_noffset = -EBADF;
+#endif
+
+out:
+       if (datap)
+               *datap = load;
+       if (lenp)
+               *lenp = len;
+       if (fit_unamep)
+               *fit_unamep = fit_uname;
+       if (fit_uname_configp)
+               *fit_uname_configp = fit_uname_config;
+
+       if (fit_uname_config_copy)
+               free(fit_uname_config_copy);
+       return fdt_noffset;
+}
+#endif
index a058eb85e107bce98c7a155344250cc30f16ef18..332b5f2843872918d2e76072c01aa05b873c2a69 100644 (file)
@@ -167,6 +167,7 @@ static const table_entry_t uimage_type[] = {
        {       IH_TYPE_FPGA,       "fpga",       "FPGA Image" },
        {       IH_TYPE_TEE,        "tee",        "Trusted Execution Environment Image",},
        {       IH_TYPE_FIRMWARE_IVT, "firmware_ivt", "Firmware with HABv4 IVT" },
+       {       IH_TYPE_PMMC,        "pmmc",        "TI Power Management Micro-Controller Firmware",},
        {       -1,                 "",           "",                   },
 };
 
index 8b219ba6908d3ac58688ce483295944372b5f077..ce9819e4db072eed79153879d6322b67d2c08887 100644 (file)
@@ -158,7 +158,7 @@ int spl_parse_image_header(struct spl_image_info *spl_image,
                        spl_image->load_addr, spl_image->size);
 #else
                /* LEGACY image not supported */
-               debug("Legacy boot image support not enabled, proceeding to other boot methods");
+               debug("Legacy boot image support not enabled, proceeding to other boot methods\n");
                return -EINVAL;
 #endif
        } else {
@@ -196,7 +196,7 @@ int spl_parse_image_header(struct spl_image_info *spl_image,
                spl_set_header_raw_uboot(spl_image);
 #else
                /* RAW image not supported, proceed to other boot methods. */
-               debug("Raw boot image support not enabled, proceeding to other boot methods");
+               debug("Raw boot image support not enabled, proceeding to other boot methods\n");
                return -EINVAL;
 #endif
        }
index d2a352ecbe430f1d3e3bfae3ae05bba5f568417c..49ccf1c17bdaf56b429bfbf90fc21de82bfbaf58 100644 (file)
 #include <libfdt.h>
 #include <spl.h>
 
+#ifndef CONFIG_SYS_BOOTM_LEN
+#define CONFIG_SYS_BOOTM_LEN   (64 << 20)
+#endif
+
 /**
  * spl_fit_get_image_node(): By using the matching configuration subnode,
  * retrieve the name of an image, specified by a property name and an index
@@ -128,41 +132,79 @@ static int spl_load_fit_image(struct spl_load_info *info, ulong sector,
                              void *fit, ulong base_offset, int node,
                              struct spl_image_info *image_info)
 {
-       ulong offset;
+       int offset;
        size_t length;
+       int len;
        ulong load_addr, load_ptr;
        void *src;
        ulong overhead;
        int nr_sectors;
        int align_len = ARCH_DMA_MINALIGN - 1;
+       uint8_t image_comp = -1, type = -1;
+       const void *data;
+
+       if (IS_ENABLED(CONFIG_SPL_OS_BOOT) && IS_ENABLED(CONFIG_SPL_GZIP)) {
+               if (fit_image_get_comp(fit, node, &image_comp))
+                       puts("Cannot get image compression format.\n");
+               else
+                       debug("%s ", genimg_get_comp_name(image_comp));
+
+               if (fit_image_get_type(fit, node, &type))
+                       puts("Cannot get image type.\n");
+               else
+                       debug("%s ", genimg_get_type_name(type));
+       }
 
-       offset = fdt_getprop_u32(fit, node, "data-offset");
-       if (offset == FDT_ERROR)
-               return -ENOENT;
-       offset += base_offset;
-       length = fdt_getprop_u32(fit, node, "data-size");
-       if (length == FDT_ERROR)
-               return -ENOENT;
-       load_addr = fdt_getprop_u32(fit, node, "load");
-       if (load_addr == FDT_ERROR && image_info)
+       if (fit_image_get_load(fit, node, &load_addr))
                load_addr = image_info->load_addr;
-       load_ptr = (load_addr + align_len) & ~align_len;
-
-       overhead = get_aligned_image_overhead(info, offset);
-       nr_sectors = get_aligned_image_size(info, length, offset);
 
-       if (info->read(info, sector + get_aligned_image_offset(info, offset),
-                      nr_sectors, (void*)load_ptr) != nr_sectors)
-               return -EIO;
-       debug("image: dst=%lx, offset=%lx, size=%lx\n", load_ptr, offset,
-             (unsigned long)length);
+       if (!fit_image_get_data_offset(fit, node, &offset)) {
+               /* External data */
+               offset += base_offset;
+               if (fit_image_get_data_size(fit, node, &len))
+                       return -ENOENT;
+
+               load_ptr = (load_addr + align_len) & ~align_len;
+               length = len;
+
+               overhead = get_aligned_image_overhead(info, offset);
+               nr_sectors = get_aligned_image_size(info, length, offset);
+
+               if (info->read(info,
+                              sector + get_aligned_image_offset(info, offset),
+                              nr_sectors, (void *)load_ptr) != nr_sectors)
+                       return -EIO;
+
+               debug("External data: dst=%lx, offset=%x, size=%lx\n",
+                     load_ptr, offset, (unsigned long)length);
+               src = (void *)load_ptr + overhead;
+       } else {
+               /* Embedded data */
+               if (fit_image_get_data(fit, node, &data, &length)) {
+                       puts("Cannot get image data/size\n");
+                       return -ENOENT;
+               }
+               debug("Embedded data: dst=%lx, size=%lx\n", load_addr,
+                     (unsigned long)length);
+               src = (void *)data;
+       }
 
-       src = (void *)load_ptr + overhead;
 #ifdef CONFIG_SPL_FIT_IMAGE_POST_PROCESS
        board_fit_image_post_process(&src, &length);
 #endif
 
-       memcpy((void*)load_addr, src, length);
+       if (IS_ENABLED(CONFIG_SPL_OS_BOOT)      &&
+           IS_ENABLED(CONFIG_SPL_GZIP)         &&
+           image_comp == IH_COMP_GZIP          &&
+           type == IH_TYPE_KERNEL) {
+               if (gunzip((void *)load_addr, CONFIG_SYS_BOOTM_LEN,
+                          src, &length)) {
+                       puts("Uncompressing error\n");
+                       return -EIO;
+               }
+       } else {
+               memcpy((void *)load_addr, src, length);
+       }
 
        if (image_info) {
                image_info->load_addr = load_addr;
@@ -180,13 +222,16 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
        ulong size;
        unsigned long count;
        struct spl_image_info image_info;
-       int node, images, ret;
+       bool boot_os = false;
+       int node = -1;
+       int images, ret;
        int base_offset, align_len = ARCH_DMA_MINALIGN - 1;
        int index = 0;
 
        /*
-        * Figure out where the external images start. This is the base for the
-        * data-offset properties in each image.
+        * For FIT with external data, figure out where the external images
+        * start. This is the base for the data-offset properties in each
+        * image.
         */
        size = fdt_totalsize(fit);
        size = (size + 3) & ~3;
@@ -205,6 +250,9 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
         *
         * In fact the FIT has its own load address, but we assume it cannot
         * be before CONFIG_SYS_TEXT_BASE.
+        *
+        * For FIT with data embedded, data is loaded as part of FIT image.
+        * For FIT with external data, data is not loaded in this step.
         */
        fit = (void *)((CONFIG_SYS_TEXT_BASE - size - info->bl_len -
                        align_len) & ~align_len);
@@ -222,8 +270,17 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                return -1;
        }
 
+#ifdef CONFIG_SPL_OS_BOOT
+       /* Find OS image first */
+       node = spl_fit_get_image_node(fit, images, FIT_KERNEL_PROP, 0);
+       if (node < 0)
+               debug("No kernel image.\n");
+       else
+               boot_os = true;
+#endif
        /* find the U-Boot image */
-       node = spl_fit_get_image_node(fit, images, "firmware", 0);
+       if (node < 0)
+               node = spl_fit_get_image_node(fit, images, "firmware", 0);
        if (node < 0) {
                debug("could not find firmware image, trying loadables...\n");
                node = spl_fit_get_image_node(fit, images, "loadables", 0);
@@ -245,24 +302,31 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
        if (ret)
                return ret;
 
+#ifdef CONFIG_SPL_OS_BOOT
+       if (!fit_image_get_os(fit, node, &spl_image->os))
+               debug("Image OS is %s\n", genimg_get_os_name(spl_image->os));
+#else
        spl_image->os = IH_OS_U_BOOT;
+#endif
 
-       /* Figure out which device tree the board wants to use */
-       node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, 0);
-       if (node < 0) {
-               debug("%s: cannot find FDT node\n", __func__);
-               return node;
-       }
+       if (!boot_os) {
+               /* Figure out which device tree the board wants to use */
+               node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, 0);
+               if (node < 0) {
+                       debug("%s: cannot find FDT node\n", __func__);
+                       return node;
+               }
 
-       /*
-        * Read the device tree and place it after the image.
-        * Align the destination address to ARCH_DMA_MINALIGN.
-        */
-       image_info.load_addr = spl_image->load_addr + spl_image->size;
-       ret = spl_load_fit_image(info, sector, fit, base_offset, node,
-                                &image_info);
-       if (ret < 0)
-               return ret;
+               /*
+                * Read the device tree and place it after the image.
+                * Align the destination address to ARCH_DMA_MINALIGN.
+                */
+               image_info.load_addr = spl_image->load_addr + spl_image->size;
+               ret = spl_load_fit_image(info, sector, fit, base_offset, node,
+                                        &image_info);
+               if (ret < 0)
+                       return ret;
+       }
 
        /* Now check if there are more images for us to load */
        for (; ; index++) {
index 9e1e5ecb47ae30ec455bb57b51cb7c86be8b6178..c1053958c47660c0f613b7e723fe9a53184bda5a 100644 (file)
@@ -5,6 +5,8 @@ CONFIG_FIT=y
 CONFIG_BOOTDELAY=3
 CONFIG_SYS_PROMPT="NDS32 # "
 CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SF_TEST=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_PING=y
@@ -13,17 +15,23 @@ CONFIG_CMD_DATE=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_FAT=y
 CONFIG_OF_CONTROL=y
-CONFIG_ENV_IS_IN_FLASH=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM=y
+CONFIG_CLK=y
 CONFIG_MMC=y
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_CFI_FLASH=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_MACRONIX=y
 CONFIG_DM_ETH=y
 CONFIG_FTMAC100=y
 CONFIG_BAUDRATE=38400
 CONFIG_DM_SERIAL=y
 CONFIG_SYS_NS16550=y
+CONFIG_DM_SPI=y
+CONFIG_NDS_AE3XX_SPI=y
 CONFIG_TIMER=y
 CONFIG_AE3XX_TIMER=y
index 42260b1db2a3c88fd6f38484b84ab2fb53ef24ce..516ac2de3f04b764e1d6f0a5932811d1087244c3 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_ARCH_OMAP2PLUS=y
 CONFIG_SYS_TEXT_BASE=0x80100000
 # CONFIG_SPL_GPIO_SUPPORT is not set
 CONFIG_TARGET_AM3517_CRANE=y
+CONFIG_EMIF4=y
 CONFIG_BOOTDELAY=10
 CONFIG_SPL=y
 # CONFIG_SPL_EXT_SUPPORT is not set
index 27ea7a44df94eab230186e32b739a977011d5215..920c61c39174185812b121b38cbf9ac40d3b24fd 100644 (file)
@@ -2,8 +2,10 @@ CONFIG_ARM=y
 # CONFIG_SYS_THUMB_BUILD is not set
 CONFIG_ARCH_OMAP2PLUS=y
 CONFIG_SYS_TEXT_BASE=0x80100000
+CONFIG_TI_COMMON_CMD_OPTIONS=y
 # CONFIG_SPL_GPIO_SUPPORT is not set
 CONFIG_TARGET_AM3517_EVM=y
+CONFIG_EMIF4=y
 CONFIG_BOOTDELAY=10
 CONFIG_VERSION_VARIABLE=y
 CONFIG_SPL=y
@@ -11,27 +13,18 @@ CONFIG_SPL=y
 CONFIG_SPL_MTD_SUPPORT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="AM3517_EVM # "
-CONFIG_CMD_BOOTZ=y
 # CONFIG_CMD_IMI is not set
 # CONFIG_CMD_IMLS is not set
-CONFIG_CMD_ASKENV=y
+# CONFIG_CMD_EEPROM is not set
 # CONFIG_CMD_FLASH is not set
 # CONFIG_CMD_FPGA is not set
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
+# CONFIG_CMD_GPT is not set
 CONFIG_CMD_NAND=y
-CONFIG_CMD_PART=y
-CONFIG_CMD_USB=y
+# CONFIG_CMD_SPI is not set
 # CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_PING=y
+# CONFIG_CMD_MII is not set
 CONFIG_CMD_CACHE=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_EXT4=y
-CONFIG_CMD_EXT4_WRITE=y
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
+# CONFIG_CMD_TIME is not set
 CONFIG_CMD_UBI=y
 CONFIG_SPL_PARTITION_UUIDS=y
 CONFIG_ENV_IS_IN_NAND=y
@@ -41,5 +34,6 @@ CONFIG_SYS_NS16550=y
 CONFIG_USB=y
 CONFIG_USB_MUSB_HOST=y
 CONFIG_USB_STORAGE=y
+# CONFIG_FAT_WRITE is not set
 CONFIG_BCH=y
 CONFIG_OF_LIBFDT=y
index 3d455eb7d4e1d8edc75dcde157bad725aac1c4d3..0e4679abedf22788473a04a8bd0f1b80060b77d8 100644 (file)
@@ -39,7 +39,7 @@ CONFIG_CMD_SPL=y
 CONFIG_ISO_PARTITION=y
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
-CONFIG_OF_LIST="am57xx-beagle-x15 am57xx-beagle-x15-revb1 am572x-idk am571x-idk"
+CONFIG_OF_LIST="am57xx-beagle-x15 am57xx-beagle-x15-revb1 am57xx-beagle-x15-revc am572x-idk am571x-idk"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
index 01d77cbbd09eb2e9e9bbbb5139b9314c4cf7c048..e7638b88c25dabd74e57184838793a363644b2e9 100644 (file)
@@ -42,7 +42,7 @@ CONFIG_FASTBOOT_FLASH_MMC_DEV=1
 CONFIG_ISO_PARTITION=y
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
-CONFIG_OF_LIST="am57xx-beagle-x15 am57xx-beagle-x15-revb1 am572x-idk am571x-idk"
+CONFIG_OF_LIST="am57xx-beagle-x15 am57xx-beagle-x15-revb1 am57xx-beagle-x15-revc am572x-idk am571x-idk"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
index e0e37c4f993d7d4c049cb469814eb2a430f5f7a9..6740ec5b30d8222bad665371977ae1226b3664fe 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9M10G45EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9m10g45ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9M10G45,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 mtdparts=atmel_nand:8M(bootstrap/uboot/kernel)ro,-(rootfs) root=/dev/mmcblk0p2 rw rootwait"
index 3d73f8326246cd0464e1e9742cb39bc6f09e7e12..63bb7990e3b030d4dc44c438d2ca005916c835cd 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9M10G45EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9m10g45ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9M10G45,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256k(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) root=/dev/mtdblock7 rw rootfstype=jffs2"
index 4c554f260d2f3392ab8b385309fb4453e6cf8751..cc567c4dbf3f783af86f6dea94bc5e23a25061f1 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9N12EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9n12ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9N12,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 # CONFIG_CONSOLE_MUX is not set
 CONFIG_SYS_CONSOLE_IS_IN_ENV=y
index 19053b43a05cea8320e38d280a62e0b90b04e281..663987bc299944812405dcb519a40becbda4a06c 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9N12EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9n12ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9N12,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 # CONFIG_CONSOLE_MUX is not set
 CONFIG_SYS_CONSOLE_IS_IN_ENV=y
index 8a4d836843cb427f022a4e2dbb8c48921523129b..94481ca2ae3599d89e1cbcba3306d0caaa551c8a 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9N12EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9n12ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9N12,SYS_USE_SPIFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 # CONFIG_CONSOLE_MUX is not set
 CONFIG_SYS_CONSOLE_IS_IN_ENV=y
index b82b0a714c70ccf695be09de9d83c786ff60f706..9d61dd8de0007d70a6f475ddfbaec4e0f2d1becf 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9X5EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9g35ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9X5,SYS_USE_DATAFLASH"
+CONFIG_SYS_EXTRA_OPTIONS="SYS_USE_DATAFLASH"
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256k(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs rw"
index 72c55506921de5c220dde59813792fe4431bbcd4..9fa4801480b92186b2c5b09d8ba12933997e60bb 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9X5EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9g35ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9X5,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="mem=128M console=ttyS0,115200 mtdparts=atmel_nand:8M(bootstrap/uboot/kernel)ro,-(rootfs) root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait"
index 21f5bcbc2d51737d9d3bf5cd3cdac897da3f4362..b28bec7f0bf7ac719058596ca66a0fa3ab11ac2c 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9X5EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9g35ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9X5,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256k(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs rw"
index 8880fc97d841411c00d2ffe7dc5d3029dd026ef8..838d8a0ad7007133515195e14fa0e8d5eaf7718e 100644 (file)
@@ -4,7 +4,7 @@ CONFIG_TARGET_AT91SAM9X5EK=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="at91sam9g35ek"
 CONFIG_DEBUG_UART=y
-CONFIG_SYS_EXTRA_OPTIONS="AT91SAM9X5,SYS_USE_SPIFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256k(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs rw"
diff --git a/configs/cherryhill_defconfig b/configs/cherryhill_defconfig
new file mode 100644 (file)
index 0000000..a2017ac
--- /dev/null
@@ -0,0 +1,36 @@
+CONFIG_X86=y
+CONFIG_VENDOR_INTEL=y
+CONFIG_DEFAULT_DEVICE_TREE="cherryhill"
+CONFIG_TARGET_CHERRYHILL=y
+CONFIG_DEBUG_UART=y
+CONFIG_SMP=y
+CONFIG_GENERATE_MP_TABLE=y
+CONFIG_SYS_CONSOLE_INFO_QUIET=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CPU=y
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_DHCP=y
+# CONFIG_CMD_NFS is not set
+CONFIG_CMD_PING=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_ISO_PARTITION=y
+CONFIG_EFI_PARTITION=y
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_CPU=y
+CONFIG_RTL8169=y
+CONFIG_DEBUG_UART_BASE=0x3f8
+CONFIG_DEBUG_UART_CLOCK=1843200
+CONFIG_USB_STORAGE=y
+CONFIG_USB_KEYBOARD=y
index da247152a83deb49158bee4f7f535f4194ed0d2e..d7052a645c3b730470100f6aeef46790a5ab5954 100644 (file)
@@ -67,6 +67,7 @@ CONFIG_DEBUG_UART_CLOCK=1843200
 CONFIG_DEBUG_UART_BOARD_INIT=y
 CONFIG_SYS_NS16550=y
 CONFIG_SPL_TIMER=y
+CONFIG_TIMER_EARLY=y
 CONFIG_TPM_TIS_LPC=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
index aaabb22251bf16599431fc43dd79c32b3a2f7651..f22a03e1cbd78674a08b6948960ae5edc50be577 100644 (file)
@@ -49,6 +49,7 @@ CONFIG_DEBUG_UART_BASE=0x3f8
 CONFIG_DEBUG_UART_CLOCK=1843200
 CONFIG_DEBUG_UART_BOARD_INIT=y
 CONFIG_SYS_NS16550=y
+CONFIG_TIMER_EARLY=y
 CONFIG_TPM_TIS_LPC=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_KEYBOARD=y
index ba7d813d7e823ebd6a0094de555e838ae0d78f28..4df40d6dfdb28b0db7c771ee1e7ab50e1b979379 100644 (file)
@@ -3,6 +3,7 @@ CONFIG_ARM=y
 CONFIG_ARCH_OMAP2PLUS=y
 CONFIG_SYS_TEXT_BASE=0x80008000
 CONFIG_TARGET_CM_T3517=y
+CONFIG_EMIF4=y
 CONFIG_BOOTDELAY=3
 # CONFIG_CONSOLE_MUX is not set
 CONFIG_SYS_CONSOLE_IS_IN_ENV=y
index cb3726d6f59478d00bf8241564de8fb0707bd22b..27370e7c0c32623c8d820630fbff85edc87dc860 100644 (file)
@@ -1,12 +1,14 @@
 CONFIG_ARM=y
 CONFIG_ARCH_DAVINCI=y
 CONFIG_TARGET_DA850EVM=y
+CONFIG_TI_COMMON_CMD_OPTIONS=y
+CONFIG_MAC_ADDR_IN_EEPROM=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_SPI_FLASH_SUPPORT=y
 CONFIG_SPL_SPI_SUPPORT=y
-CONFIG_SYS_EXTRA_OPTIONS="DA850_AM18X_EVM,MAC_ADDR_IN_EEPROM,SYS_I2C_EEPROM_ADDR_LEN=2,SYS_I2C_EEPROM_ADDR=0x50"
+CONFIG_SYS_EXTRA_OPTIONS="DA850_AM18X_EVM,SYS_I2C_EEPROM_ADDR_LEN=2,SYS_I2C_EEPROM_ADDR=0x50"
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="mem=32M console=ttyS2,115200n8 root=/dev/mtdblock2 rw noinitrd ip=dhcp"
@@ -17,23 +19,24 @@ CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_SPL=y
 CONFIG_SPL_BOARD_INIT=y
 CONFIG_HUSH_PARSER=y
+# CONFIG_CMD_BOOTZ is not set
 # CONFIG_CMD_IMLS is not set
-CONFIG_CMD_ASKENV=y
 CONFIG_CRC32_VERIFY=y
+# CONFIG_CMD_EEPROM is not set
 # CONFIG_CMD_FLASH is not set
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_SPI=y
+# CONFIG_CMD_GPIO is not set
+# CONFIG_CMD_GPT is not set
+# CONFIG_CMD_I2C is not set
+# CONFIG_CMD_PART is not set
 # CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
+# CONFIG_CMD_TIME is not set
+# CONFIG_CMD_EXT4 is not set
+# CONFIG_CMD_FS_GENERIC is not set
 CONFIG_CMD_DIAG=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
+# CONFIG_FAT_WRITE is not set
 CONFIG_OF_LIBFDT=y
index ac542358b5a19c40d89e80cf9567edc10e833ac7..bfa5ea1c4bc6f8b089b6421599ea10c1735388ef 100644 (file)
@@ -1,12 +1,12 @@
 CONFIG_ARM=y
 CONFIG_ARCH_DAVINCI=y
 CONFIG_TARGET_DA850EVM=y
+CONFIG_TI_COMMON_CMD_OPTIONS=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_SPI_FLASH_SUPPORT=y
 CONFIG_SPL_SPI_SUPPORT=y
-CONFIG_SYS_EXTRA_OPTIONS="MAC_ADDR_IN_SPIFLASH"
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="mem=32M console=ttyS2,115200n8 root=/dev/mtdblock2 rw noinitrd ip=dhcp"
@@ -18,24 +18,23 @@ CONFIG_SPL=y
 CONFIG_SPL_BOARD_INIT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="U-Boot > "
-CONFIG_CMD_BOOTZ=y
 # CONFIG_CMD_IMLS is not set
-CONFIG_CMD_ASKENV=y
 CONFIG_CRC32_VERIFY=y
+# CONFIG_CMD_EEPROM is not set
 # CONFIG_CMD_FLASH is not set
-CONFIG_CMD_MMC=y
-CONFIG_CMD_SF=y
-CONFIG_CMD_SPI=y
+# CONFIG_CMD_GPIO is not set
+# CONFIG_CMD_GPT is not set
+# CONFIG_CMD_I2C is not set
+# CONFIG_CMD_PART is not set
 # CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_EXT2=y
-CONFIG_CMD_FAT=y
+# CONFIG_CMD_TIME is not set
+# CONFIG_CMD_EXT4 is not set
+# CONFIG_CMD_FS_GENERIC is not set
 CONFIG_CMD_DIAG=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SPI_FLASH=y
 CONFIG_SPI_FLASH_STMICRO=y
 CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_SYS_NS16550=y
+# CONFIG_FAT_WRITE is not set
 CONFIG_OF_LIBFDT=y
index 9c1ae37671d0aeade480ecdbf0731241b7571efe..24ab89224df17824ad0ac732b78af4179c4a8cfa 100644 (file)
@@ -1,7 +1,8 @@
 CONFIG_ARM=y
 CONFIG_ARCH_DAVINCI=y
 CONFIG_TARGET_DA850EVM=y
-CONFIG_SYS_EXTRA_OPTIONS="MAC_ADDR_IN_SPIFLASH,USE_NOR,DIRECT_NOR_BOOT"
+CONFIG_TI_COMMON_CMD_OPTIONS=y
+CONFIG_SYS_EXTRA_OPTIONS="USE_NOR,DIRECT_NOR_BOOT"
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="mem=32M console=ttyS2,115200n8 root=/dev/mtdblock2 rw noinitrd ip=dhcp"
@@ -11,13 +12,21 @@ CONFIG_VERSION_VARIABLE=y
 CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="U-Boot > "
-CONFIG_CMD_ASKENV=y
+# CONFIG_CMD_BOOTZ is not set
 CONFIG_CRC32_VERIFY=y
-CONFIG_CMD_SF=y
+# CONFIG_CMD_EEPROM is not set
+# CONFIG_CMD_GPIO is not set
+# CONFIG_CMD_GPT is not set
+# CONFIG_CMD_I2C is not set
+# CONFIG_CMD_MMC is not set
+# CONFIG_CMD_PART is not set
+# CONFIG_CMD_SPI is not set
 # CONFIG_CMD_SETEXPR is not set
-CONFIG_CMD_DHCP=y
-CONFIG_CMD_MII=y
-CONFIG_CMD_PING=y
+# CONFIG_CMD_TIME is not set
+# CONFIG_CMD_EXT2 is not set
+# CONFIG_CMD_EXT4 is not set
+# CONFIG_CMD_FAT is not set
+# CONFIG_CMD_FS_GENERIC is not set
 CONFIG_CMD_DIAG=y
 CONFIG_ENV_IS_IN_FLASH=y
 # CONFIG_MMC is not set
index e4bb299275d93ca9d246fc4c1614b8284945f829..53903bf7308498fe9129d585632193d0895fc8c1 100644 (file)
@@ -37,7 +37,7 @@ CONFIG_CMD_SPL=y
 CONFIG_ISO_PARTITION=y
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
-CONFIG_OF_LIST="dra7-evm dra72-evm dra72-evm-revc dra71-evm"
+CONFIG_OF_LIST="dra7-evm dra72-evm dra72-evm-revc dra71-evm dra76-evm"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
index f55fc501aa48186d788793fa4859606641f58d2e..06d883411906c16a599acaf2efc46f514f8113c4 100644 (file)
@@ -41,7 +41,7 @@ CONFIG_FASTBOOT_FLASH_MMC_DEV=1
 CONFIG_ISO_PARTITION=y
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
-CONFIG_OF_LIST="dra7-evm dra72-evm dra72-evm-revc dra71-evm"
+CONFIG_OF_LIST="dra7-evm dra72-evm dra72-evm-revc dra71-evm dra76-evm"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_DM=y
 CONFIG_SPL_DM=y
index ed329307b1f11ccfb201ab567abf2e98bdc2116e..2bf48e0199215a228678b6869890e45fc3cdd5b1 100644 (file)
@@ -3,6 +3,7 @@ CONFIG_ARM=y
 CONFIG_ARCH_OMAP2PLUS=y
 CONFIG_SYS_TEXT_BASE=0x80008000
 CONFIG_TARGET_ECO5PK=y
+CONFIG_EMIF4=y
 CONFIG_BOOTDELAY=10
 CONFIG_SPL=y
 # CONFIG_SPL_EXT_SUPPORT is not set
index ab4276ac8ccd9b36192cb1cdb324d93519a09359..7036f433eeebcdf2bacbbdec24b1f095251c102c 100644 (file)
@@ -5,8 +5,16 @@ CONFIG_TARGET_EVB_RV1108=y
 CONFIG_DEFAULT_DEVICE_TREE="rv1108-evb"
 CONFIG_DEBUG_UART=y
 # CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_FASTBOOT=y
+CONFIG_USB_FUNCTION_FASTBOOT=y
+CONFIG_CMD_FASTBOOT=y
+CONFIG_FASTBOOT_BUF_ADDR=0x62000000
+CONFIG_FASTBOOT_BUF_SIZE=0x08000000
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=1
 # CONFIG_CMD_IMLS is not set
 CONFIG_CMD_SF=y
+CONFIG_CMD_USB=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_TIME=y
@@ -26,6 +34,7 @@ CONFIG_ETH_DESIGNWARE=y
 CONFIG_GMAC_ROCKCHIP=y
 CONFIG_PINCTRL=y
 CONFIG_PINCTRL_ROCKCHIP_RV1108=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_BAUDRATE=1500000
 # CONFIG_SPL_SERIAL_PRESENT is not set
 CONFIG_DEBUG_UART_BASE=0x10210000
@@ -33,4 +42,16 @@ CONFIG_DEBUG_UART_CLOCK=24000000
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYSRESET=y
 CONFIG_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_GENERIC=y
+CONFIG_USB_DWC2=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_DWC2_OTG=y
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_G_DNL_MANUFACTURER="Rockchip"
+CONFIG_G_DNL_VENDOR_NUM=0x2207
+CONFIG_G_DNL_PRODUCT_NUM=0x110a
 CONFIG_ERRNO_STR=y
index 45a12a8b27a438c4bd2d5bae98fab06b1f8c6338..c7ee7b3f97f4fe4c7dceeab2b63a846d642962f3 100644 (file)
@@ -19,6 +19,11 @@ CONFIG_FIT=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_SPL_LOAD_FIT=y
 CONFIG_SPL_FIT_SOURCE="board/theobroma-systems/lion_rk3368/fit_spl_atf.its"
+CONFIG_BOOTSTAGE=y
+CONFIG_SPL_BOOTSTAGE=y
+CONFIG_BOOTSTAGE_REPORT=y
+CONFIG_BOOTSTAGE_FDT=y
+CONFIG_ENV_IS_IN_MMC=y
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_ARCH_EARLY_INIT_R=y
 CONFIG_SPL=y
@@ -37,10 +42,12 @@ CONFIG_TPL_DRIVERS_MISC_SUPPORT=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_MMC=y
 CONFIG_CMD_SF=y
+CONFIG_CMD_BOOTSTAGE=y
 CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_MTDPARTS=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_TPL_OF_CONTROL=y
+CONFIG_OF_LIVE=y
 CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names interrupt-parent"
 CONFIG_TPL_OF_PLATDATA=y
 CONFIG_ENV_IS_IN_MMC=y
diff --git a/configs/ls1088aqds_qspi_defconfig b/configs/ls1088aqds_qspi_defconfig
new file mode 100644 (file)
index 0000000..4b0d604
--- /dev/null
@@ -0,0 +1,33 @@
+CONFIG_ARM=y
+CONFIG_TARGET_LS1088AQDS=y
+# CONFIG_SYS_MALLOC_F is not set
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_DEFAULT_DEVICE_TREE="fsl-ls1088a-qds"
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4, QSPI_BOOT"
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_I2C=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_OF_CONTROL=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_DM=y
+CONFIG_SPI_FLASH=y
+CONFIG_NETDEVICES=y
+CONFIG_E1000=y
+CONFIG_PCI=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_PCIE_LAYERSCAPE=y
+CONFIG_SYS_NS16550=y
+CONFIG_FSL_DSPI=y
+CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
+# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_FSL_LS_PPA=y
diff --git a/configs/ls1088ardb_qspi_defconfig b/configs/ls1088ardb_qspi_defconfig
new file mode 100644 (file)
index 0000000..2d5a134
--- /dev/null
@@ -0,0 +1,33 @@
+CONFIG_ARM=y
+CONFIG_TARGET_LS1088ARDB=y
+# CONFIG_SYS_MALLOC_F is not set
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_DEFAULT_DEVICE_TREE="fsl-ls1088a-rdb"
+CONFIG_FIT=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4, QSPI_BOOT"
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_I2C=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_OF_CONTROL=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_DM=y
+CONFIG_SPI_FLASH=y
+CONFIG_NETDEVICES=y
+CONFIG_E1000=y
+CONFIG_PCI=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_PCIE_LAYERSCAPE=y
+CONFIG_SYS_NS16550=y
+CONFIG_FSL_DSPI=y
+CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
+# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_FSL_LS_PPA=y
diff --git a/configs/ls2088ardb_qspi_SECURE_BOOT_defconfig b/configs/ls2088ardb_qspi_SECURE_BOOT_defconfig
new file mode 100644 (file)
index 0000000..05c799d
--- /dev/null
@@ -0,0 +1,48 @@
+CONFIG_ARM=y
+CONFIG_TARGET_LS2080ARDB=y
+CONFIG_FSL_LS_PPA=y
+CONFIG_QSPI_AHB_INIT=y
+CONFIG_DEFAULT_DEVICE_TREE="fsl-ls2088a-rdb-qspi"
+# CONFIG_SYS_MALLOC_F is not set
+CONFIG_FIT_VERBOSE=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_STDOUT_VIA_ALIAS=y
+CONFIG_QSPI_BOOT=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_BOOTDELAY=10
+# CONFIG_CMD_IMLS is not set
+CONFIG_CMD_GREPENV=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_CACHE=y
+CONFIG_OF_CONTROL=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_DM=y
+CONFIG_FSL_CAAM=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_PHYLIB=y
+CONFIG_NETDEVICES=y
+CONFIG_PHY_GIGE=y
+CONFIG_E1000=y
+CONFIG_PCI=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_PCIE_LAYERSCAPE=y
+CONFIG_SYS_NS16550=y
+CONFIG_DM_SPI=y
+CONFIG_FSL_DSPI=y
+CONFIG_FSL_QSPI=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_STORAGE=y
+CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_SECURE_BOOT=y
+CONFIG_RSA=y
+CONFIG_RSA_SOFTWARE_EXP=y
index 0d8c109fbcf1827032ab16ebc43b866933994577..cbe76b624f09c6f81c01212b9e0cb5b784a4cb99 100644 (file)
@@ -8,7 +8,7 @@ CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_SPI_FLASH_SUPPORT=y
 CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4"
+CONFIG_SYS_EXTRA_OPTIONS=""
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS3,115200"
index c36cef8fd4b908d63cfd4f0fc399a0c832729d22..972cb637f591fae455f5981622f721cc65cf95ab 100644 (file)
@@ -4,6 +4,7 @@ CONFIG_ARCH_OMAP2PLUS=y
 CONFIG_SYS_TEXT_BASE=0x80008000
 # CONFIG_SPL_GPIO_SUPPORT is not set
 CONFIG_TARGET_MCX=y
+CONFIG_EMIF4=y
 CONFIG_VIDEO=y
 CONFIG_BOOTDELAY=3
 # CONFIG_CONSOLE_MUX is not set
index 09580e7b32b9f980905d754f65b13f2370233624..316e4f0b8432334ccc493ca44236569d5a9ea79d 100644 (file)
@@ -3,6 +3,7 @@ CONFIG_ARM=y
 CONFIG_ARCH_OMAP2PLUS=y
 CONFIG_SYS_TEXT_BASE=0x80008000
 CONFIG_TARGET_MT_VENTOUX=y
+CONFIG_EMIF4=y
 CONFIG_VIDEO=y
 CONFIG_BOOTDELAY=10
 # CONFIG_CONSOLE_MUX is not set
index 0e49e69c8cd5e48f5d1f5cb9850a257ae91cd355..ad5d4485398f7f896cd71bb5e5e357f0fec8ada5 100644 (file)
@@ -18,6 +18,9 @@ CONFIG_SPL=y
 CONFIG_SPL_EXT_SUPPORT=y
 CONFIG_SPL_I2C_SUPPORT=y
 CONFIG_SPL_OS_BOOT=y
+CONFIG_SPL_USB_HOST_SUPPORT=y
+CONFIG_SPL_USB_GADGET_SUPPORT=y
+CONFIG_SPL_USB_SDP_SUPPORT=y
 CONFIG_HUSH_PARSER=y
 CONFIG_CMD_BOOTZ=y
 # CONFIG_CMD_IMLS is not set
@@ -31,6 +34,7 @@ CONFIG_CMD_PART=y
 CONFIG_CMD_PCI=y
 CONFIG_CMD_SF=y
 CONFIG_CMD_USB=y
+CONFIG_CMD_USB_SDP=y
 CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
index 8d0a4d48e4157e3abdd970431a80eb214782a792..b8f25883d8de14b26d6f1eb072b64c8d6bf5080f 100644 (file)
@@ -26,7 +26,6 @@ CONFIG_CMD_SPL_NAND_OFS=0x240000
 # CONFIG_CMD_FPGA is not set
 CONFIG_CMD_NAND=y
 CONFIG_CMD_NAND_LOCK_UNLOCK=y
-# CONFIG_CMD_USB is not set
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_UBI=y
 CONFIG_ISO_PARTITION=y
@@ -43,7 +42,9 @@ CONFIG_SYS_NAND_U_BOOT_OFFS=0x80000
 CONFIG_SYS_NS16550=y
 CONFIG_OMAP3_SPI=y
 CONFIG_USB=y
+CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_MUSB_GADGET=y
+CONFIG_USB_STORAGE=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_G_DNL_MANUFACTURER="TI"
index 1badf80beb48da91d214d3afa4ce99da180dc4e0..2ab2516c018426f60d567076624f35dc0aa0ecbb 100644 (file)
@@ -35,6 +35,7 @@ CONFIG_CMD_TIME=y
 CONFIG_CMD_PMIC=y
 CONFIG_CMD_REGULATOR=y
 CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_LIVE=y
 CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_REGMAP=y
diff --git a/configs/sama5d27_som1_ek_mmc_defconfig b/configs/sama5d27_som1_ek_mmc_defconfig
new file mode 100644 (file)
index 0000000..18d5113
--- /dev/null
@@ -0,0 +1,88 @@
+CONFIG_ARM=y
+CONFIG_ARCH_AT91=y
+CONFIG_TARGET_SAMA5D27_SOM1_EK=y
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SPL_MMC_SUPPORT=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_SPL_LIBDISK_SUPPORT=y
+CONFIG_SPL_FAT_SUPPORT=y
+CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d27_som1_ek"
+CONFIG_DEBUG_UART=y
+CONFIG_FIT=y
+CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2"
+CONFIG_SD_BOOT=y
+CONFIG_BOOTDELAY=3
+# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_SPL=y
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_I2C=y
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SF=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_FAT=y
+CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_SPL_REMOVE_PROPS="interrupts interrupt-parent dmas dma-names"
+CONFIG_ENV_IS_IN_FAT=y
+CONFIG_DM=y
+CONFIG_SPL_DM=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
+CONFIG_CLK_AT91=y
+CONFIG_AT91_UTMI=y
+CONFIG_AT91_H32MX=y
+CONFIG_AT91_GENERIC_CLK=y
+CONFIG_DM_GPIO=y
+CONFIG_ATMEL_PIO4=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_AT91=y
+CONFIG_I2C_EEPROM=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_ATMEL=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_MACRONIX=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_SST=y
+CONFIG_DM_ETH=y
+CONFIG_MACB=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+CONFIG_PINCTRL_AT91PIO4=y
+CONFIG_DM_SERIAL=y
+CONFIG_DEBUG_UART_ATMEL=y
+CONFIG_DEBUG_UART_BASE=0xf8020000
+CONFIG_DEBUG_UART_CLOCK=82000000
+CONFIG_DEBUG_UART_BOARD_INIT=y
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_ATMEL_USART=y
+CONFIG_DM_SPI=y
+CONFIG_ATMEL_SPI=y
+CONFIG_TIMER=y
+CONFIG_SPL_TIMER=y
+CONFIG_ATMEL_PIT_TIMER=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_ATMEL_USBA=y
+CONFIG_DM_VIDEO=y
+CONFIG_ATMEL_HLCD=y
index bca3ac2fcbfc37102586db2af10e6af5689f941a..3f1eb906488bd7a99598454dfe218cef5e9d4a1f 100644 (file)
@@ -6,7 +6,7 @@ CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_NAND_SUPPORT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,57600 earlyprintk mtdparts=atmel_nand:6M(bootstrap)ro, 6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=2 root=ubi0:rootfs"
index e4fb49f6627d50db81b68bb1ea059772cae60e65..ad62f47063e8369f78c98f94c0b066b119d93531 100644 (file)
@@ -7,7 +7,7 @@ CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_SPI_FLASH_SUPPORT=y
 CONFIG_SPL_SPI_SUPPORT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2,SYS_USE_SERIALFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,57600 earlyprintk mtdparts=atmel_nand:6M(bootstrap)ro, 6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=2 root=ubi0:rootfs"
index dc4d991512799b643a7cf56be00d1938bb0d7860..215961a65c0deb882cc496f9e7b51ff4fb70b19a 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d2_xplained"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
 CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk1p2 rw rootwait"
@@ -51,6 +52,7 @@ CONFIG_DM_GPIO=y
 CONFIG_ATMEL_PIO4=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_AT91=y
+CONFIG_I2C_EEPROM=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ATMEL=y
index c64b8b8e3bd862360e948306fc39fde2d6b7877f..869d405838e55e5dedbdb0ae5d7464a6eaef6829 100644 (file)
@@ -12,7 +12,7 @@ CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d2_xplained"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D2,SYS_USE_SERIALFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
@@ -49,6 +49,7 @@ CONFIG_DM_GPIO=y
 CONFIG_ATMEL_PIO4=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_AT91=y
+CONFIG_I2C_EEPROM=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ATMEL=y
index e517a38377f4923fdf58885edb84ba3fcf3f87db..b6c60cbcae69340b229ad3c51710882e3a1b0e40 100644 (file)
@@ -5,7 +5,7 @@ CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="sama5d36ek_cmp"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D3,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
index c02cc04bc26d801d6076c8c98c91ea730d966d0c..01b57efe03da530de16229930de6ed167bb4ac08 100644 (file)
@@ -5,7 +5,7 @@ CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="sama5d36ek_cmp"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D3,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
index fd2ce15bb7f97cb1140bb9884a8e382034e8622f..e29e3a809811fc1d8108d234d52ea2c06afb5ca1 100644 (file)
@@ -5,7 +5,7 @@ CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="sama5d36ek_cmp"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D3,SYS_USE_SERIALFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
index 99c4d5a808ab40986a33aaf5b8d59fe05a1e1024..b30968d9cc383d2ce150ff615496681538339e37 100644 (file)
@@ -13,7 +13,7 @@ CONFIG_SPL_FAT_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d3_xplained"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D3,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
index 904c31b27dae2df7093d6a2e66a2f1f20d5706f8..65af64f797492853aa94fd2889ff3ec9403bd4d5 100644 (file)
@@ -11,7 +11,7 @@ CONFIG_SPL_NAND_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d3_xplained"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D3,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
index afb7a51febbe53188ab419cd41d3b9b55836544c..f45449fd93f6514fb3ac4f564245b29083939b2e 100644 (file)
@@ -13,7 +13,7 @@ CONFIG_SPL_FAT_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="sama5d36ek"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D3,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
index 6bc0f5169866701665f3aa453ba83d9f23b82ec5..6217600f01d2941513d9de23c1945554b1f738b6 100644 (file)
@@ -11,7 +11,7 @@ CONFIG_SPL_NAND_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="sama5d36ek"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D3,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
index c225e09111e18da756c82a559b9c92a760cd76a3..2fe08e4e59a30f07b67b9ac86a1313a27beb1ebc 100644 (file)
@@ -12,7 +12,7 @@ CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="sama5d36ek"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D3,SYS_USE_SERIALFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
index 0c2b63dab91f157bcaf6bd6daa33216a774f7cc5..dabbf605c5a928b5bb01ecd9e30cd8d1cf12de48 100644 (file)
@@ -13,7 +13,7 @@ CONFIG_SPL_FAT_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d4_xplained"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
@@ -47,6 +47,9 @@ CONFIG_AT91_UTMI=y
 CONFIG_AT91_H32MX=y
 CONFIG_DM_GPIO=y
 CONFIG_AT91_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_AT91=y
+CONFIG_I2C_EEPROM=y
 CONFIG_DM_MMC=y
 CONFIG_GENERIC_ATMEL_MCI=y
 CONFIG_DM_SPI_FLASH=y
index 3a2dcb12b9888d85f353a733195be29556968146..85157878cdab5962b236d1f3bac5569cb71bdd66 100644 (file)
@@ -11,7 +11,7 @@ CONFIG_SPL_NAND_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d4_xplained"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
@@ -44,6 +44,9 @@ CONFIG_AT91_UTMI=y
 CONFIG_AT91_H32MX=y
 CONFIG_DM_GPIO=y
 CONFIG_AT91_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_AT91=y
+CONFIG_I2C_EEPROM=y
 CONFIG_DM_MMC=y
 CONFIG_GENERIC_ATMEL_MCI=y
 CONFIG_DM_SPI_FLASH=y
index d82a4cddf2aaf98a5fb865f77c4344f9c9c03ea7..4061720b3a835a43696c7db9819f67e17f7d65ae 100644 (file)
@@ -12,7 +12,7 @@ CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d4_xplained"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4,SYS_USE_SERIALFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
@@ -46,6 +46,9 @@ CONFIG_AT91_UTMI=y
 CONFIG_AT91_H32MX=y
 CONFIG_DM_GPIO=y
 CONFIG_AT91_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_AT91=y
+CONFIG_I2C_EEPROM=y
 CONFIG_DM_MMC=y
 CONFIG_GENERIC_ATMEL_MCI=y
 CONFIG_DM_SPI_FLASH=y
index 10c8d0965e742ebf19c26c17f8876eb207dffa84..aaa5855b220617e9dc6d55787ebaecedb352949b 100644 (file)
@@ -13,7 +13,7 @@ CONFIG_SPL_FAT_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d4ek"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4,SYS_USE_MMC"
+CONFIG_SD_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
index 39ff60db8b86e74afe65f60423fbe43e0a408607..901d17bfa337f50c1a40491cb866fe7d8d7bebd1 100644 (file)
@@ -11,7 +11,7 @@ CONFIG_SPL_NAND_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d4ek"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4,SYS_USE_NANDFLASH"
+CONFIG_NAND_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
index 4f848b91753f671830e1aa7fe070bb9b84596e25..535031024b31f3ddc2afac67d764ef1cc42113db 100644 (file)
@@ -12,7 +12,7 @@ CONFIG_SPL_SPI_SUPPORT=y
 CONFIG_DEFAULT_DEVICE_TREE="at91-sama5d4ek"
 CONFIG_DEBUG_UART=y
 CONFIG_FIT=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4,SYS_USE_SERIALFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk mtdparts=atmel_nand:256k(bootstrap)ro,512k(uboot)ro,256K(env),256k(env_redundant),256k(spare),512k(dtb),6M(kernel)ro,-(rootfs) rootfstype=ubifs ubi.mtd=7 root=ubi0:rootfs"
index 4c4e4809be764e6e23b03d2eb6f94a5c37f8c0d7..310b8acc293a35bfea9a99dea2ebb2e758f9be5c 100644 (file)
@@ -7,7 +7,6 @@ CONFIG_FIT_SIGNATURE=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_BOOTSTAGE=y
 CONFIG_BOOTSTAGE_REPORT=y
-CONFIG_BOOTSTAGE_USER_COUNT=32
 CONFIG_BOOTSTAGE_FDT=y
 CONFIG_BOOTSTAGE_STASH=y
 CONFIG_BOOTSTAGE_STASH_ADDR=0x0
@@ -34,6 +33,7 @@ CONFIG_CMD_MX_CYCLIC=y
 CONFIG_CMD_DEMO=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
+CONFIG_CMD_GPT_RENAME=y
 CONFIG_CMD_IDE=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_PCI=y
@@ -189,7 +189,9 @@ CONFIG_CMD_DHRYSTONE=y
 CONFIG_TPM=y
 CONFIG_LZ4=y
 CONFIG_ERRNO_STR=y
+CONFIG_OF_LIBFDT_OVERLAY=y
 CONFIG_UNIT_TEST=y
 CONFIG_UT_TIME=y
 CONFIG_UT_DM=y
 CONFIG_UT_ENV=y
+CONFIG_UT_OVERLAY=y
index 325f4ff57f46901ecd66b8b07e2f24acf8aba8ac..50ea35e64bc72b7f09ddb5e31514e39ad0addf24 100644 (file)
@@ -7,7 +7,6 @@ CONFIG_FIT_SIGNATURE=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_BOOTSTAGE=y
 CONFIG_BOOTSTAGE_REPORT=y
-CONFIG_BOOTSTAGE_USER_COUNT=32
 CONFIG_BOOTSTAGE_FDT=y
 CONFIG_BOOTSTAGE_STASH=y
 CONFIG_BOOTSTAGE_STASH_ADDR=0x0
index e152917fe43132d23b71c2dd4dfd8c5545b42440..693c14bc60034c070c8311ad694dbfaad9ee73c6 100644 (file)
@@ -6,7 +6,6 @@ CONFIG_FIT_SIGNATURE=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_BOOTSTAGE=y
 CONFIG_BOOTSTAGE_REPORT=y
-CONFIG_BOOTSTAGE_USER_COUNT=32
 CONFIG_BOOTSTAGE_FDT=y
 CONFIG_BOOTSTAGE_STASH=y
 CONFIG_BOOTSTAGE_STASH_ADDR=0x0
index be4a85da331256af9f412477aa400cf16dbcd4f4..db9129456bfad9c359977c5fd2a3672d12e83386 100644 (file)
@@ -13,7 +13,6 @@ CONFIG_FIT_VERBOSE=y
 CONFIG_SPL_LOAD_FIT=y
 CONFIG_BOOTSTAGE=y
 CONFIG_BOOTSTAGE_REPORT=y
-CONFIG_BOOTSTAGE_USER_COUNT=32
 CONFIG_BOOTSTAGE_FDT=y
 CONFIG_BOOTSTAGE_STASH=y
 CONFIG_BOOTSTAGE_STASH_ADDR=0x0
index b862a1475148a5ec2ec3d24b2a72e26a82a066cf..a7991afae29a8369f0b6e699c315511a0fb20552 100644 (file)
@@ -2,6 +2,7 @@ CONFIG_ARM=y
 CONFIG_ARCH_ROCKCHIP=y
 CONFIG_SYS_MALLOC_F_LEN=0x1000
 CONFIG_ROCKCHIP_RK3368=y
+CONFIG_TARGET_SHEEP=y
 CONFIG_DEFAULT_DEVICE_TREE="rk3368-sheep"
 CONFIG_DEBUG_UART=y
 CONFIG_ANDROID_BOOT_IMAGE=y
@@ -14,6 +15,7 @@ CONFIG_CLK=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_ROCKCHIP=y
 CONFIG_PINCTRL=y
+CONFIG_PINCTRL_ROCKCHIP_RK3368=y
 CONFIG_RAM=y
 CONFIG_DEBUG_UART_BASE=0xFF1b0000
 CONFIG_DEBUG_UART_CLOCK=24000000
index 7bbf78188dba5e1b286652c3cf425298e2854515..53edadb6481153aabdbae7a237b712ec8bd4633e 100644 (file)
@@ -3,6 +3,7 @@ CONFIG_ARM=y
 CONFIG_ARCH_OMAP2PLUS=y
 CONFIG_SYS_TEXT_BASE=0x80008000
 CONFIG_TARGET_TWISTER=y
+CONFIG_EMIF4=y
 CONFIG_BOOTDELAY=10
 CONFIG_SPL=y
 # CONFIG_SPL_EXT_SUPPORT is not set
diff --git a/configs/uniphier_pro4_defconfig b/configs/uniphier_pro4_defconfig
deleted file mode 100644 (file)
index 7348675..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-CONFIG_ARM=y
-CONFIG_ARCH_UNIPHIER=y
-CONFIG_SYS_TEXT_BASE=0x84000000
-CONFIG_SYS_MALLOC_F_LEN=0x2000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL_NAND_SUPPORT=y
-CONFIG_MICRO_SUPPORT_CARD=y
-CONFIG_DEFAULT_DEVICE_TREE="uniphier-pro4-ref"
-# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
-CONFIG_SPL=y
-CONFIG_SPL_NOR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_CONFIG=y
-CONFIG_CMD_BOOTZ=y
-# CONFIG_CMD_XIMG is not set
-# CONFIG_CMD_ENV_EXISTS is not set
-# CONFIG_CMD_FPGA is not set
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_GPT=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_TIME=y
-# CONFIG_CMD_MISC is not set
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
-# CONFIG_SPL_DOS_PARTITION is not set
-# CONFIG_SPL_EFI_PARTITION is not set
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_GPIO_UNIPHIER=y
-CONFIG_MISC=y
-CONFIG_I2C_EEPROM=y
-CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS=10
-CONFIG_MMC_UNIPHIER=y
-CONFIG_NAND=y
-CONFIG_NAND_DENALI=y
-CONFIG_NAND_DENALI_DT=y
-CONFIG_SYS_NAND_DENALI_64BIT=y
-CONFIG_NAND_DENALI_SPARE_AREA_SKIP_BYTES=8
-CONFIG_SPL_NAND_DENALI=y
-CONFIG_USB=y
-CONFIG_USB_XHCI_HCD=y
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_EHCI_GENERIC=y
-CONFIG_USB_STORAGE=y
diff --git a/configs/uniphier_pxs2_ld6b_defconfig b/configs/uniphier_pxs2_ld6b_defconfig
deleted file mode 100644 (file)
index c242776..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-CONFIG_ARM=y
-CONFIG_ARCH_UNIPHIER=y
-CONFIG_SYS_TEXT_BASE=0x84000000
-CONFIG_SYS_MALLOC_F_LEN=0x2000
-CONFIG_SPL_MMC_SUPPORT=y
-CONFIG_SPL_SERIAL_SUPPORT=y
-CONFIG_SPL_NAND_SUPPORT=y
-CONFIG_ARCH_UNIPHIER_PRO5_PXS2_LD6B=y
-CONFIG_MICRO_SUPPORT_CARD=y
-CONFIG_DEFAULT_DEVICE_TREE="uniphier-pxs2-vodka"
-# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
-CONFIG_SPL=y
-CONFIG_SPL_NOR_SUPPORT=y
-CONFIG_HUSH_PARSER=y
-CONFIG_CMD_CONFIG=y
-CONFIG_CMD_BOOTZ=y
-# CONFIG_CMD_XIMG is not set
-# CONFIG_CMD_ENV_EXISTS is not set
-# CONFIG_CMD_FPGA is not set
-CONFIG_CMD_GPIO=y
-CONFIG_CMD_GPT=y
-CONFIG_CMD_I2C=y
-CONFIG_CMD_MMC=y
-CONFIG_CMD_USB=y
-CONFIG_CMD_TFTPPUT=y
-CONFIG_CMD_PING=y
-CONFIG_CMD_CACHE=y
-CONFIG_CMD_TIME=y
-# CONFIG_CMD_MISC is not set
-CONFIG_CMD_FAT=y
-CONFIG_CMD_FS_GENERIC=y
-# CONFIG_SPL_DOS_PARTITION is not set
-# CONFIG_SPL_EFI_PARTITION is not set
-CONFIG_NET_RANDOM_ETHADDR=y
-CONFIG_GPIO_UNIPHIER=y
-CONFIG_MISC=y
-CONFIG_I2C_EEPROM=y
-CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS=10
-CONFIG_MMC_UNIPHIER=y
-CONFIG_NAND=y
-CONFIG_NAND_DENALI=y
-CONFIG_NAND_DENALI_DT=y
-CONFIG_SYS_NAND_DENALI_64BIT=y
-CONFIG_NAND_DENALI_SPARE_AREA_SKIP_BYTES=8
-CONFIG_SPL_NAND_DENALI=y
-CONFIG_USB=y
-CONFIG_USB_XHCI_HCD=y
-CONFIG_USB_STORAGE=y
diff --git a/configs/uniphier_v7_defconfig b/configs/uniphier_v7_defconfig
new file mode 100644 (file)
index 0000000..3c25484
--- /dev/null
@@ -0,0 +1,50 @@
+CONFIG_ARM=y
+CONFIG_ARCH_UNIPHIER=y
+CONFIG_SYS_TEXT_BASE=0x84000000
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_SPL_MMC_SUPPORT=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_NAND_SUPPORT=y
+CONFIG_ARCH_UNIPHIER_V7_MULTI=y
+CONFIG_MICRO_SUPPORT_CARD=y
+CONFIG_DEFAULT_DEVICE_TREE="uniphier-pxs2-vodka"
+# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
+CONFIG_SPL=y
+CONFIG_SPL_NOR_SUPPORT=y
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_CONFIG=y
+CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_ENV_EXISTS is not set
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_TFTPPUT=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
+# CONFIG_CMD_MISC is not set
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+# CONFIG_SPL_DOS_PARTITION is not set
+# CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_GPIO_UNIPHIER=y
+CONFIG_MISC=y
+CONFIG_I2C_EEPROM=y
+CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS=10
+CONFIG_MMC_UNIPHIER=y
+CONFIG_NAND=y
+CONFIG_NAND_DENALI=y
+CONFIG_NAND_DENALI_DT=y
+CONFIG_SYS_NAND_DENALI_64BIT=y
+CONFIG_NAND_DENALI_SPARE_AREA_SKIP_BYTES=8
+CONFIG_SPL_NAND_DENALI=y
+CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_GENERIC=y
+CONFIG_USB_STORAGE=y
index 2cd4466a08e5fb84f140b02d831598020e863049..18eb1736779cb6eb2e9882b093eb737ba70de1b5 100644 (file)
@@ -1,7 +1,7 @@
 CONFIG_ARM=y
 CONFIG_ARCH_AT91=y
 CONFIG_TARGET_VINCO=y
-CONFIG_SYS_EXTRA_OPTIONS="SAMA5D4,SYS_USE_SERIALFLASH"
+CONFIG_SPI_BOOT=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_BOOTARGS=y
 CONFIG_BOOTARGS="console=ttyS0,115200 earlyprintk rw root=/dev/mmcblk0p2 rootfstype=ext4 rootwait quiet lpj=1990656"
diff --git a/configs/vyasa-rk3288_defconfig b/configs/vyasa-rk3288_defconfig
new file mode 100644 (file)
index 0000000..7db7b0b
--- /dev/null
@@ -0,0 +1,63 @@
+CONFIG_ARM=y
+CONFIG_ARCH_ROCKCHIP=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_ROCKCHIP_RK3288=y
+CONFIG_TARGET_VYASA_RK3288=y
+CONFIG_SPL_STACK_R_ADDR=0x80000
+CONFIG_DEFAULT_DEVICE_TREE="rk3288-vyasa"
+CONFIG_DEBUG_UART=y
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SILENT_CONSOLE=y
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_SPL_STACK_R=y
+CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN=0x2000
+# CONFIG_CMD_IMLS is not set
+CONFIG_CMD_GPT=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_GPIO=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
+# CONFIG_SPL_DOS_PARTITION is not set
+# CONFIG_SPL_ISO_PARTITION is not set
+# CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_SPL_PARTITION_UUIDS=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
+CONFIG_REGMAP=y
+CONFIG_SPL_REGMAP=y
+CONFIG_SYSCON=y
+CONFIG_SPL_SYSCON=y
+# CONFIG_SPL_SIMPLE_BUS is not set
+CONFIG_CLK=y
+CONFIG_SPL_CLK=y
+CONFIG_ROCKCHIP_GPIO=y
+CONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_LED=y
+CONFIG_LED_GPIO=y
+CONFIG_MMC_DW=y
+CONFIG_MMC_DW_ROCKCHIP=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+# CONFIG_SPL_PINCTRL_FULL is not set
+CONFIG_PINCTRL_ROCKCHIP_RK3288=y
+CONFIG_DM_PMIC=y
+# CONFIG_SPL_PMIC_CHILDREN is not set
+CONFIG_PMIC_RK8XX=y
+CONFIG_REGULATOR_RK8XX=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_PWM_ROCKCHIP=y
+CONFIG_RAM=y
+CONFIG_SPL_RAM=y
+CONFIG_DEBUG_UART_BASE=0xff690000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_DEBUG_UART_SHIFT=2
+CONFIG_SYS_NS16550=y
+CONFIG_SYSRESET=y
+CONFIG_CONSOLE_SCROLL_LINES=10
+CONFIG_USE_TINY_PRINTF=y
+CONFIG_CMD_DHRYSTONE=y
+CONFIG_ERRNO_STR=y
index c67fdacc79257f12b64583de2bd845cb98445151..aa9183d696406ab28c882100907e603d1e5d71aa 100644 (file)
@@ -331,6 +331,24 @@ int part_get_info(struct blk_desc *dev_desc, int part,
        return -1;
 }
 
+int part_get_info_whole_disk(struct blk_desc *dev_desc, disk_partition_t *info)
+{
+       info->start = 0;
+       info->size = dev_desc->lba;
+       info->blksz = dev_desc->blksz;
+       info->bootable = 0;
+       strcpy((char *)info->type, BOOT_PART_TYPE);
+       strcpy((char *)info->name, "Whole Disk");
+#if CONFIG_IS_ENABLED(PARTITION_UUIDS)
+       info->uuid[0] = 0;
+#endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+       info->type_guid[0] = 0;
+#endif
+
+       return 0;
+}
+
 int blk_get_device_by_str(const char *ifname, const char *dev_hwpart_str,
                          struct blk_desc **dev_desc)
 {
@@ -523,18 +541,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
 
                (*dev_desc)->log2blksz = LOG2((*dev_desc)->blksz);
 
-               info->start = 0;
-               info->size = (*dev_desc)->lba;
-               info->blksz = (*dev_desc)->blksz;
-               info->bootable = 0;
-               strcpy((char *)info->type, BOOT_PART_TYPE);
-               strcpy((char *)info->name, "Whole Disk");
-#if CONFIG_IS_ENABLED(PARTITION_UUIDS)
-               info->uuid[0] = 0;
-#endif
-#ifdef CONFIG_PARTITION_TYPE_GUID
-               info->type_guid[0] = 0;
-#endif
+               part_get_info_whole_disk(*dev_desc, info);
 
                ret = 0;
                goto cleanup;
diff --git a/doc/README.fdt-overlays b/doc/README.fdt-overlays
new file mode 100644 (file)
index 0000000..39139cb
--- /dev/null
@@ -0,0 +1,114 @@
+U-Boot FDT Overlay usage
+=============================================
+
+Overlays Syntax
+---------------
+
+Overlays require slightly different syntax compared to traditional overlays.
+Please refer to dt-object-internal.txt in the dtc sources for information
+regarding the internal format of overlays:
+https://git.kernel.org/pub/scm/utils/dtc/dtc.git/tree/Documentation/dt-object-internal.txt
+
+Building Overlays
+-----------------
+
+In a nutshell overlays provides a means to manipulate a symbol a previous dtb
+or overlay has defined. It requires both the base and all the overlays
+to be compiled with the -@ command line switch so that symbol information is
+included.
+
+Note support for -@ option can only be found in dtc version 1.4.4 or newer.
+Only version 4.14 or higher of the Linux kernel includes a built in version
+of dtc that meets this requirement.
+
+Building an overlay follows the same process as building a traditional dtb.
+
+For example:
+
+base.dts
+--------
+
+       /dts-v1/;
+       / {
+               foo: foonode {
+                       foo-property;
+               };
+       };
+
+       $ dtc -@ -I dts -O dtb -o base.dtb base.dts
+
+bar.dts
+-------
+
+       /dts-v1/;
+       /plugin/;
+       / {
+               fragment@1 {
+                       target = <&foo>;
+                       __overlay__ {
+                               overlay-1-property;
+                               bar: barnode {
+                                       bar-property;
+                               };
+                       };
+               };
+       };
+
+       $ dtc -@ -I dts -O dtb -o bar.dtb bar.dts
+
+Ways to Utilize Overlays in U-boot
+----------------------------------
+
+There are two ways to apply overlays in U-boot.
+1. Include and define overlays within a FIT image and have overlays
+   automatically applied.
+
+2. Manually load and apply overlays
+
+The remainder of this document will discuss using overlays via the manual
+approach. For information on using overlays as part of a FIT image please see:
+doc/uImage.FIT/overlay-fdt-boot.txt
+
+Manually Loading and Applying Overlays
+--------------------------------------
+
+1. Figure out where to place both the base device tree blob and the
+overlay. Make sure you have enough space to grow the base tree without
+overlapping anything.
+
+=> setenv fdtaddr 0x87f00000
+=> setenv fdtovaddr 0x87fc0000
+
+2. Load the base blob and overlay blobs
+
+=> load ${devtype} ${bootpart} ${fdtaddr} ${bootdir}/base.dtb
+=> load ${devtype} ${bootpart} ${fdtovaddr} ${bootdir}/overlay.dtb
+
+3. Set it as the working fdt tree.
+
+=> fdtaddr $fdtaddr
+
+4. Grow it enough so it can 'fit' all the applied overlays
+
+=> fdt resize 8192
+
+5. You are now ready to apply the overlay.
+
+=> fdt apply $fdtovaddr
+
+6. Boot system like you would do with a traditional dtb.
+
+For bootm:
+
+=> bootm ${kerneladdr} - ${fdtaddr}
+
+For bootz:
+
+=> bootz ${kerneladdr} - ${fdtaddr}
+
+Please note that in case of an error, both the base and overlays are going
+to be invalidated, so keep copies to avoid reloading.
+
+Pantelis Antoniou
+pantelis.antoniou@konsulko.com
+11/7/2017
index fa1f9bcc966773838a944f6c1f93703b930cc86a..e4fd9a3e3fc98c5d1061b309a11dd26ff187cd10 100644 (file)
@@ -27,17 +27,17 @@ The following tables show <defconfig> and <device-tree> for each board.
 
 32bit SoC boards:
 
- Board         | <defconfig>                  | <device-tree>
----------------|------------------------------|------------------------------
-LD4 reference  | uniphier_ld4_sld8_defconfig  | uniphier-ld4-ref (default)
-sld8 reference | uniphier_ld4_sld8_defconfig  | uniphier-sld8-def
-Pro4 reference | uniphier_pro4_defconfig      | uniphier-pro4-ref (default)
-Pro4 Ace       | uniphier_pro4_defconfig      | uniphier-pro4-ace
-Pro4 Sanji     | uniphier_pro4_defconfig      | uniphier-pro4-sanji
-Pro5 4KBOX     | uniphier_pxs2_ld6b_defconfig | uniphier-pro5-4kbox
-PXs2 Gentil    | uniphier_pxs2_ld6b_defconfig | uniphier-pxs2-gentil
-PXs2 Vodka     | uniphier_pxs2_ld6b_defconfig | uniphier-pxs2-vodka (default)
-LD6b reference | uniphier_pxs2_ld6b_defconfig | uniphier-ld6b-ref
+ Board         | <defconfig>                 | <device-tree>
+---------------|-----------------------------|------------------------------
+LD4 reference  | uniphier_ld4_sld8_defconfig | uniphier-ld4-ref (default)
+sld8 reference | uniphier_ld4_sld8_defconfig | uniphier-sld8-def
+Pro4 reference | uniphier_v7_defconfig       | uniphier-pro4-ref
+Pro4 Ace       | uniphier_v7_defconfig       | uniphier-pro4-ace
+Pro4 Sanji     | uniphier_v7_defconfig       | uniphier-pro4-sanji
+Pro5 4KBOX     | uniphier_v7_defconfig       | uniphier-pro5-4kbox
+PXs2 Gentil    | uniphier_v7_defconfig       | uniphier-pxs2-gentil
+PXs2 Vodka     | uniphier_v7_defconfig       | uniphier-pxs2-vodka (default)
+LD6b reference | uniphier_v7_defconfig       | uniphier-ld6b-ref
 
 64bit SoC boards:
 
@@ -47,17 +47,18 @@ LD11 reference | uniphier_v8_defconfig | uniphier-ld11-ref
 LD11 Global    | uniphier_v8_defconfig | uniphier-ld11-global
 LD20 reference | uniphier_v8_defconfig | uniphier-ld20-ref (default)
 LD20 Global    | uniphier_v8_defconfig | uniphier-ld20-global
+PXs3 reference | uniphier_v8_defconfig | uniphier-pxs3-ref
 
 For example, to compile the source for PXs2 Vodka board, run the following:
 
-    $ make uniphier_pxs2_ld6b_defconfig
+    $ make uniphier_v7_defconfig
     $ make CROSS_COMPILE=arm-linux-gnueabihf- DEVICE_TREE=uniphier-pxs2-vodka
 
 The device tree marked as (default) can be omitted.  `uniphier-pxs2-vodka` is
-the default device tree for the configuration `uniphier_pxs2_ld6b_defconfig`,
-so the following gives the same result.
+the default device tree for the configuration `uniphier_v7_defconfig`, so the
+following gives the same result.
 
-    $ make uniphier_pxs2_ld6b_defconfig
+    $ make uniphier_v7_defconfig
     $ make CROSS_COMPILE=arm-linux-gnueabihf-
 
 
@@ -178,4 +179,4 @@ newer SoCs.  Even if it is, EA[25] is not connected on most of the boards.
 
 --
 Masahiro Yamada <yamada.masahiro@socionext.com>
-Jul. 2017
+Sep. 2017
index c542a6965c34b61883a57a31d8f1c9c84562fa6a..c96a22cb08d8ba4a594c94a136285b5098b0029f 100644 (file)
@@ -26,6 +26,7 @@ In this case, known as bare mode, from the fact that it runs on the
 are supported:
 
    - Bayley Bay CRB
+   - Cherry Hill CRB
    - Congatec QEVAL 2.0 & conga-QA3/E3845
    - Cougar Canyon 2 CRB
    - Crown Bay CRB
@@ -332,6 +333,35 @@ the default value 0xfffc0000.
 
 ---
 
+Intel Cherry Hill specific instructions for bare mode:
+
+This uses Intel FSP for Braswell platform. Download it from Intel FSP website,
+put the .fd file to the board directory and rename it to fsp.bin.
+
+Extract descriptor.bin and me.bin from the original BIOS on the board using
+ifdtool and put them to the board directory as well.
+
+Note the FSP package for Braswell does not ship a traditional legacy VGA BIOS
+image for the integrated graphics device. Instead a new binary called Video
+BIOS Table (VBT) is shipped. Put it to the board directory and rename it to
+vbt.bin if you want graphics support in U-Boot.
+
+Now you can build U-Boot and obtain u-boot.rom
+
+$ make cherryhill_defconfig
+$ make all
+
+An important note for programming u-boot.rom to the on-board SPI flash is that
+you need make sure the SPI flash's 'quad enable' bit in its status register
+matches the settings in the descriptor.bin, otherwise the board won't boot.
+
+For the on-board SPI flash MX25U6435F, this can be done by writing 0x40 to the
+status register by DediProg in: Config > Modify Status Register > Write Status
+Register(s) > Register1 Value(Hex). This is is a one-time change. Once set, it
+persists in SPI flash part regardless of the u-boot.rom image burned.
+
+---
+
 Intel Galileo instructions for bare mode:
 
 Only one binary blob is needed for Remote Management Unit (RMU) within Intel
diff --git a/doc/bounces b/doc/bounces
new file mode 100644 (file)
index 0000000..d1c5f0d
--- /dev/null
@@ -0,0 +1,3 @@
+# List of addresses picked up by patman/get_maintainer.pl that are known to
+# bounce. Addresses are listed one per line and need to match the author
+# information recorded in git.
index 3ed8c759d691d925c8c7a9be703c17bc59ca6970..732bc34f067d5736456123c9c11988f0ba8ecae3 100644 (file)
@@ -111,7 +111,7 @@ struct dtd_rockchip_rk3288_dw_mshc {
         bool            cap_sd_highspeed;
         fdt32_t         card_detect_delay;
         fdt32_t         clock_freq_min_max[2];
-        struct phandle_2_cell clocks[4];
+        struct phandle_1_arg clocks[4];
         bool            disable_wp;
         fdt32_t         fifo_depth;
         fdt32_t         interrupts[3];
index 6c99b1c1594432a0e4622819ccd3f5bb23edc346..676f992f9044ba53c7dca01497c00a2fe11e628c 100644 (file)
@@ -36,7 +36,7 @@ Old uImage:
 New uImage:
 8.  bootm <addr1>
 9.  bootm [<addr1>]:<subimg1>
-10. bootm [<addr1>]#<conf>
+10. bootm [<addr1>]#<conf>[#<extra-conf[#...]]
 11. bootm [<addr1>]:<subimg1> [<addr2>]:<subimg2>
 12. bootm [<addr1>]:<subimg1> [<addr2>]:<subimg2> [<addr3>]:<subimg3>
 13. bootm [<addr1>]:<subimg1> [<addr2>]:<subimg2> <addr3>
@@ -129,6 +129,12 @@ following syntax:
 - new uImage configuration specification
 <addr>#<configuration unit_name>
 
+- new uImage configuration specification with extra configuration components
+<addr>#<configuration unit_name>[#<extra configuration unit_name>[#..]]
+
+The extra configuration currently is supported only for additional device tree
+overlays to apply on the base device tree supplied by the first configuration
+unit.
 
 Examples:
 
@@ -138,6 +144,10 @@ bootm 200000:kernel@1
 - boot configuration "cfg@1" from a new uImage located at 200000:
 bootm 200000#cfg@1
 
+- boot configuration "cfg@1" with extra "cfg@2" from a new uImage located
+  at 200000:
+bootm 200000#cfg@1#cfg@2
+
 - boot "kernel@1" from a new uImage at 200000 with initrd "ramdisk@2" found in
   some other new uImage stored at address 800000:
 bootm 200000:kernel@1 800000:ramdisk@2
index e5551d42b70c55103d6cfd5efdbb8119fc3a3ee0..d43563d87a2a6a4f14c4bd494ae41d3226afbe57 100644 (file)
@@ -4,6 +4,13 @@
  * (Bogus) example FIT image description file demonstrating the usage
  * of multiple images loaded by the SPL.
  * Several binaries will be loaded at their respective load addresses.
+ *
+ * For booting U-Boot, "firmware" is searched first. If not found, "loadables"
+ * is used to identify images to be loaded into memory. If falcon boot is
+ * enabled, "kernel" is searched first. If not found, it falls back to the
+ * same flow as booting U-Boot. Changing image type will result skipping
+ * specific image.
+ *
  * Finally the one image specifying an entry point will be entered by the SPL.
  */
 
diff --git a/doc/uImage.FIT/overlay-fdt-boot.txt b/doc/uImage.FIT/overlay-fdt-boot.txt
new file mode 100644 (file)
index 0000000..63e47da
--- /dev/null
@@ -0,0 +1,225 @@
+U-Boot FDT Overlay FIT usage
+============================
+
+Introduction
+------------
+In many cases it is desirable to have a single FIT image support a multitude
+of similar boards and their expansion options. The same kernel on DT enabled
+platforms can support this easily enough by providing a DT blob upon boot
+that matches the desired configuration.
+
+This document focuses on specifically using overlays as part of a FIT image.
+General information regarding overlays including its syntax and building it
+can be found in doc/README.fdt-overlays
+
+Configuration without overlays
+------------------------------
+
+Take a hypothetical board named 'foo' where there are different supported
+revisions, reva and revb. Assume that both board revisions can use add a bar
+add-on board, while only the revb board can use a baz add-on board.
+
+Without using overlays the configuration would be as follows for every case.
+
+       /dts-v1/;
+       / {
+               images {
+                       kernel@1 {
+                               data = /incbin/("./zImage");
+                               type = "kernel";
+                               arch = "arm";
+                               os = "linux";
+                               load = <0x82000000>;
+                               entry = <0x82000000>;
+                       };
+                       fdt@1 {
+                               data = /incbin/("./foo-reva.dtb");
+                               type = "flat_dt";
+                               arch = "arm";
+                       };
+                       fdt@2 {
+                               data = /incbin/("./foo-revb.dtb");
+                               type = "flat_dt";
+                               arch = "arm";
+                       };
+                       fdt@3 {
+                               data = /incbin/("./foo-reva-bar.dtb");
+                               type = "flat_dt";
+                               arch = "arm";
+                       };
+                       fdt@4 {
+                               data = /incbin/("./foo-revb-bar.dtb");
+                               type = "flat_dt";
+                               arch = "arm";
+                       };
+                       fdt@5 {
+                               data = /incbin/("./foo-revb-baz.dtb");
+                               type = "flat_dt";
+                               arch = "arm";
+                       };
+                       fdt@6 {
+                               data = /incbin/("./foo-revb-bar-baz.dtb");
+                               type = "flat_dt";
+                               arch = "arm";
+                       };
+               };
+
+               configurations {
+                       default = "foo-reva.dtb;
+                       foo-reva.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@1";
+                       };
+                       foo-revb.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@2";
+                       };
+                       foo-reva-bar.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@3";
+                       };
+                       foo-revb-bar.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@4";
+                       };
+                       foo-revb-baz.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@5";
+                       };
+                       foo-revb-bar-baz.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@6";
+                       };
+               };
+       };
+
+Note the blob needs to be compiled for each case and the combinatorial explosion of
+configurations. A typical device tree blob is in the low hunderds of kbytes so a
+multitude of configuration grows the image quite a bit.
+
+Booting this image is done by using
+
+       # bootm <addr>#<config>
+
+Where config is one of:
+       foo-reva.dtb, foo-revb.dtb, foo-reva-bar.dtb, foo-revb-bar.dtb,
+       foo-revb-baz.dtb, foo-revb-bar-baz.dtb
+
+This selects the DTB to use when booting.
+
+Configuration using overlays
+----------------------------
+
+Device tree overlays can be applied to a base DT and result in the same blob
+being passed to the booting kernel. This saves on space and avoid the combinatorial
+explosion problem.
+
+       /dts-v1/;
+       / {
+               images {
+                       kernel@1 {
+                               data = /incbin/("./zImage");
+                               type = "kernel";
+                               arch = "arm";
+                               os = "linux";
+                               load = <0x82000000>;
+                               entry = <0x82000000>;
+                       };
+                       fdt@1 {
+                               data = /incbin/("./foo.dtb");
+                               type = "flat_dt";
+                               arch = "arm";
+                               load = <0x87f00000>;
+                       };
+                       fdt@2 {
+                               data = /incbin/("./reva.dtbo");
+                               type = "flat_dt";
+                               arch = "arm";
+                               load = <0x87fc0000>;
+                       };
+                       fdt@3 {
+                               data = /incbin/("./revb.dtbo");
+                               type = "flat_dt";
+                               arch = "arm";
+                               load = <0x87fc0000>;
+                       };
+                       fdt@4 {
+                               data = /incbin/("./bar.dtbo");
+                               type = "flat_dt";
+                               arch = "arm";
+                               load = <0x87fc0000>;
+                       };
+                       fdt@5 {
+                               data = /incbin/("./baz.dtbo");
+                               type = "flat_dt";
+                               arch = "arm";
+                               load = <0x87fc0000>;
+                       };
+               };
+
+               configurations {
+                       default = "foo-reva.dtb;
+                       foo-reva.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@1", "fdt@2";
+                       };
+                       foo-revb.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@1", "fdt@3";
+                       };
+                       foo-reva-bar.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@1", "fdt@2", "fdt@4";
+                       };
+                       foo-revb-bar.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@1", "fdt@3", "fdt@4";
+                       };
+                       foo-revb-baz.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@1", "fdt@3", "fdt@5";
+                       };
+                       foo-revb-bar-baz.dtb {
+                               kernel = "kernel@1";
+                               fdt = "fdt@1", "fdt@3", "fdt@4", "fdt@5";
+                       };
+                       bar {
+                               fdt = "fdt@4";
+                       };
+                       baz {
+                               fdt = "fdt@5";
+                       };
+               };
+       };
+
+Booting this image is exactly the same as the non-overlay example.
+u-boot will retrieve the base blob and apply the overlays in sequence as
+they are declared in the configuration.
+
+Note the minimum amount of different DT blobs, as well as the requirement for
+the DT blobs to have a load address; the overlay application requires the blobs
+to be writeable.
+
+Configuration using overlays and feature selection
+--------------------------------------------------
+
+Although the configuration in the previous section works is a bit inflexible
+since it requires all possible configuration options to be laid out before
+hand in the FIT image. For the add-on boards the extra config selection method
+might make sense.
+
+Note the two bar & baz configuration nodes. To boot a reva board with
+the bar add-on board enabled simply use:
+
+       # bootm <addr>#foo-reva.dtb#bar
+
+While booting a revb with bar and baz is as follows:
+
+       # bootm <addr>#foo-revb.dtb#bar#baz
+
+The limitation for a feature selection configuration node is that a single
+fdt option is currently supported.
+
+Pantelis Antoniou
+pantelis.antoniou@konsulko.com
+12/6/2017
index 136d3d7078eed79a7c4e68109e955974efb8b2c8..6f727a1e8a2fe7d91f4af7d7ed4a9170a9369e01 100644 (file)
@@ -235,7 +235,7 @@ o config@1
   |- description = "configuration description"
   |- kernel = "kernel sub-node unit name"
   |- ramdisk = "ramdisk sub-node unit name"
-  |- fdt = "fdt sub-node unit-name"
+  |- fdt = "fdt sub-node unit-name" [, "fdt overlay sub-node unit-name", ...]
   |- fpga = "fpga sub-node unit-name"
   |- loadables = "loadables sub-node unit-name"
 
@@ -249,7 +249,9 @@ o config@1
   - ramdisk : Unit name of the corresponding ramdisk image (component image
     node of a "ramdisk" type).
   - fdt : Unit name of the corresponding fdt blob (component image node of a
-    "fdt type").
+    "fdt type"). Additional fdt overlay nodes can be supplied which signify
+    that the resulting device tree blob is generated by the first base fdt
+    blob with all subsequent overlays applied.
   - setup : Unit name of the corresponding setup binary (used for booting
     an x86 kernel). This contains the setup.bin file built by the kernel.
   - fpga : Unit name of the corresponding fpga bitstream blob
@@ -288,6 +290,10 @@ The 'data-offset' property can be substituted with 'data-position', which
 defines an absolute position or address as the offset. This is helpful when
 booting U-Boot proper before performing relocation.
 
+Normal kernel FIT image has data embedded within FIT structure. U-Boot image
+for SPL boot has external data. Existence of 'data-offset' can be used to
+identify which format is used.
+
 9) Examples
 -----------
 
index a226ca2decb5977747c495878678e70182ab658b..2f3b2ddb411f13724f673bbb25ed710cec7216fd 100644 (file)
@@ -26,6 +26,7 @@
 #include <command.h>
 #include <pci.h>
 #include <asm/processor.h>
+#include <linux/dma-direction.h>
 #include <linux/errno.h>
 #include <asm/io.h>
 #include <malloc.h>
index e2d9e0c1fce8556690552d706bf07478bf607a71..17fb20cf437b1aca4794450e200b4e7231331de0 100644 (file)
@@ -401,13 +401,6 @@ struct ata_device {
 #endif
 };
 
-enum dma_data_direction {
-       DMA_BIDIRECTIONAL = 0,
-       DMA_TO_DEVICE = 1,
-       DMA_FROM_DEVICE = 2,
-       DMA_NONE = 3,
-};
-
 struct ata_link {
        struct ata_port         *ap;
        int                     pmp;
index 3c5a87b60a8f385cee652254ddb983f177aa9db4..537cf5f0bbcb0d6122c247dcf09c326ee701add9 100644 (file)
@@ -294,9 +294,6 @@ ulong blk_read_devnum(enum if_type if_type, int devnum, lbaint_t start,
        if (IS_ERR_VALUE(n))
                return n;
 
-       /* flush cache after read */
-       flush_cache((ulong)buffer, blkcnt * desc->blksz);
-
        return n;
 }
 
@@ -546,7 +543,7 @@ static int blk_claim_devnum(enum if_type if_type, int devnum)
 
 int blk_create_device(struct udevice *parent, const char *drv_name,
                      const char *name, int if_type, int devnum, int blksz,
-                     lbaint_t size, struct udevice **devp)
+                     lbaint_t lba, struct udevice **devp)
 {
        struct blk_desc *desc;
        struct udevice *dev;
@@ -567,7 +564,7 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
        desc = dev_get_uclass_platdata(dev);
        desc->if_type = if_type;
        desc->blksz = blksz;
-       desc->lba = size / blksz;
+       desc->lba = lba;
        desc->part_type = PART_TYPE_UNKNOWN;
        desc->bdev = dev;
        desc->devnum = devnum;
@@ -578,7 +575,7 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
 
 int blk_create_devicef(struct udevice *parent, const char *drv_name,
                       const char *name, int if_type, int devnum, int blksz,
-                      lbaint_t size, struct udevice **devp)
+                      lbaint_t lba, struct udevice **devp)
 {
        char dev_name[30], *str;
        int ret;
@@ -589,7 +586,7 @@ int blk_create_devicef(struct udevice *parent, const char *drv_name,
                return -ENOMEM;
 
        ret = blk_create_device(parent, drv_name, str, if_type, devnum,
-                               blksz, size, devp);
+                               blksz, lba, devp);
        if (ret) {
                free(str);
                return ret;
index 981872ecb35cd516087effc09ffd6b30e21886cd..16d3bfe7f28262f20955ca783d23e1d38d292ffd 100644 (file)
@@ -232,9 +232,6 @@ ulong blk_read_devnum(enum if_type if_type, int devnum, lbaint_t start,
        if (IS_ERR_VALUE(n))
                return n;
 
-       /* flush cache after read */
-       flush_cache((ulong)buffer, blkcnt * desc->blksz);
-
        return n;
 }
 
index 34d1c638bc7788755f10b76154e513ae1ec3c806..98df6b33b6e51a2486cee5dd0f00da547540dc2d 100644 (file)
@@ -129,7 +129,7 @@ int host_dev_bind(int devnum, char *filename)
        }
        ret = blk_create_device(gd->dm_root, "sandbox_host_blk", str,
                                IF_TYPE_HOST, devnum, 512,
-                               os_lseek(fd, 0, OS_SEEK_END), &dev);
+                               os_lseek(fd, 0, OS_SEEK_END) / 512, &dev);
        if (ret)
                goto err_file;
        ret = device_probe(dev);
index fa87b5e7b948cc398fc413711ffea47be94a4bb4..17829beaa237194d474906989cbb4017dac0f88d 100644 (file)
@@ -18,9 +18,9 @@ void bootcount_store(ulong a)
                (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR;
 
        /*
-        * write RTC kick register to enable write
-        * for RTC Scratch registers. Scratch0 and 1 are
-        * used for bootcount values.
+        * write RTC kick registers to enable write
+        * for RTC Scratch registers. Scratch register 2 is
+        * used for bootcount value.
         */
        writel(RTC_KICK0R_WE, &reg->kick0r);
        writel(RTC_KICK1R_WE, &reg->kick1r);
index 7765148876d9613f6de1546da13d621aed26315a..baa60a52e6877484ac7cb24ae3b2466fb5f9c10a 100644 (file)
@@ -12,7 +12,7 @@ config CLK
 
 config SPL_CLK
        bool "Enable clock support in SPL"
-       depends on CLK && SPL_DM
+       depends on CLK && SPL && SPL_DM
        help
          The clock subsystem adds a small amount of overhead to the image.
          If this is acceptable and you have a need to use clock drivers in
index 904ed48e51e0f071629afb9b41042d7765891cbb..c6c57618c149a2fc514d687c64ea76805688eb30 100644 (file)
@@ -14,7 +14,11 @@ config CLK_AT91
 
 config AT91_UTMI
        bool "Support UTMI PLL Clock"
-       depends on CLK_AT91
+       depends on CLK_AT91 && SPL_DM
+       select REGMAP
+       select SPL_REGMAP
+       select SYSCON
+       select SPL_SYSCON
        help
          This option is used to enable the AT91 UTMI PLL clock
          driver. It is the clock provider of USB, and UPLLCK is the
index af5362da4205a7f42088319edf2917895501b8af..875bf293f9cdd637ccf47955a3733a4592a0f8d0 100644 (file)
@@ -8,23 +8,80 @@
 #include <common.h>
 #include <clk-uclass.h>
 #include <dm.h>
+#include <syscon.h>
 #include <linux/io.h>
 #include <mach/at91_pmc.h>
+#include <mach/sama5_sfr.h>
 #include "pmc.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define UTMI_FIXED_MUL         40
+/*
+ * The purpose of this clock is to generate a 480 MHz signal. A different
+ * rate can't be configured.
+ */
+#define UTMI_RATE      480000000
 
 static int utmi_clk_enable(struct clk *clk)
 {
        struct pmc_platdata *plat = dev_get_platdata(clk->dev);
        struct at91_pmc *pmc = plat->reg_base;
+       struct clk clk_dev;
+       ulong clk_rate;
+       u32 utmi_ref_clk_freq;
        u32 tmp;
+       int err;
 
        if (readl(&pmc->sr) & AT91_PMC_LOCKU)
                return 0;
 
+       /*
+        * If mainck rate is different from 12 MHz, we have to configure the
+        * FREQ field of the SFR_UTMICKTRIM register to generate properly
+        * the utmi clock.
+        */
+       err = clk_get_by_index(clk->dev, 0, &clk_dev);
+       if (err)
+               return -EINVAL;
+
+       clk_rate = clk_get_rate(&clk_dev);
+       switch (clk_rate) {
+       case 12000000:
+               utmi_ref_clk_freq = 0;
+               break;
+       case 16000000:
+               utmi_ref_clk_freq = 1;
+               break;
+       case 24000000:
+               utmi_ref_clk_freq = 2;
+               break;
+       /*
+        * Not supported on SAMA5D2 but it's not an issue since MAINCK
+        * maximum value is 24 MHz.
+        */
+       case 48000000:
+               utmi_ref_clk_freq = 3;
+               break;
+       default:
+               printf("UTMICK: unsupported mainck rate\n");
+               return -EINVAL;
+       }
+
+       if (plat->regmap_sfr) {
+               err = regmap_read(plat->regmap_sfr, AT91_SFR_UTMICKTRIM, &tmp);
+               if (err)
+                       return -EINVAL;
+
+               tmp &= ~AT91_UTMICKTRIM_FREQ;
+               tmp |= utmi_ref_clk_freq;
+               err = regmap_write(plat->regmap_sfr, AT91_SFR_UTMICKTRIM, tmp);
+               if (err)
+                       return -EINVAL;
+       } else if (utmi_ref_clk_freq) {
+               printf("UTMICK: sfr node required\n");
+               return -EINVAL;
+       }
+
        tmp = readl(&pmc->uckr);
        tmp |= AT91_PMC_UPLLEN |
               AT91_PMC_UPLLCOUNT |
@@ -39,7 +96,8 @@ static int utmi_clk_enable(struct clk *clk)
 
 static ulong utmi_clk_get_rate(struct clk *clk)
 {
-       return gd->arch.main_clk_rate_hz * UTMI_FIXED_MUL;
+       /* UTMI clk rate is fixed. */
+       return UTMI_RATE;
 }
 
 static struct clk_ops utmi_clk_ops = {
@@ -47,6 +105,20 @@ static struct clk_ops utmi_clk_ops = {
        .get_rate = utmi_clk_get_rate,
 };
 
+static int utmi_clk_ofdata_to_platdata(struct udevice *dev)
+{
+       struct pmc_platdata *plat = dev_get_platdata(dev);
+       struct udevice *syscon;
+
+       uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
+                                    "regmap-sfr", &syscon);
+
+       if (syscon)
+               plat->regmap_sfr = syscon_get_regmap(syscon);
+
+       return 0;
+}
+
 static int utmi_clk_probe(struct udevice *dev)
 {
        return at91_pmc_core_probe(dev);
@@ -62,6 +134,7 @@ U_BOOT_DRIVER(at91sam9x5_utmi_clk) = {
        .id = UCLASS_CLK,
        .of_match = utmi_clk_match,
        .probe = utmi_clk_probe,
+       .ofdata_to_platdata = utmi_clk_ofdata_to_platdata,
        .platdata_auto_alloc_size = sizeof(struct pmc_platdata),
        .ops = &utmi_clk_ops,
 };
index bd3caba48d1d9bc0b92bb55e286f1daf771e1919..5abda764a221b6eca86503b527f33383524fc6b6 100644 (file)
@@ -8,8 +8,11 @@
 #ifndef __AT91_PMC_H__
 #define __AT91_PMC_H__
 
+#include <regmap.h>
+
 struct pmc_platdata {
        struct at91_pmc *reg_base;
+       struct regmap *regmap_sfr;
 };
 
 int at91_pmc_core_probe(struct udevice *dev);
index e68d9279b96322737e14125d25d65ae029688e30..83ba13374c78a36acb25c45107c781df82a40925 100644 (file)
@@ -23,7 +23,7 @@ static inline struct clk_ops *clk_dev_ops(struct udevice *dev)
 #if CONFIG_IS_ENABLED(OF_CONTROL)
 # if CONFIG_IS_ENABLED(OF_PLATDATA)
 int clk_get_by_index_platdata(struct udevice *dev, int index,
-                             struct phandle_2_cell *cells, struct clk *clk)
+                             struct phandle_1_arg *cells, struct clk *clk)
 {
        int ret;
 
@@ -32,7 +32,7 @@ int clk_get_by_index_platdata(struct udevice *dev, int index,
        ret = uclass_get_device(UCLASS_CLK, 0, &clk->dev);
        if (ret)
                return ret;
-       clk->id = cells[0].id;
+       clk->id = cells[0].arg[0];
 
        return 0;
 }
index 2be1f572d7212a166cf96680fb26b71464d360ba..e2747816b9c7752f5f96eef4c518d4df6f878b54 100644 (file)
@@ -471,7 +471,7 @@ static int rk3368_clk_probe(struct udevice *dev)
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
        struct rk3368_clk_plat *plat = dev_get_platdata(dev);
 
-       priv->cru = map_sysmem(plat->dtd.reg[1], plat->dtd.reg[3]);
+       priv->cru = map_sysmem(plat->dtd.reg[0], plat->dtd.reg[1]);
 #endif
 #if IS_ENABLED(CONFIG_SPL_BUILD) || IS_ENABLED(CONFIG_TPL_BUILD)
        rkclk_init(priv->cru);
@@ -485,7 +485,7 @@ static int rk3368_clk_ofdata_to_platdata(struct udevice *dev)
 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
        struct rk3368_clk_priv *priv = dev_get_priv(dev);
 
-       priv->cru = (struct rk3368_cru *)devfdt_get_addr(dev);
+       priv->cru = dev_read_addr_ptr(dev);
 #endif
 
        return 0;
index 3edafea140073a5f7c53df3af07a956cb195ae8f..9d963be5529a74a85767519b82e39a0a8c931dc5 100644 (file)
@@ -950,9 +950,24 @@ static ulong rk3399_clk_set_rate(struct clk *clk, ulong rate)
        return ret;
 }
 
+static int rk3399_clk_enable(struct clk *clk)
+{
+       switch (clk->id) {
+       case HCLK_HOST0:
+       case HCLK_HOST0_ARB:
+       case HCLK_HOST1:
+       case HCLK_HOST1_ARB:
+               return 0;
+       }
+
+       debug("%s: unsupported clk %ld\n", __func__, clk->id);
+       return -ENOENT;
+}
+
 static struct clk_ops rk3399_clk_ops = {
        .get_rate = rk3399_clk_get_rate,
        .set_rate = rk3399_clk_set_rate,
+       .enable = rk3399_clk_enable,
 };
 
 static int rk3399_clk_probe(struct udevice *dev)
@@ -963,7 +978,7 @@ static int rk3399_clk_probe(struct udevice *dev)
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
        struct rk3399_clk_plat *plat = dev_get_platdata(dev);
 
-       priv->cru = map_sysmem(plat->dtd.reg[1], plat->dtd.reg[3]);
+       priv->cru = map_sysmem(plat->dtd.reg[0], plat->dtd.reg[1]);
 #endif
        rkclk_init(priv->cru);
 #endif
@@ -975,7 +990,7 @@ static int rk3399_clk_ofdata_to_platdata(struct udevice *dev)
 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
        struct rk3399_clk_priv *priv = dev_get_priv(dev);
 
-       priv->cru = (struct rk3399_cru *)devfdt_get_addr(dev);
+       priv->cru = dev_read_addr_ptr(dev);
 #endif
        return 0;
 }
@@ -1145,7 +1160,7 @@ static int rk3399_pmuclk_probe(struct udevice *dev)
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
        struct rk3399_pmuclk_plat *plat = dev_get_platdata(dev);
 
-       priv->pmucru = map_sysmem(plat->dtd.reg[1], plat->dtd.reg[3]);
+       priv->pmucru = map_sysmem(plat->dtd.reg[0], plat->dtd.reg[1]);
 #endif
 
 #ifndef CONFIG_SPL_BUILD
@@ -1159,7 +1174,7 @@ static int rk3399_pmuclk_ofdata_to_platdata(struct udevice *dev)
 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
        struct rk3399_pmuclk_priv *priv = dev_get_priv(dev);
 
-       priv->pmucru = (struct rk3399_pmucru *)devfdt_get_addr(dev);
+       priv->pmucru = dev_read_addr_ptr(dev);
 #endif
        return 0;
 }
index c3e109e7ed11c78632516c11e1ac78ca7f4b0e73..6c6b9444530b7f2e137d9f8c0a788c1cf0492bfc 100644 (file)
@@ -14,12 +14,10 @@ static void show_devices(struct udevice *dev, int depth, int last_flag)
 {
        int i, is_last;
        struct udevice *child;
-       char class_name[12];
 
        /* print the first 11 characters to not break the tree-format. */
-       strlcpy(class_name, dev->uclass->uc_drv->name, sizeof(class_name));
-       printf(" %-11s [ %c ]    ", class_name,
-              dev->flags & DM_FLAG_ACTIVATED ? '+' : ' ');
+       printf(" %-10.10s [ %c ]   %-10.10s  ", dev->uclass->uc_drv->name,
+              dev->flags & DM_FLAG_ACTIVATED ? '+' : ' ', dev->driver->name);
 
        for (i = depth; i >= 0; i--) {
                is_last = (last_flag >> i) & 1;
@@ -50,7 +48,7 @@ void dm_dump_all(void)
 
        root = dm_root();
        if (root) {
-               printf(" Class       Probed   Name\n");
+               printf(" Class      Probed  Driver      Name\n");
                printf("----------------------------------------\n");
                show_devices(root, -1, 0);
        }
index 0685b689d8467061aaa4ed6081538558eaa9fe98..c6ca13fabf1f7fbf1ab462d89a400057f89c98e7 100644 (file)
@@ -390,10 +390,11 @@ int ofnode_decode_display_timing(ofnode parent, int index,
        if (!ofnode_valid(timings))
                return -EINVAL;
 
-       for (i = 0, node = ofnode_first_subnode(timings);
-            ofnode_valid(node) && i != index;
-            node = ofnode_first_subnode(node))
-               i++;
+       i = 0;
+       ofnode_for_each_subnode(node, timings) {
+               if (i++ == index)
+                       break;
+       }
 
        if (!ofnode_valid(node))
                return -EINVAL;
index 6acb33388f560e5f9e828a99193b8a99861442ca..065589a6abcfa00de066fcad7d11c7197092e2d4 100644 (file)
@@ -57,6 +57,13 @@ fdt_addr_t dev_read_addr(struct udevice *dev)
        return dev_read_addr_index(dev, 0);
 }
 
+void *dev_read_addr_ptr(struct udevice *dev)
+{
+       fdt_addr_t addr = dev_read_addr(dev);
+
+       return (addr == FDT_ADDR_T_NONE) ? NULL : (void *)addr;
+}
+
 fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property,
                                fdt_size_t *sizep)
 {
index d4e16a27ef345fc078d3bb258e1d409bd959edaf..0f1d30820c693ac6def8a01650b62ac63541908c 100644 (file)
@@ -40,7 +40,7 @@ static struct regmap *regmap_alloc_count(int count)
 }
 
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
-int regmap_init_mem_platdata(struct udevice *dev, u32 *reg, int count,
+int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count,
                             struct regmap **mapp)
 {
        struct regmap_range *range;
index d691d6ff947c905453e410e391b8cc9bb7e12445..757d109e57a37399cafb5091273cf726759ce07d 100644 (file)
@@ -312,8 +312,38 @@ int dm_scan_fdt(const void *blob, bool pre_reloc_only)
 #endif
        return dm_scan_fdt_node(gd->dm_root, blob, 0, pre_reloc_only);
 }
+#else
+static int dm_scan_fdt_node(struct udevice *parent, const void *blob,
+                           int offset, bool pre_reloc_only)
+{
+       return 0;
+}
 #endif
 
+int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only)
+{
+       int node, ret;
+
+       ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
+       if (ret) {
+               debug("dm_scan_fdt() failed: %d\n", ret);
+               return ret;
+       }
+
+       /* bind fixed-clock */
+       node = ofnode_to_offset(ofnode_path("/clocks"));
+       /* if no DT "clocks" node, no need to go further */
+       if (node < 0)
+               return ret;
+
+       ret = dm_scan_fdt_node(gd->dm_root, gd->fdt_blob, node,
+                              pre_reloc_only);
+       if (ret)
+               debug("dm_scan_fdt_node() failed: %d\n", ret);
+
+       return ret;
+}
+
 __weak int dm_scan_other(bool pre_reloc_only)
 {
        return 0;
@@ -335,9 +365,9 @@ int dm_init_and_scan(bool pre_reloc_only)
        }
 
        if (CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)) {
-               ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
+               ret = dm_extended_scan_fdt(gd->fdt_blob, pre_reloc_only);
                if (ret) {
-                       debug("dm_scan_fdt() failed: %d\n", ret);
+                       debug("dm_extended_scan_dt() failed: %d\n", ret);
                        return ret;
                }
        }
index 0a305b36b8b1a71ad0f9853bb1b4aab3b51d4586..d6e6e78de3241fbbb52c4412edd886827b126a08 100644 (file)
@@ -390,7 +390,7 @@ void fsl_ddr_sync_memctl_refresh(unsigned int first_ctrl,
 
 void remove_unused_controllers(fsl_ddr_info_t *info)
 {
-#ifdef CONFIG_FSL_LSCH3
+#ifdef CONFIG_SYS_FSL_HAS_CCN504
        int i;
        u64 nodeid;
        void *hnf_sam_ctrl = (void *)(CCI_HN_F_0_BASE + CCN_HN_F_SAM_CTL);
index 6f7366acbad4d02f60919c5f08cf9a693b5e1a10..11fc3e26bd761a04cf998876df48bfb475bcbac7 100644 (file)
@@ -103,8 +103,7 @@ static int rockchip_gpio_probe(struct udevice *dev)
        char *end;
        int ret;
 
-       /* This only supports RK3288 at present */
-       priv->regs = (struct rockchip_gpio_regs *)devfdt_get_addr(dev);
+       priv->regs = dev_read_addr_ptr(dev);
        ret = uclass_first_device_err(UCLASS_PINCTRL, &priv->pinctrl);
        if (ret)
                return ret;
index 383f72f55226b48c89b7f2be94bb9fc6a932c68a..01ca1ff48db903875b116825edac2fa7c1e460e7 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2015 - 2016 Xilinx, Inc.
+ * Copyright (C) 2017 National Instruments Corp
  * Written by Michal Simek
  *
  * SPDX-License-Identifier:    GPL-2.0+
@@ -9,7 +10,8 @@
 #include <dm.h>
 #include <errno.h>
 #include <i2c.h>
-#include <asm/gpio.h>
+
+#include <asm-generic/gpio.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -30,6 +32,7 @@ struct chip_desc {
 struct pca954x_priv {
        u32 addr; /* I2C mux address */
        u32 width; /* I2C mux width - number of busses */
+       struct gpio_desc gpio_mux_reset;
 };
 
 static const struct chip_desc chips[] = {
@@ -105,10 +108,45 @@ static int pca954x_ofdata_to_platdata(struct udevice *dev)
        return 0;
 }
 
+static int pca954x_probe(struct udevice *dev)
+{
+       if (IS_ENABLED(CONFIG_DM_GPIO)) {
+               struct pca954x_priv *priv = dev_get_priv(dev);
+               int err;
+
+               err = gpio_request_by_name(dev, "reset-gpios", 0,
+                               &priv->gpio_mux_reset, GPIOD_IS_OUT);
+
+               /* it's optional so only bail if we get a real error */
+               if (err && (err != -ENOENT))
+                       return err;
+
+               /* dm will take care of polarity */
+               if (dm_gpio_is_valid(&priv->gpio_mux_reset))
+                       dm_gpio_set_value(&priv->gpio_mux_reset, 0);
+       }
+
+       return 0;
+}
+
+static int pca954x_remove(struct udevice *dev)
+{
+       if (IS_ENABLED(CONFIG_DM_GPIO)) {
+               struct pca954x_priv *priv = dev_get_priv(dev);
+
+               if (dm_gpio_is_valid(&priv->gpio_mux_reset))
+                       dm_gpio_free(dev, &priv->gpio_mux_reset);
+       }
+
+       return 0;
+}
+
 U_BOOT_DRIVER(pca954x) = {
        .name = "pca954x",
        .id = UCLASS_I2C_MUX,
        .of_match = pca954x_ids,
+       .probe = pca954x_probe,
+       .remove = pca954x_remove,
        .ops = &pca954x_ops,
        .ofdata_to_platdata = pca954x_ofdata_to_platdata,
        .priv_auto_alloc_size = sizeof(struct pca954x_priv),
index 68e66536e4e3af6ae759b461ee072b73ff9c4191..840b3f6046bfe2005e4aafd3f73769680510c8ea 100644 (file)
@@ -382,7 +382,7 @@ static int rockchip_i2c_probe(struct udevice *bus)
 {
        struct rk_i2c *priv = dev_get_priv(bus);
 
-       priv->regs = (void *)devfdt_get_addr(bus);
+       priv->regs = dev_read_addr_ptr(bus);
 
        return 0;
 }
index 3d282d5b14cfff7a43818a8fd4e633e28f1bb2b9..4133017e32d8949017adf5a2dc098cca175f2f01 100644 (file)
@@ -197,6 +197,14 @@ config I2C_EEPROM
        help
          Enable a generic driver for EEPROMs attached via I2C.
 
+
+config SPL_I2C_EEPROM
+       bool "Enable driver for generic I2C-attached EEPROMs for SPL"
+       depends on MISC && SPL && SPL_DM
+       help
+         This option is an SPL-variant of the I2C_EEPROM option.
+         See the help of I2C_EEPROM for details.
+
 if I2C_EEPROM
 
 config SYS_I2C_EEPROM_ADDR
index 10265c8fb4693f4fb454f8c0fd77a6150586cc8c..21f7e6c6f58175e37545e88fab97414f50e29507 100644 (file)
@@ -20,7 +20,7 @@ obj-$(CONFIG_CROS_EC_SPI) += cros_ec_spi.o
 endif
 obj-$(CONFIG_FSL_IIM) += fsl_iim.o
 obj-$(CONFIG_LED_STATUS_GPIO) += gpio_led.o
-obj-$(CONFIG_I2C_EEPROM) += i2c_eeprom.o
+obj-$(CONFIG_$(SPL_)I2C_EEPROM) += i2c_eeprom.o
 obj-$(CONFIG_FSL_MC9SDZ60) += mc9sdz60.o
 obj-$(CONFIG_MXC_OCOTP) += mxc_ocotp.o
 obj-$(CONFIG_MXS_OCOTP) += mxs_ocotp.o
index feaa5d85676c6cbbb561f4b9295fd4457630e843..eefaaa53ad41f5ba70f6be6c4e2031260cfeee34 100644 (file)
@@ -1038,8 +1038,7 @@ int cros_ec_decode_ec_flash(struct udevice *dev, struct fdt_cros_ec *config)
 
        config->flash_erase_value = ofnode_read_s32_default(flash_node,
                                                            "erase-value", -1);
-       for (node = ofnode_first_subnode(flash_node); ofnode_valid(node);
-            node = ofnode_next_subnode(node)) {
+       ofnode_for_each_subnode(node, flash_node) {
                const char *name = ofnode_get_name(node);
                enum ec_flash_region region;
 
index a14e83225bcc01c76b429b611c32b46f6d2d517f..9a77c6e164c0ee4c2fcafe46ea570c6a6054ddc7 100644 (file)
@@ -66,11 +66,13 @@ static int i2c_eeprom_std_probe(struct udevice *dev)
 
 static const struct udevice_id i2c_eeprom_std_ids[] = {
        { .compatible = "i2c-eeprom", .data = 0 },
+       { .compatible = "microchip,24aa02e48", .data = 3 },
        { .compatible = "atmel,24c01a", .data = 3 },
        { .compatible = "atmel,24c02", .data = 3 },
        { .compatible = "atmel,24c04", .data = 4 },
        { .compatible = "atmel,24c08a", .data = 4 },
        { .compatible = "atmel,24c16a", .data = 4 },
+       { .compatible = "atmel,24mac402", .data = 4 },
        { .compatible = "atmel,24c32", .data = 5 },
        { .compatible = "atmel,24c64", .data = 5 },
        { .compatible = "atmel,24c128", .data = 6 },
index 2e3bc9137ad0bf966d347e5b000f3f25a99e7b69..a2203bf37b730cf2a9c3925dc64e8a2cd9fa52b8 100644 (file)
@@ -142,7 +142,7 @@ static int rockchip_efuse_ofdata_to_platdata(struct udevice *dev)
 {
        struct rockchip_efuse_platdata *plat = dev_get_platdata(dev);
 
-       plat->base = (void *)dev_read_addr(dev);
+       plat->base = dev_read_addr_ptr(dev);
        return 0;
 }
 
index e7fcf89f7342e649fe2996860e3c5112edc9f89b..807dc9e72f6683b338d575d3a7db2df39712e249 100644 (file)
@@ -58,7 +58,7 @@ static int rockchip_dwmmc_ofdata_to_platdata(struct udevice *dev)
        struct dwmci_host *host = &priv->host;
 
        host->name = dev->name;
-       host->ioaddr = (void *)devfdt_get_addr(dev);
+       host->ioaddr = dev_read_addr_ptr(dev);
        host->buswidth = dev_read_u32_default(dev, "bus-width", 4);
        host->get_mmc_clk = rockchip_dwmmc_get_mmc_clk;
        host->priv = dev;
index f31d329c81da7e7ad4e9269ae7203d5fc62284c6..0f31dfc3fd16dc599c3024a605af4b875fa47e1e 100644 (file)
@@ -9,7 +9,6 @@
 #include <common.h>
 #include <dm.h>
 #include <dt-structs.h>
-#include <fdtdec.h>
 #include <libfdt.h>
 #include <malloc.h>
 #include <mapmem.h>
@@ -46,7 +45,7 @@ static int arasan_sdhci_probe(struct udevice *dev)
        struct dtd_rockchip_rk3399_sdhci_5_1 *dtplat = &plat->dtplat;
 
        host->name = dev->name;
-       host->ioaddr = map_sysmem(dtplat->reg[1], dtplat->reg[3]);
+       host->ioaddr = map_sysmem(dtplat->reg[0], dtplat->reg[1]);
        max_frequency = dtplat->max_frequency;
        ret = clk_get_by_index_platdata(dev, 0, dtplat->clocks, &clk);
 #else
@@ -82,7 +81,7 @@ static int arasan_sdhci_ofdata_to_platdata(struct udevice *dev)
        struct sdhci_host *host = dev_get_priv(dev);
 
        host->name = dev->name;
-       host->ioaddr = devfdt_get_addr_ptr(dev);
+       host->ioaddr = dev_read_addr_ptr(dev);
 #endif
 
        return 0;
index e272b141532456ba1cb4a46db895a9ba6e52b944..721b75fddace1ba5254fe6c22d196378d7ffb998 100644 (file)
 #include <mmc.h>
 #include <dm.h>
 #include <linux/compat.h>
+#include <linux/dma-direction.h>
 #include <linux/io.h>
 #include <linux/sizes.h>
 #include <asm/unaligned.h>
-#include <asm/dma-mapping.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
index 47cf37d1d9b7d2934d1c5e04a0aef0361758c907..54718f418c669f6bc50fe91385c7dee09f0d06be 100644 (file)
@@ -10,7 +10,7 @@
 #include <malloc.h>
 #include <nand.h>
 #include <linux/errno.h>
-#include <asm/io.h>
+#include <linux/io.h>
 
 #include "denali.h"
 
@@ -433,17 +433,13 @@ static void find_valid_banks(struct denali_nand_info *denali)
  */
 static void detect_max_banks(struct denali_nand_info *denali)
 {
-       uint32_t features = readl(denali->flash_reg + FEATURES);
-       /*
-        * Read the revision register, so we can calculate the max_banks
-        * properly: the encoding changed from rev 5.0 to 5.1
-        */
-       u32 revision = MAKE_COMPARABLE_REVISION(
-                               readl(denali->flash_reg + REVISION));
-       if (revision < REVISION_5_1)
-               denali->max_banks = 2 << (features & FEATURES__N_BANKS);
-       else
-               denali->max_banks = 1 << (features & FEATURES__N_BANKS);
+       uint32_t features = ioread32(denali->flash_reg + FEATURES);
+
+       denali->max_banks = 1 << (features & FEATURES__N_BANKS);
+
+       /* the encoding changed from rev 5.0 to 5.1 */
+       if (denali->revision < 0x0501)
+               denali->max_banks <<= 1;
 }
 
 static void detect_partition_feature(struct denali_nand_info *denali)
@@ -1153,6 +1149,13 @@ static void denali_cmdfunc(struct mtd_info *mtd, unsigned int cmd, int col,
 /* Initialization code to bring the device up to a known good state */
 static void denali_hw_init(struct denali_nand_info *denali)
 {
+       /*
+        * The REVISION register may not be reliable.  Platforms are allowed to
+        * override it.
+        */
+       if (!denali->revision)
+               denali->revision = swab16(ioread32(denali->flash_reg + REVISION));
+
        /*
         * tell driver how many bit controller will skip before writing
         * ECC code in OOB. This is normally used for bad block marker
index 694bce53a955f272891a81b43e5cec3f8f394c50..08db48843da357ee1ef0412e7a9e5a200b70c4c8 100644 (file)
 
 #define REVISION                               0x370
 #define     REVISION__VALUE                            0xffff
-#define MAKE_COMPARABLE_REVISION(x)            swab16((x) & REVISION__VALUE)
-#define REVISION_5_1                           0x00000501
 
 #define ONFI_DEVICE_FEATURES                   0x380
 #define     ONFI_DEVICE_FEATURES__VALUE                        0x003f
@@ -462,8 +460,13 @@ struct denali_nand_info {
        uint32_t blksperchip;
        uint32_t bbtskipbytes;
        uint32_t max_banks;
+       unsigned int revision;
+       unsigned int caps;
 };
 
+#define DENALI_CAP_HW_ECC_FIXUP                        BIT(0)
+#define DENALI_CAP_DMA_64BIT                   BIT(1)
+
 int denali_init(struct denali_nand_info *denali);
 
 #endif /* __DENALI_H__ */
index 0a6155c748c493f80e677289f2434bb8182bdf35..4afd679a04b2c9eeb559d3e22ed65b09513979ec 100644 (file)
 
 #include "denali.h"
 
+struct denali_dt_data {
+       unsigned int revision;
+       unsigned int caps;
+};
+
+static const struct denali_dt_data denali_socfpga_data = {
+       .caps = DENALI_CAP_HW_ECC_FIXUP,
+};
+
+static const struct denali_dt_data denali_uniphier_v5a_data = {
+       .caps = DENALI_CAP_HW_ECC_FIXUP |
+               DENALI_CAP_DMA_64BIT,
+};
+
+static const struct denali_dt_data denali_uniphier_v5b_data = {
+       .revision = 0x0501,
+       .caps = DENALI_CAP_HW_ECC_FIXUP |
+               DENALI_CAP_DMA_64BIT,
+};
+
 static const struct udevice_id denali_nand_dt_ids[] = {
        {
                .compatible = "altr,socfpga-denali-nand",
+               .data = (unsigned long)&denali_socfpga_data,
        },
        {
                .compatible = "socionext,uniphier-denali-nand-v5a",
+               .data = (unsigned long)&denali_uniphier_v5a_data,
        },
        {
                .compatible = "socionext,uniphier-denali-nand-v5b",
+               .data = (unsigned long)&denali_uniphier_v5b_data,
        },
        { /* sentinel */ }
 };
@@ -28,9 +51,16 @@ static const struct udevice_id denali_nand_dt_ids[] = {
 static int denali_dt_probe(struct udevice *dev)
 {
        struct denali_nand_info *denali = dev_get_priv(dev);
+       const struct denali_dt_data *data;
        struct resource res;
        int ret;
 
+       data = (void *)dev_get_driver_data(dev);
+       if (data) {
+               denali->revision = data->revision;
+               denali->caps = data->caps;
+       }
+
        ret = dev_read_resource_byname(dev, "denali_reg", &res);
        if (ret)
                return ret;
index c4ccf48af4a3163f466afff3c31c1b58961f41e3..b2ab43920ab04573a7e705eed89917467d8b7c54 100644 (file)
@@ -83,6 +83,7 @@ const struct spi_flash_info spi_flash_ids[] = {
        {"mx25l51235f",    INFO(0xc2201a, 0x0, 64 * 1024,  1024, RD_FULL | WR_QPP) },
        {"mx25u6435f",     INFO(0xc22537, 0x0, 64 * 1024,   128, RD_FULL | WR_QPP) },
        {"mx25l12855e",    INFO(0xc22618, 0x0, 64 * 1024,   256, RD_FULL | WR_QPP) },
+       {"mx25u1635e",     INFO(0xc22535, 0x0, 64 * 1024,  32, SECT_4K) },
        {"mx66u51235f",    INFO(0xc2253a, 0x0, 64 * 1024,  1024, RD_FULL | WR_QPP) },
        {"mx66l1g45g",     INFO(0xc2201b, 0x0, 64 * 1024,  2048, RD_FULL | WR_QPP) },
 #endif
index 521e4dde41f8dfecee0eea4646fe9824546c456b..036d231071caefb75d304e8b77c8c85ac3a475bf 100644 (file)
@@ -737,16 +737,14 @@ int designware_eth_ofdata_to_platdata(struct udevice *dev)
 #endif
        struct eth_pdata *pdata = &dw_pdata->eth_pdata;
        const char *phy_mode;
-       const fdt32_t *cell;
 #ifdef CONFIG_DM_GPIO
        int reset_flags = GPIOD_IS_OUT;
 #endif
        int ret = 0;
 
-       pdata->iobase = devfdt_get_addr(dev);
+       pdata->iobase = dev_read_addr(dev);
        pdata->phy_interface = -1;
-       phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
-                              NULL);
+       phy_mode = dev_read_string(dev, "phy-mode");
        if (phy_mode)
                pdata->phy_interface = phy_get_interface_by_name(phy_mode);
        if (pdata->phy_interface == -1) {
@@ -754,10 +752,7 @@ int designware_eth_ofdata_to_platdata(struct udevice *dev)
                return -EINVAL;
        }
 
-       pdata->max_speed = 0;
-       cell = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "max-speed", NULL);
-       if (cell)
-               pdata->max_speed = fdt32_to_cpu(*cell);
+       pdata->max_speed = dev_read_u32_default(dev, "max-speed", 0);
 
 #ifdef CONFIG_DM_GPIO
        if (dev_read_bool(dev, "snps,reset-active-low"))
index 451dfded77bf7562e69643d3639e22534a2b2beb..261f1b911b9a013ba2341ac173ed854c2d1d041f 100644 (file)
@@ -405,8 +405,6 @@ int fm_init_common(int index, struct ccsr_fman *reg)
                mmc_init(mmc);
                (void)mmc->block_dev.block_read(&mmc->block_dev, blk, cnt,
                                                addr);
-               /* flush cache after read */
-               flush_cache((ulong)addr, cnt * 512);
        }
 #elif defined(CONFIG_SYS_QE_FMAN_FW_IN_REMOTE)
        void *addr = (void *)CONFIG_SYS_FMAN_FW_ADDR;
index bdb6792c72aa4ffce3bf7dea6e4f4338cb672e9d..12dbcd8cc50e3e227a84b89827a1ad5cb4779e25 100644 (file)
@@ -800,12 +800,19 @@ int get_dpl_apply_status(void)
        return mc_dpl_applied;
 }
 
-/**
+/*
  * Return the MC address of private DRAM block.
+ * As per MC design document, MC initial base address
+ * should be least significant 512MB address of MC private
+ * memory, i.e. address should point to end address masked
+ * with 512MB offset in private DRAM block.
  */
 u64 mc_get_dram_addr(void)
 {
-       return gd->arch.resv_ram;
+       size_t mc_ram_size = mc_get_dram_block_size();
+
+       return (gd->arch.resv_ram + mc_ram_size - 1) &
+               MC_RAM_BASE_ADDR_ALIGNMENT_MASK;
 }
 
 /**
index f231e6b33bc97b4fe8fd85a1cd4d412e770a5b75..e64bf3d6513561ce0b3d86c4df814a4e7e33a0f8 100644 (file)
@@ -40,7 +40,12 @@ static void ftmac100_reset(struct ftmac100_data *priv)
        writel (FTMAC100_MACCR_SW_RST, &ftmac100->maccr);
 
        while (readl (&ftmac100->maccr) & FTMAC100_MACCR_SW_RST)
-               ;
+               mdelay(1);
+       /*
+        * When soft reset complete, write mac address immediately maybe fail somehow
+        *  Wait for a while can avoid this problem
+        */
+       mdelay(1);
 }
 
 /*
@@ -79,7 +84,6 @@ static int _ftmac100_init(struct ftmac100_data *priv, unsigned char enetaddr[6])
        struct ftmac100_rxdes *rxdes = priv->rxdes;
        unsigned int maccr;
        int i;
-
        debug ("%s()\n", __func__);
 
        ftmac100_reset(priv);
@@ -156,7 +160,6 @@ static int __ftmac100_recv(struct ftmac100_data *priv)
        unsigned short rxlen;
 
        curr_des = &priv->rxdes[priv->rx_index];
-
        if (curr_des->rxdes0 & FTMAC100_RXDES0_RXDMA_OWN)
                return 0;
 
@@ -169,7 +172,7 @@ static int __ftmac100_recv(struct ftmac100_data *priv)
        }
 
        rxlen = FTMAC100_RXDES0_RFL (curr_des->rxdes0);
-
+       invalidate_dcache_range(curr_des->rxdes2,curr_des->rxdes2+rxlen);
        debug ("%s(): RX buffer %d, %x received\n",
               __func__, priv->rx_index, rxlen);
 
@@ -196,6 +199,7 @@ static int _ftmac100_send(struct ftmac100_data *priv, void *packet, int length)
 
        /* initiate a transmit sequence */
 
+       flush_dcache_range((u32)packet,(u32)packet+length);
        curr_des->txdes2 = (unsigned int)packet;        /* TXBUF_BADR */
 
        curr_des->txdes1 &= FTMAC100_TXDES1_EDOTR;
index 08675ec6416c40b174f059a5a52fb7f30c45e7a1..13ecd381eaf951f3455b2a75fbd21b706e0da215 100644 (file)
@@ -7,3 +7,4 @@
 obj-y += ldpaa_wriop.o
 obj-y += ldpaa_eth.o
 obj-$(CONFIG_ARCH_LS2080A) += ls2080a.o
+obj-$(CONFIG_ARCH_LS1088A) += ls1088a.o
index f7f26c275daa0d8c1f030274a1f5bc4b633588f9..831a3300701ea6dc9813334b213ad83d5701254f 100644 (file)
@@ -37,6 +37,15 @@ void wriop_init_dpmac(int sd, int dpmac_id, int lane_prtcl)
        }
 }
 
+void wriop_init_dpmac_enet_if(int dpmac_id, phy_interface_t enet_if)
+{
+       dpmac_info[dpmac_id].enabled = 1;
+       dpmac_info[dpmac_id].id = dpmac_id;
+       dpmac_info[dpmac_id].phy_addr = -1;
+       dpmac_info[dpmac_id].enet_if = enet_if;
+}
+
+
 /*TODO what it do */
 static int wriop_dpmac_to_index(int dpmac_id)
 {
diff --git a/drivers/net/ldpaa_eth/ls1088a.c b/drivers/net/ldpaa_eth/ls1088a.c
new file mode 100644 (file)
index 0000000..061935e
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <common.h>
+#include <phy.h>
+#include <fsl-mc/ldpaa_wriop.h>
+#include <asm/io.h>
+#include <asm/arch/fsl_serdes.h>
+#include <asm/arch/soc.h>
+
+u32 dpmac_to_devdisr[] = {
+       [WRIOP1_DPMAC1] = FSL_CHASSIS3_DEVDISR2_DPMAC1,
+       [WRIOP1_DPMAC2] = FSL_CHASSIS3_DEVDISR2_DPMAC2,
+       [WRIOP1_DPMAC3] = FSL_CHASSIS3_DEVDISR2_DPMAC3,
+       [WRIOP1_DPMAC4] = FSL_CHASSIS3_DEVDISR2_DPMAC4,
+       [WRIOP1_DPMAC5] = FSL_CHASSIS3_DEVDISR2_DPMAC5,
+       [WRIOP1_DPMAC6] = FSL_CHASSIS3_DEVDISR2_DPMAC6,
+       [WRIOP1_DPMAC7] = FSL_CHASSIS3_DEVDISR2_DPMAC7,
+       [WRIOP1_DPMAC8] = FSL_CHASSIS3_DEVDISR2_DPMAC8,
+       [WRIOP1_DPMAC9] = FSL_CHASSIS3_DEVDISR2_DPMAC9,
+       [WRIOP1_DPMAC10] = FSL_CHASSIS3_DEVDISR2_DPMAC10,
+};
+
+static int is_device_disabled(int dpmac_id)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       u32 devdisr2 = in_le32(&gur->devdisr2);
+
+       return dpmac_to_devdisr[dpmac_id] & devdisr2;
+}
+
+void wriop_dpmac_disable(int dpmac_id)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+
+       setbits_le32(&gur->devdisr2, dpmac_to_devdisr[dpmac_id]);
+}
+
+void wriop_dpmac_enable(int dpmac_id)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+
+       clrbits_le32(&gur->devdisr2, dpmac_to_devdisr[dpmac_id]);
+}
+
+phy_interface_t wriop_dpmac_enet_if(int dpmac_id, int lane_prtcl)
+{
+       enum srds_prtcl;
+
+       if (is_device_disabled(dpmac_id + 1))
+               return PHY_INTERFACE_MODE_NONE;
+
+       switch (lane_prtcl) {
+       case SGMII1:
+       case SGMII2:
+       case SGMII3:
+       case SGMII7:
+               return PHY_INTERFACE_MODE_SGMII;
+       }
+
+       if (lane_prtcl >= XFI1 && lane_prtcl <= XFI2)
+               return PHY_INTERFACE_MODE_XGMII;
+
+       if (lane_prtcl >= QSGMII_A && lane_prtcl <= QSGMII_B)
+               return PHY_INTERFACE_MODE_QSGMII;
+
+       return PHY_INTERFACE_MODE_NONE;
+}
+
+void wriop_init_dpmac_qsgmii(int sd, int lane_prtcl)
+{
+       switch (lane_prtcl) {
+       case QSGMII_A:
+               wriop_init_dpmac(sd, 3, (int)lane_prtcl);
+               wriop_init_dpmac(sd, 4, (int)lane_prtcl);
+               wriop_init_dpmac(sd, 5, (int)lane_prtcl);
+               wriop_init_dpmac(sd, 6, (int)lane_prtcl);
+               break;
+       case QSGMII_B:
+               wriop_init_dpmac(sd, 7, (int)lane_prtcl);
+               wriop_init_dpmac(sd, 8, (int)lane_prtcl);
+               wriop_init_dpmac(sd, 9, (int)lane_prtcl);
+               wriop_init_dpmac(sd, 10, (int)lane_prtcl);
+               break;
+       }
+}
+
+#ifdef CONFIG_SYS_FSL_HAS_RGMII
+void fsl_rgmii_init(void)
+{
+       struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       u32 ec;
+
+#ifdef CONFIG_SYS_FSL_EC1
+       ec = gur_in32(&gur->rcwsr[FSL_CHASSIS3_EC1_REGSR - 1])
+               & FSL_CHASSIS3_RCWSR25_EC1_PRTCL_MASK;
+       ec >>= FSL_CHASSIS3_RCWSR25_EC1_PRTCL_SHIFT;
+
+       if (!ec)
+               wriop_init_dpmac_enet_if(4, PHY_INTERFACE_MODE_RGMII);
+#endif
+
+#ifdef CONFIG_SYS_FSL_EC2
+       ec = gur_in32(&gur->rcwsr[FSL_CHASSIS3_EC2_REGSR - 1])
+               & FSL_CHASSIS3_RCWSR25_EC2_PRTCL_MASK;
+       ec >>= FSL_CHASSIS3_RCWSR25_EC2_PRTCL_SHIFT;
+
+       if (!ec)
+               wriop_init_dpmac_enet_if(5, PHY_INTERFACE_MODE_RGMII);
+#endif
+}
+#endif
index e0e9ed97672411fe5ee257676e5fc931fe6d0288..637d89a1e1bcaa21509a25e6da996fac0d03ddb5 100644 (file)
@@ -177,8 +177,6 @@ void cs4340_upload_firmware(struct phy_device *phydev)
                mmc_init(mmc);
                (void)mmc->block_dev.block_read(&mmc->block_dev, blk, cnt,
                                                addr);
-               /* flush cache after read */
-               flush_cache((ulong)addr, cnt * 512);
        }
 #endif
 
index 0bb99e6bc6ba4194558c195cbfadfb304ef4be35..b350a61aa64bb06bc30e175765d94f75adcdd06c 100644 (file)
@@ -9,11 +9,11 @@
  * (C) Copyright 2017 Adaptrum, Inc.
  * Written by Alexandru Gagniuc <alex.g@adaptrum.com> for Adaptrum, Inc.
  */
+
 #include <config.h>
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
-#include <fdtdec.h>
 #include <micrel.h>
 #include <phy.h>
 
@@ -120,8 +120,7 @@ static int ksz90x1_of_config_group(struct phy_device *phydev,
                return -EOPNOTSUPP;
 
        for (i = 0; i < ofcfg->grpsz; i++) {
-               val[i] = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev),
-                                        ofcfg->grp[i].name, -1);
+               val[i] = dev_read_u32_default(dev, ofcfg->grp[i].name, ~0);
                offset = ofcfg->grp[i].off;
                if (val[i] == -1) {
                        /* Default register value for KSZ9021 */
index 38c435e37ae821666da0dd6ec72271a175567b07..81f30eabe9452044139f942f5b3aa8c4b9ce5399 100644 (file)
@@ -10,6 +10,7 @@
 #include <common.h>
 #include <dm.h>
 #include <dm/pinctrl.h>
+#include <asm/hardware.h>
 #include <linux/io.h>
 #include <linux/err.h>
 #include <mach/at91_pio.h>
index 81ce2e31a7f6ac727caded3b3d6258fa3cd5f1c1..b1f570416425390a2570534de06cdb803962a30b 100644 (file)
@@ -632,8 +632,7 @@ static int rk3368_pinctrl_get_periph_id(struct udevice *dev,
        u32 cell[3];
        int ret;
 
-       ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(periph),
-                                  "interrupts", cell, ARRAY_SIZE(cell));
+       ret = dev_read_u32_array(periph, "interrupts", cell, ARRAY_SIZE(cell));
        if (ret < 0)
                return -EINVAL;
 
index 4e9895987cbf011d25a71d0137082716c1cac700..ddf777c26b16da15e6a08615d2a5724dfb347e6c 100644 (file)
@@ -42,24 +42,21 @@ int lp873x_mmc1_poweron_ldo(uint voltage)
 }
 #endif
 
-int palmas_mmc1_poweron_ldo(uint voltage)
+int palmas_mmc1_poweron_ldo(uint ldo_volt, uint ldo_ctrl, uint voltage)
 {
        u8 val = 0;
 
 #if defined(CONFIG_DRA7XX)
        int ret;
-       /*
-        * Currently valid for the dra7xx_evm board:
-        * Set TPS659038 LDO1 to 3.0 V or 1.8V
-        */
-       ret = palmas_i2c_write_u8(TPS65903X_CHIP_P1, LDO1_VOLTAGE, voltage);
+
+       ret = palmas_i2c_write_u8(TPS65903X_CHIP_P1, ldo_volt, voltage);
        if (ret) {
                printf("tps65903x: could not set LDO1 voltage.\n");
                return ret;
        }
        /* TURN ON LDO1 */
        val = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
-       ret = palmas_i2c_write_u8(TPS65903X_CHIP_P1, LDO1_CTRL, val);
+       ret = palmas_i2c_write_u8(TPS65903X_CHIP_P1, ldo_ctrl, val);
        if (ret) {
                printf("tps65903x: could not turn on LDO1.\n");
                return ret;
index 953bbe50269322cb05a947f93f66ded00465dfbb..64964e4e963ddb6291499f272d907331a88cc5c1 100644 (file)
@@ -34,9 +34,7 @@ int pmic_bind_children(struct udevice *pmic, ofnode parent,
        debug("%s for '%s' at node offset: %d\n", __func__, pmic->name,
              dev_of_offset(pmic));
 
-       for (node = ofnode_first_subnode(parent);
-            ofnode_valid(node);
-            node = ofnode_next_subnode(node)) {
+       ofnode_for_each_subnode(node, parent) {
                node_name = ofnode_get_name(node);
 
                debug("* Found child node: '%s'\n", node_name);
index eb3ec0f6013f606b94d4b6aa09a07e38e536e23a..735046dc43d869d20f451eca19cb6ff9937605aa 100644 (file)
@@ -8,8 +8,6 @@
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
-#include <fdtdec.h>
-#include <libfdt.h>
 #include <power/rk8xx_pmic.h>
 #include <power/pmic.h>
 
index 24e764dc7c59ea2aa5bc0d3bdb885cb65bb1185a..5366a1eb712a7d7a8f07e1fb36be4597a01295e9 100644 (file)
@@ -221,12 +221,10 @@ void u_qe_init(void)
                mmc_init(mmc);
                (void)mmc->block_dev.block_read(&mmc->block_dev, blk, cnt,
                                                addr);
-               /* flush cache after read */
-               flush_cache((ulong)addr, cnt * 512);
        }
 #endif
-       u_qe_upload_firmware(addr);
-       out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
+       if (!u_qe_upload_firmware(addr))
+               out_be32(&qe_immr->iram.iready, QE_IRAM_READY);
 #ifdef CONFIG_SYS_QE_FMAN_FW_IN_MMC
        free(addr);
 #endif
index ca7b1ff0c841517cb84e2417055938ab5fbc1cc1..7577ff0363d66cedba303597bbba13340f2850a1 100644 (file)
@@ -893,18 +893,11 @@ static int conv_of_platdata(struct udevice *dev)
 {
        struct rk3368_sdram_params *plat = dev_get_platdata(dev);
        struct dtd_rockchip_rk3368_dmc *of_plat = &plat->of_plat;
-       int ret;
 
        plat->ddr_freq = of_plat->rockchip_ddr_frequency;
        plat->ddr_speed_bin = of_plat->rockchip_ddr_speed_bin;
        plat->memory_schedule = of_plat->rockchip_memory_schedule;
 
-       ret = regmap_init_mem_platdata(dev, of_plat->reg,
-                                      ARRAY_SIZE(of_plat->reg) / 2,
-                                      &plat->map);
-       if (ret)
-               return ret;
-
        return 0;
 }
 #endif
@@ -933,8 +926,8 @@ static int rk3368_dmc_probe(struct udevice *dev)
        debug("%s: pmugrf=%p\n", __func__, priv->pmugrf);
 
 #ifdef CONFIG_TPL_BUILD
-       pctl = regmap_get_range(plat->map, 0);
-       ddrphy = regmap_get_range(plat->map, 1);
+       pctl = (struct rk3368_ddr_pctl *)plat->of_plat.reg[0];
+       ddrphy = (struct rk3368_ddrphy *)plat->of_plat.reg[2];
        msch = syscon_get_first_range(ROCKCHIP_SYSCON_MSCH);
        grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
 
index 1a65a3f9b943b58667da497b5b81526ced1c94e4..df998921f564b1c7885d30dc1e943640b342bf7b 100644 (file)
@@ -580,7 +580,7 @@ static int do_scsi_scan_one(struct udevice *dev, int id, int lun, bool verbose)
        */
        snprintf(str, sizeof(str), "id%dlun%d", id, lun);
        ret = blk_create_devicef(dev, "scsi_blk", str, IF_TYPE_SCSI, -1,
-                       bd.blksz, bd.blksz * bd.lba, &bdev);
+                       bd.blksz, bd.lba, &bdev);
        if (ret) {
                debug("Can't create device\n");
                return ret;
index aeed538fa4e8189d318a4d99b63576e9692ebed0..13b2550d3b42803c1ebe462f626f5ffea51c1aaf 100644 (file)
@@ -414,6 +414,13 @@ config MXC_UART
          If you have a machine based on a Motorola IMX CPU you
          can enable its onboard serial port by enabling this option.
 
+config NULLDEV_SERIAL
+       bool "Null serial device"
+       help
+         Select this to enable null serial device support. A null serial
+         device merely acts as a placeholder for a serial device and does
+         nothing for all it's operation.
+
 config PIC32_SERIAL
        bool "Support for Microchip PIC32 on-chip UART"
        depends on DM_SERIAL && MACH_PIC32
index 72a6996a0aa664c9d0f118d9801eaae36c2d0bc5..7adcee3e1045b027010308aa48a909b8ba56652d 100644 (file)
@@ -49,6 +49,7 @@ obj-$(CONFIG_BCM283X_MU_SERIAL) += serial_bcm283x_mu.o
 obj-$(CONFIG_MSM_SERIAL) += serial_msm.o
 obj-$(CONFIG_MVEBU_A3700_UART) += serial_mvebu_a3700.o
 obj-$(CONFIG_MPC8XX_CONS) += serial_mpc8xx.o
+obj-$(CONFIG_NULLDEV_SERIAL) += serial_nulldev.o
 
 ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_USB_TTY) += usbtty.o
diff --git a/drivers/serial/serial_nulldev.c b/drivers/serial/serial_nulldev.c
new file mode 100644 (file)
index 0000000..0768308
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015 National Instruments
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <serial.h>
+
+static int nulldev_serial_setbrg(struct udevice *dev, int baudrate)
+{
+       return 0;
+}
+
+static int nulldev_serial_getc(struct udevice *dev)
+{
+       return -EAGAIN;
+}
+
+static int nulldev_serial_input(struct udevice *dev)
+{
+       return 0;
+}
+
+static int nulldev_serial_putc(struct udevice *dev, const char ch)
+{
+       return 0;
+}
+
+static const struct udevice_id nulldev_serial_ids[] = {
+       { .compatible = "nulldev-serial" },
+       { }
+};
+
+
+const struct dm_serial_ops nulldev_serial_ops = {
+       .putc = nulldev_serial_putc,
+       .getc = nulldev_serial_getc,
+       .setbrg = nulldev_serial_setbrg,
+};
+
+U_BOOT_DRIVER(serial_nulldev) = {
+       .name   = "serial_nulldev",
+       .id     = UCLASS_SERIAL,
+       .of_match = nulldev_serial_ids,
+       .ops    = &nulldev_serial_ops,
+};
index 3c5582a9504c8e079c24c14e86da4b7a940afdc7..88da9a4c8e7159b7be04e701a35708460dd9044d 100644 (file)
@@ -210,6 +210,13 @@ config FSL_QSPI
          used to access the SPI NOR flash on platforms embedding this
          Freescale IP core.
 
+config NDS_AE3XX_SPI
+       bool "Andestech AE3XX SPI driver"
+       help
+         Enable the Andestech AE3XX SPI driver. This driver can be
+         used to access the SPI flash on platforms embedding this
+         Andestech IP core.
+
 config TI_QSPI
        bool "TI QSPI driver"
        help
index 9f8b86de76c4a0ce7d687258c39132372e11b09d..cd7c7556a7b13fc3f378acf6930c379db9813ed2 100644 (file)
@@ -35,6 +35,7 @@ obj-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o
 obj-$(CONFIG_MVEBU_A3700_SPI) += mvebu_a3700_spi.o
 obj-$(CONFIG_MXC_SPI) += mxc_spi.o
 obj-$(CONFIG_MXS_SPI) += mxs_spi.o
+obj-$(CONFIG_NDS_AE3XX_SPI) += nds_ae3xx_spi.o
 obj-$(CONFIG_OMAP3_SPI) += omap3_spi.o
 obj-$(CONFIG_PIC32_SPI) += pic32_spi.o
 obj-$(CONFIG_ROCKCHIP_SPI) += rk_spi.o
diff --git a/drivers/spi/nds_ae3xx_spi.c b/drivers/spi/nds_ae3xx_spi.c
new file mode 100644 (file)
index 0000000..f5bd99a
--- /dev/null
@@ -0,0 +1,499 @@
+/*
+ * NDS SPI controller driver.
+ *
+ * Copyright 2017 Andes Technology, Inc.
+ * Author: Rick Chen (rick@andestech.com)
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <clk.h>
+#include <common.h>
+#include <malloc.h>
+#include <spi.h>
+#include <asm/io.h>
+#include <dm.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define MAX_TRANSFER_LEN       512
+#define CHUNK_SIZE             1
+#define SPI_TIMEOUT            0x100000
+#define SPI0_BUS               0
+#define SPI1_BUS               1
+#define SPI0_BASE              0xf0b00000
+#define SPI1_BASE              0xf0f00000
+#define NSPI_MAX_CS_NUM                1
+
+struct ae3xx_spi_regs {
+       u32     rev;
+       u32     reserve1[3];
+       u32     format;         /* 0x10 */
+#define DATA_LENGTH(x) ((x-1)<<8)
+       u32     pio;
+       u32     reserve2[2];
+       u32     tctrl;          /* 0x20 */
+#define TRAMODE_OFFSET 24
+#define TRAMODE_MASK   (0x0F<<TRAMODE_OFFSET)
+#define TRAMODE_WR_SYNC        (0<<TRAMODE_OFFSET)
+#define TRAMODE_WO     (1<<TRAMODE_OFFSET)
+#define TRAMODE_RO     (2<<TRAMODE_OFFSET)
+#define TRAMODE_WR     (3<<TRAMODE_OFFSET)
+#define TRAMODE_RW     (4<<TRAMODE_OFFSET)
+#define TRAMODE_WDR    (5<<TRAMODE_OFFSET)
+#define TRAMODE_RDW    (6<<TRAMODE_OFFSET)
+#define TRAMODE_NONE   (7<<TRAMODE_OFFSET)
+#define TRAMODE_DW     (8<<TRAMODE_OFFSET)
+#define TRAMODE_DR     (9<<TRAMODE_OFFSET)
+#define WCNT_OFFSET    12
+#define WCNT_MASK      (0x1FF<<WCNT_OFFSET)
+#define RCNT_OFFSET    0
+#define RCNT_MASK      (0x1FF<<RCNT_OFFSET)
+       u32     cmd;
+       u32     addr;
+       u32     data;
+       u32     ctrl;           /* 0x30 */
+#define TXFTH_OFFSET   16
+#define RXFTH_OFFSET   8
+#define TXDMAEN                (1<<4)
+#define RXDMAEN                (1<<3)
+#define TXFRST         (1<<2)
+#define RXFRST         (1<<1)
+#define SPIRST         (1<<0)
+       u32     status;
+#define TXFFL          (1<<23)
+#define TXEPTY         (1<<22)
+#define TXFVE_MASK     (0x1F<<16)
+#define RXFEM          (1<<14)
+#define RXFVE_OFFSET   (8)
+#define RXFVE_MASK     (0x1F<<RXFVE_OFFSET)
+#define SPIBSY         (1<<0)
+       u32     inten;
+       u32     intsta;
+       u32     timing;         /* 0x40 */
+#define SCLK_DIV_MASK  0xFF
+};
+
+struct nds_spi_slave {
+#ifndef CONFIG_DM_SPI
+       struct spi_slave slave;
+#endif
+       volatile struct ae3xx_spi_regs *regs;
+       int             to;
+       unsigned int    freq;
+       ulong           clock;
+       unsigned int    mode;
+       u8              num_cs;
+       unsigned int    mtiming;
+       size_t          cmd_len;
+       u8              cmd_buf[16];
+       size_t          data_len;
+       size_t          tran_len;
+       u8              *din;
+       u8              *dout;
+       unsigned int    max_transfer_length;
+};
+
+static int __ae3xx_spi_set_speed(struct nds_spi_slave *ns)
+{
+       u32 tm;
+       u8 div;
+       tm = ns->regs->timing;
+       tm &= ~SCLK_DIV_MASK;
+
+       if(ns->freq >= ns->clock)
+               div =0xff;
+       else{
+               for (div = 0; div < 0xff; div++) {
+                       if (ns->freq >= ns->clock / (2 * (div + 1)))
+                               break;
+               }
+       }
+
+       tm |= div;
+       ns->regs->timing = tm;
+
+       return 0;
+
+}
+
+static int __ae3xx_spi_claim_bus(struct nds_spi_slave *ns)
+{
+               unsigned int format=0;
+               ns->regs->ctrl |= (TXFRST|RXFRST|SPIRST);
+               while((ns->regs->ctrl &(TXFRST|RXFRST|SPIRST))&&(ns->to--))
+                       if(!ns->to)
+                               return -EINVAL;
+
+               ns->cmd_len = 0;
+               format = ns->mode|DATA_LENGTH(8);
+               ns->regs->format = format;
+               __ae3xx_spi_set_speed(ns);
+
+               return 0;
+}
+
+static int __ae3xx_spi_release_bus(struct nds_spi_slave *ns)
+{
+       /* do nothing */
+       return 0;
+}
+
+static int __ae3xx_spi_start(struct nds_spi_slave *ns)
+{
+       int i,olen=0;
+       int tc = ns->regs->tctrl;
+
+       tc &= ~(WCNT_MASK|RCNT_MASK|TRAMODE_MASK);
+       if ((ns->din)&&(ns->cmd_len))
+               tc |= TRAMODE_WR;
+       else if (ns->din)
+               tc |= TRAMODE_RO;
+       else
+               tc |= TRAMODE_WO;
+
+       if(ns->dout)
+               olen = ns->tran_len;
+       tc |= (ns->cmd_len+olen-1) << WCNT_OFFSET;
+
+       if(ns->din)
+               tc |= (ns->tran_len-1) << RCNT_OFFSET;
+
+       ns->regs->tctrl = tc;
+       ns->regs->cmd = 1;
+
+       for (i=0;i<ns->cmd_len;i++)
+               ns->regs->data = ns->cmd_buf[i];
+
+       return 0;
+}
+
+static int __ae3xx_spi_stop(struct nds_spi_slave *ns)
+{
+       ns->regs->timing = ns->mtiming;
+       while ((ns->regs->status & SPIBSY)&&(ns->to--))
+               if (!ns->to)
+                       return -EINVAL;
+
+       return 0;
+}
+
+static void __nspi_espi_tx(struct nds_spi_slave *ns, const void *dout)
+{
+       ns->regs->data = *(u8 *)dout;
+}
+
+static int __nspi_espi_rx(struct nds_spi_slave *ns, void *din, unsigned int bytes)
+{
+       *(u8 *)din = ns->regs->data;
+       return bytes;
+}
+
+
+static int __ae3xx_spi_xfer(struct nds_spi_slave *ns,
+               unsigned int bitlen,  const void *data_out, void *data_in,
+               unsigned long flags)
+{
+               unsigned int event, rx_bytes;
+               const void *dout = NULL;
+               void *din = NULL;
+               int num_blks, num_chunks, max_tran_len, tran_len;
+               int num_bytes;
+               u8 *cmd_buf = ns->cmd_buf;
+               size_t cmd_len = ns->cmd_len;
+               size_t data_len = bitlen / 8;
+               int rf_cnt;
+               int ret = 0;
+
+               max_tran_len = ns->max_transfer_length;
+               switch (flags) {
+               case SPI_XFER_BEGIN:
+                       cmd_len = ns->cmd_len = data_len;
+                       memcpy(cmd_buf, data_out, cmd_len);
+                       return 0;
+
+               case 0:
+               case SPI_XFER_END:
+                       if (bitlen == 0) {
+                               return 0;
+                       }
+                       ns->data_len = data_len;
+                       ns->din = (u8 *)data_in;
+                       ns->dout = (u8 *)data_out;
+                       break;
+
+               case SPI_XFER_BEGIN | SPI_XFER_END:
+                       ns->data_len = 0;
+                       ns->din = 0;
+                       ns->dout = 0;
+                       cmd_len = ns->cmd_len = data_len;
+                       memcpy(cmd_buf, data_out, cmd_len);
+                       data_out = 0;
+                       data_len = 0;
+                       __ae3xx_spi_start(ns);
+                       break;
+               }
+               debug("spi_xfer: data_out %08X(%p) data_in %08X(%p) data_len %u\n",
+                     *(uint *)data_out, data_out, *(uint *)data_in, data_in, data_len);
+               num_chunks = DIV_ROUND_UP(data_len, max_tran_len);
+               din = data_in;
+               dout = data_out;
+               while (num_chunks--) {
+                       tran_len = min(data_len, (size_t)max_tran_len);
+                       ns->tran_len = tran_len;
+                       num_blks = DIV_ROUND_UP(tran_len , CHUNK_SIZE);
+                       num_bytes = (tran_len) % CHUNK_SIZE;
+                       if(num_bytes == 0)
+                               num_bytes = CHUNK_SIZE;
+                       __ae3xx_spi_start(ns);
+
+                       while (num_blks) {
+                               event = in_le32(&ns->regs->status);
+                               if ((event & TXEPTY) && (data_out)) {
+                                       __nspi_espi_tx(ns, dout);
+                                       num_blks -= CHUNK_SIZE;
+                                       dout += CHUNK_SIZE;
+                               }
+
+                               if ((event & RXFVE_MASK) && (data_in)) {
+                                       rf_cnt = ((event & RXFVE_MASK)>> RXFVE_OFFSET);
+                                       if (rf_cnt >= CHUNK_SIZE)
+                                               rx_bytes = CHUNK_SIZE;
+                                       else if (num_blks == 1 && rf_cnt == num_bytes)
+                                               rx_bytes = num_bytes;
+                                       else
+                                               continue;
+
+                                       if (__nspi_espi_rx(ns, din, rx_bytes) == rx_bytes) {
+                                               num_blks -= CHUNK_SIZE;
+                                               din = (unsigned char *)din + rx_bytes;
+                                       }
+                               }
+                       }
+
+                       data_len -= tran_len;
+                       if(data_len)
+                       {
+                               ns->cmd_buf[1] += ((tran_len>>16)&0xff);
+                               ns->cmd_buf[2] += ((tran_len>>8)&0xff);
+                               ns->cmd_buf[3] += ((tran_len)&0xff);
+                               ns->data_len = data_len;
+                       }
+                       ret = __ae3xx_spi_stop(ns);
+               }
+               ret = __ae3xx_spi_stop(ns);
+
+               return ret;
+}
+
+#ifndef CONFIG_DM_SPI
+#define to_nds_spi_slave(s) container_of(s, struct nds_spi_slave, slave)
+struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
+               unsigned int max_hz, unsigned int mode)
+{
+       struct nds_spi_slave *ns;
+
+       if (!spi_cs_is_valid(bus, cs))
+               return NULL;
+
+       ns = spi_alloc_slave(struct nds_spi_slave, bus, cs);
+
+       switch (bus) {
+       case SPI0_BUS:
+                       ns->regs = (struct ae3xx_spi_regs *)SPI0_BASE;
+                       break;
+
+               case SPI1_BUS:
+                       ns->regs = (struct ae3xx_spi_regs *)SPI1_BASE;
+                       break;
+
+               default:
+                       return NULL;
+       }
+
+       ns->freq= max_hz;
+       ns->mode = mode;
+       ns->to = SPI_TIMEOUT;
+       ns->max_transfer_length = MAX_TRANSFER_LEN;
+       ns->slave.max_write_size = MAX_TRANSFER_LEN;
+       if (!ns)
+               return NULL;
+
+       return &ns->slave;
+}
+
+void spi_free_slave(struct spi_slave *slave)
+{
+       struct nds_spi_slave *ns = to_nds_spi_slave(slave);
+       free(ns);
+}
+
+void spi_init(void)
+{
+       /* do nothing */
+}
+
+int spi_claim_bus(struct spi_slave *slave)
+{
+       struct nds_spi_slave *ns = to_nds_spi_slave(slave);
+       return __ae3xx_spi_claim_bus(ns);
+}
+
+void spi_release_bus(struct spi_slave *slave)
+{
+       struct nds_spi_slave *ns = to_nds_spi_slave(slave);
+       __ae3xx_spi_release_bus(ns);
+}
+
+int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *data_out,
+               void *data_in, unsigned long flags)
+{
+       struct nds_spi_slave *ns = to_nds_spi_slave(slave);
+       return __ae3xx_spi_xfer(ns, bitlen, data_out, data_in, flags);
+}
+
+int spi_cs_is_valid(unsigned int bus, unsigned int cs)
+{
+       return bus == 0 && cs < NSPI_MAX_CS_NUM;
+}
+
+void spi_cs_activate(struct spi_slave *slave)
+{
+       struct nds_spi_slave *ns = to_nds_spi_slave(slave);
+       __ae3xx_spi_start(ns);
+}
+
+void spi_cs_deactivate(struct spi_slave *slave)
+{
+       struct nds_spi_slave *ns = to_nds_spi_slave(slave);
+       __ae3xx_spi_stop(ns);
+}
+#else
+static int ae3xx_spi_set_speed(struct udevice *bus, uint max_hz)
+{
+       struct nds_spi_slave *ns = dev_get_priv(bus);
+
+       debug("%s speed %u\n", __func__, max_hz);
+
+       ns->freq = max_hz;
+       __ae3xx_spi_set_speed(ns);
+
+       return 0;
+}
+
+static int ae3xx_spi_set_mode(struct udevice *bus, uint mode)
+{
+       struct nds_spi_slave *ns = dev_get_priv(bus);
+
+       debug("%s mode %u\n", __func__, mode);
+       ns->mode = mode;
+
+       return 0;
+}
+
+static int ae3xx_spi_claim_bus(struct udevice *dev)
+{
+       struct dm_spi_slave_platdata *slave_plat =
+               dev_get_parent_platdata(dev);
+       struct udevice *bus = dev->parent;
+       struct nds_spi_slave *ns = dev_get_priv(bus);
+
+       if (slave_plat->cs >= ns->num_cs) {
+               printf("Invalid SPI chipselect\n");
+               return -EINVAL;
+       }
+
+       return __ae3xx_spi_claim_bus(ns);
+}
+
+static int ae3xx_spi_release_bus(struct udevice *dev)
+{
+       struct nds_spi_slave *ns = dev_get_priv(dev->parent);
+
+       return __ae3xx_spi_release_bus(ns);
+}
+
+static int ae3xx_spi_xfer(struct udevice *dev, unsigned int bitlen,
+                           const void *dout, void *din,
+                           unsigned long flags)
+{
+       struct udevice *bus = dev->parent;
+       struct nds_spi_slave *ns = dev_get_priv(bus);
+
+       return __ae3xx_spi_xfer(ns, bitlen, dout, din, flags);
+}
+
+static int ae3xx_spi_get_clk(struct udevice *bus)
+{
+       struct nds_spi_slave *ns = dev_get_priv(bus);
+       struct clk clk;
+       ulong clk_rate;
+       int ret;
+
+       ret = clk_get_by_index(bus, 0, &clk);
+       if (ret)
+               return -EINVAL;
+
+       clk_rate = clk_get_rate(&clk);
+       if (!clk_rate)
+               return -EINVAL;
+
+       ns->clock = clk_rate;
+       clk_free(&clk);
+
+       return 0;
+}
+
+static int ae3xx_spi_probe(struct udevice *bus)
+{
+       struct nds_spi_slave *ns = dev_get_priv(bus);
+
+       ns->to = SPI_TIMEOUT;
+       ns->max_transfer_length = MAX_TRANSFER_LEN;
+       ns->mtiming = ns->regs->timing;
+       ae3xx_spi_get_clk(bus);
+
+       return 0;
+}
+
+static int ae3xx_ofdata_to_platadata(struct udevice *bus)
+{
+       struct nds_spi_slave *ns = dev_get_priv(bus);
+       const void *blob = gd->fdt_blob;
+       int node = dev_of_offset(bus);
+
+       ns->regs = map_physmem(devfdt_get_addr(bus),
+                                sizeof(struct ae3xx_spi_regs),
+                                MAP_NOCACHE);
+       if (!ns->regs) {
+               printf("%s: could not map device address\n", __func__);
+               return -EINVAL;
+       }
+       ns->num_cs = fdtdec_get_int(blob, node, "num-cs", 4);
+
+       return 0;
+}
+
+static const struct dm_spi_ops ae3xx_spi_ops = {
+       .claim_bus      = ae3xx_spi_claim_bus,
+       .release_bus    = ae3xx_spi_release_bus,
+       .xfer           = ae3xx_spi_xfer,
+       .set_speed      = ae3xx_spi_set_speed,
+       .set_mode       = ae3xx_spi_set_mode,
+};
+
+static const struct udevice_id ae3xx_spi_ids[] = {
+       { .compatible = "andestech,atcspi200" },
+       { }
+};
+
+U_BOOT_DRIVER(ae3xx_spi) = {
+       .name = "ae3xx_spi",
+       .id = UCLASS_SPI,
+       .of_match = ae3xx_spi_ids,
+       .ops = &ae3xx_spi_ops,
+       .ofdata_to_platdata = ae3xx_ofdata_to_platadata,
+       .priv_auto_alloc_size = sizeof(struct nds_spi_slave),
+       .probe = ae3xx_spi_probe,
+};
+#endif
index c70d63627704cfded3d481128a555d88f7f4ed49..b18db74e7e1a1576f409f7acb1e5d3230b7b1cdb 100644 (file)
@@ -184,7 +184,7 @@ static int rockchip_spi_ofdata_to_platdata(struct udevice *bus)
        struct rockchip_spi_priv *priv = dev_get_priv(bus);
        int ret;
 
-       plat->base = devfdt_get_addr(bus);
+       plat->base = dev_read_addr(bus);
 
        ret = clk_get_by_index(bus, 0, &priv->clk);
        if (ret < 0) {
index a5200d377d129559bf52c89c6ae564686bc56ae6..476d361297a778dd36f6b15f5ef41e241f7ddca7 100644 (file)
@@ -13,6 +13,7 @@ ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_ROCKCHIP_RK3036) += sysreset_rk3036.o
 endif
 obj-$(CONFIG_ROCKCHIP_RK3188) += sysreset_rk3188.o
+obj-$(CONFIG_ROCKCHIP_RK322X) += sysreset_rk322x.o
 obj-$(CONFIG_ROCKCHIP_RK3288) += sysreset_rk3288.o
 obj-$(CONFIG_ROCKCHIP_RK3328) += sysreset_rk3328.o
 obj-$(CONFIG_ROCKCHIP_RK3368) += sysreset_rk3368.o
index eb44965a19d488ac3b43564ef8977f8949a00d32..07d14482d68c0fa6daaa996bb2e11d5a0a0ace9e 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <dm/ofnode.h>
 #include <mapmem.h>
 #include <asm/arch/timer.h>
 #include <dt-structs.h>
@@ -25,17 +26,72 @@ struct rockchip_timer_priv {
        struct rk_timer *timer;
 };
 
-static int rockchip_timer_get_count(struct udevice *dev, u64 *count)
+static inline int64_t rockchip_timer_get_curr_value(struct rk_timer *timer)
 {
-       struct rockchip_timer_priv *priv = dev_get_priv(dev);
        uint64_t timebase_h, timebase_l;
        uint64_t cntr;
 
-       timebase_l = readl(&priv->timer->timer_curr_value0);
-       timebase_h = readl(&priv->timer->timer_curr_value1);
+       timebase_l = readl(&timer->timer_curr_value0);
+       timebase_h = readl(&timer->timer_curr_value1);
 
-       /* timers are down-counting */
        cntr = timebase_h << 32 | timebase_l;
+       return cntr;
+}
+
+#if CONFIG_IS_ENABLED(BOOTSTAGE)
+ulong timer_get_boot_us(void)
+{
+       uint64_t  ticks = 0;
+       uint32_t  rate;
+       uint64_t  us;
+       int ret;
+
+       ret = dm_timer_init();
+
+       if (!ret) {
+               /* The timer is available */
+               rate = timer_get_rate(gd->timer);
+               timer_get_count(gd->timer, &ticks);
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+       } else if (ret == -EAGAIN) {
+               /* We have been called so early that the DM is not ready,... */
+               ofnode node = offset_to_ofnode(-1);
+               struct rk_timer *timer = NULL;
+
+               /*
+                * ... so we try to access the raw timer, if it is specified
+                * via the tick-timer property in /chosen.
+                */
+               node = ofnode_get_chosen_node("tick-timer");
+               if (!ofnode_valid(node)) {
+                       debug("%s: no /chosen/tick-timer\n", __func__);
+                       return 0;
+               }
+
+               timer = (struct rk_timer *)ofnode_get_addr(node);
+
+               /* This timer is down-counting */
+               ticks = ~0uLL - rockchip_timer_get_curr_value(timer);
+               if (ofnode_read_u32(node, "clock-frequency", &rate)) {
+                       debug("%s: could not read clock-frequency\n", __func__);
+                       return 0;
+               }
+#endif
+       } else {
+               return 0;
+       }
+
+       us = (ticks * 1000) / rate;
+       return us;
+}
+#endif
+
+static int rockchip_timer_get_count(struct udevice *dev, u64 *count)
+{
+       struct rockchip_timer_priv *priv = dev_get_priv(dev);
+       uint64_t cntr = rockchip_timer_get_curr_value(priv->timer);
+
+       /* timers are down-counting */
        *count = ~0ull - cntr;
        return 0;
 }
@@ -45,7 +101,9 @@ static int rockchip_clk_ofdata_to_platdata(struct udevice *dev)
 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
        struct rockchip_timer_priv *priv = dev_get_priv(dev);
 
-       priv->timer = (struct rk_timer *)devfdt_get_addr(dev);
+       priv->timer = dev_read_addr_ptr(dev);
+       if (!priv->timer)
+               return -ENOENT;
 #endif
 
        return 0;
@@ -58,6 +116,12 @@ static int rockchip_timer_start(struct udevice *dev)
        const uint32_t reload_val_l = reload_val & 0xffffffff;
        const uint32_t reload_val_h = reload_val >> 32;
 
+       /* don't reinit, if the timer is already running and set up */
+       if ((readl(&priv->timer->timer_ctrl_reg) & 1) == 1 &&
+           (readl(&priv->timer->timer_load_count0) == reload_val_l) &&
+           (readl(&priv->timer->timer_load_count1) == reload_val_h))
+               return 0;
+
        /* disable timer and reset all control */
        writel(0, &priv->timer->timer_ctrl_reg);
        /* write reload value */
@@ -76,7 +140,7 @@ static int rockchip_timer_probe(struct udevice *dev)
        struct rockchip_timer_priv *priv = dev_get_priv(dev);
        struct rockchip_timer_plat *plat = dev_get_platdata(dev);
 
-       priv->timer = map_sysmem(plat->dtd.reg[1], plat->dtd.reg[3]);
+       priv->timer = map_sysmem(plat->dtd.reg[0], plat->dtd.reg[1]);
        uc_priv->clock_rate = plat->dtd.clock_frequency;
 #endif
 
index a84755f4c5a4e6263c9f1ebadeedd76a3961380e..45397b230f03c25ac3a39ede454a4a361bbf42e4 100644 (file)
@@ -8,6 +8,7 @@
 #include <dm.h>
 #include <dm/lists.h>
 #include <dm/device-internal.h>
+#include <dm/root.h>
 #include <clk.h>
 #include <errno.h>
 #include <timer.h>
@@ -54,9 +55,10 @@ static int timer_pre_probe(struct udevice *dev)
                if (IS_ERR_VALUE(ret))
                        return ret;
                uc_priv->clock_rate = ret;
-       } else
-               uc_priv->clock_rate = fdtdec_get_int(gd->fdt_blob,
-                               dev_of_offset(dev),     "clock-frequency", 0);
+       } else {
+               uc_priv->clock_rate =
+                       dev_read_u32_default(dev, "clock-frequency", 0);
+       }
 #endif
 
        return 0;
@@ -83,37 +85,43 @@ u64 timer_conv_64(u32 count)
 
 int notrace dm_timer_init(void)
 {
-       __maybe_unused const void *blob = gd->fdt_blob;
        struct udevice *dev = NULL;
-       int node = -ENOENT;
+       __maybe_unused ofnode node;
        int ret;
 
        if (gd->timer)
                return 0;
 
+       /*
+        * Directly access gd->dm_root to suppress error messages, if the
+        * virtual root driver does not yet exist.
+        */
+       if (gd->dm_root == NULL)
+               return -EAGAIN;
+
 #if !CONFIG_IS_ENABLED(OF_PLATDATA)
        /* Check for a chosen timer to be used for tick */
-       node = fdtdec_get_chosen_node(blob, "tick-timer");
+       node = ofnode_get_chosen_node("tick-timer");
+
+       if (ofnode_valid(node) &&
+           uclass_get_device_by_ofnode(UCLASS_TIMER, node, &dev)) {
+               /*
+                * If the timer is not marked to be bound before
+                * relocation, bind it anyway.
+                */
+               if (!lists_bind_fdt(dm_root(), node, &dev)) {
+                       ret = device_probe(dev);
+                       if (ret)
+                               return ret;
+               }
+       }
 #endif
-       if (node < 0) {
-               /* No chosen timer, trying first available timer */
+
+       if (!dev) {
+               /* Fall back to the first available timer */
                ret = uclass_first_device_err(UCLASS_TIMER, &dev);
                if (ret)
                        return ret;
-       } else {
-               if (uclass_get_device_by_of_offset(UCLASS_TIMER, node, &dev)) {
-                       /*
-                        * If the timer is not marked to be bound before
-                        * relocation, bind it anyway.
-                        */
-                       if (node > 0 &&
-                           !lists_bind_fdt(gd->dm_root, offset_to_ofnode(node),
-                                           &dev)) {
-                               ret = device_probe(dev);
-                               if (ret)
-                                       return ret;
-                       }
-               }
        }
 
        if (dev) {
index 4d1fc9cd13707c8a1caa5d2a3be96d5969c23ce6..9296de65432dce7c13d01d8189d284d47b84d682 100644 (file)
@@ -18,7 +18,7 @@
 #include <asm/msr.h>
 #include <asm/u-boot-x86.h>
 
-#define MAX_NUM_FREQS  8
+#define MAX_NUM_FREQS  9
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -40,17 +40,20 @@ struct freq_desc {
 
 static struct freq_desc freq_desc_tables[] = {
        /* PNW */
-       { 6, 0x27, 0, { 0, 0, 0, 0, 0, 99840, 0, 83200 } },
+       { 6, 0x27, 0, { 0, 0, 0, 0, 0, 99840, 0, 83200, 0 } },
        /* CLV+ */
-       { 6, 0x35, 0, { 0, 133200, 0, 0, 0, 99840, 0, 83200 } },
+       { 6, 0x35, 0, { 0, 133200, 0, 0, 0, 99840, 0, 83200, 0 } },
        /* TNG - Intel Atom processor Z3400 series */
-       { 6, 0x4a, 1, { 0, 100000, 133300, 0, 0, 0, 0, 0 } },
+       { 6, 0x4a, 1, { 0, 100000, 133300, 0, 0, 0, 0, 0, 0 } },
        /* VLV2 - Intel Atom processor E3000, Z3600, Z3700 series */
-       { 6, 0x37, 1, { 83300, 100000, 133300, 116700, 80000, 0, 0, 0 } },
+       { 6, 0x37, 1, { 83300, 100000, 133300, 116700, 80000, 0, 0, 0, 0 } },
        /* ANN - Intel Atom processor Z3500 series */
-       { 6, 0x5a, 1, { 83300, 100000, 133300, 100000, 0, 0, 0, 0 } },
+       { 6, 0x5a, 1, { 83300, 100000, 133300, 100000, 0, 0, 0, 0, 0 } },
+       /* AMT - Intel Atom processor X7-Z8000 and X5-Z8000 series */
+       { 6, 0x4c, 1, { 83300, 100000, 133300, 116700,
+                       80000, 93300, 90000, 88900, 87500 } },
        /* Ivybridge */
-       { 6, 0x3a, 2, { 0, 0, 0, 0, 0, 0, 0, 0 } },
+       { 6, 0x3a, 2, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } },
 };
 
 static int match_cpu(u8 family, u8 model)
@@ -328,17 +331,17 @@ static int tsc_timer_get_count(struct udevice *dev, u64 *count)
        return 0;
 }
 
-static int tsc_timer_probe(struct udevice *dev)
+static void tsc_timer_ensure_setup(void)
 {
-       struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
-
+       if (gd->arch.tsc_base)
+               return;
        gd->arch.tsc_base = rdtsc();
 
        /*
         * If there is no clock frequency specified in the device tree,
         * calibrate it by ourselves.
         */
-       if (!uc_priv->clock_rate) {
+       if (!gd->arch.clock_rate) {
                unsigned long fast_calibrate;
 
                fast_calibrate = cpu_mhz_from_msr();
@@ -348,12 +351,32 @@ static int tsc_timer_probe(struct udevice *dev)
                                panic("TSC frequency is ZERO");
                }
 
-               uc_priv->clock_rate = fast_calibrate * 1000000;
+               gd->arch.clock_rate = fast_calibrate * 1000000;
        }
+}
+
+static int tsc_timer_probe(struct udevice *dev)
+{
+       struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+
+       tsc_timer_ensure_setup();
+       uc_priv->clock_rate = gd->arch.clock_rate;
 
        return 0;
 }
 
+unsigned long notrace timer_early_get_rate(void)
+{
+       tsc_timer_ensure_setup();
+
+       return gd->arch.clock_rate;
+}
+
+u64 notrace timer_early_get_count(void)
+{
+       return rdtsc() - gd->arch.tsc_base;
+}
+
 static const struct timer_ops tsc_timer_ops = {
        .get_count = tsc_timer_get_count,
 };
index f259fb9633212ba42b39d1efe5015fbcc5ac984d..96229da502bc13998721ccef733e4d93021b8302 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/errno.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/crm_regs.h>
+#include <asm/arch/sys_proto.h>
 #include <div64.h>
 #include "ipu.h"
 #include "ipu_regs.h"
@@ -81,6 +82,11 @@ struct ipu_ch_param {
 
 #define IPU_SW_RST_TOUT_USEC   (10000)
 
+#define IPUV3_CLK_MX51         133000000
+#define IPUV3_CLK_MX53         200000000
+#define IPUV3_CLK_MX6Q         264000000
+#define IPUV3_CLK_MX6DL                198000000
+
 void clk_enable(struct clk *clk)
 {
        if (clk) {
@@ -196,7 +202,6 @@ static void clk_ipu_disable(struct clk *clk)
 
 static struct clk ipu_clk = {
        .name = "ipu_clk",
-       .rate = CONFIG_IPUV3_CLK,
 #if defined(CONFIG_MX51) || defined(CONFIG_MX53)
        .enable_reg = (u32 *)(CCM_BASE_ADDR +
                offsetof(struct mxc_ccm_reg, CCGR5)),
@@ -476,6 +481,13 @@ int ipu_probe(void)
        g_pixel_clk[1] = &pixel_clk[1];
 
        g_ipu_clk = &ipu_clk;
+#if defined(CONFIG_MX51)
+       g_ipu_clk->rate = IPUV3_CLK_MX51;
+#elif defined(CONFIG_MX53)
+       g_ipu_clk->rate = IPUV3_CLK_MX53;
+#else
+       g_ipu_clk->rate = is_mx6sdl() ? IPUV3_CLK_MX6DL : IPUV3_CLK_MX6Q;
+#endif
        debug("ipu_clk = %u\n", clk_get_rate(g_ipu_clk));
        g_ldb_clk = &ldb_clk;
        debug("ldb_clk = %u\n", clk_get_rate(g_ldb_clk));
index dab6398bab824d83f4b90674cec10ddf55ec9f64..899527267d4b0c27ea68dfd6e32b905c9b2bb4aa 100644 (file)
@@ -34,6 +34,8 @@ EXT_COBJ-y += lib/div64.o
 EXT_COBJ-y += lib/string.o
 EXT_COBJ-y += lib/time.o
 EXT_COBJ-y += lib/vsprintf.o
+EXT_COBJ-y += lib/charset.o
+EXT_COBJ-$(CONFIG_LIB_UUID) += lib/uuid.o
 EXT_SOBJ-$(CONFIG_PPC) += arch/powerpc/lib/ppcstring.o
 ifeq ($(ARCH),arm)
 EXT_SOBJ-$(CONFIG_USE_ARCH_MEMSET) += arch/arm/lib/memset.o
index 8aabf32c899acb2e3c8990db52e16f235f68c0a2..575c1e55f33395aefb3b72e623c67eb17a2c1687 100644 (file)
@@ -416,3 +416,15 @@ void ub_display_clear(void)
 {
        syscall(API_DISPLAY_CLEAR, NULL);
 }
+
+__weak void *memcpy(void *dest, const void *src, size_t size)
+{
+       unsigned char *dptr = dest;
+       const unsigned char *ptr = src;
+       const unsigned char *end = src + size;
+
+       while (ptr < end)
+               *dptr++ = *ptr++;
+
+       return dest;
+}
index b60e8486c48df3adf64ff88c445dbe98ecf13687..3e2a6b01a89861cc2b7a60c954bab8a07f0c6447 100644 (file)
@@ -5,7 +5,3 @@
 
 obj-$(CONFIG_FS_FAT)   := fat.o
 obj-$(CONFIG_FAT_WRITE):= fat_write.o
-
-ifndef CONFIG_SPL_BUILD
-obj-$(CONFIG_FS_FAT)   += file.o
-endif
index 465a6875edf509a17054adeefa6af73985543bdc..f0284398b41dbed60869deeabadc9407b7e65b80 100644 (file)
@@ -14,6 +14,7 @@
 #include <config.h>
 #include <exports.h>
 #include <fat.h>
+#include <fs.h>
 #include <asm/byteorder.h>
 #include <part.h>
 #include <malloc.h>
@@ -28,11 +29,13 @@ static const int vfat_enabled = 0;
 #endif
 
 /*
- * Convert a string to lowercase.
+ * Convert a string to lowercase.  Converts at most 'len' characters,
+ * 'len' may be larger than the length of 'str' if 'str' is NULL
+ * terminated.
  */
-static void downcase(char *str)
+static void downcase(char *str, size_t len)
 {
-       while (*str != '\0') {
+       while (*str != '\0' && len--) {
                *str = tolower(*str);
                str++;
        }
@@ -118,22 +121,6 @@ int fat_register_device(struct blk_desc *dev_desc, int part_no)
        return fat_set_blk_dev(dev_desc, &info);
 }
 
-/*
- * Get the first occurence of a directory delimiter ('/' or '\') in a string.
- * Return index into string if found, -1 otherwise.
- */
-static int dirdelim(char *str)
-{
-       char *start = str;
-
-       while (*str != '\0') {
-               if (ISDIRDELIM(*str))
-                       return str - start;
-               str++;
-       }
-       return -1;
-}
-
 /*
  * Extract zero terminated short name from a directory entry.
  */
@@ -146,10 +133,13 @@ static void get_name(dir_entry *dirent, char *s_name)
        ptr = s_name;
        while (*ptr && *ptr != ' ')
                ptr++;
+       if (dirent->lcase & CASE_LOWER_BASE)
+               downcase(s_name, (unsigned)(ptr - s_name));
        if (dirent->ext[0] && dirent->ext[0] != ' ') {
-               *ptr = '.';
-               ptr++;
+               *ptr++ = '.';
                memcpy(ptr, dirent->ext, 3);
+               if (dirent->lcase & CASE_LOWER_EXT)
+                       downcase(ptr, 3);
                ptr[3] = '\0';
                while (*ptr && *ptr != ' ')
                        ptr++;
@@ -159,7 +149,6 @@ static void get_name(dir_entry *dirent, char *s_name)
                *s_name = '\0';
        else if (*s_name == aRING)
                *s_name = DELETED_FLAG;
-       downcase(s_name);
 }
 
 static int flush_dirty_fat_buffer(fsdata *mydata);
@@ -268,8 +257,7 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
        int ret;
 
        if (clustnum > 0) {
-               startsect = mydata->data_begin +
-                               clustnum * mydata->clust_size;
+               startsect = clust_to_sect(mydata, clustnum);
        } else {
                startsect = mydata->rootdir_sect;
        }
@@ -468,95 +456,6 @@ static int slot2str(dir_slot *slotptr, char *l_name, int *idx)
        return 0;
 }
 
-/*
- * Extract the full long filename starting at 'retdent' (which is really
- * a slot) into 'l_name'. If successful also copy the real directory entry
- * into 'retdent'
- * Return 0 on success, -1 otherwise.
- */
-static int
-get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,
-            dir_entry *retdent, char *l_name)
-{
-       dir_entry *realdent;
-       dir_slot *slotptr = (dir_slot *)retdent;
-       __u8 *buflimit = cluster + mydata->sect_size * ((curclust == 0) ?
-                                                       PREFETCH_BLOCKS :
-                                                       mydata->clust_size);
-       __u8 counter = (slotptr->id & ~LAST_LONG_ENTRY_MASK) & 0xff;
-       int idx = 0;
-
-       if (counter > VFAT_MAXSEQ) {
-               debug("Error: VFAT name is too long\n");
-               return -1;
-       }
-
-       while ((__u8 *)slotptr < buflimit) {
-               if (counter == 0)
-                       break;
-               if (((slotptr->id & ~LAST_LONG_ENTRY_MASK) & 0xff) != counter)
-                       return -1;
-               slotptr++;
-               counter--;
-       }
-
-       if ((__u8 *)slotptr >= buflimit) {
-               dir_slot *slotptr2;
-
-               if (curclust == 0)
-                       return -1;
-               curclust = get_fatent(mydata, curclust);
-               if (CHECK_CLUST(curclust, mydata->fatsize)) {
-                       debug("curclust: 0x%x\n", curclust);
-                       printf("Invalid FAT entry\n");
-                       return -1;
-               }
-
-               if (get_cluster(mydata, curclust, get_contents_vfatname_block,
-                               mydata->clust_size * mydata->sect_size) != 0) {
-                       debug("Error: reading directory block\n");
-                       return -1;
-               }
-
-               slotptr2 = (dir_slot *)get_contents_vfatname_block;
-               while (counter > 0) {
-                       if (((slotptr2->id & ~LAST_LONG_ENTRY_MASK)
-                           & 0xff) != counter)
-                               return -1;
-                       slotptr2++;
-                       counter--;
-               }
-
-               /* Save the real directory entry */
-               realdent = (dir_entry *)slotptr2;
-               while ((__u8 *)slotptr2 > get_contents_vfatname_block) {
-                       slotptr2--;
-                       slot2str(slotptr2, l_name, &idx);
-               }
-       } else {
-               /* Save the real directory entry */
-               realdent = (dir_entry *)slotptr;
-       }
-
-       do {
-               slotptr--;
-               if (slot2str(slotptr, l_name, &idx))
-                       break;
-       } while (!(slotptr->id & LAST_LONG_ENTRY_MASK));
-
-       l_name[idx] = '\0';
-       if (*l_name == DELETED_FLAG)
-               *l_name = '\0';
-       else if (*l_name == aRING)
-               *l_name = DELETED_FLAG;
-       downcase(l_name);
-
-       /* Return the real directory entry */
-       memcpy(retdent, realdent, sizeof(dir_entry));
-
-       return 0;
-}
-
 /* Calculate short name checksum */
 static __u8 mkcksum(const char name[8], const char ext[3])
 {
@@ -573,169 +472,13 @@ static __u8 mkcksum(const char name[8], const char ext[3])
 }
 
 /*
- * Get the directory entry associated with 'filename' from the directory
- * starting at 'startsect'
+ * TODO these should go away once fat_write is reworked to use the
+ * directory iterator
  */
 __u8 get_dentfromdir_block[MAX_CLUSTSIZE]
        __aligned(ARCH_DMA_MINALIGN);
-
-static dir_entry *get_dentfromdir(fsdata *mydata, int startsect,
-                                 char *filename, dir_entry *retdent,
-                                 int dols)
-{
-       __u16 prevcksum = 0xffff;
-       __u32 curclust = START(retdent);
-       int files = 0, dirs = 0;
-
-       debug("get_dentfromdir: %s\n", filename);
-
-       while (1) {
-               dir_entry *dentptr;
-
-               int i;
-
-               if (get_cluster(mydata, curclust, get_dentfromdir_block,
-                               mydata->clust_size * mydata->sect_size) != 0) {
-                       debug("Error: reading directory block\n");
-                       return NULL;
-               }
-
-               dentptr = (dir_entry *)get_dentfromdir_block;
-
-               for (i = 0; i < DIRENTSPERCLUST; i++) {
-                       char s_name[14], l_name[VFAT_MAXLEN_BYTES];
-
-                       l_name[0] = '\0';
-                       if (dentptr->name[0] == DELETED_FLAG) {
-                               dentptr++;
-                               continue;
-                       }
-                       if ((dentptr->attr & ATTR_VOLUME)) {
-                               if (vfat_enabled &&
-                                   (dentptr->attr & ATTR_VFAT) == ATTR_VFAT &&
-                                   (dentptr->name[0] & LAST_LONG_ENTRY_MASK)) {
-                                       prevcksum = ((dir_slot *)dentptr)->alias_checksum;
-                                       get_vfatname(mydata, curclust,
-                                                    get_dentfromdir_block,
-                                                    dentptr, l_name);
-                                       if (dols) {
-                                               int isdir;
-                                               char dirc;
-                                               int doit = 0;
-
-                                               isdir = (dentptr->attr & ATTR_DIR);
-
-                                               if (isdir) {
-                                                       dirs++;
-                                                       dirc = '/';
-                                                       doit = 1;
-                                               } else {
-                                                       dirc = ' ';
-                                                       if (l_name[0] != 0) {
-                                                               files++;
-                                                               doit = 1;
-                                                       }
-                                               }
-                                               if (doit) {
-                                                       if (dirc == ' ') {
-                                                               printf(" %8u   %s%c\n",
-                                                                      FAT2CPU32(dentptr->size),
-                                                                       l_name,
-                                                                       dirc);
-                                                       } else {
-                                                               printf("            %s%c\n",
-                                                                       l_name,
-                                                                       dirc);
-                                                       }
-                                               }
-                                               dentptr++;
-                                               continue;
-                                       }
-                                       debug("vfatname: |%s|\n", l_name);
-                               } else {
-                                       /* Volume label or VFAT entry */
-                                       dentptr++;
-                                       continue;
-                               }
-                       }
-                       if (dentptr->name[0] == 0) {
-                               if (dols) {
-                                       printf("\n%d file(s), %d dir(s)\n\n",
-                                               files, dirs);
-                               }
-                               debug("Dentname == NULL - %d\n", i);
-                               return NULL;
-                       }
-                       if (vfat_enabled) {
-                               __u8 csum = mkcksum(dentptr->name, dentptr->ext);
-                               if (dols && csum == prevcksum) {
-                                       prevcksum = 0xffff;
-                                       dentptr++;
-                                       continue;
-                               }
-                       }
-
-                       get_name(dentptr, s_name);
-                       if (dols) {
-                               int isdir = (dentptr->attr & ATTR_DIR);
-                               char dirc;
-                               int doit = 0;
-
-                               if (isdir) {
-                                       dirs++;
-                                       dirc = '/';
-                                       doit = 1;
-                               } else {
-                                       dirc = ' ';
-                                       if (s_name[0] != 0) {
-                                               files++;
-                                               doit = 1;
-                                       }
-                               }
-
-                               if (doit) {
-                                       if (dirc == ' ') {
-                                               printf(" %8u   %s%c\n",
-                                                      FAT2CPU32(dentptr->size),
-                                                       s_name, dirc);
-                                       } else {
-                                               printf("            %s%c\n",
-                                                       s_name, dirc);
-                                       }
-                               }
-
-                               dentptr++;
-                               continue;
-                       }
-
-                       if (strcmp(filename, s_name)
-                           && strcmp(filename, l_name)) {
-                               debug("Mismatch: |%s|%s|\n", s_name, l_name);
-                               dentptr++;
-                               continue;
-                       }
-
-                       memcpy(retdent, dentptr, sizeof(dir_entry));
-
-                       debug("DentName: %s", s_name);
-                       debug(", start: 0x%x", START(dentptr));
-                       debug(", size:  0x%x %s\n",
-                             FAT2CPU32(dentptr->size),
-                             (dentptr->attr & ATTR_DIR) ? "(DIR)" : "");
-
-                       return retdent;
-               }
-
-               curclust = get_fatent(mydata, curclust);
-               if (CHECK_CLUST(curclust, mydata->fatsize)) {
-                       debug("curclust: 0x%x\n", curclust);
-                       printf("Invalid FAT entry\n");
-                       return NULL;
-               }
-       }
-
-       return NULL;
-}
+__u8 do_fat_read_at_block[MAX_CLUSTSIZE]
+       __aligned(ARCH_DMA_MINALIGN);
 
 /*
  * Read boot sector and volume info from a FAT filesystem
@@ -808,39 +551,19 @@ exit:
        return ret;
 }
 
-__u8 do_fat_read_at_block[MAX_CLUSTSIZE]
-       __aligned(ARCH_DMA_MINALIGN);
-
-int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
-                  loff_t maxsize, int dols, int dogetsize, loff_t *size)
+static int get_fs_info(fsdata *mydata)
 {
-       char fnamecopy[2048];
        boot_sector bs;
        volume_info volinfo;
-       fsdata datablock;
-       fsdata *mydata = &datablock;
-       dir_entry *dentptr = NULL;
-       __u16 prevcksum = 0xffff;
-       char *subname = "";
-       __u32 cursect;
-       int idx, isdir = 0;
-       int files = 0, dirs = 0;
-       int ret = -1;
-       int firsttime;
-       __u32 root_cluster = 0;
-       __u32 read_blk;
-       int rootdir_size = 0;
-       int buffer_blk_cnt;
-       int do_read;
-       __u8 *dir_ptr;
-
-       if (read_bootsectandvi(&bs, &volinfo, &mydata->fatsize)) {
+       int ret;
+
+       ret = read_bootsectandvi(&bs, &volinfo, &mydata->fatsize);
+       if (ret) {
                debug("Error: reading boot sector\n");
-               return -1;
+               return ret;
        }
 
        if (mydata->fatsize == 32) {
-               root_cluster = bs.root_cluster;
                mydata->fatlength = bs.fat32_length;
        } else {
                mydata->fatlength = bs.fat_length;
@@ -848,8 +571,7 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
 
        mydata->fat_sect = bs.reserved;
 
-       cursect = mydata->rootdir_sect
-               = mydata->fat_sect + mydata->fatlength * bs.fats;
+       mydata->rootdir_sect = mydata->fat_sect + mydata->fatlength * bs.fats;
 
        mydata->sect_size = (bs.sector_size[1] << 8) + bs.sector_size[0];
        mydata->clust_size = bs.cluster_size;
@@ -862,14 +584,17 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
        if (mydata->fatsize == 32) {
                mydata->data_begin = mydata->rootdir_sect -
                                        (mydata->clust_size * 2);
+               mydata->root_cluster = bs.root_cluster;
        } else {
-               rootdir_size = ((bs.dir_entries[1]  * (int)256 +
-                                bs.dir_entries[0]) *
-                                sizeof(dir_entry)) /
-                                mydata->sect_size;
+               mydata->rootdir_size = ((bs.dir_entries[1]  * (int)256 +
+                                        bs.dir_entries[0]) *
+                                        sizeof(dir_entry)) /
+                                        mydata->sect_size;
                mydata->data_begin = mydata->rootdir_sect +
-                                       rootdir_size -
+                                       mydata->rootdir_size -
                                        (mydata->clust_size * 2);
+               mydata->root_cluster =
+                       sect_to_clust(mydata, mydata->rootdir_sect);
        }
 
        mydata->fatbufnum = -1;
@@ -887,355 +612,361 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
               mydata->fatsize, mydata->fat_sect, mydata->fatlength);
        debug("Rootdir begins at cluster: %d, sector: %d, offset: %x\n"
               "Data begins at: %d\n",
-              root_cluster,
+              mydata->root_cluster,
               mydata->rootdir_sect,
               mydata->rootdir_sect * mydata->sect_size, mydata->data_begin);
        debug("Sector size: %d, cluster size: %d\n", mydata->sect_size,
              mydata->clust_size);
 
-       /* "cwd" is always the root... */
-       while (ISDIRDELIM(*filename))
-               filename++;
+       return 0;
+}
 
-       /* Make a copy of the filename and convert it to lowercase */
-       strcpy(fnamecopy, filename);
-       downcase(fnamecopy);
 
-root_reparse:
-       if (*fnamecopy == '\0') {
-               if (!dols)
-                       goto exit;
+/*
+ * Directory iterator, to simplify filesystem traversal
+ *
+ * Implements an iterator pattern to traverse directory tables,
+ * transparently handling directory tables split across multiple
+ * clusters, and the difference between FAT12/FAT16 root directory
+ * (contiguous) and subdirectories + FAT32 root (chained).
+ *
+ * Rough usage:
+ *
+ *   for (fat_itr_root(&itr, fsdata); fat_itr_next(&itr); ) {
+ *      // to traverse down to a subdirectory pointed to by
+ *      // current iterator position:
+ *      fat_itr_child(&itr, &itr);
+ *   }
+ *
+ * For more complete example, see fat_itr_resolve()
+ */
 
-               dols = LS_ROOT;
-       } else if ((idx = dirdelim(fnamecopy)) >= 0) {
-               isdir = 1;
-               fnamecopy[idx] = '\0';
-               subname = fnamecopy + idx + 1;
-
-               /* Handle multiple delimiters */
-               while (ISDIRDELIM(*subname))
-                       subname++;
-       } else if (dols) {
-               isdir = 1;
-       }
+typedef struct {
+       fsdata    *fsdata;        /* filesystem parameters */
+       unsigned   clust;         /* current cluster */
+       int        last_cluster;  /* set once we've read last cluster */
+       int        is_root;       /* is iterator at root directory */
+       int        remaining;     /* remaining dent's in current cluster */
 
-       buffer_blk_cnt = 0;
-       firsttime = 1;
-       while (1) {
-               int i;
+       /* current iterator position values: */
+       dir_entry *dent;          /* current directory entry */
+       char       l_name[VFAT_MAXLEN_BYTES];    /* long (vfat) name */
+       char       s_name[14];    /* short 8.3 name */
+       char      *name;          /* l_name if there is one, else s_name */
 
-               if (mydata->fatsize == 32 || firsttime) {
-                       dir_ptr = do_fat_read_at_block;
-                       firsttime = 0;
-               } else {
-                       /**
-                        * FAT16 sector buffer modification:
-                        * Each loop, the second buffered block is moved to
-                        * the buffer begin, and two next sectors are read
-                        * next to the previously moved one. So the sector
-                        * buffer keeps always 3 sectors for fat16.
-                        * And the current sector is the buffer second sector
-                        * beside the "firsttime" read, when it is the first one.
-                        *
-                        * PREFETCH_BLOCKS is 2 for FAT16 == loop[0:1]
-                        * n = computed root dir sector
-                        * loop |  cursect-1  | cursect    | cursect+1  |
-                        *   0  |  sector n+0 | sector n+1 | none       |
-                        *   1  |  none       | sector n+0 | sector n+1 |
-                        *   0  |  sector n+1 | sector n+2 | sector n+3 |
-                        *   1  |  sector n+3 | ...
-                       */
-                       dir_ptr = (do_fat_read_at_block + mydata->sect_size);
-                       memcpy(do_fat_read_at_block, dir_ptr, mydata->sect_size);
-               }
+       /* storage for current cluster in memory: */
+       u8         block[MAX_CLUSTSIZE] __aligned(ARCH_DMA_MINALIGN);
+} fat_itr;
 
-               do_read = 1;
+static int fat_itr_isdir(fat_itr *itr);
 
-               if (mydata->fatsize == 32 && buffer_blk_cnt)
-                       do_read = 0;
+/**
+ * fat_itr_root() - initialize an iterator to start at the root
+ * directory
+ *
+ * @itr: iterator to initialize
+ * @fsdata: filesystem data for the partition
+ * @return 0 on success, else -errno
+ */
+static int fat_itr_root(fat_itr *itr, fsdata *fsdata)
+{
+       if (get_fs_info(fsdata))
+               return -ENXIO;
 
-               if (do_read) {
-                       read_blk = (mydata->fatsize == 32) ?
-                                   mydata->clust_size : PREFETCH_BLOCKS;
+       itr->fsdata = fsdata;
+       itr->clust = fsdata->root_cluster;
+       itr->dent = NULL;
+       itr->remaining = 0;
+       itr->last_cluster = 0;
+       itr->is_root = 1;
 
-                       debug("FAT read(sect=%d, cnt:%d), clust_size=%d, DIRENTSPERBLOCK=%zd\n",
-                               cursect, read_blk, mydata->clust_size, DIRENTSPERBLOCK);
+       return 0;
+}
 
-                       if (disk_read(cursect, read_blk, dir_ptr) < 0) {
-                               debug("Error: reading rootdir block\n");
-                               goto exit;
-                       }
+/**
+ * fat_itr_child() - initialize an iterator to descend into a sub-
+ * directory
+ *
+ * Initializes 'itr' to iterate the contents of the directory at
+ * the current cursor position of 'parent'.  It is an error to
+ * call this if the current cursor of 'parent' is pointing at a
+ * regular file.
+ *
+ * Note that 'itr' and 'parent' can be the same pointer if you do
+ * not need to preserve 'parent' after this call, which is useful
+ * for traversing directory structure to resolve a file/directory.
+ *
+ * @itr: iterator to initialize
+ * @parent: the iterator pointing at a directory entry in the
+ *    parent directory of the directory to iterate
+ */
+static void fat_itr_child(fat_itr *itr, fat_itr *parent)
+{
+       fsdata *mydata = parent->fsdata;  /* for silly macros */
+       unsigned clustnum = START(parent->dent);
 
-                       dentptr = (dir_entry *)dir_ptr;
-               }
+       assert(fat_itr_isdir(parent));
 
-               for (i = 0; i < DIRENTSPERBLOCK; i++) {
-                       char s_name[14], l_name[VFAT_MAXLEN_BYTES];
-                       __u8 csum;
+       itr->fsdata = parent->fsdata;
+       if (clustnum > 0) {
+               itr->clust = clustnum;
+       } else {
+               itr->clust = parent->fsdata->root_cluster;
+       }
+       itr->dent = NULL;
+       itr->remaining = 0;
+       itr->last_cluster = 0;
+       itr->is_root = 0;
+}
 
-                       l_name[0] = '\0';
-                       if (dentptr->name[0] == DELETED_FLAG) {
-                               dentptr++;
-                               continue;
-                       }
+static void *next_cluster(fat_itr *itr)
+{
+       fsdata *mydata = itr->fsdata;  /* for silly macros */
+       int ret;
+       u32 sect;
+
+       /* have we reached the end? */
+       if (itr->last_cluster)
+               return NULL;
+
+       sect = clust_to_sect(itr->fsdata, itr->clust);
+
+       debug("FAT read(sect=%d), clust_size=%d, DIRENTSPERBLOCK=%zd\n",
+             sect, itr->fsdata->clust_size, DIRENTSPERBLOCK);
+
+       /*
+        * NOTE: do_fat_read_at() had complicated logic to deal w/
+        * vfat names that span multiple clusters in the fat16 case,
+        * which get_dentfromdir() probably also needed (and was
+        * missing).  And not entirely sure what fat32 didn't have
+        * the same issue..  We solve that by only caring about one
+        * dent at a time and iteratively constructing the vfat long
+        * name.
+        */
+       ret = disk_read(sect, itr->fsdata->clust_size,
+                       itr->block);
+       if (ret < 0) {
+               debug("Error: reading block\n");
+               return NULL;
+       }
 
-                       if (vfat_enabled)
-                               csum = mkcksum(dentptr->name, dentptr->ext);
-
-                       if (dentptr->attr & ATTR_VOLUME) {
-                               if (vfat_enabled &&
-                                   (dentptr->attr & ATTR_VFAT) == ATTR_VFAT &&
-                                   (dentptr->name[0] & LAST_LONG_ENTRY_MASK)) {
-                                       prevcksum =
-                                               ((dir_slot *)dentptr)->alias_checksum;
-
-                                       get_vfatname(mydata,
-                                                    root_cluster,
-                                                    dir_ptr,
-                                                    dentptr, l_name);
-
-                                       if (dols == LS_ROOT) {
-                                               char dirc;
-                                               int doit = 0;
-                                               int isdir =
-                                                       (dentptr->attr & ATTR_DIR);
-
-                                               if (isdir) {
-                                                       dirs++;
-                                                       dirc = '/';
-                                                       doit = 1;
-                                               } else {
-                                                       dirc = ' ';
-                                                       if (l_name[0] != 0) {
-                                                               files++;
-                                                               doit = 1;
-                                                       }
-                                               }
-                                               if (doit) {
-                                                       if (dirc == ' ') {
-                                                               printf(" %8u   %s%c\n",
-                                                                      FAT2CPU32(dentptr->size),
-                                                                       l_name,
-                                                                       dirc);
-                                                       } else {
-                                                               printf("            %s%c\n",
-                                                                       l_name,
-                                                                       dirc);
-                                                       }
-                                               }
-                                               dentptr++;
-                                               continue;
-                                       }
-                                       debug("Rootvfatname: |%s|\n",
-                                              l_name);
-                               } else {
-                                       /* Volume label or VFAT entry */
-                                       dentptr++;
-                                       continue;
-                               }
-                       } else if (dentptr->name[0] == 0) {
-                               debug("RootDentname == NULL - %d\n", i);
-                               if (dols == LS_ROOT) {
-                                       printf("\n%d file(s), %d dir(s)\n\n",
-                                               files, dirs);
-                                       ret = 0;
-                               }
-                               goto exit;
-                       }
-                       else if (vfat_enabled &&
-                                dols == LS_ROOT && csum == prevcksum) {
-                               prevcksum = 0xffff;
-                               dentptr++;
-                               continue;
-                       }
+       if (itr->is_root && itr->fsdata->fatsize != 32) {
+               itr->clust++;
+               sect = clust_to_sect(itr->fsdata, itr->clust);
+               if (sect - itr->fsdata->rootdir_sect >=
+                   itr->fsdata->rootdir_size) {
+                       debug("cursect: 0x%x\n", itr->clust);
+                       itr->last_cluster = 1;
+               }
+       } else {
+               itr->clust = get_fatent(itr->fsdata, itr->clust);
+               if (CHECK_CLUST(itr->clust, itr->fsdata->fatsize)) {
+                       debug("cursect: 0x%x\n", itr->clust);
+                       itr->last_cluster = 1;
+               }
+       }
 
-                       get_name(dentptr, s_name);
-
-                       if (dols == LS_ROOT) {
-                               int isdir = (dentptr->attr & ATTR_DIR);
-                               char dirc;
-                               int doit = 0;
-
-                               if (isdir) {
-                                       dirc = '/';
-                                       if (s_name[0] != 0) {
-                                               dirs++;
-                                               doit = 1;
-                                       }
-                               } else {
-                                       dirc = ' ';
-                                       if (s_name[0] != 0) {
-                                               files++;
-                                               doit = 1;
-                                       }
-                               }
-                               if (doit) {
-                                       if (dirc == ' ') {
-                                               printf(" %8u   %s%c\n",
-                                                      FAT2CPU32(dentptr->size),
-                                                       s_name, dirc);
-                                       } else {
-                                               printf("            %s%c\n",
-                                                       s_name, dirc);
-                                       }
-                               }
-                               dentptr++;
-                               continue;
-                       }
+       return itr->block;
+}
 
-                       if (strcmp(fnamecopy, s_name)
-                           && strcmp(fnamecopy, l_name)) {
-                               debug("RootMismatch: |%s|%s|\n", s_name,
-                                      l_name);
-                               dentptr++;
-                               continue;
-                       }
+static dir_entry *next_dent(fat_itr *itr)
+{
+       if (itr->remaining == 0) {
+               struct dir_entry *dent = next_cluster(itr);
+               unsigned nbytes = itr->fsdata->sect_size *
+                       itr->fsdata->clust_size;
 
-                       if (isdir && !(dentptr->attr & ATTR_DIR))
-                               goto exit;
+               /* have we reached the last cluster? */
+               if (!dent)
+                       return NULL;
 
-                       debug("RootName: %s", s_name);
-                       debug(", start: 0x%x", START(dentptr));
-                       debug(", size:  0x%x %s\n",
-                              FAT2CPU32(dentptr->size),
-                              isdir ? "(DIR)" : "");
+               itr->remaining = nbytes / sizeof(dir_entry) - 1;
+               itr->dent = dent;
+       } else {
+               itr->remaining--;
+               itr->dent++;
+       }
 
-                       goto rootdir_done;      /* We got a match */
-               }
-               debug("END LOOP: buffer_blk_cnt=%d   clust_size=%d\n", buffer_blk_cnt,
-                      mydata->clust_size);
+       /* have we reached the last valid entry? */
+       if (itr->dent->name[0] == 0)
+               return NULL;
 
-               /*
-                * On FAT32 we must fetch the FAT entries for the next
-                * root directory clusters when a cluster has been
-                * completely processed.
-                */
-               ++buffer_blk_cnt;
-               int rootdir_end = 0;
-               if (mydata->fatsize == 32) {
-                       if (buffer_blk_cnt == mydata->clust_size) {
-                               int nxtsect = 0;
-                               int nxt_clust = 0;
+       return itr->dent;
+}
+
+static dir_entry *extract_vfat_name(fat_itr *itr)
+{
+       struct dir_entry *dent = itr->dent;
+       int seqn = itr->dent->name[0] & ~LAST_LONG_ENTRY_MASK;
+       u8 chksum, alias_checksum = ((dir_slot *)dent)->alias_checksum;
+       int n = 0;
 
-                               nxt_clust = get_fatent(mydata, root_cluster);
-                               rootdir_end = CHECK_CLUST(nxt_clust, 32);
+       while (seqn--) {
+               char buf[13];
+               int idx = 0;
 
-                               nxtsect = mydata->data_begin +
-                                       (nxt_clust * mydata->clust_size);
+               slot2str((dir_slot *)dent, buf, &idx);
 
-                               root_cluster = nxt_clust;
+               /* shift accumulated long-name up and copy new part in: */
+               memmove(itr->l_name + idx, itr->l_name, n);
+               memcpy(itr->l_name, buf, idx);
+               n += idx;
 
-                               cursect = nxtsect;
-                               buffer_blk_cnt = 0;
-                       }
-               } else {
-                       if (buffer_blk_cnt == PREFETCH_BLOCKS)
-                               buffer_blk_cnt = 0;
+               dent = next_dent(itr);
+               if (!dent)
+                       return NULL;
+       }
 
-                       rootdir_end = (++cursect - mydata->rootdir_sect >=
-                                      rootdir_size);
-               }
+       itr->l_name[n] = '\0';
 
-               /* If end of rootdir reached */
-               if (rootdir_end) {
-                       if (dols == LS_ROOT) {
-                               printf("\n%d file(s), %d dir(s)\n\n",
-                                      files, dirs);
-                               *size = 0;
-                       }
-                       goto exit;
-               }
+       chksum = mkcksum(dent->name, dent->ext);
+
+       /* checksum mismatch could mean deleted file, etc.. skip it: */
+       if (chksum != alias_checksum) {
+               debug("** chksum=%x, alias_checksum=%x, l_name=%s, s_name=%8s.%3s\n",
+                     chksum, alias_checksum, itr->l_name, dent->name, dent->ext);
+               return NULL;
        }
-rootdir_done:
 
-       firsttime = 1;
+       return dent;
+}
+
+/**
+ * fat_itr_next() - step to the next entry in a directory
+ *
+ * Must be called once on a new iterator before the cursor is valid.
+ *
+ * @itr: the iterator to iterate
+ * @return boolean, 1 if success or 0 if no more entries in the
+ *    current directory
+ */
+static int fat_itr_next(fat_itr *itr)
+{
+       dir_entry *dent;
 
-       while (isdir) {
-               int startsect = mydata->data_begin
-                       + START(dentptr) * mydata->clust_size;
-               dir_entry dent;
-               char *nextname = NULL;
+       itr->name = NULL;
 
-               dent = *dentptr;
-               dentptr = &dent;
+       while (1) {
+               dent = next_dent(itr);
+               if (!dent)
+                       return 0;
 
-               idx = dirdelim(subname);
+               if (dent->name[0] == DELETED_FLAG ||
+                   dent->name[0] == aRING)
+                       continue;
 
-               if (idx >= 0) {
-                       subname[idx] = '\0';
-                       nextname = subname + idx + 1;
-                       /* Handle multiple delimiters */
-                       while (ISDIRDELIM(*nextname))
-                               nextname++;
-                       if (dols && *nextname == '\0')
-                               firsttime = 0;
-               } else {
-                       if (dols && firsttime) {
-                               firsttime = 0;
+               if (dent->attr & ATTR_VOLUME) {
+                       if (vfat_enabled &&
+                           (dent->attr & ATTR_VFAT) == ATTR_VFAT &&
+                           (dent->name[0] & LAST_LONG_ENTRY_MASK)) {
+                               dent = extract_vfat_name(itr);
+                               if (!dent)
+                                       continue;
+                               itr->name = itr->l_name;
+                               break;
                        } else {
-                               isdir = 0;
+                               /* Volume label or VFAT entry, skip */
+                               continue;
                        }
                }
 
-               if (get_dentfromdir(mydata, startsect, subname, dentptr,
-                                    isdir ? 0 : dols) == NULL) {
-                       if (dols && !isdir)
-                               *size = 0;
-                       goto exit;
-               }
+               break;
+       }
 
-               if (isdir && !(dentptr->attr & ATTR_DIR))
-                       goto exit;
+       get_name(dent, itr->s_name);
+       if (!itr->name)
+               itr->name = itr->s_name;
 
-               /*
-                * If we are looking for a directory, and found a directory
-                * type entry, and the entry is for the root directory (as
-                * denoted by a cluster number of 0), jump back to the start
-                * of the function, since at least on FAT12/16, the root dir
-                * lives in a hard-coded location and needs special handling
-                * to parse, rather than simply following the cluster linked
-                * list in the FAT, like other directories.
-                */
-               if (isdir && (dentptr->attr & ATTR_DIR) && !START(dentptr)) {
-                       /*
-                        * Modify the filename to remove the prefix that gets
-                        * back to the root directory, so the initial root dir
-                        * parsing code can continue from where we are without
-                        * confusion.
-                        */
-                       strcpy(fnamecopy, nextname ?: "");
-                       /*
-                        * Set up state the same way as the function does when
-                        * first started. This is required for the root dir
-                        * parsing code operates in its expected environment.
-                        */
-                       subname = "";
-                       cursect = mydata->rootdir_sect;
-                       isdir = 0;
-                       goto root_reparse;
-               }
+       return 1;
+}
 
-               if (idx >= 0)
-                       subname = nextname;
-       }
+/**
+ * fat_itr_isdir() - is current cursor position pointing to a directory
+ *
+ * @itr: the iterator
+ * @return true if cursor is at a directory
+ */
+static int fat_itr_isdir(fat_itr *itr)
+{
+       return !!(itr->dent->attr & ATTR_DIR);
+}
 
-       if (dogetsize) {
-               *size = FAT2CPU32(dentptr->size);
-               ret = 0;
-       } else {
-               ret = get_contents(mydata, dentptr, pos, buffer, maxsize, size);
-       }
-       debug("Size: %u, got: %llu\n", FAT2CPU32(dentptr->size), *size);
+/*
+ * Helpers:
+ */
 
-exit:
-       free(mydata->fatbuf);
-       return ret;
-}
+#define TYPE_FILE 0x1
+#define TYPE_DIR  0x2
+#define TYPE_ANY  (TYPE_FILE | TYPE_DIR)
 
-int do_fat_read(const char *filename, void *buffer, loff_t maxsize, int dols,
-               loff_t *actread)
+/**
+ * fat_itr_resolve() - traverse directory structure to resolve the
+ * requested path.
+ *
+ * Traverse directory structure to the requested path.  If the specified
+ * path is to a directory, this will descend into the directory and
+ * leave it iterator at the start of the directory.  If the path is to a
+ * file, it will leave the iterator in the parent directory with current
+ * cursor at file's entry in the directory.
+ *
+ * @itr: iterator initialized to root
+ * @path: the requested path
+ * @type: bitmask of allowable file types
+ * @return 0 on success or -errno
+ */
+static int fat_itr_resolve(fat_itr *itr, const char *path, unsigned type)
 {
-       return do_fat_read_at(filename, 0, buffer, maxsize, dols, 0, actread);
+       const char *next;
+
+       /* chomp any extra leading slashes: */
+       while (path[0] && ISDIRDELIM(path[0]))
+               path++;
+
+       /* are we at the end? */
+       if (strlen(path) == 0) {
+               if (!(type & TYPE_DIR))
+                       return -ENOENT;
+               return 0;
+       }
+
+       /* find length of next path entry: */
+       next = path;
+       while (next[0] && !ISDIRDELIM(next[0]))
+               next++;
+
+       while (fat_itr_next(itr)) {
+               int match = 0;
+               unsigned n = max(strlen(itr->name), (size_t)(next - path));
+
+               /* check both long and short name: */
+               if (!strncasecmp(path, itr->name, n))
+                       match = 1;
+               else if (itr->name != itr->s_name &&
+                        !strncasecmp(path, itr->s_name, n))
+                       match = 1;
+
+               if (!match)
+                       continue;
+
+               if (fat_itr_isdir(itr)) {
+                       /* recurse into directory: */
+                       fat_itr_child(itr, itr);
+                       return fat_itr_resolve(itr, next, type);
+               } else if (next[0]) {
+                       /*
+                        * If next is not empty then we have a case
+                        * like: /path/to/realfile/nonsense
+                        */
+                       debug("bad trailing path: %s\n", next);
+                       return -ENOENT;
+               } else if (!(type & TYPE_FILE)) {
+                       return -ENOTDIR;
+               } else {
+                       return 0;
+               }
+       }
+
+       return -ENOENT;
 }
 
 int file_fat_detectfs(void)
@@ -1300,33 +1031,73 @@ int file_fat_detectfs(void)
        return 0;
 }
 
-int file_fat_ls(const char *dir)
-{
-       loff_t size;
-
-       return do_fat_read(dir, NULL, 0, LS_YES, &size);
-}
-
 int fat_exists(const char *filename)
 {
+       fsdata fsdata;
+       fat_itr itrblock, *itr = &itrblock;
        int ret;
-       loff_t size;
 
-       ret = do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1, &size);
+       ret = fat_itr_root(itr, &fsdata);
+       if (ret)
+               return 0;
+
+       ret = fat_itr_resolve(itr, filename, TYPE_ANY);
+       free(fsdata.fatbuf);
        return ret == 0;
 }
 
 int fat_size(const char *filename, loff_t *size)
 {
-       return do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1, size);
+       fsdata fsdata;
+       fat_itr itrblock, *itr = &itrblock;
+       int ret;
+
+       ret = fat_itr_root(itr, &fsdata);
+       if (ret)
+               return ret;
+
+       ret = fat_itr_resolve(itr, filename, TYPE_FILE);
+       if (ret) {
+               /*
+                * Directories don't have size, but fs_size() is not
+                * expected to fail if passed a directory path:
+                */
+               free(fsdata.fatbuf);
+               fat_itr_root(itr, &fsdata);
+               if (!fat_itr_resolve(itr, filename, TYPE_DIR)) {
+                       *size = 0;
+                       ret = 0;
+               }
+               goto out;
+       }
+
+       *size = FAT2CPU32(itr->dent->size);
+out:
+       free(fsdata.fatbuf);
+       return ret;
 }
 
 int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
                     loff_t maxsize, loff_t *actread)
 {
+       fsdata fsdata;
+       fat_itr itrblock, *itr = &itrblock;
+       int ret;
+
+       ret = fat_itr_root(itr, &fsdata);
+       if (ret)
+               return ret;
+
+       ret = fat_itr_resolve(itr, filename, TYPE_FILE);
+       if (ret)
+               goto out;
+
        printf("reading %s\n", filename);
-       return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO, 0,
-                             actread);
+       ret = get_contents(&fsdata, itr->dent, pos, buffer, maxsize, actread);
+
+out:
+       free(fsdata.fatbuf);
+       return ret;
 }
 
 int file_fat_read(const char *filename, void *buffer, int maxsize)
@@ -1353,6 +1124,68 @@ int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
        return ret;
 }
 
+typedef struct {
+       struct fs_dir_stream parent;
+       struct fs_dirent dirent;
+       fsdata fsdata;
+       fat_itr itr;
+} fat_dir;
+
+int fat_opendir(const char *filename, struct fs_dir_stream **dirsp)
+{
+       fat_dir *dir = calloc(1, sizeof(*dir));
+       int ret;
+
+       if (!dir)
+               return -ENOMEM;
+
+       ret = fat_itr_root(&dir->itr, &dir->fsdata);
+       if (ret)
+               goto fail;
+
+       ret = fat_itr_resolve(&dir->itr, filename, TYPE_DIR);
+       if (ret)
+               goto fail;
+
+       *dirsp = (struct fs_dir_stream *)dir;
+       return 0;
+
+fail:
+       free(dir->fsdata.fatbuf);
+       free(dir);
+       return ret;
+}
+
+int fat_readdir(struct fs_dir_stream *dirs, struct fs_dirent **dentp)
+{
+       fat_dir *dir = (fat_dir *)dirs;
+       struct fs_dirent *dent = &dir->dirent;
+
+       if (!fat_itr_next(&dir->itr))
+               return -ENOENT;
+
+       memset(dent, 0, sizeof(*dent));
+       strcpy(dent->name, dir->itr.name);
+
+       if (fat_itr_isdir(&dir->itr)) {
+               dent->type = FS_DT_DIR;
+       } else {
+               dent->type = FS_DT_REG;
+               dent->size = FAT2CPU32(dir->itr.dent->size);
+       }
+
+       *dentp = dent;
+
+       return 0;
+}
+
+void fat_closedir(struct fs_dir_stream *dirs)
+{
+       fat_dir *dir = (fat_dir *)dirs;
+       free(dir->fsdata.fatbuf);
+       free(dir);
+}
+
 void fat_close(void)
 {
 }
index 4ca024c2088038562f17e5904c46eacb1edc4518..9d2e0ed74c8c7ced6e42759c5f0e39de5349d828 100644 (file)
@@ -345,7 +345,7 @@ get_long_file_name(fsdata *mydata, int curclust, __u8 *cluster,
                *l_name = '\0';
        else if (*l_name == aRING)
                *l_name = DELETED_FLAG;
-       downcase(l_name);
+       downcase(l_name, INT_MAX);
 
        /* Return the real directory entry */
        *retdent = realdent;
@@ -502,8 +502,7 @@ set_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer,
        int ret;
 
        if (clustnum > 0)
-               startsect = mydata->data_begin +
-                               clustnum * mydata->clust_size;
+               startsect = clust_to_sect(mydata, clustnum);
        else
                startsect = mydata->rootdir_sect;
 
@@ -751,8 +750,7 @@ static int check_overflow(fsdata *mydata, __u32 clustnum, loff_t size)
        __u32 startsect, sect_num, offset;
 
        if (clustnum > 0) {
-               startsect = mydata->data_begin +
-                               clustnum * mydata->clust_size;
+               startsect = clust_to_sect(mydata, clustnum);
        } else {
                startsect = mydata->rootdir_sect;
        }
@@ -791,7 +789,7 @@ static dir_entry *empty_dentptr;
 static dir_entry *find_directory_entry(fsdata *mydata, int startsect,
        char *filename, dir_entry *retdent, __u32 start)
 {
-       __u32 curclust = (startsect - mydata->data_begin) / mydata->clust_size;
+       __u32 curclust = sect_to_clust(mydata, startsect);
 
        debug("get_dentfromdir: %s\n", filename);
 
@@ -981,7 +979,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
 
        memcpy(l_filename, filename, name_len);
        l_filename[name_len] = 0; /* terminate the string */
-       downcase(l_filename);
+       downcase(l_filename, INT_MAX);
 
        startsect = mydata->rootdir_sect;
        retdent = find_directory_entry(mydata, startsect,
diff --git a/fs/fat/file.c b/fs/fat/file.c
deleted file mode 100644 (file)
index 8970611..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * file.c
- *
- * Mini "VFS" by Marcus Sundberg
- *
- * 2002-07-28 - rjones@nexus-tech.net - ported to ppcboot v1.1.6
- * 2003-03-10 - kharris@nexus-tech.net - ported to uboot
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#include <common.h>
-#include <config.h>
-#include <malloc.h>
-#include <fat.h>
-#include <linux/stat.h>
-#include <linux/time.h>
-
-/* Supported filesystems */
-static const struct filesystem filesystems[] = {
-       { file_fat_detectfs,  file_fat_ls,  file_fat_read,  "FAT" },
-};
-#define NUM_FILESYS    (sizeof(filesystems)/sizeof(struct filesystem))
-
-/* The filesystem which was last detected */
-static int current_filesystem = FSTYPE_NONE;
-
-/* The current working directory */
-#define CWD_LEN                511
-char file_cwd[CWD_LEN+1] = "/";
-
-const char *
-file_getfsname(int idx)
-{
-       if (idx < 0 || idx >= NUM_FILESYS)
-               return NULL;
-
-       return filesystems[idx].name;
-}
-
-static void
-pathcpy(char *dest, const char *src)
-{
-       char *origdest = dest;
-
-       do {
-               if (dest-file_cwd >= CWD_LEN) {
-                       *dest = '\0';
-                       return;
-               }
-               *(dest) = *(src);
-               if (*src == '\0') {
-                       if (dest-- != origdest && ISDIRDELIM(*dest)) {
-                               *dest = '\0';
-                       }
-                       return;
-               }
-               ++dest;
-
-               if (ISDIRDELIM(*src))
-                       while (ISDIRDELIM(*src)) src++;
-               else
-                       src++;
-       } while (1);
-}
-
-int
-file_cd(const char *path)
-{
-       if (ISDIRDELIM(*path)) {
-               while (ISDIRDELIM(*path)) path++;
-               strncpy(file_cwd+1, path, CWD_LEN-1);
-       } else {
-               const char *origpath = path;
-               char *tmpstr = file_cwd;
-               int back = 0;
-
-               while (*tmpstr != '\0') tmpstr++;
-               do {
-                       tmpstr--;
-               } while (ISDIRDELIM(*tmpstr));
-
-               while (*path == '.') {
-                       path++;
-                       while (*path == '.') {
-                               path++;
-                               back++;
-                       }
-                       if (*path != '\0' && !ISDIRDELIM(*path)) {
-                               path = origpath;
-                               back = 0;
-                               break;
-                       }
-                       while (ISDIRDELIM(*path)) path++;
-                       origpath = path;
-               }
-
-               while (back--) {
-                       /* Strip off path component */
-                       while (!ISDIRDELIM(*tmpstr)) {
-                               tmpstr--;
-                       }
-                       if (tmpstr == file_cwd) {
-                               /* Incremented again right after the loop. */
-                               tmpstr--;
-                               break;
-                       }
-                       /* Skip delimiters */
-                       while (ISDIRDELIM(*tmpstr)) tmpstr--;
-               }
-               tmpstr++;
-               if (*path == '\0') {
-                       if (tmpstr == file_cwd) {
-                               *tmpstr = '/';
-                               tmpstr++;
-                       }
-                       *tmpstr = '\0';
-                       return 0;
-               }
-               *tmpstr = '/';
-               pathcpy(tmpstr+1, path);
-       }
-
-       return 0;
-}
-
-int
-file_detectfs(void)
-{
-       int i;
-
-       current_filesystem = FSTYPE_NONE;
-
-       for (i = 0; i < NUM_FILESYS; i++) {
-               if (filesystems[i].detect() == 0) {
-                       strcpy(file_cwd, "/");
-                       current_filesystem = i;
-                       break;
-               }
-       }
-
-       return current_filesystem;
-}
-
-int
-file_ls(const char *dir)
-{
-       char fullpath[1024];
-       const char *arg;
-
-       if (current_filesystem == FSTYPE_NONE) {
-               printf("Can't list files without a filesystem!\n");
-               return -1;
-       }
-
-       if (ISDIRDELIM(*dir)) {
-               arg = dir;
-       } else {
-               sprintf(fullpath, "%s/%s", file_cwd, dir);
-               arg = fullpath;
-       }
-       return filesystems[current_filesystem].ls(arg);
-}
-
-int file_read(const char *filename, void *buffer, int maxsize)
-{
-       char fullpath[1024];
-       const char *arg;
-
-       if (current_filesystem == FSTYPE_NONE) {
-               printf("Can't load file without a filesystem!\n");
-               return -1;
-       }
-
-       if (ISDIRDELIM(*filename)) {
-               arg = filename;
-       } else {
-               sprintf(fullpath, "%s/%s", file_cwd, filename);
-               arg = fullpath;
-       }
-
-       return filesystems[current_filesystem].read(arg, buffer, maxsize);
-}
diff --git a/fs/fs.c b/fs/fs.c
index 13cd3626c6f811248553ef625b7f64e02e27dfc0..3481229aa623bf80e0d26caf9cfc20a9d179ae0e 100644 (file)
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -21,6 +21,7 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 static struct blk_desc *fs_dev_desc;
+static int fs_dev_part;
 static disk_partition_t fs_partition;
 static int fs_type = FS_TYPE_ANY;
 
@@ -36,6 +37,35 @@ static inline int fs_ls_unsupported(const char *dirname)
        return -1;
 }
 
+/* generic implementation of ls in terms of opendir/readdir/closedir */
+__maybe_unused
+static int fs_ls_generic(const char *dirname)
+{
+       struct fs_dir_stream *dirs;
+       struct fs_dirent *dent;
+       int nfiles = 0, ndirs = 0;
+
+       dirs = fs_opendir(dirname);
+       if (!dirs)
+               return -errno;
+
+       while ((dent = fs_readdir(dirs))) {
+               if (dent->type == FS_DT_DIR) {
+                       printf("            %s/\n", dent->name);
+                       ndirs++;
+               } else {
+                       printf(" %8lld   %s\n", dent->size, dent->name);
+                       nfiles++;
+               }
+       }
+
+       fs_closedir(dirs);
+
+       printf("\n%d file(s), %d dir(s)\n\n", nfiles, ndirs);
+
+       return 0;
+}
+
 static inline int fs_exists_unsupported(const char *filename)
 {
        return 0;
@@ -69,6 +99,12 @@ static inline int fs_uuid_unsupported(char *uuid_str)
        return -1;
 }
 
+static inline int fs_opendir_unsupported(const char *filename,
+                                        struct fs_dir_stream **dirs)
+{
+       return -EACCES;
+}
+
 struct fstype_info {
        int fstype;
        char *name;
@@ -92,6 +128,20 @@ struct fstype_info {
                     loff_t len, loff_t *actwrite);
        void (*close)(void);
        int (*uuid)(char *uuid_str);
+       /*
+        * Open a directory stream.  On success return 0 and directory
+        * stream pointer via 'dirsp'.  On error, return -errno.  See
+        * fs_opendir().
+        */
+       int (*opendir)(const char *filename, struct fs_dir_stream **dirsp);
+       /*
+        * Read next entry from directory stream.  On success return 0
+        * and directory entry pointer via 'dentp'.  On error return
+        * -errno.  See fs_readdir().
+        */
+       int (*readdir)(struct fs_dir_stream *dirs, struct fs_dirent **dentp);
+       /* see fs_closedir() */
+       void (*closedir)(struct fs_dir_stream *dirs);
 };
 
 static struct fstype_info fstypes[] = {
@@ -102,7 +152,7 @@ static struct fstype_info fstypes[] = {
                .null_dev_desc_ok = false,
                .probe = fat_set_blk_dev,
                .close = fat_close,
-               .ls = file_fat_ls,
+               .ls = fs_ls_generic,
                .exists = fat_exists,
                .size = fat_size,
                .read = fat_read_file,
@@ -112,6 +162,9 @@ static struct fstype_info fstypes[] = {
                .write = fs_write_unsupported,
 #endif
                .uuid = fs_uuid_unsupported,
+               .opendir = fat_opendir,
+               .readdir = fat_readdir,
+               .closedir = fat_closedir,
        },
 #endif
 #ifdef CONFIG_FS_EXT4
@@ -131,6 +184,7 @@ static struct fstype_info fstypes[] = {
                .write = fs_write_unsupported,
 #endif
                .uuid = ext4fs_uuid,
+               .opendir = fs_opendir_unsupported,
        },
 #endif
 #ifdef CONFIG_SANDBOX
@@ -146,6 +200,7 @@ static struct fstype_info fstypes[] = {
                .read = fs_read_sandbox,
                .write = fs_write_sandbox,
                .uuid = fs_uuid_unsupported,
+               .opendir = fs_opendir_unsupported,
        },
 #endif
 #ifdef CONFIG_CMD_UBIFS
@@ -161,6 +216,7 @@ static struct fstype_info fstypes[] = {
                .read = ubifs_read,
                .write = fs_write_unsupported,
                .uuid = fs_uuid_unsupported,
+               .opendir = fs_opendir_unsupported,
        },
 #endif
        {
@@ -175,6 +231,7 @@ static struct fstype_info fstypes[] = {
                .read = fs_read_unsupported,
                .write = fs_write_unsupported,
                .uuid = fs_uuid_unsupported,
+               .opendir = fs_opendir_unsupported,
        },
 };
 
@@ -226,6 +283,31 @@ int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
                if (!fs_dev_desc && !info->null_dev_desc_ok)
                        continue;
 
+               if (!info->probe(fs_dev_desc, &fs_partition)) {
+                       fs_type = info->fstype;
+                       fs_dev_part = part;
+                       return 0;
+               }
+       }
+
+       return -1;
+}
+
+/* set current blk device w/ blk_desc + partition # */
+int fs_set_blk_dev_with_part(struct blk_desc *desc, int part)
+{
+       struct fstype_info *info;
+       int ret, i;
+
+       if (part >= 1)
+               ret = part_get_info(desc, part, &fs_partition);
+       else
+               ret = part_get_info_whole_disk(desc, &fs_partition);
+       if (ret)
+               return ret;
+       fs_dev_desc = desc;
+
+       for (i = 0, info = fstypes; i < ARRAY_SIZE(fstypes); i++, info++) {
                if (!info->probe(fs_dev_desc, &fs_partition)) {
                        fs_type = info->fstype;
                        return 0;
@@ -334,6 +416,59 @@ int fs_write(const char *filename, ulong addr, loff_t offset, loff_t len,
        return ret;
 }
 
+struct fs_dir_stream *fs_opendir(const char *filename)
+{
+       struct fstype_info *info = fs_get_info(fs_type);
+       struct fs_dir_stream *dirs = NULL;
+       int ret;
+
+       ret = info->opendir(filename, &dirs);
+       fs_close();
+       if (ret) {
+               errno = -ret;
+               return NULL;
+       }
+
+       dirs->desc = fs_dev_desc;
+       dirs->part = fs_dev_part;
+
+       return dirs;
+}
+
+struct fs_dirent *fs_readdir(struct fs_dir_stream *dirs)
+{
+       struct fstype_info *info;
+       struct fs_dirent *dirent;
+       int ret;
+
+       fs_set_blk_dev_with_part(dirs->desc, dirs->part);
+       info = fs_get_info(fs_type);
+
+       ret = info->readdir(dirs, &dirent);
+       fs_close();
+       if (ret) {
+               errno = -ret;
+               return NULL;
+       }
+
+       return dirent;
+}
+
+void fs_closedir(struct fs_dir_stream *dirs)
+{
+       struct fstype_info *info;
+
+       if (!dirs)
+               return;
+
+       fs_set_blk_dev_with_part(dirs->desc, dirs->part);
+       info = fs_get_info(fs_type);
+
+       info->closedir(dirs);
+       fs_close();
+}
+
+
 int do_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
                int fstype)
 {
index 8a2f46f6c7bca9abdf9fdb76538496d06ca2a90d..ee7ba27798bd75357bdd5ddbd3d6e91c7c2abd01 100644 (file)
@@ -43,6 +43,15 @@ typedef struct vidinfo {
        u_long vl_lower_margin; /* Time from picture to sync */
 
        u_long  mmio;           /* Memory mapped registers */
+
+       u_int logo_width;
+       u_int logo_height;
+       int logo_x_offset;
+       int logo_y_offset;
+       u_long logo_addr;
 } vidinfo_t;
 
+void atmel_logo_info(vidinfo_t *info);
+void microchip_logo_info(vidinfo_t *info);
+
 #endif
index 27abfddb94f7ba2ddf9ffd4f1a35a62c7ec1d6e0..1965812a9d5a39f0148ce133a895a69b4058d07b 100644 (file)
@@ -315,12 +315,12 @@ int blk_next_device(struct udevice **devp);
  * @devnum:    Device number, specific to the interface type, or -1 to
  *             allocate the next available number
  * @blksz:     Block size of the device in bytes (typically 512)
- * @size:      Total size of the device in bytes
+ * @lba:       Total number of blocks of the device
  * @devp:      the new device (which has not been probed)
  */
 int blk_create_device(struct udevice *parent, const char *drv_name,
                      const char *name, int if_type, int devnum, int blksz,
-                     lbaint_t size, struct udevice **devp);
+                     lbaint_t lba, struct udevice **devp);
 
 /**
  * blk_create_devicef() - Create a new named block device
@@ -332,12 +332,12 @@ int blk_create_device(struct udevice *parent, const char *drv_name,
  * @devnum:    Device number, specific to the interface type, or -1 to
  *             allocate the next available number
  * @blksz:     Block size of the device in bytes (typically 512)
- * @size:      Total size of the device in bytes
+ * @lba:       Total number of blocks of the device
  * @devp:      the new device (which has not been probed)
  */
 int blk_create_devicef(struct udevice *parent, const char *drv_name,
                       const char *name, int if_type, int devnum, int blksz,
-                      lbaint_t size, struct udevice **devp);
+                      lbaint_t lba, struct udevice **devp);
 
 /**
  * blk_prepare_device() - Prepare a block device for use
index c5d93f57fd7f45d75d6a5db67a0d2db364f1eefa..7a524782bae45d4c07db7f8031be2a1b8ebe61ac 100644 (file)
 #ifndef _BOOTSTAGE_H
 #define _BOOTSTAGE_H
 
-/* Define this for host tools */
-#ifndef CONFIG_BOOTSTAGE_USER_COUNT
-#define CONFIG_BOOTSTAGE_USER_COUNT    20
-#endif
-
 /* Flags for each bootstage record */
 enum bootstage_flags {
        BOOTSTAGEF_ERROR        = 1 << 0,       /* Error record */
@@ -208,7 +203,6 @@ enum bootstage_id {
 
        /* a few spare for the user, from here */
        BOOTSTAGE_ID_USER,
-       BOOTSTAGE_ID_COUNT = BOOTSTAGE_ID_USER + CONFIG_BOOTSTAGE_USER_COUNT,
        BOOTSTAGE_ID_ALLOC,
 };
 
diff --git a/include/charset.h b/include/charset.h
new file mode 100644 (file)
index 0000000..39279f7
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ *  charset conversion utils
+ *
+ *  Copyright (c) 2017 Rob Clark
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef __CHARSET_H_
+#define __CHARSET_H_
+
+#define MAX_UTF8_PER_UTF16 4
+
+/**
+ * utf16_strlen() - Get the length of an utf16 string
+ *
+ * Returns the number of 16 bit characters in an utf16 string, not
+ * including the terminating NULL character.
+ *
+ * @in     the string to measure
+ * @return the string length
+ */
+size_t utf16_strlen(const uint16_t *in);
+
+/**
+ * utf16_strnlen() - Get the length of a fixed-size utf16 string.
+ *
+ * Returns the number of 16 bit characters in an utf16 string,
+ * not including the terminating NULL character, but at most
+ * 'count' number of characters.  In doing this, utf16_strnlen()
+ * looks at only the first 'count' characters.
+ *
+ * @in     the string to measure
+ * @count  the maximum number of characters to count
+ * @return the string length, up to a maximum of 'count'
+ */
+size_t utf16_strnlen(const uint16_t *in, size_t count);
+
+/**
+ * utf16_strcpy() - UTF16 equivalent of strcpy()
+ */
+uint16_t *utf16_strcpy(uint16_t *dest, const uint16_t *src);
+
+/**
+ * utf16_strdup() - UTF16 equivalent of strdup()
+ */
+uint16_t *utf16_strdup(const uint16_t *s);
+
+/**
+ * utf16_to_utf8() - Convert an utf16 string to utf8
+ *
+ * Converts 'size' characters of the utf16 string 'src' to utf8
+ * written to the 'dest' buffer.
+ *
+ * NOTE that a single utf16 character can generate up to 4 utf8
+ * characters.  See MAX_UTF8_PER_UTF16.
+ *
+ * @dest   the destination buffer to write the utf8 characters
+ * @src    the source utf16 string
+ * @size   the number of utf16 characters to convert
+ * @return the pointer to the first unwritten byte in 'dest'
+ */
+uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size);
+
+#endif /* __CHARSET_H_ */
index c5988f78a8f1a1c7fc3f6b777eb00848db490757..e7ce3e8576883f8e6df0d21d19347bfd9d7047be 100644 (file)
@@ -61,9 +61,9 @@ struct clk {
 };
 
 #if CONFIG_IS_ENABLED(OF_CONTROL) && CONFIG_IS_ENABLED(CLK)
-struct phandle_2_cell;
+struct phandle_1_arg;
 int clk_get_by_index_platdata(struct udevice *dev, int index,
-                             struct phandle_2_cell *cells, struct clk *clk);
+                             struct phandle_1_arg *cells, struct clk *clk);
 
 /**
  * clock_get_by_index - Get/request a clock by integer index.
index 46b7a2a6f2b748e0da5f0efdbff5cd7bb18b9c89..2c4d43d67269ff53f6ee0ce0a42672c2017129b5 100644 (file)
@@ -58,6 +58,7 @@
 
 #if (CONFIG_IS_ENABLED(PARTITION_UUIDS) || \
        CONFIG_IS_ENABLED(EFI_PARTITION) || \
+       CONFIG_IS_ENABLED(EFI_LOADER) || \
        defined(CONFIG_RANDOM_UUID) || \
        defined(CONFIG_CMD_UUID) || \
        defined(CONFIG_BOOTP_PXE)) && \
index f47e45b433e831ab5392eb09661efe6124336da7..69460293330f9fbc8764ce4a2b06d02a510a67c3 100644 (file)
@@ -23,8 +23,7 @@
 #define CONFIG_CMDLINE_EDITING
 #define CONFIG_PANIC_HANG
 
-#define CONFIG_SYS_ICACHE_OFF
-#define CONFIG_SYS_DCACHE_OFF
+#define CONFIG_ARCH_MAP_SYSMEM
 
 #define CONFIG_BOOTP_SEND_HOSTNAME
 #define CONFIG_BOOTP_SERVERIP
 
 /* max number of sectors on one chip */
 #define CONFIG_FLASH_SECTOR_SIZE       (0x10000*2)
-#define CONFIG_ENV_SECT_SIZE           CONFIG_FLASH_SECTOR_SIZE
 #define CONFIG_SYS_MAX_FLASH_SECT      512
 
 /* environments */
-#define CONFIG_ENV_ADDR                        (CONFIG_SYS_MONITOR_BASE + 0x140000)
+#define CONFIG_ENV_SPI_BUS             0
+#define CONFIG_ENV_SPI_CS              0
+#define CONFIG_ENV_SPI_MAX_HZ          50000000
+#define CONFIG_ENV_SPI_MODE            0
+#define CONFIG_ENV_SECT_SIZE           0x1000
+#define CONFIG_ENV_OFFSET              0x140000
 #define CONFIG_ENV_SIZE                        8192
 #define CONFIG_ENV_OVERWRITE
 
+
+/* SPI FLASH */
+#define CONFIG_SF_DEFAULT_BUS          0
+#define CONFIG_SF_DEFAULT_CS           0
+#define CONFIG_SF_DEFAULT_SPEED                1000000
+#define CONFIG_SF_DEFAULT_MODE         0
+
 /*
  * For booting Linux, the board info and command line data
  * have to be in the first 16 MB of memory, since this is
index bf713b806d1be30c4006739b6ba4d17be28e7f74..fad4d308e036463379383016b9170c129e6ce3c6 100644 (file)
@@ -22,8 +22,7 @@
 
 #define CONFIG_CMDLINE_EDITING
 
-#define CONFIG_SYS_ICACHE_OFF
-#define CONFIG_SYS_DCACHE_OFF
+#define CONFIG_ARCH_MAP_SYSMEM
 
 #define CONFIG_BOOTP_SEND_HOSTNAME
 #define CONFIG_BOOTP_SERVERIP
index 86302cf55f6886c5e6e15daff2ead04bb49b7ab3..09f470c6b56f4466eb97e32fb36630822a063a1e 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#define CONFIG_IPUV3_CLK                260000000
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 #endif
index edaa384213d5fd875786b8724b34e8fb0748de62..db75fe547a34dfb48335d202fba1857c7ecd02be 100644 (file)
@@ -16,7 +16,6 @@
 /*
  * High Level Configuration Options
  */
-#define CONFIG_EMIF4   /* The chip has EMIF4 controller */
 
 #include <asm/arch/cpu.h>              /* get chip and board defs */
 #include <asm/arch/omap.h>
 #define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE
 
 #define CONFIG_NAND_OMAP_GPMC
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB sector */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 /*-----------------------------------------------------------------------
  * CFI FLASH driver setup
index 5435ca8f4ea40fe99b1314f59d950514132e717a..708a98f8270948e9edbe772528c1520e1e1061ef 100644 (file)
@@ -15,8 +15,6 @@
 
 #define CONFIG_NR_DRAM_BANKS   2       /* CS1 may or may not be populated */
 
-#define CONFIG_EMIF4   /* The chip has EMIF4 controller */
-
 /*
  * 1MB into the SDRAM to allow for SPL's bss at the beginning of SDRAM
  * 64 bytes before this address should be set aside for u-boot.img's
 #define CONFIG_SYS_SPL_MALLOC_START    0x80208000
 #define CONFIG_SYS_SPL_MALLOC_SIZE     0x100000
 
-#include <asm/arch/cpu.h>              /* get chip and board defs */
-#include <asm/arch/omap.h>
+#include <configs/ti_omap3_common.h>
+#undef CONFIG_SDRC     /* Disable SDRC since we have EMIF4 */
 
 #define CONFIG_MISC_INIT_R
-#define CONFIG_CMDLINE_TAG             /* enable passing of ATAGs */
-#define CONFIG_SETUP_MEMORY_TAGS
-#define CONFIG_INITRD_TAG
 #define CONFIG_REVISION_TAG
 
-/* Clock Defines */
-#define V_OSCK                 26000000        /* Clock output from T2 */
-#define V_SCLK                 (V_OSCK >> 1)
-
-/* Size of malloc() pool */
-#define CONFIG_SYS_MALLOC_LEN          (16 << 20)
-
 /* Hardware drivers */
 
 /* NS16550 Configuration */
-#define V_NS16550_CLK                  48000000        /* 48MHz (APLL96/2) */
 #define CONFIG_SYS_NS16550_SERIAL
 #define CONFIG_SYS_NS16550_REG_SIZE    (-4)
-#define CONFIG_SYS_NS16550_CLK         V_NS16550_CLK
 
 /* select serial console configuration */
 #define CONFIG_CONS_INDEX              3
 #define CONFIG_SYS_NS16550_COM3                OMAP34XX_UART3
 #define CONFIG_SERIAL3                 3       /* UART3 on AM3517 EVM */
 
+
 /* allow to overwrite serial and ethaddr */
 #define CONFIG_ENV_OVERWRITE
-#define CONFIG_SYS_BAUDRATE_TABLE      {4800, 9600, 19200, 38400, 57600,\
-                                       115200}
 
 /*
  * USB configuration
 
 /* Board NAND Info. */
 #ifdef CONFIG_NAND
-#define CONFIG_NAND_OMAP_GPMC
 #define CONFIG_NAND_OMAP_GPMC_PREFETCH
 #define CONFIG_SYS_NAND_ADDR           NAND_BASE       /* physical address */
                                                        /* to access nand */
-#define CONFIG_SYS_NAND_BASE           NAND_BASE       /* physical address */
-                                                       /* to access */
-                                                       /* nand at CS0 */
-#define CONFIG_SYS_MAX_NAND_DEVICE     1               /* Max number of */
-                                                       /* NAND devices */
 #define CONFIG_SYS_NAND_BUSWIDTH_16BIT
 #define CONFIG_SYS_NAND_5_ADDR_CYCLE
 #define CONFIG_SYS_NAND_PAGE_COUNT     64
 /* We set the max number of command args high to avoid HUSH bugs. */
 #define CONFIG_SYS_MAXARGS             64
 
-/* Console I/O Buffer Size */
-#define CONFIG_SYS_CBSIZE              512
+/* Print Buffer Size */
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE \
+                                       + sizeof(CONFIG_SYS_PROMPT) + 16)
+/* Boot Argument Buffer Size */
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
 
 /* memtest works on */
 #define CONFIG_SYS_MEMTEST_START       (OMAP34XX_SDRC_CS0)
 #define CONFIG_SYS_MEMTEST_END         (OMAP34XX_SDRC_CS0 + \
                                        0x01F00000) /* 31MB */
 
-#define CONFIG_SYS_LOAD_ADDR           (OMAP34XX_SDRC_CS0) /* default load */
-                                                               /* address */
-
-/*
- * AM3517 has 12 GP timers, they can be driven by the system clock
- * (12/13/16.8/19.2/38.4MHz) or by 32KHz clock. We use 13MHz (V_SCLK).
- * This rate is divided by a local divisor.
- */
-#define CONFIG_SYS_TIMERBASE           OMAP34XX_GPT2
-#define CONFIG_SYS_PTV                 2       /* Divisor: 2^(PTV+1) => 8 */
-
 /* Physical Memory Map */
-#define PHYS_SDRAM_1                   OMAP34XX_SDRC_CS0
-#define PHYS_SDRAM_2                   OMAP34XX_SDRC_CS1
 #define CONFIG_SYS_CS0_SIZE            (256 * 1024 * 1024)
-#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
 #define CONFIG_SYS_INIT_RAM_ADDR       0x4020f800
 #define CONFIG_SYS_INIT_RAM_SIZE       0x800
-#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_INIT_RAM_ADDR + \
-                                        CONFIG_SYS_INIT_RAM_SIZE - \
-                                        GENERATED_GBL_DATA_SIZE)
 
 /* FLASH and environment organization */
 
 
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
 #define CONFIG_ENV_SIZE                        CONFIG_SYS_ENV_SECT_SIZE
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 /* Defines for SPL */
 #define CONFIG_SPL_FRAMEWORK
-#define CONFIG_SPL_NAND_SIMPLE
+#undef CONFIG_SPL_TEXT_BASE
 #define CONFIG_SPL_TEXT_BASE           0x40200000
 #define CONFIG_SPL_MAX_SIZE            (SRAM_SCRATCH_SPACE_ADDR - \
                                         CONFIG_SPL_TEXT_BASE)
 
+#undef CONFIG_SPL_BSS_START_ADDR
 #define CONFIG_SPL_BSS_START_ADDR      0x80000000
 #define CONFIG_SPL_BSS_MAX_SIZE                0x80000         /* 512 KB */
 
index a15f19dce23cdfcfbcabd9f7e0a7c4bfbaa6c52e..9022a9d7bb12c4b439340f0408dd7b2016765adf 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#define CONFIG_IPUV3_CLK               260000000
 #define CONFIG_CONSOLE_MUX
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
index d24d564d480a44e7fd63934b856a8e90b226c224..397afbb4089063c742bce64706b250036de54a28 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#define CONFIG_IPUV3_CLK 198000000
 #define CONFIG_IMX_VIDEO_SKIP
 
 #define CONFIG_PWM_IMX
index ff17b4eb4b519f1887f592670f06b410bd141683..dc36c2ae6cb4e82791598bf1e2c63012898886b4 100644 (file)
@@ -10,8 +10,6 @@
 #ifndef __AT91_SAMA5_COMMON_H
 #define __AT91_SAMA5_COMMON_H
 
-#include <asm/hardware.h>
-
 #define CONFIG_SYS_TEXT_BASE           0x26f00000
 
 /* ARM asynchronous clock */
@@ -44,7 +42,7 @@
  * Command line configuration.
  */
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 
 #ifdef CONFIG_ENV_IS_IN_MMC
 /* Use raw reserved sectors to save environment */
@@ -65,7 +63,7 @@
 
 #else
 
-#ifdef CONFIG_SYS_USE_NANDFLASH
+#ifdef CONFIG_NAND_BOOT
 /* u-boot env in nand flash */
 #define CONFIG_ENV_OFFSET              0xc0000
 #define CONFIG_ENV_OFFSET_REDUND       0x100000
@@ -73,7 +71,7 @@
 #define CONFIG_BOOTCOMMAND             "nand read 0x21000000 0x180000 0x80000;"        \
                                        "nand read 0x22000000 0x200000 0x600000;"       \
                                        "bootz 0x22000000 - 0x21000000"
-#elif CONFIG_SYS_USE_SERIALFLASH
+#elif CONFIG_SPI_BOOT
 /* u-boot env in serial flash, by default is bus 0 and cs 0 */
 #define CONFIG_ENV_OFFSET              0x6000
 #define CONFIG_ENV_SIZE                        0x2000
index 22db94772dbe4d31ca05874f37f5e3582da5d140..2957da9432f35f3682412776d4eab2a454be61ad 100644 (file)
@@ -11,8 +11,6 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#include <asm/hardware.h>
-
 #define CONFIG_SYS_TEXT_BASE           0x73f00000
 
 #define CONFIG_ATMEL_LEGACY            /* required until (g)pio is fixed */
@@ -52,7 +50,7 @@
 
 /* SDRAM */
 #define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_CS6
+#define CONFIG_SYS_SDRAM_BASE           0x70000000
 #define CONFIG_SYS_SDRAM_SIZE          0x08000000
 
 #define CONFIG_SYS_INIT_SP_ADDR \
@@ -82,7 +80,7 @@
 #define CONFIG_SYS_MEMTEST_START       CONFIG_SYS_SDRAM_BASE
 #define CONFIG_SYS_MEMTEST_END         0x23e00000
 
-#ifdef CONFIG_SYS_USE_NANDFLASH
+#ifdef CONFIG_NAND_BOOT
 /* bootstrap + u-boot + env in nandflash */
 #define CONFIG_ENV_OFFSET              0x120000
 #define CONFIG_ENV_OFFSET_REDUND       0x100000
@@ -91,7 +89,7 @@
 #define CONFIG_BOOTCOMMAND                                             \
        "nand read 0x70000000 0x200000 0x300000;"                       \
        "bootm 0x70000000"
-#elif CONFIG_SYS_USE_MMC
+#elif CONFIG_SD_BOOT
 /* bootstrap + u-boot + env + linux in mmc */
 #define CONFIG_ENV_SIZE                0x4000
 
 
 #define CONFIG_SYS_MONITOR_LEN         0x80000
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 
 #define CONFIG_SPL_BSS_START_ADDR      0x70000000
 #define CONFIG_SPL_BSS_MAX_SIZE                0x00080000
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
 
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_NAND_BOOT
 #define CONFIG_SPL_NAND_DRIVERS
 #define CONFIG_SPL_NAND_BASE
 #define CONFIG_SPL_NAND_ECC
index 7d70d8892a90c3363b720b7074a26daf8140b96d..111a7dce7d076b46b8655c0c393fc4ce7811579c 100644 (file)
 #ifndef __AT91SAM9N12_CONFIG_H_
 #define __AT91SAM9N12_CONFIG_H_
 
-/*
- * SoC must be defined first, before hardware.h is included.
- * In this case SoC is defined in boards.cfg.
- */
-#include <asm/hardware.h>
-
 #define CONFIG_SYS_TEXT_BASE           0x26f00000
 
 /* ARM asynchronous clock */
@@ -55,7 +49,7 @@
  * that address while providing maximum stack area below.
  */
 # define CONFIG_SYS_INIT_SP_ADDR \
-       (ATMEL_BASE_SRAM + 16 * 1024 - GENERATED_GBL_DATA_SIZE)
+       (0x00300000 + 16 * 1024 - GENERATED_GBL_DATA_SIZE)
 
 /* DataFlash */
 #ifdef CONFIG_CMD_SF
 #define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS     1
 #endif
 
-#ifdef CONFIG_SYS_USE_SPIFLASH
+#ifdef CONFIG_SPI_BOOT
 
 /* bootstrap + u-boot + env + linux in dataflash on CS0 */
 #define CONFIG_ENV_OFFSET              0x5000
        "sf probe 0; sf read 0x22000000 0x100000 0x300000; "            \
        "bootm 0x22000000"
 
-#elif defined(CONFIG_SYS_USE_NANDFLASH)
+#elif defined(CONFIG_NAND_BOOT)
 
 /* bootstrap + u-boot + env + linux in nandflash */
 #define CONFIG_ENV_OFFSET              0x120000
        "nand read 0x22000000 0x200000 0x400000;"                       \
        "bootm 0x22000000 - 0x21000000"
 
-#else /* CONFIG_SYS_USE_MMC */
+#else /* CONFIG_SD_BOOT */
 
 /* bootstrap + u-boot + env + linux in mmc */
 
 #define CONFIG_SYS_MCKR                        0x1301
 #define CONFIG_SYS_MCKR_CSS            0x1302
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
 
 #elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_SPI_BOOT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x8400
+
+#elif CONFIG_NAND_BOOT
 #define CONFIG_SPL_NAND_DRIVERS
 #define CONFIG_SPL_NAND_BASE
+#endif
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x40000
 #define CONFIG_SYS_NAND_5_ADDR_CYCLE
 #define CONFIG_SYS_NAND_PAGE_SIZE      0x800
 #define CONFIG_SYS_NAND_BAD_BLOCK_POS  0x0
 #define CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER
 
-#elif CONFIG_SYS_USE_SPIFLASH
-#define CONFIG_SPL_SPI_LOAD
-#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x8400
-
-#endif
-
 #endif
index c50e0b816f37a5b549601a6bd15b7f0c973bd77a..1d4971c59f9da21436e1e1992546d1b646700b89 100644 (file)
@@ -9,16 +9,12 @@
 #ifndef __CONFIG_H__
 #define __CONFIG_H__
 
-#include <asm/hardware.h>
-
 #define CONFIG_SYS_TEXT_BASE           0x26f00000
 
 /* ARM asynchronous clock */
 #define CONFIG_SYS_AT91_SLOW_CLOCK     32768
 #define CONFIG_SYS_AT91_MAIN_CLOCK     12000000        /* 12 MHz crystal */
 
-#define CONFIG_AT91SAM9X5EK
-
 #define CONFIG_CMDLINE_TAG             /* enable passing of ATAGs */
 #define CONFIG_SETUP_MEMORY_TAGS
 #define CONFIG_INITRD_TAG
 #define CONFIG_SYS_MEMTEST_START       CONFIG_SYS_SDRAM_BASE
 #define CONFIG_SYS_MEMTEST_END         0x26e00000
 
-#ifdef CONFIG_SYS_USE_NANDFLASH
+#ifdef CONFIG_NAND_BOOT
 /* bootstrap + u-boot + env + linux in nandflash */
 #define CONFIG_ENV_OFFSET              0x120000
 #define CONFIG_ENV_OFFSET_REDUND       0x100000
 #define CONFIG_BOOTCOMMAND     "nand read " \
                                "0x22000000 0x200000 0x300000; " \
                                "bootm 0x22000000"
-#elif defined(CONFIG_SYS_USE_SPIFLASH)
+#elif defined(CONFIG_SPI_BOOT)
 /* bootstrap + u-boot + env + linux in spi flash */
 #define CONFIG_ENV_OFFSET      0x5000
 #define CONFIG_ENV_SIZE                0x3000
 #define CONFIG_BOOTCOMMAND     "sf probe 0; " \
                                "sf read 0x22000000 0x84000 0x294000; " \
                                "bootm 0x22000000"
-#else /* CONFIG_SYS_USE_MMC */
+#else /* CONFIG_SD_BOOT */
 /* bootstrap + u-boot + env + linux in mmc */
 #define CONFIG_ENV_SIZE                0x4000
 #endif
 #define CONFIG_SYS_MCKR                        0x1301
 #define CONFIG_SYS_MCKR_CSS            0x1302
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
 
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_SPI_BOOT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x8400
+
+#elif CONFIG_NAND_BOOT
 #define CONFIG_SPL_NAND_DRIVERS
 #define CONFIG_SPL_NAND_BASE
+#endif
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x40000
 #define CONFIG_SYS_NAND_5_ADDR_CYCLE
 #define CONFIG_SYS_NAND_PAGE_SIZE      0x800
 #define CONFIG_SYS_NAND_BAD_BLOCK_POS  0x0
 #define CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER
 
-#elif CONFIG_SYS_USE_SPIFLASH
-#define CONFIG_SPL_SPI_LOAD
-#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x8400
-
-#endif
-
 #endif
index 8f7f26b9edbba3aeae86d57f97dd86ab982d0a55..2e8993d7d4c6a0f743d1426165757ade909e301a 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#ifdef CONFIG_MX6DL
-#define CONFIG_IPUV3_CLK 198000000
-#else
-#define CONFIG_IPUV3_CLK 264000000
-#endif
 #define CONFIG_IMX_HDMI
 
 /* SATA */
diff --git a/include/configs/cherryhill.h b/include/configs/cherryhill.h
new file mode 100644 (file)
index 0000000..14da9ca
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <configs/x86-common.h>
+
+#define CONFIG_SYS_MONITOR_LEN         (2 << 20)
+
+#define CONFIG_STD_DEVICES_SETTINGS    "stdin=usbkbd,serial\0" \
+                                       "stdout=vidconsole,serial\0" \
+                                       "stderr=vidconsole,serial\0"
+
+/* Environment configuration */
+#define CONFIG_ENV_SECT_SIZE           0x10000
+#define CONFIG_ENV_OFFSET              0x005f0000
+
+#endif /* __CONFIG_H */
index 2d6132df9b51e7efbac0cdd5ef36602a566578a2..e278961177b8ae1fe7327e0d01fcadffb9ac048f 100644 (file)
 
 /* Display */
 #define CONFIG_VIDEO_IPUV3
-#define CONFIG_IPUV3_CLK          260000000
 #define CONFIG_IMX_HDMI
 
 #define CONFIG_SPLASH_SCREEN
index d30b783a4c3415b2f4462c959d7b28eb462c47b8..6e7dcc66de711817f292baabea6f04dd3c021506 100644 (file)
@@ -24,8 +24,6 @@
  */
 #define CONFIG_CM_T3X  /* working with CM-T35 and CM-T3730 */
 
-#define CONFIG_SDRC    /* The chip has SDRC controller */
-
 #include <asm/arch/cpu.h>              /* get chip and board defs */
 #include <asm/arch/omap.h>
 
 #define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE
 #define CONFIG_SYS_MONITOR_LEN         (256 << 10)     /* Reserve 2 sectors */
 
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 #if defined(CONFIG_CMD_NET)
 #define CONFIG_SMC911X
index 282b7ae10c97fb300ebded0834f88c8ef73dc780..b44777fc9829ac0e3ef1fba6cf0a24fa7ba3d78f 100644 (file)
@@ -23,8 +23,6 @@
  * to be on the safe side once the default is changed.
  */
 
-#define CONFIG_EMIF4   /* The chip has EMIF4 controller */
-
 #include <asm/arch/cpu.h>              /* get chip and board defs */
 #include <asm/arch/omap.h>
 
 #define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE
 #define CONFIG_SYS_MONITOR_LEN         (256 << 10)     /* Reserve 2 sectors */
 
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 #if defined(CONFIG_CMD_NET)
 #define CONFIG_DRIVER_TI_EMAC
index db71369706cb2ae61034ee3af2f904307d8e54f8..5fd9aab03cc6ba7d96f8101790d4603673faca4a 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#define CONFIG_IPUV3_CLK               260000000
 #define CONFIG_CONSOLE_MUX
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
index 2bf0983e37e35c08eb016882dcd6c633068be297..bd325e130515cc94961e573e1b39d8d18beb7978 100644 (file)
                                        0x01000000) /* 16MB */
 
 /* NAND and environment organization  */
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
 
 /* SRAM config */
 #define CONFIG_SYS_SRAM_START              0x40200000
index 245623049b4263deab293afc7200ae389b4af58d..3f128e67cd8e799a8187259a50bb0c346ee1849c 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#define CONFIG_IPUV3_CLK 260000000
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 
index 45f845b3788950481bea5cc3746c7e3ddbcfe80b..33f5101c145f08f6e8cee4a6a99405c60cc24957 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#define CONFIG_IPUV3_CLK 260000000
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 #endif
 #define CONFIG_SYS_I2C_MXC_I2C2
 #define CONFIG_SYS_I2C_MXC_I2C3
 
+#define CONFIG_SYS_NUM_I2C_BUSES        9
+#define CONFIG_SYS_I2C_MAX_HOPS         1
+#define CONFIG_SYS_I2C_BUSES   {       {0, {I2C_NULL_HOP} }, \
+                                       {0, {{I2C_MUX_PCA9547, 0x70, 0} } }, \
+                                       {0, {{I2C_MUX_PCA9547, 0x70, 1} } }, \
+                                       {0, {{I2C_MUX_PCA9547, 0x70, 2} } }, \
+                                       {0, {{I2C_MUX_PCA9547, 0x70, 3} } }, \
+                                       {0, {{I2C_MUX_PCA9547, 0x70, 4} } }, \
+                                       {0, {{I2C_MUX_PCA9547, 0x70, 5} } }, \
+                                       {0, {{I2C_MUX_PCA9547, 0x70, 6} } }, \
+                                       {0, {{I2C_MUX_PCA9547, 0x70, 7} } }, \
+                               }
+
+#define CONFIG_BCH
+
 #endif /* __GE_BX50V3_CONFIG_H */
index 9c26059a068eff1ae6fc0f812bc5578c49d8f05b..128a6e5aec6eddaae93200f41ec2486e5be483b5 100644 (file)
 /* Framebuffer and LCD */
 #define CONFIG_VIDEO_IPUV3
 #define CONFIG_VIDEO_LOGO
-#define CONFIG_IPUV3_CLK          260000000
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 #define CONFIG_VIDEO_BMP_LOGO
index a1b70361560f2b5b174b7d98d28291c24631a7eb..c34dc30127a5906bdee47e9874313e6e6c70e6a2 100644 (file)
 
 /* Framebuffer */
 #ifdef CONFIG_VIDEO_IPUV3
-# define CONFIG_IPUV3_CLK              260000000
 # define CONFIG_IMX_VIDEO_SKIP
 
 # define CONFIG_SPLASH_SCREEN
index 6341609858715079b38a9f686cfe6bd0a80a2566..195074040573009a47c06728c0a91d5b860178f6 100644 (file)
@@ -69,7 +69,6 @@
        "run envboot; "                                                 \
        "run run_mon_hs; "                                              \
        "run init_${boot}; "                                            \
-       "run set_name_pmmc get_pmmc_${boot} run_pmmc; "                 \
        "run get_fit_${boot}; "                                         \
        "bootm ${fit_loadaddr}#${name_fdt}"
 #endif
diff --git a/include/configs/ls1088a_common.h b/include/configs/ls1088a_common.h
new file mode 100644 (file)
index 0000000..84e9b14
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS1088_COMMON_H
+#define __LS1088_COMMON_H
+
+
+#define CONFIG_REMAKE_ELF
+#define CONFIG_FSL_LAYERSCAPE
+#define CONFIG_MP
+
+#include <asm/arch/stream_id_lsch3.h>
+#include <asm/arch/config.h>
+#include <asm/arch/soc.h>
+
+/* Link Definitions */
+#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_FSL_OCRAM_BASE + 0xfff0)
+
+/* Link Definitions */
+#ifdef CONFIG_QSPI_BOOT
+#define CONFIG_SYS_TEXT_BASE            0x20100000
+#else
+#define CONFIG_SYS_TEXT_BASE           0x30100000
+#endif
+
+#define CONFIG_SUPPORT_RAW_INITRD
+
+
+#define CONFIG_SKIP_LOWLEVEL_INIT
+
+#define CONFIG_FSL_DDR_INTERACTIVE     /* Interactive debugging */
+
+#define CONFIG_VERY_BIG_RAM
+#define CONFIG_SYS_DDR_SDRAM_BASE      0x80000000UL
+#define CONFIG_SYS_FSL_DDR_SDRAM_BASE_PHY      0
+#define CONFIG_SYS_SDRAM_BASE          CONFIG_SYS_DDR_SDRAM_BASE
+#define CONFIG_SYS_DDR_BLOCK2_BASE     0x8080000000ULL
+#define CONFIG_SYS_FSL_DDR_MAIN_NUM_CTRLS      1
+/*
+ * SMP Definitinos
+ */
+#define CPU_RELEASE_ADDR               secondary_boot_func
+
+#ifdef CONFIG_PCI
+#define CONFIG_CMD_PCI
+#endif
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2048 * 1024)
+
+/* I2C */
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
+#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
+#define CONFIG_SYS_I2C_MXC_I2C4                /* enable I2C bus 4 */
+
+/* Serial Port */
+#define CONFIG_CONS_INDEX       1
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE     1
+#define CONFIG_SYS_NS16550_CLK          (get_bus_freq(0) / 2)
+
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+
+/* IFC */
+#define CONFIG_FSL_IFC
+
+/*
+ * During booting, IFC is mapped at the region of 0x30000000.
+ * But this region is limited to 256MB. To accommodate NOR, promjet
+ * and FPGA. This region is divided as below:
+ * 0x30000000 - 0x37ffffff : 128MB : NOR flash
+ * 0x38000000 - 0x3BFFFFFF : 64MB  : Promjet
+ * 0x3C000000 - 0x40000000 : 64MB  : FPGA etc
+ *
+ * To accommodate bigger NOR flash and other devices, we will map IFC
+ * chip selects to as below:
+ * 0x5_1000_0000..0x5_1fff_ffff        Memory Hole
+ * 0x5_2000_0000..0x5_3fff_ffff        IFC CSx (FPGA, NAND and others 512MB)
+ * 0x5_4000_0000..0x5_7fff_ffff        ASIC or others 1GB
+ * 0x5_8000_0000..0x5_bfff_ffff        IFC CS0 1GB (NOR/Promjet)
+ * 0x5_C000_0000..0x5_ffff_ffff        IFC CS1 1GB (NOR/Promjet)
+ *
+ * For e.g. NOR flash at CS0 will be mapped to 0x580000000 after relocation.
+ * CONFIG_SYS_FLASH_BASE has the final address (core view)
+ * CONFIG_SYS_FLASH_BASE_PHYS has the final address (IFC view)
+ * CONFIG_SYS_FLASH_BASE_PHYS_EARLY has the temporary IFC address
+ * CONFIG_SYS_TEXT_BASE is linked to 0x30000000 for booting
+ */
+
+#define CONFIG_SYS_FLASH_BASE                  0x580000000ULL
+#define CONFIG_SYS_FLASH_BASE_PHYS             0x80000000
+#define CONFIG_SYS_FLASH_BASE_PHYS_EARLY       0x00000000
+
+#define CONFIG_SYS_FLASH1_BASE_PHYS            0xC0000000
+#define CONFIG_SYS_FLASH1_BASE_PHYS_EARLY      0x8000000
+
+#ifndef __ASSEMBLY__
+unsigned long long get_qixis_addr(void);
+#endif
+
+#define QIXIS_BASE                             get_qixis_addr()
+#define QIXIS_BASE_PHYS                                0x20000000
+#define QIXIS_BASE_PHYS_EARLY                  0xC000000
+
+
+#define CONFIG_SYS_NAND_BASE                   0x530000000ULL
+#define CONFIG_SYS_NAND_BASE_PHYS              0x30000000
+
+
+/* MC firmware */
+/* TODO Actual DPL max length needs to be confirmed with the MC FW team */
+#define CONFIG_SYS_LS_MC_DPC_MAX_LENGTH            0x20000
+#define CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET    0x00F00000
+#define CONFIG_SYS_LS_MC_DPL_MAX_LENGTH            0x20000
+#define CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET    0x00F20000
+#define CONFIG_SYS_LS_MC_AIOP_IMG_MAX_LENGTH   0x200000
+#define CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET  0x07000000
+/*
+ * Carve out a DDR region which will not be used by u-boot/Linux
+ *
+ * It will be used by MC and Debug Server. The MC region must be
+ * 512MB aligned, so the min size to hide is 512MB.
+ */
+
+#if defined(CONFIG_FSL_MC_ENET)
+#define CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE           (512UL * 1024 * 1024)
+#endif
+
+#define CONFIG_FSL_CAAM                        /* Enable SEC/CAAM */
+
+/* Command line configuration */
+#define CONFIG_CMD_GREPENV
+#define CONFIG_CMD_CACHE
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LOAD_ADDR   (CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000)
+
+/* Physical Memory Map */
+#define CONFIG_CHIP_SELECTS_PER_CTRL   4
+
+#define CONFIG_NR_DRAM_BANKS           2
+
+#define CONFIG_HWCONFIG
+#define HWCONFIG_BUFFER_SIZE           128
+
+/* #define CONFIG_DISPLAY_CPUINFO */
+
+/* Allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+/* Initial environment variables */
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "hwconfig=fsl_ddr:bank_intlv=auto\0"    \
+       "loadaddr=0x80100000\0"                 \
+       "kernel_addr=0x100000\0"                \
+       "ramdisk_addr=0x800000\0"               \
+       "ramdisk_size=0x2000000\0"              \
+       "fdt_high=0xa0000000\0"                 \
+       "initrd_high=0xffffffffffffffff\0"      \
+       "kernel_start=0x581000000\0"            \
+       "kernel_load=0xa0000000\0"              \
+       "kernel_size=0x2800000\0"               \
+       "console=ttyAMA0,38400n8\0"             \
+       "mcinitcmd=fsl_mc start mc 0x580a00000" \
+       " 0x580e00000 \0"
+
+#define CONFIG_BOOTARGS                "console=ttyS0,115200 root=/dev/ram0 " \
+                               "earlycon=uart8250,mmio,0x21c0500 " \
+                               "ramdisk_size=0x3000000 default_hugepagesz=2m" \
+                               " hugepagesz=2m hugepages=256"
+#if defined(CONFIG_QSPI_BOOT)
+#define CONFIG_BOOTCOMMAND     "sf probe 0:0;" \
+                               "sf read 0x80200000 0xd00000 0x100000;"\
+                               " fsl_mc apply dpl 0x80200000 &&" \
+                               " sf read $kernel_load $kernel_start" \
+                               " $kernel_size && bootm $kernel_load"
+#else /* NOR BOOT*/
+#define CONFIG_BOOTCOMMAND     "fsl_mc apply dpl 0x580d00000 &&" \
+                               " cp.b $kernel_start $kernel_load" \
+                               " $kernel_size && bootm $kernel_load"
+#endif
+
+/* Monitor Command Prompt */
+#define CONFIG_SYS_CBSIZE              512     /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
+                                       sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE /* Boot args buffer */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CMDLINE_EDITING         1
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_MAXARGS             64      /* max command args */
+
+#define CONFIG_PANIC_HANG      /* do not reset board on panic */
+
+#define CONFIG_SYS_BOOTM_LEN   (64 << 20)      /* Increase max gunzip size */
+
+#endif /* __LS1088_COMMON_H */
diff --git a/include/configs/ls1088aqds.h b/include/configs/ls1088aqds.h
new file mode 100644 (file)
index 0000000..3547b0b
--- /dev/null
@@ -0,0 +1,414 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS1088A_QDS_H
+#define __LS1088A_QDS_H
+
+#include "ls1088a_common.h"
+
+
+#define CONFIG_DISPLAY_BOARDINFO_LATE
+
+
+#ifndef __ASSEMBLY__
+unsigned long get_board_sys_clk(void);
+unsigned long get_board_ddr_clk(void);
+#endif
+
+
+#if defined(CONFIG_QSPI_BOOT)
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_SIZE                        0x2000          /* 8KB */
+#define CONFIG_ENV_OFFSET              0x300000        /* 3MB */
+#define CONFIG_ENV_SECT_SIZE           0x40000
+#else
+#define CONFIG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_ADDR                        (CONFIG_SYS_FLASH_BASE + 0x300000)
+#define CONFIG_ENV_SECT_SIZE           0x20000
+#define CONFIG_ENV_SIZE                        0x20000
+#endif
+
+#if defined(CONFIG_QSPI_BOOT)
+#define CONFIG_QIXIS_I2C_ACCESS
+#define SYS_NO_FLASH
+
+#undef CONFIG_CMD_IMLS
+#define CONFIG_SYS_CLK_FREQ            100000000
+#define CONFIG_DDR_CLK_FREQ            100000000
+#else
+#define CONFIG_SYS_CLK_FREQ            get_board_sys_clk()
+#define CONFIG_DDR_CLK_FREQ            get_board_ddr_clk()
+#endif
+
+#define COUNTER_FREQUENCY_REAL         (CONFIG_SYS_CLK_FREQ/4)
+#define COUNTER_FREQUENCY              25000000        /* 25MHz */
+
+#define CONFIG_DIMM_SLOTS_PER_CTLR     1
+
+#define CONFIG_DDR_SPD
+#define CONFIG_DDR_ECC
+#define CONFIG_ECC_INIT_VIA_DDRCONTROLLER
+#define CONFIG_MEM_INIT_VALUE           0xdeadbeef
+#define SPD_EEPROM_ADDRESS             0x51
+#define CONFIG_SYS_SPD_BUS_NUM         0
+
+
+/*
+ * IFC Definitions
+ */
+#if !defined(CONFIG_QSPI_BOOT) && !defined(CONFIG_SD_BOOT_QSPI)
+#define CONFIG_SYS_NOR0_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NOR_AMASK           IFC_AMASK(128*1024*1024)
+#define CONFIG_SYS_NOR_AMASK_EARLY     IFC_AMASK(64*1024*1024)
+
+#define CONFIG_SYS_NOR0_CSPR                                   \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS)             | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR0_CSPR_EARLY                             \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS_EARLY)       | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR1_CSPR                                   \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH1_BASE_PHYS)            | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR1_CSPR_EARLY                             \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH1_BASE_PHYS_EARLY)      | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR_CSOR    CSOR_NOR_ADM_SHIFT(12)
+#define CONFIG_SYS_NOR_FTIM0   (FTIM0_NOR_TACSE(0x4) | \
+                               FTIM0_NOR_TEADC(0x5) | \
+                               FTIM0_NOR_TEAHC(0x5))
+#define CONFIG_SYS_NOR_FTIM1   (FTIM1_NOR_TACO(0x35) | \
+                               FTIM1_NOR_TRAD_NOR(0x1a) |\
+                               FTIM1_NOR_TSEQRAD_NOR(0x13))
+#define CONFIG_SYS_NOR_FTIM2   (FTIM2_NOR_TCS(0x4) | \
+                               FTIM2_NOR_TCH(0x4) | \
+                               FTIM2_NOR_TWPH(0x0E) | \
+                               FTIM2_NOR_TWP(0x1c))
+#define CONFIG_SYS_NOR_FTIM3   0x04000000
+#define CONFIG_SYS_IFC_CCR     0x01000000
+
+#ifndef SYS_NO_FLASH
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+#define CONFIG_SYS_FLASH_QUIET_TEST
+#define CONFIG_FLASH_SHOW_PROGRESS     45 /* count down from 45/5: 9..1 */
+
+#define CONFIG_SYS_MAX_FLASH_BANKS     2       /* number of banks */
+#define CONFIG_SYS_MAX_FLASH_SECT      1024    /* sectors per device */
+#define CONFIG_SYS_FLASH_ERASE_TOUT    60000   /* Flash Erase Timeout (ms) */
+#define CONFIG_SYS_FLASH_WRITE_TOUT    500     /* Flash Write Timeout (ms) */
+
+#define CONFIG_SYS_FLASH_EMPTY_INFO
+#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE,\
+                                        CONFIG_SYS_FLASH_BASE + 0x40000000}
+#endif
+#endif
+
+#define CONFIG_NAND_FSL_IFC
+#define CONFIG_SYS_NAND_MAX_ECCPOS     256
+#define CONFIG_SYS_NAND_MAX_OOBFREE    2
+
+#define CONFIG_SYS_NAND_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NAND_CSPR   (CSPR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \
+                               | CSPR_PORT_SIZE_8 /* Port Size = 8 bit */ \
+                               | CSPR_MSEL_NAND        /* MSEL = NAND */ \
+                               | CSPR_V)
+#define CONFIG_SYS_NAND_AMASK  IFC_AMASK(64 * 1024)
+
+#define CONFIG_SYS_NAND_CSOR    (CSOR_NAND_ECC_ENC_EN   /* ECC on encode */ \
+                               | CSOR_NAND_ECC_DEC_EN  /* ECC on decode */ \
+                               | CSOR_NAND_ECC_MODE_4  /* 4-bit ECC */ \
+                               | CSOR_NAND_RAL_3       /* RAL = 3Byes */ \
+                               | CSOR_NAND_PGS_2K      /* Page Size = 2K */ \
+                               | CSOR_NAND_SPRZ_64/* Spare size = 64 */ \
+                               | CSOR_NAND_PB(64))     /*Pages Per Block = 64*/
+
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+
+/* ONFI NAND Flash mode0 Timing Params */
+#define CONFIG_SYS_NAND_FTIM0          (FTIM0_NAND_TCCST(0x07) | \
+                                       FTIM0_NAND_TWP(0x18)   | \
+                                       FTIM0_NAND_TWCHT(0x07) | \
+                                       FTIM0_NAND_TWH(0x0a))
+#define CONFIG_SYS_NAND_FTIM1          (FTIM1_NAND_TADLE(0x32) | \
+                                       FTIM1_NAND_TWBE(0x39)  | \
+                                       FTIM1_NAND_TRR(0x0e)   | \
+                                       FTIM1_NAND_TRP(0x18))
+#define CONFIG_SYS_NAND_FTIM2          (FTIM2_NAND_TRAD(0x0f) | \
+                                       FTIM2_NAND_TREH(0x0a) | \
+                                       FTIM2_NAND_TWHRE(0x1e))
+#define CONFIG_SYS_NAND_FTIM3          0x0
+
+#define CONFIG_SYS_NAND_BASE_LIST      { CONFIG_SYS_NAND_BASE }
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_MTD_NAND_VERIFY_WRITE
+#define CONFIG_CMD_NAND
+
+#define CONFIG_SYS_NAND_BLOCK_SIZE     (128 * 1024)
+
+#define CONFIG_FSL_QIXIS
+#define CONFIG_SYS_I2C_FPGA_ADDR       0x66
+#define QIXIS_LBMAP_SWITCH             6
+#define QIXIS_QMAP_MASK                        0xe0
+#define QIXIS_QMAP_SHIFT               5
+#define QIXIS_LBMAP_MASK               0x0f
+#define QIXIS_LBMAP_SHIFT              0
+#define QIXIS_LBMAP_DFLTBANK           0x0e
+#define QIXIS_LBMAP_ALTBANK            0x2e
+#define QIXIS_LBMAP_SD                 0x00
+#define QIXIS_LBMAP_SD_QSPI            0x0e
+#define QIXIS_LBMAP_QSPI               0x0e
+#define QIXIS_RCW_SRC_SD               0x40
+#define QIXIS_RCW_SRC_QSPI             0x62
+#define QIXIS_RST_CTL_RESET            0x41
+#define QIXIS_RCFG_CTL_RECONFIG_IDLE   0x20
+#define QIXIS_RCFG_CTL_RECONFIG_START  0x21
+#define QIXIS_RCFG_CTL_WATCHDOG_ENBLE  0x08
+#define        QIXIS_RST_FORCE_MEM             0x01
+#define QIXIS_STAT_PRES1               0xb
+#define QIXIS_SDID_MASK                        0x07
+#define QIXIS_ESDHC_NO_ADAPTER         0x7
+
+#define CONFIG_SYS_FPGA_CSPR_EXT       (0x0)
+#define CONFIG_SYS_FPGA_CSPR           (CSPR_PHYS_ADDR(QIXIS_BASE_PHYS_EARLY) \
+                                       | CSPR_PORT_SIZE_8 \
+                                       | CSPR_MSEL_GPCM \
+                                       | CSPR_V)
+#define SYS_FPGA_CSPR_FINAL    (CSPR_PHYS_ADDR(QIXIS_BASE_PHYS) \
+                                       | CSPR_PORT_SIZE_8 \
+                                       | CSPR_MSEL_GPCM \
+                                       | CSPR_V)
+
+#define CONFIG_SYS_FPGA_AMASK          IFC_AMASK(64*1024)
+#if defined(CONFIG_QSPI_BOOT)
+#define CONFIG_SYS_FPGA_CSOR           CSOR_GPCM_ADM_SHIFT(0)
+#else
+#define CONFIG_SYS_FPGA_CSOR           CSOR_GPCM_ADM_SHIFT(12)
+#endif
+/* QIXIS Timing parameters*/
+#define SYS_FPGA_CS_FTIM0      (FTIM0_GPCM_TACSE(0x0e) | \
+                                       FTIM0_GPCM_TEADC(0x0e) | \
+                                       FTIM0_GPCM_TEAHC(0x0e))
+#define SYS_FPGA_CS_FTIM1      (FTIM1_GPCM_TACO(0xff) | \
+                                       FTIM1_GPCM_TRAD(0x3f))
+#define SYS_FPGA_CS_FTIM2      (FTIM2_GPCM_TCS(0xf) | \
+                                       FTIM2_GPCM_TCH(0xf) | \
+                                       FTIM2_GPCM_TWP(0x3E))
+#define SYS_FPGA_CS_FTIM3      0x0
+
+#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NAND_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NAND_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NAND_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NAND_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NAND_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NAND_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NAND_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NAND_FTIM3
+#define CONFIG_SYS_CSPR2_EXT           CONFIG_SYS_FPGA_CSPR_EXT
+#define CONFIG_SYS_CSPR2               CONFIG_SYS_FPGA_CSPR
+#define CONFIG_SYS_CSPR2_FINAL         SYS_FPGA_CSPR_FINAL
+#define CONFIG_SYS_AMASK2              CONFIG_SYS_FPGA_AMASK
+#define CONFIG_SYS_CSOR2               CONFIG_SYS_FPGA_CSOR
+#define CONFIG_SYS_CS2_FTIM0           SYS_FPGA_CS_FTIM0
+#define CONFIG_SYS_CS2_FTIM1           SYS_FPGA_CS_FTIM1
+#define CONFIG_SYS_CS2_FTIM2           SYS_FPGA_CS_FTIM2
+#define CONFIG_SYS_CS2_FTIM3           SYS_FPGA_CS_FTIM3
+#else
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NOR0_CSPR_EARLY
+#define CONFIG_SYS_CSPR0_FINAL         CONFIG_SYS_NOR0_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NOR_FTIM3
+#define CONFIG_SYS_CSPR1_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR1               CONFIG_SYS_NOR1_CSPR_EARLY
+#define CONFIG_SYS_CSPR1_FINAL         CONFIG_SYS_NOR1_CSPR
+#define CONFIG_SYS_AMASK1              CONFIG_SYS_NOR_AMASK_EARLY
+#define CONFIG_SYS_AMASK1_FINAL                CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR1               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS1_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS1_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS1_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS1_FTIM3           CONFIG_SYS_NOR_FTIM3
+#define CONFIG_SYS_CSPR2_EXT           CONFIG_SYS_NAND_CSPR_EXT
+#define CONFIG_SYS_CSPR2               CONFIG_SYS_NAND_CSPR
+#define CONFIG_SYS_AMASK2              CONFIG_SYS_NAND_AMASK
+#define CONFIG_SYS_CSOR2               CONFIG_SYS_NAND_CSOR
+#define CONFIG_SYS_CS2_FTIM0           CONFIG_SYS_NAND_FTIM0
+#define CONFIG_SYS_CS2_FTIM1           CONFIG_SYS_NAND_FTIM1
+#define CONFIG_SYS_CS2_FTIM2           CONFIG_SYS_NAND_FTIM2
+#define CONFIG_SYS_CS2_FTIM3           CONFIG_SYS_NAND_FTIM3
+#define CONFIG_SYS_CSPR3_EXT           CONFIG_SYS_FPGA_CSPR_EXT
+#define CONFIG_SYS_CSPR3               CONFIG_SYS_FPGA_CSPR
+#define CONFIG_SYS_CSPR3_FINAL         CONFIG_SYS_FPGA_CSPR_FINAL
+#define CONFIG_SYS_AMASK3              CONFIG_SYS_FPGA_AMASK
+#define CONFIG_SYS_CSOR3               CONFIG_SYS_FPGA_CSOR
+#define CONFIG_SYS_CS3_FTIM0           CONFIG_SYS_FPGA_CS_FTIM0
+#define CONFIG_SYS_CS3_FTIM1           CONFIG_SYS_FPGA_CS_FTIM1
+#define CONFIG_SYS_CS3_FTIM2           CONFIG_SYS_FPGA_CS_FTIM2
+#define CONFIG_SYS_CS3_FTIM3           CONFIG_SYS_FPGA_CS_FTIM3
+#endif
+
+#define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 5000
+
+/*
+ * I2C bus multiplexer
+ */
+#define I2C_MUX_PCA_ADDR_PRI           0x77
+#define I2C_MUX_PCA_ADDR_SEC           0x76 /* Secondary multiplexer */
+#define I2C_RETIMER_ADDR               0x18
+#define I2C_RETIMER_ADDR2              0x19
+#define I2C_MUX_CH_DEFAULT             0x8
+#define I2C_MUX_CH5                    0xD
+
+/*
+* RTC configuration
+*/
+#define RTC
+#define CONFIG_RTC_PCF8563 1
+#define CONFIG_SYS_I2C_RTC_ADDR         0x51  /* Channel 3*/
+#define CONFIG_CMD_DATE
+
+/* EEPROM */
+#define CONFIG_ID_EEPROM
+#define CONFIG_SYS_I2C_EEPROM_NXID
+#define CONFIG_SYS_EEPROM_BUS_NUM              0
+#define CONFIG_SYS_I2C_EEPROM_ADDR             0x57
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN         1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS      3
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS  5
+
+/* QSPI device */
+#if defined(CONFIG_QSPI_BOOT)
+#define CONFIG_FSL_QSPI
+#define CONFIG_SPI_FLASH_SPANSION
+#define FSL_QSPI_FLASH_SIZE            (1 << 26)
+#define FSL_QSPI_FLASH_NUM             2
+
+#endif
+
+#ifdef CONFIG_FSL_DSPI
+#define CONFIG_SPI_FLASH_STMICRO
+#define CONFIG_SPI_FLASH_SST
+#define CONFIG_SPI_FLASH_EON
+#if !defined(CONFIG_QSPI_BOOT) && !defined(CONFIG_SD_BOOT_QSPI)
+#define CONFIG_SF_DEFAULT_BUS          1
+#define CONFIG_SF_DEFAULT_CS           0
+#endif
+#endif
+
+#define CONFIG_CMD_MEMINFO
+#define CONFIG_CMD_MEMTEST
+#define CONFIG_SYS_MEMTEST_START       0x80000000
+#define CONFIG_SYS_MEMTEST_END         0x9fffffff
+
+#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_FSL_MEMAC
+
+/*  MMC  */
+#define CONFIG_FSL_ESDHC
+#define CONFIG_SYS_FSL_MMC_HAS_CAPBLT_VS33
+#define CONFIG_ESDHC_DETECT_QUIRK ((readb(QIXIS_BASE + QIXIS_STAT_PRES1) & \
+       QIXIS_SDID_MASK) != QIXIS_ESDHC_NO_ADAPTER)
+
+/* Initial environment variables */
+#if defined(CONFIG_QSPI_BOOT)
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "hwconfig=fsl_ddr:bank_intlv=auto\0"    \
+       "loadaddr=0x90100000\0"                 \
+       "kernel_addr=0x100000\0"                \
+       "ramdisk_addr=0x800000\0"               \
+       "ramdisk_size=0x2000000\0"              \
+       "fdt_high=0xa0000000\0"                 \
+       "initrd_high=0xffffffffffffffff\0"      \
+       "kernel_start=0x1000000\0"              \
+       "kernel_load=0xa0000000\0"              \
+       "kernel_size=0x2800000\0"               \
+       "mcinitcmd=sf probe 0:0;sf read 0x80000000 0xA00000 0x100000;"  \
+       "sf read 0x80100000 0xE00000 0x100000;" \
+       "fsl_mc start mc 0x80000000 0x80100000\0"       \
+       "mcmemsize=0x70000000 \0"
+#else  /* NOR BOOT */
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "hwconfig=fsl_ddr:bank_intlv=auto\0"    \
+       "loadaddr=0x90100000\0"                 \
+       "kernel_addr=0x100000\0"                \
+       "ramdisk_addr=0x800000\0"               \
+       "ramdisk_size=0x2000000\0"              \
+       "fdt_high=0xa0000000\0"                 \
+       "initrd_high=0xffffffffffffffff\0"      \
+       "kernel_start=0x1000000\0"              \
+       "kernel_load=0xa0000000\0"              \
+       "kernel_size=0x2800000\0"               \
+       "mcinitcmd=fsl_mc start mc 0x580A00000 0x580E00000\0"   \
+       "mcmemsize=0x70000000 \0"
+#endif
+
+#ifdef CONFIG_FSL_MC_ENET
+#define CONFIG_FSL_MEMAC
+#define        CONFIG_PHYLIB
+#define CONFIG_PHYLIB_10G
+#define CONFIG_PHY_VITESSE
+#define CONFIG_PHY_REALTEK
+#define CONFIG_PHY_TERANETICS
+#define RGMII_PHY1_ADDR                0x1
+#define RGMII_PHY2_ADDR                0x2
+#define SGMII_CARD_PORT1_PHY_ADDR 0x1C
+#define SGMII_CARD_PORT2_PHY_ADDR 0x1d
+#define SGMII_CARD_PORT3_PHY_ADDR 0x1E
+#define SGMII_CARD_PORT4_PHY_ADDR 0x1F
+
+#define XQSGMII_CARD_PHY1_PORT0_ADDR 0x0
+#define XQSGMII_CARD_PHY1_PORT1_ADDR 0x1
+#define XQSGMII_CARD_PHY1_PORT2_ADDR 0x2
+#define XQSGMII_CARD_PHY1_PORT3_ADDR 0x3
+#define XQSGMII_CARD_PHY2_PORT0_ADDR 0x4
+#define XQSGMII_CARD_PHY2_PORT1_ADDR 0x5
+#define XQSGMII_CARD_PHY2_PORT2_ADDR 0x6
+#define XQSGMII_CARD_PHY2_PORT3_ADDR 0x7
+#define XQSGMII_CARD_PHY3_PORT0_ADDR 0x8
+#define XQSGMII_CARD_PHY3_PORT1_ADDR 0x9
+#define XQSGMII_CARD_PHY3_PORT2_ADDR 0xa
+#define XQSGMII_CARD_PHY3_PORT3_ADDR 0xb
+#define XQSGMII_CARD_PHY4_PORT0_ADDR 0xc
+#define XQSGMII_CARD_PHY4_PORT1_ADDR 0xd
+#define XQSGMII_CARD_PHY4_PORT2_ADDR 0xe
+#define XQSGMII_CARD_PHY4_PORT3_ADDR 0xf
+
+#define CONFIG_MII             /* MII PHY management */
+#define CONFIG_ETHPRIME                "DPMAC1@xgmii"
+#define CONFIG_PHY_GIGE                /* Include GbE speed/duplex detection */
+
+#endif
+
+#undef CONFIG_CMDLINE_EDITING
+#include <config_distro_defaults.h>
+#define BOOT_TARGET_DEVICES(func) \
+       func(USB, usb, 0) \
+       func(MMC, mmc, 0) \
+       func(SCSI, scsi, 0) \
+       func(DHCP, dhcp, na)
+#include <config_distro_bootcmd.h>
+
+#include <asm/fsl_secure_boot.h>
+
+#endif /* __LS1088A_QDS_H */
diff --git a/include/configs/ls1088ardb.h b/include/configs/ls1088ardb.h
new file mode 100644 (file)
index 0000000..3223278
--- /dev/null
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS1088A_RDB_H
+#define __LS1088A_RDB_H
+
+#include "ls1088a_common.h"
+
+#define CONFIG_DISPLAY_BOARDINFO_LATE
+
+#if defined(CONFIG_QSPI_BOOT)
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_SIZE                        0x2000          /* 8KB */
+#define CONFIG_ENV_OFFSET              0x300000        /* 3MB */
+#define CONFIG_ENV_SECT_SIZE           0x40000
+#else
+#define CONFIG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_ADDR                        (CONFIG_SYS_FLASH_BASE + 0x300000)
+#define CONFIG_ENV_SECT_SIZE           0x20000
+#define CONFIG_ENV_SIZE                        0x20000
+#endif
+
+#if defined(CONFIG_QSPI_BOOT)
+#define CONFIG_QIXIS_I2C_ACCESS
+#define SYS_NO_FLASH
+#undef CONFIG_CMD_IMLS
+#endif
+
+#define CONFIG_SYS_CLK_FREQ            100000000
+#define CONFIG_DDR_CLK_FREQ            100000000
+#define COUNTER_FREQUENCY_REAL         25000000        /* 25MHz */
+#define COUNTER_FREQUENCY              25000000        /* 25MHz */
+
+#define CONFIG_DDR_SPD
+#ifdef CONFIG_EMU
+#define CONFIG_SYS_FSL_DDR_EMU
+#define CONFIG_SYS_MXC_I2C1_SPEED      40000000
+#define CONFIG_SYS_MXC_I2C2_SPEED      40000000
+#else
+#define CONFIG_DDR_ECC
+#define CONFIG_ECC_INIT_VIA_DDRCONTROLLER
+#define CONFIG_MEM_INIT_VALUE          0xdeadbeef
+#endif
+#define SPD_EEPROM_ADDRESS     0x51
+#define CONFIG_SYS_SPD_BUS_NUM 0       /* SPD on I2C bus 0 */
+#define CONFIG_DIMM_SLOTS_PER_CTLR     1
+
+
+#if !defined(CONFIG_QSPI_BOOT) && !defined(CONFIG_SD_BOOT_QSPI)
+#define CONFIG_SYS_NOR0_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NOR_AMASK           IFC_AMASK(128 * 1024 * 1024)
+#define CONFIG_SYS_NOR_AMASK_EARLY     IFC_AMASK(64 * 1024 * 1024)
+
+#define CONFIG_SYS_NOR0_CSPR                                   \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS)             | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR0_CSPR_EARLY                             \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS_EARLY)       | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR_CSOR    CSOR_NOR_ADM_SHIFT(6)
+#define CONFIG_SYS_NOR_FTIM0   (FTIM0_NOR_TACSE(0x1) | \
+                               FTIM0_NOR_TEADC(0x1) | \
+                               FTIM0_NOR_TEAHC(0x1))
+#define CONFIG_SYS_NOR_FTIM1   (FTIM1_NOR_TACO(0x1) | \
+                               FTIM1_NOR_TRAD_NOR(0x1))
+#define CONFIG_SYS_NOR_FTIM2   (FTIM2_NOR_TCS(0x0) | \
+                               FTIM2_NOR_TCH(0x0) | \
+                               FTIM2_NOR_TWP(0x1))
+#define CONFIG_SYS_NOR_FTIM3   0x04000000
+#define CONFIG_SYS_IFC_CCR     0x01000000
+
+#ifndef SYS_NO_FLASH
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+#define CONFIG_SYS_FLASH_QUIET_TEST
+#define CONFIG_FLASH_SHOW_PROGRESS     45 /* count down from 45/5: 9..1 */
+
+#define CONFIG_SYS_MAX_FLASH_BANKS     1       /* number of banks */
+#define CONFIG_SYS_MAX_FLASH_SECT      1024    /* sectors per device */
+#define CONFIG_SYS_FLASH_ERASE_TOUT    60000   /* Flash Erase Timeout (ms) */
+#define CONFIG_SYS_FLASH_WRITE_TOUT    500     /* Flash Write Timeout (ms) */
+
+#define CONFIG_SYS_FLASH_EMPTY_INFO
+#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE }
+#endif
+#endif
+#define CONFIG_SYS_NAND_MAX_ECCPOS     256
+#define CONFIG_SYS_NAND_MAX_OOBFREE    2
+
+#define CONFIG_SYS_NAND_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NAND_CSPR   (CSPR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \
+                               | CSPR_PORT_SIZE_8 /* Port Size = 8 bit */ \
+                               | CSPR_MSEL_NAND        /* MSEL = NAND */ \
+                               | CSPR_V)
+#define CONFIG_SYS_NAND_AMASK  IFC_AMASK(64 * 1024)
+
+#define CONFIG_SYS_NAND_CSOR    (CSOR_NAND_ECC_ENC_EN   /* ECC on encode */ \
+                               | CSOR_NAND_ECC_DEC_EN  /* ECC on decode */ \
+                               | CSOR_NAND_ECC_MODE_4  /* 4-bit ECC */ \
+                               | CSOR_NAND_RAL_3       /* RAL = 3Byes */ \
+                               | CSOR_NAND_PGS_2K      /* Page Size = 2K */ \
+                               | CSOR_NAND_SPRZ_64/* Spare size = 64 */ \
+                               | CSOR_NAND_PB(64))     /*Pages Per Block = 64*/
+
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+
+/* ONFI NAND Flash mode0 Timing Params */
+#define CONFIG_SYS_NAND_FTIM0          (FTIM0_NAND_TCCST(0x07) | \
+                                       FTIM0_NAND_TWP(0x18)   | \
+                                       FTIM0_NAND_TWCHT(0x07) | \
+                                       FTIM0_NAND_TWH(0x0a))
+#define CONFIG_SYS_NAND_FTIM1          (FTIM1_NAND_TADLE(0x32) | \
+                                       FTIM1_NAND_TWBE(0x39)  | \
+                                       FTIM1_NAND_TRR(0x0e)   | \
+                                       FTIM1_NAND_TRP(0x18))
+#define CONFIG_SYS_NAND_FTIM2          (FTIM2_NAND_TRAD(0x0f) | \
+                                       FTIM2_NAND_TREH(0x0a) | \
+                                       FTIM2_NAND_TWHRE(0x1e))
+#define CONFIG_SYS_NAND_FTIM3          0x0
+
+#define CONFIG_SYS_NAND_BASE_LIST      { CONFIG_SYS_NAND_BASE }
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_MTD_NAND_VERIFY_WRITE
+
+#define CONFIG_SYS_NAND_BLOCK_SIZE     (128 * 1024)
+
+#define CONFIG_FSL_QIXIS
+#define CONFIG_SYS_I2C_FPGA_ADDR       0x66
+#define QIXIS_LBMAP_SWITCH             2
+#define QIXIS_QMAP_MASK                        0xe0
+#define QIXIS_QMAP_SHIFT               5
+#define QIXIS_LBMAP_MASK               0x1f
+#define QIXIS_LBMAP_SHIFT              5
+#define QIXIS_LBMAP_DFLTBANK           0x00
+#define QIXIS_LBMAP_ALTBANK            0x20
+#define QIXIS_LBMAP_SD                 0x00
+#define QIXIS_LBMAP_SD_QSPI            0x00
+#define QIXIS_LBMAP_QSPI               0x00
+#define QIXIS_RCW_SRC_SD               0x40
+#define QIXIS_RCW_SRC_QSPI             0x62
+#define QIXIS_RST_CTL_RESET            0x31
+#define QIXIS_RCFG_CTL_RECONFIG_IDLE   0x20
+#define QIXIS_RCFG_CTL_RECONFIG_START  0x21
+#define QIXIS_RCFG_CTL_WATCHDOG_ENBLE  0x08
+#define        QIXIS_RST_FORCE_MEM             0x01
+
+#define CONFIG_SYS_FPGA_CSPR_EXT       (0x0)
+#define CONFIG_SYS_FPGA_CSPR           (CSPR_PHYS_ADDR(QIXIS_BASE_PHYS_EARLY) \
+                                       | CSPR_PORT_SIZE_8 \
+                                       | CSPR_MSEL_GPCM \
+                                       | CSPR_V)
+#define SYS_FPGA_CSPR_FINAL    (CSPR_PHYS_ADDR(QIXIS_BASE_PHYS) \
+                                       | CSPR_PORT_SIZE_8 \
+                                       | CSPR_MSEL_GPCM \
+                                       | CSPR_V)
+
+#define CONFIG_SYS_FPGA_AMASK          IFC_AMASK(64*1024)
+#define CONFIG_SYS_FPGA_CSOR           CSOR_GPCM_ADM_SHIFT(0)
+/* QIXIS Timing parameters*/
+#define SYS_FPGA_CS_FTIM0      (FTIM0_GPCM_TACSE(0x0e) | \
+                                       FTIM0_GPCM_TEADC(0x0e) | \
+                                       FTIM0_GPCM_TEAHC(0x0e))
+#define SYS_FPGA_CS_FTIM1      (FTIM1_GPCM_TACO(0xff) | \
+                                       FTIM1_GPCM_TRAD(0x3f))
+#define SYS_FPGA_CS_FTIM2      (FTIM2_GPCM_TCS(0xf) | \
+                                       FTIM2_GPCM_TCH(0xf) | \
+                                       FTIM2_GPCM_TWP(0x3E))
+#define SYS_FPGA_CS_FTIM3      0x0
+
+#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NAND_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NAND_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NAND_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NAND_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NAND_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NAND_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NAND_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NAND_FTIM3
+#define CONFIG_SYS_CSPR2_EXT           CONFIG_SYS_FPGA_CSPR_EXT
+#define CONFIG_SYS_CSPR2               CONFIG_SYS_FPGA_CSPR
+#define CONFIG_SYS_CSPR2_FINAL         SYS_FPGA_CSPR_FINAL
+#define CONFIG_SYS_AMASK2              CONFIG_SYS_FPGA_AMASK
+#define CONFIG_SYS_CSOR2               CONFIG_SYS_FPGA_CSOR
+#define CONFIG_SYS_CS2_FTIM0           SYS_FPGA_CS_FTIM0
+#define CONFIG_SYS_CS2_FTIM1           SYS_FPGA_CS_FTIM1
+#define CONFIG_SYS_CS2_FTIM2           SYS_FPGA_CS_FTIM2
+#define CONFIG_SYS_CS2_FTIM3           SYS_FPGA_CS_FTIM3
+#else
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NOR0_CSPR_EARLY
+#define CONFIG_SYS_CSPR0_FINAL         CONFIG_SYS_NOR0_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NOR_FTIM3
+#endif
+
+
+#define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 5000
+
+/*
+ * I2C bus multiplexer
+ */
+#define I2C_MUX_PCA_ADDR_PRI           0x77
+#define I2C_MUX_PCA_ADDR_SEC           0x76 /* Secondary multiplexer */
+#define I2C_RETIMER_ADDR               0x18
+#define I2C_MUX_CH_DEFAULT             0x8
+#define I2C_MUX_CH5                    0xD
+/*
+* RTC configuration
+*/
+#define RTC
+#define CONFIG_RTC_PCF8563 1
+#define CONFIG_SYS_I2C_RTC_ADDR         0x51  /* Channel 3*/
+#define CONFIG_CMD_DATE
+
+/* EEPROM */
+#define CONFIG_ID_EEPROM
+#define CONFIG_SYS_I2C_EEPROM_NXID
+#define CONFIG_SYS_EEPROM_BUS_NUM              0
+#define CONFIG_SYS_I2C_EEPROM_ADDR             0x57
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN         1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS      3
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS  5
+
+/* QSPI device */
+#if defined(CONFIG_QSPI_BOOT)
+#define CONFIG_FSL_QSPI
+#define CONFIG_SPI_FLASH_SPANSION
+#define FSL_QSPI_FLASH_SIZE            (1 << 26)
+#define FSL_QSPI_FLASH_NUM             2
+#endif
+
+#define CONFIG_CMD_MEMINFO
+#define CONFIG_CMD_MEMTEST
+#define CONFIG_SYS_MEMTEST_START       0x80000000
+#define CONFIG_SYS_MEMTEST_END         0x9fffffff
+
+#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
+
+#define CONFIG_FSL_MEMAC
+
+/* Initial environment variables */
+#if defined(CONFIG_QSPI_BOOT)
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "hwconfig=fsl_ddr:bank_intlv=auto\0"    \
+       "loadaddr=0x90100000\0"                 \
+       "kernel_addr=0x100000\0"                \
+       "ramdisk_addr=0x800000\0"               \
+       "ramdisk_size=0x2000000\0"              \
+       "fdt_high=0xa0000000\0"                 \
+       "initrd_high=0xffffffffffffffff\0"      \
+       "kernel_start=0x1000000\0"              \
+       "kernel_load=0xa0000000\0"              \
+       "kernel_size=0x2800000\0"               \
+       "mcinitcmd=sf probe 0:0;sf read 0x80000000 0xA00000 0x100000;"  \
+       "sf read 0x80100000 0xE00000 0x100000;" \
+       "fsl_mc start mc 0x80000000 0x80100000\0"       \
+       "mcmemsize=0x70000000 \0"
+
+#endif
+
+/* MAC/PHY configuration */
+#ifdef CONFIG_FSL_MC_ENET
+#define CONFIG_PHYLIB_10G
+#define CONFIG_PHY_GIGE
+#define CONFIG_PHYLIB
+
+#define CONFIG_PHY_VITESSE
+#define CONFIG_PHY_AQUANTIA
+#define AQ_PHY_ADDR1                   0x00
+#define AQR105_IRQ_MASK                        0x00000004
+
+#define QSGMII1_PORT1_PHY_ADDR         0x0c
+#define QSGMII1_PORT2_PHY_ADDR         0x0d
+#define QSGMII1_PORT3_PHY_ADDR         0x0e
+#define QSGMII1_PORT4_PHY_ADDR         0x0f
+#define QSGMII2_PORT1_PHY_ADDR         0x1c
+#define QSGMII2_PORT2_PHY_ADDR         0x1d
+#define QSGMII2_PORT3_PHY_ADDR         0x1e
+#define QSGMII2_PORT4_PHY_ADDR         0x1f
+
+#define CONFIG_MII
+#define CONFIG_ETHPRIME                "DPMAC1@xgmii"
+#define CONFIG_PHY_GIGE
+#endif
+
+/*  MMC  */
+#ifdef CONFIG_MMC
+#define CONFIG_FSL_ESDHC
+#define CONFIG_SYS_FSL_MMC_HAS_CAPBLT_VS33
+#endif
+
+#undef CONFIG_CMDLINE_EDITING
+#include <config_distro_defaults.h>
+
+#define BOOT_TARGET_DEVICES(func) \
+       func(USB, usb, 0) \
+       func(MMC, mmc, 0) \
+       func(SCSI, scsi, 0) \
+       func(DHCP, dhcp, na)
+#include <config_distro_bootcmd.h>
+
+#include <asm/fsl_secure_boot.h>
+
+#endif /* __LS1088A_RDB_H */
index 74b627c31ef7181b0dee639a644a56006e3cb9d9..dcc12dd604548fe6697df9b5b1a8e37fdff00456 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (2 << 20)
-#define CONFIG_IPUV3_CLK               200000000
 #endif
 
 /*
index 50b21c9d97a0d9e430685bd4403d93b0a4cb04c2..0fe1bc1c1df2c8fd564a40735a33d0782f423447 100644 (file)
 #define CONFIG_SYS_USE_SERIALFLASH     1
 #define CONFIG_BOARD_LATE_INIT
 
+/* Timer */
+#define CONFIG_SYS_TIMER_COUNTER       0xfc06863c
+
 /*
  * Memory configurations
  */
 #define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_BASE          0x20000000
 #define CONFIG_SYS_SDRAM_SIZE          0x10000000
 
 #ifdef CONFIG_SPL_BUILD
@@ -45,8 +48,8 @@
  * Serial Driver
  */
 #define CONFIG_ATMEL_USART
-#define CONFIG_USART_BASE              ATMEL_BASE_USART0
-#define CONFIG_USART_ID                        ATMEL_ID_USART0
+#define CONFIG_USART_BASE              0xf802c000
+#define CONFIG_USART_ID                        6
 
 /*
  * Ethernet
index 1057b936ced69651288de4321af0208bbc0f61e2..2a77430e7cea8d01c2576045fafe522576f8695d 100644 (file)
@@ -15,8 +15,6 @@
 
 #define CONFIG_MACH_TYPE       MACH_TYPE_MCX
 
-#define CONFIG_EMIF4   /* The chip has EMIF4 controller */
-
 #include <asm/arch/cpu.h>              /* get chip and board defs */
 #include <asm/arch/omap.h>
 
 #define CONFIG_SYS_NAND_BUSWIDTH_16BIT
 #define CONFIG_NAND_OMAP_GPMC
 #define CONFIG_NAND_OMAP_GPMC_PREFETCH
-#define SMNAND_ENV_OFFSET              0x180000 /* environment starts here */
 
 /* Redundant Environment */
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x180000
+#define CONFIG_ENV_ADDR                        0x180000
 #define CONFIG_ENV_OFFSET_REDUND       (CONFIG_ENV_OFFSET + \
                                                2 * CONFIG_SYS_ENV_SECT_SIZE)
 #define CONFIG_ENV_SIZE_REDUND         CONFIG_ENV_SIZE
index c89cb0f43b0f01a9105e2918081621625db5eb4e..3ecb92c27da83072027da3c083729eca0aa95fa2 100644 (file)
@@ -84,7 +84,6 @@
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
-#define CONFIG_IPUV3_CLK       133000000
 
 /* allow to overwrite serial and ethaddr */
 #define CONFIG_ENV_OVERWRITE
index d78a877d8ec7ea954a93cddce00fa835fda83a32..ccb1a4a60973d6c812aa7f5649ba3cd668474327 100644 (file)
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
-#define CONFIG_IPUV3_CLK       200000000
 
 #endif /* __CONFIG_H */
index 45b9bbf403fc832ed2459773982246ee5194b36e..e973b3569850c279af36e287df26af1c9f89f8c9 100644 (file)
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
-#define CONFIG_IPUV3_CLK       200000000
 
 #endif                         /* __CONFIG_H */
index a168577ee728670fdb5490d160fbe0ccfe65f9b4..7fefe8edcb81747e2f09a9fef622bc1afbbf1c5d 100644 (file)
@@ -41,7 +41,6 @@
 
 /* Framebuffer */
 #define CONFIG_VIDEO_IPUV3
-#define CONFIG_IPUV3_CLK               260000000
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_SPLASH_SCREEN_ALIGN
                        "fi; "  \
                "fi\0" \
        "findfdt="\
+               "if test $board_name = HUMMINGBOARD2 && test $board_rev = MX6Q ; then " \
+                       "setenv fdtfile imx6q-hummingboard2.dtb; fi; " \
+               "if test $board_name = HUMMINGBOARD2 && test $board_rev = MX6DL ; then " \
+                       "setenv fdtfile imx6dl-hummingboard2.dtb; fi; " \
                "if test $board_name = HUMMINGBOARD && test $board_rev = MX6Q ; then " \
                        "setenv fdtfile imx6q-hummingboard.dtb; fi; " \
                "if test $board_name = HUMMINGBOARD && test $board_rev = MX6DL ; then " \
index 036c76d950a4a3eec27babfb444b1602f972b4e8..f083dc8a93ff8352510c940582362ece4a849b4c 100644 (file)
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#ifdef CONFIG_MX6DL
-#define CONFIG_IPUV3_CLK 198000000
-#else
-#define CONFIG_IPUV3_CLK 264000000
-#endif
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 
index d32d8f871a99d79e49f10b1a380b7ba3e1c32e25..520a52cbc6cf03a1dee38f1079c2b359cb02b904 100644 (file)
@@ -80,7 +80,6 @@
 #define CONFIG_VIDEO_BMP_GZIP
 #define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (6 * 1024 * 1024)
 #define CONFIG_BMP_16BPP
-#define CONFIG_IPUV3_CLK 260000000
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 
index 8e1effad34f53a867c0588ee251fa371618cda90..20b8c345f06620210d4852f547b1e64c54e48904 100644 (file)
@@ -33,8 +33,6 @@
  */
 #define CONFIG_SYS_TEXT_BASE   0x80008000
 
-#define CONFIG_SDRC                    /* The chip has SDRC controller */
-
 #include <asm/arch/cpu.h>              /* get chip and board defs */
 #include <asm/arch/omap.h>
 #include <asm/arch/mem.h>
index be8c6911e63a175a66a84dd4f1780253dacdf0c6..4480aaffa0e317ef72e3904536d89d01b6528011 100644 (file)
 #define CONFIG_SPLASH_SCREEN
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
-#define CONFIG_IPUV3_CLK               260000000
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 #endif
index ee22f4fc1bb5e4af3e5ffb07bbf9cdc10ef4867a..47a50bdaa650fe0583ba4dc41a6c5d90394364bc 100644 (file)
 
 #define CONFIG_ENV_SIZE                        (128 << 10)     /* 128 KiB */
 #define ONENAND_ENV_OFFSET             0x260000 /* environment starts here */
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 /* Defines for SPL */
 
index b4d7f171318b4940b5dd01bb45ae41b8af622c28..417d45b5824714a337d7bee8113b7d025c66fe41 100644 (file)
 
 #define CONFIG_ENV_SIZE                        (128 << 10)     /* 128 KiB */
 #define ONENAND_ENV_OFFSET             0x260000 /* environment starts here */
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 /* Defines for SPL */
 
index af99e8b5cb48b4d05082d19d5a04d675e3e4e18e..e9a1cad0f7df7ad4012928455c5e2183b5dc4903 100644 (file)
 #define CONFIG_SYS_NAND_U_BOOT_OFFS     0x80000
 #define CONFIG_ENV_IS_IN_NAND           1
 #define CONFIG_ENV_SIZE                 (128 << 10) /* 128 KiB */
-#define SMNAND_ENV_OFFSET               0x260000    /* environment starts here */
 #define CONFIG_SYS_ENV_SECT_SIZE        (128 << 10) /* 128 KiB */
-#define CONFIG_ENV_OFFSET               SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                 SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET               0x260000
+#define CONFIG_ENV_ADDR                 0x260000
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_MTD_PARTITIONS           /* required for UBI partition support */
 /* NAND: SPL falcon mode configs */
index 5fba35668b2d29ce6b7fe95734acef3714e4851a..5b31223b9ed2de2cd194afeea87bd359932d8f16 100644 (file)
 #define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE
 
 #define CONFIG_ENV_SIZE                        (128 << 10)     /* 128 KiB */
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 /* SMSC922x Ethernet */
 #if defined(CONFIG_CMD_NET)
index d53657f91623ad2bd549b4c4d7720540ccf52f78..cb92bd9c08469fb1f8589e794dd7e34da81c72b2 100644 (file)
 #define CONFIG_SYS_ONENAND_BASE                ONENAND_MAP
 
 #define ONENAND_ENV_OFFSET             0x240000 /* environment starts here */
-#define SMNAND_ENV_OFFSET              0x240000 /* environment starts here */
-
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x240000
+#define CONFIG_ENV_ADDR                        0x240000
 
 /* Configure SMSC9211 ethernet */
 #if defined(CONFIG_CMD_NET)
index 7f1b5712677efc82a3bfab28a94fa771b11dcd62..7d5e926d1bc55566771f1c99acaf75a499359827 100644 (file)
 /* Monitor at start of flash */
 #define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_FLASH_BASE
 
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 #endif                         /* __CONFIG_H */
index c6db88a4a2ff1d3c015035f922b3fa126d99d491..cbbe7d4e2fbe38fd537359739addee716047bc3c 100644 (file)
 #define CONFIG_SYS_ONENAND_BASE                ONENAND_MAP
 
 #define ONENAND_ENV_OFFSET             0x260000 /* environment starts here */
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
+#define CONFIG_ENV_ADDR                        0x260000
 
 #ifdef CONFIG_CMD_NET
 /* Ethernet (LAN9211 from SMSC9118 family) */
index 8cba92c56de225b03b07418f5b9d05bc15ba1c3f..8b4155f37caa27ed09fa24aeee286d431c10fb67 100644 (file)
@@ -51,6 +51,7 @@
 #include <config_distro_bootcmd.h>
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
+       ENV_MEM_LAYOUT_SETTINGS \
        BOOTENV
 
 #endif
index 04779162d00c347ac90e96c0ce944e602987f4b2..5ee45594a33860adbb60365d32a48a3a6f39e205 100644 (file)
@@ -28,4 +28,7 @@
 #define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_TEXT_BASE + 0x100000)
 #define CONFIG_SYS_LOAD_ADDR           (CONFIG_SYS_SDRAM_BASE + 0x2000000)
 
+/* rockchip ohci host driver */
+#define CONFIG_USB_OHCI_NEW
+#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS     1
 #endif
diff --git a/include/configs/sama5d27_som1_ek.h b/include/configs/sama5d27_som1_ek.h
new file mode 100644 (file)
index 0000000..fdf19ad
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Configuration file for the SAMA5D27 SOM1 EK Board.
+ *
+ * Copyright (C) 2017 Microchip Corporation
+ *                   Wenyou Yang <wenyou.yang@microchip.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include "at91-sama5_common.h"
+
+#undef CONFIG_SYS_TEXT_BASE
+#undef CONFIG_SYS_AT91_MAIN_CLOCK
+#define CONFIG_SYS_TEXT_BASE           0x23f00000
+#define CONFIG_SYS_AT91_MAIN_CLOCK      24000000 /* from 24 MHz crystal */
+
+#define CONFIG_MISC_INIT_R
+
+/* SDRAM */
+#define CONFIG_NR_DRAM_BANKS           1
+#define CONFIG_SYS_SDRAM_BASE          0x20000000
+#define CONFIG_SYS_SDRAM_SIZE          0x8000000
+
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_SYS_INIT_SP_ADDR                0x218000
+#else
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_SDRAM_BASE + 16 * 1024 - GENERATED_GBL_DATA_SIZE)
+#endif
+
+#define CONFIG_SYS_LOAD_ADDR           0x22000000 /* load address */
+
+/* NAND flash */
+#undef CONFIG_CMD_NAND
+
+/* SPI flash */
+#define CONFIG_SF_DEFAULT_SPEED                66000000
+
+#undef CONFIG_BOOTCOMMAND
+#ifdef CONFIG_SD_BOOT
+/* u-boot env in sd/mmc card */
+#define FAT_ENV_INTERFACE      "mmc"
+#define FAT_ENV_DEVICE_AND_PART        "0"
+#define FAT_ENV_FILE           "uboot.env"
+#define CONFIG_ENV_SIZE                0x4000
+/* bootstrap + u-boot + env in sd card */
+#define CONFIG_BOOTCOMMAND     "fatload mmc 0:1 0x21000000 at91-sama5d27_som1_ek.dtb; " \
+                               "fatload mmc 0:1 0x22000000 zImage; " \
+                               "bootz 0x22000000 - 0x21000000"
+#undef CONFIG_BOOTARGS
+#define CONFIG_BOOTARGS \
+       "console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
+#endif
+
+#ifdef CONFIG_QSPI_BOOT
+#define CONFIG_ENV_OFFSET              0xb0000
+#define CONFIG_ENV_SIZE                        0x10000
+#define CONFIG_ENV_SECT_SIZE           0x10000
+#define CONFIG_BOOTCOMMAND             "sf probe 0; "                          \
+                                       "sf read 0x21000000 0xc0000 0x20000; "  \
+                                       "sf read 0x22000000 0xe0000 0x400000; " \
+                                       "bootz 0x22000000 - 0x21000000"
+#undef CONFIG_BOOTARGS
+#define CONFIG_BOOTARGS \
+       "console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait"
+#endif
+
+/* SPL */
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_TEXT_BASE           0x200000
+#define CONFIG_SPL_MAX_SIZE            0x10000
+#define CONFIG_SPL_BSS_START_ADDR      0x20000000
+#define CONFIG_SPL_BSS_MAX_SIZE                0x80000
+#define CONFIG_SYS_SPL_MALLOC_START    0x20080000
+#define CONFIG_SYS_SPL_MALLOC_SIZE     0x80000
+
+#define CONFIG_SYS_MONITOR_LEN         (512 << 10)
+
+#ifdef CONFIG_SD_BOOT
+#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
+#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
+#endif
+
+#ifdef CONFIG_QSPI_BOOT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x10000
+#endif
+
+#endif
index b04781893d48ce02a8d10c92424e1da354649078..3ae16dfc6318734a671c3f3c93a26363e69fd077 100644 (file)
 
 /* serial console */
 #define CONFIG_ATMEL_USART
-#define CONFIG_USART_BASE              ATMEL_BASE_UART0
-#define CONFIG_USART_ID                        ATMEL_ID_UART0
+#define CONFIG_USART_BASE              0xf801c000
+#define CONFIG_USART_ID                        24
 
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_BASE          0x20000000
 #define CONFIG_SYS_SDRAM_SIZE          0x20000000
 
+#define CONFIG_SYS_TIMER_COUNTER       0xf804803c
+
 #ifdef CONFIG_SPL_BUILD
 #define CONFIG_SYS_INIT_SP_ADDR                0x210000
 #else
@@ -48,7 +50,7 @@
 #ifdef CONFIG_CMD_NAND
 #define CONFIG_NAND_ATMEL
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_SYS_NAND_BASE           ATMEL_BASE_CS3
+#define CONFIG_SYS_NAND_BASE           0x80000000
 /* our ALE is AD21 */
 #define CONFIG_SYS_NAND_MASK_ALE       (1 << 21)
 /* our CLE is AD22 */
@@ -70,7 +72,7 @@
 #define CONFIG_NET_RETRY_COUNT         20
 #define CONFIG_MACB_SEARCH_PHY
 
-#ifdef CONFIG_SYS_USE_NANDFLASH
+#ifdef CONFIG_NAND_BOOT
 #undef CONFIG_ENV_OFFSET
 #undef CONFIG_ENV_OFFSET_REDUND
 #undef CONFIG_BOOTCOMMAND
 
 #define CONFIG_SYS_MONITOR_LEN         (512 << 10)
 
-#ifdef CONFIG_SYS_USE_SERIALFLASH
+#ifdef CONFIG_SPI_BOOT
 #define CONFIG_SPL_SPI_LOAD
 #define CONFIG_SYS_SPI_U_BOOT_OFFS     0x8000
 
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_NAND_BOOT
 #define CONFIG_SPL_NAND_DRIVERS
 #define CONFIG_SPL_NAND_BASE
+#endif
 #define CONFIG_PMECC_CAP               8
 #define CONFIG_PMECC_SECTOR_SIZE       512
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x40000
 #define CONFIG_SYS_NAND_BLOCK_SIZE     0x40000
 #define CONFIG_SYS_NAND_BAD_BLOCK_POS  0x0
 #define CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER
-#endif
 
 #endif
index 9ceb91924dd362cf6a80e6aa7deb15f0522f405f..4f24a56899a982caed671cf5d656ada8a3fa4cee 100644 (file)
@@ -16,7 +16,7 @@
 
 /* SDRAM */
 #define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_BASE           0x20000000
 #define CONFIG_SYS_SDRAM_SIZE          0x20000000
 
 #ifdef CONFIG_SPL_BUILD
 #define CONFIG_SF_DEFAULT_SPEED                30000000
 #endif
 
-/* I2C */
-#define AT24MAC_ADDR           0x5c
-#define AT24MAC_REG            0x9a
-
 /* LCD */
 
 #ifdef CONFIG_LCD
@@ -51,7 +47,7 @@
 #define CONFIG_ATMEL_LCD_RGB565
 #endif
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 
 /* bootstrap + u-boot + env in sd card */
 #undef CONFIG_BOOTCOMMAND
@@ -65,7 +61,7 @@
 /* SPL */
 #define CONFIG_SPL_FRAMEWORK
 #define CONFIG_SPL_TEXT_BASE           0x200000
-#define CONFIG_SPL_MAX_SIZE            0x18000
+#define CONFIG_SPL_MAX_SIZE            0x10000
 #define CONFIG_SPL_BSS_START_ADDR      0x20000000
 #define CONFIG_SPL_BSS_MAX_SIZE                0x80000
 #define CONFIG_SYS_SPL_MALLOC_START    0x20080000
 
 #define CONFIG_SYS_MONITOR_LEN         (512 << 10)
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
 
-#elif CONFIG_SYS_USE_SERIALFLASH
+#elif CONFIG_SPI_BOOT
 #define CONFIG_SPL_SPI_LOAD
 #define CONFIG_SYS_SPI_U_BOOT_OFFS     0x10000
 
index 05600c81ff21f5bde286f0bdbd003b80b0591ee8..a6697cdb6332462a909c4d571feac7b9f1abd0fa 100644 (file)
  * This needs to be defined for the OHCI code to work but it is defined as
  * ATMEL_ID_UHPHS in the CPU specific header files.
  */
-#define ATMEL_ID_UHP                   ATMEL_ID_UHPHS
+#define ATMEL_ID_UHP                   32
 
 /*
  * Specify the clock enable bit in the PMC_SCER register.
  */
-#define ATMEL_PMC_UHP                  AT91SAM926x_PMC_UHP
+#define ATMEL_PMC_UHP                  (1 <<  6)
 
 /* SDRAM */
 #define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_BASE           0x20000000
 #define CONFIG_SYS_SDRAM_SIZE          0x10000000
 
 #ifdef CONFIG_SPL_BUILD
@@ -39,7 +39,7 @@
 #ifdef CONFIG_CMD_NAND
 #define CONFIG_NAND_ATMEL
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_SYS_NAND_BASE           ATMEL_BASE_CS3
+#define CONFIG_SYS_NAND_BASE           0x60000000
 /* our ALE is AD21 */
 #define CONFIG_SYS_NAND_MASK_ALE       (1 << 21)
 /* our CLE is AD22 */
 #define CONFIG_USB_ATMEL_CLK_SEL_UPLL
 #define CONFIG_USB_OHCI_NEW
 #define CONFIG_SYS_USB_OHCI_CPU_INIT
-#define CONFIG_SYS_USB_OHCI_REGS_BASE          ATMEL_BASE_OHCI
+#define CONFIG_SYS_USB_OHCI_REGS_BASE          0x00600000
 #define CONFIG_SYS_USB_OHCI_SLOT_NAME          "SAMA5D3 Xplained"
 #define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS     2
 #endif
 
 #define CONFIG_SYS_LOAD_ADDR                   0x22000000 /* load address */
 
-#if CONFIG_SYS_USE_NANDFLASH
-/* override the bootcmd, bootargs and other configuration for nandflash env */
-#elif CONFIG_SYS_USE_MMC
-/* override the bootcmd, bootargs and other configuration for sd/mmc env */
-#endif
-
 /* SPL */
 #define CONFIG_SPL_FRAMEWORK
 #define CONFIG_SPL_TEXT_BASE           0x300000
 
 #define CONFIG_SYS_MONITOR_LEN         (512 << 10)
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME        "u-boot.img"
 
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_NAND_BOOT
 #define CONFIG_SPL_NAND_DRIVERS
 #define CONFIG_SPL_NAND_BASE
+#endif
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x40000
 #define CONFIG_SYS_NAND_5_ADDR_CYCLE
 #define CONFIG_SYS_NAND_PAGE_SIZE      0x800
 #define CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER
 
 #endif
-
-#endif
index 29b7e8b50a0ec0ba79bf6e7d75f7d4e611cd37d0..bd93a1e84c37aaff8eabf9e2877ac9b7eef9490c 100644 (file)
  * This needs to be defined for the OHCI code to work but it is defined as
  * ATMEL_ID_UHPHS in the CPU specific header files.
  */
-#define ATMEL_ID_UHP                   ATMEL_ID_UHPHS
+#define ATMEL_ID_UHP                   32
 
 /*
  * Specify the clock enable bit in the PMC_SCER register.
  */
-#define ATMEL_PMC_UHP                  AT91SAM926x_PMC_UHP
+#define ATMEL_PMC_UHP                  (1 <<  6)
 
 /* LCD */
 #define LCD_BPP                                LCD_COLOR16
@@ -52,7 +52,7 @@
 
 /* SDRAM */
 #define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_BASE           0x20000000
 #define CONFIG_SYS_SDRAM_SIZE          0x20000000
 
 #ifdef CONFIG_SPL_BUILD
@@ -72,7 +72,7 @@
 #ifdef CONFIG_CMD_NAND
 #define CONFIG_NAND_ATMEL
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_SYS_NAND_BASE           ATMEL_BASE_CS3
+#define CONFIG_SYS_NAND_BASE           0x60000000
 /* our ALE is AD21 */
 #define CONFIG_SYS_NAND_MASK_ALE       (1 << 21)
 /* our CLE is AD22 */
 
 #define CONFIG_SYS_LOAD_ADDR                   0x22000000 /* load address */
 
-#ifdef CONFIG_SYS_USE_SERIALFLASH
-/* override the bootcmd, bootargs and other configuration for spi flash env*/
-#elif CONFIG_SYS_USE_NANDFLASH
-/* override the bootcmd, bootargs and other configuration nandflash env */
-#elif CONFIG_SYS_USE_MMC
-/* override the bootcmd, bootargs and other configuration for sd/mmc env */
-#endif
-
 /* SPL */
 #define CONFIG_SPL_FRAMEWORK
 #define CONFIG_SPL_TEXT_BASE           0x300000
 
 #define CONFIG_SYS_MONITOR_LEN         (512 << 10)
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME        "u-boot.img"
 
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_SPI_BOOT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x10000
+
+#elif CONFIG_NAND_BOOT
 #define CONFIG_SPL_NAND_DRIVERS
 #define CONFIG_SPL_NAND_BASE
+#endif
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x40000
 #define CONFIG_SYS_NAND_5_ADDR_CYCLE
 #define CONFIG_SYS_NAND_PAGE_SIZE      0x800
 #define CONFIG_SYS_NAND_BAD_BLOCK_POS  0x0
 #define CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER
 
-#elif CONFIG_SYS_USE_SERIALFLASH
-#define CONFIG_SPL_SPI_LOAD
-#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x10000
-
-#endif
-
 #endif
index c8462b0b6485e7ce9b6bfb4976e49b133488cd50..5dc5e7dd0c575415ff9e7bc835a8d6a39fc77dd2 100644 (file)
 
 #include "at91-sama5_common.h"
 
+#define CONFIG_MISC_INIT_R
+
 /* SDRAM */
 #define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_BASE           0x20000000
 #define CONFIG_SYS_SDRAM_SIZE          0x20000000
 
 #ifdef CONFIG_SPL_BUILD
@@ -34,7 +36,7 @@
 #ifdef CONFIG_CMD_NAND
 #define CONFIG_NAND_ATMEL
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_SYS_NAND_BASE           ATMEL_BASE_CS3
+#define CONFIG_SYS_NAND_BASE           0x80000000
 /* our ALE is AD21 */
 #define CONFIG_SYS_NAND_MASK_ALE       (1 << 21)
 /* our CLE is AD22 */
 #define CONFIG_ATMEL_LCD_RGB565
 #endif
 
-#ifdef CONFIG_SYS_USE_SERIALFLASH
-/* override the bootcmd, bootargs and other configuration for spi flash env */
-#elif CONFIG_SYS_USE_NANDFLASH
-/* override the bootcmd, bootargs and other configuration for nandflash env */
-#elif CONFIG_SYS_USE_MMC
-/* override the bootcmd, bootargs and other configuration for sd/mmc env */
-#endif
-
 /* SPL */
 #define CONFIG_SPL_FRAMEWORK
 #define CONFIG_SPL_TEXT_BASE           0x200000
 
 #define CONFIG_SYS_MONITOR_LEN         (512 << 10)
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
 
 #elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_SPI_BOOT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x10000
+
+#elif CONFIG_NAND_BOOT
 #define CONFIG_SPL_NAND_DRIVERS
 #define CONFIG_SPL_NAND_BASE
+#endif
 #define CONFIG_PMECC_CAP               8
 #define CONFIG_PMECC_SECTOR_SIZE       512
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x40000
@@ -93,9 +93,4 @@
 #define CONFIG_SYS_NAND_BAD_BLOCK_POS  0x0
 #define CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER
 
-#elif CONFIG_SYS_USE_SERIALFLASH
-#define CONFIG_SPL_SPI_LOAD
-#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x10000
-
-#endif
 #endif
index fc16ed0420cadd2ffffea9fc7aba2d5b5f7bcdbb..94e8e893c0619782f8700a74f59dffc3b9ebcf3a 100644 (file)
@@ -14,7 +14,7 @@
 
 /* SDRAM */
 #define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_BASE           0x20000000
 #define CONFIG_SYS_SDRAM_SIZE          0x20000000
 
 #ifdef CONFIG_SPL_BUILD
@@ -34,7 +34,7 @@
 #ifdef CONFIG_CMD_NAND
 #define CONFIG_NAND_ATMEL
 #define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_SYS_NAND_BASE           ATMEL_BASE_CS3
+#define CONFIG_SYS_NAND_BASE           0x80000000
 /* our ALE is AD21 */
 #define CONFIG_SYS_NAND_MASK_ALE       (1 << 21)
 /* our CLE is AD22 */
 #define CONFIG_ATMEL_HLCD
 #define CONFIG_ATMEL_LCD_RGB565
 
-#ifdef CONFIG_SYS_USE_SERIALFLASH
-/* override the bootcmd, bootargs and other configuration for spi flash env*/
-#elif CONFIG_SYS_USE_NANDFLASH
-/* override the bootcmd, bootargs and other configuration for nandflash env*/
-#elif CONFIG_SYS_USE_MMC
-/* override the bootcmd, bootargs and other configuration for sd/mmc env */
-#endif
-
 /* SPL */
 #define CONFIG_SPL_FRAMEWORK
 #define CONFIG_SPL_TEXT_BASE           0x200000
 
 #define CONFIG_SYS_MONITOR_LEN         (512 << 10)
 
-#ifdef CONFIG_SYS_USE_MMC
+#ifdef CONFIG_SD_BOOT
 #define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
 #define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
 
-#elif CONFIG_SYS_USE_NANDFLASH
+#elif CONFIG_SPI_BOOT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x10000
+
+#elif CONFIG_NAND_BOOT
 #define CONFIG_SPL_NAND_DRIVERS
 #define CONFIG_SPL_NAND_BASE
+#endif
 #define CONFIG_PMECC_CAP               8
 #define CONFIG_PMECC_SECTOR_SIZE       512
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x40000
@@ -91,9 +88,4 @@
 #define CONFIG_SYS_NAND_BAD_BLOCK_POS  0x0
 #define CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER
 
-#elif CONFIG_SYS_USE_SERIALFLASH
-#define CONFIG_SPL_SPI_LOAD
-#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x10000
-
-#endif
 #endif
index 5997902961c5f2cb1e891c6c2018cb5fcb3b4895..580994280b113ed388f72aa934eff5a77b591841 100644 (file)
@@ -39,7 +39,6 @@
  * DRAM
  */
 
-#define CONFIG_SDRC
 #define CONFIG_NR_DRAM_BANKS   2
 #define PHYS_SDRAM_1           OMAP34XX_SDRC_CS0
 #define PHYS_SDRAM_2           OMAP34XX_SDRC_CS1
index 05399092fec4e8939a3f32db489e9cda2bdb7978..ba8483f0bf9ae6a710bdc6cb0001a851941d3ba5 100644 (file)
@@ -16,8 +16,6 @@
 
 #define CONFIG_SYS_TEXT_BASE 0x80008000
 
-#define CONFIG_EMIF4   /* The chip has EMIF4 controller */
-
 #include <asm/arch/cpu.h>              /* get chip and board defs */
 #include <asm/arch/omap.h>
 
 
 /* **** PISMO SUPPORT *** */
 #define CONFIG_NAND_OMAP_GPMC
-#define SMNAND_ENV_OFFSET              0x180000 /* environment starts here */
 
 /* Redundant Environment */
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)     /* 128 KiB */
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
-#define CONFIG_ENV_ADDR                        SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x180000
+#define CONFIG_ENV_ADDR                        0x180000
 #define CONFIG_ENV_OFFSET_REDUND       (CONFIG_ENV_OFFSET + \
                                                2 * CONFIG_SYS_ENV_SECT_SIZE)
 #define CONFIG_ENV_SIZE_REDUND         CONFIG_ENV_SIZE
index 11b909b7dd88b3d2bd13caf00b67a25a29451931..b4311d94cc2a90c41dd281ec77e7234f6e004580 100644 (file)
@@ -17,8 +17,6 @@
  * High Level Configuration Options
  */
 
-#define CONFIG_SDRC                    /* Has an SDRC controller */
-
 #include <asm/arch/cpu.h>              /* get chip and board defs */
 #include <asm/arch/omap.h>
 
 #define CONFIG_SYS_ONENAND_BASE                ONENAND_MAP
 
 #define ONENAND_ENV_OFFSET             0x260000 /* environment starts here */
-#define SMNAND_ENV_OFFSET              0x260000 /* environment starts here */
 
 #define CONFIG_SYS_ENV_SECT_SIZE       (128 << 10)
-#define CONFIG_ENV_OFFSET              SMNAND_ENV_OFFSET
+#define CONFIG_ENV_OFFSET              0x260000
 #define CONFIG_ENV_ADDR                        CONFIG_ENV_OFFSET
 
 #define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
index f98bf9562b80986c301667120f6ad673fde9763a..849d4a6aecccce3ecae5d41e185039fced60bce1 100644 (file)
@@ -64,7 +64,6 @@
 /* Framebuffer */
 #ifdef CONFIG_VIDEO
 #define CONFIG_VIDEO_IPUV3
-#define CONFIG_IPUV3_CLK               260000000
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
index 938136c94629fa6fc34bfc8709f7d489b0d6241b..531bffca8c3974131286973895f079b8b80a2e20 100644 (file)
@@ -21,9 +21,6 @@
 #include <asm/arch/cpu.h>
 #include <asm/arch/omap.h>
 
-/* The chip has SDRC controller */
-#define CONFIG_SDRC
-
 /* Clock Defines */
 #define V_OSCK                 26000000        /* Clock output from T2 */
 #define V_SCLK                 (V_OSCK >> 1)
index 46bb6f445ee94f0fc1541c7727c18eff657590ef..33071ef507b9d99715098dc1348b89f5b4be9cc3 100644 (file)
@@ -25,8 +25,6 @@
  */
 #define CONFIG_SYS_TEXT_BASE           0x80100000
 
-#define CONFIG_SDRC                    /* The chip has SDRC controller */
-
 #include <asm/arch/cpu.h>              /* get chip and board defs */
 #include <asm/arch/omap.h>
 
index 490dc446d6d27e897b77d8bb4bce6533a6abe125..aaed8150b53e814d3f7a766d350c05447a61fbcc 100644 (file)
 
 /* serial console */
 #define CONFIG_ATMEL_USART
-#define CONFIG_USART_BASE              ATMEL_BASE_USART3
-#define        CONFIG_USART_ID                 ATMEL_ID_USART3
+#define CONFIG_USART_BASE              0xfc00c000
+#define CONFIG_USART_ID                        30
+
+/* Timer */
+#define CONFIG_SYS_TIMER_COUNTER       0xfc06863c
 
 /* SDRAM */
 #define CONFIG_NR_DRAM_BANKS           1
-#define CONFIG_SYS_SDRAM_BASE           ATMEL_BASE_DDRCS
+#define CONFIG_SYS_SDRAM_BASE           0x20000000
 #define CONFIG_SYS_SDRAM_SIZE          0x4000000
 
 #define CONFIG_SYS_INIT_SP_ADDR \
@@ -55,7 +58,7 @@
 #ifdef CONFIG_CMD_MMC
 #define CONFIG_SUPPORT_EMMC_BOOT
 #define CONFIG_GENERIC_ATMEL_MCI
-#define ATMEL_BASE_MMCI                        ATMEL_BASE_MCI1
+#define ATMEL_BASE_MMCI                        0xfc000000
 #define CONFIG_SYS_MMC_CLK_OD          500000
 
 /* For generating MMC partitions */
@@ -75,7 +78,7 @@
 #define CONFIG_NET_RETRY_COUNT         20
 #define CONFIG_MACB_SEARCH_PHY
 
-#ifdef CONFIG_SYS_USE_SERIALFLASH
+#ifdef CONFIG_SPI_BOOT
 /* bootstrap + u-boot + env + linux in serial flash */
 #define CONFIG_ENV_SPI_BUS     CONFIG_SF_DEFAULT_BUS
 #define CONFIG_ENV_SPI_CS      CONFIG_SF_DEFAULT_CS
diff --git a/include/configs/vyasa-rk3288.h b/include/configs/vyasa-rk3288.h
new file mode 100644 (file)
index 0000000..9d6c80f
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2017 Amarula Solutions
+ *
+ * Configuration settings for Amarula Vyasa RK3288.
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define ROCKCHIP_DEVICE_SETTINGS
+#include <configs/rk3288_common.h>
+
+#undef BOOT_TARGET_DEVICES
+
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 1) \
+
+#define CONFIG_SYS_MMC_ENV_DEV 1
+#undef CONFIG_CMD_USB_MASS_STORAGE
+
+#endif
index d9237d7b81b03138cc500ca1424c476c54d9de61..3ba4c29f6745cf74d70d97f8bd49d1b3f816e406 100644 (file)
@@ -71,7 +71,6 @@
 #define CONFIG_BMP_16BPP
 #define CONFIG_VIDEO_LOGO
 #define CONFIG_VIDEO_BMP_LOGO
-#define CONFIG_IPUV3_CLK 260000000
 #define CONFIG_IMX_HDMI
 #define CONFIG_IMX_VIDEO_SKIP
 #endif
index de2769ed537695416d651660fc568d2d59e60cec..79374b8f91aa8030cb5f1d3ad595290a14c5f818 100644 (file)
@@ -628,4 +628,28 @@ int ofnode_read_resource(ofnode node, uint index, struct resource *res);
 int ofnode_read_resource_byname(ofnode node, const char *name,
                                struct resource *res);
 
+/**
+ * ofnode_for_each_subnode() - iterate over all subnodes of a parent
+ *
+ * @node:       child node (ofnode, lvalue)
+ * @parent:     parent node (ofnode)
+ *
+ * This is a wrapper around a for loop and is used like so:
+ *
+ *     ofnode node;
+ *
+ *     ofnode_for_each_subnode(node, parent) {
+ *             Use node
+ *             ...
+ *     }
+ *
+ * Note that this is implemented as a macro and @node is used as
+ * iterator in the loop. The parent variable can be a constant or even a
+ * literal.
+ */
+#define ofnode_for_each_subnode(node, parent) \
+       for (node = ofnode_first_subnode(parent); \
+            ofnode_valid(node); \
+            node = ofnode_next_subnode(node))
+
 #endif
index 49d69c990f6eb07f529c12f0af7b1b71b1a3cd1d..e7f71256a8c2c91ccfdf03df159dba96bed6d265 100644 (file)
@@ -112,6 +112,16 @@ fdt_addr_t dev_read_addr_index(struct udevice *dev, int index);
  */
 fdt_addr_t dev_read_addr(struct udevice *dev);
 
+/**
+ * dev_read_addr_ptr() - Get the reg property of a device
+ *                       as a pointer
+ *
+ * @dev: Device to read from
+ *
+ * @return pointer or NULL if not found
+ */
+void *dev_read_addr_ptr(struct udevice *dev);
+
 /**
  * dev_read_addr_size() - get address and size from a device property
  *
@@ -417,6 +427,11 @@ static inline fdt_addr_t dev_read_addr(struct udevice *dev)
        return devfdt_get_addr(dev);
 }
 
+static inline void *dev_read_addr_ptr(struct udevice *dev)
+{
+       return devfdt_get_addr_ptr(dev);
+}
+
 static inline fdt_addr_t dev_read_addr_size(struct udevice *dev,
                                            const char *propname,
                                            fdt_size_t *sizep)
index 50a6011644facad5daa7e307bbe90008dd50c410..b075eef2c1a45ce5cca12b690eb11e2a32e9702c 100644 (file)
@@ -55,6 +55,20 @@ int dm_scan_platdata(bool pre_reloc_only);
  */
 int dm_scan_fdt(const void *blob, bool pre_reloc_only);
 
+/**
+ * dm_extended_scan_fdt() - Scan the device tree and bind drivers
+ *
+ * This calls dm_scna_dft() which scans the device tree and creates a driver
+ * for each node. the top-level subnodes are examined and also all sub-nodes
+ * of "clocks" node.
+ *
+ * @blob: Pointer to device tree blob
+ * @pre_reloc_only: If true, bind only drivers with the DM_FLAG_PRE_RELOC
+ * flag. If false bind all drivers.
+ * @return 0 if OK, -ve on error
+ */
+int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only);
+
 /**
  * dm_scan_other() - Scan for other devices
  *
index 5c75e80915fcdc5b4411984cd57b8308eb388bfb..18ec5df5a5812a9f037247b6c95de1d15fba2546 100644 (file)
@@ -73,5 +73,8 @@
  */
 #define DRA7XX_CORE_IOPAD(pa, val)     (((pa) & 0xffff) - 0x3400) (val)
 
+/* DRA7 IODELAY configuration parameters */
+#define A_DELAY_PS(val)                        ((val) & 0xffff)
+#define G_DELAY_PS(val)                        ((val) & 0xffff)
 #endif
 
index 0732c442ff8d9e600c39979327d911b2dc0c6300..c0f56951b530843e2fda58e091bc74da57eafaa0 100644 (file)
@@ -9,11 +9,21 @@
 
 /* These structures may only be used in SPL */
 #if CONFIG_IS_ENABLED(OF_PLATDATA)
-struct phandle_2_cell {
+struct phandle_0_arg {
        const void *node;
-       int id;
+       int arg[0];
 };
-#include <generated/dt-structs.h>
+
+struct phandle_1_arg {
+       const void *node;
+       int arg[1];
+};
+
+struct phandle_2_arg {
+       const void *node;
+       int arg[2];
+};
+#include <generated/dt-structs-gen.h>
 #endif
 
 #endif
index a05f5ba9bd4d77303bd5b49c49170e838ca40faf..5b1b97bafef2433dfd58e6cddf891f46e40f1946 100644 (file)
                        "setenv fdtfile dra72-evm.dtb; fi;" \
                "if test $board_name = dra71x; then " \
                        "setenv fdtfile dra71-evm.dtb; fi;" \
+               "if test $board_name = dra76x; then " \
+                       "setenv fdtfile dra76-evm.dtb; fi;" \
                "if test $board_name = beagle_x15; then " \
                        "setenv fdtfile am57xx-beagle-x15.dtb; fi;" \
                "if test $board_name = beagle_x15_revb1; then " \
                        "setenv fdtfile am57xx-beagle-x15-revb1.dtb; fi;" \
+               "if test $board_name = beagle_x15_revc; then " \
+                       "setenv fdtfile am57xx-beagle-x15-revc.dtb; fi;" \
                "if test $board_name = am572x_idk; then " \
                        "setenv fdtfile am572x-idk.dtb; fi;" \
                "if test $board_name = am57xx_evm; then " \
index 71879f01cac159ece96d87418069869099375fc5..bdeda95e6debebad99523451efdcc14f584d7e44 100644 (file)
@@ -11,6 +11,7 @@
 #define _FAT_H_
 
 #include <asm/byteorder.h>
+#include <fs.h>
 
 #define CONFIG_SUPPORT_VFAT
 /* Maximum Long File Name length supported here is 128 UTF-16 code units */
  */
 #define LAST_LONG_ENTRY_MASK   0x40
 
-/* Flags telling whether we should read a file or list a directory */
-#define LS_NO          0
-#define LS_YES         1
-#define LS_DIR         1
-#define LS_ROOT                2
-
 #define ISDIRDELIM(c)  ((c) == '/' || (c) == '\\')
 
 #define FSTYPE_NONE    (-1)
@@ -133,10 +128,14 @@ typedef struct volume_info
        /* Boot sign comes last, 2 bytes */
 } volume_info;
 
+/* see dir_entry::lcase: */
+#define CASE_LOWER_BASE        8       /* base (name) is lower case */
+#define CASE_LOWER_EXT 16      /* extension is lower case */
+
 typedef struct dir_entry {
        char    name[8],ext[3]; /* Name and extension */
        __u8    attr;           /* Attribute bits */
-       __u8    lcase;          /* Case for base and extension */
+       __u8    lcase;          /* Case for name and ext (CASE_LOWER_x) */
        __u8    ctime_ms;       /* Creation time, milliseconds */
        __u16   ctime;          /* Creation time */
        __u16   cdate;          /* Creation date */
@@ -174,35 +173,26 @@ typedef struct {
        __u16   clust_size;     /* Size of clusters in sectors */
        int     data_begin;     /* The sector of the first cluster, can be negative */
        int     fatbufnum;      /* Used by get_fatent, init to -1 */
+       int     rootdir_size;   /* Size of root dir for non-FAT32 */
+       __u32   root_cluster;   /* First cluster of root dir for FAT32 */
 } fsdata;
 
-typedef int    (file_detectfs_func)(void);
-typedef int    (file_ls_func)(const char *dir);
-typedef int    (file_read_func)(const char *filename, void *buffer,
-                                int maxsize);
-
-struct filesystem {
-       file_detectfs_func      *detect;
-       file_ls_func            *ls;
-       file_read_func          *read;
-       const char              name[12];
-};
-
-/* FAT tables */
-file_detectfs_func     file_fat_detectfs;
-file_ls_func           file_fat_ls;
-file_read_func         file_fat_read;
-
-/* Currently this doesn't check if the dir exists or is valid... */
-int file_cd(const char *path);
+static inline u32 clust_to_sect(fsdata *fsdata, u32 clust)
+{
+       return fsdata->data_begin + clust * fsdata->clust_size;
+}
+
+static inline u32 sect_to_clust(fsdata *fsdata, u32 sect)
+{
+       return (sect - fsdata->data_begin) / fsdata->clust_size;
+}
+
 int file_fat_detectfs(void);
-int file_fat_ls(const char *dir);
 int fat_exists(const char *filename);
 int fat_size(const char *filename, loff_t *size);
 int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
                     loff_t maxsize, loff_t *actread);
 int file_fat_read(const char *filename, void *buffer, int maxsize);
-const char *file_getfsname(int idx);
 int fat_set_blk_dev(struct blk_desc *rbdd, disk_partition_t *info);
 int fat_register_device(struct blk_desc *dev_desc, int part_no);
 
@@ -210,5 +200,8 @@ int file_fat_write(const char *filename, void *buf, loff_t offset, loff_t len,
                   loff_t *actwrite);
 int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
                  loff_t *actread);
+int fat_opendir(const char *filename, struct fs_dir_stream **dirsp);
+int fat_readdir(struct fs_dir_stream *dirs, struct fs_dirent **dentp);
+void fat_closedir(struct fs_dir_stream *dirs);
 void fat_close(void);
 #endif /* _FAT_H_ */
index 5ef78cce6e0f2e27fa6f9b1d4b9ed3b45ca7758b..2bca4d7889180936b92e423c16a91740338c3090 100644 (file)
@@ -264,6 +264,8 @@ int arch_fixup_memory_node(void *blob);
 int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width,
                            u32 height, u32 stride, const char *format);
 
+int fdt_overlay_apply_verbose(void *fdt, void *fdto);
+
 #endif /* ifdef CONFIG_OF_LIBFDT */
 
 #ifdef USE_HOSTCC
index 4a0947c6266a8a92cf423895a7490bbed8133767..1ba02be8e1b1f4bc200ac7d18008ee8d82ce1962 100644 (file)
@@ -27,10 +27,12 @@ typedef phys_size_t fdt_size_t;
 #define FDT_ADDR_T_NONE (-1ULL)
 #define fdt_addr_to_cpu(reg) be64_to_cpu(reg)
 #define fdt_size_to_cpu(reg) be64_to_cpu(reg)
+typedef fdt64_t fdt_val_t;
 #else
 #define FDT_ADDR_T_NONE (-1U)
 #define fdt_addr_to_cpu(reg) be32_to_cpu(reg)
 #define fdt_size_to_cpu(reg) be32_to_cpu(reg)
+typedef fdt32_t fdt_val_t;
 #endif
 
 /* Information obtained about memory from the FDT */
index 2f2aca8378be15a92b8082e0872a9b3a3829a4f9..0869ad6e80cf117799686cf1790ca61aa01f3826 100644 (file)
  */
 int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype);
 
+/*
+ * fs_set_blk_dev_with_part - Set current block device + partition
+ *
+ * Similar to fs_set_blk_dev(), but useful for cases where you already
+ * know the blk_desc and part number.
+ *
+ * Returns 0 on success.
+ * Returns non-zero if invalid partition or error accessing the disk.
+ */
+int fs_set_blk_dev_with_part(struct blk_desc *desc, int part);
+
 /*
  * Print the list of files on the partition previously set by fs_set_blk_dev(),
  * in directory "dirname".
@@ -78,6 +89,62 @@ int fs_read(const char *filename, ulong addr, loff_t offset, loff_t len,
 int fs_write(const char *filename, ulong addr, loff_t offset, loff_t len,
             loff_t *actwrite);
 
+/*
+ * Directory entry types, matches the subset of DT_x in posix readdir()
+ * which apply to u-boot.
+ */
+#define FS_DT_DIR  4         /* directory */
+#define FS_DT_REG  8         /* regular file */
+#define FS_DT_LNK  10        /* symbolic link */
+
+/*
+ * A directory entry, returned by fs_readdir().  Returns information
+ * about the file/directory at the current directory entry position.
+ */
+struct fs_dirent {
+       unsigned type;       /* one of FS_DT_x (not a mask) */
+       loff_t size;         /* size in bytes */
+       char name[256];
+};
+
+/* Note: fs_dir_stream should be treated as opaque to the user of fs layer */
+struct fs_dir_stream {
+       /* private to fs. layer: */
+       struct blk_desc *desc;
+       int part;
+};
+
+/*
+ * fs_opendir - Open a directory
+ *
+ * @filename: the path to directory to open
+ * @return a pointer to the directory stream or NULL on error and errno
+ *    set appropriately
+ */
+struct fs_dir_stream *fs_opendir(const char *filename);
+
+/*
+ * fs_readdir - Read the next directory entry in the directory stream.
+ *
+ * Works in an analogous way to posix readdir().  The previously returned
+ * directory entry is no longer valid after calling fs_readdir() again.
+ * After fs_closedir() is called, the returned directory entry is no
+ * longer valid.
+ *
+ * @dirs: the directory stream
+ * @return the next directory entry (only valid until next fs_readdir() or
+ *    fs_closedir() call, do not attempt to free()) or NULL if the end of
+ *    the directory is reached.
+ */
+struct fs_dirent *fs_readdir(struct fs_dir_stream *dirs);
+
+/*
+ * fs_closedir - close a directory stream
+ *
+ * @dirs: the directory stream
+ */
+void fs_closedir(struct fs_dir_stream *dirs);
+
 /*
  * Common implementation for various filesystem commands, optionally limited
  * to a specific filesystem type via the fstype parameter.
index 8ae0fc071e11bc4aa90062875c7457e8ef6e8384..0ca49564a93fe7168dc1e29f64b81de5d00907a4 100644 (file)
@@ -69,4 +69,6 @@ void wriop_dpmac_disable(int);
 void wriop_dpmac_enable(int);
 phy_interface_t wriop_dpmac_enet_if(int, int);
 void wriop_init_dpmac_qsgmii(int, int);
+void wriop_init_rgmii(void);
+void wriop_init_dpmac_enet_if(int , phy_interface_t);
 #endif /* __LDPAA_WRIOP_H */
index b1c4fe7969a951a43fc89da932fb3beee65d1ca4..4f5a19cdc1abc835dbb88a61cb5a6aa8ce03354b 100644 (file)
@@ -133,4 +133,55 @@ struct ccsr_ddr {
        u8      res_e5c[164];
        u32     debug[64];              /* debug_1 to debug_64 */
 };
+
+#ifdef CONFIG_SYS_FSL_HAS_CCI400
+#define CCI400_CTRLORD_TERM_BARRIER    0x00000008
+#define CCI400_CTRLORD_EN_BARRIER      0
+#define CCI400_SHAORD_NON_SHAREABLE    0x00000002
+#define CCI400_DVM_MESSAGE_REQ_EN      0x00000002
+#define CCI400_SNOOP_REQ_EN            0x00000001
+
+/* CCI-400 registers */
+struct ccsr_cci400 {
+       u32 ctrl_ord;                   /* Control Override */
+       u32 spec_ctrl;                  /* Speculation Control */
+       u32 secure_access;              /* Secure Access */
+       u32 status;                     /* Status */
+       u32 impr_err;                   /* Imprecise Error */
+       u8 res_14[0x100 - 0x14];
+       u32 pmcr;                       /* Performance Monitor Control */
+       u8 res_104[0xfd0 - 0x104];
+       u32 pid[8];                     /* Peripheral ID */
+       u32 cid[4];                     /* Component ID */
+       struct {
+               u32 snoop_ctrl;         /* Snoop Control */
+               u32 sha_ord;            /* Shareable Override */
+               u8 res_1008[0x1100 - 0x1008];
+               u32 rc_qos_ord;         /* read channel QoS Value Override */
+               u32 wc_qos_ord;         /* read channel QoS Value Override */
+               u8 res_1108[0x110c - 0x1108];
+               u32 qos_ctrl;           /* QoS Control */
+               u32 max_ot;             /* Max OT */
+               u8 res_1114[0x1130 - 0x1114];
+               u32 target_lat;         /* Target Latency */
+               u32 latency_regu;       /* Latency Regulation */
+               u32 qos_range;          /* QoS Range */
+               u8 res_113c[0x2000 - 0x113c];
+       } slave[5];                     /* Slave Interface */
+       u8 res_6000[0x9004 - 0x6000];
+       u32 cycle_counter;              /* Cycle counter */
+       u32 count_ctrl;                 /* Count Control */
+       u32 overflow_status;            /* Overflow Flag Status */
+       u8 res_9010[0xa000 - 0x9010];
+       struct {
+               u32 event_select;       /* Event Select */
+               u32 event_count;        /* Event Count */
+               u32 counter_ctrl;       /* Counter Control */
+               u32 overflow_status;    /* Overflow Flag Status */
+               u8 res_a010[0xb000 - 0xa010];
+       } pcounter[4];                  /* Performance Counter */
+       u8 res_e004[0x10000 - 0xe004];
+};
+#endif
+
 #endif /* __FSL_IMMAP_H */
index 1f4bfda2f3f1a314e3a176ae66a88eb34715250a..af98ed9f25c860111f8e42f2c5813cbdd54e255d 100644 (file)
@@ -269,6 +269,7 @@ enum {
        IH_TYPE_VYBRIDIMAGE,    /* VYBRID .vyb Image */
        IH_TYPE_TEE,            /* Trusted Execution Environment OS Image */
        IH_TYPE_FIRMWARE_IVT,           /* Firmware Image with HABv4 IVT */
+       IH_TYPE_PMMC,            /* TI Power Management Micro-Controller Firmware */
 
        IH_TYPE_COUNT,                  /* Number of image types */
 };
@@ -592,6 +593,31 @@ int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
 int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch,
                       ulong *setup_start, ulong *setup_len);
 
+/**
+ * boot_get_fdt_fit() - load a DTB from a FIT file (applying overlays)
+ *
+ * This deals with all aspects of loading an DTB from a FIT.
+ * The correct base image based on configuration will be selected, and
+ * then any overlays specified will be applied (as present in fit_uname_configp).
+ *
+ * @param images       Boot images structure
+ * @param addr         Address of FIT in memory
+ * @param fit_unamep   On entry this is the requested image name
+ *                     (e.g. "kernel@1") or NULL to use the default. On exit
+ *                     points to the selected image name
+ * @param fit_uname_configp    On entry this is the requested configuration
+ *                     name (e.g. "conf@1") or NULL to use the default. On
+ *                     exit points to the selected configuration name.
+ * @param arch         Expected architecture (IH_ARCH_...)
+ * @param datap                Returns address of loaded image
+ * @param lenp         Returns length of loaded image
+ *
+ * @return node offset of base image, or -ve error code on error
+ */
+int boot_get_fdt_fit(bootm_headers_t *images, ulong addr,
+                  const char **fit_unamep, const char **fit_uname_configp,
+                  int arch, ulong *datap, ulong *lenp);
+
 /**
  * fit_image_load() - load an image from a FIT
  *
diff --git a/include/linux/dma-direction.h b/include/linux/dma-direction.h
new file mode 100644 (file)
index 0000000..95b6a82
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _LINUX_DMA_DIRECTION_H
+#define _LINUX_DMA_DIRECTION_H
+/*
+ * These definitions mirror those in pci.h, so they can be used
+ * interchangeably with their PCI_ counterparts.
+ */
+enum dma_data_direction {
+       DMA_BIDIRECTIONAL = 0,
+       DMA_TO_DEVICE = 1,
+       DMA_FROM_DEVICE = 2,
+       DMA_NONE = 3,
+};
+#endif
index a104b7e69f7c871d267f7a541683b831aed3a071..bf1ddbbaa671677fb104eea282b1e7edc9d2330b 100644 (file)
@@ -9,6 +9,50 @@
 #include <linux/types.h>
 #include <asm/io.h>
 
+static inline u8 ioread8(const volatile void __iomem *addr)
+{
+       return readb(addr);
+}
+
+static inline u16 ioread16(const volatile void __iomem *addr)
+{
+       return readw(addr);
+}
+
+static inline u32 ioread32(const volatile void __iomem *addr)
+{
+       return readl(addr);
+}
+
+#ifdef CONFIG_64BIT
+static inline u64 ioread64(const volatile void __iomem *addr)
+{
+       return readq(addr);
+}
+#endif /* CONFIG_64BIT */
+
+static inline void iowrite8(u8 value, volatile void __iomem *addr)
+{
+       writeb(value, addr);
+}
+
+static inline void iowrite16(u16 value, volatile void __iomem *addr)
+{
+       writew(value, addr);
+}
+
+static inline void iowrite32(u32 value, volatile void __iomem *addr)
+{
+       writel(value, addr);
+}
+
+#ifdef CONFIG_64BIT
+static inline void iowrite64(u64 value, volatile void __iomem *addr)
+{
+       writeq(value, addr);
+}
+#endif /* CONFIG_64BIT */
+
 #ifndef CONFIG_HAVE_ARCH_IOREMAP
 static inline void __iomem *ioremap(resource_size_t offset,
                                    resource_size_t size)
index d676617344cf122e34a52e30c16f9bf3e40c0f0c..d366c98d22e2e48f5ab857b54051f4945192ef6b 100644 (file)
 #define LDO2_CTRL              0x52
 #define LDO2_VOLTAGE           0x53
 
+/* LDO2 control/voltage */
+#define LDO4_CTRL              0x5e
+#define LDO4_VOLTAGE           0x5f
+
 /* LDO9 control/voltage */
 #define LDO9_CTRL              0x60
 #define LDO9_VOLTAGE           0x61
@@ -129,7 +133,7 @@ static inline int palmas_i2c_read_u8(u8 chip_no, u8 reg, u8 *val)
 }
 
 void palmas_init_settings(void);
-int palmas_mmc1_poweron_ldo(uint voltage);
+int palmas_mmc1_poweron_ldo(uint ldo_volt, uint ldo_ctrl, uint voltage);
 int lp873x_mmc1_poweron_ldo(uint voltage);
 int twl603x_mmc1_set_ldo9(u8 vsel);
 int twl603x_audio_power(u8 on);
index 0d5c99836b2594efc3385c72a404eb4d2ac2bad7..86117a7ce5d3c57e80c1ec9dc8293718b5c78c32 100644 (file)
@@ -98,6 +98,12 @@ int host_get_dev_err(int dev, struct blk_desc **blk_devp);
 
 /* disk/part.c */
 int part_get_info(struct blk_desc *dev_desc, int part, disk_partition_t *info);
+/**
+ * part_get_info_whole_disk() - get partition info for the special case of
+ * a partition occupying the entire disk.
+ */
+int part_get_info_whole_disk(struct blk_desc *dev_desc, disk_partition_t *info);
+
 void part_print(struct blk_desc *dev_desc);
 void part_init(struct blk_desc *dev_desc);
 void dev_print(struct blk_desc *dev_desc);
@@ -203,6 +209,9 @@ static inline struct blk_desc *mg_disk_get_dev(int dev) { return NULL; }
 
 static inline int part_get_info(struct blk_desc *dev_desc, int part,
                                disk_partition_t *info) { return -1; }
+static inline int part_get_info_whole_disk(struct blk_desc *dev_desc,
+                                          disk_partition_t *info)
+{ return -1; }
 static inline void part_print(struct blk_desc *dev_desc) {}
 static inline void part_init(struct blk_desc *dev_desc) {}
 static inline void dev_print(struct blk_desc *dev_desc) {}
index 1eed94e47a32d4eaa67e01a6ba22d05f5951ffe7..493a5d8eff84d0d443c680604bb495ba9835c7fd 100644 (file)
@@ -69,7 +69,7 @@ int regmap_init_mem(struct udevice *dev, struct regmap **mapp);
  * @count:     Number of pairs (e.g. 1 if the regmap has a single entry)
  * @mapp:      Returns allocated map
  */
-int regmap_init_mem_platdata(struct udevice *dev, u32 *reg, int count,
+int regmap_init_mem_platdata(struct udevice *dev, fdt_val_t *reg, int count,
                             struct regmap **mapp);
 
 /**
index 34842aa4705891928df2f1346f22803f80116caa..5d52b1cc3c3d0a7d86bd54cf32383641fe7966f7 100644 (file)
@@ -8,6 +8,8 @@
 #ifndef __SYSCON_H
 #define __SYSCON_H
 
+#include <fdtdec.h>
+
 /**
  * struct syscon_uc_info - Information stored by the syscon UCLASS_UCLASS
  *
@@ -28,9 +30,11 @@ struct syscon_ops {
  * We don't support 64-bit machines. If they are so resource-contrained that
  * they need to use OF_PLATDATA, something is horribly wrong with the
  * education of our hardware engineers.
+ *
+ * Update: 64-bit is now supported and we have an education crisis.
  */
 struct syscon_base_platdata {
-       u32 reg[2];
+       fdt_val_t reg[2];
 };
 #endif
 
index fe337acaeb0bc15d6b762ca7722aa3c66879b9ad..628ef8ddb642d3721d3dd83e010f3b2e4dcb5ba4 100644 (file)
@@ -176,6 +176,18 @@ config LZO
        bool "Enable LZO decompression support"
        help
          This enables support for LZO compression algorithm.r
+
+config SPL_GZIP
+       bool "Enable gzip decompression support for SPL build"
+       select SPL_ZLIB
+       help
+         This enables support for GZIP compression altorithm for SPL boot.
+
+config SPL_ZLIB
+       bool
+       help
+         This enables compression lib for SPL boot.
+
 endmenu
 
 config ERRNO_STR
index 2eef1eb80e65231948b5fb708e8cccf7ed45a23b..faf4538fb5fe200146809a8ae6afd0affe97a397 100644 (file)
@@ -11,14 +11,15 @@ obj-$(CONFIG_EFI) += efi/
 obj-$(CONFIG_EFI_LOADER) += efi_loader/
 obj-$(CONFIG_LZMA) += lzma/
 obj-$(CONFIG_LZO) += lzo/
-obj-$(CONFIG_ZLIB) += zlib/
 obj-$(CONFIG_BZIP2) += bzip2/
 obj-$(CONFIG_TIZEN) += tizen/
 obj-$(CONFIG_FIT) += libfdt/
 obj-$(CONFIG_OF_LIVE) += of_live.o
 obj-$(CONFIG_CMD_DHRYSTONE) += dhry/
+obj-$(CONFIG_ARCH_AT91) += at91/
 
 obj-$(CONFIG_AES) += aes.o
+obj-y += charset.o
 obj-$(CONFIG_USB_TTY) += circbuf.o
 obj-y += crc7.o
 obj-y += crc8.o
@@ -26,7 +27,6 @@ obj-y += crc16.o
 obj-$(CONFIG_ERRNO_STR) += errno_str.o
 obj-$(CONFIG_FIT) += fdtdec_common.o
 obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o
-obj-$(CONFIG_GZIP) += gunzip.o
 obj-$(CONFIG_GZIP_COMPRESSED) += gzip.o
 obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += smbios.o
 obj-y += initcall.o
@@ -49,6 +49,9 @@ obj-$(CONFIG_RSA) += rsa/
 obj-$(CONFIG_SHA1) += sha1.o
 obj-$(CONFIG_SHA256) += sha256.o
 
+obj-$(CONFIG_$(SPL_)ZLIB) += zlib/
+obj-$(CONFIG_$(SPL_)GZIP) += gunzip.o
+
 obj-$(CONFIG_$(SPL_TPL_)SAVEENV) += qsort.o
 obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += libfdt/
 ifneq ($(CONFIG_$(SPL_TPL_)BUILD)$(CONFIG_$(SPL_TPL_)OF_PLATDATA),yy)
diff --git a/lib/at91/Makefile b/lib/at91/Makefile
new file mode 100644 (file)
index 0000000..5a18875
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Copyright (C) 2017 Microchip
+# Wenyou.Yang <wenyou.yang@microchip.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-$(CONFIG_ARCH_AT91) += at91.o
diff --git a/lib/at91/at91.c b/lib/at91/at91.c
new file mode 100644 (file)
index 0000000..5dca150
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2016 Microchip
+ *              Wenyou.Yang <wenyou.yang@microchip.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <atmel_lcd.h>
+
+#include "atmel_logo_8bpp.h"
+#include "microchip_logo_8bpp.h"
+
+void atmel_logo_info(vidinfo_t *info)
+{
+       info->logo_width = ATMEL_LOGO_8BPP_WIDTH;
+       info->logo_height = ATMEL_LOGO_8BPP_HEIGHT;
+       info->logo_x_offset = ATMEL_LOGO_8BPP_X_OFFSET;
+       info->logo_y_offset = ATMEL_LOGO_8BPP_X_OFFSET;
+       info->logo_addr = (u_long)atmel_logo_8bpp;
+}
+
+void microchip_logo_info(vidinfo_t *info)
+{
+       info->logo_width = MICROCHIP_LOGO_8BPP_WIDTH;
+       info->logo_height = MICROCHIP_LOGO_8BPP_HEIGHT;
+       info->logo_x_offset = MICROCHIP_LOGO_8BPP_X_OFFSET;
+       info->logo_y_offset = MICROCHIP_LOGO_8BPP_X_OFFSET;
+       info->logo_addr = (u_long)microchip_logo_8bpp;
+}
diff --git a/lib/at91/atmel_logo_8bpp.h b/lib/at91/atmel_logo_8bpp.h
new file mode 100644 (file)
index 0000000..bd5dc7a
--- /dev/null
@@ -0,0 +1,1310 @@
+/*
+ * Copyright (C) 2017 Microchip
+ *              Wenyou.Yang <wenyou.yang@microchip.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __ATMEL_LOGO_8BPP_H__
+#define __ATMEL_LOGO_8BPP_H__
+
+#define ATMEL_LOGO_8BPP_WIDTH          240
+#define ATMEL_LOGO_8BPP_HEIGHT         60
+
+#define ATMEL_LOGO_8BPP_X_OFFSET       0
+#define ATMEL_LOGO_8BPP_Y_OFFSET       0
+
+/* Format: BMP 8BPP 240*60 */
+unsigned char atmel_logo_8bpp[] = {
+  0x42, 0x4d, 0x76, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x04,
+  0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x00,
+  0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x01,
+  0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xc1, 0x79, 0x00, 0xff, 0xc1, 0x7a,
+  0x01, 0xff, 0xc2, 0x7a, 0x02, 0xff, 0xc2, 0x7b, 0x04, 0xff, 0xc2, 0x7c,
+  0x05, 0xff, 0xc3, 0x7c, 0x06, 0xff, 0xc3, 0x7d, 0x08, 0xff, 0xc3, 0x7e,
+  0x09, 0xff, 0xc4, 0x7e, 0x0a, 0xff, 0xc4, 0x7f, 0x0c, 0xff, 0xc4, 0x80,
+  0x0d, 0xff, 0xc5, 0x81, 0x0f, 0xff, 0xc5, 0x81, 0x10, 0xff, 0xc5, 0x82,
+  0x11, 0xff, 0xc6, 0x82, 0x12, 0xff, 0xc6, 0x83, 0x14, 0xff, 0xc6, 0x84,
+  0x15, 0xff, 0xc7, 0x85, 0x17, 0xff, 0xc7, 0x85, 0x18, 0xff, 0xc7, 0x86,
+  0x1a, 0xff, 0xc8, 0x87, 0x1b, 0xff, 0xc8, 0x87, 0x1c, 0xff, 0xc8, 0x88,
+  0x1d, 0xff, 0xc9, 0x89, 0x1f, 0xff, 0xc9, 0x8a, 0x1f, 0xff, 0xc8, 0x89,
+  0x20, 0xff, 0xc9, 0x8a, 0x21, 0xff, 0xca, 0x8b, 0x23, 0xff, 0xca, 0x8c,
+  0x23, 0xff, 0xc9, 0x8c, 0x24, 0xff, 0xca, 0x8c, 0x25, 0xff, 0xca, 0x8e,
+  0x28, 0xff, 0xcb, 0x8e, 0x29, 0xff, 0xcb, 0x90, 0x2b, 0xff, 0xcc, 0x90,
+  0x2b, 0xff, 0xcb, 0x90, 0x2c, 0xff, 0xcc, 0x90, 0x2e, 0xff, 0xcc, 0x91,
+  0x30, 0xff, 0xcc, 0x92, 0x30, 0xff, 0xcd, 0x92, 0x31, 0xff, 0xcd, 0x94,
+  0x33, 0xff, 0xcd, 0x93, 0x34, 0xff, 0xcd, 0x94, 0x34, 0xff, 0xce, 0x94,
+  0x35, 0xff, 0xce, 0x96, 0x37, 0xff, 0xce, 0x96, 0x38, 0xff, 0xcf, 0x97,
+  0x39, 0xff, 0xcf, 0x98, 0x3d, 0xff, 0xd0, 0x99, 0x3d, 0xff, 0xd0, 0x9a,
+  0x40, 0xff, 0xd1, 0x9b, 0x41, 0xff, 0xd1, 0x9c, 0x42, 0xff, 0xd1, 0x9c,
+  0x44, 0xff, 0xd2, 0x9d, 0x46, 0xff, 0xd2, 0x9e, 0x47, 0xff, 0xd2, 0x9e,
+  0x48, 0xff, 0xd3, 0x9f, 0x49, 0xff, 0xd3, 0xa0, 0x4a, 0xff, 0xd3, 0xa0,
+  0x4c, 0xff, 0xd4, 0xa2, 0x4e, 0xff, 0xd4, 0xa2, 0x50, 0xff, 0xd5, 0xa4,
+  0x52, 0xff, 0xd5, 0xa4, 0x55, 0xff, 0xd5, 0xa6, 0x56, 0xff, 0xd6, 0xa6,
+  0x57, 0xff, 0xd6, 0xa6, 0x58, 0xff, 0xd7, 0xa8, 0x5a, 0xff, 0xd7, 0xa8,
+  0x5c, 0xff, 0xd7, 0xaa, 0x5d, 0xff, 0xd8, 0xaa, 0x5e, 0xff, 0xd8, 0xab,
+  0x60, 0xff, 0xd8, 0xac, 0x61, 0xff, 0xd9, 0xad, 0x63, 0xff, 0xd9, 0xad,
+  0x64, 0xff, 0xd9, 0xae, 0x65, 0xff, 0xda, 0xae, 0x66, 0xff, 0xda, 0xaf,
+  0x68, 0xff, 0xda, 0xb0, 0x69, 0xff, 0xdb, 0xb0, 0x6b, 0xff, 0xdb, 0xb1,
+  0x6c, 0xff, 0xdb, 0xb2, 0x6d, 0xff, 0xdc, 0xb3, 0x6f, 0xff, 0xdc, 0xb3,
+  0x70, 0xff, 0xdc, 0xb4, 0x71, 0xff, 0xdd, 0xb5, 0x73, 0xff, 0xdd, 0xb5,
+  0x74, 0xff, 0xdd, 0xb6, 0x75, 0xff, 0xde, 0xb7, 0x77, 0xff, 0xde, 0xb7,
+  0x78, 0xff, 0xde, 0xb8, 0x79, 0xff, 0xdf, 0xb9, 0x7a, 0xff, 0xdf, 0xb9,
+  0x7c, 0xff, 0xdf, 0xba, 0x7d, 0xff, 0xe0, 0xbb, 0x7f, 0xff, 0xdf, 0xbb,
+  0x80, 0xff, 0xe0, 0xbc, 0x81, 0xff, 0xe1, 0xbd, 0x83, 0xff, 0xe1, 0xbe,
+  0x83, 0xff, 0xe0, 0xbe, 0x84, 0xff, 0xe1, 0xbe, 0x84, 0xff, 0xe1, 0xc0,
+  0x87, 0xff, 0xe2, 0xc0, 0x87, 0xff, 0xe1, 0xc0, 0x88, 0xff, 0xe2, 0xc0,
+  0x89, 0xff, 0xe3, 0xc2, 0x8b, 0xff, 0xe2, 0xc2, 0x8c, 0xff, 0xe3, 0xc2,
+  0x8c, 0xff, 0xe3, 0xc3, 0x90, 0xff, 0xe3, 0xc4, 0x90, 0xff, 0xe4, 0xc4,
+  0x90, 0xff, 0xe4, 0xc6, 0x93, 0xff, 0xe5, 0xc6, 0x93, 0xff, 0xe4, 0xc6,
+  0x94, 0xff, 0xe5, 0xc6, 0x94, 0xff, 0xe5, 0xc8, 0x97, 0xff, 0xe5, 0xc8,
+  0x98, 0xff, 0xe6, 0xc8, 0x98, 0xff, 0xe6, 0xca, 0x9a, 0xff, 0xe6, 0xcb,
+  0x9c, 0xff, 0xe7, 0xcb, 0x9d, 0xff, 0xe7, 0xcc, 0xa0, 0xff, 0xe8, 0xcd,
+  0xa1, 0xff, 0xe8, 0xce, 0xa2, 0xff, 0xe8, 0xcf, 0xa4, 0xff, 0xe9, 0xcf,
+  0xa5, 0xff, 0xe9, 0xd0, 0xa6, 0xff, 0xe9, 0xd1, 0xa8, 0xff, 0xea, 0xd1,
+  0xa9, 0xff, 0xea, 0xd2, 0xaa, 0xff, 0xea, 0xd3, 0xac, 0xff, 0xeb, 0xd3,
+  0xae, 0xff, 0xeb, 0xd4, 0xae, 0xff, 0xeb, 0xd5, 0xb0, 0xff, 0xeb, 0xd6,
+  0xb0, 0xff, 0xec, 0xd5, 0xb1, 0xff, 0xec, 0xd6, 0xb1, 0xff, 0xec, 0xd7,
+  0xb4, 0xff, 0xec, 0xd8, 0xb5, 0xff, 0xed, 0xd8, 0xb6, 0xff, 0xed, 0xd9,
+  0xb8, 0xff, 0xed, 0xda, 0xb9, 0xff, 0xee, 0xda, 0xba, 0xff, 0xee, 0xdb,
+  0xbc, 0xff, 0xee, 0xdc, 0xbc, 0xff, 0xef, 0xdc, 0xbe, 0xff, 0xef, 0xdd,
+  0xc0, 0xff, 0xef, 0xde, 0xc0, 0xff, 0xf0, 0xde, 0xc2, 0xff, 0xf0, 0xe0,
+  0xc5, 0xff, 0xf1, 0xe0, 0xc6, 0xff, 0xf1, 0xe1, 0xc8, 0xff, 0xf1, 0xe2,
+  0xc8, 0xff, 0xf2, 0xe3, 0xca, 0xff, 0xf2, 0xe4, 0xcd, 0xff, 0xf3, 0xe5,
+  0xce, 0xff, 0xf3, 0xe6, 0xd1, 0xff, 0xf4, 0xe7, 0xd3, 0xff, 0xf4, 0xe8,
+  0xd3, 0xff, 0xf4, 0xe8, 0xd4, 0xff, 0xf5, 0xea, 0xd7, 0xff, 0xf5, 0xea,
+  0xd9, 0xff, 0xf6, 0xeb, 0xdb, 0xff, 0xf6, 0xec, 0xdb, 0xff, 0xf6, 0xec,
+  0xdd, 0xff, 0xf6, 0xee, 0xdf, 0xff, 0xf7, 0xee, 0xdf, 0xff, 0xf7, 0xee,
+  0xe1, 0xff, 0xf8, 0xf0, 0xe3, 0xff, 0xf8, 0xf0, 0xe4, 0xff, 0xf8, 0xf2,
+  0xe6, 0xff, 0xf9, 0xf2, 0xe6, 0xff, 0xf9, 0xf2, 0xe8, 0xff, 0xf9, 0xf4,
+  0xea, 0xff, 0xfa, 0xf4, 0xeb, 0xff, 0xfa, 0xf4, 0xec, 0xff, 0xfa, 0xf6,
+  0xee, 0xff, 0xfb, 0xf6, 0xef, 0xff, 0xfb, 0xf7, 0xf0, 0xff, 0xfb, 0xf8,
+  0xf2, 0xff, 0xfc, 0xf9, 0xf4, 0xff, 0xfc, 0xfa, 0xf6, 0xff, 0xfc, 0xfa,
+  0xf8, 0xff, 0xfd, 0xfb, 0xf8, 0xff, 0xfd, 0xfc, 0xfa, 0xff, 0xfd, 0xfd,
+  0xfc, 0xff, 0xfe, 0xfd, 0xfc, 0xff, 0xfe, 0xfe, 0xfd, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
+  0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa3,
+  0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa4, 0xb0, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb6, 0xa6, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xab, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb3,
+  0xa8, 0x9e, 0x9d, 0x9d, 0x9d, 0x9d, 0x9e, 0xb6, 0xba, 0xba, 0xba, 0xba,
+  0xb8, 0xa8, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xb7, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xaf, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3,
+  0xa3, 0xae, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb4, 0xa6, 0xa3, 0xa3, 0xa3,
+  0xa3, 0xa3, 0xa3, 0xa3, 0xa6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xae, 0x97, 0x7a, 0x59, 0x3a, 0x27, 0x15, 0x0e, 0x0e, 0x0e, 0x19, 0x2b,
+  0x3f, 0x5c, 0x80, 0x99, 0xb1, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xb9, 0xaf, 0xa3, 0x9e, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x66, 0x2a,
+  0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4f, 0xae, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xa1, 0x37, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x5a, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xb4, 0x90, 0x5b, 0x39,
+  0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0xa7, 0xba, 0xba, 0xba, 0xba,
+  0xb1, 0x44, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x2c, 0xa8, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0x7a, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27,
+  0x27, 0x74, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x9a, 0x36, 0x27, 0x27, 0x27,
+  0x27, 0x27, 0x27, 0x27, 0x40, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xa6, 0x6d,
+  0x31, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x05, 0x1a, 0x37, 0x71, 0xa9, 0xb9, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb7, 0xab,
+  0x7a, 0x4a, 0x33, 0x27, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xa8, 0x3c,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xb3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xb7, 0x9e, 0x5d, 0x1a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x98, 0x53, 0x08, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x52, 0x99, 0xb9, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x8a, 0x41, 0x09,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xa0,
+  0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x71, 0xb6,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xb2, 0x6a, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb1, 0x74, 0x1b, 0x02, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x6e, 0xb1, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0xa0, 0x46, 0x10, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xba,
+  0x92, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x7c,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0x94, 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xa3, 0x3a, 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, 0x02, 0x35, 0x9e,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xb3, 0x72, 0x12, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xba,
+  0xb7, 0x7e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e,
+  0x94, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xb7, 0x8a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0x9c, 0x35, 0x01, 0x00, 0x00, 0x00, 0x00, 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,
+  0x97, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xb1, 0x5c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xba,
+  0xba, 0xb7, 0x65, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x26, 0x9e, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0x7e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xa0, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x16, 0x99, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xaf, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xba,
+  0xba, 0xba, 0xaf, 0x4d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x3b, 0xab, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9,
+  0x92, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xa8, 0x3d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x07, 0x0f, 0x27, 0x3e, 0x4d, 0x4d, 0x3c, 0x20,
+  0x0c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x34, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xb4, 0x5f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x3a, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x03, 0x46, 0xb1, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa3,
+  0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xb9, 0x53, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x13, 0x42, 0x80, 0xa8, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb7,
+  0x9e, 0x6a, 0x31, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x01, 0x42, 0xb8, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0x7e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0x9e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x06, 0x63, 0xb6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb7, 0x52,
+  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+  0x11, 0x2b, 0x39, 0x3b, 0x3b, 0x3b, 0x3d, 0xab, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0x8f, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x07, 0x3a, 0x97, 0xb2, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xb9, 0xa8, 0x72, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x05, 0x8d, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xa0, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x02, 0x0d, 0x16, 0x31, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0x98, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x0b, 0x75, 0xb7, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x8d, 0x10,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x3c, 0x80,
+  0xaa, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xac, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
+  0x73, 0xb2, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0x9e, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x37, 0xac, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb6, 0x53, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x1a, 0x54, 0x94, 0xb3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xb8, 0x7d, 0x13, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x13, 0x8f, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x43, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x17, 0x7d, 0xae, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x84, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x75,
+  0xb7, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0x9f, 0x35, 0x09, 0x08, 0x08, 0x08, 0x08,
+  0x08, 0x08, 0x08, 0x16, 0x90, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xa0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3a,
+  0x99, 0xb5, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb8, 0x70, 0x05, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x99, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x9b, 0x0a, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x95, 0xb9, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb7,
+  0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xb6,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa2, 0x7d, 0x7b, 0x7b, 0x7b, 0x7b,
+  0x7b, 0x7b, 0x7b, 0x7b, 0xa0, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xad,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x53, 0x05, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x30, 0xa6, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x5f, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x8e, 0xb9, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x9a,
+  0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xb4, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xab,
+  0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x36, 0xa8, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xae, 0x41, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xad, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb4, 0x30, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x56, 0xb6, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0x67,
+  0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x8e,
+  0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x90, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa3, 0x30, 0x01,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x55, 0xb3, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x9e, 0x1a, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x9b, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xaf, 0x3d,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0xa9, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6e,
+  0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xb7, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x98, 0x1e,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x72, 0xb7, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x8a, 0x0e, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xb7, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa3, 0x20,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb6, 0x50,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0x8a,
+  0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x7d, 0xb9,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x79, 0x07, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x97, 0x07,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb4, 0x3d,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xa0, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb6,
+  0x74, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x95,
+  0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf,
+  0xaf, 0xaf, 0xaf, 0xaf, 0xb1, 0xb8, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x71, 0x03, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x80, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x33,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb6, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d,
+  0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
+  0x13, 0x13, 0x13, 0x13, 0x28, 0xa6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x67, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x24, 0x24, 0x24,
+  0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24,
+  0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24,
+  0x24, 0x24, 0x24, 0x24, 0x24, 0x4d, 0xb2, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xae, 0x43, 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, 0x13, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x55, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xb1, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xaa, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x13, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x48, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xb1, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0x99, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x13, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x47, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xb1, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x91, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x13, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x47, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xb2, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0x75, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x13, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x4e, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0xb4, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xb4, 0x69, 0x07, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x13, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xa3, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x93, 0x14, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x60, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xb9, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x46, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x13, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xaf, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xa0, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb8, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x5c, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x92, 0x13, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba, 0x7a, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa9, 0x3e, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x6d, 0x77, 0x77, 0x77, 0x77,
+  0x77, 0x77, 0x77, 0x77, 0x7d, 0xb1, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb2, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb6, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x44, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x83, 0x08, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x2f, 0xba, 0xba, 0xba, 0xba, 0xba, 0x97, 0x06,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0xa8, 0xa8, 0xa8,
+  0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8,
+  0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0x91, 0x16, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x01, 0x7d, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa0, 0x1e, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x63, 0xb4, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb3, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb2, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x27, 0xb3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0x62, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x3d, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa3, 0x1f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xb1, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x8a, 0x04, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x01, 0x9b, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x97, 0x1e, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x67, 0xb9, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb8, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xad,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x0d, 0x85, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x22, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x5f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x43,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x8d, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x46, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x15, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb7, 0x80, 0x07,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x8d, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0x7d, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x7a,
+  0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xb3, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x01, 0x44, 0xb2, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x83, 0x01, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x87, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6e,
+  0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4a, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa6, 0x16, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x44, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6d,
+  0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x90, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xa0, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d,
+  0x9e, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xb8, 0x6c, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x02, 0x75, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0x99, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x1e, 0xa3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa6,
+  0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8f, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xb3, 0x51, 0x02, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x08, 0x87, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb1,
+  0x50, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xa8,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xb7, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x3b, 0xa6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb9, 0x90, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x18, 0x89, 0xb7, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xae, 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x44, 0xb2, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x4a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x9f,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0x8b, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x2b, 0xa6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb5, 0x3b, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x39,
+  0xa7, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0x8e, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x27, 0x90, 0xb6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xae,
+  0x67, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x0c, 0x6d, 0xad, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xb7, 0x88, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x0a, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x99, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a,
+  0xa0, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb7, 0x93, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x6f, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0x9e, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+  0x4d, 0xb6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xb2, 0xb2, 0xb2, 0xb2, 0x67, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2,
+  0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xae, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x16, 0x4c, 0x98, 0xb1, 0xb4, 0xb4, 0xb3, 0xae, 0x78, 0x37,
+  0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x35, 0x80, 0xab, 0xb3, 0xb4, 0xb3,
+  0xb2, 0x92, 0x4f, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x31, 0xb3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb4, 0x56, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x2e, 0x8b, 0xb6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xb5, 0x80, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x17, 0xae, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0x9f, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x05, 0x5f, 0xb3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x23, 0x0d, 0x0d, 0x0d, 0x07, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+  0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x24, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0x8b, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x01, 0x13, 0x2f, 0x34, 0x26, 0x0a, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x27, 0x33, 0x2e,
+  0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x0d, 0x8e, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xab, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x04, 0x45, 0x83, 0xa8, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9,
+  0xa8, 0x83, 0x3d, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x0a, 0x78, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0x7e, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x0d, 0x7c, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb4, 0x4e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  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, 0x52, 0xb3, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0x86, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x0d, 0x28, 0x40, 0x5f, 0x71, 0x7c, 0x72, 0x5f, 0x41,
+  0x27, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x43, 0xaf, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb7, 0x79, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x10, 0x8e, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xaa, 0x31, 0x01, 0x00, 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, 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,
+  0x32, 0xae, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xb7, 0x77, 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,
+  0x27, 0xa9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xb6, 0x53, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x01, 0x26, 0x9b, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xb9, 0x98, 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, 0x07, 0x56, 0x48, 0x03, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2b,
+  0x98, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb4, 0x5f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23,
+  0x92, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xae, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x30, 0xa6, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x97, 0x26, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x56, 0xb4, 0xb1, 0x4c, 0x06,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x9e,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xb4, 0x73, 0x0c, 0x00, 0x00, 0x00, 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, 0x98,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa8, 0x2e, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x03, 0x46, 0xac, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb8, 0x9b, 0x33, 0x04, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6a, 0xb1, 0xba, 0xba, 0xaf, 0x5c,
+  0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3b, 0x9b, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xb7, 0x7f, 0x24, 0x01, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x39, 0x99, 0xb9,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x9a, 0x25, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x57, 0xb4, 0xba, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xac, 0x5e, 0x13, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x02, 0x32, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb6,
+  0x84, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x5f, 0xb2, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa5, 0x4a, 0x0d, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x5f, 0xb1, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0x90, 0x10, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x71, 0xb6, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb1, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb4, 0x95, 0x43,
+  0x12, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x07, 0x21, 0x67, 0xa9, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb9, 0xa3, 0x67, 0x1e, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x03, 0x14, 0x47, 0x9b, 0xb5, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x94, 0x3c, 0x13,
+  0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x04, 0x16, 0x4b, 0x9b, 0xb6, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb8, 0x76, 0x0d, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x83, 0xba, 0xba, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb2, 0x3b, 0x2e, 0x2e, 0x2e, 0x1a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e,
+  0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x3c, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9,
+  0x98, 0x63, 0x35, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1e,
+  0x44, 0x75, 0xab, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xa7, 0x75, 0x41, 0x1e, 0x04, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x02, 0x12, 0x3a, 0x5f, 0x9e, 0xb7, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb7, 0x9a,
+  0x5f, 0x38, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x01, 0x12, 0x3a, 0x67, 0x9e, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb4, 0x61, 0x04,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x94, 0xb9, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb9, 0xab, 0xa9, 0xa9, 0xa9, 0x5f, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9,
+  0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xab, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xb8, 0xac, 0xa2, 0x93, 0x7d, 0x6d, 0x6c, 0x74, 0x83, 0x9b, 0xa6,
+  0xb2, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xb1, 0xa6, 0x99, 0x83, 0x72, 0x6c, 0x6e,
+  0x7c, 0x94, 0xa0, 0xae, 0xb7, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb7, 0xae, 0xa0, 0x8b, 0x67, 0x4e, 0x3d, 0x37, 0x37, 0x37, 0x3d, 0x4e,
+  0x6a, 0x8d, 0xa0, 0xae, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb3, 0x45,
+  0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xa3, 0xba,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa8,
+  0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x3c, 0xa9,
+  0x9b, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xa0, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4c,
+  0x96, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xb9, 0x90, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
+  0x44, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0x7d, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xb5, 0x69, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xb2, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xab, 0x3e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xb7, 0x9e, 0x58, 0x40, 0x44, 0x6a, 0xab, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xa0, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0x99, 0x37, 0x74, 0x98, 0x92, 0x59, 0x49, 0xab, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x99, 0x1e, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0x44, 0x7d, 0x85, 0x9e, 0x94, 0x7d, 0x55, 0x71, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb7, 0x81, 0x0d, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xaf, 0x36, 0xa8, 0x62, 0x5f, 0x41, 0x95, 0x8d, 0x49, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb9, 0x72, 0x0a, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xae, 0x38, 0xac, 0x64, 0x71, 0x5c, 0x78, 0x90, 0x48, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x52, 0x03, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xb9, 0x3e, 0x8e, 0x6b, 0x50, 0x53, 0x90, 0x65, 0x63, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb3, 0x43, 0x02,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0x8f, 0x37, 0x88, 0xa3, 0x9e, 0x74, 0x3d, 0xa3, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xa0, 0x2e,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0x6c, 0x01, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xb2, 0x2f,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xa8, 0xba, 0xba, 0xba,
+  0xba, 0xba, 0xb6, 0x8f, 0x3f, 0x31, 0x34, 0x4c, 0xa0, 0xba
+};
+#endif
diff --git a/lib/at91/microchip_logo_8bpp.h b/lib/at91/microchip_logo_8bpp.h
new file mode 100644 (file)
index 0000000..b7213b1
--- /dev/null
@@ -0,0 +1,1082 @@
+/*
+ * Copyright (C) 2017 Microchip
+ *              Wenyou.Yang <wenyou.yang@microchip.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __MICROCHIP_LOGO_8BPP_H__
+#define __MICROCHIP_LOGO_8BPP_H__
+
+#define MICROCHIP_LOGO_8BPP_WIDTH      208
+#define MICROCHIP_LOGO_8BPP_HEIGHT     56
+
+#define MICROCHIP_LOGO_8BPP_X_OFFSET   0
+#define MCIROCHIP_LOGO_8BPP_Y_OFFSET   0
+
+/* Format: BMP 8BPP 240*60 */
+unsigned char microchip_logo_8bpp[] = {
+  0x42, 0x4d, 0xb6, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x04,
+  0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x38, 0x00,
+  0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2d,
+  0x00, 0x00, 0x74, 0x12, 0x00, 0x00, 0x74, 0x12, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00,
+  0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0xc0, 0xc0,
+  0xc0, 0x00, 0xc0, 0xdc, 0xc0, 0x00, 0xf0, 0xca, 0xa6, 0x00, 0x00, 0x20,
+  0x40, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x20,
+  0xa0, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0x20, 0xe0, 0x00, 0x00, 0x40,
+  0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40,
+  0x60, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x40, 0xa0, 0x00, 0x00, 0x40,
+  0xc0, 0x00, 0x00, 0x40, 0xe0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x60,
+  0x20, 0x00, 0x00, 0x60, 0x40, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60,
+  0x80, 0x00, 0x00, 0x60, 0xa0, 0x00, 0x00, 0x60, 0xc0, 0x00, 0x00, 0x60,
+  0xe0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00, 0x80,
+  0x40, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80,
+  0xa0, 0x00, 0x00, 0x80, 0xc0, 0x00, 0x00, 0x80, 0xe0, 0x00, 0x00, 0xa0,
+  0x00, 0x00, 0x00, 0xa0, 0x20, 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xa0,
+  0x60, 0x00, 0x00, 0xa0, 0x80, 0x00, 0x00, 0xa0, 0xa0, 0x00, 0x00, 0xa0,
+  0xc0, 0x00, 0x00, 0xa0, 0xe0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0,
+  0x20, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xc0, 0x60, 0x00, 0x00, 0xc0,
+  0x80, 0x00, 0x00, 0xc0, 0xa0, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0xc0,
+  0xe0, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe0, 0x20, 0x00, 0x00, 0xe0,
+  0x40, 0x00, 0x00, 0xe0, 0x60, 0x00, 0x00, 0xe0, 0x80, 0x00, 0x00, 0xe0,
+  0xa0, 0x00, 0x00, 0xe0, 0xc0, 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x40, 0x00,
+  0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00,
+  0x60, 0x00, 0x40, 0x00, 0x80, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x40, 0x00,
+  0xc0, 0x00, 0x40, 0x00, 0xe0, 0x00, 0x40, 0x20, 0x00, 0x00, 0x40, 0x20,
+  0x20, 0x00, 0x40, 0x20, 0x40, 0x00, 0x40, 0x20, 0x60, 0x00, 0x40, 0x20,
+  0x80, 0x00, 0x40, 0x20, 0xa0, 0x00, 0x40, 0x20, 0xc0, 0x00, 0x40, 0x20,
+  0xe0, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x20, 0x00, 0x40, 0x40,
+  0x40, 0x00, 0x40, 0x40, 0x60, 0x00, 0x40, 0x40, 0x80, 0x00, 0x40, 0x40,
+  0xa0, 0x00, 0x40, 0x40, 0xc0, 0x00, 0x40, 0x40, 0xe0, 0x00, 0x40, 0x60,
+  0x00, 0x00, 0x40, 0x60, 0x20, 0x00, 0x40, 0x60, 0x40, 0x00, 0x40, 0x60,
+  0x60, 0x00, 0x40, 0x60, 0x80, 0x00, 0x40, 0x60, 0xa0, 0x00, 0x40, 0x60,
+  0xc0, 0x00, 0x40, 0x60, 0xe0, 0x00, 0x40, 0x80, 0x00, 0x00, 0x40, 0x80,
+  0x20, 0x00, 0x40, 0x80, 0x40, 0x00, 0x40, 0x80, 0x60, 0x00, 0x40, 0x80,
+  0x80, 0x00, 0x40, 0x80, 0xa0, 0x00, 0x40, 0x80, 0xc0, 0x00, 0x40, 0x80,
+  0xe0, 0x00, 0x40, 0xa0, 0x00, 0x00, 0x40, 0xa0, 0x20, 0x00, 0x40, 0xa0,
+  0x40, 0x00, 0x40, 0xa0, 0x60, 0x00, 0x40, 0xa0, 0x80, 0x00, 0x40, 0xa0,
+  0xa0, 0x00, 0x40, 0xa0, 0xc0, 0x00, 0x40, 0xa0, 0xe0, 0x00, 0x40, 0xc0,
+  0x00, 0x00, 0x40, 0xc0, 0x20, 0x00, 0x40, 0xc0, 0x40, 0x00, 0x40, 0xc0,
+  0x60, 0x00, 0x40, 0xc0, 0x80, 0x00, 0x40, 0xc0, 0xa0, 0x00, 0x40, 0xc0,
+  0xc0, 0x00, 0x40, 0xc0, 0xe0, 0x00, 0x40, 0xe0, 0x00, 0x00, 0x40, 0xe0,
+  0x20, 0x00, 0x40, 0xe0, 0x40, 0x00, 0x40, 0xe0, 0x60, 0x00, 0x40, 0xe0,
+  0x80, 0x00, 0x40, 0xe0, 0xa0, 0x00, 0x40, 0xe0, 0xc0, 0x00, 0x40, 0xe0,
+  0xe0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x80, 0x00,
+  0x40, 0x00, 0x80, 0x00, 0x60, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00,
+  0xa0, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x80, 0x00, 0xe0, 0x00, 0x80, 0x20,
+  0x00, 0x00, 0x80, 0x20, 0x20, 0x00, 0x80, 0x20, 0x40, 0x00, 0x80, 0x20,
+  0x60, 0x00, 0x80, 0x20, 0x80, 0x00, 0x80, 0x20, 0xa0, 0x00, 0x80, 0x20,
+  0xc0, 0x00, 0x80, 0x20, 0xe0, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x40,
+  0x20, 0x00, 0x80, 0x40, 0x40, 0x00, 0x80, 0x40, 0x60, 0x00, 0x80, 0x40,
+  0x80, 0x00, 0x80, 0x40, 0xa0, 0x00, 0x80, 0x40, 0xc0, 0x00, 0x80, 0x40,
+  0xe0, 0x00, 0x80, 0x60, 0x00, 0x00, 0x80, 0x60, 0x20, 0x00, 0x80, 0x60,
+  0x40, 0x00, 0x80, 0x60, 0x60, 0x00, 0x80, 0x60, 0x80, 0x00, 0x80, 0x60,
+  0xa0, 0x00, 0x80, 0x60, 0xc0, 0x00, 0x80, 0x60, 0xe0, 0x00, 0x80, 0x80,
+  0x00, 0x00, 0x80, 0x80, 0x20, 0x00, 0x80, 0x80, 0x40, 0x00, 0x80, 0x80,
+  0x60, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0xa0, 0x00, 0x80, 0x80,
+  0xc0, 0x00, 0x80, 0x80, 0xe0, 0x00, 0x80, 0xa0, 0x00, 0x00, 0x80, 0xa0,
+  0x20, 0x00, 0x80, 0xa0, 0x40, 0x00, 0x80, 0xa0, 0x60, 0x00, 0x80, 0xa0,
+  0x80, 0x00, 0x80, 0xa0, 0xa0, 0x00, 0x80, 0xa0, 0xc0, 0x00, 0x80, 0xa0,
+  0xe0, 0x00, 0x80, 0xc0, 0x00, 0x00, 0x80, 0xc0, 0x20, 0x00, 0x80, 0xc0,
+  0x40, 0x00, 0x80, 0xc0, 0x60, 0x00, 0x80, 0xc0, 0x80, 0x00, 0x80, 0xc0,
+  0xa0, 0x00, 0x80, 0xc0, 0xc0, 0x00, 0x80, 0xc0, 0xe0, 0x00, 0x80, 0xe0,
+  0x00, 0x00, 0x80, 0xe0, 0x20, 0x00, 0x80, 0xe0, 0x40, 0x00, 0x80, 0xe0,
+  0x60, 0x00, 0x80, 0xe0, 0x80, 0x00, 0x80, 0xe0, 0xa0, 0x00, 0x80, 0xe0,
+  0xc0, 0x00, 0x80, 0xe0, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00,
+  0x20, 0x00, 0xc0, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x60, 0x00, 0xc0, 0x00,
+  0x80, 0x00, 0xc0, 0x00, 0xa0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
+  0xe0, 0x00, 0xc0, 0x20, 0x00, 0x00, 0xc0, 0x20, 0x20, 0x00, 0xc0, 0x20,
+  0x40, 0x00, 0xc0, 0x20, 0x60, 0x00, 0xc0, 0x20, 0x80, 0x00, 0xc0, 0x20,
+  0xa0, 0x00, 0xc0, 0x20, 0xc0, 0x00, 0xc0, 0x20, 0xe0, 0x00, 0xc0, 0x40,
+  0x00, 0x00, 0xc0, 0x40, 0x20, 0x00, 0xc0, 0x40, 0x40, 0x00, 0xc0, 0x40,
+  0x60, 0x00, 0xc0, 0x40, 0x80, 0x00, 0xc0, 0x40, 0xa0, 0x00, 0xc0, 0x40,
+  0xc0, 0x00, 0xc0, 0x40, 0xe0, 0x00, 0xc0, 0x60, 0x00, 0x00, 0xc0, 0x60,
+  0x20, 0x00, 0xc0, 0x60, 0x40, 0x00, 0xc0, 0x60, 0x60, 0x00, 0xc0, 0x60,
+  0x80, 0x00, 0xc0, 0x60, 0xa0, 0x00, 0xc0, 0x60, 0xc0, 0x00, 0xc0, 0x60,
+  0xe0, 0x00, 0xc0, 0x80, 0x00, 0x00, 0xc0, 0x80, 0x20, 0x00, 0xc0, 0x80,
+  0x40, 0x00, 0xc0, 0x80, 0x60, 0x00, 0xc0, 0x80, 0x80, 0x00, 0xc0, 0x80,
+  0xa0, 0x00, 0xc0, 0x80, 0xc0, 0x00, 0xc0, 0x80, 0xe0, 0x00, 0xc0, 0xa0,
+  0x00, 0x00, 0xc0, 0xa0, 0x20, 0x00, 0xc0, 0xa0, 0x40, 0x00, 0xc0, 0xa0,
+  0x60, 0x00, 0xc0, 0xa0, 0x80, 0x00, 0xc0, 0xa0, 0xa0, 0x00, 0xc0, 0xa0,
+  0xc0, 0x00, 0xc0, 0xa0, 0xe0, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0xc0, 0xc0,
+  0x20, 0x00, 0xc0, 0xc0, 0x40, 0x00, 0xc0, 0xc0, 0x60, 0x00, 0xc0, 0xc0,
+  0x80, 0x00, 0xc0, 0xc0, 0xa0, 0x00, 0xf0, 0xfb, 0xff, 0x00, 0xa4, 0xa0,
+  0xa0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
+  0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00,
+  0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xef, 0xef,
+  0xa7, 0x9f, 0x57, 0x57, 0x4f, 0x4f, 0x57, 0x57, 0x5f, 0xa7, 0xef, 0xef,
+  0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf6,
+  0xa7, 0x5f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x57, 0xa7, 0xef, 0xf6, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0xef, 0xa7, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x5f,
+  0xef, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0xa7, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x9f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x57, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x57, 0xaf,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0x57, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x9f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xa7, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0xef, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x57, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x0f, 0x0f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f,
+  0x57, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x0f, 0x0f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f,
+  0xa7, 0xef, 0x9f, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x0f, 0x0f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x9f, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x0f, 0x9f, 0xf6, 0xff, 0xf6, 0x9f, 0x0f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0xa7, 0xf6, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x57, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x57, 0xef, 0xff, 0xff, 0xff, 0xf6,
+  0x57, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x57, 0xef,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x4f,
+  0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x4f, 0xaf, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xef, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x0f, 0x0f, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xa7, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x0f, 0x5f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x0f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x9f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5f, 0x0f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x0f, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xf6, 0x57, 0x0f, 0x4f, 0x4f, 0x4f, 0x0f, 0x57, 0xef, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf6, 0xf6, 0xf6,
+  0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xef, 0x57, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0xa7, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xa4, 0x5b, 0x5b, 0x5b, 0x07,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf7, 0x5b, 0x5b, 0x5b, 0xa4, 0xff, 0xf6, 0x9b, 0x5b,
+  0x5b, 0xa4, 0xf6, 0xff, 0xff, 0xf6, 0xf7, 0x5b, 0x52, 0x52, 0x52, 0x52,
+  0x52, 0x52, 0x52, 0x52, 0x52, 0xa4, 0x08, 0xff, 0xf6, 0xa4, 0x5b, 0x5b,
+  0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf7, 0x5b, 0x5b, 0x9b,
+  0x08, 0xff, 0xff, 0xf6, 0xf7, 0x5b, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52,
+  0x52, 0x52, 0x5b, 0xa4, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xa4, 0x5b,
+  0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x9b, 0x08, 0xff,
+  0xf6, 0xa4, 0x5b, 0x5b, 0xa4, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0xa4, 0x5b, 0x5b, 0x9b, 0xff, 0xf6, 0xa4, 0x5b, 0x5b, 0x5b, 0x07, 0xff,
+  0xf7, 0x5b, 0x5b, 0x9b, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x57,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f,
+  0x0f, 0x4f, 0x0f, 0x5f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x52,
+  0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xa4, 0x5b,
+  0xa4, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x00, 0x00, 0x00, 0x52,
+  0xff, 0x08, 0x00, 0x00, 0x00, 0x49, 0x08, 0xff, 0xf6, 0x5b, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xf6,
+  0xf6, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0x52, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0x9b, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff,
+  0xf6, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x52, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x49, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf6, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x0f,
+  0x4f, 0x0f, 0x4f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xef, 0x57, 0x4f, 0x0f, 0x4f, 0xef, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x57, 0xef, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x52, 0x00, 0x00, 0x00, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b,
+  0x00, 0x00, 0x00, 0x9b, 0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0x08, 0xff,
+  0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x49, 0x07, 0xff, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x5b, 0x00, 0x00, 0x00, 0x07, 0xff, 0x07, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0xa4, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf6, 0x52, 0x00, 0x00,
+  0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x49,
+  0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00,
+  0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xf6, 0x57, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0x5f, 0x0f, 0x4f, 0x0f, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5f, 0x0f, 0x4f, 0x0f, 0xa7, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5f, 0x0f,
+  0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x00, 0x00, 0x00, 0x9b,
+  0xf6, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x07, 0xff,
+  0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xa4, 0xff, 0x08, 0x00, 0x00,
+  0x00, 0x52, 0x08, 0xff, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x52, 0x00, 0x00,
+  0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5b, 0x00, 0x00, 0x00,
+  0x07, 0xff, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xff, 0x52, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+  0xf6, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0x52, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff,
+  0xa4, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x0f, 0x5f, 0xf6, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x57, 0x4f, 0x0f, 0x57, 0xf6, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x0f, 0x4f,
+  0x0f, 0x57, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xaf, 0x0f, 0x4f, 0x5f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b,
+  0x00, 0x00, 0x00, 0x5b, 0xf6, 0xff, 0xff, 0xf6, 0x5b, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7,
+  0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0x08, 0xf6, 0x52, 0x00, 0x00, 0x00,
+  0x49, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x52, 0x5b, 0x08,
+  0xf6, 0x52, 0x00, 0x00, 0x52, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xf7,
+  0x49, 0x00, 0x00, 0x49, 0x08, 0xff, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52,
+  0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x49, 0x00, 0x00, 0x00, 0x49, 0x08, 0xf6,
+  0x49, 0x00, 0x00, 0x00, 0x49, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b,
+  0x5b, 0x5b, 0x52, 0xf6, 0xf6, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00, 0xa4, 0x07, 0xf7, 0xf7,
+  0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0x07, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x4f, 0x0f,
+  0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5f, 0x0f, 0x4f,
+  0x4f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x57, 0x0f, 0x4f, 0x4f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0x57, 0x0f, 0x4f, 0x57, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0x07,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x08, 0xff, 0xff, 0xf6, 0x49,
+  0x00, 0x00, 0x00, 0x07, 0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0xf6, 0x07,
+  0x49, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xf6, 0x52, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x00,
+  0x00, 0x00, 0x07, 0xf6, 0x49, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00,
+  0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x49,
+  0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xf6,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xaf, 0x4f, 0x0f, 0x4f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xa7, 0x0f, 0x4f, 0x0f, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x9f, 0x0f, 0x4f, 0x0f, 0xa7, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x9f, 0x0f, 0x4f, 0x4f,
+  0x57, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x52,
+  0xf6, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7,
+  0xff, 0xff, 0xf6, 0x49, 0x00, 0x00, 0x00, 0x08, 0xff, 0x08, 0x00, 0x00,
+  0x00, 0x52, 0xf6, 0x07, 0x49, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x07,
+  0xff, 0x08, 0x49, 0x00, 0x00, 0x49, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0x52, 0x00, 0x00, 0x00, 0x07, 0xf6, 0x49, 0x00, 0x00, 0x52,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x52, 0x00, 0x00, 0x49, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7,
+  0x49, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff,
+  0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x4f, 0x4f, 0x0f, 0x57, 0xf6, 0xff,
+  0xff, 0xff, 0xff, 0xef, 0x57, 0x0f, 0x0f, 0x57, 0xf6, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x4f, 0x4f, 0x0f, 0x57,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
+  0x4f, 0x0f, 0x4f, 0x4f, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
+  0x00, 0x00, 0x00, 0x49, 0x08, 0xff, 0xf6, 0x49, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x5b, 0xf6, 0xff, 0x08, 0x49, 0x00, 0x00, 0x00, 0xf6,
+  0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0xf6, 0x07, 0x49, 0x00, 0x00, 0x5b,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x49, 0x07, 0xff, 0xf6, 0x49, 0x00, 0x00, 0x49, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0x00, 0x00, 0x00, 0x07, 0xf6,
+  0x49, 0x00, 0x00, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x4f, 0x4f,
+  0x4f, 0x0f, 0x9f, 0xf6, 0xff, 0xff, 0xf6, 0x5f, 0x0f, 0x4f, 0x0f, 0xaf,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x57,
+  0x0f, 0x4f, 0x0f, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xf6, 0x57, 0x0f, 0x4f, 0x4f, 0x5f, 0xf6, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x07, 0x49, 0x00, 0x00, 0x00, 0x08, 0xff, 0x07, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x07, 0x00,
+  0x00, 0x00, 0x49, 0xf6, 0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0xf6, 0x07,
+  0x49, 0x00, 0x00, 0x5b, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49,
+  0x49, 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xf6, 0xf6, 0x49, 0x00,
+  0x00, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0x00,
+  0x00, 0x00, 0x07, 0xf6, 0x49, 0x00, 0x00, 0x9b, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49,
+  0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00,
+  0x49, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x9b,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xaf, 0x4f, 0x4f, 0x4f, 0x0f, 0x0f, 0xaf, 0xff, 0xff, 0xaf, 0x0f,
+  0x4f, 0x0f, 0x5f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xa7, 0x0f, 0x4f, 0x0f, 0x5f, 0xf6, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x0f, 0x4f, 0x4f, 0x4f, 0xef,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x00, 0x00, 0x00,
+  0x07, 0xff, 0x5b, 0x00, 0x00, 0x00, 0x49, 0xa4, 0x49, 0x00, 0x00, 0x00,
+  0xa4, 0xff, 0x07, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xff, 0x08, 0x00, 0x00,
+  0x00, 0x52, 0xf6, 0x07, 0x49, 0x00, 0x00, 0x5b, 0xf6, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00,
+  0x52, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x52, 0x00, 0x00, 0x49,
+  0x08, 0xf6, 0x49, 0x00, 0x00, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0x9b, 0x00, 0x00, 0x00, 0x07, 0xf6, 0x49, 0x00, 0x00, 0x5b,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff,
+  0xa4, 0x00, 0x00, 0x00, 0xf7, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xa4,
+  0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x57,
+  0xf6, 0xf6, 0x57, 0x0f, 0x0f, 0x4f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x4f, 0x0f, 0x0f, 0x57, 0xef, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x4f, 0x0f,
+  0x4f, 0x4f, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08,
+  0x52, 0x00, 0x00, 0x00, 0x07, 0xf6, 0x49, 0x00, 0x00, 0x00, 0x5b, 0xf6,
+  0x52, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xf7, 0x00, 0x00, 0x00, 0x5b, 0xff,
+  0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0xf6, 0x07, 0x49, 0x00, 0x00, 0x5b,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x52, 0x00, 0x00, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xa4, 0x00, 0x00, 0x00, 0x08, 0xf6, 0x49, 0x00, 0x00, 0x49, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0x00, 0x00, 0x00, 0x07, 0xf6,
+  0x49, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0x08, 0x49, 0x00, 0x00, 0x52, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x0f, 0x5f, 0x5f, 0x0f, 0x4f, 0x0f, 0xa7, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5f, 0x0f, 0x4f,
+  0x0f, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x5f, 0x0f, 0x4f, 0x4f, 0x57, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0x07, 0xf7, 0x00, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf7, 0x00,
+  0x00, 0x00, 0x9b, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0xf6, 0x07,
+  0x49, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x52, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x08, 0xf6, 0x49, 0x00,
+  0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x52, 0x00,
+  0x00, 0x00, 0x07, 0xf6, 0x49, 0x00, 0x00, 0x49, 0xf6, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00,
+  0x49, 0xa4, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xa4, 0x49, 0x00, 0x00, 0x49,
+  0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00,
+  0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x49, 0x00, 0x00, 0x52,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xef, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x4f, 0x0f,
+  0x5f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xa7, 0x0f, 0x4f, 0x0f, 0x5f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xa7, 0x0f, 0x0f, 0x4f, 0x4f, 0xef, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00,
+  0xf7, 0x52, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xff, 0x07, 0x49, 0x00, 0x00,
+  0x00, 0xa4, 0x9b, 0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0x08, 0x00, 0x00,
+  0x00, 0x52, 0xf6, 0x08, 0x49, 0x00, 0x00, 0x00, 0xa4, 0xf6, 0xf6, 0xf6,
+  0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xff, 0xf6, 0x52, 0x00, 0x00,
+  0x52, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xff, 0x08, 0x52, 0x00, 0x00, 0x00,
+  0x08, 0xff, 0x52, 0x00, 0x00, 0x00, 0x9b, 0xf6, 0xff, 0xf6, 0xf6, 0xf6,
+  0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf6, 0x49, 0x00, 0x00, 0x00,
+  0xa4, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xff,
+  0xf6, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0x52, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff,
+  0xa4, 0x00, 0x00, 0x00, 0x07, 0xff, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xa4,
+  0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x57, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x0f, 0x4f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xef, 0x57, 0x0f, 0x0f, 0x4f, 0xef, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x57, 0x0f, 0x4f, 0x4f,
+  0xa7, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0x9b, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xff, 0xff,
+  0xf6, 0x5b, 0x00, 0x00, 0x00, 0x49, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff,
+  0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0x08, 0xf6, 0x52, 0x00, 0x00, 0x00,
+  0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x52, 0x08,
+  0xf6, 0x52, 0x00, 0x00, 0x00, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x49,
+  0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x52, 0x00, 0x00, 0x00, 0x00, 0x49,
+  0x52, 0x52, 0x52, 0x52, 0x49, 0x00, 0x00, 0x00, 0x00, 0x49, 0x08, 0xf6,
+  0x49, 0x00, 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49,
+  0x49, 0x49, 0x49, 0xf6, 0xf6, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x49, 0x52, 0x52, 0x52,
+  0x52, 0x52, 0x49, 0x00, 0x00, 0x00, 0x00, 0x9b, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0xa7, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x9f, 0x0f, 0x4f, 0x0f, 0xa7,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5f,
+  0x0f, 0x4f, 0x4f, 0x57, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x07, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0x08, 0xff,
+  0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x49, 0x08, 0xff, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x08, 0xff, 0x9b, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x52, 0xf6, 0xff, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xf6, 0x52, 0x00, 0x00,
+  0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x49,
+  0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xef, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x9f,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x0f,
+  0x0f, 0x4f, 0x0f, 0x9f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xaf, 0x0f, 0x0f, 0x4f, 0x4f, 0xef, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x5b, 0xff, 0xff, 0xff, 0xff, 0x08, 0x52, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0x08, 0x00, 0x00,
+  0x00, 0x52, 0x08, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xf6, 0x52, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b,
+  0xf6, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xf6,
+  0xf6, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0x52, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0xf7, 0xff,
+  0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x49, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x57, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x0f, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xf6, 0x57, 0x0f, 0x4f, 0x4f, 0x4f, 0x0f, 0xa7, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x57, 0x0f, 0x4f, 0x4f, 0x9f, 0xf6,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x07, 0xff,
+  0xff, 0x08, 0x00, 0x00, 0x00, 0x52, 0x08, 0xff, 0xff, 0xa4, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0xf6,
+  0xf6, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x49, 0x07, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xf6, 0xff, 0xff,
+  0xf6, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0xa4, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x49, 0xff, 0xf6, 0x52, 0x00,
+  0x00, 0x00, 0xf7, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x4f, 0xef, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0x9f, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f,
+  0x4f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x9f, 0x0f, 0x4f,
+  0x4f, 0x57, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49,
+  0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x49, 0xf6, 0xff, 0xff, 0xf6, 0xa4, 0xa4, 0xa4, 0xf7, 0xf6, 0xff,
+  0xff, 0xff, 0x07, 0xa4, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b,
+  0x5b, 0xf7, 0xf6, 0xff, 0xf6, 0xf7, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4,
+  0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xf7, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0x08, 0xa4, 0x9b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0xa4, 0x07,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xa4, 0x9b, 0x5b, 0x5b, 0x5b,
+  0x5b, 0x5b, 0x5b, 0x5b, 0x9b, 0xf7, 0xf6, 0xff, 0xf6, 0xf7, 0xa4, 0xa4,
+  0xf7, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf7, 0xa4, 0xa4, 0xa4,
+  0xff, 0xf6, 0xf7, 0xa4, 0xa4, 0xa4, 0x07, 0xff, 0x07, 0xa4, 0xa4, 0xa4,
+  0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xf7, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf6, 0x57, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x0f, 0x57, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x0f, 0x0f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x57, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xef, 0x0f, 0x0f, 0x4f, 0x4f, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x49, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0xa4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0x57, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0xa7, 0xf6,
+  0xff, 0xff, 0xff, 0xf6, 0x57, 0x0f, 0x4f, 0x4f, 0x5f, 0xf6, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0x08, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf6, 0x9f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x0f, 0xef,
+  0xff, 0xff, 0xf6, 0xa7, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x0f, 0xaf, 0xff, 0xff, 0xf6, 0xa7, 0x0f, 0x4f, 0x4f, 0x57,
+  0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00, 0x00, 0x5b, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x52, 0x00, 0x00, 0x00,
+  0x00, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x57, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x0f, 0x57, 0xef, 0xef, 0xa7, 0x0f, 0x0f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x4f, 0xaf, 0xef, 0xa7, 0x0f,
+  0x0f, 0x4f, 0x4f, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x00, 0x00,
+  0x00, 0x49, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xf7, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x57,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x4f, 0x57, 0x0f, 0x0f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x0f,
+  0x4f, 0x57, 0x0f, 0x0f, 0x4f, 0x4f, 0x5f, 0xf6, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xf6, 0xa4, 0x52, 0x5b, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x52, 0x52, 0xa4, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xef, 0x57, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x0f, 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x0f, 0x0f, 0x4f, 0x4f, 0x4f, 0x57, 0xef, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf6,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x57, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0xa7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xef, 0x57, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x57, 0xf6, 0xff, 0x07, 0xa4, 0xf7, 0xf6, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xa7, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0xef, 0xff, 0x07, 0x5b,
+  0x52, 0x52, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0xef, 0x5f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x9f,
+  0xf6, 0xff, 0xf7, 0x52, 0x52, 0x52, 0xf7, 0xf6, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xef, 0x5f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x5f, 0xf6, 0xff, 0xff, 0x08, 0x5b, 0x52, 0x5b, 0x07, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0xef, 0xa7, 0x5f, 0x57, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f,
+  0x4f, 0x4f, 0x4f, 0x5f, 0xa7, 0xef, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf6,
+  0x08, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf6, 0xef, 0xaf, 0xa7, 0xa7,
+  0xa7, 0xa7, 0xa7, 0xa7, 0xaf, 0xef, 0xef, 0xf6, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
+#endif
diff --git a/lib/charset.c b/lib/charset.c
new file mode 100644 (file)
index 0000000..ff76e88
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ *  charset conversion utils
+ *
+ *  Copyright (c) 2017 Rob Clark
+ *
+ *  SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <common.h>
+#include <charset.h>
+#include <malloc.h>
+
+/*
+ * utf8/utf16 conversion mostly lifted from grub
+ */
+
+size_t utf16_strlen(const uint16_t *in)
+{
+       size_t i;
+       for (i = 0; in[i]; i++);
+       return i;
+}
+
+size_t utf16_strnlen(const uint16_t *in, size_t count)
+{
+       size_t i;
+       for (i = 0; count-- && in[i]; i++);
+       return i;
+}
+
+uint16_t *utf16_strcpy(uint16_t *dest, const uint16_t *src)
+{
+       uint16_t *tmp = dest;
+
+       while ((*dest++ = *src++) != '\0')
+               /* nothing */;
+       return tmp;
+
+}
+
+uint16_t *utf16_strdup(const uint16_t *s)
+{
+       uint16_t *new;
+       if (!s || !(new = malloc((utf16_strlen(s) + 1) * 2)))
+               return NULL;
+       utf16_strcpy(new, s);
+       return new;
+}
+
+/* Convert UTF-16 to UTF-8.  */
+uint8_t *utf16_to_utf8(uint8_t *dest, const uint16_t *src, size_t size)
+{
+       uint32_t code_high = 0;
+
+       while (size--) {
+               uint32_t code = *src++;
+
+               if (code_high) {
+                       if (code >= 0xDC00 && code <= 0xDFFF) {
+                               /* Surrogate pair.  */
+                               code = ((code_high - 0xD800) << 10) + (code - 0xDC00) + 0x10000;
+
+                               *dest++ = (code >> 18) | 0xF0;
+                               *dest++ = ((code >> 12) & 0x3F) | 0x80;
+                               *dest++ = ((code >> 6) & 0x3F) | 0x80;
+                               *dest++ = (code & 0x3F) | 0x80;
+                       } else {
+                               /* Error...  */
+                               *dest++ = '?';
+                               /* *src may be valid. Don't eat it.  */
+                               src--;
+                       }
+
+                       code_high = 0;
+               } else {
+                       if (code <= 0x007F) {
+                               *dest++ = code;
+                       } else if (code <= 0x07FF) {
+                               *dest++ = (code >> 6) | 0xC0;
+                               *dest++ = (code & 0x3F) | 0x80;
+                       } else if (code >= 0xD800 && code <= 0xDBFF) {
+                               code_high = code;
+                               continue;
+                       } else if (code >= 0xDC00 && code <= 0xDFFF) {
+                               /* Error... */
+                               *dest++ = '?';
+                       } else if (code < 0x10000) {
+                               *dest++ = (code >> 12) | 0xE0;
+                               *dest++ = ((code >> 6) & 0x3F) | 0x80;
+                               *dest++ = (code & 0x3F) | 0x80;
+                       } else {
+                               *dest++ = (code >> 18) | 0xF0;
+                               *dest++ = ((code >> 12) & 0x3F) | 0x80;
+                               *dest++ = ((code >> 6) & 0x3F) | 0x80;
+                               *dest++ = (code & 0x3F) | 0x80;
+                       }
+               }
+       }
+
+       return dest;
+}
index 5ebce4b544daf4a20ec996bb240830ece3e1ed8d..3fc82b87261cba504da576393fb589d769b6eaa1 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include <common.h>
+#include <charset.h>
 #include <efi_loader.h>
 
 static bool console_size_queried;
@@ -138,20 +139,8 @@ static efi_status_t EFIAPI efi_cout_reset(
 
 static void print_unicode_in_utf8(u16 c)
 {
-       char utf8[4] = { 0 };
-       char *b = utf8;
-
-       if (c < 0x80) {
-               *(b++) = c;
-       } else if (c < 0x800) {
-               *(b++) = 192 + c / 64;
-               *(b++) = 128 + c % 64;
-       } else {
-               *(b++) = 224 + c / 4096;
-               *(b++) = 128 + c / 64 % 64;
-               *(b++) = 128 + c % 64;
-       }
-
+       char utf8[MAX_UTF8_PER_UTF16] = { 0 };
+       utf16_to_utf8((u8 *)utf8, &c, 1);
        puts(utf8);
 }
 
index ceb968786e55b692413e384a8f6a47684a46e7df..bd81241e6658d296cfe1a36a379eaeabb8632bed 100644 (file)
@@ -39,6 +39,7 @@ static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)
  * @fdt: Base device tree blob
  * @fdto: Device tree overlay blob
  * @fragment: node offset of the fragment in the overlay
+ * @pathp: pointer which receives the path of the target (or NULL)
  *
  * overlay_get_target() retrieves the target offset in the base
  * device tree of a fragment, no matter how the actual targetting is
@@ -49,37 +50,47 @@ static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)
  *      Negative error code on error
  */
 static int overlay_get_target(const void *fdt, const void *fdto,
-                             int fragment)
+                             int fragment, char const **pathp)
 {
        uint32_t phandle;
-       const char *path;
-       int path_len;
+       const char *path = NULL;
+       int path_len = 0, ret;
 
        /* Try first to do a phandle based lookup */
        phandle = overlay_get_target_phandle(fdto, fragment);
        if (phandle == (uint32_t)-1)
                return -FDT_ERR_BADPHANDLE;
 
-       if (phandle)
-               return fdt_node_offset_by_phandle(fdt, phandle);
+       /* no phandle, try path */
+       if (!phandle) {
+               /* And then a path based lookup */
+               path = fdt_getprop(fdto, fragment, "target-path", &path_len);
+               if (path)
+                       ret = fdt_path_offset(fdt, path);
+               else
+                       ret = path_len;
+       } else
+               ret = fdt_node_offset_by_phandle(fdt, phandle);
 
-       /* And then a path based lookup */
-       path = fdt_getprop(fdto, fragment, "target-path", &path_len);
-       if (!path) {
-               /*
-                * If we haven't found either a target or a
-                * target-path property in a node that contains a
-                * __overlay__ subnode (we wouldn't be called
-                * otherwise), consider it a improperly written
-                * overlay
-                */
-               if (path_len == -FDT_ERR_NOTFOUND)
-                       return -FDT_ERR_BADOVERLAY;
+       /*
+       * If we haven't found either a target or a
+       * target-path property in a node that contains a
+       * __overlay__ subnode (we wouldn't be called
+       * otherwise), consider it a improperly written
+       * overlay
+       */
+       if (ret < 0 && path_len == -FDT_ERR_NOTFOUND)
+               ret = -FDT_ERR_BADOVERLAY;
+
+       /* return on error */
+       if (ret < 0)
+               return ret;
 
-               return path_len;
-       }
+       /* return pointer to path (if available) */
+       if (pathp)
+               *pathp = path ? path : NULL;
 
-       return fdt_path_offset(fdt, path);
+       return ret;
 }
 
 /**
@@ -590,7 +601,7 @@ static int overlay_apply_node(void *fdt, int target,
  *
  * overlay_merge() merges an overlay into its base device tree.
  *
- * This is the final step in the device tree overlay application
+ * This is the next to last step in the device tree overlay application
  * process, when all the phandles have been adjusted and resolved and
  * you just have to merge overlay into the base device tree.
  *
@@ -618,7 +629,7 @@ static int overlay_merge(void *fdt, void *fdto)
                if (overlay < 0)
                        return overlay;
 
-               target = overlay_get_target(fdt, fdto, fragment);
+               target = overlay_get_target(fdt, fdto, fragment, NULL);
                if (target < 0)
                        return target;
 
@@ -630,6 +641,175 @@ static int overlay_merge(void *fdt, void *fdto)
        return 0;
 }
 
+static int get_path_len(const void *fdt, int nodeoffset)
+{
+       int len = 0, namelen;
+       const char *name;
+
+       FDT_CHECK_HEADER(fdt);
+
+       for (;;) {
+               name = fdt_get_name(fdt, nodeoffset, &namelen);
+               if (!name)
+                       return namelen;
+
+               /* root? we're done */
+               if (namelen == 0)
+                       break;
+
+               nodeoffset = fdt_parent_offset(fdt, nodeoffset);
+               if (nodeoffset < 0)
+                       return nodeoffset;
+               len += namelen + 1;
+       }
+
+       /* in case of root pretend it's "/" */
+       if (len == 0)
+               len++;
+       return len;
+}
+
+/**
+ * overlay_symbol_update - Update the symbols of base tree after a merge
+ * @fdt: Base Device Tree blob
+ * @fdto: Device tree overlay blob
+ *
+ * overlay_symbol_update() updates the symbols of the base tree with the
+ * symbols of the applied overlay
+ *
+ * This is the last step in the device tree overlay application
+ * process, allowing the reference of overlay symbols by subsequent
+ * overlay operations.
+ *
+ * returns:
+ *      0 on success
+ *      Negative error code on failure
+ */
+static int overlay_symbol_update(void *fdt, void *fdto)
+{
+       int root_sym, ov_sym, prop, path_len, fragment, target;
+       int len, frag_name_len, ret, rel_path_len;
+       const char *s, *e;
+       const char *path;
+       const char *name;
+       const char *frag_name;
+       const char *rel_path;
+       const char *target_path;
+       char *buf;
+       void *p;
+
+       ov_sym = fdt_subnode_offset(fdto, 0, "__symbols__");
+
+       /* if no overlay symbols exist no problem */
+       if (ov_sym < 0)
+               return 0;
+
+       root_sym = fdt_subnode_offset(fdt, 0, "__symbols__");
+
+       /* it no root symbols exist we should create them */
+       if (root_sym == -FDT_ERR_NOTFOUND)
+               root_sym = fdt_add_subnode(fdt, 0, "__symbols__");
+
+       /* any error is fatal now */
+       if (root_sym < 0)
+               return root_sym;
+
+       /* iterate over each overlay symbol */
+       fdt_for_each_property_offset(prop, fdto, ov_sym) {
+               path = fdt_getprop_by_offset(fdto, prop, &name, &path_len);
+               if (!path)
+                       return path_len;
+
+               /* verify it's a string property (terminated by a single \0) */
+               if (path_len < 1 || memchr(path, '\0', path_len) != &path[path_len - 1])
+                       return -FDT_ERR_BADVALUE;
+
+               /* keep end marker to avoid strlen() */
+               e = path + path_len;
+
+               /* format: /<fragment-name>/__overlay__/<relative-subnode-path> */
+
+               if (*path != '/')
+                       return -FDT_ERR_BADVALUE;
+
+               /* get fragment name first */
+               s = strchr(path + 1, '/');
+               if (!s)
+                       return -FDT_ERR_BADOVERLAY;
+
+               frag_name = path + 1;
+               frag_name_len = s - path - 1;
+
+               /* verify format; safe since "s" lies in \0 terminated prop */
+               len = sizeof("/__overlay__/") - 1;
+               if ((e - s) < len || memcmp(s, "/__overlay__/", len))
+                       return -FDT_ERR_BADOVERLAY;
+
+               rel_path = s + len;
+               rel_path_len = e - rel_path;
+
+               /* find the fragment index in which the symbol lies */
+               ret = fdt_subnode_offset_namelen(fdto, 0, frag_name,
+                                              frag_name_len);
+               /* not found? */
+               if (ret < 0)
+                       return -FDT_ERR_BADOVERLAY;
+               fragment = ret;
+
+               /* an __overlay__ subnode must exist */
+               ret = fdt_subnode_offset(fdto, fragment, "__overlay__");
+               if (ret < 0)
+                       return -FDT_ERR_BADOVERLAY;
+
+               /* get the target of the fragment */
+               ret = overlay_get_target(fdt, fdto, fragment, &target_path);
+               if (ret < 0)
+                       return ret;
+               target = ret;
+
+               /* if we have a target path use */
+               if (!target_path) {
+                       ret = get_path_len(fdt, target);
+                       if (ret < 0)
+                               return ret;
+                       len = ret;
+               } else {
+                       len = strlen(target_path);
+               }
+
+               ret = fdt_setprop_placeholder(fdt, root_sym, name,
+                               len + (len > 1) + rel_path_len + 1, &p);
+               if (ret < 0)
+                       return ret;
+
+               if (!target_path) {
+                       /* again in case setprop_placeholder changed it */
+                       ret = overlay_get_target(fdt, fdto, fragment, &target_path);
+                       if (ret < 0)
+                               return ret;
+                       target = ret;
+               }
+
+               buf = p;
+               if (len > 1) { /* target is not root */
+                       if (!target_path) {
+                               ret = fdt_get_path(fdt, target, buf, len + 1);
+                               if (ret < 0)
+                                       return ret;
+                       } else
+                               memcpy(buf, target_path, len + 1);
+
+               } else
+                       len--;
+
+               buf[len] = '/';
+               memcpy(buf + len + 1, rel_path, rel_path_len);
+               buf[len + 1 + rel_path_len] = '\0';
+       }
+
+       return 0;
+}
+
 int fdt_overlay_apply(void *fdt, void *fdto)
 {
        uint32_t delta = fdt_get_max_phandle(fdt);
@@ -654,6 +834,10 @@ int fdt_overlay_apply(void *fdt, void *fdto)
        if (ret)
                goto err;
 
+       ret = overlay_symbol_update(fdt, fdto);
+       if (ret)
+               goto err;
+
        /*
         * The overlay has been damaged, erase its magic.
         */
index 80a321214153708b85a962a94f38186335c29a20..3dc775261fb1073b14de83e669e4c592c4dfa15f 100644 (file)
@@ -228,8 +228,8 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name)
        return 0;
 }
 
-int fdt_setprop(void *fdt, int nodeoffset, const char *name,
-               const void *val, int len)
+int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
+                           int len, void **prop_data)
 {
        struct fdt_property *prop;
        int err;
@@ -242,8 +242,22 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name,
        if (err)
                return err;
 
+       *prop_data = prop->data;
+       return 0;
+}
+
+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
+               const void *val, int len)
+{
+       void *prop_data;
+       int err;
+
+       err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data);
+       if (err)
+               return err;
+
        if (len)
-               memcpy(prop->data, val, len);
+               memcpy(prop_data, val, len);
        return 0;
 }
 
index 45fb9641206f4f74948c639004e7c8b92958a54e..01adad0ee97b18693cbd90f2b6f19f9b23f6e410 100644 (file)
@@ -115,7 +115,7 @@ int fdt_find_regions(const void *fdt, char * const inc[], int inc_count,
                     struct fdt_region region[], int max_regions,
                     char *path, int path_len, int add_string_tab)
 {
-       int stack[FDT_MAX_DEPTH];
+       int stack[FDT_MAX_DEPTH] = { 0 };
        char *end;
        int nextoffset = 0;
        uint32_t tag;
index f3f9cad18409448fea2ead78a79b1db79be414a9..6af94cb3f755e1915d1bee389d4c0357dbd6cecf 100644 (file)
@@ -1404,6 +1404,37 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name);
 int fdt_setprop(void *fdt, int nodeoffset, const char *name,
                const void *val, int len);
 
+/**
+ * fdt_setprop _placeholder - allocate space for a property
+ * @fdt: pointer to the device tree blob
+ * @nodeoffset: offset of the node whose property to change
+ * @name: name of the property to change
+ * @len: length of the property value
+ * @prop_data: return pointer to property data
+ *
+ * fdt_setprop_placeholer() allocates the named property in the given node.
+ * If the property exists it is resized. In either case a pointer to the
+ * property data is returned.
+ *
+ * This function may insert or delete data from the blob, and will
+ * therefore change the offsets of some existing nodes.
+ *
+ * returns:
+ *     0, on success
+ *     -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
+ *             contain the new property value
+ *     -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
+ *     -FDT_ERR_BADLAYOUT,
+ *     -FDT_ERR_BADMAGIC,
+ *     -FDT_ERR_BADVERSION,
+ *     -FDT_ERR_BADSTATE,
+ *     -FDT_ERR_BADSTRUCTURE,
+ *     -FDT_ERR_BADLAYOUT,
+ *     -FDT_ERR_TRUNCATED, standard meanings
+ */
+int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name,
+                           int len, void **prop_data);
+
 /**
  * fdt_setprop_u32 - set a property to a 32-bit integer
  * @fdt: pointer to the device tree blob
index 3b11bb0c95111f365a1314658743fdc4c62cc486..5b1a8cf4d493a9a492e1b8060d68c7e9ca234fa9 100644 (file)
@@ -8,6 +8,8 @@
 
 %module libfdt
 
+%include <stdint.i>
+
 %{
 #define SWIG_FILE_WITH_INIT
 #include "libfdt.h"
@@ -128,6 +130,23 @@ class Fdt:
         self._fdt = bytearray(data)
         check_err(fdt_check_header(self._fdt));
 
+    def subnode_offset(self, parentoffset, name, quiet=()):
+        """Get the offset of a named subnode
+
+        Args:
+            parentoffset: Offset of the parent node to check
+            name: Name of the required subnode, e.g. 'subnode@1'
+            quiet: Errors to ignore (empty to raise on all errors)
+
+        Returns:
+            The node offset of the found node, if any
+
+        Raises
+            FdtException if there is no node with that name, or other error
+        """
+        return check_err(fdt_subnode_offset(self._fdt, parentoffset, name),
+                         quiet)
+
     def path_offset(self, path, quiet=()):
         """Get the offset for a given path
 
@@ -302,6 +321,47 @@ class Fdt:
             return pdata
         return bytearray(pdata[0])
 
+    def get_phandle(self, nodeoffset):
+        """Get the phandle of a node
+
+        Args:
+            nodeoffset: Node offset to check
+
+        Returns:
+            phandle of node, or 0 if the node has no phandle or another error
+            occurs
+        """
+        return fdt_get_phandle(self._fdt, nodeoffset)
+
+    def parent_offset(self, nodeoffset, quiet=()):
+        """Get the offset of a node's parent
+
+        Args:
+            nodeoffset: Node offset to check
+            quiet: Errors to ignore (empty to raise on all errors)
+
+        Returns:
+            The offset of the parent node, if any
+
+        Raises:
+            FdtException if no parent found or other error occurs
+        """
+        return check_err(fdt_parent_offset(self._fdt, nodeoffset), quiet)
+
+    def node_offset_by_phandle(self, phandle, quiet=()):
+        """Get the offset of a node with the given phandle
+
+        Args:
+            phandle: Phandle to search for
+            quiet: Errors to ignore (empty to raise on all errors)
+
+        Returns:
+            The offset of node with that phandle, if any
+
+        Raises:
+            FdtException if no node found or other error occurs
+        """
+        return check_err(fdt_node_offset_by_phandle(self._fdt, phandle), quiet)
 
 class Property:
     """Holds a device tree property name and value.
index e93a4f5491c3263ae179f6430476996538026328..7f6076909ab7401e802eac798671b79c0515a0b7 100644 (file)
 #include <errno.h>
 #include <linux/ctype.h>
 
+/* from lib/kstrtox.c */
+static const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
+{
+       if (*base == 0) {
+               if (s[0] == '0') {
+                       if (tolower(s[1]) == 'x' && isxdigit(s[2]))
+                               *base = 16;
+                       else
+                               *base = 8;
+               } else
+                       *base = 10;
+       }
+       if (*base == 16 && s[0] == '0' && tolower(s[1]) == 'x')
+               s += 2;
+       return s;
+}
+
 unsigned long simple_strtoul(const char *cp, char **endp,
                                unsigned int base)
 {
        unsigned long result = 0;
        unsigned long value;
 
-       if (*cp == '0') {
-               cp++;
-               if ((*cp == 'x') && isxdigit(cp[1])) {
-                       base = 16;
-                       cp++;
-               }
-
-               if (!base)
-                       base = 8;
-       }
-
-       if (!base)
-               base = 10;
+       cp = _parse_integer_fixup_radix(cp, &base);
 
        while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp)
            ? toupper(*cp) : *cp)-'A'+10) < base) {
@@ -128,19 +133,7 @@ unsigned long long simple_strtoull(const char *cp, char **endp,
 {
        unsigned long long result = 0, value;
 
-       if (*cp == '0') {
-               cp++;
-               if ((*cp == 'x') && isxdigit(cp[1])) {
-                       base = 16;
-                       cp++;
-               }
-
-               if (!base)
-                       base = 8;
-       }
-
-       if (!base)
-               base = 10;
+       cp = _parse_integer_fixup_radix(cp, &base);
 
        while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp - '0'
                : (islower(*cp) ? toupper(*cp) : *cp) - 'A' + 10) < base) {
index 874a2951f7053ef395cfee8ffe78464eee855039..dd572d2868a5453c8cd99326a944f3ee4e20cd25 100644 (file)
@@ -17,6 +17,8 @@
 #include <linux/ctype.h>
 
 #include <common.h>
+#include <charset.h>
+#include <uuid.h>
 
 #include <div64.h>
 #define noinline __attribute__((noinline))
@@ -270,6 +272,26 @@ static char *string(char *buf, char *end, char *s, int field_width,
        return buf;
 }
 
+static char *string16(char *buf, char *end, u16 *s, int field_width,
+               int precision, int flags)
+{
+       u16 *str = s ? s : L"<NULL>";
+       int utf16_len = utf16_strnlen(str, precision);
+       u8 utf8[utf16_len * MAX_UTF8_PER_UTF16];
+       int utf8_len, i;
+
+       utf8_len = utf16_to_utf8(utf8, str, utf16_len) - utf8;
+
+       if (!(flags & LEFT))
+               while (utf8_len < field_width--)
+                       ADDCH(buf, ' ');
+       for (i = 0; i < utf8_len; ++i)
+               ADDCH(buf, utf8[i]);
+       while (utf8_len < field_width--)
+               ADDCH(buf, ' ');
+       return buf;
+}
+
 #ifdef CONFIG_CMD_NET
 static const char hex_asc[] = "0123456789abcdef";
 #define hex_asc_lo(x)  hex_asc[((x) & 0x0f)]
@@ -345,6 +367,40 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr, int field_width,
 }
 #endif
 
+#ifdef CONFIG_LIB_UUID
+/*
+ * This works (roughly) the same way as linux's, but we currently always
+ * print lower-case (ie. we just keep %pUB and %pUL for compat with linux),
+ * mostly just because that is what uuid_bin_to_str() supports.
+ *
+ *   %pUb:   01020304-0506-0708-090a-0b0c0d0e0f10
+ *   %pUl:   04030201-0605-0807-090a-0b0c0d0e0f10
+ */
+static char *uuid_string(char *buf, char *end, u8 *addr, int field_width,
+                        int precision, int flags, const char *fmt)
+{
+       char uuid[UUID_STR_LEN + 1];
+       int str_format = UUID_STR_FORMAT_STD;
+
+       switch (*(++fmt)) {
+       case 'L':
+       case 'l':
+               str_format = UUID_STR_FORMAT_GUID;
+               break;
+       case 'B':
+       case 'b':
+               /* this is the default */
+               break;
+       default:
+               break;
+       }
+
+       uuid_bin_to_str(addr, uuid, str_format);
+
+       return string(buf, end, uuid, field_width, precision, flags);
+}
+#endif
+
 /*
  * Show a '%p' thing.  A kernel extension is that the '%p' is followed
  * by an extra set of alphanumeric characters that are extended format
@@ -378,8 +434,8 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                              flags);
 #endif
 
-#ifdef CONFIG_CMD_NET
        switch (*fmt) {
+#ifdef CONFIG_CMD_NET
        case 'a':
                flags |= SPECIAL | ZEROPAD;
 
@@ -409,8 +465,15 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                                               precision, flags);
                flags &= ~SPECIAL;
                break;
-       }
 #endif
+#ifdef CONFIG_LIB_UUID
+       case 'U':
+               return uuid_string(buf, end, ptr, field_width, precision,
+                                  flags, fmt);
+#endif
+       default:
+               break;
+       }
        flags |= SMALL;
        if (field_width == -1) {
                field_width = 2*sizeof(void *);
@@ -528,8 +591,13 @@ repeat:
                        continue;
 
                case 's':
-                       str = string(str, end, va_arg(args, char *),
-                                    field_width, precision, flags);
+                       if (qualifier == 'l' && !IS_ENABLED(CONFIG_SPL_BUILD)) {
+                               str = string16(str, end, va_arg(args, u16 *),
+                                              field_width, precision, flags);
+                       } else {
+                               str = string(str, end, va_arg(args, char *),
+                                            field_width, precision, flags);
+                       }
                        continue;
 
                case 'p':
index 9ce47b4d22713ff376436acc00ea75e1ad5241c4..2a7ed70cf26b3cd8d72d772d1bb1ae6a6c9f5773 100644 (file)
@@ -321,6 +321,23 @@ $(obj)/%.dtb: $(src)/%.dts FORCE
 
 dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
 
+# DTCO
+# ---------------------------------------------------------------------------
+
+quiet_cmd_dtco = DTCO    $@
+# Rule for objects only; does not put specific u-boot include at the end
+# No generation of assembly file either
+# Modified for U-Boot
+cmd_dtco = mkdir -p $(dir ${dtc-tmp}) ; \
+       $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) - ; \
+       $(DTC) -@ -O dtb -o $@ -b 0 \
+               -i $(dir $<) $(DTC_FLAGS) \
+               -d $(depfile).dtc.tmp $(dtc-tmp) ; \
+       cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
+
+$(obj)/%.dtbo: $(src)/%.dts FORCE
+       $(call if_changed_dep,dtco)
+
 # Fonts
 # ---------------------------------------------------------------------------
 
index dd8065d87d0608113ac338cca94046f967eaae28..b86ea76bab260d15bf6bbdebda75f141b65e6a8c 100644 (file)
@@ -257,14 +257,15 @@ cmd_dtoch = $(pythonpath) $(srctree)/tools/dtoc/dtoc -d $(obj)/$(SPL_BIN).dtb -o
 quiet_cmd_plat = PLAT    $@
 cmd_plat = $(CC) $(c_flags) -c $< -o $@
 
-$(obj)/dts/dt-platdata.o: $(obj)/dts/dt-platdata.c include/generated/dt-structs.h
+$(obj)/dts/dt-platdata.o: $(obj)/dts/dt-platdata.c \
+               include/generated/dt-structs-gen.h
        $(call if_changed,plat)
 
 PHONY += dts_dir
 dts_dir:
        $(shell [ -d $(obj)/dts ] || mkdir -p $(obj)/dts)
 
-include/generated/dt-structs.h: $(obj)/$(SPL_BIN).dtb dts_dir checkdtoc
+include/generated/dt-structs-gen.h: $(obj)/$(SPL_BIN).dtb dts_dir checkdtoc
        $(call if_changed,dtoch)
 
 $(obj)/dts/dt-platdata.c: $(obj)/$(SPL_BIN).dtb dts_dir checkdtoc
index 3afc870f0f2a454c5331cf0076ba2da9170dc747..4142f5c837e21bd912b0770e68cc427c308dec16 100755 (executable)
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl
 # (c) 2001, Dave Jones. (the file handling bit)
 # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
 # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
@@ -6,12 +6,13 @@
 # Licensed under the terms of the GNU GPL License version 2
 
 use strict;
+use warnings;
 use POSIX;
 use File::Basename;
 use Cwd 'abs_path';
+use Term::ANSIColor qw(:constants);
 
 my $P = $0;
-$P =~ s@.*/@@g;
 my $D = dirname(abs_path($P));
 
 my $V = '0.32';
@@ -25,12 +26,17 @@ my $chk_patch = 1;
 my $tst_only;
 my $emacs = 0;
 my $terse = 0;
+my $showfile = 0;
 my $file = 0;
+my $git = 0;
+my %git_commits = ();
 my $check = 0;
+my $check_orig = 0;
 my $summary = 1;
 my $mailback = 0;
 my $summary_file = 0;
 my $show_types = 0;
+my $list_types = 0;
 my $fix = 0;
 my $fix_inplace = 0;
 my $root;
@@ -45,9 +51,14 @@ my $configuration_file = ".checkpatch.conf";
 my $max_line_length = 80;
 my $ignore_perl_version = 0;
 my $minimum_perl_version = 5.10.0;
+my $min_conf_desc_length = 4;
 my $spelling_file = "$D/spelling.txt";
 my $codespell = 0;
 my $codespellfile = "/usr/share/codespell/dictionary.txt";
+my $conststructsfile = "$D/const_structs.checkpatch";
+my $typedefsfile = "";
+my $color = "auto";
+my $allow_c99_comments = 1;
 
 sub help {
        my ($exitcode) = @_;
@@ -63,12 +74,25 @@ Options:
   --patch                    treat FILE as patchfile (default)
   --emacs                    emacs compile window format
   --terse                    one line per report
+  --showfile                 emit diffed file position, not input file position
+  -g, --git                  treat FILE as a single commit or git revision range
+                             single git commit with:
+                               <rev>
+                               <rev>^
+                               <rev>~n
+                             multiple git commits with:
+                               <rev1>..<rev2>
+                               <rev1>...<rev2>
+                               <rev>-<count>
+                             git merges are ignored
   -f, --file                 treat FILE as regular source file
   --subjective, --strict     enable more subjective tests
+  --list-types               list the possible message types
   --types TYPE(,TYPE2...)    show only these comma separated message types
   --ignore TYPE(,TYPE2...)   ignore various comma separated message types
+  --show-types               show the specific message type in the output
   --max-line-length=n        set the maximum line length, if exceeded, warn
-  --show-types               show the message "types" in the output
+  --min-conf-desc-length=n   set the min description length, if shorter, warn
   --root=PATH                PATH to the kernel tree root
   --no-summary               suppress the per-file summary
   --mailback                 only produce a report in case of warnings/errors
@@ -89,8 +113,11 @@ Options:
   --ignore-perl-version      override checking of perl version.  expect
                              runtime errors.
   --codespell                Use the codespell dictionary for spelling/typos
-                             (default:/usr/local/share/codespell/dictionary.txt)
+                             (default:/usr/share/codespell/dictionary.txt)
   --codespellfile            Use this codespell dictionary
+  --typedefsfile             Read additional types from this file
+  --color[=WHEN]             Use colors 'always', 'never', or only when output
+                             is a terminal ('auto'). Default is 'auto'.
   -h, --help, --version      display this help and exit
 
 When FILE is - read standard input.
@@ -99,6 +126,37 @@ EOM
        exit($exitcode);
 }
 
+sub uniq {
+       my %seen;
+       return grep { !$seen{$_}++ } @_;
+}
+
+sub list_types {
+       my ($exitcode) = @_;
+
+       my $count = 0;
+
+       local $/ = undef;
+
+       open(my $script, '<', abs_path($P)) or
+           die "$P: Can't read '$P' $!\n";
+
+       my $text = <$script>;
+       close($script);
+
+       my @types = ();
+       for ($text =~ /\b(?:(?:CHK|WARN|ERROR)\s*\(\s*"([^"]+)")/g) {
+               push (@types, $_);
+       }
+       @types = sort(uniq(@types));
+       print("#\tMessage type\n\n");
+       foreach my $type (@types) {
+               print(++$count . "\t" . $type . "\n");
+       }
+
+       exit($exitcode);
+}
+
 my $conf = which_conf($configuration_file);
 if (-f $conf) {
        my @conf_args;
@@ -125,6 +183,14 @@ if (-f $conf) {
        unshift(@ARGV, @conf_args) if @conf_args;
 }
 
+# Perl's Getopt::Long allows options to take optional arguments after a space.
+# Prevent --color by itself from consuming other arguments
+foreach (@ARGV) {
+       if ($_ eq "--color" || $_ eq "-color") {
+               $_ = "--color=$color";
+       }
+}
+
 GetOptions(
        'q|quiet+'      => \$quiet,
        'tree!'         => \$tree,
@@ -132,13 +198,17 @@ GetOptions(
        'patch!'        => \$chk_patch,
        'emacs!'        => \$emacs,
        'terse!'        => \$terse,
+       'showfile!'     => \$showfile,
        'f|file!'       => \$file,
+       'g|git!'        => \$git,
        'subjective!'   => \$check,
        'strict!'       => \$check,
        'ignore=s'      => \@ignore,
        'types=s'       => \@use,
        'show-types!'   => \$show_types,
+       'list-types!'   => \$list_types,
        'max-line-length=i' => \$max_line_length,
+       'min-conf-desc-length=i' => \$min_conf_desc_length,
        'root=s'        => \$root,
        'summary!'      => \$summary,
        'mailback!'     => \$mailback,
@@ -148,15 +218,22 @@ GetOptions(
        'ignore-perl-version!' => \$ignore_perl_version,
        'debug=s'       => \%debug,
        'test-only=s'   => \$tst_only,
-       'codespell!'    => \$codespell,
-       'codespellfile=s' => \$codespellfile,
+       'codespell!'    => \$codespell,
+       'codespellfile=s'       => \$codespellfile,
+       'typedefsfile=s'        => \$typedefsfile,
+       'color=s'       => \$color,
+       'no-color'      => \$color,     #keep old behaviors of -nocolor
+       'nocolor'       => \$color,     #keep old behaviors of -nocolor
        'h|help'        => \$help,
        'version'       => \$help
 ) or help(1);
 
 help(0) if ($help);
 
+list_types(0) if ($list_types);
+
 $fix = 1 if ($fix_inplace);
+$check_orig = $check;
 
 my $exit = 0;
 
@@ -167,9 +244,21 @@ if ($^V && $^V lt $minimum_perl_version) {
        }
 }
 
+#if no filenames are given, push '-' to read patch from stdin
 if ($#ARGV < 0) {
-       print "$P: no input files\n";
-       exit(1);
+       push(@ARGV, '-');
+}
+
+if ($color =~ /^[01]$/) {
+       $color = !$color;
+} elsif ($color =~ /^always$/i) {
+       $color = 1;
+} elsif ($color =~ /^never$/i) {
+       $color = 0;
+} elsif ($color =~ /^auto$/i) {
+       $color = (-t STDOUT);
+} else {
+       die "Invalid color mode: $color\n";
 }
 
 sub hash_save_array_words {
@@ -192,12 +281,12 @@ sub hash_save_array_words {
 sub hash_show_words {
        my ($hashRef, $prefix) = @_;
 
-       if ($quiet == 0 && keys %$hashRef) {
-               print "NOTE: $prefix message types:";
+       if (keys %$hashRef) {
+               print "\nNOTE: $prefix message types:";
                foreach my $word (sort keys %$hashRef) {
                        print " $word";
                }
-               print "\n\n";
+               print "\n";
        }
 }
 
@@ -257,7 +346,8 @@ our $Sparse = qr{
                        __init_refok|
                        __kprobes|
                        __ref|
-                       __rcu
+                       __rcu|
+                       __private
                }x;
 our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
 our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
@@ -272,7 +362,7 @@ our $Attribute      = qr{
                        __percpu|
                        __nocast|
                        __safe|
-                       __bitwise__|
+                       __bitwise|
                        __packed__|
                        __packed2__|
                        __naked|
@@ -281,6 +371,7 @@ our $Attribute      = qr{
                        __noreturn|
                        __used|
                        __cold|
+                       __pure|
                        __noclone|
                        __deprecated|
                        __read_mostly|
@@ -292,7 +383,7 @@ our $Attribute      = qr{
                        __weak
                  }x;
 our $Modifier;
-our $Inline    = qr{inline|__always_inline|noinline};
+our $Inline    = qr{inline|__always_inline|noinline|__inline|__inline__};
 our $Member    = qr{->$Ident|\.$Ident|\[[^]]*\]};
 our $Lval      = qr{$Ident(?:$Member)*};
 
@@ -300,13 +391,15 @@ our $Int_type     = qr{(?i)llu|ull|ll|lu|ul|l|u};
 our $Binary    = qr{(?i)0b[01]+$Int_type?};
 our $Hex       = qr{(?i)0x[0-9a-f]+$Int_type?};
 our $Int       = qr{[0-9]+$Int_type?};
+our $Octal     = qr{0[0-7]+$Int_type?};
+our $String    = qr{"[X\t]*"};
 our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
 our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
 our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
 our $Float     = qr{$Float_hex|$Float_dec|$Float_int};
-our $Constant  = qr{$Float|$Binary|$Hex|$Int};
+our $Constant  = qr{$Float|$Binary|$Octal|$Hex|$Int};
 our $Assignment        = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
-our $Compare    = qr{<=|>=|==|!=|<|>};
+our $Compare    = qr{<=|>=|==|!=|<|(?<!-)>};
 our $Arithmetic = qr{\+|-|\*|\/|%};
 our $Operators = qr{
                        <=|>=|==|!=|
@@ -314,10 +407,16 @@ our $Operators    = qr{
                        &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
                  }x;
 
+our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
+
+our $BasicType;
 our $NonptrType;
+our $NonptrTypeMisordered;
 our $NonptrTypeWithAttr;
 our $Type;
+our $TypeMisordered;
 our $Declare;
+our $DeclareMisordered;
 
 our $NON_ASCII_UTF8    = qr{
        [\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
@@ -334,19 +433,28 @@ our $UTF8 = qr{
        | $NON_ASCII_UTF8
 }x;
 
-our $typeTypedefs = qr{(?x:
+our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
+our $typeOtherOSTypedefs = qr{(?x:
+       u_(?:char|short|int|long) |          # bsd
+       u(?:nchar|short|int|long)            # sysv
+)};
+our $typeKernelTypedefs = qr{(?x:
        (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
        atomic_t
 )};
+our $typeTypedefs = qr{(?x:
+       $typeC99Typedefs\b|
+       $typeOtherOSTypedefs\b|
+       $typeKernelTypedefs\b
+)};
+
+our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
 
 our $logFunctions = qr{(?x:
-       printk(?:_ratelimited|_once|)|
+       printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
        (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
        WARN(?:_RATELIMIT|_ONCE|)|
        panic|
-       debug|
-       printf|
-       puts|
        MODULE_[A-Z_]+|
        seq_vprintf|seq_printf|seq_puts
 )};
@@ -362,16 +470,36 @@ our $signature_tags = qr{(?xi:
        Cc:
 )};
 
+our @typeListMisordered = (
+       qr{char\s+(?:un)?signed},
+       qr{int\s+(?:(?:un)?signed\s+)?short\s},
+       qr{int\s+short(?:\s+(?:un)?signed)},
+       qr{short\s+int(?:\s+(?:un)?signed)},
+       qr{(?:un)?signed\s+int\s+short},
+       qr{short\s+(?:un)?signed},
+       qr{long\s+int\s+(?:un)?signed},
+       qr{int\s+long\s+(?:un)?signed},
+       qr{long\s+(?:un)?signed\s+int},
+       qr{int\s+(?:un)?signed\s+long},
+       qr{int\s+(?:un)?signed},
+       qr{int\s+long\s+long\s+(?:un)?signed},
+       qr{long\s+long\s+int\s+(?:un)?signed},
+       qr{long\s+long\s+(?:un)?signed\s+int},
+       qr{long\s+long\s+(?:un)?signed},
+       qr{long\s+(?:un)?signed},
+);
+
 our @typeList = (
        qr{void},
-       qr{(?:unsigned\s+)?char},
-       qr{(?:unsigned\s+)?short},
-       qr{(?:unsigned\s+)?int},
-       qr{(?:unsigned\s+)?long},
-       qr{(?:unsigned\s+)?long\s+int},
-       qr{(?:unsigned\s+)?long\s+long},
-       qr{(?:unsigned\s+)?long\s+long\s+int},
-       qr{unsigned},
+       qr{(?:(?:un)?signed\s+)?char},
+       qr{(?:(?:un)?signed\s+)?short\s+int},
+       qr{(?:(?:un)?signed\s+)?short},
+       qr{(?:(?:un)?signed\s+)?int},
+       qr{(?:(?:un)?signed\s+)?long\s+int},
+       qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
+       qr{(?:(?:un)?signed\s+)?long\s+long},
+       qr{(?:(?:un)?signed\s+)?long},
+       qr{(?:un)?signed},
        qr{float},
        qr{double},
        qr{bool},
@@ -381,7 +509,31 @@ our @typeList = (
        qr{${Ident}_t},
        qr{${Ident}_handler},
        qr{${Ident}_handler_fn},
+       @typeListMisordered,
 );
+
+our $C90_int_types = qr{(?x:
+       long\s+long\s+int\s+(?:un)?signed|
+       long\s+long\s+(?:un)?signed\s+int|
+       long\s+long\s+(?:un)?signed|
+       (?:(?:un)?signed\s+)?long\s+long\s+int|
+       (?:(?:un)?signed\s+)?long\s+long|
+       int\s+long\s+long\s+(?:un)?signed|
+       int\s+(?:(?:un)?signed\s+)?long\s+long|
+
+       long\s+int\s+(?:un)?signed|
+       long\s+(?:un)?signed\s+int|
+       long\s+(?:un)?signed|
+       (?:(?:un)?signed\s+)?long\s+int|
+       (?:(?:un)?signed\s+)?long|
+       int\s+long\s+(?:un)?signed|
+       int\s+(?:(?:un)?signed\s+)?long|
+
+       int\s+(?:un)?signed|
+       (?:(?:un)?signed\s+)?int
+)};
+
+our @typeListFile = ();
 our @typeListWithAttr = (
        @typeList,
        qr{struct\s+$InitAttribute\s+$Ident},
@@ -391,10 +543,67 @@ our @typeListWithAttr = (
 our @modifierList = (
        qr{fastcall},
 );
+our @modifierListFile = ();
+
+our @mode_permission_funcs = (
+       ["module_param", 3],
+       ["module_param_(?:array|named|string)", 4],
+       ["module_param_array_named", 5],
+       ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
+       ["proc_create(?:_data|)", 2],
+       ["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
+       ["IIO_DEV_ATTR_[A-Z_]+", 1],
+       ["SENSOR_(?:DEVICE_|)ATTR_2", 2],
+       ["SENSOR_TEMPLATE(?:_2|)", 3],
+       ["__ATTR", 2],
+);
+
+#Create a search pattern for all these functions to speed up a loop below
+our $mode_perms_search = "";
+foreach my $entry (@mode_permission_funcs) {
+       $mode_perms_search .= '|' if ($mode_perms_search ne "");
+       $mode_perms_search .= $entry->[0];
+}
+
+our $mode_perms_world_writable = qr{
+       S_IWUGO         |
+       S_IWOTH         |
+       S_IRWXUGO       |
+       S_IALLUGO       |
+       0[0-7][0-7][2367]
+}x;
+
+our %mode_permission_string_types = (
+       "S_IRWXU" => 0700,
+       "S_IRUSR" => 0400,
+       "S_IWUSR" => 0200,
+       "S_IXUSR" => 0100,
+       "S_IRWXG" => 0070,
+       "S_IRGRP" => 0040,
+       "S_IWGRP" => 0020,
+       "S_IXGRP" => 0010,
+       "S_IRWXO" => 0007,
+       "S_IROTH" => 0004,
+       "S_IWOTH" => 0002,
+       "S_IXOTH" => 0001,
+       "S_IRWXUGO" => 0777,
+       "S_IRUGO" => 0444,
+       "S_IWUGO" => 0222,
+       "S_IXUGO" => 0111,
+);
+
+#Create a search pattern for all these strings to speed up a loop below
+our $mode_perms_string_search = "";
+foreach my $entry (keys %mode_permission_string_types) {
+       $mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
+       $mode_perms_string_search .= $entry;
+}
 
 our $allowed_asm_includes = qr{(?x:
        irq|
-       memory
+       memory|
+       time|
+       reboot
 )};
 # memory.h: ARM has a custom one
 
@@ -447,12 +656,54 @@ if ($codespell) {
 
 $misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
 
+sub read_words {
+       my ($wordsRef, $file) = @_;
+
+       if (open(my $words, '<', $file)) {
+               while (<$words>) {
+                       my $line = $_;
+
+                       $line =~ s/\s*\n?$//g;
+                       $line =~ s/^\s*//g;
+
+                       next if ($line =~ m/^\s*#/);
+                       next if ($line =~ m/^\s*$/);
+                       if ($line =~ /\s/) {
+                               print("$file: '$line' invalid - ignored\n");
+                               next;
+                       }
+
+                       $$wordsRef .= '|' if ($$wordsRef ne "");
+                       $$wordsRef .= $line;
+               }
+               close($file);
+               return 1;
+       }
+
+       return 0;
+}
+
+my $const_structs = "";
+read_words(\$const_structs, $conststructsfile)
+    or warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
+
+my $typeOtherTypedefs = "";
+if (length($typedefsfile)) {
+       read_words(\$typeOtherTypedefs, $typedefsfile)
+           or warn "No additional types will be considered - file '$typedefsfile': $!\n";
+}
+$typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne "");
 
 sub build_types {
-       my $mods = "(?x:  \n" . join("|\n  ", @modifierList) . "\n)";
-       my $all = "(?x:  \n" . join("|\n  ", @typeList) . "\n)";
+       my $mods = "(?x:  \n" . join("|\n  ", (@modifierList, @modifierListFile)) . "\n)";
+       my $all = "(?x:  \n" . join("|\n  ", (@typeList, @typeListFile)) . "\n)";
+       my $Misordered = "(?x:  \n" . join("|\n  ", @typeListMisordered) . "\n)";
        my $allWithAttr = "(?x:  \n" . join("|\n  ", @typeListWithAttr) . "\n)";
        $Modifier       = qr{(?:$Attribute|$Sparse|$mods)};
+       $BasicType      = qr{
+                               (?:$typeTypedefs\b)|
+                               (?:${all}\b)
+               }x;
        $NonptrType     = qr{
                        (?:$Modifier\s+|const\s+)*
                        (?:
@@ -462,6 +713,13 @@ sub build_types {
                        )
                        (?:\s+$Modifier|\s+const)*
                  }x;
+       $NonptrTypeMisordered   = qr{
+                       (?:$Modifier\s+|const\s+)*
+                       (?:
+                               (?:${Misordered}\b)
+                       )
+                       (?:\s+$Modifier|\s+const)*
+                 }x;
        $NonptrTypeWithAttr     = qr{
                        (?:$Modifier\s+|const\s+)*
                        (?:
@@ -473,10 +731,16 @@ sub build_types {
                  }x;
        $Type   = qr{
                        $NonptrType
-                       (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)?
+                       (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
+                       (?:\s+$Inline|\s+$Modifier)*
+                 }x;
+       $TypeMisordered = qr{
+                       $NonptrTypeMisordered
+                       (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
                        (?:\s+$Inline|\s+$Modifier)*
                  }x;
-       $Declare        = qr{(?:$Storage\s+)?$Type};
+       $Declare        = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
+       $DeclareMisordered      = qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
 }
 build_types();
 
@@ -487,15 +751,26 @@ our $Typecast     = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
 # Any use must be runtime checked with $^V
 
 our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
-our $LvalOrFunc        = qr{($Lval)\s*($balanced_parens{0,1})\s*};
-our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
+our $LvalOrFunc        = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
+our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
+
+our $declaration_macros = qr{(?x:
+       (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
+       (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
+       (?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(
+)};
 
 sub deparenthesize {
        my ($string) = @_;
        return "" if (!defined($string));
-       $string =~ s@^\s*\(\s*@@g;
-       $string =~ s@\s*\)\s*$@@g;
+
+       while ($string =~ /^\s*\(.*\)\s*$/) {
+               $string =~ s@^\s*\(\s*@@;
+               $string =~ s@\s*\)\s*$@@;
+       }
+
        $string =~ s@\s+@ @g;
+
        return $string;
 }
 
@@ -525,6 +800,16 @@ sub seed_camelcase_file {
        }
 }
 
+sub is_maintained_obsolete {
+       my ($filename) = @_;
+
+       return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
+
+       my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
+
+       return $status =~ /obsolete/i;
+}
+
 my $camelcase_seeded = 0;
 sub seed_camelcase_includes {
        return if ($camelcase_seeded);
@@ -583,17 +868,82 @@ sub seed_camelcase_includes {
        }
 }
 
+sub git_commit_info {
+       my ($commit, $id, $desc) = @_;
+
+       return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
+
+       my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
+       $output =~ s/^\s*//gm;
+       my @lines = split("\n", $output);
+
+       return ($id, $desc) if ($#lines < 0);
+
+       if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
+# Maybe one day convert this block of bash into something that returns
+# all matching commit ids, but it's very slow...
+#
+#              echo "checking commits $1..."
+#              git rev-list --remotes | grep -i "^$1" |
+#              while read line ; do
+#                  git log --format='%H %s' -1 $line |
+#                  echo "commit $(cut -c 1-12,41-)"
+#              done
+       } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
+               $id = undef;
+       } else {
+               $id = substr($lines[0], 0, 12);
+               $desc = substr($lines[0], 41);
+       }
+
+       return ($id, $desc);
+}
+
 $chk_signoff = 0 if ($file);
 
 my @rawlines = ();
 my @lines = ();
 my @fixed = ();
-my $vname;
+my @fixed_inserted = ();
+my @fixed_deleted = ();
 my $fixlinenr = -1;
 
+# If input is git commits, extract all commits from the commit expressions.
+# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
+die "$P: No git repository found\n" if ($git && !-e ".git");
+
+if ($git) {
+       my @commits = ();
+       foreach my $commit_expr (@ARGV) {
+               my $git_range;
+               if ($commit_expr =~ m/^(.*)-(\d+)$/) {
+                       $git_range = "-$2 $1";
+               } elsif ($commit_expr =~ m/\.\./) {
+                       $git_range = "$commit_expr";
+               } else {
+                       $git_range = "-1 $commit_expr";
+               }
+               my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
+               foreach my $line (split(/\n/, $lines)) {
+                       $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
+                       next if (!defined($1) || !defined($2));
+                       my $sha1 = $1;
+                       my $subject = $2;
+                       unshift(@commits, $sha1);
+                       $git_commits{$sha1} = $subject;
+               }
+       }
+       die "$P: no git commits after extraction!\n" if (@commits == 0);
+       @ARGV = @commits;
+}
+
+my $vname;
 for my $filename (@ARGV) {
        my $FILE;
-       if ($file) {
+       if ($git) {
+               open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
+                       die "$P: $filename: git format-patch failed - $!\n";
+       } elsif ($file) {
                open($FILE, '-|', "diff -u /dev/null $filename") ||
                        die "$P: $filename: diff failed - $!\n";
        } elsif ($filename eq '-') {
@@ -604,6 +954,8 @@ for my $filename (@ARGV) {
        }
        if ($filename eq '-') {
                $vname = 'Your patch';
+       } elsif ($git) {
+               $vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
        } else {
                $vname = $filename;
        }
@@ -612,12 +964,45 @@ for my $filename (@ARGV) {
                push(@rawlines, $_);
        }
        close($FILE);
+
+       if ($#ARGV > 0 && $quiet == 0) {
+               print '-' x length($vname) . "\n";
+               print "$vname\n";
+               print '-' x length($vname) . "\n";
+       }
+
        if (!process($filename)) {
                $exit = 1;
        }
        @rawlines = ();
        @lines = ();
        @fixed = ();
+       @fixed_inserted = ();
+       @fixed_deleted = ();
+       $fixlinenr = -1;
+       @modifierListFile = ();
+       @typeListFile = ();
+       build_types();
+}
+
+if (!$quiet) {
+       hash_show_words(\%use_type, "Used");
+       hash_show_words(\%ignore_type, "Ignored");
+
+       if ($^V lt 5.10.0) {
+               print << "EOM"
+
+NOTE: perl $^V is not modern enough to detect all possible issues.
+      An upgrade to at least perl v5.10.0 is suggested.
+EOM
+       }
+       if ($exit) {
+               print << "EOM"
+
+NOTE: If any of the errors are false positives, please report
+      them to the maintainer, see CHECKPATCH in MAINTAINERS.
+EOM
+       }
 }
 
 exit($exit);
@@ -709,6 +1094,18 @@ sub format_email {
        return $formatted_email;
 }
 
+sub which {
+       my ($bin) = @_;
+
+       foreach my $path (split(/:/, $ENV{PATH})) {
+               if (-e "$path/$bin") {
+                       return "$path/$bin";
+               }
+       }
+
+       return "";
+}
+
 sub which_conf {
        my ($conf) = @_;
 
@@ -855,13 +1252,18 @@ sub sanitise_line {
                $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
        }
 
+       if ($allow_c99_comments && $res =~ m@(//.*$)@) {
+               my $match = $1;
+               $res =~ s/\Q$match\E/"$;" x length($match)/e;
+       }
+
        return $res;
 }
 
 sub get_quoted_string {
        my ($line, $rawline) = @_;
 
-       return "" if ($line !~ m/(\"[X]+\")/g);
+       return "" if ($line !~ m/($String)/g);
        return substr($rawline, $-[0], $+[0] - $-[0]);
 }
 
@@ -1470,13 +1872,13 @@ sub possible {
                        for my $modifier (split(' ', $possible)) {
                                if ($modifier !~ $notPermitted) {
                                        warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
-                                       push(@modifierList, $modifier);
+                                       push(@modifierListFile, $modifier);
                                }
                        }
 
                } else {
                        warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
-                       push(@typeList, $possible);
+                       push(@typeListFile, $possible);
                }
                build_types();
        } else {
@@ -1487,34 +1889,144 @@ sub possible {
 my $prefix = '';
 
 sub show_type {
-       return defined $use_type{$_[0]} if (scalar keys %use_type > 0);
+       my ($type) = @_;
+
+       $type =~ tr/[a-z]/[A-Z]/;
 
-       return !defined $ignore_type{$_[0]};
+       return defined $use_type{$type} if (scalar keys %use_type > 0);
+
+       return !defined $ignore_type{$type};
 }
 
 sub report {
-       if (!show_type($_[1]) ||
-           (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) {
+       my ($level, $type, $msg) = @_;
+
+       if (!show_type($type) ||
+           (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
                return 0;
        }
-       my $line;
+       my $output = '';
+       if ($color) {
+               if ($level eq 'ERROR') {
+                       $output .= RED;
+               } elsif ($level eq 'WARNING') {
+                       $output .= YELLOW;
+               } else {
+                       $output .= GREEN;
+               }
+       }
+       $output .= $prefix . $level . ':';
        if ($show_types) {
-               $line = "$prefix$_[0]:$_[1]: $_[2]\n";
-       } else {
-               $line = "$prefix$_[0]: $_[2]\n";
+               $output .= BLUE if ($color);
+               $output .= "$type:";
+       }
+       $output .= RESET if ($color);
+       $output .= ' ' . $msg . "\n";
+
+       if ($showfile) {
+               my @lines = split("\n", $output, -1);
+               splice(@lines, 1, 1);
+               $output = join("\n", @lines);
        }
-       $line = (split('\n', $line))[0] . "\n" if ($terse);
+       $output = (split('\n', $output))[0] . "\n" if ($terse);
 
-       push(our @report, $line);
+       push(our @report, $output);
 
        return 1;
 }
+
 sub report_dump {
        our @report;
 }
 
+sub fixup_current_range {
+       my ($lineRef, $offset, $length) = @_;
+
+       if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
+               my $o = $1;
+               my $l = $2;
+               my $no = $o + $offset;
+               my $nl = $l + $length;
+               $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
+       }
+}
+
+sub fix_inserted_deleted_lines {
+       my ($linesRef, $insertedRef, $deletedRef) = @_;
+
+       my $range_last_linenr = 0;
+       my $delta_offset = 0;
+
+       my $old_linenr = 0;
+       my $new_linenr = 0;
+
+       my $next_insert = 0;
+       my $next_delete = 0;
+
+       my @lines = ();
+
+       my $inserted = @{$insertedRef}[$next_insert++];
+       my $deleted = @{$deletedRef}[$next_delete++];
+
+       foreach my $old_line (@{$linesRef}) {
+               my $save_line = 1;
+               my $line = $old_line;   #don't modify the array
+               if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {      #new filename
+                       $delta_offset = 0;
+               } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) {    #new hunk
+                       $range_last_linenr = $new_linenr;
+                       fixup_current_range(\$line, $delta_offset, 0);
+               }
+
+               while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
+                       $deleted = @{$deletedRef}[$next_delete++];
+                       $save_line = 0;
+                       fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
+               }
+
+               while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
+                       push(@lines, ${$inserted}{'LINE'});
+                       $inserted = @{$insertedRef}[$next_insert++];
+                       $new_linenr++;
+                       fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
+               }
+
+               if ($save_line) {
+                       push(@lines, $line);
+                       $new_linenr++;
+               }
+
+               $old_linenr++;
+       }
+
+       return @lines;
+}
+
+sub fix_insert_line {
+       my ($linenr, $line) = @_;
+
+       my $inserted = {
+               LINENR => $linenr,
+               LINE => $line,
+       };
+       push(@fixed_inserted, $inserted);
+}
+
+sub fix_delete_line {
+       my ($linenr, $line) = @_;
+
+       my $deleted = {
+               LINENR => $linenr,
+               LINE => $line,
+       };
+
+       push(@fixed_deleted, $deleted);
+}
+
 sub ERROR {
-       if (report("ERROR", $_[0], $_[1])) {
+       my ($type, $msg) = @_;
+
+       if (report("ERROR", $type, $msg)) {
                our $clean = 0;
                our $cnt_error++;
                return 1;
@@ -1522,7 +2034,9 @@ sub ERROR {
        return 0;
 }
 sub WARN {
-       if (report("WARNING", $_[0], $_[1])) {
+       my ($type, $msg) = @_;
+
+       if (report("WARNING", $type, $msg)) {
                our $clean = 0;
                our $cnt_warn++;
                return 1;
@@ -1530,7 +2044,9 @@ sub WARN {
        return 0;
 }
 sub CHK {
-       if ($check && report("CHECK", $_[0], $_[1])) {
+       my ($type, $msg) = @_;
+
+       if ($check && report("CHECK", $type, $msg)) {
                our $clean = 0;
                our $cnt_chk++;
                return 1;
@@ -1640,7 +2156,7 @@ sub pos_last_openparen {
                }
        }
 
-       return $last_openparen + 1;
+       return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
 }
 
 sub process {
@@ -1660,12 +2176,18 @@ sub process {
        our $clean = 1;
        my $signoff = 0;
        my $is_patch = 0;
-
-       my $in_header_lines = 1;
+       my $in_header_lines = $file ? 0 : 1;
        my $in_commit_log = 0;          #Scanning lines before patch
-
+       my $has_commit_log = 0;         #Encountered lines before patch
+       my $commit_log_possible_stack_dump = 0;
+       my $commit_log_long_line = 0;
+       my $commit_log_has_diff = 0;
+       my $reported_maintainer_file = 0;
        my $non_utf8_charset = 0;
 
+       my $last_blank_line = 0;
+       my $last_coalesced_string_linenr = -1;
+
        our @report = ();
        our $cnt_lines = 0;
        our $cnt_error = 0;
@@ -1677,6 +2199,7 @@ sub process {
        my $realline = 0;
        my $realcnt = 0;
        my $here = '';
+       my $context_function;           #undef'd unless there's a known function
        my $in_comment = 0;
        my $comment_edge = 0;
        my $first_line = 0;
@@ -1710,12 +2233,12 @@ sub process {
 
                if ($rawline=~/^\+\+\+\s+(\S+)/) {
                        $setup_docs = 0;
-                       if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
+                       if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) {
                                $setup_docs = 1;
                        }
                        #next;
                }
-               if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
+               if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
                        $realline=$1-1;
                        if (defined $2) {
                                $realcnt=$3+1;
@@ -1783,15 +2306,19 @@ sub process {
 
        $realcnt = 0;
        $linenr = 0;
+       $fixlinenr = -1;
        foreach my $line (@lines) {
                $linenr++;
+               $fixlinenr++;
                my $sline = $line;      #copy of $line
                $sline =~ s/$;/ /g;     #with comments as spaces
 
                my $rawline = $rawlines[$linenr - 1];
 
 #extract the line range in the file after the patch is applied
-               if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
+               if (!$in_commit_log &&
+                   $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
+                       my $context = $4;
                        $is_patch = 1;
                        $first_line = $linenr + 1;
                        $realline=$1-1;
@@ -1807,6 +2334,11 @@ sub process {
                        %suppress_whiletrailers = ();
                        %suppress_export = ();
                        $suppress_statement = 0;
+                       if ($context =~ /\b(\w+)\s*\(/) {
+                               $context_function = $1;
+                       } else {
+                               undef $context_function;
+                       }
                        next;
 
 # track the line number as we move through the hunk, note that
@@ -1832,18 +2364,16 @@ sub process {
 
                my $hunk_line = ($realcnt != 0);
 
-#make up the handle for any error we report on this line
-               $prefix = "$filename:$realline: " if ($emacs && $file);
-               $prefix = "$filename:$linenr: " if ($emacs && !$file);
-
                $here = "#$linenr: " if (!$file);
                $here = "#$realline: " if ($file);
 
+               my $found_file = 0;
                # extract the filename as it passes
                if ($line =~ /^diff --git.*?(\S+)$/) {
                        $realfile = $1;
                        $realfile =~ s@^([^/]*)/@@ if (!$file);
                        $in_commit_log = 0;
+                       $found_file = 1;
                } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
                        $realfile = $1;
                        $realfile =~ s@^([^/]*)/@@ if (!$file);
@@ -1860,6 +2390,30 @@ sub process {
                                ERROR("MODIFIED_INCLUDE_ASM",
                                      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
                        }
+                       $found_file = 1;
+               }
+
+#make up the handle for any error we report on this line
+               if ($showfile) {
+                       $prefix = "$realfile:$realline: "
+               } elsif ($emacs) {
+                       if ($file) {
+                               $prefix = "$filename:$realline: ";
+                       } else {
+                               $prefix = "$filename:$linenr: ";
+                       }
+               }
+
+               if ($found_file) {
+                       if (is_maintained_obsolete($realfile)) {
+                               WARN("OBSOLETE",
+                                    "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.\n");
+                       }
+                       if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
+                               $check = 1;
+                       } else {
+                               $check = $check_orig;
+                       }
                        next;
                }
 
@@ -1871,6 +2425,17 @@ sub process {
 
                $cnt_lines++ if ($realcnt != 0);
 
+# Check if the commit log has what seems like a diff which can confuse patch
+               if ($in_commit_log && !$commit_log_has_diff &&
+                   (($line =~ m@^\s+diff\b.*a/[\w/]+@ &&
+                     $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) ||
+                    $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
+                    $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
+                       ERROR("DIFF_IN_COMMIT_MSG",
+                             "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
+                       $commit_log_has_diff = 1;
+               }
+
 # Check for incorrect file permissions
                if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
                        my $permhere = $here . "FILE: $realfile\n";
@@ -1887,6 +2452,12 @@ sub process {
                        $in_commit_log = 0;
                }
 
+# Check if MAINTAINERS is being updated.  If so, there's probably no need to
+# emit the "does MAINTAINERS need updating?" message on file add/move/delete
+               if ($line =~ /^\s*MAINTAINERS\s*\|/) {
+                       $reported_maintainer_file = 1;
+               }
+
 # Check signature styles
                if (!$in_header_lines &&
                    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
@@ -1904,7 +2475,7 @@ sub process {
                                if (WARN("BAD_SIGN_OFF",
                                         "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
                                    $fix) {
-                                       $fixed[$linenr - 1] =
+                                       $fixed[$fixlinenr] =
                                            "$ucfirst_sign_off $email";
                                }
                        }
@@ -1912,7 +2483,7 @@ sub process {
                                if (WARN("BAD_SIGN_OFF",
                                         "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
                                    $fix) {
-                                       $fixed[$linenr - 1] =
+                                       $fixed[$fixlinenr] =
                                            "$ucfirst_sign_off $email";
                                }
 
@@ -1921,7 +2492,7 @@ sub process {
                                if (WARN("BAD_SIGN_OFF",
                                         "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
                                    $fix) {
-                                       $fixed[$linenr - 1] =
+                                       $fixed[$fixlinenr] =
                                            "$ucfirst_sign_off $email";
                                }
                        }
@@ -1957,6 +2528,127 @@ sub process {
                        }
                }
 
+# Check email subject for common tools that don't need to be mentioned
+               if ($in_header_lines &&
+                   $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
+                       WARN("EMAIL_SUBJECT",
+                            "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
+               }
+
+# Check for old stable address
+               if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {
+                       ERROR("STABLE_ADDRESS",
+                             "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
+               }
+
+# Check for unwanted Gerrit info
+               if ($in_commit_log && $line =~ /^\s*change-id:/i) {
+                       ERROR("GERRIT_CHANGE_ID",
+                             "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
+               }
+
+# Check if the commit log is in a possible stack dump
+               if ($in_commit_log && !$commit_log_possible_stack_dump &&
+                   ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
+                    $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
+                                       # timestamp
+                    $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/)) {
+                                       # stack dump address
+                       $commit_log_possible_stack_dump = 1;
+               }
+
+# Check for line lengths > 75 in commit log, warn once
+               if ($in_commit_log && !$commit_log_long_line &&
+                   length($line) > 75 &&
+                   !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
+                                       # file delta changes
+                     $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
+                                       # filename then :
+                     $line =~ /^\s*(?:Fixes:|Link:)/i ||
+                                       # A Fixes: or Link: line
+                     $commit_log_possible_stack_dump)) {
+                       WARN("COMMIT_LOG_LONG_LINE",
+                            "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
+                       $commit_log_long_line = 1;
+               }
+
+# Reset possible stack dump if a blank line is found
+               if ($in_commit_log && $commit_log_possible_stack_dump &&
+                   $line =~ /^\s*$/) {
+                       $commit_log_possible_stack_dump = 0;
+               }
+
+# Check for git id commit length and improperly formed commit descriptions
+               if ($in_commit_log && !$commit_log_possible_stack_dump &&
+                   $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
+                   $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
+                   ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
+                    ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
+                     $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
+                     $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
+                       my $init_char = "c";
+                       my $orig_commit = "";
+                       my $short = 1;
+                       my $long = 0;
+                       my $case = 1;
+                       my $space = 1;
+                       my $hasdesc = 0;
+                       my $hasparens = 0;
+                       my $id = '0123456789ab';
+                       my $orig_desc = "commit description";
+                       my $description = "";
+
+                       if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
+                               $init_char = $1;
+                               $orig_commit = lc($2);
+                       } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
+                               $orig_commit = lc($1);
+                       }
+
+                       $short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
+                       $long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
+                       $space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
+                       $case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
+                       if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
+                               $orig_desc = $1;
+                               $hasparens = 1;
+                       } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
+                                defined $rawlines[$linenr] &&
+                                $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
+                               $orig_desc = $1;
+                               $hasparens = 1;
+                       } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
+                                defined $rawlines[$linenr] &&
+                                $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
+                               $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
+                               $orig_desc = $1;
+                               $rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
+                               $orig_desc .= " " . $1;
+                               $hasparens = 1;
+                       }
+
+                       ($id, $description) = git_commit_info($orig_commit,
+                                                             $id, $orig_desc);
+
+                       if (defined($id) &&
+                          ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
+                               ERROR("GIT_COMMIT_ID",
+                                     "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
+                       }
+               }
+
+# Check for added, moved or deleted files
+               if (!$reported_maintainer_file && !$in_commit_log &&
+                   ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
+                    $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
+                    ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
+                     (defined($1) || defined($2))))) {
+                       $is_patch = 1;
+                       $reported_maintainer_file = 1;
+                       WARN("FILE_PATH_CHANGES",
+                            "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
+               }
+
 # Check for wrappage within a valid hunk of the file
                if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
                        ERROR("CORRUPTED_PATCH",
@@ -1964,20 +2656,6 @@ sub process {
                                $herecurr) if (!$emitted_corrupt++);
                }
 
-# Check for absolute kernel paths.
-               if ($tree) {
-                       while ($line =~ m{(?:^|\s)(/\S*)}g) {
-                               my $file = $1;
-
-                               if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
-                                   check_absolute_file($1, $herecurr)) {
-                                       #
-                               } else {
-                                       check_absolute_file($file, $herecurr);
-                               }
-                       }
-               }
-
 # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
                if (($realfile =~ /^$/ || $line =~ /^\+/) &&
                    $rawline !~ m/^$UTF8*$/) {
@@ -1994,9 +2672,11 @@ sub process {
 # Check if it's the start of a commit log
 # (not a header line and we haven't seen the patch filename)
                if ($in_header_lines && $realfile =~ /^$/ &&
-                   $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {
+                   !($rawline =~ /^\s+(?:\S|$)/ ||
+                     $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
                        $in_header_lines = 0;
                        $in_commit_log = 1;
+                       $has_commit_log = 1;
                }
 
 # Check if there is UTF-8 in a commit log when a mail header has explicitly
@@ -2013,6 +2693,20 @@ sub process {
                            "8-bit UTF-8 used in possible commit log\n" . $herecurr);
                }
 
+# Check for absolute kernel paths in commit message
+               if ($tree && $in_commit_log) {
+                       while ($line =~ m{(?:^|\s)(/\S*)}g) {
+                               my $file = $1;
+
+                               if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
+                                   check_absolute_file($1, $herecurr)) {
+                                       #
+                               } else {
+                                       check_absolute_file($file, $herecurr);
+                               }
+                       }
+               }
+
 # Check for various typo / spelling mistakes
                if (defined($misspellings) &&
                    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
@@ -2040,14 +2734,14 @@ sub process {
                        if (ERROR("DOS_LINE_ENDINGS",
                                  "DOS line endings\n" . $herevet) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/[\s\015]+$//;
+                               $fixed[$fixlinenr] =~ s/[\s\015]+$//;
                        }
                } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
                        my $herevet = "$here\n" . cat_vet($rawline) . "\n";
                        if (ERROR("TRAILING_WHITESPACE",
                                  "trailing whitespace\n" . $herevet) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/\s+$//;
+                               $fixed[$fixlinenr] =~ s/\s+$//;
                        }
 
                        $rpt_cleaners = 1;
@@ -2055,6 +2749,7 @@ sub process {
 
 # Check for FSF mailing addresses.
                if ($rawline =~ /\bwrite to the Free/i ||
+                   $rawline =~ /\b675\s+Mass\s+Ave/i ||
                    $rawline =~ /\b59\s+Temple\s+Pl/i ||
                    $rawline =~ /\b51\s+Franklin\s+St/i) {
                        my $herevet = "$here\n" . cat_vet($rawline) . "\n";
@@ -2068,7 +2763,7 @@ sub process {
 # Only applies when adding the entry originally, after that we do not have
 # sufficient context to determine whether it is indeed long enough.
                if ($realfile =~ /Kconfig/ &&
-                   $line =~ /.\s*config\s+/) {
+                   $line =~ /^\+\s*config\s+/) {
                        my $length = 0;
                        my $cnt = $realcnt;
                        my $ln = $linenr + 1;
@@ -2081,10 +2776,11 @@ sub process {
                                $is_end = $lines[$ln - 1] =~ /^\+/;
 
                                next if ($f =~ /^-/);
+                               last if (!$file && $f =~ /^\@\@/);
 
-                               if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
+                               if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate)\s*\"/) {
                                        $is_start = 1;
-                               } elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
+                               } elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
                                        $length = -1;
                                }
 
@@ -2098,16 +2794,29 @@ sub process {
                                }
                                $length++;
                        }
-                       WARN("CONFIG_DESCRIPTION",
-                            "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
+                       if ($is_start && $is_end && $length < $min_conf_desc_length) {
+                               WARN("CONFIG_DESCRIPTION",
+                                    "please write a paragraph that describes the config symbol fully\n" . $herecurr);
+                       }
                        #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
                }
 
-# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
+# check for MAINTAINERS entries that don't have the right form
+               if ($realfile =~ /^MAINTAINERS$/ &&
+                   $rawline =~ /^\+[A-Z]:/ &&
+                   $rawline !~ /^\+[A-Z]:\t\S/) {
+                       if (WARN("MAINTAINERS_STYLE",
+                                "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
+                       }
+               }
+
+# discourage the use of boolean for type definition attributes of Kconfig options
                if ($realfile =~ /Kconfig/ &&
-                   $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
-                       WARN("CONFIG_EXPERIMENTAL",
-                            "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
+                   $line =~ /^\+\s*\bboolean\b/) {
+                       WARN("CONFIG_TYPE_BOOLEAN",
+                            "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);
                }
 
                if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
@@ -2125,65 +2834,93 @@ sub process {
                }
 
 # check for DT compatible documentation
-               if (defined $root && $realfile =~ /\.dts/ &&
-                   $rawline =~ /^\+\s*compatible\s*=/) {
+               if (defined $root &&
+                       (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
+                        ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
+
                        my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
 
+                       my $dt_path = $root . "/Documentation/devicetree/bindings/";
+                       my $vp_file = $dt_path . "vendor-prefixes.txt";
+
                        foreach my $compat (@compats) {
                                my $compat2 = $compat;
-                               my $dt_path =  $root . "/Documentation/devicetree/bindings/";
-                               $compat2 =~ s/\,[a-z]*\-/\,<\.\*>\-/;
-                               `grep -Erq "$compat|$compat2" $dt_path`;
+                               $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
+                               my $compat3 = $compat;
+                               $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
+                               `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
                                if ( $? >> 8 ) {
                                        WARN("UNDOCUMENTED_DT_STRING",
                                             "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
                                }
 
-                               my $vendor = $compat;
-                               my $vendor_path = $dt_path . "vendor-prefixes.txt";
-                               next if (! -f $vendor_path);
-                               $vendor =~ s/^([a-zA-Z0-9]+)\,.*/$1/;
-                               `grep -Eq "$vendor" $vendor_path`;
+                               next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
+                               my $vendor = $1;
+                               `grep -Eq "^$vendor\\b" $vp_file`;
                                if ( $? >> 8 ) {
                                        WARN("UNDOCUMENTED_DT_STRING",
-                                            "DT compatible string vendor \"$vendor\" appears un-documented -- check $vendor_path\n" . $herecurr);
+                                            "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
                                }
                        }
                }
 
 # check we are in a valid source file if not then ignore this hunk
-               next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
-
-#line length limit
-               if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
-                   $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
-                   !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
-                   $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
-                   $length > $max_line_length)
-               {
-                       WARN("LONG_LINE",
-                            "line over $max_line_length characters\n" . $herecurr);
-               }
+               next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
 
-# Check for user-visible strings broken across lines, which breaks the ability
-# to grep for the string.  Make exceptions when the previous string ends in a
-# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
-# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
-               if ($line =~ /^\+\s*"/ &&
-                   $prevline =~ /"\s*$/ &&
-                   $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
-                       WARN("SPLIT_STRING",
-                            "quoted string split across lines\n" . $hereprev);
-               }
+# line length limit (with some exclusions)
+#
+# There are a few types of lines that may extend beyond $max_line_length:
+#      logging functions like pr_info that end in a string
+#      lines with a single string
+#      #defines that are a single string
+#
+# There are 3 different line length message types:
+# LONG_LINE_COMMENT    a comment starts before but extends beyond $max_linelength
+# LONG_LINE_STRING     a string starts before but extends beyond $max_line_length
+# LONG_LINE            all other lines longer than $max_line_length
+#
+# if LONG_LINE is ignored, the other 2 types are also ignored
+#
 
-# check for spaces before a quoted newline
-               if ($rawline =~ /^.*\".*\s\\n/) {
-                       if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
-                                "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
-                           $fix) {
-                               $fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
+               if ($line =~ /^\+/ && $length > $max_line_length) {
+                       my $msg_type = "LONG_LINE";
+
+                       # Check the allowed long line types first
+
+                       # logging functions that end in a string that starts
+                       # before $max_line_length
+                       if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
+                           length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
+                               $msg_type = "";
+
+                       # lines with only strings (w/ possible termination)
+                       # #defines with only strings
+                       } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
+                                $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
+                               $msg_type = "";
+
+                       # EFI_GUID is another special case
+                       } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/) {
+                               $msg_type = "";
+
+                       # Otherwise set the alternate message types
+
+                       # a comment starts before $max_line_length
+                       } elsif ($line =~ /($;[\s$;]*)$/ &&
+                                length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
+                               $msg_type = "LONG_LINE_COMMENT"
+
+                       # a quoted string starts before $max_line_length
+                       } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
+                                length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
+                               $msg_type = "LONG_LINE_STRING"
                        }
 
+                       if ($msg_type ne "" &&
+                           (show_type("LONG_LINE") || show_type($msg_type))) {
+                               WARN($msg_type,
+                                    "line over $max_line_length characters\n" . $herecurr);
+                       }
                }
 
 # check for adding lines without a newline.
@@ -2207,7 +2944,7 @@ sub process {
                }
 
 # check we are in a valid source file C or perl if not then ignore this hunk
-               next if ($realfile !~ /\.(h|c|pl)$/);
+               next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
 
 # at the beginning of a line any tabs must come first and anything
 # more than 8 must use tabs.
@@ -2218,7 +2955,7 @@ sub process {
                        if (ERROR("CODE_INDENT",
                                  "code indent should use tabs where possible\n" . $herevet) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
+                               $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
                        }
                }
 
@@ -2228,9 +2965,9 @@ sub process {
                        if (WARN("SPACE_BEFORE_TAB",
                                "please, no space before tabs\n" . $herevet) &&
                            $fix) {
-                               while ($fixed[$linenr - 1] =~
+                               while ($fixed[$fixlinenr] =~
                                           s/(^\+.*) {8,8}\t/$1\t\t/) {}
-                               while ($fixed[$linenr - 1] =~
+                               while ($fixed[$fixlinenr] =~
                                           s/(^\+.*) +\t/$1\t/) {}
                        }
                }
@@ -2241,9 +2978,22 @@ sub process {
                            "Logical continuations should be on the previous line\n" . $hereprev);
                }
 
+# check indentation starts on a tab stop
+               if ($^V && $^V ge 5.10.0 &&
+                   $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$))/) {
+                       my $indent = length($1);
+                       if ($indent % 8) {
+                               if (WARN("TABSTOP",
+                                        "Statements should start on a tabstop\n" . $herecurr) &&
+                                   $fix) {
+                                       $fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
+                               }
+                       }
+               }
+
 # check multi-line statement indentation matches previous line
                if ($^V && $^V ge 5.10.0 &&
-                   $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) {
+                   $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
                        $prevline =~ /^\+(\t*)(.*)$/;
                        my $oldindent = $1;
                        my $rest = $2;
@@ -2264,45 +3014,154 @@ sub process {
                                        if (CHK("PARENTHESIS_ALIGNMENT",
                                                "Alignment should match open parenthesis\n" . $hereprev) &&
                                            $fix && $line =~ /^\+/) {
-                                               $fixed[$linenr - 1] =~
+                                               $fixed[$fixlinenr] =~
                                                    s/^\+[ \t]*/\+$goodtabindent/;
                                        }
                                }
                        }
                }
 
-               if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) {
+# check for space after cast like "(int) foo" or "(struct foo) bar"
+# avoid checking a few false positives:
+#   "sizeof(<type>)" or "__alignof__(<type>)"
+#   function pointer declarations like "(*foo)(int) = bar;"
+#   structure definitions like "(struct foo) { 0 };"
+#   multiline macros that define functions
+#   known attributes or the __attribute__ keyword
+               if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
+                   (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
                        if (CHK("SPACING",
-                               "No space is necessary after a cast\n" . $hereprev) &&
+                               "No space is necessary after a cast\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
-                                   s/^(\+.*\*[ \t]*\))[ \t]+/$1/;
+                               $fixed[$fixlinenr] =~
+                                   s/(\(\s*$Type\s*\))[ \t]+/$1/;
                        }
                }
 
+# Block comment styles
+# Networking with an initial /*
                if ($realfile =~ m@^(drivers/net/|net/)@ &&
                    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
-                   $rawline =~ /^\+[ \t]*\*/) {
+                   $rawline =~ /^\+[ \t]*\*/ &&
+                   $realline > 2) {
                        WARN("NETWORKING_BLOCK_COMMENT_STYLE",
                             "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
                }
 
-               if ($realfile =~ m@^(drivers/net/|net/)@ &&
-                   $prevrawline =~ /^\+[ \t]*\/\*/ &&          #starting /*
+# Block comments use * on subsequent lines
+               if ($prevline =~ /$;[ \t]*$/ &&                 #ends in comment
+                   $prevrawline =~ /^\+.*?\/\*/ &&             #starting /*
                    $prevrawline !~ /\*\/[ \t]*$/ &&            #no trailing */
                    $rawline =~ /^\+/ &&                        #line is new
                    $rawline !~ /^\+[ \t]*\*/) {                #no leading *
-                       WARN("NETWORKING_BLOCK_COMMENT_STYLE",
-                            "networking block comments start with * on subsequent lines\n" . $hereprev);
+                       WARN("BLOCK_COMMENT_STYLE",
+                            "Block comments use * on subsequent lines\n" . $hereprev);
                }
 
-               if ($realfile =~ m@^(drivers/net/|net/)@ &&
-                   $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&       #trailing */
+# Block comments use */ on trailing lines
+               if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&       #trailing */
                    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&      #inline /*...*/
                    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&       #trailing **/
                    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {    #non blank */
-                       WARN("NETWORKING_BLOCK_COMMENT_STYLE",
-                            "networking block comments put the trailing */ on a separate line\n" . $herecurr);
+                       WARN("BLOCK_COMMENT_STYLE",
+                            "Block comments use a trailing */ on a separate line\n" . $herecurr);
+               }
+
+# Block comment * alignment
+               if ($prevline =~ /$;[ \t]*$/ &&                 #ends in comment
+                   $line =~ /^\+[ \t]*$;/ &&                   #leading comment
+                   $rawline =~ /^\+[ \t]*\*/ &&                #leading *
+                   (($prevrawline =~ /^\+.*?\/\*/ &&           #leading /*
+                     $prevrawline !~ /\*\/[ \t]*$/) ||         #no trailing */
+                    $prevrawline =~ /^\+[ \t]*\*/)) {          #leading *
+                       my $oldindent;
+                       $prevrawline =~ m@^\+([ \t]*/?)\*@;
+                       if (defined($1)) {
+                               $oldindent = expand_tabs($1);
+                       } else {
+                               $prevrawline =~ m@^\+(.*/?)\*@;
+                               $oldindent = expand_tabs($1);
+                       }
+                       $rawline =~ m@^\+([ \t]*)\*@;
+                       my $newindent = $1;
+                       $newindent = expand_tabs($newindent);
+                       if (length($oldindent) ne length($newindent)) {
+                               WARN("BLOCK_COMMENT_STYLE",
+                                    "Block comments should align the * on each line\n" . $hereprev);
+                       }
+               }
+
+# check for missing blank lines after struct/union declarations
+# with exceptions for various attributes and macros
+               if ($prevline =~ /^[\+ ]};?\s*$/ &&
+                   $line =~ /^\+/ &&
+                   !($line =~ /^\+\s*$/ ||
+                     $line =~ /^\+\s*EXPORT_SYMBOL/ ||
+                     $line =~ /^\+\s*MODULE_/i ||
+                     $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
+                     $line =~ /^\+[a-z_]*init/ ||
+                     $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
+                     $line =~ /^\+\s*DECLARE/ ||
+                     $line =~ /^\+\s*__setup/)) {
+                       if (CHK("LINE_SPACING",
+                               "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
+                           $fix) {
+                               fix_insert_line($fixlinenr, "\+");
+                       }
+               }
+
+# check for multiple consecutive blank lines
+               if ($prevline =~ /^[\+ ]\s*$/ &&
+                   $line =~ /^\+\s*$/ &&
+                   $last_blank_line != ($linenr - 1)) {
+                       if (CHK("LINE_SPACING",
+                               "Please don't use multiple blank lines\n" . $hereprev) &&
+                           $fix) {
+                               fix_delete_line($fixlinenr, $rawline);
+                       }
+
+                       $last_blank_line = $linenr;
+               }
+
+# check for missing blank lines after declarations
+               if ($sline =~ /^\+\s+\S/ &&                     #Not at char 1
+                       # actual declarations
+                   ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
+                       # function pointer declarations
+                    $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
+                       # foo bar; where foo is some local typedef or #define
+                    $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
+                       # known declaration macros
+                    $prevline =~ /^\+\s+$declaration_macros/) &&
+                       # for "else if" which can look like "$Ident $Ident"
+                   !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
+                       # other possible extensions of declaration lines
+                     $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
+                       # not starting a section or a macro "\" extended line
+                     $prevline =~ /(?:\{\s*|\\)$/) &&
+                       # looks like a declaration
+                   !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
+                       # function pointer declarations
+                     $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
+                       # foo bar; where foo is some local typedef or #define
+                     $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
+                       # known declaration macros
+                     $sline =~ /^\+\s+$declaration_macros/ ||
+                       # start of struct or union or enum
+                     $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
+                       # start or end of block or continuation of declaration
+                     $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
+                       # bitfield continuation
+                     $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
+                       # other possible extensions of declaration lines
+                     $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
+                       # indentation of previous and current line are the same
+                   (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
+                       if (WARN("LINE_SPACING",
+                                "Missing a blank line after declarations\n" . $hereprev) &&
+                           $fix) {
+                               fix_insert_line($fixlinenr, "\+");
+                       }
                }
 
 # check for spaces at the beginning of a line.
@@ -2315,17 +3174,46 @@ sub process {
                        if (WARN("LEADING_SPACE",
                                 "please, no spaces at the start of a line\n" . $herevet) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
+                               $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
                        }
                }
 
 # check we are in a valid C source file if not then ignore this hunk
                next if ($realfile !~ /\.(h|c)$/);
 
-# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
-               if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
-                       WARN("CONFIG_EXPERIMENTAL",
-                            "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
+# check if this appears to be the start function declaration, save the name
+               if ($sline =~ /^\+\{\s*$/ &&
+                   $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
+                       $context_function = $1;
+               }
+
+# check if this appears to be the end of function declaration
+               if ($sline =~ /^\+\}\s*$/) {
+                       undef $context_function;
+               }
+
+# check indentation of any line with a bare else
+# (but not if it is a multiple line "if (foo) return bar; else return baz;")
+# if the previous line is a break or return and is indented 1 tab more...
+               if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
+                       my $tabs = length($1) + 1;
+                       if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
+                           ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
+                            defined $lines[$linenr] &&
+                            $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
+                               WARN("UNNECESSARY_ELSE",
+                                    "else is not generally useful after a break or return\n" . $hereprev);
+                       }
+               }
+
+# check indentation of a line with a break;
+# if the previous line is a goto or return and is indented the same # of tabs
+               if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
+                       my $tabs = $1;
+                       if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
+                               WARN("UNNECESSARY_BREAK",
+                                    "break is not useful after a goto or return\n" . $hereprev);
+                       }
                }
 
 # check for RCS/CVS revision markers
@@ -2356,7 +3244,7 @@ sub process {
                my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
                    $realline_next);
 #print "LINE<$line>\n";
-               if ($linenr >= $suppress_statement &&
+               if ($linenr > $suppress_statement &&
                    $realcnt && $sline =~ /.\s*\S/) {
                        ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
                                ctx_statement_block($linenr, $realcnt, 0);
@@ -2457,7 +3345,7 @@ sub process {
 
 # if/while/etc brace do not go on next line, unless defining a do while loop,
 # or if that brace on the next line is for something else
-               if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
+               if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
                        my $pre_ctx = "$1$2";
 
                        my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
@@ -2484,7 +3372,7 @@ sub process {
                        #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
                        #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
 
-                       if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
+                       if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
                                ERROR("OPEN_BRACE",
                                      "that open brace { should be on the previous line\n" .
                                        "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
@@ -2503,7 +3391,7 @@ sub process {
                }
 
 # Check relative indent for conditionals and blocks.
-               if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
+               if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
                        ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
                                ctx_statement_block($linenr, $realcnt, 0)
                                        if (!defined $stat);
@@ -2511,15 +3399,22 @@ sub process {
 
                        substr($s, 0, length($c), '');
 
-                       # Make sure we remove the line prefixes as we have
-                       # none on the first line, and are going to readd them
-                       # where necessary.
-                       $s =~ s/\n./\n/gs;
+                       # remove inline comments
+                       $s =~ s/$;/ /g;
+                       $c =~ s/$;/ /g;
 
                        # Find out how long the conditional actually is.
                        my @newlines = ($c =~ /\n/gs);
                        my $cond_lines = 1 + $#newlines;
 
+                       # Make sure we remove the line prefixes as we have
+                       # none on the first line, and are going to readd them
+                       # where necessary.
+                       $s =~ s/\n./\n/gs;
+                       while ($s =~ /\n\s+\\\n/) {
+                               $cond_lines += $s =~ s/\n\s+\\\n/\n/g;
+                       }
+
                        # We want to check the first line inside the block
                        # starting at the end of the conditional, so remove:
                        #  1) any blank line termination
@@ -2585,8 +3480,12 @@ sub process {
 
                        #print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
 
-                       if ($check && (($sindent % 8) != 0 ||
-                           ($sindent <= $indent && $s ne ''))) {
+                       if ($check && $s ne '' &&
+                           (($sindent % 8) != 0 ||
+                            ($sindent < $indent) ||
+                            ($sindent == $indent &&
+                             ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
+                            ($sindent > $indent + 8))) {
                                WARN("SUSPECT_CODE_INDENT",
                                     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
                        }
@@ -2608,6 +3507,42 @@ sub process {
 #ignore lines not being added
                next if ($line =~ /^[^\+]/);
 
+# check for dereferences that span multiple lines
+               if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
+                   $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
+                       $prevline =~ /($Lval\s*(?:\.|->))\s*$/;
+                       my $ref = $1;
+                       $line =~ /^.\s*($Lval)/;
+                       $ref .= $1;
+                       $ref =~ s/\s//g;
+                       WARN("MULTILINE_DEREFERENCE",
+                            "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
+               }
+
+# check for declarations of signed or unsigned without int
+               while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
+                       my $type = $1;
+                       my $var = $2;
+                       $var = "" if (!defined $var);
+                       if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
+                               my $sign = $1;
+                               my $pointer = $2;
+
+                               $pointer = "" if (!defined $pointer);
+
+                               if (WARN("UNSPECIFIED_INT",
+                                        "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
+                                   $fix) {
+                                       my $decl = trim($sign) . " int ";
+                                       my $comp_pointer = $pointer;
+                                       $comp_pointer =~ s/\s//g;
+                                       $decl .= $comp_pointer;
+                                       $decl = rtrim($decl) if ($var eq "");
+                                       $fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
+                               }
+                       }
+               }
+
 # TEST: allow direct testing of the type matcher.
                if ($dbg_type) {
                        if ($line =~ /^.\s*$Declare\s*$/) {
@@ -2634,8 +3569,18 @@ sub process {
 # check for initialisation to aggregates open brace on the next line
                if ($line =~ /^.\s*{/ &&
                    $prevline =~ /(?:^|[^=])=\s*$/) {
-                       ERROR("OPEN_BRACE",
-                             "that open brace { should be on the previous line\n" . $hereprev);
+                       if (ERROR("OPEN_BRACE",
+                                 "that open brace { should be on the previous line\n" . $hereprev) &&
+                           $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
+                               fix_delete_line($fixlinenr - 1, $prevrawline);
+                               fix_delete_line($fixlinenr, $rawline);
+                               my $fixedline = $prevrawline;
+                               $fixedline =~ s/\s*=\s*$/ = {/;
+                               fix_insert_line($fixlinenr, $fixedline);
+                               $fixedline = $line;
+                               $fixedline =~ s/^(.\s*)\{\s*/$1/;
+                               fix_insert_line($fixlinenr, $fixedline);
+                       }
                }
 
 #
@@ -2660,10 +3605,10 @@ sub process {
                        if (ERROR("C99_COMMENTS",
                                  "do not use C99 // comments\n" . $herecurr) &&
                            $fix) {
-                               my $line = $fixed[$linenr - 1];
+                               my $line = $fixed[$fixlinenr];
                                if ($line =~ /\/\/(.*)$/) {
                                        my $comment = trim($1);
-                                       $fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@;
+                                       $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
                                }
                        }
                }
@@ -2717,24 +3662,30 @@ sub process {
                }
 
 # check for global initialisers.
-               if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
+               if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
                        if (ERROR("GLOBAL_INITIALISERS",
-                                 "do not initialise globals to 0 or NULL\n" .
-                                     $herecurr) &&
+                                 "do not initialise globals to $1\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
+                               $fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
                        }
                }
 # check for static initialisers.
-               if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
+               if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
                        if (ERROR("INITIALISED_STATIC",
-                                 "do not initialise statics to 0 or NULL\n" .
+                                 "do not initialise statics to $1\n" .
                                      $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
+                               $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
                        }
                }
 
+# check for misordered declarations of char/short/int/long with signed/unsigned
+               while ($sline =~ m{(\b$TypeMisordered\b)}g) {
+                       my $tmp = trim($1);
+                       WARN("MISORDERED_TYPE",
+                            "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
+               }
+
 # check for static const char * arrays.
                if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
                        WARN("STATIC_CONST_CHAR_ARRAY",
@@ -2749,21 +3700,44 @@ sub process {
                                $herecurr);
                }
 
+# check for const <foo> const where <foo> is not a pointer or array type
+               if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
+                       my $found = $1;
+                       if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
+                               WARN("CONST_CONST",
+                                    "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
+                       } elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
+                               WARN("CONST_CONST",
+                                    "'const $found const' should probably be 'const $found'\n" . $herecurr);
+                       }
+               }
+
+# check for non-global char *foo[] = {"bar", ...} declarations.
+               if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
+                       WARN("STATIC_CONST_CHAR_ARRAY",
+                            "char * array declaration might be better as static const\n" .
+                               $herecurr);
+               }
+
+# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
+               if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
+                       my $array = $1;
+                       if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
+                               my $array_div = $1;
+                               if (WARN("ARRAY_SIZE",
+                                        "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
+                                   $fix) {
+                                       $fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
+                               }
+                       }
+               }
+
 # check for function declarations without arguments like "int foo()"
                if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
                        if (ERROR("FUNCTION_WITHOUT_ARGS",
                                  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
-                       }
-               }
-
-# check for uses of DEFINE_PCI_DEVICE_TABLE
-               if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
-                       if (WARN("DEFINE_PCI_DEVICE_TABLE",
-                                "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
-                           $fix) {
-                               $fixed[$linenr - 1] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
+                               $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
                        }
                }
 
@@ -2773,7 +3747,7 @@ sub process {
                    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
                    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
                    $line !~ /\b$typeTypedefs\b/ &&
-                   $line !~ /\b__bitwise(?:__|)\b/) {
+                   $line !~ /\b__bitwise\b/) {
                        WARN("NEW_TYPEDEFS",
                             "do not add new typedefs\n" . $herecurr);
                }
@@ -2800,7 +3774,7 @@ sub process {
                                        my $sub_from = $ident;
                                        my $sub_to = $ident;
                                        $sub_to =~ s/\Q$from\E/$to/;
-                                       $fixed[$linenr - 1] =~
+                                       $fixed[$fixlinenr] =~
                                            s@\Q$sub_from\E@$sub_to@;
                                }
                        }
@@ -2828,19 +3802,21 @@ sub process {
                                        my $sub_from = $match;
                                        my $sub_to = $match;
                                        $sub_to =~ s/\Q$from\E/$to/;
-                                       $fixed[$linenr - 1] =~
+                                       $fixed[$fixlinenr] =~
                                            s@\Q$sub_from\E@$sub_to@;
                                }
                        }
                }
 
-# # no BUG() or BUG_ON()
-#              if ($line =~ /\b(BUG|BUG_ON)\b/) {
-#                      print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
-#                      print "$herecurr";
-#                      $clean = 0;
-#              }
+# avoid BUG() or BUG_ON()
+               if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
+                       my $msg_type = \&WARN;
+                       $msg_type = \&CHK if ($file);
+                       &{$msg_type}("AVOID_BUG",
+                                    "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
+               }
 
+# avoid LINUX_VERSION_CODE
                if ($line =~ /\bLINUX_VERSION_CODE\b/) {
                        WARN("LINUX_VERSION_CODE",
                             "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
@@ -2849,7 +3825,7 @@ sub process {
 # check for uses of printk_ratelimit
                if ($line =~ /\bprintk_ratelimit\s*\(/) {
                        WARN("PRINTK_RATELIMITED",
-"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
+                            "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
                }
 
 # printk should use KERN_* levels.  Note that follow on printk's on the
@@ -2883,14 +3859,14 @@ sub process {
                        my $level2 = $level;
                        $level2 = "dbg" if ($level eq "debug");
                        WARN("PREFER_PR_LEVEL",
-                            "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
+                            "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
                }
 
                if ($line =~ /\bpr_warning\s*\(/) {
                        if (WARN("PREFER_PR_LEVEL",
                                 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/\bpr_warning\b/pr_warn/;
                        }
                }
@@ -2904,19 +3880,50 @@ sub process {
                             "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
                }
 
+# ENOSYS means "bad syscall nr" and nothing else.  This will have a small
+# number of false positives, but assembly files are not checked, so at
+# least the arch entry code will not trigger this warning.
+               if ($line =~ /\bENOSYS\b/) {
+                       WARN("ENOSYS",
+                            "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
+               }
+
 # function brace can't be on same line, except for #defines of do while,
 # or if closed on same line
-               if (($line=~/$Type\s*$Ident\(.*\).*\s\{/) and
+               if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and
                    !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {
-                       ERROR("OPEN_BRACE",
-                             "open brace '{' following function declarations go on the next line\n" . $herecurr);
+                       if (ERROR("OPEN_BRACE",
+                                 "open brace '{' following function declarations go on the next line\n" . $herecurr) &&
+                           $fix) {
+                               fix_delete_line($fixlinenr, $rawline);
+                               my $fixed_line = $rawline;
+                               $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
+                               my $line1 = $1;
+                               my $line2 = $2;
+                               fix_insert_line($fixlinenr, ltrim($line1));
+                               fix_insert_line($fixlinenr, "\+{");
+                               if ($line2 !~ /^\s*$/) {
+                                       fix_insert_line($fixlinenr, "\+\t" . trim($line2));
+                               }
+                       }
                }
 
 # open braces for enum, union and struct go on the same line.
                if ($line =~ /^.\s*{/ &&
                    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
-                       ERROR("OPEN_BRACE",
-                             "open brace '{' following $1 go on the same line\n" . $hereprev);
+                       if (ERROR("OPEN_BRACE",
+                                 "open brace '{' following $1 go on the same line\n" . $hereprev) &&
+                           $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
+                               fix_delete_line($fixlinenr - 1, $prevrawline);
+                               fix_delete_line($fixlinenr, $rawline);
+                               my $fixedline = rtrim($prevrawline) . " {";
+                               fix_insert_line($fixlinenr, $fixedline);
+                               $fixedline = $rawline;
+                               $fixedline =~ s/^(.\s*)\{\s*/$1\t/;
+                               if ($fixedline !~ /^\+\s*$/) {
+                                       fix_insert_line($fixlinenr, $fixedline);
+                               }
+                       }
                }
 
 # missing space after union, struct or enum definition
@@ -2924,7 +3931,7 @@ sub process {
                        if (WARN("SPACING",
                                 "missing space after $1 definition\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
                        }
                }
@@ -2932,10 +3939,7 @@ sub process {
 # Function pointer declarations
 # check spacing between type, funcptr, and args
 # canonical declaration is "type (*funcptr)(args...)"
-#
-# the $Declare variable will capture all spaces after the type
-# so check it for trailing missing spaces or multiple spaces
-               if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)$Ident(\s*)\)(\s*)\(/) {
+               if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
                        my $declare = $1;
                        my $pre_pointer_space = $2;
                        my $post_pointer_space = $3;
@@ -2943,16 +3947,30 @@ sub process {
                        my $post_funcname_space = $5;
                        my $pre_args_space = $6;
 
-                       if ($declare !~ /\s$/) {
+# the $Declare variable will capture all spaces after the type
+# so check it for a missing trailing missing space but pointer return types
+# don't need a space so don't warn for those.
+                       my $post_declare_space = "";
+                       if ($declare =~ /(\s+)$/) {
+                               $post_declare_space = $1;
+                               $declare = rtrim($declare);
+                       }
+                       if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
                                WARN("SPACING",
                                     "missing space after return type\n" . $herecurr);
+                               $post_declare_space = " ";
                        }
 
 # unnecessary space "type  (*funcptr)(args...)"
-                       elsif ($declare =~ /\s{2,}$/) {
-                               WARN("SPACING",
-                                    "Multiple spaces after return type\n" . $herecurr);
-                       }
+# This test is not currently implemented because these declarations are
+# equivalent to
+#      int  foo(int bar, ...)
+# and this is form shouldn't/doesn't generate a checkpatch warning.
+#
+#                      elsif ($declare =~ /\s{2,}$/) {
+#                              WARN("SPACING",
+#                                   "Multiple spaces after return type\n" . $herecurr);
+#                      }
 
 # unnecessary space "type ( *funcptr)(args...)"
                        if (defined $pre_pointer_space &&
@@ -2983,8 +4001,8 @@ sub process {
                        }
 
                        if (show_type("SPACING") && $fix) {
-                               $fixed[$linenr - 1] =~
-                                   s/^(.\s*$Declare)\(\s*\*\s*($Ident)\s*\)\s*\(/rtrim($1) . " " . "\(\*$2\)\("/ex;
+                               $fixed[$fixlinenr] =~
+                                   s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
                        }
                }
 
@@ -3000,7 +4018,7 @@ sub process {
                                if (ERROR("BRACKET_SPACE",
                                          "space prohibited before open square bracket '['\n" . $herecurr) &&
                                    $fix) {
-                                   $fixed[$linenr - 1] =~
+                                   $fixed[$fixlinenr] =~
                                        s/^(\+.*?)\s+\[/$1\[/;
                                }
                        }
@@ -3035,7 +4053,7 @@ sub process {
                                if (WARN("SPACING",
                                         "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
                                             $fix) {
-                                       $fixed[$linenr - 1] =~
+                                       $fixed[$fixlinenr] =~
                                            s/\b$name\s+\(/$name\(/;
                                }
                        }
@@ -3126,7 +4144,7 @@ sub process {
 
                                # Ignore operators passed as parameters.
                                if ($op_type ne 'V' &&
-                                   $ca =~ /\s$/ && $cc =~ /^\s*,/) {
+                                   $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
 
 #                              # Ignore comments
 #                              } elsif ($op =~ /^$;+$/) {
@@ -3145,10 +4163,13 @@ sub process {
                                # // is a comment
                                } elsif ($op eq '//') {
 
+                               #   :   when part of a bitfield
+                               } elsif ($opv eq ':B') {
+                                       # skip the bitfield test for now
+
                                # No spaces for:
                                #   ->
-                               #   :   when part of a bitfield
-                               } elsif ($op eq '->' || $opv eq ':B') {
+                               } elsif ($op eq '->') {
                                        if ($ctx =~ /Wx.|.xW/) {
                                                if (ERROR("SPACING",
                                                          "spaces prohibited around that '$op' $at\n" . $hereptr)) {
@@ -3160,14 +4181,33 @@ sub process {
                                                }
                                        }
 
-                               # , must have a space on the right.
+                               # , must not have a space before and must have a space on the right.
                                } elsif ($op eq ',') {
+                                       my $rtrim_before = 0;
+                                       my $space_after = 0;
+                                       if ($ctx =~ /Wx./) {
+                                               if (ERROR("SPACING",
+                                                         "space prohibited before that '$op' $at\n" . $hereptr)) {
+                                                       $line_fixed = 1;
+                                                       $rtrim_before = 1;
+                                               }
+                                       }
                                        if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
                                                if (ERROR("SPACING",
                                                          "space required after that '$op' $at\n" . $hereptr)) {
-                                                       $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
                                                        $line_fixed = 1;
                                                        $last_after = $n;
+                                                       $space_after = 1;
+                                               }
+                                       }
+                                       if ($rtrim_before || $space_after) {
+                                               if ($rtrim_before) {
+                                                       $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
+                                               } else {
+                                                       $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
+                                               }
+                                               if ($space_after) {
+                                                       $good .= " ";
                                                }
                                        }
 
@@ -3239,7 +4279,22 @@ sub process {
                                         $op eq '*' or $op eq '/' or
                                         $op eq '%')
                                {
-                                       if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
+                                       if ($check) {
+                                               if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
+                                                       if (CHK("SPACING",
+                                                               "spaces preferred around that '$op' $at\n" . $hereptr)) {
+                                                               $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
+                                                               $fix_elements[$n + 2] =~ s/^\s+//;
+                                                               $line_fixed = 1;
+                                                       }
+                                               } elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
+                                                       if (CHK("SPACING",
+                                                               "space preferred before that '$op' $at\n" . $hereptr)) {
+                                                               $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
+                                                               $line_fixed = 1;
+                                                       }
+                                               }
+                                       } elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
                                                if (ERROR("SPACING",
                                                          "need consistent spacing around '$op' $at\n" . $hereptr)) {
                                                        $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
@@ -3274,6 +4329,14 @@ sub process {
                                                $ok = 1;
                                        }
 
+                                       # for asm volatile statements
+                                       # ignore a colon with another
+                                       # colon immediately before or after
+                                       if (($op eq ':') &&
+                                           ($ca =~ /:$/ || $cc =~ /^:/)) {
+                                               $ok = 1;
+                                       }
+
                                        # messages are ERROR, but ?: are CHK
                                        if ($ok == 0) {
                                                my $msg_type = \&ERROR;
@@ -3300,8 +4363,8 @@ sub process {
                                $fixed_line = $fixed_line . $fix_elements[$#elements];
                        }
 
-                       if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) {
-                               $fixed[$linenr - 1] = $fixed_line;
+                       if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
+                               $fixed[$fixlinenr] = $fixed_line;
                        }
 
 
@@ -3312,7 +4375,7 @@ sub process {
                        if (WARN("SPACING",
                                 "space prohibited before semicolon\n" . $herecurr) &&
                            $fix) {
-                               1 while $fixed[$linenr - 1] =~
+                               1 while $fixed[$fixlinenr] =~
                                    s/^(\+.*\S)\s+;/$1;/;
                        }
                }
@@ -3340,12 +4403,12 @@ sub process {
 ##             }
 
 #need space before brace following if, while, etc
-               if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\){/) ||
+               if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
                    $line =~ /do\{/) {
                        if (ERROR("SPACING",
                                  "space required before the open brace '{'\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/;
+                               $fixed[$fixlinenr] =~ s/^(\+.*(?:do|\)))\{/$1 {/;
                        }
                }
 
@@ -3363,7 +4426,7 @@ sub process {
                        if (ERROR("SPACING",
                                  "space required after that close brace '}'\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/}((?!(?:,|;|\)))\S)/} $1/;
                        }
                }
@@ -3373,7 +4436,7 @@ sub process {
                        if (ERROR("SPACING",
                                  "space prohibited after that open square bracket '['\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/\[\s+/\[/;
                        }
                }
@@ -3381,7 +4444,7 @@ sub process {
                        if (ERROR("SPACING",
                                  "space prohibited before that close square bracket ']'\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/\s+\]/\]/;
                        }
                }
@@ -3392,7 +4455,7 @@ sub process {
                        if (ERROR("SPACING",
                                  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/\(\s+/\(/;
                        }
                }
@@ -3402,36 +4465,77 @@ sub process {
                        if (ERROR("SPACING",
                                  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/\s+\)/\)/;
                        }
                }
 
+# check unnecessary parentheses around addressof/dereference single $Lvals
+# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
+
+               while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
+                       my $var = $1;
+                       if (CHK("UNNECESSARY_PARENTHESES",
+                               "Unnecessary parentheses around $var\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
+                       }
+               }
+
+# check for unnecessary parentheses around function pointer uses
+# ie: (foo->bar)(); should be foo->bar();
+# but not "if (foo->bar) (" to avoid some false positives
+               if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
+                       my $var = $2;
+                       if (CHK("UNNECESSARY_PARENTHESES",
+                               "Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
+                           $fix) {
+                               my $var2 = deparenthesize($var);
+                               $var2 =~ s/\s//g;
+                               $fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
+                       }
+               }
+
 #goto labels aren't indented, allow a single space however
                if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
                   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
                        if (WARN("INDENTED_LABEL",
                                 "labels should not be indented\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/^(.)\s+/$1/;
                        }
                }
 
-# Return is not a function.
+# return is not a function
                if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
                        my $spacing = $1;
                        if ($^V && $^V ge 5.10.0 &&
-                           $stat =~ /^.\s*return\s*$balanced_parens\s*;\s*$/) {
-                               ERROR("RETURN_PARENTHESES",
-                                     "return is not a function, parentheses are not required\n" . $herecurr);
-
+                           $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
+                               my $value = $1;
+                               $value = deparenthesize($value);
+                               if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
+                                       ERROR("RETURN_PARENTHESES",
+                                             "return is not a function, parentheses are not required\n" . $herecurr);
+                               }
                        } elsif ($spacing !~ /\s+/) {
                                ERROR("SPACING",
                                      "space required before the open parenthesis '('\n" . $herecurr);
                        }
                }
 
+# unnecessary return in a void function
+# at end-of-function, with the previous line a single leading tab, then return;
+# and the line before that not a goto label target like "out:"
+               if ($sline =~ /^[ \+]}\s*$/ &&
+                   $prevline =~ /^\+\treturn\s*;\s*$/ &&
+                   $linenr >= 3 &&
+                   $lines[$linenr - 3] =~ /^[ +]/ &&
+                   $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
+                       WARN("RETURN_VOID",
+                            "void function return statements are not generally useful\n" . $hereprev);
+               }
+
 # if statements using unnecessary parentheses - ie: if ((foo == bar))
                if ($^V && $^V ge 5.10.0 &&
                    $line =~ /\bif\s*((?:\(\s*){2,})/) {
@@ -3446,12 +4550,41 @@ sub process {
                        }
                }
 
-# Return of what appears to be an errno should normally be -'ve
-               if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
+# comparisons with a constant or upper case identifier on the left
+#      avoid cases like "foo + BAR < baz"
+#      only fix matches surrounded by parentheses to avoid incorrect
+#      conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
+               if ($^V && $^V ge 5.10.0 &&
+                   $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
+                       my $lead = $1;
+                       my $const = $2;
+                       my $comp = $3;
+                       my $to = $4;
+                       my $newcomp = $comp;
+                       if ($lead !~ /(?:$Operators|\.)\s*$/ &&
+                           $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
+                           WARN("CONSTANT_COMPARISON",
+                                "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
+                           $fix) {
+                               if ($comp eq "<") {
+                                       $newcomp = ">";
+                               } elsif ($comp eq "<=") {
+                                       $newcomp = ">=";
+                               } elsif ($comp eq ">") {
+                                       $newcomp = "<";
+                               } elsif ($comp eq ">=") {
+                                       $newcomp = "<=";
+                               }
+                               $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
+                       }
+               }
+
+# Return of what appears to be an errno should normally be negative
+               if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
                        my $name = $1;
                        if ($name ne 'EOF' && $name ne 'ERROR') {
                                WARN("USE_NEGATIVE_ERRNO",
-                                    "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
+                                    "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
                        }
                }
 
@@ -3460,7 +4593,7 @@ sub process {
                        if (ERROR("SPACING",
                                  "space required before the open parenthesis '('\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/\b(if|while|for|switch)\(/$1 \(/;
                        }
                }
@@ -3550,7 +4683,7 @@ sub process {
 # if should not continue a brace
                if ($line =~ /}\s*if\b/) {
                        ERROR("TRAILING_STATEMENTS",
-                             "trailing statements should be on next line\n" .
+                             "trailing statements should be on next line (or did you mean 'else if'?)\n" .
                                $herecurr);
                }
 # case and default should not have general statements after them
@@ -3566,14 +4699,26 @@ sub process {
 
                # Check for }<nl>else {, these must be at the same
                # indent level to be relevant to each other.
-               if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
-                                               $previndent == $indent) {
-                       ERROR("ELSE_AFTER_BRACE",
-                             "else should follow close brace '}'\n" . $hereprev);
+               if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
+                   $previndent == $indent) {
+                       if (ERROR("ELSE_AFTER_BRACE",
+                                 "else should follow close brace '}'\n" . $hereprev) &&
+                           $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
+                               fix_delete_line($fixlinenr - 1, $prevrawline);
+                               fix_delete_line($fixlinenr, $rawline);
+                               my $fixedline = $prevrawline;
+                               $fixedline =~ s/}\s*$//;
+                               if ($fixedline !~ /^\+\s*$/) {
+                                       fix_insert_line($fixlinenr, $fixedline);
+                               }
+                               $fixedline = $rawline;
+                               $fixedline =~ s/^(.\s*)else/$1} else/;
+                               fix_insert_line($fixlinenr, $fixedline);
+                       }
                }
 
-               if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
-                                               $previndent == $indent) {
+               if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
+                   $previndent == $indent) {
                        my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
 
                        # Find out what is on the end of the line after the
@@ -3582,8 +4727,18 @@ sub process {
                        $s =~ s/\n.*//g;
 
                        if ($s =~ /^\s*;/) {
-                               ERROR("WHILE_AFTER_BRACE",
-                                     "while should follow close brace '}'\n" . $hereprev);
+                               if (ERROR("WHILE_AFTER_BRACE",
+                                         "while should follow close brace '}'\n" . $hereprev) &&
+                                   $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
+                                       fix_delete_line($fixlinenr - 1, $prevrawline);
+                                       fix_delete_line($fixlinenr, $rawline);
+                                       my $fixedline = $prevrawline;
+                                       my $trailing = $rawline;
+                                       $trailing =~ s/^\+//;
+                                       $trailing = trim($trailing);
+                                       $fixedline =~ s/}\s*$/} $trailing/;
+                                       fix_insert_line($fixlinenr, $fixedline);
+                               }
                        }
                }
 
@@ -3597,7 +4752,7 @@ sub process {
                                         "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
                                    $fix) {
                                        my $hexval = sprintf("0x%x", oct($var));
-                                       $fixed[$linenr - 1] =~
+                                       $fixed[$fixlinenr] =~
                                            s/\b$var\b/$hexval/;
                                }
                        }
@@ -3608,7 +4763,9 @@ sub process {
 #Ignore Page<foo> variants
                            $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
 #Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
-                           $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
+                           $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
+#Ignore some three character SI units explicitly, like MiB and KHz
+                           $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
                                while ($var =~ m{($Ident)}g) {
                                        my $word = $1;
                                        next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
@@ -3633,11 +4790,12 @@ sub process {
                        if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
                                 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/\s+$//;
+                               $fixed[$fixlinenr] =~ s/\s+$//;
                        }
                }
 
-#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
+# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
+# itself <asm/foo.h> (uses RAW line)
                if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
                        my $file = "$1.h";
                        my $checkfile = "include/linux/$file";
@@ -3645,12 +4803,15 @@ sub process {
                            $realfile ne $checkfile &&
                            $1 !~ /$allowed_asm_includes/)
                        {
-                               if ($realfile =~ m{^arch/}) {
-                                       CHK("ARCH_INCLUDE_LINUX",
-                                           "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
-                               } else {
-                                       WARN("INCLUDE_LINUX",
-                                            "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
+                               my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
+                               if ($asminclude > 0) {
+                                       if ($realfile =~ m{^arch/}) {
+                                               CHK("ARCH_INCLUDE_LINUX",
+                                                   "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
+                                       } else {
+                                               WARN("INCLUDE_LINUX",
+                                                    "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
+                                       }
                                }
                        }
                }
@@ -3664,13 +4825,28 @@ sub process {
                        my $cnt = $realcnt;
                        my ($off, $dstat, $dcond, $rest);
                        my $ctx = '';
+                       my $has_flow_statement = 0;
+                       my $has_arg_concat = 0;
                        ($dstat, $dcond, $ln, $cnt, $off) =
                                ctx_statement_block($linenr, $realcnt, 0);
                        $ctx = $dstat;
                        #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
                        #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
 
-                       $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
+                       $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
+                       $has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
+
+                       $dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
+                       my $define_args = $1;
+                       my $define_stmt = $dstat;
+                       my @def_args = ();
+
+                       if (defined $define_args && $define_args ne "") {
+                               $define_args = substr($define_args, 1, length($define_args) - 2);
+                               $define_args =~ s/\s*//g;
+                               @def_args = split(",", $define_args);
+                       }
+
                        $dstat =~ s/$;//g;
                        $dstat =~ s/\\\n.//g;
                        $dstat =~ s/^\s*//s;
@@ -3679,16 +4855,19 @@ sub process {
                        # Flatten any parentheses and braces
                        while ($dstat =~ s/\([^\(\)]*\)/1/ ||
                               $dstat =~ s/\{[^\{\}]*\}/1/ ||
-                              $dstat =~ s/\[[^\[\]]*\]/1/)
+                              $dstat =~ s/.\[[^\[\]]*\]/1/)
                        {
                        }
 
                        # Flatten any obvious string concatentation.
-                       while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
-                              $dstat =~ s/$Ident\s*("X*")/$1/)
+                       while ($dstat =~ s/($String)\s*$Ident/$1/ ||
+                              $dstat =~ s/$Ident\s*($String)/$1/)
                        {
                        }
 
+                       # Make asm volatile uses seem like a generic function
+                       $dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
+
                        my $exceptions = qr{
                                $Declare|
                                module_param_named|
@@ -3699,14 +4878,24 @@ sub process {
                                union|
                                struct|
                                \.$Ident\s*=\s*|
-                               ^\"|\"$
+                               ^\"|\"$|
+                               ^\[
                        }x;
                        #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
+
+                       $ctx =~ s/\n*$//;
+                       my $herectx = $here . "\n";
+                       my $stmt_cnt = statement_rawlines($ctx);
+
+                       for (my $n = 0; $n < $stmt_cnt; $n++) {
+                               $herectx .= raw_line($linenr, $n) . "\n";
+                       }
+
                        if ($dstat ne '' &&
                            $dstat !~ /^(?:$Ident|-?$Constant),$/ &&                    # 10, // foo(),
                            $dstat !~ /^(?:$Ident|-?$Constant);$/ &&                    # foo();
                            $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&          # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
-                           $dstat !~ /^'X'$/ &&                                        # character constants
+                           $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&                  # character constants
                            $dstat !~ /$exceptions/ &&
                            $dstat !~ /^\.$Ident\s*=/ &&                                # .foo =
                            $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&          # stringification #foo
@@ -3717,21 +4906,69 @@ sub process {
                            $dstat !~ /^\(\{/ &&                                                # ({...
                            $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
                        {
-                               $ctx =~ s/\n*$//;
+                               if ($dstat =~ /^\s*if\b/) {
+                                       ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
+                                             "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
+                               } elsif ($dstat =~ /;/) {
+                                       ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
+                                             "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
+                               } else {
+                                       ERROR("COMPLEX_MACRO",
+                                             "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
+                               }
+
+                       }
+
+                       # Make $define_stmt single line, comment-free, etc
+                       my @stmt_array = split('\n', $define_stmt);
+                       my $first = 1;
+                       $define_stmt = "";
+                       foreach my $l (@stmt_array) {
+                               $l =~ s/\\$//;
+                               if ($first) {
+                                       $define_stmt = $l;
+                                       $first = 0;
+                               } elsif ($l =~ /^[\+ ]/) {
+                                       $define_stmt .= substr($l, 1);
+                               }
+                       }
+                       $define_stmt =~ s/$;//g;
+                       $define_stmt =~ s/\s+/ /g;
+                       $define_stmt = trim($define_stmt);
+
+# check if any macro arguments are reused (ignore '...' and 'type')
+                       foreach my $arg (@def_args) {
+                               next if ($arg =~ /\.\.\./);
+                               next if ($arg =~ /^type$/i);
+                               my $tmp_stmt = $define_stmt;
+                               $tmp_stmt =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
+                               $tmp_stmt =~ s/\#+\s*$arg\b//g;
+                               $tmp_stmt =~ s/\b$arg\s*\#\#//g;
+                               my $use_cnt = $tmp_stmt =~ s/\b$arg\b//g;
+                               if ($use_cnt > 1) {
+                                       CHK("MACRO_ARG_REUSE",
+                                           "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
+                                   }
+# check if any macro arguments may have other precedence issues
+                               if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
+                                   ((defined($1) && $1 ne ',') ||
+                                    (defined($2) && $2 ne ','))) {
+                                       CHK("MACRO_ARG_PRECEDENCE",
+                                           "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
+                               }
+                       }
+
+# check for macros with flow control, but without ## concatenation
+# ## concatenation is commonly a macro that defines a function so ignore those
+                       if ($has_flow_statement && !$has_arg_concat) {
                                my $herectx = $here . "\n";
                                my $cnt = statement_rawlines($ctx);
 
                                for (my $n = 0; $n < $cnt; $n++) {
                                        $herectx .= raw_line($linenr, $n) . "\n";
                                }
-
-                               if ($dstat =~ /;/) {
-                                       ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
-                                             "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
-                               } else {
-                                       ERROR("COMPLEX_MACRO",
-                                             "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
-                               }
+                               WARN("MACRO_WITH_FLOW_CONTROL",
+                                    "Macros with flow control statements should be avoided\n" . "$herectx");
                        }
 
 # check for line continuations outside of #defines, preprocessor #, and asm
@@ -3761,6 +4998,7 @@ sub process {
                        $ctx = $dstat;
 
                        $dstat =~ s/\\\n.//g;
+                       $dstat =~ s/$;/ /g;
 
                        if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
                                my $stmts = $2;
@@ -3783,6 +5021,17 @@ sub process {
                                        WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
                                             "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
                                }
+                       } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
+                               $ctx =~ s/\n*$//;
+                               my $cnt = statement_rawlines($ctx);
+                               my $herectx = $here . "\n";
+
+                               for (my $n = 0; $n < $cnt; $n++) {
+                                       $herectx .= raw_line($linenr, $n) . "\n";
+                               }
+
+                               WARN("TRAILING_SEMICOLON",
+                                    "macros should not use a trailing semicolon\n" . "$herectx");
                        }
                }
 
@@ -3914,21 +5163,137 @@ sub process {
                        }
                }
 
+# check for single line unbalanced braces
+               if ($sline =~ /^.\s*\}\s*else\s*$/ ||
+                   $sline =~ /^.\s*else\s*\{\s*$/) {
+                       CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
+               }
+
 # check for unnecessary blank lines around braces
                if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
-                       CHK("BRACES",
-                           "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
+                       if (CHK("BRACES",
+                               "Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
+                           $fix && $prevrawline =~ /^\+/) {
+                               fix_delete_line($fixlinenr - 1, $prevrawline);
+                       }
                }
                if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
-                       CHK("BRACES",
-                           "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
+                       if (CHK("BRACES",
+                               "Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
+                           $fix) {
+                               fix_delete_line($fixlinenr, $rawline);
+                       }
                }
 
 # no volatiles please
                my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
                if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
                        WARN("VOLATILE",
-                            "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
+                            "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
+               }
+
+# Check for user-visible strings broken across lines, which breaks the ability
+# to grep for the string.  Make exceptions when the previous string ends in a
+# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
+# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
+               if ($line =~ /^\+\s*$String/ &&
+                   $prevline =~ /"\s*$/ &&
+                   $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
+                       if (WARN("SPLIT_STRING",
+                                "quoted string split across lines\n" . $hereprev) &&
+                                    $fix &&
+                                    $prevrawline =~ /^\+.*"\s*$/ &&
+                                    $last_coalesced_string_linenr != $linenr - 1) {
+                               my $extracted_string = get_quoted_string($line, $rawline);
+                               my $comma_close = "";
+                               if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
+                                       $comma_close = $1;
+                               }
+
+                               fix_delete_line($fixlinenr - 1, $prevrawline);
+                               fix_delete_line($fixlinenr, $rawline);
+                               my $fixedline = $prevrawline;
+                               $fixedline =~ s/"\s*$//;
+                               $fixedline .= substr($extracted_string, 1) . trim($comma_close);
+                               fix_insert_line($fixlinenr - 1, $fixedline);
+                               $fixedline = $rawline;
+                               $fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
+                               if ($fixedline !~ /\+\s*$/) {
+                                       fix_insert_line($fixlinenr, $fixedline);
+                               }
+                               $last_coalesced_string_linenr = $linenr;
+                       }
+               }
+
+# check for missing a space in a string concatenation
+               if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
+                       WARN('MISSING_SPACE',
+                            "break quoted strings at a space character\n" . $hereprev);
+               }
+
+# check for an embedded function name in a string when the function is known
+# This does not work very well for -f --file checking as it depends on patch
+# context providing the function name or a single line form for in-file
+# function declarations
+               if ($line =~ /^\+.*$String/ &&
+                   defined($context_function) &&
+                   get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
+                   length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
+                       WARN("EMBEDDED_FUNCTION_NAME",
+                            "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
+               }
+
+# check for spaces before a quoted newline
+               if ($rawline =~ /^.*\".*\s\\n/) {
+                       if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
+                                "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
+                       }
+
+               }
+
+# concatenated string without spaces between elements
+               if ($line =~ /$String[A-Z_]/ || $line =~ /[A-Za-z0-9_]$String/) {
+                       CHK("CONCATENATED_STRING",
+                           "Concatenated strings should use spaces between elements\n" . $herecurr);
+               }
+
+# uncoalesced string fragments
+               if ($line =~ /$String\s*"/) {
+                       WARN("STRING_FRAGMENTS",
+                            "Consecutive strings are generally better as a single string\n" . $herecurr);
+               }
+
+# check for non-standard and hex prefixed decimal printf formats
+               my $show_L = 1; #don't show the same defect twice
+               my $show_Z = 1;
+               while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
+                       my $string = substr($rawline, $-[1], $+[1] - $-[1]);
+                       $string =~ s/%%/__/g;
+                       # check for %L
+                       if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
+                               WARN("PRINTF_L",
+                                    "\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
+                               $show_L = 0;
+                       }
+                       # check for %Z
+                       if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
+                               WARN("PRINTF_Z",
+                                    "%Z$1 is non-standard C, use %z$1\n" . $herecurr);
+                               $show_Z = 0;
+                       }
+                       # check for 0x<decimal>
+                       if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
+                               ERROR("PRINTF_0XDECIMAL",
+                                     "Prefixing 0x with decimal output is defective\n" . $herecurr);
+                       }
+               }
+
+# check for line continuations in quoted strings with odd counts of "
+               if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
+                       WARN("LINE_CONTINUATIONS",
+                            "Avoid line continuations in quoted strings\n" . $herecurr);
                }
 
 # warn about #if 0
@@ -3940,10 +5305,90 @@ sub process {
 
 # check for needless "if (<foo>) fn(<foo>)" uses
                if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
-                       my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
-                       if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
-                               WARN('NEEDLESS_IF',
-                                    "$1(NULL) is safe this check is probably not required\n" . $hereprev);
+                       my $tested = quotemeta($1);
+                       my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
+                       if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
+                               my $func = $1;
+                               if (WARN('NEEDLESS_IF',
+                                        "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
+                                   $fix) {
+                                       my $do_fix = 1;
+                                       my $leading_tabs = "";
+                                       my $new_leading_tabs = "";
+                                       if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
+                                               $leading_tabs = $1;
+                                       } else {
+                                               $do_fix = 0;
+                                       }
+                                       if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
+                                               $new_leading_tabs = $1;
+                                               if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
+                                                       $do_fix = 0;
+                                               }
+                                       } else {
+                                               $do_fix = 0;
+                                       }
+                                       if ($do_fix) {
+                                               fix_delete_line($fixlinenr - 1, $prevrawline);
+                                               $fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
+                                       }
+                               }
+                       }
+               }
+
+# check for unnecessary "Out of Memory" messages
+               if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
+                   $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
+                   (defined $1 || defined $3) &&
+                   $linenr > 3) {
+                       my $testval = $2;
+                       my $testline = $lines[$linenr - 3];
+
+                       my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
+#                      print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
+
+                       if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|kmemdup|(?:dev_)?alloc_skb)/) {
+                               WARN("OOM_MESSAGE",
+                                    "Possible unnecessary 'out of memory' message\n" . $hereprev);
+                       }
+               }
+
+# check for logging functions with KERN_<LEVEL>
+               if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
+                   $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
+                       my $level = $1;
+                       if (WARN("UNNECESSARY_KERN_LEVEL",
+                                "Possible unnecessary $level\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] =~ s/\s*$level\s*//;
+                       }
+               }
+
+# check for logging continuations
+               if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
+                       WARN("LOGGING_CONTINUATION",
+                            "Avoid logging continuation uses where feasible\n" . $herecurr);
+               }
+
+# check for mask then right shift without a parentheses
+               if ($^V && $^V ge 5.10.0 &&
+                   $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
+                   $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
+                       WARN("MASK_THEN_SHIFT",
+                            "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
+               }
+
+# check for pointer comparisons to NULL
+               if ($^V && $^V ge 5.10.0) {
+                       while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
+                               my $val = $1;
+                               my $equal = "!";
+                               $equal = "" if ($4 eq "!=");
+                               if (CHK("COMPARISON_TO_NULL",
+                                       "Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
+                                           $fix) {
+                                       $fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
+                               }
                        }
                }
 
@@ -3960,7 +5405,7 @@ sub process {
                                      WARN("MISPLACED_INIT",
                                           "$attr should be placed after $var\n" . $herecurr))) &&
                                    $fix) {
-                                       $fixed[$linenr - 1] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
+                                       $fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
                                }
                        }
                }
@@ -3974,7 +5419,7 @@ sub process {
                        if (ERROR("INIT_ATTRIBUTE",
                                  "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/$InitAttributeData/${attr_prefix}initconst/;
                        }
                }
@@ -3985,21 +5430,49 @@ sub process {
                        if (ERROR("INIT_ATTRIBUTE",
                                  "Use of $attr requires a separate use of const\n" . $herecurr) &&
                            $fix) {
-                               my $lead = $fixed[$linenr - 1] =~
+                               my $lead = $fixed[$fixlinenr] =~
                                    /(^\+\s*(?:static\s+))/;
                                $lead = rtrim($1);
                                $lead = "$lead " if ($lead !~ /^\+$/);
                                $lead = "${lead}const ";
-                               $fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/;
+                               $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
+                       }
+               }
+
+# check for __read_mostly with const non-pointer (should just be const)
+               if ($line =~ /\b__read_mostly\b/ &&
+                   $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
+                       if (ERROR("CONST_READ_MOSTLY",
+                                 "Invalid use of __read_mostly with const type\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
+                       }
+               }
+
+# don't use __constant_<foo> functions outside of include/uapi/
+               if ($realfile !~ m@^include/uapi/@ &&
+                   $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
+                       my $constant_func = $1;
+                       my $func = $constant_func;
+                       $func =~ s/^__constant_//;
+                       if (WARN("CONSTANT_CONVERSION",
+                                "$constant_func should be $func\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
                        }
                }
 
 # prefer usleep_range over udelay
                if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
+                       my $delay = $1;
                        # ignore udelay's < 10, however
-                       if (! ($1 < 10) ) {
+                       if (! ($delay < 10) ) {
                                CHK("USLEEP_RANGE",
-                                   "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line);
+                                   "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
+                       }
+                       if ($delay > 2000) {
+                               WARN("LONG_UDELAY",
+                                    "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
                        }
                }
 
@@ -4007,7 +5480,7 @@ sub process {
                if ($line =~ /\bmsleep\s*\((\d+)\);/) {
                        if ($1 < 20) {
                                WARN("MSLEEP",
-                                    "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line);
+                                    "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
                        }
                }
 
@@ -4035,7 +5508,7 @@ sub process {
                        if (ERROR("SPACING",
                                  "exactly one space required after that #$1\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~
+                               $fixed[$fixlinenr] =~
                                    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
                        }
 
@@ -4051,22 +5524,70 @@ sub process {
                        }
                }
 # check for memory barriers without a comment.
-               if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
+
+               my $barriers = qr{
+                       mb|
+                       rmb|
+                       wmb|
+                       read_barrier_depends
+               }x;
+               my $barrier_stems = qr{
+                       mb__before_atomic|
+                       mb__after_atomic|
+                       store_release|
+                       load_acquire|
+                       store_mb|
+                       (?:$barriers)
+               }x;
+               my $all_barriers = qr{
+                       (?:$barriers)|
+                       smp_(?:$barrier_stems)|
+                       virt_(?:$barrier_stems)
+               }x;
+
+               if ($line =~ /\b(?:$all_barriers)\s*\(/) {
                        if (!ctx_has_comment($first_line, $linenr)) {
                                WARN("MEMORY_BARRIER",
                                     "memory barrier without comment\n" . $herecurr);
                        }
                }
+
+               my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
+
+               if ($realfile !~ m@^include/asm-generic/@ &&
+                   $realfile !~ m@/barrier\.h$@ &&
+                   $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
+                   $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
+                       WARN("MEMORY_BARRIER",
+                            "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
+               }
+
+# check for waitqueue_active without a comment.
+               if ($line =~ /\bwaitqueue_active\s*\(/) {
+                       if (!ctx_has_comment($first_line, $linenr)) {
+                               WARN("WAITQUEUE_ACTIVE",
+                                    "waitqueue_active without comment\n" . $herecurr);
+                       }
+               }
+
 # check of hardware specific defines
                if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
                        CHK("ARCH_DEFINES",
                            "architecture specific defines should be avoided\n" .  $herecurr);
                }
 
+# check that the storage class is not after a type
+               if ($line =~ /\b($Type)\s+($Storage)\b/) {
+                       WARN("STORAGE_CLASS",
+                            "storage class '$2' should be located before type '$1'\n" . $herecurr);
+               }
 # Check that the storage class is at the beginning of a declaration
-               if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
+               if ($line =~ /\b$Storage\b/ &&
+                   $line !~ /^.\s*$Storage/ &&
+                   $line =~ /^.\s*(.+?)\$Storage\s/ &&
+                   $1 !~ /[\,\)]\s*$/) {
                        WARN("STORAGE_CLASS",
-                            "storage class should be at the beginning of the declaration\n" . $herecurr)
+                            "storage class should be at the beginning of the declaration\n" . $herecurr);
                }
 
 # check the location of the inline attribute, that it is between
@@ -4083,7 +5604,7 @@ sub process {
                        if (WARN("INLINE",
                                 "plain inline is preferred over $1\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/;
+                               $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
 
                        }
                }
@@ -4094,8 +5615,10 @@ sub process {
                        WARN("PREFER_PACKED",
                             "__packed is preferred over __attribute__((packed))\n" . $herecurr);
                }
+
 # Check for new packed members, warn to use care
-               if ($line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) {
+               if ($realfile !~ m@\binclude/uapi/@ &&
+                   $line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) {
                        WARN("NEW_PACKED",
                             "Adding new packed members is to be done with care\n" . $herecurr);
                }
@@ -4113,7 +5636,7 @@ sub process {
                        if (WARN("PREFER_PRINTF",
                                 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
+                               $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
 
                        }
                }
@@ -4124,7 +5647,55 @@ sub process {
                        if (WARN("PREFER_SCANF",
                                 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
+                               $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
+                       }
+               }
+
+# Check for __attribute__ weak, or __weak declarations (may have link issues)
+               if ($^V && $^V ge 5.10.0 &&
+                   $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
+                   ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
+                    $line =~ /\b__weak\b/)) {
+                       ERROR("WEAK_DECLARATION",
+                             "Using weak declarations can have unintended link defects\n" . $herecurr);
+               }
+
+# check for c99 types like uint8_t used outside of uapi/ and tools/
+               if ($realfile !~ m@\binclude/uapi/@ &&
+                   $realfile !~ m@\btools/@ &&
+                   $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
+                       my $type = $1;
+                       if ($type =~ /\b($typeC99Typedefs)\b/) {
+                               $type = $1;
+                               my $kernel_type = 'u';
+                               $kernel_type = 's' if ($type =~ /^_*[si]/);
+                               $type =~ /(\d+)/;
+                               $kernel_type .= $1;
+                               if (CHK("PREFER_KERNEL_TYPES",
+                                       "Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
+                                   $fix) {
+                                       $fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
+                               }
+                       }
+               }
+
+# check for cast of C90 native int or longer types constants
+               if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
+                       my $cast = $1;
+                       my $const = $2;
+                       if (WARN("TYPECAST_INT_CONSTANT",
+                                "Unnecessary typecast of c90 int constant\n" . $herecurr) &&
+                           $fix) {
+                               my $suffix = "";
+                               my $newconst = $const;
+                               $newconst =~ s/${Int_type}$//;
+                               $suffix .= 'U' if ($cast =~ /\bunsigned\b/);
+                               if ($cast =~ /\blong\s+long\b/) {
+                                       $suffix .= 'LL';
+                               } elsif ($cast =~ /\blong\b/) {
+                                       $suffix .= 'L';
+                               }
+                               $fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
                        }
                }
 
@@ -4139,16 +5710,10 @@ sub process {
                        if (WARN("SIZEOF_PARENTHESIS",
                                 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
+                               $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
                        }
                }
 
-# check for line continuations in quoted strings with odd counts of "
-               if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
-                       WARN("LINE_CONTINUATIONS",
-                            "Avoid line continuations in quoted strings\n" . $herecurr);
-               }
-
 # check for struct spinlock declarations
                if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
                        WARN("USE_SPINLOCK_T",
@@ -4158,19 +5723,46 @@ sub process {
 # check for seq_printf uses that could be seq_puts
                if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
                        my $fmt = get_quoted_string($line, $rawline);
-                       if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
+                       $fmt =~ s/%%//g;
+                       if ($fmt !~ /%/) {
                                if (WARN("PREFER_SEQ_PUTS",
                                         "Prefer seq_puts to seq_printf\n" . $herecurr) &&
                                    $fix) {
-                                       $fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/;
+                                       $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
+                               }
+                       }
+               }
+
+               # check for vsprintf extension %p<foo> misuses
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
+                   $1 !~ /^_*volatile_*$/) {
+                       my $bad_extension = "";
+                       my $lc = $stat =~ tr@\n@@;
+                       $lc = $lc + $linenr;
+                       for (my $count = $linenr; $count <= $lc; $count++) {
+                               my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
+                               $fmt =~ s/%%//g;
+                               if ($fmt =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGNO]).)/) {
+                                       $bad_extension = $1;
+                                       last;
                                }
                        }
+                       if ($bad_extension ne "") {
+                               my $stat_real = raw_line($linenr, 0);
+                               for (my $count = $linenr + 1; $count <= $lc; $count++) {
+                                       $stat_real = $stat_real . "\n" . raw_line($count, 0);
+                               }
+                               WARN("VSPRINTF_POINTER_EXTENSION",
+                                    "Invalid vsprintf pointer extension '$bad_extension'\n" . "$here\n$stat_real\n");
+                       }
                }
 
 # Check for misused memsets
                if ($^V && $^V ge 5.10.0 &&
                    defined $stat &&
-                   $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
+                   $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
 
                        my $ms_addr = $2;
                        my $ms_val = $7;
@@ -4186,14 +5778,46 @@ sub process {
                }
 
 # Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
-               if ($^V && $^V ge 5.10.0 &&
-                   $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
-                       if (WARN("PREFER_ETHER_ADDR_COPY",
-                                "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) &&
-                           $fix) {
-                               $fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
-                       }
-               }
+#              if ($^V && $^V ge 5.10.0 &&
+#                  defined $stat &&
+#                  $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
+#                      if (WARN("PREFER_ETHER_ADDR_COPY",
+#                               "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
+#                          $fix) {
+#                              $fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
+#                      }
+#              }
+
+# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
+#              if ($^V && $^V ge 5.10.0 &&
+#                  defined $stat &&
+#                  $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
+#                      WARN("PREFER_ETHER_ADDR_EQUAL",
+#                           "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
+#              }
+
+# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
+# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
+#              if ($^V && $^V ge 5.10.0 &&
+#                  defined $stat &&
+#                  $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
+#
+#                      my $ms_val = $7;
+#
+#                      if ($ms_val =~ /^(?:0x|)0+$/i) {
+#                              if (WARN("PREFER_ETH_ZERO_ADDR",
+#                                       "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") &&
+#                                  $fix) {
+#                                      $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
+#                              }
+#                      } elsif ($ms_val =~ /^(?:0xff|255)$/i) {
+#                              if (WARN("PREFER_ETH_BROADCAST_ADDR",
+#                                       "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
+#                                  $fix) {
+#                                      $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
+#                              }
+#                      }
+#              }
 
 # typecasts on min/max could be min_t/max_t
                if ($^V && $^V ge 5.10.0 &&
@@ -4238,7 +5862,7 @@ sub process {
 # check for naked sscanf
                if ($^V && $^V ge 5.10.0 &&
                    defined $stat &&
-                   $stat =~ /\bsscanf\b/ &&
+                   $line =~ /\bsscanf\b/ &&
                    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
                     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
                     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
@@ -4252,13 +5876,34 @@ sub process {
                             "unchecked sscanf return value\n" . "$here\n$stat_real\n");
                }
 
+# check for simple sscanf that should be kstrto<foo>
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $line =~ /\bsscanf\b/) {
+                       my $lc = $stat =~ tr@\n@@;
+                       $lc = $lc + $linenr;
+                       my $stat_real = raw_line($linenr, 0);
+                       for (my $count = $linenr + 1; $count <= $lc; $count++) {
+                               $stat_real = $stat_real . "\n" . raw_line($count, 0);
+                       }
+                       if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
+                               my $format = $6;
+                               my $count = $format =~ tr@%@%@;
+                               if ($count == 1 &&
+                                   $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
+                                       WARN("SSCANF_TO_KSTRTO",
+                                            "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
+                               }
+                       }
+               }
+
 # check for new externs in .h files.
                if ($realfile =~ /\.h$/ &&
                    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
                        if (CHK("AVOID_EXTERNS",
                                "extern prototypes should be avoided in .h files\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
+                               $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
                        }
                }
 
@@ -4292,13 +5937,50 @@ sub process {
                             "externs should be avoided in .c files\n" .  $herecurr);
                }
 
+# check for function declarations that have arguments without identifier names
+               if (defined $stat &&
+                   $stat =~ /^.\s*(?:extern\s+)?$Type\s*$Ident\s*\(\s*([^{]+)\s*\)\s*;/s &&
+                   $1 ne "void") {
+                       my $args = trim($1);
+                       while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
+                               my $arg = trim($1);
+                               if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
+                                       WARN("FUNCTION_ARGUMENTS",
+                                            "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
+                               }
+                       }
+               }
+
+# check for function definitions
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
+                       $context_function = $1;
+
+# check for multiline function definition with misplaced open brace
+                       my $ok = 0;
+                       my $cnt = statement_rawlines($stat);
+                       my $herectx = $here . "\n";
+                       for (my $n = 0; $n < $cnt; $n++) {
+                               my $rl = raw_line($linenr, $n);
+                               $herectx .=  $rl . "\n";
+                               $ok = 1 if ($rl =~ /^[ \+]\{/);
+                               $ok = 1 if ($rl =~ /\{/ && $n == 0);
+                               last if $rl =~ /^[ \+].*\{/;
+                       }
+                       if (!$ok) {
+                               ERROR("OPEN_BRACE",
+                                     "open brace '{' following function definitions go on the next line\n" . $herectx);
+                       }
+               }
+
 # checks for new __setup's
                if ($rawline =~ /\b__setup\("([^"]*)"/) {
                        my $name = $1;
 
                        if (!grep(/$name/, @setup_docs)) {
                                CHK("UNDOCUMENTED_SETUP",
-                                   "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
+                                   "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst\n" . $herecurr);
                        }
                }
 
@@ -4316,6 +5998,38 @@ sub process {
                            "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
                }
 
+# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
+                       my $oldfunc = $3;
+                       my $a1 = $4;
+                       my $a2 = $10;
+                       my $newfunc = "kmalloc_array";
+                       $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
+                       my $r1 = $a1;
+                       my $r2 = $a2;
+                       if ($a1 =~ /^sizeof\s*\S/) {
+                               $r1 = $a2;
+                               $r2 = $a1;
+                       }
+                       if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
+                           !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
+                               my $ctx = '';
+                               my $herectx = $here . "\n";
+                               my $cnt = statement_rawlines($stat);
+                               for (my $n = 0; $n < $cnt; $n++) {
+                                       $herectx .= raw_line($linenr, $n) . "\n";
+                               }
+                               if (WARN("ALLOC_WITH_MULTIPLY",
+                                        "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
+                                   $cnt == 1 &&
+                                   $fix) {
+                                       $fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
+                               }
+                       }
+               }
+
 # check for krealloc arg reuse
                if ($^V && $^V ge 5.10.0 &&
                    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
@@ -4329,18 +6043,34 @@ sub process {
                             "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
                }
 
-# check for GFP_NOWAIT use
-               if ($line =~ /\b__GFP_NOFAIL\b/) {
-                       WARN("__GFP_NOFAIL",
-                            "Use of __GFP_NOFAIL is deprecated, no new users should be added\n" . $herecurr);
-               }
-
 # check for multiple semicolons
                if ($line =~ /;\s*;\s*$/) {
                        if (WARN("ONE_SEMICOLON",
                                 "Statements terminations use 1 semicolon\n" . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g;
+                               $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
+                       }
+               }
+
+# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
+               if ($realfile !~ m@^include/uapi/@ &&
+                   $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
+                       my $ull = "";
+                       $ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
+                       if (CHK("BIT_MACRO",
+                               "Prefer using the BIT$ull macro\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
+                       }
+               }
+
+# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
+               if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
+                       my $config = $1;
+                       if (WARN("PREFER_IS_ENABLED",
+                                "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
                        }
                }
 
@@ -4350,7 +6080,7 @@ sub process {
                        my $has_statement = 0;
                        my $count = 0;
                        my $prevline = $linenr;
-                       while ($prevline > 1 && $count < 3 && !$has_break) {
+                       while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
                                $prevline--;
                                my $rline = $rawlines[$prevline - 1];
                                my $fline = $lines[$prevline - 1];
@@ -4388,10 +6118,16 @@ sub process {
                        if (WARN("USE_FUNC",
                                 "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr) &&
                            $fix) {
-                               $fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g;
+                               $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
                        }
                }
 
+# check for uses of __DATE__, __TIME__, __TIMESTAMP__
+               while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
+                       ERROR("DATE_TIME",
+                             "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
+               }
+
 # check for use of yield()
                if ($line =~ /\byield\s*\(\s*\)/) {
                        WARN("YIELD",
@@ -4437,55 +6173,18 @@ sub process {
                             "$1 is obsolete, use k$3 instead\n" . $herecurr);
                }
 
-# check for __initcall(), use device_initcall() explicitly please
+# check for __initcall(), use device_initcall() explicitly or more appropriate function please
                if ($line =~ /^.\s*__initcall\s*\(/) {
                        WARN("USE_DEVICE_INITCALL",
-                            "please use device_initcall() instead of __initcall()\n" . $herecurr);
-               }
-
-# check for various ops structs, ensure they are const.
-               my $struct_ops = qr{acpi_dock_ops|
-                               address_space_operations|
-                               backlight_ops|
-                               block_device_operations|
-                               dentry_operations|
-                               dev_pm_ops|
-                               dma_map_ops|
-                               extent_io_ops|
-                               file_lock_operations|
-                               file_operations|
-                               hv_ops|
-                               ide_dma_ops|
-                               intel_dvo_dev_ops|
-                               item_operations|
-                               iwl_ops|
-                               kgdb_arch|
-                               kgdb_io|
-                               kset_uevent_ops|
-                               lock_manager_operations|
-                               microcode_ops|
-                               mtrr_ops|
-                               neigh_ops|
-                               nlmsvc_binding|
-                               pci_raw_ops|
-                               pipe_buf_operations|
-                               platform_hibernation_ops|
-                               platform_suspend_ops|
-                               proto_ops|
-                               rpc_pipe_ops|
-                               seq_operations|
-                               snd_ac97_build_ops|
-                               soc_pcmcia_socket_ops|
-                               stacktrace_ops|
-                               sysfs_ops|
-                               tty_operations|
-                               usb_mon_operations|
-                               wd_ops}x;
+                            "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
+               }
+
+# check for various structs that are normally const (ops, kgdb, device_tree)
+# and avoid what seem like struct definitions 'struct foo {'
                if ($line !~ /\bconst\b/ &&
-                   $line =~ /\bstruct\s+($struct_ops)\b/) {
+                   $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
                        WARN("CONST_STRUCT",
-                            "struct $1 should normally be const\n" .
-                               $herecurr);
+                            "struct $1 should normally be const\n" . $herecurr);
                }
 
 # use of NR_CPUS is usually wrong
@@ -4507,16 +6206,11 @@ sub process {
                              "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
                }
 
-# check for %L{u,d,i} in strings
-               my $string;
-               while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
-                       $string = substr($rawline, $-[1], $+[1] - $-[1]);
-                       $string =~ s/%%/__/g;
-                       if ($string =~ /(?<!%)%L[udi]/) {
-                               WARN("PRINTF_L",
-                                    "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
-                               last;
-                       }
+# likely/unlikely comparisons similar to "(likely(foo) > 0)"
+               if ($^V && $^V ge 5.10.0 &&
+                   $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
+                       WARN("LIKELY_MISUSE",
+                            "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
                }
 
 # whine mightly about in_atomic
@@ -4530,6 +6224,34 @@ sub process {
                        }
                }
 
+# whine about ACCESS_ONCE
+               if ($^V && $^V ge 5.10.0 &&
+                   $line =~ /\bACCESS_ONCE\s*$balanced_parens\s*(=(?!=))?\s*($FuncArg)?/) {
+                       my $par = $1;
+                       my $eq = $2;
+                       my $fun = $3;
+                       $par =~ s/^\(\s*(.*)\s*\)$/$1/;
+                       if (defined($eq)) {
+                               if (WARN("PREFER_WRITE_ONCE",
+                                        "Prefer WRITE_ONCE(<FOO>, <BAR>) over ACCESS_ONCE(<FOO>) = <BAR>\n" . $herecurr) &&
+                                   $fix) {
+                                       $fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)\s*$eq\s*\Q$fun\E/WRITE_ONCE($par, $fun)/;
+                               }
+                       } else {
+                               if (WARN("PREFER_READ_ONCE",
+                                        "Prefer READ_ONCE(<FOO>) over ACCESS_ONCE(<FOO>)\n" . $herecurr) &&
+                                   $fix) {
+                                       $fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)/READ_ONCE($par)/;
+                               }
+                       }
+               }
+
+# check for mutex_trylock_recursive usage
+               if ($line =~ /mutex_trylock_recursive/) {
+                       ERROR("LOCKING",
+                             "recursive locking is bad, do not use this ever.\n" . $herecurr);
+               }
+
 # check for lockdep_set_novalidate_class
                if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
                    $line =~ /__lockdep_no_validate__\s*\)/ ) {
@@ -4541,11 +6263,95 @@ sub process {
                        }
                }
 
-               if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
-                   $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
+               if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
+                   $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
                        WARN("EXPORTED_WORLD_WRITABLE",
                             "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
                }
+
+# Mode permission misuses where it seems decimal should be octal
+# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
+               if ($^V && $^V ge 5.10.0 &&
+                   defined $stat &&
+                   $line =~ /$mode_perms_search/) {
+                       foreach my $entry (@mode_permission_funcs) {
+                               my $func = $entry->[0];
+                               my $arg_pos = $entry->[1];
+
+                               my $lc = $stat =~ tr@\n@@;
+                               $lc = $lc + $linenr;
+                               my $stat_real = raw_line($linenr, 0);
+                               for (my $count = $linenr + 1; $count <= $lc; $count++) {
+                                       $stat_real = $stat_real . "\n" . raw_line($count, 0);
+                               }
+
+                               my $skip_args = "";
+                               if ($arg_pos > 1) {
+                                       $arg_pos--;
+                                       $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
+                               }
+                               my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
+                               if ($stat =~ /$test/) {
+                                       my $val = $1;
+                                       $val = $6 if ($skip_args ne "");
+                                       if (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
+                                           ($val =~ /^$Octal$/ && length($val) ne 4)) {
+                                               ERROR("NON_OCTAL_PERMISSIONS",
+                                                     "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
+                                       }
+                                       if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
+                                               ERROR("EXPORTED_WORLD_WRITABLE",
+                                                     "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
+                                       }
+                               }
+                       }
+               }
+
+# check for uses of S_<PERMS> that could be octal for readability
+               if ($line =~ /\b$mode_perms_string_search\b/) {
+                       my $val = "";
+                       my $oval = "";
+                       my $to = 0;
+                       my $curpos = 0;
+                       my $lastpos = 0;
+                       while ($line =~ /\b(($mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
+                               $curpos = pos($line);
+                               my $match = $2;
+                               my $omatch = $1;
+                               last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
+                               $lastpos = $curpos;
+                               $to |= $mode_permission_string_types{$match};
+                               $val .= '\s*\|\s*' if ($val ne "");
+                               $val .= $match;
+                               $oval .= $omatch;
+                       }
+                       $oval =~ s/^\s*\|\s*//;
+                       $oval =~ s/\s*\|\s*$//;
+                       my $octal = sprintf("%04o", $to);
+                       if (WARN("SYMBOLIC_PERMS",
+                                "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
+                           $fix) {
+                               $fixed[$fixlinenr] =~ s/$val/$octal/;
+                       }
+               }
+
+# validate content of MODULE_LICENSE against list from include/linux/module.h
+               if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
+                       my $extracted_string = get_quoted_string($line, $rawline);
+                       my $valid_licenses = qr{
+                                               GPL|
+                                               GPL\ v2|
+                                               GPL\ and\ additional\ rights|
+                                               Dual\ BSD/GPL|
+                                               Dual\ MIT/GPL|
+                                               Dual\ MPL/GPL|
+                                               Proprietary
+                                       }x;
+                       if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
+                               WARN("MODULE_LICENSE",
+                                    "unknown module license " . $extracted_string . "\n" . $herecurr);
+                       }
+               }
        }
 
        # If we have no input at all, then there is nothing to report on
@@ -4566,11 +6372,11 @@ sub process {
                exit(0);
        }
 
-       if (!$is_patch) {
+       if (!$is_patch && $file !~ /cover-letter\.patch$/) {
                ERROR("NOT_UNIFIED_DIFF",
                      "Does not appear to be a unified-diff format patch\n");
        }
-       if ($is_patch && $chk_signoff && $signoff == 0) {
+       if ($is_patch && $has_commit_log && $chk_signoff && $signoff == 0) {
                ERROR("MISSING_SIGN_OFF",
                      "Missing Signed-off-by: line(s)\n");
        }
@@ -4581,34 +6387,39 @@ sub process {
                print "total: $cnt_error errors, $cnt_warn warnings, " .
                        (($check)? "$cnt_chk checks, " : "") .
                        "$cnt_lines lines checked\n";
-               print "\n" if ($quiet == 0);
        }
 
        if ($quiet == 0) {
+               # If there were any defects found and not already fixing them
+               if (!$clean and !$fix) {
+                       print << "EOM"
 
-               if ($^V lt 5.10.0) {
-                       print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
-                       print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
+NOTE: For some of the reported defects, checkpatch may be able to
+      mechanically convert to the typical style using --fix or --fix-inplace.
+EOM
                }
-
                # If there were whitespace errors which cleanpatch can fix
                # then suggest that.
                if ($rpt_cleaners) {
-                       print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
-                       print "      scripts/cleanfile\n\n";
                        $rpt_cleaners = 0;
+                       print << "EOM"
+
+NOTE: Whitespace errors detected.
+      You may wish to use scripts/cleanpatch or scripts/cleanfile
+EOM
                }
        }
 
-       hash_show_words(\%use_type, "Used");
-       hash_show_words(\%ignore_type, "Ignored");
-
-       if ($clean == 0 && $fix && "@rawlines" ne "@fixed") {
+       if ($clean == 0 && $fix &&
+           ("@rawlines" ne "@fixed" ||
+            $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
                my $newfile = $filename;
                $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
                my $linecount = 0;
                my $f;
 
+               @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
+
                open($f, '>', $newfile)
                    or die "$P: Can't open $newfile for write\n";
                foreach my $fixed_line (@fixed) {
@@ -4616,7 +6427,7 @@ sub process {
                        if ($file) {
                                if ($linecount > 3) {
                                        $fixed_line =~ s/^\+//;
-                                       print $f $fixed_line. "\n";
+                                       print $f $fixed_line . "\n";
                                }
                        } else {
                                print $f $fixed_line . "\n";
@@ -4626,6 +6437,7 @@ sub process {
 
                if (!$quiet) {
                        print << "EOM";
+
 Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
 
 Do _NOT_ trust the results written to this file.
@@ -4633,22 +6445,17 @@ Do _NOT_ submit these changes without inspecting them for correctness.
 
 This EXPERIMENTAL file is simply a convenience to help rewrite patches.
 No warranties, expressed or implied...
-
 EOM
                }
        }
 
-       if ($clean == 1 && $quiet == 0) {
-               print "$vname has no obvious style problems and is ready for submission.\n"
-       }
-       if ($clean == 0 && $quiet == 0) {
-               print << "EOM";
-$vname has style problems, please review.
-
-If any of these errors are false positives, please report
-them to the maintainer, see CHECKPATCH in MAINTAINERS.
-EOM
+       if ($quiet == 0) {
+               print "\n";
+               if ($clean == 1) {
+                       print "$vname has no obvious style problems and is ready for submission.\n";
+               } else {
+                       print "$vname has style problems, please review.\n";
+               }
        }
-
        return $clean;
 }
index 9ce0c3f039ffa26e16b6e31897813ac42f13b590..56bb639091f388e97991c21504b6e0d0780f443d 100644 (file)
@@ -562,7 +562,6 @@ CONFIG_EHCI_MMIO_BIG_ENDIAN
 CONFIG_EHCI_MXS_PORT0
 CONFIG_EHCI_MXS_PORT1
 CONFIG_ELBC_NAND_SPL_STATIC_PGSIZE
-CONFIG_EMIF4
 CONFIG_EMMC_BOOT
 CONFIG_EMU
 CONFIG_ENABLE_36BIT_PHYS
@@ -1119,7 +1118,6 @@ CONFIG_IPAM390_GPIO_BOOTMODE
 CONFIG_IPAM390_GPIO_LED_GREEN
 CONFIG_IPAM390_GPIO_LED_RED
 CONFIG_IPROC
-CONFIG_IPUV3_CLK
 CONFIG_IP_DEFRAG
 CONFIG_IRAM_BASE
 CONFIG_IRAM_END
@@ -1360,8 +1358,6 @@ CONFIG_MACH_SPECIFIC
 CONFIG_MACH_TYPE
 CONFIG_MACH_TYPE_COMPAT_REV
 CONFIG_MACRESET_TIMEOUT
-CONFIG_MAC_ADDR_IN_EEPROM
-CONFIG_MAC_ADDR_IN_SPIFLASH
 CONFIG_MALLOC_F_ADDR
 CONFIG_MALTA
 CONFIG_MARCO_MEMSET
@@ -1951,7 +1947,6 @@ CONFIG_SAMSUNG
 CONFIG_SAMSUNG_ONENAND
 CONFIG_SANDBOX_ARCH
 CONFIG_SANDBOX_BIG_ENDIAN
-CONFIG_SANDBOX_BITS_PER_LONG
 CONFIG_SANDBOX_SDL
 CONFIG_SANDBOX_SPI_MAX_BUS
 CONFIG_SANDBOX_SPI_MAX_CS
@@ -1977,7 +1972,6 @@ CONFIG_SCSI_DEV_LIST
 CONFIG_SC_TIMER_CLK
 CONFIG_SDCARD
 CONFIG_SDRAM_OFFSET_FOR_RT
-CONFIG_SDRC
 CONFIG_SD_BOOT_QSPI
 CONFIG_SECBOOT
 CONFIG_SECURE_BL1_ONLY
@@ -2435,7 +2429,6 @@ CONFIG_SYS_CACHE_STASHING
 CONFIG_SYS_CADMUS_BASE_REG
 CONFIG_SYS_CBSIZE
 CONFIG_SYS_CCCR
-CONFIG_SYS_CCI400_ADDR
 CONFIG_SYS_CCSRBAR
 CONFIG_SYS_CCSRBAR_PHYS
 CONFIG_SYS_CCSRBAR_PHYS_HIGH
@@ -4421,7 +4414,6 @@ CONFIG_SYS_PSDPAR
 CONFIG_SYS_PSSR_VAL
 CONFIG_SYS_PTCPAR
 CONFIG_SYS_PTDPAR
-CONFIG_SYS_PTL2_BITS
 CONFIG_SYS_PTV
 CONFIG_SYS_PUAPAR
 CONFIG_SYS_QE_FMAN_FW_IN_MMC
@@ -4796,7 +4788,6 @@ CONFIG_SYS_USE_SERIALFLASH
 CONFIG_SYS_USE_SPIFLASH
 CONFIG_SYS_USR_EXCEP
 CONFIG_SYS_U_BOOT_OFFS
-CONFIG_SYS_VA_BITS
 CONFIG_SYS_VCXK_ACKNOWLEDGE_DDR
 CONFIG_SYS_VCXK_ACKNOWLEDGE_PIN
 CONFIG_SYS_VCXK_ACKNOWLEDGE_PORT
diff --git a/scripts/const_structs.checkpatch b/scripts/const_structs.checkpatch
new file mode 100644 (file)
index 0000000..da775bc
--- /dev/null
@@ -0,0 +1,2 @@
+# Put structs here that should be constant
+__dummy__
index 923e8d95f06f8a4f89cfc63ef1e7178d31d49e94..30d1e6184df1fbbd39af922393076b1041ff04b0 100644 (file)
@@ -23,9 +23,9 @@ static int dm_test_blk_base(struct unit_test_state *uts)
 
        /* Create two, one the parent of the other */
        ut_assertok(blk_create_device(gd->dm_root, "sandbox_host_blk", "test",
-                                     IF_TYPE_HOST, 1, 512, 1024, &blk));
+                                     IF_TYPE_HOST, 1, 512, 2, &blk));
        ut_assertok(blk_create_device(blk, "usb_storage_blk", "test",
-                                     IF_TYPE_USB, 3, 512, 1024, &usb_blk));
+                                     IF_TYPE_USB, 3, 512, 2, &usb_blk));
 
        /* Check we can find them */
        ut_asserteq(-ENODEV, blk_get_device(IF_TYPE_HOST, 0, &dev));
@@ -101,7 +101,7 @@ static int dm_test_blk_find(struct unit_test_state *uts)
        struct udevice *blk, *dev;
 
        ut_assertok(blk_create_device(gd->dm_root, "sandbox_host_blk", "test",
-                                     IF_TYPE_HOST, 1, 512, 1024, &blk));
+                                     IF_TYPE_HOST, 1, 512, 2, &blk));
        ut_asserteq(-ENODEV, blk_find_device(IF_TYPE_HOST, 0, &dev));
        ut_assertok(blk_find_device(IF_TYPE_HOST, 1, &dev));
        ut_asserteq_ptr(blk, dev);
index 9d88d31467c464aeeba542b8e71a378399ee0498..4478e6b8fc6e94d97cbad8755bd37137c0893fdf 100644 (file)
@@ -92,7 +92,7 @@ static int dm_do_test(struct unit_test_state *uts, struct unit_test *test,
        if (test->flags & DM_TESTF_PROBE_TEST)
                ut_assertok(do_autoprobe(uts));
        if (test->flags & DM_TESTF_SCAN_FDT)
-               ut_assertok(dm_scan_fdt(gd->fdt_blob, false));
+               ut_assertok(dm_extended_scan_fdt(gd->fdt_blob, false));
 
        /*
         * Silence the console and rely on console reocrding to get
index 907f085446194650e422580d13b0a408e554a3f8..416645c88428b1e7a14957707351afa0416d5d01 100644 (file)
@@ -13,3 +13,4 @@ DTC_FLAGS += -@
 # DT overlays
 obj-y += test-fdt-base.dtb.o
 obj-y += test-fdt-overlay.dtb.o
+obj-y += test-fdt-overlay-stacked.dtb.o
index cbef720b4c091fd0b8075e0c60ca852b582032ff..24891ee829018e5d1ae75af1df0f5bb9358befa3 100644 (file)
@@ -20,8 +20,9 @@
 
 extern u32 __dtb_test_fdt_base_begin;
 extern u32 __dtb_test_fdt_overlay_begin;
+extern u32 __dtb_test_fdt_overlay_stacked_begin;
 
-static int fdt_getprop_u32_by_index(void *fdt, const char *path,
+static int ut_fdt_getprop_u32_by_index(void *fdt, const char *path,
                                    const char *name, int index,
                                    u32 *out)
 {
@@ -42,10 +43,10 @@ static int fdt_getprop_u32_by_index(void *fdt, const char *path,
        return 0;
 }
 
-static int fdt_getprop_u32(void *fdt, const char *path, const char *name,
+static int ut_fdt_getprop_u32(void *fdt, const char *path, const char *name,
                           u32 *out)
 {
-       return fdt_getprop_u32_by_index(fdt, path, name, 0, out);
+       return ut_fdt_getprop_u32_by_index(fdt, path, name, 0, out);
 }
 
 static int fdt_getprop_str(void *fdt, const char *path, const char *name,
@@ -68,7 +69,7 @@ static int fdt_overlay_change_int_property(struct unit_test_state *uts)
        void *fdt = uts->priv;
        u32 val = 0;
 
-       ut_assertok(fdt_getprop_u32(fdt, "/test-node", "test-int-property",
+       ut_assertok(ut_fdt_getprop_u32(fdt, "/test-node", "test-int-property",
                                    &val));
        ut_asserteq(43, val);
 
@@ -158,11 +159,11 @@ static int fdt_overlay_local_phandle(struct unit_test_state *uts)
        local_phandle = fdt_get_phandle(fdt, off);
        ut_assert(local_phandle);
 
-       ut_assertok(fdt_getprop_u32_by_index(fdt, "/", "test-several-phandle",
+       ut_assertok(ut_fdt_getprop_u32_by_index(fdt, "/", "test-several-phandle",
                                             0, &val));
        ut_asserteq(local_phandle, val);
 
-       ut_assertok(fdt_getprop_u32_by_index(fdt, "/", "test-several-phandle",
+       ut_assertok(ut_fdt_getprop_u32_by_index(fdt, "/", "test-several-phandle",
                                             1, &val));
        ut_asserteq(local_phandle, val);
 
@@ -189,11 +190,11 @@ static int fdt_overlay_local_phandles(struct unit_test_state *uts)
        test_phandle = fdt_get_phandle(fdt, off);
        ut_assert(test_phandle);
 
-       ut_assertok(fdt_getprop_u32_by_index(fdt, "/", "test-phandle", 0,
+       ut_assertok(ut_fdt_getprop_u32_by_index(fdt, "/", "test-phandle", 0,
                                             &val));
        ut_asserteq(test_phandle, val);
 
-       ut_assertok(fdt_getprop_u32_by_index(fdt, "/", "test-phandle", 1,
+       ut_assertok(ut_fdt_getprop_u32_by_index(fdt, "/", "test-phandle", 1,
                                             &val));
        ut_asserteq(local_phandle, val);
 
@@ -201,6 +202,19 @@ static int fdt_overlay_local_phandles(struct unit_test_state *uts)
 }
 OVERLAY_TEST(fdt_overlay_local_phandles, 0);
 
+static int fdt_overlay_stacked(struct unit_test_state *uts)
+{
+       void *fdt = uts->priv;
+       u32 val = 0;
+
+       ut_assertok(ut_fdt_getprop_u32(fdt, "/new-local-node",
+                                      "stacked-test-int-property", &val));
+       ut_asserteq(43, val);
+
+       return CMD_RET_SUCCESS;
+}
+OVERLAY_TEST(fdt_overlay_stacked, 0);
+
 int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        struct unit_test *tests = ll_entry_start(struct unit_test,
@@ -210,7 +224,8 @@ int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        struct unit_test *test;
        void *fdt_base = &__dtb_test_fdt_base_begin;
        void *fdt_overlay = &__dtb_test_fdt_overlay_begin;
-       void *fdt_base_copy, *fdt_overlay_copy;
+       void *fdt_overlay_stacked = &__dtb_test_fdt_overlay_stacked_begin;
+       void *fdt_base_copy, *fdt_overlay_copy, *fdt_overlay_stacked_copy;
 
        uts = calloc(1, sizeof(*uts));
        if (!uts)
@@ -228,6 +243,10 @@ int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        if (!fdt_overlay_copy)
                return -ENOMEM;
 
+       fdt_overlay_stacked_copy = malloc(FDT_COPY_SIZE);
+       if (!fdt_overlay_stacked_copy)
+               return -ENOMEM;
+
        /*
         * Resize the FDT to 4k so that we have room to operate on
         *
@@ -245,9 +264,21 @@ int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        ut_assertok(fdt_open_into(fdt_overlay, fdt_overlay_copy,
                                  FDT_COPY_SIZE));
 
+       /*
+        * Resize the stacked overlay to 4k so that we have room to operate on
+        *
+        * (and relocate it since the memory might be mapped
+        * read-only)
+        */
+       ut_assertok(fdt_open_into(fdt_overlay_stacked, fdt_overlay_stacked_copy,
+                                 FDT_COPY_SIZE));
+
        /* Apply the overlay */
        ut_assertok(fdt_overlay_apply(fdt_base_copy, fdt_overlay_copy));
 
+       /* Apply the stacked overlay */
+       ut_assertok(fdt_overlay_apply(fdt_base_copy, fdt_overlay_stacked_copy));
+
        if (argc == 1)
                printf("Running %d environment tests\n", n_ents);
 
@@ -263,6 +294,7 @@ int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
        printf("Failures: %d\n", uts->fail_count);
 
+       free(fdt_overlay_stacked_copy);
        free(fdt_overlay_copy);
        free(fdt_base_copy);
        free(uts);
diff --git a/test/overlay/test-fdt-overlay-stacked.dts b/test/overlay/test-fdt-overlay-stacked.dts
new file mode 100644 (file)
index 0000000..9fb7c7b
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2016 NextThing Co
+ * Copyright (c) 2016 Free Electrons
+ * Copyright (c) 2018 Konsulko Group
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/dts-v1/;
+/plugin/;
+
+/ {
+       /* Test that we can reference an overlay symbol */
+       fragment@0 {
+               target = <&local>;
+
+               __overlay__ {
+                       stacked-test-int-property = <43>;
+               };
+       };
+};
diff --git a/test/py/tests/test_gpt.py b/test/py/tests/test_gpt.py
new file mode 100644 (file)
index 0000000..e2bbd08
--- /dev/null
@@ -0,0 +1,114 @@
+# Copyright (c) 2017 Alison Chaiken
+# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0
+
+# Test GPT manipulation commands.
+
+import os
+import pytest
+import u_boot_utils
+
+"""
+These tests rely on a 4 MB disk image, which is automatically created by
+the test.
+"""
+
+class GptTestDiskImage(object):
+    """Disk Image used by the GPT tests."""
+
+    def __init__(self, u_boot_console):
+        """Initialize a new GptTestDiskImage object.
+
+        Args:
+            u_boot_console: A U-Boot console.
+
+        Returns:
+            Nothing.
+        """
+
+        filename = 'test_gpt_disk_image.bin'
+        self.path = u_boot_console.config.persistent_data_dir + '/' + filename
+
+        if os.path.exists(self.path):
+            u_boot_console.log.action('Disk image file ' + self.path +
+                ' already exists')
+        else:
+            u_boot_console.log.action('Generating ' + self.path)
+            fd = os.open(self.path, os.O_RDWR | os.O_CREAT)
+            os.ftruncate(fd, 4194304)
+            os.close(fd)
+            sgdisk = '/sbin/sgdisk'
+            cmd = (sgdisk, '-U', '375a56f7-d6c9-4e81-b5f0-09d41ca89efe',
+                self.path)
+            u_boot_utils.run_and_log(u_boot_console, cmd)
+            cmd = (sgdisk, '--new=1:2048:2560', self.path)
+            u_boot_utils.run_and_log(u_boot_console, cmd)
+            cmd = (sgdisk, '--new=2:4096:4608', self.path)
+            u_boot_utils.run_and_log(u_boot_console, cmd)
+            cmd = (sgdisk, '-l', self.path)
+            u_boot_utils.run_and_log(u_boot_console, cmd)
+
+gtdi = None
+@pytest.fixture(scope='function')
+def state_disk_image(u_boot_console):
+    """pytest fixture to provide a GptTestDiskImage object to tests.
+    This is function-scoped because it uses u_boot_console, which is also
+    function-scoped. However, we don't need to actually do any function-scope
+    work, so this simply returns the same object over and over each time."""
+
+    global gtdi
+    if not gtdi:
+        gtdi = GptTestDiskImage(u_boot_console)
+    return gtdi
+
+@pytest.mark.boardspec('sandbox')
+@pytest.mark.buildconfigspec('cmd_gpt')
+def test_gpt_guid(state_disk_image, u_boot_console):
+    """Test the gpt guid command."""
+
+    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
+    output = u_boot_console.run_command('gpt guid host 0')
+    assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
+
+@pytest.mark.boardspec('sandbox')
+@pytest.mark.buildconfigspec('cmd_gpt')
+def test_gpt_save_guid(state_disk_image, u_boot_console):
+    """Test the gpt guid command to save GUID into a string."""
+
+    if u_boot_console.config.buildconfig.get('config_cmd_gpt', 'n') != 'y':
+        pytest.skip('gpt command not supported')
+    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
+    output = u_boot_console.run_command('gpt guid host 0 newguid')
+    output = u_boot_console.run_command('printenv newguid')
+    assert '375a56f7-d6c9-4e81-b5f0-09d41ca89efe' in output
+
+@pytest.mark.boardspec('sandbox')
+@pytest.mark.buildconfigspec('cmd_gpt')
+@pytest.mark.buildconfigspec('cmd_gpt_rename')
+def test_gpt_rename_partition(state_disk_image, u_boot_console):
+    """Test the gpt rename command to write partition names."""
+
+    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
+    u_boot_console.run_command('gpt rename host 0 1 first')
+    output = u_boot_console.run_command('gpt read host 0')
+    assert 'name first' in output
+    u_boot_console.run_command('gpt rename host 0 2 second')
+    output = u_boot_console.run_command('gpt read host 0')
+    assert 'name second' in output
+
+@pytest.mark.boardspec('sandbox')
+@pytest.mark.buildconfigspec('cmd_gpt')
+@pytest.mark.buildconfigspec('cmd_gpt_rename')
+@pytest.mark.buildconfigspec('cmd_part')
+def test_gpt_swap_partitions(state_disk_image, u_boot_console):
+    """Test the gpt swap command to exchange two partition names."""
+
+    u_boot_console.run_command('host bind 0 ' + state_disk_image.path)
+    output = u_boot_console.run_command('part list host 0')
+    assert '0x000007ff "first"' in output
+    assert '0x000017ff "second"' in output
+    u_boot_console.run_command('gpt swap host 0 first second')
+    output = u_boot_console.run_command('part list host 0')
+    assert '0x000007ff "second"' in output
+    assert '0x000017ff "first"' in output
index b1f474236e4eaca6b1e0be679ab79edc8c279de8..eedf73f85831bb99c80d3502d185a95cd16f0e24 100644 (file)
@@ -160,7 +160,7 @@ class ConsoleBase(object):
 
         Args:
             cmd: The command to send.
-            wait_for_each: Boolean indicating whether to wait for U-Boot to
+            wait_for_echo: Boolean indicating whether to wait for U-Boot to
                 echo the command text back to its output.
             send_nl: Boolean indicating whether to send a newline character
                 after the command string.
diff --git a/tools/binman/etype/intel_vbt.py b/tools/binman/etype/intel_vbt.py
new file mode 100644 (file)
index 0000000..29aedaf
--- /dev/null
@@ -0,0 +1,14 @@
+#
+# Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+# Entry-type module for Intel Video BIOS Table binary blob
+#
+
+from entry import Entry
+from blob import Entry_blob
+
+class Entry_intel_vbt(Entry_blob):
+    def __init__(self, image, etype, node):
+        Entry_blob.__init__(self, image, etype, node)
index 8b4db4165970ab5f114729124335a54907a1b44f..c4207ce5d299fbdc3f6297a29089da3214da75ba 100644 (file)
@@ -38,6 +38,7 @@ X86_START16_DATA    = 'start16'
 U_BOOT_NODTB_DATA   = 'nodtb with microcode pointer somewhere in here'
 FSP_DATA            = 'fsp'
 CMC_DATA            = 'cmc'
+VBT_DATA            = 'vbt'
 
 class TestFunctional(unittest.TestCase):
     """Functional tests for binman
@@ -74,6 +75,7 @@ class TestFunctional(unittest.TestCase):
         TestFunctional._MakeInputFile('u-boot-nodtb.bin', U_BOOT_NODTB_DATA)
         TestFunctional._MakeInputFile('fsp.bin', FSP_DATA)
         TestFunctional._MakeInputFile('cmc.bin', CMC_DATA)
+        TestFunctional._MakeInputFile('vbt.bin', VBT_DATA)
         self._output_setup = False
 
         # ELF file with a '_dt_ucode_base_size' symbol
@@ -801,6 +803,11 @@ class TestFunctional(unittest.TestCase):
         self.assertEqual(FSP_DATA, data[:len(FSP_DATA)])
 
     def testPackCmc(self):
-        """Test that an image with a FSP binary can be created"""
+        """Test that an image with a CMC binary can be created"""
         data = self._DoReadFile('43_intel-cmc.dts')
         self.assertEqual(CMC_DATA, data[:len(CMC_DATA)])
+
+    def testPackVbt(self):
+        """Test that an image with a VBT binary can be created"""
+        data = self._DoReadFile('46_intel-vbt.dts')
+        self.assertEqual(VBT_DATA, data[:len(VBT_DATA)])
diff --git a/tools/binman/test/46_intel-vbt.dts b/tools/binman/test/46_intel-vbt.dts
new file mode 100644 (file)
index 0000000..733f575
--- /dev/null
@@ -0,0 +1,14 @@
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               size = <16>;
+
+               intel-vbt {
+                       filename = "vbt.bin";
+               };
+       };
+};
index d28bbf0b49a20ea066535aad5e48b0818c93a81b..352ad438eed2955aeb6ec5349fc437032f659c5b 100644 (file)
@@ -204,6 +204,7 @@ class Config(object):
 
         self.print_warnings = print_warnings
         self.print_undef_assign = print_undef_assign
+        self._warnings = []
 
         # For parsing routines that stop when finding a line belonging to a
         # different construct, these holds that line and the tokenized version
@@ -398,8 +399,12 @@ class Config(object):
           need to refer to the top-level kernel directory with "$srctree".
 
         replace (default: True): True if the configuration should replace the
-           old configuration; False if it should add to it."""
+           old configuration; False if it should add to it.
 
+        Returns a list or warnings (hopefully empty)
+        """
+
+        self._warnings = []
         # Put this first so that a missing file doesn't screw up our state
         filename = os.path.expandvars(filename)
         line_feeder = _FileFeed(filename)
@@ -449,7 +454,7 @@ class Config(object):
         while 1:
             line = line_feeder.get_next()
             if line is None:
-                return
+                return self._warnings
 
             line = line.rstrip()
 
@@ -1763,8 +1768,10 @@ class Config(object):
 
     def _warn(self, msg, filename=None, linenr=None):
         """For printing warnings to stderr."""
+        msg = _build_msg("warning: " + msg, filename, linenr)
         if self.print_warnings:
-            _stderr_msg("warning: " + msg, filename, linenr)
+            sys.stderr.write(msg + "\n")
+        self._warnings.append(msg)
 
 class Item(object):
 
@@ -3369,10 +3376,13 @@ def _clean_up_path(path):
         path = path[2:]
     return path.rstrip("/")
 
-def _stderr_msg(msg, filename, linenr):
+def _build_msg(msg, filename, linenr):
     if filename is not None:
-        sys.stderr.write("{0}:{1}: ".format(_clean_up_path(filename), linenr))
-    sys.stderr.write(msg + "\n")
+        msg = "{0}:{1}: ".format(_clean_up_path(filename), linenr) + msg
+    return msg
+
+def _stderr_msg(msg, filename, linenr):
+    sys.stderr.write(_build_msg(msg, filename, linenr) + "\n")
 
 def _tokenization_error(s, filename, linenr):
     loc = "" if filename is None else "{0}:{1}: ".format(filename, linenr)
index 041a33188ff9e8ecae75d8f62ff6646185894cb9..dc9c0d9f45883b2a2c51f5ccd79c0f14a78bc8ae 100644 (file)
@@ -12,6 +12,7 @@ This supports converting device tree data to C structures definitions and
 static data.
 """
 
+import collections
 import copy
 import sys
 
@@ -38,11 +39,20 @@ TYPE_NAMES = {
     fdt.TYPE_BYTE: 'unsigned char',
     fdt.TYPE_STRING: 'const char *',
     fdt.TYPE_BOOL: 'bool',
+    fdt.TYPE_INT64: 'fdt64_t',
 }
 
 STRUCT_PREFIX = 'dtd_'
 VAL_PREFIX = 'dtv_'
 
+# This holds information about a property which includes phandles.
+#
+# max_args: integer: Maximum number or arguments that any phandle uses (int).
+# args: Number of args for each phandle in the property. The total number of
+#     phandles is len(args). This is a list of integers.
+PhandleInfo = collections.namedtuple('PhandleInfo', ['max_args', 'args'])
+
+
 def conv_name_to_c(name):
     """Convert a device-tree name to a C identifier
 
@@ -95,6 +105,8 @@ def get_value(ftype, value):
         return '"%s"' % value
     elif ftype == fdt.TYPE_BOOL:
         return 'true'
+    elif ftype == fdt.TYPE_INT64:
+        return '%#x' % value
 
 def get_compat_name(node):
     """Get a node's first compatible string as a C identifier
@@ -113,21 +125,6 @@ def get_compat_name(node):
         compat, aliases = compat[0], compat[1:]
     return conv_name_to_c(compat), [conv_name_to_c(a) for a in aliases]
 
-def is_phandle(prop):
-    """Check if a node contains phandles
-
-    We have no reliable way of detecting whether a node uses a phandle
-    or not. As an interim measure, use a list of known property names.
-
-    Args:
-        prop: Prop object to check
-    Return:
-        True if the object value contains phandles, else False
-    """
-    if prop.name in ['clocks']:
-        return True
-    return False
-
 
 class DtbPlatdata(object):
     """Provide a means to convert device tree binary data to platform data
@@ -141,17 +138,14 @@ class DtbPlatdata(object):
         _dtb_fname: Filename of the input device tree binary file
         _valid_nodes: A list of Node object with compatible strings
         _include_disabled: true to include nodes marked status = "disabled"
-        _phandle_nodes: A dict of nodes indexed by phandle number (1, 2...)
         _outfile: The current output file (sys.stdout or a real file)
         _lines: Stashed list of output lines for outputting in the future
-        _phandle_nodes: A dict of Nodes indexed by phandle (an integer)
     """
     def __init__(self, dtb_fname, include_disabled):
         self._fdt = None
         self._dtb_fname = dtb_fname
         self._valid_nodes = None
         self._include_disabled = include_disabled
-        self._phandle_nodes = {}
         self._outfile = None
         self._lines = []
         self._aliases = {}
@@ -196,6 +190,53 @@ class DtbPlatdata(object):
         self._lines = []
         return lines
 
+    def out_header(self):
+        """Output a message indicating that this is an auto-generated file"""
+        self.out('''/*
+ * DO NOT MODIFY
+ *
+ * This file was generated by dtoc from a .dtb (device tree binary) file.
+ */
+
+''')
+
+    def get_phandle_argc(self, prop, node_name):
+        """Check if a node contains phandles
+
+        We have no reliable way of detecting whether a node uses a phandle
+        or not. As an interim measure, use a list of known property names.
+
+        Args:
+            prop: Prop object to check
+        Return:
+            Number of argument cells is this is a phandle, else None
+        """
+        if prop.name in ['clocks']:
+            val = prop.value
+            if not isinstance(val, list):
+                val = [val]
+            i = 0
+
+            max_args = 0
+            args = []
+            while i < len(val):
+                phandle = fdt_util.fdt32_to_cpu(val[i])
+                target = self._fdt.phandle_to_node.get(phandle)
+                if not target:
+                    raise ValueError("Cannot parse '%s' in node '%s'" %
+                                     (prop.name, node_name))
+                prop_name = '#clock-cells'
+                cells = target.props.get(prop_name)
+                if not cells:
+                    raise ValueError("Node '%s' has no '%s' property" %
+                            (target.name, prop_name))
+                num_args = fdt_util.fdt32_to_cpu(cells.value)
+                max_args = max(max_args, num_args)
+                args.append(num_args)
+                i += 1 + num_args
+            return PhandleInfo(max_args, args)
+        return None
+
     def scan_dtb(self):
         """Scan the device tree to obtain a tree of nodes and properties
 
@@ -207,8 +248,7 @@ class DtbPlatdata(object):
     def scan_node(self, root):
         """Scan a node and subnodes to build a tree of node and phandle info
 
-        This adds each node to self._valid_nodes and each phandle to
-        self._phandle_nodes.
+        This adds each node to self._valid_nodes.
 
         Args:
             root: Root node for scan
@@ -219,10 +259,6 @@ class DtbPlatdata(object):
                 if (not self._include_disabled and not status or
                         status.value != 'disabled'):
                     self._valid_nodes.append(node)
-                    phandle_prop = node.props.get('phandle')
-                    if phandle_prop:
-                        phandle = phandle_prop.GetPhandle()
-                        self._phandle_nodes[phandle] = node
 
             # recurse to handle any subnodes
             self.scan_node(node)
@@ -231,14 +267,72 @@ class DtbPlatdata(object):
         """Scan the device tree for useful information
 
         This fills in the following properties:
-            _phandle_nodes: A dict of Nodes indexed by phandle (an integer)
             _valid_nodes: A list of nodes we wish to consider include in the
                 platform data
         """
-        self._phandle_nodes = {}
         self._valid_nodes = []
         return self.scan_node(self._fdt.GetRoot())
 
+    @staticmethod
+    def get_num_cells(node):
+        """Get the number of cells in addresses and sizes for this node
+
+        Args:
+            node: Node to check
+
+        Returns:
+            Tuple:
+                Number of address cells for this node
+                Number of size cells for this node
+        """
+        parent = node.parent
+        na, ns = 2, 2
+        if parent:
+            na_prop = parent.props.get('#address-cells')
+            ns_prop = parent.props.get('#size-cells')
+            if na_prop:
+                na = fdt_util.fdt32_to_cpu(na_prop.value)
+            if ns_prop:
+                ns = fdt_util.fdt32_to_cpu(ns_prop.value)
+        return na, ns
+
+    def scan_reg_sizes(self):
+        """Scan for 64-bit 'reg' properties and update the values
+
+        This finds 'reg' properties with 64-bit data and converts the value to
+        an array of 64-values. This allows it to be output in a way that the
+        C code can read.
+        """
+        for node in self._valid_nodes:
+            reg = node.props.get('reg')
+            if not reg:
+                continue
+            na, ns = self.get_num_cells(node)
+            total = na + ns
+
+            if reg.type != fdt.TYPE_INT:
+                raise ValueError("Node '%s' reg property is not an int")
+            if len(reg.value) % total:
+                raise ValueError("Node '%s' reg property has %d cells "
+                        'which is not a multiple of na + ns = %d + %d)' %
+                        (node.name, len(reg.value), na, ns))
+            reg.na = na
+            reg.ns = ns
+            if na != 1 or ns != 1:
+                reg.type = fdt.TYPE_INT64
+                i = 0
+                new_value = []
+                val = reg.value
+                if not isinstance(val, list):
+                    val = [val]
+                while i < len(val):
+                    addr = fdt_util.fdt_cells_to_cpu(val[i:], reg.na)
+                    i += na
+                    size = fdt_util.fdt_cells_to_cpu(val[i:], reg.ns)
+                    i += ns
+                    new_value += [addr, size]
+                reg.value = new_value
+
     def scan_structs(self):
         """Scan the device tree building up the C structures we will use.
 
@@ -305,14 +399,18 @@ class DtbPlatdata(object):
             for pname, prop in node.props.items():
                 if pname in PROP_IGNORE_LIST or pname[0] == '#':
                     continue
-                if isinstance(prop.value, list):
-                    if is_phandle(prop):
-                        # Process the list as pairs of (phandle, id)
-                        value_it = iter(prop.value)
-                        for phandle_cell, _ in zip(value_it, value_it):
-                            phandle = fdt_util.fdt32_to_cpu(phandle_cell)
-                            target_node = self._phandle_nodes[phandle]
-                            node.phandles.add(target_node)
+                info = self.get_phandle_argc(prop, node.name)
+                if info:
+                    if not isinstance(prop.value, list):
+                        prop.value = [prop.value]
+                    # Process the list as pairs of (phandle, id)
+                    pos = 0
+                    for args in info.args:
+                        phandle_cell = prop.value[pos]
+                        phandle = fdt_util.fdt32_to_cpu(phandle_cell)
+                        target_node = self._fdt.phandle_to_node[phandle]
+                        node.phandles.add(target_node)
+                        pos += 1 + args
 
 
     def generate_structs(self, structs):
@@ -322,6 +420,7 @@ class DtbPlatdata(object):
         definitions for node in self._valid_nodes. See the documentation in
         README.of-plat for more information.
         """
+        self.out_header()
         self.out('#include <stdbool.h>\n')
         self.out('#include <libfdt.h>\n')
 
@@ -330,11 +429,13 @@ class DtbPlatdata(object):
             self.out('struct %s%s {\n' % (STRUCT_PREFIX, name))
             for pname in sorted(structs[name]):
                 prop = structs[name][pname]
-                if is_phandle(prop):
+                info = self.get_phandle_argc(prop, structs[name])
+                if info:
                     # For phandles, include a reference to the target
-                    self.out('\t%s%s[%d]' % (tab_to(2, 'struct phandle_2_cell'),
+                    struct_name = 'struct phandle_%d_arg' % info.max_args
+                    self.out('\t%s%s[%d]' % (tab_to(2, struct_name),
                                              conv_name_to_c(prop.name),
-                                             len(prop.value) / 2))
+                                             len(info.args)))
                 else:
                     ptype = TYPE_NAMES[prop.type]
                     self.out('\t%s%s' % (tab_to(2, ptype),
@@ -370,19 +471,32 @@ class DtbPlatdata(object):
                 vals = []
                 # For phandles, output a reference to the platform data
                 # of the target node.
-                if is_phandle(prop):
+                info = self.get_phandle_argc(prop, node.name)
+                if info:
                     # Process the list as pairs of (phandle, id)
-                    value_it = iter(prop.value)
-                    for phandle_cell, id_cell in zip(value_it, value_it):
+                    pos = 0
+                    for args in info.args:
+                        phandle_cell = prop.value[pos]
                         phandle = fdt_util.fdt32_to_cpu(phandle_cell)
-                        id_num = fdt_util.fdt32_to_cpu(id_cell)
-                        target_node = self._phandle_nodes[phandle]
+                        target_node = self._fdt.phandle_to_node[phandle]
                         name = conv_name_to_c(target_node.name)
-                        vals.append('{&%s%s, %d}' % (VAL_PREFIX, name, id_num))
+                        arg_values = []
+                        for i in range(args):
+                            arg_values.append(str(fdt_util.fdt32_to_cpu(prop.value[pos + 1 + i])))
+                        pos += 1 + args
+                        vals.append('\t{&%s%s, {%s}}' % (VAL_PREFIX, name,
+                                                     ', '.join(arg_values)))
+                    for val in vals:
+                        self.buf('\n\t\t%s,' % val)
                 else:
                     for val in prop.value:
                         vals.append(get_value(prop.type, val))
-                self.buf(', '.join(vals))
+
+                    # Put 8 values per line to avoid very long lines.
+                    for i in xrange(0, len(vals), 8):
+                        if i:
+                            self.buf(',\n\t\t')
+                        self.buf(', '.join(vals[i:i + 8]))
                 self.buf('}')
             else:
                 self.buf(get_value(prop.type, prop.value))
@@ -409,6 +523,7 @@ class DtbPlatdata(object):
         See the documentation in doc/driver-model/of-plat.txt for more
         information.
         """
+        self.out_header()
         self.out('#include <common.h>\n')
         self.out('#include <dm.h>\n')
         self.out('#include <dt-structs.h>\n')
@@ -442,6 +557,7 @@ def run_steps(args, dtb_file, include_disabled, output):
     plat = DtbPlatdata(dtb_file, include_disabled)
     plat.scan_dtb()
     plat.scan_tree()
+    plat.scan_reg_sizes()
     plat.setup_output(output)
     structs = plat.scan_structs()
     plat.scan_phandles()
diff --git a/tools/dtoc/dtoc_test_addr32.dts b/tools/dtoc/dtoc_test_addr32.dts
new file mode 100644 (file)
index 0000000..bcfdcae
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Test device tree file for dtoc
+ *
+ * Copyright 2017 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+ /dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       test1 {
+               u-boot,dm-pre-reloc;
+               compatible = "test1";
+               reg = <0x1234 0x5678>;
+       };
+
+       test2 {
+               u-boot,dm-pre-reloc;
+               compatible = "test2";
+               reg = <0x12345678 0x98765432 2 3>;
+       };
+
+};
diff --git a/tools/dtoc/dtoc_test_addr32_64.dts b/tools/dtoc/dtoc_test_addr32_64.dts
new file mode 100644 (file)
index 0000000..1c96243
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Test device tree file for dtoc
+ *
+ * Copyright 2017 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+ /dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <2>;
+
+       test1 {
+               u-boot,dm-pre-reloc;
+               compatible = "test1";
+               reg = <0x1234 0x5678 0x0>;
+       };
+
+       test2 {
+               u-boot,dm-pre-reloc;
+               compatible = "test2";
+               reg = <0x12345678 0x98765432 0x10987654>;
+       };
+
+       test3 {
+               u-boot,dm-pre-reloc;
+               compatible = "test3";
+               reg = <0x12345678 0x98765432 0x10987654 2 0 3>;
+       };
+
+};
diff --git a/tools/dtoc/dtoc_test_addr64.dts b/tools/dtoc/dtoc_test_addr64.dts
new file mode 100644 (file)
index 0000000..4c0ad0e
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Test device tree file for dtoc
+ *
+ * Copyright 2017 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+ /dts-v1/;
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       test1 {
+               u-boot,dm-pre-reloc;
+               compatible = "test1";
+               reg = /bits/ 64 <0x1234 0x5678>;
+       };
+
+       test2 {
+               u-boot,dm-pre-reloc;
+               compatible = "test2";
+               reg = /bits/ 64 <0x1234567890123456 0x9876543210987654>;
+       };
+
+       test3 {
+               u-boot,dm-pre-reloc;
+               compatible = "test3";
+               reg = /bits/ 64 <0x1234567890123456 0x9876543210987654 2 3>;
+       };
+
+};
diff --git a/tools/dtoc/dtoc_test_addr64_32.dts b/tools/dtoc/dtoc_test_addr64_32.dts
new file mode 100644 (file)
index 0000000..c36f6b7
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Test device tree file for dtoc
+ *
+ * Copyright 2017 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+ /dts-v1/;
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <1>;
+
+       test1 {
+               u-boot,dm-pre-reloc;
+               compatible = "test1";
+               reg = <0x1234 0x0 0x5678>;
+       };
+
+       test2 {
+               u-boot,dm-pre-reloc;
+               compatible = "test2";
+               reg = <0x12345678 0x90123456 0x98765432>;
+       };
+
+       test3 {
+               u-boot,dm-pre-reloc;
+               compatible = "test3";
+               reg = <0x12345678 0x90123456 0x98765432 0 2 3>;
+       };
+
+};
index e9828a695b5b6343226e0e92976203b29321e894..ba12b0fe65ea88ef49744ceae31f283131e124a1 100644 (file)
 
 / {
        phandle: phandle-target {
+               u-boot,dm-pre-reloc;
+               compatible = "target";
+               intval = <0>;
+                #clock-cells = <0>;
+       };
+
+       phandle_1: phandle2-target {
                u-boot,dm-pre-reloc;
                compatible = "target";
                intval = <1>;
+               #clock-cells = <1>;
+       };
+       phandle_2: phandle3-target {
+               u-boot,dm-pre-reloc;
+               compatible = "target";
+               intval = <2>;
+               #clock-cells = <2>;
        };
 
        phandle-source {
                u-boot,dm-pre-reloc;
                compatible = "source";
-               clocks = <&phandle 1>;
+               clocks = <&phandle &phandle_1 11 &phandle_2 12 13 &phandle>;
        };
 };
index c7366862637a99b44a320e66dbc31cd53663d921..6afe674b1f571b69084527df2b2d9a3dd5873824 100644 (file)
@@ -9,6 +9,8 @@
  /dts-v1/;
 
 / {
+       #address-cells = <1>;
+       #size-cells = <1>;
        spl-test {
                u-boot,dm-pre-reloc;
                compatible = "sandbox,spl-test";
                compatible = "sandbox,spl-test.2";
        };
 
+       i2c@0 {
+               compatible = "sandbox,i2c-test";
+               u-boot,dm-pre-reloc;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               pmic@9 {
+                       compatible = "sandbox,pmic-test";
+                       u-boot,dm-pre-reloc;
+                       reg = <9>;
+                       low-power;
+               };
+       };
 };
index 63a32ea2d7bfcaeb9897406a986ff8dc65ac61c5..dbc338653bca6f542f8ab0676f3a1bb76e1a7b3a 100644 (file)
@@ -21,7 +21,7 @@ import libfdt
 # so it is fairly efficient.
 
 # A list of types we support
-(TYPE_BYTE, TYPE_INT, TYPE_STRING, TYPE_BOOL) = range(4)
+(TYPE_BYTE, TYPE_INT, TYPE_STRING, TYPE_BOOL, TYPE_INT64) = range(5)
 
 def CheckErr(errnum, msg):
     if errnum:
@@ -174,8 +174,9 @@ class Node:
         props: A dict of properties for this node, each a Prop object.
             Keyed by property name
     """
-    def __init__(self, fdt, offset, name, path):
+    def __init__(self, fdt, parent, offset, name, path):
         self._fdt = fdt
+        self.parent = parent
         self._offset = offset
         self.name = name
         self.path = path
@@ -211,13 +212,17 @@ class Node:
         searching into subnodes so that the entire tree is built.
         """
         self.props = self._fdt.GetProps(self)
+        phandle = self.props.get('phandle')
+        if phandle:
+            val = fdt_util.fdt32_to_cpu(phandle.value)
+            self._fdt.phandle_to_node[val] = self
 
         offset = libfdt.fdt_first_subnode(self._fdt.GetFdt(), self.Offset())
         while offset >= 0:
             sep = '' if self.path[-1] == '/' else '/'
             name = self._fdt._fdt_obj.get_name(offset)
             path = self.path + sep + name
-            node = Node(self._fdt, offset, name, path)
+            node = Node(self._fdt, self, offset, name, path)
             self.subnodes.append(node)
 
             node.Scan()
@@ -262,6 +267,7 @@ class Fdt:
     def __init__(self, fname):
         self._fname = fname
         self._cached_offsets = False
+        self.phandle_to_node = {}
         if self._fname:
             self._fname = fdt_util.EnsureCompiled(self._fname)
 
@@ -279,7 +285,7 @@ class Fdt:
 
         TODO(sjg@chromium.org): Implement the 'root' parameter
         """
-        self._root = self.Node(self, 0, '/', '/')
+        self._root = self.Node(self, None, 0, '/', '/')
         self._root.Scan()
 
     def GetRoot(self):
@@ -386,7 +392,7 @@ class Fdt:
         return libfdt.fdt_off_dt_struct(self._fdt) + offset
 
     @classmethod
-    def Node(self, fdt, offset, name, path):
+    def Node(self, fdt, parent, offset, name, path):
         """Create a new node
 
         This is used by Fdt.Scan() to create a new node using the correct
@@ -394,11 +400,12 @@ class Fdt:
 
         Args:
             fdt: Fdt object
+            parent: Parent node, or None if this is the root node
             offset: Offset of node
             name: Node name
             path: Full path to node
         """
-        node = Node(fdt, offset, name, path)
+        node = Node(fdt, parent, offset, name, path)
         return node
 
 def FdtScan(fname):
index b9dfae8d0e7b606c28fac252f82afcaef801fe49..338d47a5e1489622399f4f7294388a36103044bf 100644 (file)
@@ -29,6 +29,22 @@ def fdt32_to_cpu(val):
         val = val.encode('raw_unicode_escape')
     return struct.unpack('>I', val)[0]
 
+def fdt_cells_to_cpu(val, cells):
+    """Convert one or two cells to a long integer
+
+    Args:
+        Value to convert (array of one or more 4-character strings)
+
+    Return:
+        A native-endian long value
+    """
+    if not cells:
+        return 0
+    out = long(fdt32_to_cpu(val[0]))
+    if cells == 2:
+        out = out << 32 | fdt32_to_cpu(val[1])
+    return out
+
 def EnsureCompiled(fname):
     """Compile an fdt .dts source file into a .dtb binary blob if needed.
 
index 8b95c4124f02a5d2acc5c26cbf5a6dc9e8a1a7e6..cc009b2a256a248fc0f1faff6b303a7381f22066 100644 (file)
@@ -121,6 +121,12 @@ class TestDtoc(unittest.TestCase):
             data = infile.read()
         self.assertEqual('''#include <stdbool.h>
 #include <libfdt.h>
+struct dtd_sandbox_i2c_test {
+};
+struct dtd_sandbox_pmic_test {
+\tbool\t\tlow_power;
+\tfdt64_t\t\treg[2];
+};
 struct dtd_sandbox_spl_test {
 \tbool\t\tboolval;
 \tunsigned char\tbytearray[3];
@@ -146,7 +152,8 @@ static struct dtd_sandbox_spl_test dtv_spl_test = {
 \t.bytearray\t\t= {0x6, 0x0, 0x0},
 \t.byteval\t\t= 0x5,
 \t.intval\t\t\t= 0x1,
-\t.longbytearray\t\t= {0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, 0x11},
+\t.longbytearray\t\t= {0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,
+\t\t0x11},
 \t.stringval\t\t= "message",
 \t.boolval\t\t= true,
 \t.intarray\t\t= {0x2, 0x3, 0x4, 0x0},
@@ -162,7 +169,8 @@ static struct dtd_sandbox_spl_test dtv_spl_test2 = {
 \t.bytearray\t\t= {0x1, 0x23, 0x34},
 \t.byteval\t\t= 0x8,
 \t.intval\t\t\t= 0x3,
-\t.longbytearray\t\t= {0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
+\t.longbytearray\t\t= {0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+\t\t0x0},
 \t.stringval\t\t= "message2",
 \t.intarray\t\t= {0x5, 0x0, 0x0, 0x0},
 \t.stringarray\t\t= {"another", "multi-word", "message"},
@@ -190,6 +198,24 @@ U_BOOT_DEVICE(spl_test4) = {
 \t.platdata_size\t= sizeof(dtv_spl_test4),
 };
 
+static struct dtd_sandbox_i2c_test dtv_i2c_at_0 = {
+};
+U_BOOT_DEVICE(i2c_at_0) = {
+\t.name\t\t= "sandbox_i2c_test",
+\t.platdata\t= &dtv_i2c_at_0,
+\t.platdata_size\t= sizeof(dtv_i2c_at_0),
+};
+
+static struct dtd_sandbox_pmic_test dtv_pmic_at_9 = {
+\t.low_power\t\t= true,
+\t.reg\t\t\t= {0x9, 0x0},
+};
+U_BOOT_DEVICE(pmic_at_9) = {
+\t.name\t\t= "sandbox_pmic_test",
+\t.platdata\t= &dtv_pmic_at_9,
+\t.platdata_size\t= sizeof(dtv_pmic_at_9),
+};
+
 ''', data)
 
     def test_phandle(self):
@@ -202,7 +228,7 @@ U_BOOT_DEVICE(spl_test4) = {
         self.assertEqual('''#include <stdbool.h>
 #include <libfdt.h>
 struct dtd_source {
-\tstruct phandle_2_cell clocks[1];
+\tstruct phandle_2_arg clocks[4];
 };
 struct dtd_target {
 \tfdt32_t\t\tintval;
@@ -217,7 +243,7 @@ struct dtd_target {
 #include <dt-structs.h>
 
 static struct dtd_target dtv_phandle_target = {
-\t.intval\t\t\t= 0x1,
+\t.intval\t\t\t= 0x0,
 };
 U_BOOT_DEVICE(phandle_target) = {
 \t.name\t\t= "target",
@@ -225,8 +251,30 @@ U_BOOT_DEVICE(phandle_target) = {
 \t.platdata_size\t= sizeof(dtv_phandle_target),
 };
 
+static struct dtd_target dtv_phandle2_target = {
+\t.intval\t\t\t= 0x1,
+};
+U_BOOT_DEVICE(phandle2_target) = {
+\t.name\t\t= "target",
+\t.platdata\t= &dtv_phandle2_target,
+\t.platdata_size\t= sizeof(dtv_phandle2_target),
+};
+
+static struct dtd_target dtv_phandle3_target = {
+\t.intval\t\t\t= 0x2,
+};
+U_BOOT_DEVICE(phandle3_target) = {
+\t.name\t\t= "target",
+\t.platdata\t= &dtv_phandle3_target,
+\t.platdata_size\t= sizeof(dtv_phandle3_target),
+};
+
 static struct dtd_source dtv_phandle_source = {
-\t.clocks\t\t\t= {{&dtv_phandle_target, 1}},
+\t.clocks\t\t\t= {
+\t\t\t{&dtv_phandle_target, {}},
+\t\t\t{&dtv_phandle2_target, {11}},
+\t\t\t{&dtv_phandle3_target, {12, 13}},
+\t\t\t{&dtv_phandle_target, {}},},
 };
 U_BOOT_DEVICE(phandle_source) = {
 \t.name\t\t= "source",
@@ -268,4 +316,216 @@ U_BOOT_DEVICE(spl_test) = {
 \t.platdata_size\t= sizeof(dtv_spl_test),
 };
 
+''', data)
+
+    def test_addresses64(self):
+        """Test output from a node with a 'reg' property with na=2, ns=2"""
+        dtb_file = get_dtb_file('dtoc_test_addr64.dts')
+        output = tools.GetOutputFilename('output')
+        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
+        with open(output) as infile:
+            data = infile.read()
+        self.assertEqual('''#include <stdbool.h>
+#include <libfdt.h>
+struct dtd_test1 {
+\tfdt64_t\t\treg[2];
+};
+struct dtd_test2 {
+\tfdt64_t\t\treg[2];
+};
+struct dtd_test3 {
+\tfdt64_t\t\treg[4];
+};
+''', data)
+
+        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
+        with open(output) as infile:
+            data = infile.read()
+        self.assertEqual('''#include <common.h>
+#include <dm.h>
+#include <dt-structs.h>
+
+static struct dtd_test1 dtv_test1 = {
+\t.reg\t\t\t= {0x1234, 0x5678},
+};
+U_BOOT_DEVICE(test1) = {
+\t.name\t\t= "test1",
+\t.platdata\t= &dtv_test1,
+\t.platdata_size\t= sizeof(dtv_test1),
+};
+
+static struct dtd_test2 dtv_test2 = {
+\t.reg\t\t\t= {0x1234567890123456, 0x9876543210987654},
+};
+U_BOOT_DEVICE(test2) = {
+\t.name\t\t= "test2",
+\t.platdata\t= &dtv_test2,
+\t.platdata_size\t= sizeof(dtv_test2),
+};
+
+static struct dtd_test3 dtv_test3 = {
+\t.reg\t\t\t= {0x1234567890123456, 0x9876543210987654, 0x2, 0x3},
+};
+U_BOOT_DEVICE(test3) = {
+\t.name\t\t= "test3",
+\t.platdata\t= &dtv_test3,
+\t.platdata_size\t= sizeof(dtv_test3),
+};
+
+''', data)
+
+    def test_addresses32(self):
+        """Test output from a node with a 'reg' property with na=1, ns=1"""
+        dtb_file = get_dtb_file('dtoc_test_addr32.dts')
+        output = tools.GetOutputFilename('output')
+        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
+        with open(output) as infile:
+            data = infile.read()
+        self.assertEqual('''#include <stdbool.h>
+#include <libfdt.h>
+struct dtd_test1 {
+\tfdt32_t\t\treg[2];
+};
+struct dtd_test2 {
+\tfdt32_t\t\treg[4];
+};
+''', data)
+
+        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
+        with open(output) as infile:
+            data = infile.read()
+        self.assertEqual('''#include <common.h>
+#include <dm.h>
+#include <dt-structs.h>
+
+static struct dtd_test1 dtv_test1 = {
+\t.reg\t\t\t= {0x1234, 0x5678},
+};
+U_BOOT_DEVICE(test1) = {
+\t.name\t\t= "test1",
+\t.platdata\t= &dtv_test1,
+\t.platdata_size\t= sizeof(dtv_test1),
+};
+
+static struct dtd_test2 dtv_test2 = {
+\t.reg\t\t\t= {0x12345678, 0x98765432, 0x2, 0x3},
+};
+U_BOOT_DEVICE(test2) = {
+\t.name\t\t= "test2",
+\t.platdata\t= &dtv_test2,
+\t.platdata_size\t= sizeof(dtv_test2),
+};
+
+''', data)
+
+    def test_addresses64_32(self):
+        """Test output from a node with a 'reg' property with na=2, ns=1"""
+        dtb_file = get_dtb_file('dtoc_test_addr64_32.dts')
+        output = tools.GetOutputFilename('output')
+        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
+        with open(output) as infile:
+            data = infile.read()
+        self.assertEqual('''#include <stdbool.h>
+#include <libfdt.h>
+struct dtd_test1 {
+\tfdt64_t\t\treg[2];
+};
+struct dtd_test2 {
+\tfdt64_t\t\treg[2];
+};
+struct dtd_test3 {
+\tfdt64_t\t\treg[4];
+};
+''', data)
+
+        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
+        with open(output) as infile:
+            data = infile.read()
+        self.assertEqual('''#include <common.h>
+#include <dm.h>
+#include <dt-structs.h>
+
+static struct dtd_test1 dtv_test1 = {
+\t.reg\t\t\t= {0x123400000000, 0x5678},
+};
+U_BOOT_DEVICE(test1) = {
+\t.name\t\t= "test1",
+\t.platdata\t= &dtv_test1,
+\t.platdata_size\t= sizeof(dtv_test1),
+};
+
+static struct dtd_test2 dtv_test2 = {
+\t.reg\t\t\t= {0x1234567890123456, 0x98765432},
+};
+U_BOOT_DEVICE(test2) = {
+\t.name\t\t= "test2",
+\t.platdata\t= &dtv_test2,
+\t.platdata_size\t= sizeof(dtv_test2),
+};
+
+static struct dtd_test3 dtv_test3 = {
+\t.reg\t\t\t= {0x1234567890123456, 0x98765432, 0x2, 0x3},
+};
+U_BOOT_DEVICE(test3) = {
+\t.name\t\t= "test3",
+\t.platdata\t= &dtv_test3,
+\t.platdata_size\t= sizeof(dtv_test3),
+};
+
+''', data)
+
+    def test_addresses32_64(self):
+        """Test output from a node with a 'reg' property with na=1, ns=2"""
+        dtb_file = get_dtb_file('dtoc_test_addr32_64.dts')
+        output = tools.GetOutputFilename('output')
+        dtb_platdata.run_steps(['struct'], dtb_file, False, output)
+        with open(output) as infile:
+            data = infile.read()
+        self.assertEqual('''#include <stdbool.h>
+#include <libfdt.h>
+struct dtd_test1 {
+\tfdt64_t\t\treg[2];
+};
+struct dtd_test2 {
+\tfdt64_t\t\treg[2];
+};
+struct dtd_test3 {
+\tfdt64_t\t\treg[4];
+};
+''', data)
+
+        dtb_platdata.run_steps(['platdata'], dtb_file, False, output)
+        with open(output) as infile:
+            data = infile.read()
+        self.assertEqual('''#include <common.h>
+#include <dm.h>
+#include <dt-structs.h>
+
+static struct dtd_test1 dtv_test1 = {
+\t.reg\t\t\t= {0x1234, 0x567800000000},
+};
+U_BOOT_DEVICE(test1) = {
+\t.name\t\t= "test1",
+\t.platdata\t= &dtv_test1,
+\t.platdata_size\t= sizeof(dtv_test1),
+};
+
+static struct dtd_test2 dtv_test2 = {
+\t.reg\t\t\t= {0x12345678, 0x9876543210987654},
+};
+U_BOOT_DEVICE(test2) = {
+\t.name\t\t= "test2",
+\t.platdata\t= &dtv_test2,
+\t.platdata_size\t= sizeof(dtv_test2),
+};
+
+static struct dtd_test3 dtv_test3 = {
+\t.reg\t\t\t= {0x12345678, 0x9876543210987654, 0x2, 0x3},
+};
+U_BOOT_DEVICE(test3) = {
+\t.name\t\t= "test3",
+\t.platdata\t= &dtv_test3,
+\t.platdata_size\t= sizeof(dtv_test3),
+};
+
 ''', data)
index 2e871feaf4fa76948aaf80ba7f55bc40a2e10da6..2345a197984ff348abf1309512613f42593f4504 100755 (executable)
@@ -124,7 +124,7 @@ class KconfigScanner:
         os.environ['srctree'] = os.getcwd()
         os.environ['UBOOTVERSION'] = 'dummy'
         os.environ['KCONFIG_OBJDIR'] = ''
-        self._conf = kconfiglib.Config()
+        self._conf = kconfiglib.Config(print_warnings=False)
 
     def __del__(self):
         """Delete a leftover temporary file before exit.
@@ -166,7 +166,10 @@ class KconfigScanner:
                 else:
                     f.write(line[colon + 1:])
 
-        self._conf.load_config(self._tmpfile)
+        warnings = self._conf.load_config(self._tmpfile)
+        if warnings:
+            for warning in warnings:
+                print '%s: %s' % (defconfig, warning)
 
         try_remove(self._tmpfile)
         self._tmpfile = None
diff --git a/tools/logos/microchip.bmp b/tools/logos/microchip.bmp
new file mode 100644 (file)
index 0000000..bcecbe9
Binary files /dev/null and b/tools/logos/microchip.bmp differ
index 8a038501929c0fa61ebb0da3a04d5c666b87b5a1..6f549a51c16d0c2d81c3effbd8f62f8d255f45a5 100755 (executable)
@@ -1877,10 +1877,10 @@ def main():
     if options.build_db:
         with open(CONFIG_DATABASE, 'w') as fd:
             for defconfig, configs in config_db.iteritems():
-                print >>fd, '%s' % defconfig
+                fd.write('%s\n' % defconfig)
                 for config in sorted(configs.keys()):
-                    print >>fd, '   %s=%s' % (config, configs[config])
-                print >>fd
+                    fd.write('   %s=%s\n' % (config, configs[config]))
+                fd.write('\n')
 
 if __name__ == '__main__':
     main()
index e36857dedea1d0dbafa41732aaf9bf0988d63f38..8582ed6ba12cca5149a946b26b2be9cc4702c79f 100644 (file)
@@ -84,6 +84,18 @@ Aliases are recursive.
 The checkpatch.pl in the U-Boot tools/ subdirectory will be located and
 used. Failing that you can put it into your path or ~/bin/checkpatch.pl
 
+If you want to avoid sending patches to email addresses that are picked up
+by patman but are known to bounce you can add a [bounces] section to your
+.patman file. Unlike the [alias] section these are simple key: value pairs
+that are not recursive.
+
+>>>
+
+[bounces]
+gonefishing: Fred Bloggs <f.bloggs@napier.net>
+
+<<<
+
 
 If you want to change the defaults for patman's command-line arguments,
 you can add a [settings] section to your .patman file.  This can be used
index d3947a7c2ac5ce7ac09793777ccea681f84c88a6..73ee39448614eb5488cffae84d7742099e573ee3 100644 (file)
@@ -10,6 +10,7 @@ import os
 
 import get_maintainer
 import gitutil
+import settings
 import terminal
 
 # Series-xxx tags that we understand
@@ -218,6 +219,7 @@ class Series(dict):
         Return:
             Filename of temp file created
         """
+        col = terminal.Color()
         # Look for commit tags (of the form 'xxx:' at the start of the subject)
         fname = '/tmp/patman.%d' % os.getpid()
         fd = open(fname, 'w')
@@ -233,6 +235,9 @@ class Series(dict):
                 cc += add_maintainers
             elif add_maintainers:
                 cc += get_maintainer.GetMaintainer(commit.patch)
+            for x in set(cc) & set(settings.bounces):
+                print(col.Color(col.YELLOW, 'Skipping "%s"' % x))
+            cc = set(cc) - set(settings.bounces)
             cc = [m.encode('utf-8') if type(m) != str else m for m in cc]
             all_ccs += cc
             print(commit.patch, ', '.join(set(cc)), file=fd)
index 5f207f5ef1c476fd522faebb4962a23c85399c2d..92379b72e76474173c3b4dd2224dcb474363a914 100644 (file)
@@ -212,7 +212,12 @@ def CreatePatmanConfigFile(config_fname):
         print("Couldn't create patman config file\n")
         raise
 
-    print("[alias]\nme: %s <%s>" % (name, email), file=f)
+    print('''[alias]
+me: %s <%s>
+
+[bounces]
+nxp = Zhikang Zhang <zhikang.zhang@nxp.com>
+''' % (name, email), file=f)
     f.close();
 
 def _UpdateDefaults(parser, config):
@@ -269,6 +274,36 @@ def _ReadAliasFile(fname):
         if bad_line:
             print(bad_line)
 
+def _ReadBouncesFile(fname):
+    """Read in the bounces file if it exists
+
+    Args:
+        fname: Filename to read.
+    """
+    if os.path.exists(fname):
+        with open(fname) as fd:
+            for line in fd:
+                if line.startswith('#'):
+                    continue
+                bounces.add(line.strip())
+
+def GetItems(config, section):
+    """Get the items from a section of the config.
+
+    Args:
+        config: _ProjectConfigParser object containing settings
+        section: name of section to retrieve
+
+    Returns:
+        List of (name, value) tuples for the section
+    """
+    try:
+        return config.items(section)
+    except ConfigParser.NoSectionError as e:
+        return []
+    except:
+        raise
+
 def Setup(parser, project_name, config_fname=''):
     """Set up the settings module by reading config files.
 
@@ -290,13 +325,18 @@ def Setup(parser, project_name, config_fname=''):
 
     config.read(config_fname)
 
-    for name, value in config.items('alias'):
+    for name, value in GetItems(config, 'alias'):
         alias[name] = value.split(',')
 
+    _ReadBouncesFile('doc/bounces')
+    for name, value in GetItems(config, 'bounces'):
+        bounces.add(value)
+
     _UpdateDefaults(parser, config)
 
 # These are the aliases we understand, indexed by alias. Each member is a list.
 alias = {}
+bounces = set()
 
 if __name__ == "__main__":
     import doctest
index ffc3268209d2b3d0542d5f29f69fefc5251cee0e..d25a733d4147f76396ca7fc088e5403c034f8214 100644 (file)
@@ -293,7 +293,7 @@ int pblimage_check_params(struct image_tool_params *params)
                pbi_crc_cmd2 = 0;
                pbl_cmd_initaddr = params->addr & PBL_ADDR_24BIT_MASK;
                pbl_cmd_initaddr |= PBL_ACS_CONT_CMD;
-               pbl_cmd_initaddr |= uboot_size;
+               pbl_cmd_initaddr += uboot_size;
                pbl_end_cmd[0] = 0x09610000;
                pbl_end_cmd[1] = 0x00000000;
                pbl_end_cmd[2] = 0x096100c0;