From 9df731a176aab8e03b984b681b1bea01ccff6644 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 07:23:06 +0000 Subject: [PATCH] rk3568 rt uboot init --- u-boot/drivers/pinctrl/rockchip/pinctrl-rk3528.c | 313 u-boot/arch/arm/dts/rk3588.dtsi | 4 u-boot/cmd/ddr_tool/memtester/types.h | 0 u-boot/arch/arm/dts/rk3308-u-boot.dtsi | 12 u-boot/arch/arm/mach-rockchip/rk3562/Makefile | 11 u-boot/lib/sha1.c | 33 u-boot/drivers/phy/phy-rockchip-inno-usb2.c | 364 u-boot/configs/rk3568-spl-spi-nand_defconfig | 11 u-boot/drivers/ufs/Makefile | 8 u-boot/drivers/scsi/scsi.c | 4 u-boot/arch/arm/include/asm/arch-rockchip/uimage.h | 3 u-boot/drivers/video/drm/rockchip_vop2.c | 2254 + u-boot/drivers/video/drm/dw-dp.c | 54 u-boot/configs/rk3568-rt.config | 2 u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3562.h | 416 u-boot/board/rockchip/evb_rk3528/Kconfig | 15 u-boot/arch/arm/cpu/armv7/start.S | 2 u-boot/drivers/video/drm/Makefile | 15 u-boot/common/fb_mmc.c | 18 u-boot/drivers/net/phy/rk630phy.c | 3 u-boot/drivers/ram/rockchip/sdram_rk3562.c | 31 u-boot/drivers/phy/phy-rockchip-naneng-combphy.c | 231 u-boot/scripts/setlocalversion | 7 u-boot/drivers/nvme/nvme.c | 27 u-boot/arch/arm/mach-rockchip/rk3562/clk_rk3562.c | 41 u-boot/drivers/core/read.c | 11 u-boot/arch/arm/cpu/armv8/sha256_ce_core.S | 134 u-boot/drivers/video/drm/Kconfig | 28 u-boot/configs/rv1106-usb.config | 17 u-boot/drivers/pinctrl/Makefile | 1 u-boot/drivers/video/drm/rockchip_rgb.c | 362 u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c | 89 u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c | 661 u-boot/common/image-fdt.c | 80 u-boot/arch/arm/dts/px30-u-boot.dtsi | 7 u-boot/arch/arm/lib/bootm-fdt.c | 3 u-boot/drivers/power/charge_animation.c | 6 u-boot/drivers/usb/dwc3/io.h | 5 u-boot/cmd/pci.c | 285 u-boot/arch/arm/dts/rk3528-u-boot.dtsi | 206 u-boot/arch/arm/mach-rockchip/rockchip_smccc.c | 17 u-boot/disk/part_efi.c | 5 u-boot/drivers/core/root.c | 13 u-boot/drivers/power/pmic/rk8xx.c | 73 u-boot/disk/part_env.c | 9 u-boot/configs/rv1126-bat-spi-nor-tb.config | 2 u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c | 4 u-boot/drivers/core/device.c | 2 u-boot/drivers/video/drm/rockchip_tve.h | 253 u-boot/include/dm/fdtaddr.h | 12 u-boot/cmd/script_update.c | 38 u-boot/arch/arm/include/asm/system.h | 1 u-boot/drivers/video/drm/rockchip_tve.c | 848 u-boot/include/linux/mtd/mtd.h | 24 u-boot/configs/rk3036_defconfig | 2 u-boot/drivers/ram/rockchip/sdram_rv1126.c | 38 u-boot/drivers/power/regulator/fixed.c | 10 u-boot/disk/part.c | 25 u-boot/arch/arm/include/asm/arch-rockchip/vendor.h | 3 u-boot/scripts/android2fit.sh | 4 u-boot/drivers/mtd/mtd_blk.c | 16 u-boot/drivers/clk/clk-uclass.c | 3 u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk3328.S | 4 u-boot/drivers/mtd/nand/spi/skyhigh.c | 51 u-boot/drivers/ufs/Kconfig | 24 u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c | 426 u-boot/include/configs/woodburn_common.h | 4 u-boot/drivers/video/drm/rohm-bu18tl82.c | 17 u-boot/include/configs/rk3528_common.h | 109 u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c | 3 u-boot/arch/arm/mach-rockchip/fit.c | 68 u-boot/drivers/i2c/muxes/max96745.c | 44 u-boot/drivers/clk/rockchip/clk_rk3562.c | 2046 + u-boot/arch/arm/cpu/armv8/Kconfig | 15 u-boot/fs/ubifs/super.c | 21 u-boot/drivers/mtd/nand/spi/xincun.c | 108 u-boot/drivers/mmc/sdhci.c | 53 u-boot/drivers/clk/rockchip/Makefile | 2 u-boot/include/configs/rk3588_common.h | 8 u-boot/common/Makefile | 10 u-boot/configs/rv1106-optee.config | 5 u-boot/arch/arm/mach-rockchip/rk3562/syscon_rk3562.c | 26 u-boot/drivers/misc/rk3562-secure-otp.S | 15906 ++++++++++ u-boot/drivers/ram/rockchip/Makefile | 2 u-boot/drivers/gpio/Makefile | 1 u-boot/include/configs/evb_rk3528.h | 26 u-boot/include/key.h | 7 u-boot/include/spl_ab.h | 10 u-boot/drivers/input/rk_key.c | 8 u-boot/board/rockchip/evb_rk3528/Makefile | 7 u-boot/drivers/ufs/ufs-uclass.c | 18 u-boot/drivers/video/drm/rockchip_display.h | 50 u-boot/drivers/mtd/nand/spi/fmsh.c | 40 u-boot/drivers/video/drm/rockchip_display.c | 661 u-boot/cmd/ddr_tool/ddr_dq_eye/Makefile | 7 u-boot/configs/rk3399_defconfig | 3 u-boot/drivers/phy/phy-rockchip-usbdp.c | 26 u-boot/drivers/input/key-uclass.c | 83 u-boot/drivers/video/drm/rockchip_spl_display.c | 265 u-boot/drivers/usb/dwc3/gadget.c | 2 u-boot/arch/arm/dts/rk3528-evb.dts | 31 u-boot/cmd/ddr_tool/memtester/Makefile | 8 u-boot/include/dt-bindings/power/rk3562-power.h | 33 u-boot/drivers/video/drm/rockchip_display_helper.c | 279 u-boot/drivers/input/spl_adc_key.c | 141 u-boot/lib/avb/libavb_user/avb_ops_user.c | 147 u-boot/drivers/misc/Makefile | 8 u-boot/include/configs/rk3562_common.h | 84 u-boot/common/mp_boot_rk3528.S | 9682 ++++++ u-boot/examples/standalone/rkspi.h | 138 u-boot/drivers/cpu/rockchip_amp.c | 52 u-boot/common/spl/Kconfig | 24 u-boot/configs/rv1106-spi-nor_defconfig | 10 u-boot/board/rockchip/evb_rk3562/Kconfig | 15 u-boot/common/image-android.c | 306 u-boot/include/dt-bindings/display/rockchip-tve.h | 15 u-boot/include/u-boot/sha1.h | 2 u-boot/include/mp_boot.h | 25 u-boot/drivers/mtd/nand/spi/core.c | 14 u-boot/drivers/rkflash/sfc_nand.c | 30 u-boot/tools/Makefile | 6 u-boot/configs/rk3562_defconfig | 211 u-boot/arch/arm/cpu/armv8/Makefile | 2 u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3528.h | 396 u-boot/drivers/video/drm/panel-rohm-bu18rl82.c | 349 u-boot/common/spl/spl.c | 14 u-boot/cmd/ddr_tool/Makefile | 25 u-boot/drivers/video/drm/rockchip_post_csc.c | 1587 + u-boot/lib/rsa/rsa-verify.c | 16 u-boot/configs/px30-tb_defconfig | 2 u-boot/arch/arm/dts/rk3528-pinctrl.dtsi | 1241 u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c | 17 u-boot/drivers/video/drm/rockchip_post_csc.h | 35 u-boot/drivers/net/gmac_rockchip.c | 494 u-boot/arch/arm/dts/rk3568-u-boot.dtsi | 33 u-boot/arch/arm/mach-rockchip/vendor.c | 32 u-boot/arch/arm/dts/rk3588-u-boot.dtsi | 3 u-boot/drivers/i2c/muxes/Makefile | 1 u-boot/arch/arm/dts/rk3588s.dtsi | 21 u-boot/include/android_ab.h | 2 u-boot/arch/arm/mach-rockchip/chip_info.c | 4 u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi | 28 u-boot/arch/arm/dts/rv1106-u-boot.dtsi | 42 u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3528.h | 89 u-boot/drivers/mtd/spi/sf_internal.h | 1 u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h | 81 u-boot/drivers/video/drm/rockchip_panel.c | 120 u-boot/cmd/Makefile | 4 u-boot/arch/arm/mach-rockchip/rk3528/syscon_rk3528.c | 24 u-boot/drivers/video/drm/rockchip_vop_reg.c | 22 u-boot/drivers/spi/soft_spi.c | 34 u-boot/include/android_avb/avb_ops_user.h | 16 u-boot/drivers/mtd/nand/spi/Makefile | 2 u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c | 69 u-boot/cmd/ddr_tool/memtester/memtester.h | 6 u-boot/drivers/video/drm/rockchip_connector.h | 124 u-boot/cmd/mmc.c | 4 u-boot/lib/optee_clientApi/OpteeClientInterface.c | 16 u-boot/cmd/ddr_tool/stressapptest/Makefile | 7 u-boot/drivers/video/Makefile | 6 u-boot/lib/avb/libavb_user/Kconfig | 1 u-boot/drivers/video/drm/rockchip_connector.c | 45 u-boot/arch/arm/mach-rockchip/fit_nodes.sh | 73 u-boot/drivers/video/drm/dw_hdmi.h | 4 u-boot/cmd/ddr_tool/memtester/memtester.c | 4 u-boot/drivers/mtd/nand/spi/hyf.c | 22 u-boot/configs/rk322x_defconfig | 2 u-boot/drivers/clk/rockchip/clk_rk3528.c | 2145 + u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c | 13 u-boot/configs/rk3588_defconfig | 9 u-boot/drivers/video/drm/rockchip_crtc.h | 6 u-boot/configs/px30_defconfig | 1 u-boot/configs/rk3328_defconfig | 2 u-boot/drivers/video/drm/dw_hdmi.c | 186 u-boot/common/android_bootloader.c | 415 u-boot/drivers/phy/Makefile | 2 u-boot/cmd/ddr_tool/Kconfig | 32 u-boot/arch/arm/mach-rockchip/rk_meta.c | 25 u-boot/drivers/video/drm/rockchip_crtc.c | 40 u-boot/tools/rkcommon.c | 2 u-boot/cmd/ddr_tool/ddr_test/ddr_test_px30.S | 4 u-boot/arch/arm/dts/Makefile | 2 u-boot/arch/arm/mach-rockchip/rk3528/Kconfig | 17 u-boot/drivers/ufs/unipro.h | 270 u-boot/include/spl_display.h | 28 u-boot/common/spl/spl_fit.c | 20 u-boot/include/configs/rk3288_common.h | 2 u-boot/drivers/gpio/gpio-uclass.c | 2 u-boot/arch/arm/dts/rk3308.dtsi | 7 u-boot/common/android_ab.c | 56 u-boot/include/configs/evb_rk3562.h | 26 u-boot/env/envf.c | 51 u-boot/drivers/ufs/ti-j721e-ufs.c | 74 u-boot/cmd/ddr_tool/stressapptest/stressapptest.c | 1207 u-boot/include/edid.h | 41 u-boot/common/board_f.c | 4 u-boot/lib/avb/libavb/avb_slot_verify.c | 15 u-boot/arch/arm/mach-rockchip/boot_mode.c | 4 u-boot/arch/arm/mach-rockchip/hotkey.c | 4 u-boot/arch/arm/mach-rockchip/Kconfig | 95 u-boot/cmd/ddr_tool/stressapptest/stressapptest.h | 70 u-boot/arch/arm/cpu/armv8/start.S | 74 u-boot/make.sh | 8 u-boot/examples/standalone/Makefile | 1 u-boot/arch/arm/include/asm/arch-rockchip/fit.h | 2 u-boot/examples/standalone/rkspi.c | 454 u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c | 81 u-boot/include/dt-bindings/clock/rk3528-cru.h | 754 u-boot/configs/rk3588-qnx_defconfig | 212 u-boot/include/dt-bindings/suspend/rockchip-rk3528.h | 54 u-boot/drivers/mmc/dw_mmc.c | 78 u-boot/drivers/video/drm/dw_mipi_dsi.c | 19 u-boot/drivers/video/drm/dw_mipi_dsi2.c | 248 u-boot/include/linux/dw_hdmi.h | 3 u-boot/cmd/Kconfig | 17 u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c | 38 u-boot/configs/rv1126-spi-nor-tiny_defconfig | 1 u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk1808.S | 4 u-boot/configs/rv1106-display.config | 2 u-boot/include/image.h | 14 u-boot/cmd/bootfit.c | 1 u-boot/common/Kconfig | 12 u-boot/drivers/mmc/rockchip_dw_mmc.c | 2 u-boot/include/android_image.h | 6 u-boot/arch/arm/mach-rockchip/rk3528/clk_rk3528.c | 41 u-boot/examples/standalone/README_rkspi.md | 126 u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h | 2 u-boot/drivers/mtd/ubi/debug.h | 9 u-boot/arch/arm/dts/rk3562.dtsi | 2325 + u-boot/fs/ubifs/debug.h | 24 u-boot/arch/arm/mach-rockchip/uimage.c | 67 u-boot/include/scsi.h | 4 u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c | 494 u-boot/drivers/watchdog/rockchip_wdt.c | 11 u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3562.h | 76 u-boot/drivers/misc/rk3528-secure-otp.S | 15901 ++++++++++ u-boot/arch/arm/include/asm/arch-rockchip/pcie_ep_boot.h | 11 u-boot/include/configs/rv1106_common.h | 1 u-boot/common/image-fit.c | 1 u-boot/drivers/Kconfig | 2 u-boot/drivers/core/fdtaddr.c | 10 u-boot/drivers/rkflash/sfc_nor.c | 23 u-boot/configs/rk3326_defconfig | 4 u-boot/drivers/ufs/cdns-platform.c | 125 u-boot/configs/rk3126_defconfig | 1 u-boot/drivers/pinctrl/Kconfig | 8 u-boot/include/asm-generic/u-boot.h | 2 u-boot/scripts/fit-core.sh | 39 u-boot/arch/arm/mach-rockchip/board.c | 202 u-boot/board/rockchip/evb_rk3528/evb_rk3528.c | 33 u-boot/cmd/cache.c | 28 u-boot/drivers/video/drm/analogix_dp.c | 52 u-boot/configs/rv1126-ipc.config | 2 u-boot/arch/arm/mach-rockchip/pstore.c | 2 u-boot/include/configs/rv1126_common.h | 2 u-boot/drivers/mtd/nand/spi/gigadevice.c | 202 u-boot/lib/rsa/rsa-sign.c | 21 u-boot/drivers/video/drm/rockchip_vop.c | 31 u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c | 12 u-boot/include/drm_modes.h | 94 u-boot/drivers/power/regulator/regulator-uclass.c | 92 u-boot/drivers/video/drm/rockchip_vop.h | 5 u-boot/cmd/ddr_tool/io_map.c | 0 u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3562.h | 211 u-boot/cmd/ddr_tool/io_map.h | 6 u-boot/cmd/ddr_tool/memtester/tests.h | 5 u-boot/drivers/mtd/spi/spi-nor-ids.c | 186 u-boot/drivers/mtd/nand/spi/unim.c | 9 u-boot/drivers/crypto/rockchip/crypto_v2.c | 226 u-boot/drivers/input/adc_key.c | 62 u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3528.h | 12 u-boot/fs/ubifs/io.c | 8 u-boot/cmd/ddr_tool/memtester/tests.c | 2 u-boot/cmd/ddr_tool/memtester/sizes.h | 6 u-boot/drivers/clk/rockchip/clk_pll.c | 23 u-boot/lib/sha256.c | 31 u-boot/include/irq-platform.h | 40 u-boot/drivers/video/drm/rohm-bu18rl82.c | 1 u-boot/drivers/mtd/nand/spi/dosilicon.c | 22 u-boot/board/rockchip/evb_rk3562/Makefile | 7 u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c | 25 u-boot/common/spl/spl_boot_image.c | 305 u-boot/arch/arm/dts/rk3562-pinctrl.dtsi | 1872 + u-boot/arch/arm/mach-rockchip/Makefile | 5 u-boot/drivers/adc/rockchip-saradc-v2.c | 33 u-boot/drivers/gpio/Kconfig | 15 u-boot/drivers/mmc/rockchip_sdhci.c | 212 u-boot/drivers/cpu/amp.its | 24 u-boot/common/spl/spl_ab.c | 35 u-boot/drivers/mmc/mmc-uclass.c | 14 u-boot/arch/arm/dts/px30.dtsi | 7 u-boot/arch/arm/dts/rk3128.dtsi | 14 u-boot/drivers/clk/rockchip/clk_rk3399.c | 4 u-boot/common/board_r.c | 18 u-boot/include/dt-bindings/power/rk3528-power.h | 18 u-boot/drivers/mtd/nand/spi/foresee.c | 20 u-boot/arch/arm/dts/rk3562-evb.dts | 31 u-boot/scripts/check-rkconfig.sh | 23 u-boot/arch/arm/cpu/armv8/sha256_ce_glue.c | 21 u-boot/arch/arm/lib/crt0_64.S | 36 u-boot/drivers/video/drm/rockchip_lvds.c | 26 u-boot/common/spl/Makefile | 3 u-boot/drivers/video/drm/panel-maxim-max96752f.c | 303 u-boot/arch/arm/dts/rk3036-sdk.dts | 14 u-boot/drivers/ufs/ufs.c | 1970 + u-boot/configs/rv1106-spi-nor-tb_defconfig | 11 u-boot/include/charset.h | 3 u-boot/drivers/spi/rockchip_sfc.c | 2 u-boot/drivers/ufs/ufs.h | 917 u-boot/include/mmc.h | 10 u-boot/drivers/Makefile | 3 u-boot/drivers/video/drm/max96755f.c | 47 u-boot/arch/arm/dts/rv1106.dtsi | 2 u-boot/configs/rv1106-emmc-tb_defconfig | 11 u-boot/include/boot_rkimg.h | 1 u-boot/arch/arm/mach-rockchip/boot_rkimg.c | 27 u-boot/configs/rk3588-ab.config | 3 u-boot/include/linux/mtd/spinand.h | 2 u-boot/drivers/clk/rockchip/clk_rk3568.c | 14 u-boot/arch/arm/dts/rv1106-evb2.dts | 22 u-boot/drivers/ram/rockchip/sdram_rk3528.c | 21 u-boot/drivers/ufs/ufshci-dwc.h | 33 u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h | 23 u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c | 23 u-boot/include/dm/read.h | 17 u-boot/include/sdhci.h | 13 u-boot/drivers/pci/pcie_dw_rockchip.c | 63 u-boot/include/max96755f.h | 1 u-boot/cmd/ddr_tool/ddr_test/Makefile | 20 u-boot/arch/arm/mach-rockchip/fit_args.sh | 4 u-boot/arch/arm/mach-rockchip/spl.c | 12 u-boot/arch/arm/cpu/armv8/sha1_ce_core.S | 132 u-boot/configs/rk3528-aarch32.config | 24 u-boot/arch/arm/dts/rk3568.dtsi | 8 u-boot/arch/arm/include/asm/arch-rockchip/clock.h | 8 u-boot/include/max96745.h | 15 u-boot/drivers/misc/rockchip-otp.c | 10 u-boot/include/dm/uclass-id.h | 1 u-boot/fs/ubifs/ubifs.h | 8 u-boot/arch/arm/cpu/armv8/sha1_ce_glue.c | 21 u-boot/arch/arm/lib/bootm.c | 9 u-boot/configs/rk-amp.config | 3 u-boot/drivers/i2c/muxes/Kconfig | 7 u-boot/include/asm-generic/atomic-long.h | 2 u-boot/arch/arm/dts/rv1126-u-boot.dtsi | 9 u-boot/configs/rk3308-amp.config | 3 u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3528.h | 196 u-boot/configs/rv1106_defconfig | 3 u-boot/arch/arm/mach-rockchip/kernel_dtb.c | 517 u-boot/drivers/pinctrl/rockchip/pinctrl-rk3562.c | 324 u-boot/include/rk_timer_irq.h | 6 u-boot/arch/arm/dts/rk3562-u-boot.dtsi | 203 u-boot/arch/arm/mach-rockchip/spl_pcie_ep_boot.c | 689 u-boot/common/spl_mp_boot_rk3528.S | 9214 +++++ u-boot/fs/ubifs/ubifs.c | 18 u-boot/drivers/mtd/nand/spi/gsto.c | 92 u-boot/cmd/mtd.c | 24 u-boot/configs/rk312x-rkflash.config | 6 u-boot/drivers/mmc/mmc.c | 77 u-boot/arch/arm/mach-rockchip/rk3528/Makefile | 11 u-boot/usb_update.txt | 4 u-boot/drivers/video/drm/max96745.c | 105 u-boot/drivers/video/drm/rockchip_dw_hdmi.c | 127 u-boot/cmd/ddr_tool/ddr_tool_mp.S | 171 u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h | 15 u-boot/cmd/boot_android.c | 4 u-boot/include/configs/rockchip-common.h | 2 u-boot/arch/arm/dts/rk3036.dtsi | 29 u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3562.h | 12 u-boot/arch/arm/dts/rk3128-u-boot.dtsi | 5 u-boot/lib/avb/libavb/avb_sha512.c | 59 u-boot/drivers/video/drm/dw_hdmi_qp.c | 66 u-boot/configs/rk3528_defconfig | 201 u-boot/arch/arm/Kconfig | 4 u-boot/drivers/mtd/nand/spi/Kconfig | 12 u-boot/configs/rk3128x_defconfig | 2 u-boot/arch/arm/mach-rockchip/fit_misc.c | 34 u-boot/configs/rk3128_defconfig | 5 u-boot/common/board_info.c | 1 u-boot/drivers/thermal/rockchip_thermal.c | 283 u-boot/arch/arm/mach-rockchip/resource_img.c | 705 u-boot/board/rockchip/evb_rk3562/evb_rk3562.c | 33 u-boot/configs/rk3568_defconfig | 2 u-boot/drivers/pinctrl/rockchip/Makefile | 2 u-boot/disk/Kconfig | 8 u-boot/include/dt-bindings/soc/rockchip,boot-mode.h | 2 u-boot/common/image-sparse.c | 17 u-boot/arch/arm/mach-rockchip/resource_hwid.c | 9 u-boot/common/bootm.c | 2 u-boot/include/power/rk8xx_pmic.h | 2 u-boot/arch/arm/mach-rockchip/rk3562/Kconfig | 17 u-boot/cmd/ddr_tool/ddr_tool_common.c | 9 u-boot/drivers/ufs/ufshcd-dwc.h | 23 u-boot/fs/ubifs/tnc.c | 25 u-boot/scripts/README.rockchip | 2 u-boot/cmd/ddr_tool/ddr_tool_common.h | 6 u-boot/drivers/clk/rockchip/clk_rk3588.c | 34 u-boot/drivers/rng/rockchip_rng.c | 143 u-boot/arch/arm/dts/rk3528.dtsi | 2184 + u-boot/include/dt-bindings/clock/rk3562-cru.h | 733 u-boot/drivers/video/Kconfig | 21 u-boot/include/rockchip/crypto_v2.h | 2 u-boot/cmd/ddr_tool/ddr_dq_eye/ddr_dq_eye.c | 0 u-boot/cmd/ufs.c | 37 u-boot/drivers/ufs/ufshcd-dwc.c | 149 u-boot/drivers/mtd/nand/spi/jsc.c | 9 u-boot/drivers/gpio/rk_gpio.c | 11 /dev/null | 66 u-boot/Kconfig | 15 u-boot/drivers/video/drm/drm_modes.c | 52 410 files changed, 91,241 insertions(+), 3,840 deletions(-) diff --git a/u-boot/Kconfig b/u-boot/Kconfig index b92331e..5489509 100644 --- a/u-boot/Kconfig +++ b/u-boot/Kconfig @@ -203,6 +203,18 @@ SHA256 variant is supported: SHA512 and others are not currently supported in U-Boot. +config FIT_ENABLE_RSA4096_SUPPORT + bool "Support RSA4096 verification of FIT image contents" + select RSA_SOFTWARE_EXP if !DM_CRYPTO + default n + help + Enable this to support RSA4096 checksum of FIT image contents. A + RSA4096 is a 4096-bit (512-byte) key used to check that + check if the content comes from an encryption party. RSA4096 is one + of algorithms recommended for use in secure applications since (as at 2016) + there is no known feasible attack that could produce a 'collision' with differing + input data. Use this for the higher security than RSA2048 in default. + config FIT_SIGNATURE bool "Enable signature verification of FIT uImages" depends on DM @@ -278,6 +290,9 @@ Say y here if you want to enable fit image structure and data print. +config FIT_OMIT_UBOOT + bool "Omit u-boot-nodtb.bin and u-boot.dtb when output uboot.itb" + if SPL config SPL_FIT diff --git a/u-boot/arch/arm/Kconfig b/u-boot/arch/arm/Kconfig index 5152615..374817b 100644 --- a/u-boot/arch/arm/Kconfig +++ b/u-boot/arch/arm/Kconfig @@ -343,6 +343,10 @@ help This ARM64 system supports AArch32 execution state. +config ARM_SMP + bool "Enable ARM Symmetric Multiprocessing" + default n + choice prompt "Target select" default TARGET_HIKEY diff --git a/u-boot/arch/arm/cpu/armv7/start.S b/u-boot/arch/arm/cpu/armv7/start.S index ed631e9..218625e 100644 --- a/u-boot/arch/arm/cpu/armv7/start.S +++ b/u-boot/arch/arm/cpu/armv7/start.S @@ -164,7 +164,9 @@ mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002000 @ clear bits 13 (--V-) bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM) +#if 0 /* There is unalign access when decompress firmware. */ orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align +#endif orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB #ifdef CONFIG_SYS_ICACHE_OFF bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache diff --git a/u-boot/arch/arm/cpu/armv8/Kconfig b/u-boot/arch/arm/cpu/armv8/Kconfig index 8e4c3dd..38efe90 100644 --- a/u-boot/arch/arm/cpu/armv8/Kconfig +++ b/u-boot/arch/arm/cpu/armv8/Kconfig @@ -143,4 +143,19 @@ endif +menuconfig ARMV8_CRYPTO + bool "ARM64 Accelerated Cryptographic Algorithms" + +if ARMV8_CRYPTO + +config ARMV8_CE_SHA1 + bool "SHA-1 digest algorithm (ARMv8 Crypto Extensions)" + default y if SHA1 + +config ARMV8_CE_SHA256 + bool "SHA-256 digest algorithm (ARMv8 Crypto Extensions)" + default y if SHA256 + +endif + endif diff --git a/u-boot/arch/arm/cpu/armv8/Makefile b/u-boot/arch/arm/cpu/armv8/Makefile index c200dc2..0140f22 100644 --- a/u-boot/arch/arm/cpu/armv8/Makefile +++ b/u-boot/arch/arm/cpu/armv8/Makefile @@ -36,3 +36,5 @@ obj-$(CONFIG_TARGET_HIKEY) += hisilicon/ obj-$(CONFIG_ARMV8_PSCI) += psci.o obj-$(CONFIG_ARCH_SUNXI) += lowlevel_init.o +obj-$(CONFIG_ARMV8_CE_SHA1) += sha1_ce_glue.o sha1_ce_core.o +obj-$(CONFIG_ARMV8_CE_SHA256) += sha256_ce_glue.o sha256_ce_core.o diff --git a/u-boot/arch/arm/cpu/armv8/sha1_ce_core.S b/u-boot/arch/arm/cpu/armv8/sha1_ce_core.S new file mode 100644 index 0000000..fbf2714 --- /dev/null +++ b/u-boot/arch/arm/cpu/armv8/sha1_ce_core.S @@ -0,0 +1,132 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * sha1_ce_core.S - SHA-1 secure hash using ARMv8 Crypto Extensions + * + * Copyright (C) 2014 Linaro Ltd <ard.biesheuvel@linaro.org> + * Copyright (C) 2022 Linaro Ltd <loic.poulain@linaro.org> + */ + +#include <config.h> +#include <linux/linkage.h> +#include <asm/system.h> +#include <asm/macro.h> + + .text + .arch armv8-a+crypto + + k0 .req v0 + k1 .req v1 + k2 .req v2 + k3 .req v3 + + t0 .req v4 + t1 .req v5 + + dga .req q6 + dgav .req v6 + dgb .req s7 + dgbv .req v7 + + dg0q .req q12 + dg0s .req s12 + dg0v .req v12 + dg1s .req s13 + dg1v .req v13 + dg2s .req s14 + + .macro add_only, op, ev, rc, s0, dg1 + .ifc \ev, ev + add t1.4s, v\s0\().4s, \rc\().4s + sha1h dg2s, dg0s + .ifnb \dg1 + sha1\op dg0q, \dg1, t0.4s + .else + sha1\op dg0q, dg1s, t0.4s + .endif + .else + .ifnb \s0 + add t0.4s, v\s0\().4s, \rc\().4s + .endif + sha1h dg1s, dg0s + sha1\op dg0q, dg2s, t1.4s + .endif + .endm + + .macro add_update, op, ev, rc, s0, s1, s2, s3, dg1 + sha1su0 v\s0\().4s, v\s1\().4s, v\s2\().4s + add_only \op, \ev, \rc, \s1, \dg1 + sha1su1 v\s0\().4s, v\s3\().4s + .endm + + .macro loadrc, k, val, tmp + movz \tmp, :abs_g0_nc:\val + movk \tmp, :abs_g1:\val + dup \k, \tmp + .endm + + /* + * void sha1_armv8_ce_process(uint32_t state[5], uint8_t const *src, + * uint32_t blocks) + */ +ENTRY(sha1_armv8_ce_process) + /* load round constants */ + loadrc k0.4s, 0x5a827999, w6 + loadrc k1.4s, 0x6ed9eba1, w6 + loadrc k2.4s, 0x8f1bbcdc, w6 + loadrc k3.4s, 0xca62c1d6, w6 + + /* load state (4+1 digest states) */ + ld1 {dgav.4s}, [x0] + ldr dgb, [x0, #16] + + /* load input (64 bytes into v8->v11 16B vectors) */ +0: ld1 {v8.4s-v11.4s}, [x1], #64 + sub w2, w2, #1 +#if __BYTE_ORDER == __LITTLE_ENDIAN + rev32 v8.16b, v8.16b + rev32 v9.16b, v9.16b + rev32 v10.16b, v10.16b + rev32 v11.16b, v11.16b +#endif + +1: add t0.4s, v8.4s, k0.4s + mov dg0v.16b, dgav.16b + + add_update c, ev, k0, 8, 9, 10, 11, dgb + add_update c, od, k0, 9, 10, 11, 8 + add_update c, ev, k0, 10, 11, 8, 9 + add_update c, od, k0, 11, 8, 9, 10 + add_update c, ev, k1, 8, 9, 10, 11 + + add_update p, od, k1, 9, 10, 11, 8 + add_update p, ev, k1, 10, 11, 8, 9 + add_update p, od, k1, 11, 8, 9, 10 + add_update p, ev, k1, 8, 9, 10, 11 + add_update p, od, k2, 9, 10, 11, 8 + + add_update m, ev, k2, 10, 11, 8, 9 + add_update m, od, k2, 11, 8, 9, 10 + add_update m, ev, k2, 8, 9, 10, 11 + add_update m, od, k2, 9, 10, 11, 8 + add_update m, ev, k3, 10, 11, 8, 9 + + add_update p, od, k3, 11, 8, 9, 10 + add_only p, ev, k3, 9 + add_only p, od, k3, 10 + add_only p, ev, k3, 11 + add_only p, od + + /* update state */ + add dgbv.2s, dgbv.2s, dg1v.2s + add dgav.4s, dgav.4s, dg0v.4s + + /* loop on next block? */ + cbz w2, 2f + b 0b + + /* store new state */ +2: st1 {dgav.4s}, [x0] + str dgb, [x0, #16] + mov w0, w2 + ret +ENDPROC(sha1_armv8_ce_process) diff --git a/u-boot/arch/arm/cpu/armv8/sha1_ce_glue.c b/u-boot/arch/arm/cpu/armv8/sha1_ce_glue.c new file mode 100644 index 0000000..780b119 --- /dev/null +++ b/u-boot/arch/arm/cpu/armv8/sha1_ce_glue.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * sha1_ce_glue.c - SHA-1 secure hash using ARMv8 Crypto Extensions + * + * Copyright (C) 2022 Linaro Ltd <loic.poulain@linaro.org> + */ + +#include <common.h> +#include <u-boot/sha1.h> + +extern void sha1_armv8_ce_process(uint32_t state[5], uint8_t const *src, + uint32_t blocks); + +void sha1_process(sha1_context *ctx, const unsigned char *data, + unsigned int blocks) +{ + if (!blocks) + return; + + sha1_armv8_ce_process(ctx->state, data, blocks); +} diff --git a/u-boot/arch/arm/cpu/armv8/sha256_ce_core.S b/u-boot/arch/arm/cpu/armv8/sha256_ce_core.S new file mode 100644 index 0000000..fbae3ca --- /dev/null +++ b/u-boot/arch/arm/cpu/armv8/sha256_ce_core.S @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * sha256-ce-core.S - core SHA-256 transform using v8 Crypto Extensions + * + * Copyright (C) 2014 Linaro Ltd <ard.biesheuvel@linaro.org> + * Copyright (C) 2022 Linaro Ltd <loic.poulain@linaro.org> + */ + + #include <config.h> + #include <linux/linkage.h> + #include <asm/system.h> + #include <asm/macro.h> + + .text + .arch armv8-a+crypto + + dga .req q20 + dgav .req v20 + dgb .req q21 + dgbv .req v21 + + t0 .req v22 + t1 .req v23 + + dg0q .req q24 + dg0v .req v24 + dg1q .req q25 + dg1v .req v25 + dg2q .req q26 + dg2v .req v26 + + .macro add_only, ev, rc, s0 + mov dg2v.16b, dg0v.16b + .ifeq \ev + add t1.4s, v\s0\().4s, \rc\().4s + sha256h dg0q, dg1q, t0.4s + sha256h2 dg1q, dg2q, t0.4s + .else + .ifnb \s0 + add t0.4s, v\s0\().4s, \rc\().4s + .endif + sha256h dg0q, dg1q, t1.4s + sha256h2 dg1q, dg2q, t1.4s + .endif + .endm + + .macro add_update, ev, rc, s0, s1, s2, s3 + sha256su0 v\s0\().4s, v\s1\().4s + add_only \ev, \rc, \s1 + sha256su1 v\s0\().4s, v\s2\().4s, v\s3\().4s + .endm + + /* + * The SHA-256 round constants + */ + .align 4 +.Lsha2_rcon: + .word 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5 + .word 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5 + .word 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3 + .word 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174 + .word 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc + .word 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da + .word 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7 + .word 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967 + .word 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13 + .word 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85 + .word 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3 + .word 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070 + .word 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5 + .word 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3 + .word 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208 + .word 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + + /* + * void sha256_armv8_ce_process(struct sha256_ce_state *sst, + * uint8_t const *src, uint32_t blocks) + */ +ENTRY(sha256_armv8_ce_process) + /* load round constants */ + adr x8, .Lsha2_rcon + ld1 { v0.4s- v3.4s}, [x8], #64 + ld1 { v4.4s- v7.4s}, [x8], #64 + ld1 { v8.4s-v11.4s}, [x8], #64 + ld1 {v12.4s-v15.4s}, [x8] + + /* load state */ + ldp dga, dgb, [x0] + + /* load input */ +0: ld1 {v16.4s-v19.4s}, [x1], #64 + sub w2, w2, #1 +#if __BYTE_ORDER == __LITTLE_ENDIAN + rev32 v16.16b, v16.16b + rev32 v17.16b, v17.16b + rev32 v18.16b, v18.16b + rev32 v19.16b, v19.16b +#endif + +1: add t0.4s, v16.4s, v0.4s + mov dg0v.16b, dgav.16b + mov dg1v.16b, dgbv.16b + + add_update 0, v1, 16, 17, 18, 19 + add_update 1, v2, 17, 18, 19, 16 + add_update 0, v3, 18, 19, 16, 17 + add_update 1, v4, 19, 16, 17, 18 + + add_update 0, v5, 16, 17, 18, 19 + add_update 1, v6, 17, 18, 19, 16 + add_update 0, v7, 18, 19, 16, 17 + add_update 1, v8, 19, 16, 17, 18 + + add_update 0, v9, 16, 17, 18, 19 + add_update 1, v10, 17, 18, 19, 16 + add_update 0, v11, 18, 19, 16, 17 + add_update 1, v12, 19, 16, 17, 18 + + add_only 0, v13, 17 + add_only 1, v14, 18 + add_only 0, v15, 19 + add_only 1 + + /* update state */ + add dgav.4s, dgav.4s, dg0v.4s + add dgbv.4s, dgbv.4s, dg1v.4s + + /* handled all input blocks? */ + cbnz w2, 0b + + /* store new state */ +3: stp dga, dgb, [x0] + ret +ENDPROC(sha256_armv8_ce_process) diff --git a/u-boot/arch/arm/cpu/armv8/sha256_ce_glue.c b/u-boot/arch/arm/cpu/armv8/sha256_ce_glue.c new file mode 100644 index 0000000..67dd796 --- /dev/null +++ b/u-boot/arch/arm/cpu/armv8/sha256_ce_glue.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * sha256_ce_glue.c - SHA-256 secure hash using ARMv8 Crypto Extensions + * + * Copyright (C) 2022 Linaro Ltd <loic.poulain@linaro.org> + */ + +#include <common.h> +#include <u-boot/sha256.h> + +extern void sha256_armv8_ce_process(uint32_t state[8], uint8_t const *src, + uint32_t blocks); + +void sha256_process(sha256_context *ctx, const unsigned char *data, + unsigned int blocks) +{ + if (!blocks) + return; + + sha256_armv8_ce_process(ctx->state, data, blocks); +} diff --git a/u-boot/arch/arm/cpu/armv8/start.S b/u-boot/arch/arm/cpu/armv8/start.S index 8447fc6..f84932d 100644 --- a/u-boot/arch/arm/cpu/armv8/start.S +++ b/u-boot/arch/arm/cpu/armv8/start.S @@ -117,6 +117,43 @@ 0: /* + * Enable instruction cache (if required), stack pointer, + * data access alignment checks and SError. + */ +#ifndef CONFIG_SYS_ICACHE_OFF + mov x1, #CR_I +#else + mov x1, #0 +#endif + switch_el x2, 3f, 2f, 1f +3: mrs x0, sctlr_el3 + orr x0, x0, x1 + msr sctlr_el3, x0 +#ifndef CONFIG_SUPPORT_USBPLUG + msr daifclr, #4 /* Enable SError. SCR_EL3.EA=1 was already set in start.S */ +#endif + b 0f +2: mrs x0, sctlr_el2 + orr x0, x0, x1 + msr sctlr_el2, x0 + + mrs x0, hcr_el2 + orr x0, x0, #HCR_EL2_TGE + orr x0, x0, #HCR_EL2_AMO +#if CONFIG_IS_ENABLED(IRQ) + orr x0, x0, #HCR_EL2_IMO +#endif + msr hcr_el2, x0 + msr daifclr, #4 + b 0f +1: mrs x0, sctlr_el1 + orr x0, x0, x1 + msr sctlr_el1, x0 + msr daifclr, #4 +0: + isb + + /* * Enable SMPEN bit for coherency. * This register is not architectural but at the moment * this bit should be set for A53/A57/A72. @@ -160,6 +197,43 @@ cbz x0, slave_cpu br x0 /* branch to the given address */ #endif /* CONFIG_ARMV8_MULTIENTRY */ + +#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_ARM_SMP) + mrs x0, mpidr_el1 + and x0, x0, #0xfff + cmp x0, #0 + beq master_cpu + +#ifdef SMP_CPU1 + cmp x0, #(SMP_CPU1) + ldr x1, =(SMP_CPU1_STACK) + beq slave_cpu +#endif + +#ifdef SMP_CPU2 + cmp x0, #(SMP_CPU2) + ldr x1, =(SMP_CPU2_STACK) + beq slave_cpu +#endif + +#ifdef SMP_CPU3 + cmp x0, #(SMP_CPU3) + ldr x1, =(SMP_CPU3_STACK) + beq slave_cpu +#endif + dsb sy + isb + +loop: + wfe + b loop + +slave_cpu: + bic sp, x1, #0xf + bl smp_entry + b loop +#endif + master_cpu: bl _main diff --git a/u-boot/arch/arm/dts/Makefile b/u-boot/arch/arm/dts/Makefile index b834bc3..0fcc630 100644 --- a/u-boot/arch/arm/dts/Makefile +++ b/u-boot/arch/arm/dts/Makefile @@ -453,12 +453,14 @@ dtb-$(CONFIG_ARCH_STI) += stih410-b2260.dtb # Compile embeded kernel dts to dtb, and put it behind of u-boot.dtb +ifeq ($(findstring arch/arm/dts/,$(EMBED_KERN_DTB_PATH)),arch/arm/dts/) EMBED_KERN_DTB_PATH := $(CONFIG_EMBED_KERNEL_DTB_PATH:"%"=%) EMBED_KERN_DTS_PATH := $(subst dtb,dts, $(EMBED_KERN_DTB_PATH)) ifneq ($(wildcard $(EMBED_KERN_DTS_PATH)),) EMBED_KERN_DTB=$(shell echo $(EMBED_KERN_DTB_PATH) | awk -F '/' '{ print $$NF }') dtb-y += $(EMBED_KERN_DTB) endif +endif targets += $(dtb-y) diff --git a/u-boot/arch/arm/dts/px30-u-boot.dtsi b/u-boot/arch/arm/dts/px30-u-boot.dtsi index ceda2f4..6c9ac21 100644 --- a/u-boot/arch/arm/dts/px30-u-boot.dtsi +++ b/u-boot/arch/arm/dts/px30-u-boot.dtsi @@ -14,6 +14,13 @@ u-boot,spl-boot-order = &emmc, &sdmmc; stdout-path = &uart2; }; + + secure-otp@ff110000 { + compatible = "rockchip,px30-secure-otp"; + reg = <0x0 0xff110000 0x0 0x4000>; + secure_conf = <0xff11C008>; + mask_addr = <0xff2d0000>; + }; }; &psci { diff --git a/u-boot/arch/arm/dts/px30.dtsi b/u-boot/arch/arm/dts/px30.dtsi index e105f4f..bffbbff 100644 --- a/u-boot/arch/arm/dts/px30.dtsi +++ b/u-boot/arch/arm/dts/px30.dtsi @@ -288,13 +288,6 @@ status = "disabled"; }; - secure_otp: secure_otp@ff110000 { - compatible = "rockchip,px30-secure-otp"; - reg = <0x0 0xff110000 0x0 0x4000>; - secure_conf = <0xff11C008>; - mask_addr = <0xff2d0000>; - }; - gic: interrupt-controller@ff131000 { compatible = "arm,gic-400"; #interrupt-cells = <3>; diff --git a/u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi b/u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi index ca97e45..b848d5e 100644 --- a/u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi +++ b/u-boot/arch/arm/dts/rk3036-sdk-u-boot.dtsi @@ -37,3 +37,31 @@ status = "okay"; }; +&pinctrl { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&gpio0 { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&gpio1 { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&gpio2 { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&usb2phy { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&usb_otg { + u-boot,dm-pre-reloc; +}; diff --git a/u-boot/arch/arm/dts/rk3036-sdk.dts b/u-boot/arch/arm/dts/rk3036-sdk.dts index e881387..8a53690 100644 --- a/u-boot/arch/arm/dts/rk3036-sdk.dts +++ b/u-boot/arch/arm/dts/rk3036-sdk.dts @@ -7,6 +7,7 @@ /dts-v1/; #include "rk3036.dtsi" +#include <dt-bindings/input/input.h> / { model = "SDK-RK3036"; @@ -37,6 +38,19 @@ regulator-max-microvolt = <5000000>; regulator-always-on; }; + + gpio-keys { + u-boot,dm-pre-reloc; + compatible = "gpio-keys"; + status = "okay"; + + volume-up { + u-boot,dm-pre-reloc; + linux,code = <KEY_VOLUMEUP>; + label = "Volume Up"; + gpios = <&gpio2 23 GPIO_ACTIVE_LOW>; + }; + }; }; &i2c1 { diff --git a/u-boot/arch/arm/dts/rk3036.dtsi b/u-boot/arch/arm/dts/rk3036.dtsi index 10ee7b8..b24a219 100644 --- a/u-boot/arch/arm/dts/rk3036.dtsi +++ b/u-boot/arch/arm/dts/rk3036.dtsi @@ -223,6 +223,35 @@ grf: syscon@20008000 { compatible = "rockchip,rk3036-grf", "syscon"; reg = <0x20008000 0x1000>; + #address-cells = <1>; + #size-cells = <1>; + + usb2phy: usb2-phy@17c { + compatible = "rockchip,rk3036-usb2phy"; + reg = <0x017c 0x0c>; + clocks = <&cru SCLK_OTGPHY0>; + clock-names = "phyclk"; + #clock-cells = <0>; + clock-output-names = "usb480m_phy"; + status = "disabled"; + + u2phy_otg: otg-port { + #phy-cells = <0>; + interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "otg-bvalid", "otg-id", + "linestate"; + status = "disabled"; + }; + + u2phy_host: host-port { + #phy-cells = <0>; + interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "linestate"; + status = "disabled"; + }; + }; }; usb_otg: usb@10180000 { diff --git a/u-boot/arch/arm/dts/rk3128-u-boot.dtsi b/u-boot/arch/arm/dts/rk3128-u-boot.dtsi index 654bf3e..0173a15 100644 --- a/u-boot/arch/arm/dts/rk3128-u-boot.dtsi +++ b/u-boot/arch/arm/dts/rk3128-u-boot.dtsi @@ -39,6 +39,11 @@ }; }; +&sfc { + u-boot,dm-pre-reloc; + status = "okay"; +}; + &emmc { u-boot,dm-pre-reloc; status = "okay"; diff --git a/u-boot/arch/arm/dts/rk3128.dtsi b/u-boot/arch/arm/dts/rk3128.dtsi index 9e4d387..5ef71de 100644 --- a/u-boot/arch/arm/dts/rk3128.dtsi +++ b/u-boot/arch/arm/dts/rk3128.dtsi @@ -222,6 +222,18 @@ reg = <0x20000110 0x24>; #reset-cells = <1>; }; + + sfc: sfc@1020c000 { + compatible ="rockchip,rksfc","rockchip,sfc"; + reg = <0x1020c000 0x8000>; + interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_SFC>, <&cru HCLK_SFC>; + clock-names = "clk_sfc", "hclk_sfc"; + assigned-clocks = <&cru SCLK_SFC>; + assigned-clock-rates = <60000000>; + status = "disabled"; + }; + nandc: nandc@10500000 { compatible = "rockchip,rk-nandc"; reg = <0x10500000 0x4000>; @@ -590,6 +602,8 @@ grf: syscon@20008000 { compatible = "rockchip,rk3128-grf", "syscon"; reg = <0x20008000 0x1000>; + #address-cells = <1>; + #size-cells = <1>; lvds: lvds { compatible = "rockchip,rk3126-lvds"; diff --git a/u-boot/arch/arm/dts/rk3308-u-boot.dtsi b/u-boot/arch/arm/dts/rk3308-u-boot.dtsi index 90ccefe..dc565b1 100644 --- a/u-boot/arch/arm/dts/rk3308-u-boot.dtsi +++ b/u-boot/arch/arm/dts/rk3308-u-boot.dtsi @@ -14,6 +14,14 @@ stdout-path = &uart2; u-boot,spl-boot-order = &sdmmc, &spi_nand, &spi_nor, &nandc, &emmc; }; + + secure-otp@ff2a8000 { + compatible = "rockchip,rk3308-secure-otp"; + reg = <0x0 0xff2a8000 0x0 0x4000>; + secure_conf = <0xff2b0004>; + mask_addr = <0xff540000>; + u-boot,dm-pre-reloc; + }; }; &psci { @@ -121,10 +129,6 @@ &saradc { u-boot,dm-pre-reloc; status = "okay"; -}; - -&secure_otp { - u-boot,dm-pre-reloc; }; &uart0 { diff --git a/u-boot/arch/arm/dts/rk3308.dtsi b/u-boot/arch/arm/dts/rk3308.dtsi index ff989ef..acdb47f 100644 --- a/u-boot/arch/arm/dts/rk3308.dtsi +++ b/u-boot/arch/arm/dts/rk3308.dtsi @@ -264,13 +264,6 @@ status = "disabled"; }; - secure_otp: secure_otp@0xff2a8000 { - compatible = "rockchip,rk3308-secure-otp"; - reg = <0x0 0xff2a8000 0x0 0x4000>; - secure_conf = <0xff2b0004>; - mask_addr = <0xff540000>; - }; - vop: vop@ff2e0000 { compatible = "rockchip,rk3308-vop"; reg = <0x0 0xff2e0000 0x0 0x1fc>, <0x0 0xff2e0a00 0x0 0x400>; diff --git a/u-boot/arch/arm/dts/rk3528-evb.dts b/u-boot/arch/arm/dts/rk3528-evb.dts new file mode 100644 index 0000000..600601a --- /dev/null +++ b/u-boot/arch/arm/dts/rk3528-evb.dts @@ -0,0 +1,31 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + * + * (C) Copyright 2020 Rockchip Electronics Co., Ltd + */ + +/dts-v1/; +#include "rk3528.dtsi" +#include "rk3528-u-boot.dtsi" +#include <dt-bindings/input/input.h> + +/ { + model = "Rockchip RK3528 Evaluation Board"; + compatible = "rockchip,rk3528-evb", "rockchip,rk3528"; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 1>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + u-boot,dm-pre-reloc; + status = "okay"; + + volumeup-key { + u-boot,dm-pre-reloc; + linux,code = <KEY_VOLUMEUP>; + label = "volume up"; + press-threshold-microvolt = <9>; + }; + }; +}; diff --git a/u-boot/arch/arm/dts/rk3528-pinctrl.dtsi b/u-boot/arch/arm/dts/rk3528-pinctrl.dtsi new file mode 100644 index 0000000..063606a --- /dev/null +++ b/u-boot/arch/arm/dts/rk3528-pinctrl.dtsi @@ -0,0 +1,1241 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ + +#include <dt-bindings/pinctrl/rockchip.h> +#include "rockchip-pinconf.dtsi" + +/* + * This file is auto generated by pin2dts tool, please keep these code + * by adding changes at end of this file. + */ +&pinctrl { + arm { + arm_pins: arm-pins { + rockchip,pins = + /* arm_avs */ + <4 RK_PC4 3 &pcfg_pull_none>; + }; + }; + + can0 { + can0m0_pins: can0m0-pins { + rockchip,pins = + /* can0_rx_m0 */ + <4 RK_PA0 3 &pcfg_pull_none>, + /* can0_tx_m0 */ + <4 RK_PA1 3 &pcfg_pull_none>; + }; + + can0m1_pins: can0m1-pins { + rockchip,pins = + /* can0_rx_m1 */ + <4 RK_PC6 3 &pcfg_pull_none>, + /* can0_tx_m1 */ + <4 RK_PC5 3 &pcfg_pull_none>; + }; + }; + + can1 { + can1m0_pins: can1m0-pins { + rockchip,pins = + /* can1_rx_m0 */ + <4 RK_PA2 4 &pcfg_pull_none>, + /* can1_tx_m0 */ + <4 RK_PA3 4 &pcfg_pull_none>; + }; + + can1m1_pins: can1m1-pins { + rockchip,pins = + /* can1_rx_m1 */ + <4 RK_PB0 4 &pcfg_pull_none>, + /* can1_tx_m1 */ + <4 RK_PB1 4 &pcfg_pull_none>; + }; + }; + + can2 { + can2m0_pins: can2m0-pins { + rockchip,pins = + /* can2_rx_m0 */ + <1 RK_PB3 2 &pcfg_pull_none>, + /* can2_tx_m0 */ + <1 RK_PB2 2 &pcfg_pull_none>; + }; + + can2m1_pins: can2m1-pins { + rockchip,pins = + /* can2_rx_m1 */ + <3 RK_PA5 5 &pcfg_pull_none>, + /* can2_tx_m1 */ + <3 RK_PA4 5 &pcfg_pull_none>; + }; + }; + + can3 { + can3m0_pins: can3m0-pins { + rockchip,pins = + /* can3_rx_m0 */ + <1 RK_PB5 2 &pcfg_pull_none>, + /* can3_tx_m0 */ + <1 RK_PB4 2 &pcfg_pull_none>; + }; + + can3m1_pins: can3m1-pins { + rockchip,pins = + /* can3_rx_m1 */ + <3 RK_PB3 2 &pcfg_pull_none>, + /* can3_tx_m1 */ + <3 RK_PB2 2 &pcfg_pull_none>; + }; + }; + + clk { + clkm0_32k_out: clkm0-32k-out { + rockchip,pins = + /* clkm0_32k_out */ + <3 RK_PC3 3 &pcfg_pull_none>; + }; + + clkm1_32k_out: clkm1-32k-out { + rockchip,pins = + /* clkm1_32k_out */ + <1 RK_PC3 1 &pcfg_pull_none>; + }; + }; + + emmc { + emmc_rstnout: emmc-rstnout { + rockchip,pins = + /* emmc_rstn */ + <1 RK_PD6 1 &pcfg_pull_none>; + }; + + emmc_bus8: emmc-bus8 { + rockchip,pins = + /* emmc_d0 */ + <1 RK_PC4 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d1 */ + <1 RK_PC5 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d2 */ + <1 RK_PC6 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d3 */ + <1 RK_PC7 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d4 */ + <1 RK_PD0 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d5 */ + <1 RK_PD1 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d6 */ + <1 RK_PD2 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d7 */ + <1 RK_PD3 1 &pcfg_pull_up_drv_level_2>; + }; + + emmc_clk: emmc-clk { + rockchip,pins = + /* emmc_clk */ + <1 RK_PD5 1 &pcfg_pull_up_drv_level_2>; + }; + + emmc_cmd: emmc-cmd { + rockchip,pins = + /* emmc_cmd */ + <1 RK_PD4 1 &pcfg_pull_up_drv_level_2>; + }; + + emmc_strb: emmc-strb { + rockchip,pins = + /* emmc_strb */ + <1 RK_PD7 1 &pcfg_pull_none>; + }; + }; + + eth { + eth_pins: eth-pins { + rockchip,pins = + /* eth_clk_25m_out */ + <3 RK_PB5 2 &pcfg_pull_none>; + }; + }; + + fephy { + fephym0_led_dpx: fephym0-led_dpx { + rockchip,pins = + /* fephy_led_dpx_m0 */ + <4 RK_PB5 2 &pcfg_pull_none>; + }; + + fephym0_led_link: fephym0-led_link { + rockchip,pins = + /* fephy_led_link_m0 */ + <4 RK_PC0 2 &pcfg_pull_none>; + }; + + fephym0_led_spd: fephym0-led_spd { + rockchip,pins = + /* fephy_led_spd_m0 */ + <4 RK_PB7 2 &pcfg_pull_none>; + }; + + fephym1_led_dpx: fephym1-led_dpx { + rockchip,pins = + /* fephy_led_dpx_m1 */ + <2 RK_PA4 5 &pcfg_pull_none>; + }; + + fephym1_led_link: fephym1-led_link { + rockchip,pins = + /* fephy_led_link_m1 */ + <2 RK_PA6 5 &pcfg_pull_none>; + }; + + fephym1_led_spd: fephym1-led_spd { + rockchip,pins = + /* fephy_led_spd_m1 */ + <2 RK_PA5 5 &pcfg_pull_none>; + }; + }; + + fspi { + fspi_pins: fspi-pins { + rockchip,pins = + /* fspi_clk */ + <1 RK_PD5 2 &pcfg_pull_none>, + /* fspi_d0 */ + <1 RK_PC4 2 &pcfg_pull_none>, + /* fspi_d1 */ + <1 RK_PC5 2 &pcfg_pull_none>, + /* fspi_d2 */ + <1 RK_PC6 2 &pcfg_pull_none>, + /* fspi_d3 */ + <1 RK_PC7 2 &pcfg_pull_none>; + }; + + fspi_csn0: fspi-csn0 { + rockchip,pins = + /* fspi_csn0 */ + <1 RK_PD0 2 &pcfg_pull_none>; + }; + fspi_csn1: fspi-csn1 { + rockchip,pins = + /* fspi_csn1 */ + <1 RK_PD1 2 &pcfg_pull_none>; + }; + }; + + gpu { + gpu_pins: gpu-pins { + rockchip,pins = + /* gpu_avs */ + <4 RK_PC3 3 &pcfg_pull_none>; + }; + }; + + hdmi { + hdmi_pins: hdmi-pins { + rockchip,pins = + /* hdmi_tx_cec */ + <0 RK_PA3 1 &pcfg_pull_none>, + /* hdmi_tx_hpd */ + <0 RK_PA2 1 &pcfg_pull_none>, + /* hdmi_tx_scl */ + <0 RK_PA4 1 &pcfg_pull_none>, + /* hdmi_tx_sda */ + <0 RK_PA5 1 &pcfg_pull_none>; + }; + }; + + hsm { + hsmm0_pins: hsmm0-pins { + rockchip,pins = + /* hsm_clk_out_m0 */ + <2 RK_PA2 4 &pcfg_pull_none>; + }; + + hsmm1_pins: hsmm1-pins { + rockchip,pins = + /* hsm_clk_out_m1 */ + <1 RK_PA4 3 &pcfg_pull_none>; + }; + }; + + i2c0 { + i2c0m0_xfer: i2c0m0-xfer { + rockchip,pins = + /* i2c0_scl_m0 */ + <4 RK_PC4 2 &pcfg_pull_none_smt>, + /* i2c0_sda_m0 */ + <4 RK_PC3 2 &pcfg_pull_none_smt>; + }; + + i2c0m1_xfer: i2c0m1-xfer { + rockchip,pins = + /* i2c0_scl_m1 */ + <4 RK_PA1 2 &pcfg_pull_none_smt>, + /* i2c0_sda_m1 */ + <4 RK_PA0 2 &pcfg_pull_none_smt>; + }; + }; + + i2c1 { + i2c1m0_xfer: i2c1m0-xfer { + rockchip,pins = + /* i2c1_scl_m0 */ + <4 RK_PA3 2 &pcfg_pull_none_smt>, + /* i2c1_sda_m0 */ + <4 RK_PA2 2 &pcfg_pull_none_smt>; + }; + + i2c1m1_xfer: i2c1m1-xfer { + rockchip,pins = + /* i2c1_scl_m1 */ + <4 RK_PC5 4 &pcfg_pull_none_smt>, + /* i2c1_sda_m1 */ + <4 RK_PC6 4 &pcfg_pull_none_smt>; + }; + }; + + i2c2 { + i2c2m0_xfer: i2c2m0-xfer { + rockchip,pins = + /* i2c2_scl_m0 */ + <0 RK_PA4 2 &pcfg_pull_none_smt>, + /* i2c2_sda_m0 */ + <0 RK_PA5 2 &pcfg_pull_none_smt>; + }; + + i2c2m1_xfer: i2c2m1-xfer { + rockchip,pins = + /* i2c2_scl_m1 */ + <1 RK_PA5 3 &pcfg_pull_none_smt>, + /* i2c2_sda_m1 */ + <1 RK_PA6 3 &pcfg_pull_none_smt>; + }; + }; + + i2c3 { + i2c3m0_xfer: i2c3m0-xfer { + rockchip,pins = + /* i2c3_scl_m0 */ + <1 RK_PA0 2 &pcfg_pull_none_smt>, + /* i2c3_sda_m0 */ + <1 RK_PA1 2 &pcfg_pull_none_smt>; + }; + + i2c3m1_xfer: i2c3m1-xfer { + rockchip,pins = + /* i2c3_scl_m1 */ + <3 RK_PC1 5 &pcfg_pull_none_smt>, + /* i2c3_sda_m1 */ + <3 RK_PC3 5 &pcfg_pull_none_smt>; + }; + }; + + i2c4 { + i2c4_xfer: i2c4-xfer { + rockchip,pins = + /* i2c4_scl */ + <2 RK_PA0 4 &pcfg_pull_none_smt>, + /* i2c4_sda */ + <2 RK_PA1 4 &pcfg_pull_none_smt>; + }; + }; + + i2c5 { + i2c5m0_xfer: i2c5m0-xfer { + rockchip,pins = + /* i2c5_scl_m0 */ + <1 RK_PB2 3 &pcfg_pull_none_smt>, + /* i2c5_sda_m0 */ + <1 RK_PB3 3 &pcfg_pull_none_smt>; + }; + + i2c5m1_xfer: i2c5m1-xfer { + rockchip,pins = + /* i2c5_scl_m1 */ + <1 RK_PD2 3 &pcfg_pull_none_smt>, + /* i2c5_sda_m1 */ + <1 RK_PD3 3 &pcfg_pull_none_smt>; + }; + }; + + i2c6 { + i2c6m0_xfer: i2c6m0-xfer { + rockchip,pins = + /* i2c6_scl_m0 */ + <3 RK_PB2 5 &pcfg_pull_none_smt>, + /* i2c6_sda_m0 */ + <3 RK_PB3 5 &pcfg_pull_none_smt>; + }; + + i2c6m1_xfer: i2c6m1-xfer { + rockchip,pins = + /* i2c6_scl_m1 */ + <1 RK_PD4 3 &pcfg_pull_none_smt>, + /* i2c6_sda_m1 */ + <1 RK_PD7 3 &pcfg_pull_none_smt>; + }; + }; + + i2c7 { + i2c7_xfer: i2c7-xfer { + rockchip,pins = + /* i2c7_scl */ + <2 RK_PA5 4 &pcfg_pull_none_smt>, + /* i2c7_sda */ + <2 RK_PA6 4 &pcfg_pull_none_smt>; + }; + }; + + i2s0 { + i2s0m0_pins: i2s0m0-pins { + rockchip,pins = + /* i2s0_lrck_m0 */ + <3 RK_PB6 1 &pcfg_pull_none>, + /* i2s0_mclk_m0 */ + <3 RK_PB4 1 &pcfg_pull_none>, + /* i2s0_sclk_m0 */ + <3 RK_PB5 1 &pcfg_pull_none>, + /* i2s0_sdi_m0 */ + <3 RK_PB7 1 &pcfg_pull_none>, + /* i2s0_sdo_m0 */ + <3 RK_PC0 1 &pcfg_pull_none>; + }; + + i2s0m1_pins: i2s0m1-pins { + rockchip,pins = + /* i2s0_lrck_m1 */ + <1 RK_PB6 1 &pcfg_pull_none>, + /* i2s0_mclk_m1 */ + <1 RK_PB4 1 &pcfg_pull_none>, + /* i2s0_sclk_m1 */ + <1 RK_PB5 1 &pcfg_pull_none>, + /* i2s0_sdi_m1 */ + <1 RK_PB7 1 &pcfg_pull_none>, + /* i2s0_sdo_m1 */ + <1 RK_PC0 1 &pcfg_pull_none>; + }; + }; + + i2s1 { + i2s1_pins: i2s1-pins { + rockchip,pins = + /* i2s1_lrck */ + <4 RK_PA6 1 &pcfg_pull_none>, + /* i2s1_mclk */ + <4 RK_PA4 1 &pcfg_pull_none>, + /* i2s1_sclk */ + <4 RK_PA5 1 &pcfg_pull_none>, + /* i2s1_sdi0 */ + <4 RK_PB4 1 &pcfg_pull_none>, + /* i2s1_sdi1 */ + <4 RK_PB3 1 &pcfg_pull_none>, + /* i2s1_sdi2 */ + <4 RK_PA3 1 &pcfg_pull_none>, + /* i2s1_sdi3 */ + <4 RK_PA2 1 &pcfg_pull_none>, + /* i2s1_sdo0 */ + <4 RK_PA7 1 &pcfg_pull_none>, + /* i2s1_sdo1 */ + <4 RK_PB0 1 &pcfg_pull_none>, + /* i2s1_sdo2 */ + <4 RK_PB1 1 &pcfg_pull_none>, + /* i2s1_sdo3 */ + <4 RK_PB2 1 &pcfg_pull_none>; + }; + }; + + jtag { + jtagm0_pins: jtagm0-pins { + rockchip,pins = + /* jtag_cpu_tck_m0 */ + <2 RK_PA2 2 &pcfg_pull_none>, + /* jtag_cpu_tms_m0 */ + <2 RK_PA3 2 &pcfg_pull_none>, + /* jtag_mcu_tck_m0 */ + <2 RK_PA4 2 &pcfg_pull_none>, + /* jtag_mcu_tms_m0 */ + <2 RK_PA5 2 &pcfg_pull_none>; + }; + + jtagm1_pins: jtagm1-pins { + rockchip,pins = + /* jtag_cpu_tck_m1 */ + <4 RK_PD0 2 &pcfg_pull_none>, + /* jtag_cpu_tms_m1 */ + <4 RK_PC7 2 &pcfg_pull_none>, + /* jtag_mcu_tck_m1 */ + <4 RK_PD0 3 &pcfg_pull_none>, + /* jtag_mcu_tms_m1 */ + <4 RK_PC7 3 &pcfg_pull_none>; + }; + }; + + pcie { + pciem0_pins: pciem0-pins { + rockchip,pins = + /* pcie_clkreqn_m0 */ + <3 RK_PA6 5 &pcfg_pull_none>, + /* pcie_perstn_m0 */ + <3 RK_PB0 5 &pcfg_pull_none>, + /* pcie_waken_m0 */ + <3 RK_PA7 5 &pcfg_pull_none>; + }; + + pciem1_pins: pciem1-pins { + rockchip,pins = + /* pcie_clkreqn_m1 */ + <1 RK_PA0 4 &pcfg_pull_none>, + /* pcie_perstn_m1 */ + <1 RK_PA2 4 &pcfg_pull_none>, + /* pcie_waken_m1 */ + <1 RK_PA1 4 &pcfg_pull_none>; + }; + }; + + pdm { + pdm_clk0: pdm-clk0 { + rockchip,pins = + /* pdm_clk0 */ + <4 RK_PB5 3 &pcfg_pull_none>; + }; + + pdm_clk1: pdm-clk1 { + rockchip,pins = + /* pdm_clk1 */ + <4 RK_PA4 3 &pcfg_pull_none>; + }; + + pdm_sdi0: pdm-sdi0 { + rockchip,pins = + /* pdm_sdi0 */ + <4 RK_PB2 3 &pcfg_pull_none>; + }; + + pdm_sdi1: pdm-sdi1 { + rockchip,pins = + /* pdm_sdi1 */ + <4 RK_PB1 3 &pcfg_pull_none>; + }; + + pdm_sdi2: pdm-sdi2 { + rockchip,pins = + /* pdm_sdi2 */ + <4 RK_PB3 3 &pcfg_pull_none>; + }; + + pdm_sdi3: pdm-sdi3 { + rockchip,pins = + /* pdm_sdi3 */ + <4 RK_PC1 3 &pcfg_pull_none>; + }; + }; + + pmu { + pmu_pins: pmu-pins { + rockchip,pins = + /* pmu_debug */ + <4 RK_PA0 4 &pcfg_pull_none>; + }; + }; + + pwm0 { + pwm0m0_pins: pwm0m0-pins { + rockchip,pins = + /* pwm0_m0 */ + <4 RK_PC3 1 &pcfg_pull_none>; + }; + + pwm0m1_pins: pwm0m1-pins { + rockchip,pins = + /* pwm0_m1 */ + <1 RK_PA2 5 &pcfg_pull_none>; + }; + }; + + pwm1 { + pwm1m0_pins: pwm1m0-pins { + rockchip,pins = + /* pwm1_m0 */ + <4 RK_PC4 1 &pcfg_pull_none>; + }; + + pwm1m1_pins: pwm1m1-pins { + rockchip,pins = + /* pwm1_m1 */ + <1 RK_PA3 4 &pcfg_pull_none>; + }; + }; + + pwm2 { + pwm2m0_pins: pwm2m0-pins { + rockchip,pins = + /* pwm2_m0 */ + <4 RK_PC5 1 &pcfg_pull_none>; + }; + + pwm2m1_pins: pwm2m1-pins { + rockchip,pins = + /* pwm2_m1 */ + <1 RK_PA7 2 &pcfg_pull_none>; + }; + }; + + pwm3 { + pwm3m0_pins: pwm3m0-pins { + rockchip,pins = + /* pwm3_m0 */ + <4 RK_PC6 1 &pcfg_pull_none>; + }; + + pwm3m1_pins: pwm3m1-pins { + rockchip,pins = + /* pwm3_m1 */ + <2 RK_PA4 3 &pcfg_pull_none>; + }; + }; + + pwm4 { + pwm4m0_pins: pwm4m0-pins { + rockchip,pins = + /* pwm4_m0 */ + <4 RK_PB7 1 &pcfg_pull_none>; + }; + + pwm4m1_pins: pwm4m1-pins { + rockchip,pins = + /* pwm4_m1 */ + <1 RK_PA4 2 &pcfg_pull_none>; + }; + }; + + pwm5 { + pwm5m0_pins: pwm5m0-pins { + rockchip,pins = + /* pwm5_m0 */ + <4 RK_PC0 1 &pcfg_pull_none>; + }; + + pwm5m1_pins: pwm5m1-pins { + rockchip,pins = + /* pwm5_m1 */ + <3 RK_PC3 1 &pcfg_pull_none>; + }; + }; + + pwm6 { + pwm6m0_pins: pwm6m0-pins { + rockchip,pins = + /* pwm6_m0 */ + <4 RK_PC1 1 &pcfg_pull_none>; + }; + + pwm6m1_pins: pwm6m1-pins { + rockchip,pins = + /* pwm6_m1 */ + <1 RK_PC3 3 &pcfg_pull_none>; + }; + + pwm6m2_pins: pwm6m2-pins { + rockchip,pins = + /* pwm6_m2 */ + <3 RK_PC1 1 &pcfg_pull_none>; + }; + }; + + pwm7 { + pwm7m0_pins: pwm7m0-pins { + rockchip,pins = + /* pwm7_m0 */ + <4 RK_PC2 1 &pcfg_pull_none>; + }; + + pwm7m1_pins: pwm7m1-pins { + rockchip,pins = + /* pwm7_m1 */ + <1 RK_PC2 2 &pcfg_pull_none>; + }; + }; + + pwr { + pwr_pins: pwr-pins { + rockchip,pins = + /* pwr_ctrl0 */ + <4 RK_PC2 2 &pcfg_pull_none>, + /* pwr_ctrl1 */ + <4 RK_PB6 1 &pcfg_pull_none>; + }; + }; + + ref { + refm0_pins: refm0-pins { + rockchip,pins = + /* ref_clk_out_m0 */ + <0 RK_PA1 1 &pcfg_pull_none>; + }; + + refm1_pins: refm1-pins { + rockchip,pins = + /* ref_clk_out_m1 */ + <3 RK_PC3 6 &pcfg_pull_none>; + }; + }; + + rgmii { + rgmii_miim: rgmii-miim { + rockchip,pins = + /* rgmii_mdc */ + <3 RK_PB6 2 &pcfg_pull_none>, + /* rgmii_mdio */ + <3 RK_PB7 2 &pcfg_pull_none>; + }; + + rgmii_rx_bus2: rgmii-rx_bus2 { + rockchip,pins = + /* rgmii_rxd0 */ + <3 RK_PA3 2 &pcfg_pull_none>, + /* rgmii_rxd1 */ + <3 RK_PA2 2 &pcfg_pull_none>, + /* rgmii_rxdv_crs */ + <3 RK_PC2 2 &pcfg_pull_none>; + }; + + rgmii_tx_bus2: rgmii-tx_bus2 { + rockchip,pins = + /* rgmii_txd0 */ + <3 RK_PA1 2 &pcfg_pull_none>, + /* rgmii_txd1 */ + <3 RK_PA0 2 &pcfg_pull_none>, + /* rgmii_txen */ + <3 RK_PC0 2 &pcfg_pull_none>; + }; + + rgmii_rgmii_clk: rgmii-rgmii_clk { + rockchip,pins = + /* rgmii_rxclk */ + <3 RK_PA5 2 &pcfg_pull_none>, + /* rgmii_txclk */ + <3 RK_PA4 2 &pcfg_pull_none>; + }; + + rgmii_rgmii_bus: rgmii-rgmii_bus { + rockchip,pins = + /* rgmii_rxd2 */ + <3 RK_PA7 2 &pcfg_pull_none>, + /* rgmii_rxd3 */ + <3 RK_PA6 2 &pcfg_pull_none>, + /* rgmii_txd2 */ + <3 RK_PB1 2 &pcfg_pull_none>, + /* rgmii_txd3 */ + <3 RK_PB0 2 &pcfg_pull_none>; + }; + + rgmii_clk: rgmii-clk { + rockchip,pins = + /* rgmii_clk */ + <3 RK_PB4 2 &pcfg_pull_none>; + }; + rgmii_txer: rgmii-txer { + rockchip,pins = + /* rgmii_txer */ + <3 RK_PC1 2 &pcfg_pull_none>; + }; + }; + + scr { + scrm0_pins: scrm0-pins { + rockchip,pins = + /* scr_clk_m0 */ + <1 RK_PA2 3 &pcfg_pull_none>, + /* scr_data_m0 */ + <1 RK_PA1 3 &pcfg_pull_none>, + /* scr_detn_m0 */ + <1 RK_PA0 3 &pcfg_pull_none>, + /* scr_rstn_m0 */ + <1 RK_PA3 3 &pcfg_pull_none>; + }; + + scrm1_pins: scrm1-pins { + rockchip,pins = + /* scr_clk_m1 */ + <2 RK_PA5 3 &pcfg_pull_none>, + /* scr_data_m1 */ + <2 RK_PA3 4 &pcfg_pull_none>, + /* scr_detn_m1 */ + <2 RK_PA6 3 &pcfg_pull_none>, + /* scr_rstn_m1 */ + <2 RK_PA4 4 &pcfg_pull_none>; + }; + }; + + sdio0 { + sdio0_bus4: sdio0-bus4 { + rockchip,pins = + /* sdio0_d0 */ + <1 RK_PA0 1 &pcfg_pull_up_drv_level_2>, + /* sdio0_d1 */ + <1 RK_PA1 1 &pcfg_pull_up_drv_level_2>, + /* sdio0_d2 */ + <1 RK_PA2 1 &pcfg_pull_up_drv_level_2>, + /* sdio0_d3 */ + <1 RK_PA3 1 &pcfg_pull_up_drv_level_2>; + }; + + sdio0_clk: sdio0-clk { + rockchip,pins = + /* sdio0_clk */ + <1 RK_PA5 1 &pcfg_pull_up_drv_level_2>; + }; + + sdio0_cmd: sdio0-cmd { + rockchip,pins = + /* sdio0_cmd */ + <1 RK_PA4 1 &pcfg_pull_up_drv_level_2>; + }; + + sdio0_det: sdio0-det { + rockchip,pins = + /* sdio0_det */ + <1 RK_PA6 1 &pcfg_pull_up>; + }; + + sdio0_pwren: sdio0-pwren { + rockchip,pins = + /* sdio0_pwren */ + <1 RK_PA7 1 &pcfg_pull_none>; + }; + }; + + sdio1 { + sdio1_bus4: sdio1-bus4 { + rockchip,pins = + /* sdio1_d0 */ + <3 RK_PA6 1 &pcfg_pull_up_drv_level_2>, + /* sdio1_d1 */ + <3 RK_PA7 1 &pcfg_pull_up_drv_level_2>, + /* sdio1_d2 */ + <3 RK_PB0 1 &pcfg_pull_up_drv_level_2>, + /* sdio1_d3 */ + <3 RK_PB1 1 &pcfg_pull_up_drv_level_2>; + }; + + sdio1_clk: sdio1-clk { + rockchip,pins = + /* sdio1_clk */ + <3 RK_PA4 1 &pcfg_pull_up_drv_level_2>; + }; + + sdio1_cmd: sdio1-cmd { + rockchip,pins = + /* sdio1_cmd */ + <3 RK_PA5 1 &pcfg_pull_up_drv_level_2>; + }; + + sdio1_det: sdio1-det { + rockchip,pins = + /* sdio1_det */ + <3 RK_PB3 1 &pcfg_pull_up>; + }; + + sdio1_pwren: sdio1-pwren { + rockchip,pins = + /* sdio1_pwren */ + <3 RK_PB2 1 &pcfg_pull_none>; + }; + }; + + sdmmc_pins: sdmmc-pins { + sdmmc_bus4: sdmmc-bus4 { + rockchip,pins = + /* sdmmc_d0 */ + <2 RK_PA0 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc_d1 */ + <2 RK_PA1 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc_d2 */ + <2 RK_PA2 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc_d3 */ + <2 RK_PA3 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc_clk: sdmmc-clk { + rockchip,pins = + /* sdmmc_clk */ + <2 RK_PA5 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc_cmd: sdmmc-cmd { + rockchip,pins = + /* sdmmc_cmd */ + <2 RK_PA4 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc_det: sdmmc-det { + rockchip,pins = + /* sdmmc_detn */ + <2 RK_PA6 1 &pcfg_pull_up>; + }; + + sdmmc_pwren: sdmmc-pwren { + rockchip,pins = + /* sdmmc_pwren */ + <4 RK_PA1 1 &pcfg_pull_none>; + }; + }; + + spdif { + spdifm0_pins: spdifm0-pins { + rockchip,pins = + /* spdif_tx_m0 */ + <4 RK_PA0 1 &pcfg_pull_none>; + }; + + spdifm1_pins: spdifm1-pins { + rockchip,pins = + /* spdif_tx_m1 */ + <1 RK_PC3 2 &pcfg_pull_none>; + }; + + spdifm2_pins: spdifm2-pins { + rockchip,pins = + /* spdif_tx_m2 */ + <3 RK_PC3 2 &pcfg_pull_none>; + }; + }; + + spi0 { + spi0_pins: spi0-pins { + rockchip,pins = + /* spi0_clk */ + <4 RK_PB4 2 &pcfg_pull_none>, + /* spi0_miso */ + <4 RK_PB3 2 &pcfg_pull_none>, + /* spi0_mosi */ + <4 RK_PB2 2 &pcfg_pull_none>; + }; + + spi0_csn0: spi0-csn0 { + rockchip,pins = + /* spi0_csn0 */ + <4 RK_PB6 2 &pcfg_pull_none>; + }; + spi0_csn1: spi0-csn1 { + rockchip,pins = + /* spi0_csn1 */ + <4 RK_PC1 2 &pcfg_pull_none>; + }; + }; + + spi1 { + spi1_pins: spi1-pins { + rockchip,pins = + /* spi1_clk */ + <1 RK_PB6 2 &pcfg_pull_none>, + /* spi1_miso */ + <1 RK_PC0 2 &pcfg_pull_none>, + /* spi1_mosi */ + <1 RK_PB7 2 &pcfg_pull_none>; + }; + + spi1_csn0: spi1-csn0 { + rockchip,pins = + /* spi1_csn0 */ + <1 RK_PC1 1 &pcfg_pull_none>; + }; + spi1_csn1: spi1-csn1 { + rockchip,pins = + /* spi1_csn1 */ + <1 RK_PC2 1 &pcfg_pull_none>; + }; + }; + + tsi0 { + tsi0_pins: tsi0-pins { + rockchip,pins = + /* tsi0_clkin */ + <3 RK_PB2 3 &pcfg_pull_none>, + /* tsi0_d0 */ + <3 RK_PB1 3 &pcfg_pull_none>, + /* tsi0_d1 */ + <3 RK_PB5 3 &pcfg_pull_none>, + /* tsi0_d2 */ + <3 RK_PB6 3 &pcfg_pull_none>, + /* tsi0_d3 */ + <3 RK_PB7 3 &pcfg_pull_none>, + /* tsi0_d4 */ + <3 RK_PA3 3 &pcfg_pull_none>, + /* tsi0_d5 */ + <3 RK_PA2 3 &pcfg_pull_none>, + /* tsi0_d6 */ + <3 RK_PA1 3 &pcfg_pull_none>, + /* tsi0_d7 */ + <3 RK_PA0 3 &pcfg_pull_none>, + /* tsi0_fail */ + <3 RK_PC0 3 &pcfg_pull_none>, + /* tsi0_sync */ + <3 RK_PB4 3 &pcfg_pull_none>, + /* tsi0_valid */ + <3 RK_PB3 3 &pcfg_pull_none>; + }; + }; + + tsi1 { + tsi1_pins: tsi1-pins { + rockchip,pins = + /* tsi1_clkin */ + <3 RK_PA5 3 &pcfg_pull_none>, + /* tsi1_d0 */ + <3 RK_PA4 3 &pcfg_pull_none>, + /* tsi1_sync */ + <3 RK_PA7 3 &pcfg_pull_none>, + /* tsi1_valid */ + <3 RK_PA6 3 &pcfg_pull_none>; + }; + }; + + uart0 { + uart0m0_xfer: uart0m0-xfer { + rockchip,pins = + /* uart0_rx_m0 */ + <4 RK_PC7 1 &pcfg_pull_up>, + /* uart0_tx_m0 */ + <4 RK_PD0 1 &pcfg_pull_up>; + }; + + uart0m1_xfer: uart0m1-xfer { + rockchip,pins = + /* uart0_rx_m1 */ + <2 RK_PA0 2 &pcfg_pull_up>, + /* uart0_tx_m1 */ + <2 RK_PA1 2 &pcfg_pull_up>; + }; + }; + + uart1 { + uart1m0_xfer: uart1m0-xfer { + rockchip,pins = + /* uart1_rx_m0 */ + <4 RK_PA7 2 &pcfg_pull_up>, + /* uart1_tx_m0 */ + <4 RK_PA6 2 &pcfg_pull_up>; + }; + + uart1m1_xfer: uart1m1-xfer { + rockchip,pins = + /* uart1_rx_m1 */ + <4 RK_PC6 2 &pcfg_pull_up>, + /* uart1_tx_m1 */ + <4 RK_PC5 2 &pcfg_pull_up>; + }; + + uart1_ctsn: uart1-ctsn { + rockchip,pins = + /* uart1_ctsn */ + <4 RK_PA4 2 &pcfg_pull_none>; + }; + uart1_rtsn: uart1-rtsn { + rockchip,pins = + /* uart1_rtsn */ + <4 RK_PA5 2 &pcfg_pull_none>; + }; + }; + + uart2 { + uart2m0_xfer: uart2m0-xfer { + rockchip,pins = + /* uart2_rx_m0 */ + <3 RK_PA0 1 &pcfg_pull_up>, + /* uart2_tx_m0 */ + <3 RK_PA1 1 &pcfg_pull_up>; + }; + + uart2m0_ctsn: uart2m0-ctsn { + rockchip,pins = + /* uart2m0_ctsn */ + <3 RK_PA3 1 &pcfg_pull_none>; + }; + uart2m0_rtsn: uart2m0-rtsn { + rockchip,pins = + /* uart2m0_rtsn */ + <3 RK_PA2 1 &pcfg_pull_none>; + }; + + uart2m1_xfer: uart2m1-xfer { + rockchip,pins = + /* uart2_rx_m1 */ + <1 RK_PB0 1 &pcfg_pull_up>, + /* uart2_tx_m1 */ + <1 RK_PB1 1 &pcfg_pull_up>; + }; + + uart2m1_ctsn: uart2m1-ctsn { + rockchip,pins = + /* uart2m1_ctsn */ + <1 RK_PB3 1 &pcfg_pull_none>; + }; + uart2m1_rtsn: uart2m1-rtsn { + rockchip,pins = + /* uart2m1_rtsn */ + <1 RK_PB2 1 &pcfg_pull_none>; + }; + }; + + uart3 { + uart3m0_xfer: uart3m0-xfer { + rockchip,pins = + /* uart3_rx_m0 */ + <4 RK_PB0 2 &pcfg_pull_up>, + /* uart3_tx_m0 */ + <4 RK_PB1 2 &pcfg_pull_up>; + }; + + uart3m1_xfer: uart3m1-xfer { + rockchip,pins = + /* uart3_rx_m1 */ + <4 RK_PB7 3 &pcfg_pull_up>, + /* uart3_tx_m1 */ + <4 RK_PC0 3 &pcfg_pull_up>; + }; + + uart3_ctsn: uart3-ctsn { + rockchip,pins = + /* uart3_ctsn */ + <4 RK_PA3 3 &pcfg_pull_none>; + }; + uart3_rtsn: uart3-rtsn { + rockchip,pins = + /* uart3_rtsn */ + <4 RK_PA2 3 &pcfg_pull_none>; + }; + }; + + uart4 { + uart4_xfer: uart4-xfer { + rockchip,pins = + /* uart4_rx */ + <2 RK_PA2 3 &pcfg_pull_up>, + /* uart4_tx */ + <2 RK_PA3 3 &pcfg_pull_up>; + }; + + uart4_ctsn: uart4-ctsn { + rockchip,pins = + /* uart4_ctsn */ + <2 RK_PA1 3 &pcfg_pull_none>; + }; + uart4_rtsn: uart4-rtsn { + rockchip,pins = + /* uart4_rtsn */ + <2 RK_PA0 3 &pcfg_pull_none>; + }; + }; + + uart5 { + uart5m0_xfer: uart5m0-xfer { + rockchip,pins = + /* uart5_rx_m0 */ + <1 RK_PA2 2 &pcfg_pull_up>, + /* uart5_tx_m0 */ + <1 RK_PA3 2 &pcfg_pull_up>; + }; + + uart5m0_ctsn: uart5m0-ctsn { + rockchip,pins = + /* uart5m0_ctsn */ + <1 RK_PA6 2 &pcfg_pull_none>; + }; + uart5m0_rtsn: uart5m0-rtsn { + rockchip,pins = + /* uart5m0_rtsn */ + <1 RK_PA5 2 &pcfg_pull_none>; + }; + + uart5m1_xfer: uart5m1-xfer { + rockchip,pins = + /* uart5_rx_m1 */ + <1 RK_PD4 2 &pcfg_pull_up>, + /* uart5_tx_m1 */ + <1 RK_PD7 2 &pcfg_pull_up>; + }; + + uart5m1_ctsn: uart5m1-ctsn { + rockchip,pins = + /* uart5m1_ctsn */ + <1 RK_PD3 2 &pcfg_pull_none>; + }; + uart5m1_rtsn: uart5m1-rtsn { + rockchip,pins = + /* uart5m1_rtsn */ + <1 RK_PD2 2 &pcfg_pull_none>; + }; + }; + + uart6 { + uart6m0_xfer: uart6m0-xfer { + rockchip,pins = + /* uart6_rx_m0 */ + <3 RK_PA7 4 &pcfg_pull_up>, + /* uart6_tx_m0 */ + <3 RK_PA6 4 &pcfg_pull_up>; + }; + + uart6m1_xfer: uart6m1-xfer { + rockchip,pins = + /* uart6_rx_m1 */ + <3 RK_PC3 4 &pcfg_pull_up>, + /* uart6_tx_m1 */ + <3 RK_PC1 4 &pcfg_pull_up>; + }; + + uart6_ctsn: uart6-ctsn { + rockchip,pins = + /* uart6_ctsn */ + <3 RK_PA4 4 &pcfg_pull_none>; + }; + uart6_rtsn: uart6-rtsn { + rockchip,pins = + /* uart6_rtsn */ + <3 RK_PA5 4 &pcfg_pull_none>; + }; + }; + + uart7 { + uart7m0_xfer: uart7m0-xfer { + rockchip,pins = + /* uart7_rx_m0 */ + <3 RK_PB3 4 &pcfg_pull_up>, + /* uart7_tx_m0 */ + <3 RK_PB2 4 &pcfg_pull_up>; + }; + + uart7m0_ctsn: uart7m0-ctsn { + rockchip,pins = + /* uart7m0_ctsn */ + <3 RK_PB0 4 &pcfg_pull_none>; + }; + uart7m0_rtsn: uart7m0-rtsn { + rockchip,pins = + /* uart7m0_rtsn */ + <3 RK_PB1 4 &pcfg_pull_none>; + }; + + uart7m1_xfer: uart7m1-xfer { + rockchip,pins = + /* uart7_rx_m1 */ + <1 RK_PB3 4 &pcfg_pull_up>, + /* uart7_tx_m1 */ + <1 RK_PB2 4 &pcfg_pull_up>; + }; + + uart7m1_ctsn: uart7m1-ctsn { + rockchip,pins = + /* uart7m1_ctsn */ + <1 RK_PB0 4 &pcfg_pull_none>; + }; + uart7m1_rtsn: uart7m1-rtsn { + rockchip,pins = + /* uart7m1_rtsn */ + <1 RK_PB1 4 &pcfg_pull_none>; + }; + }; +}; diff --git a/u-boot/arch/arm/dts/rk3528-u-boot.dtsi b/u-boot/arch/arm/dts/rk3528-u-boot.dtsi new file mode 100644 index 0000000..7d09361 --- /dev/null +++ b/u-boot/arch/arm/dts/rk3528-u-boot.dtsi @@ -0,0 +1,206 @@ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +/ { + aliases { + mmc0 = &sdhci; + mmc1 = &sdmmc; + }; + + chosen { + stdout-path = &uart2; + u-boot,spl-boot-order = &sdmmc, &sdhci, &spi_nand, &spi_nor; + }; + + secure-otp@ffcd0000 { + compatible = "rockchip,rk3528-secure-otp"; + reg = <0x0 0xffcd0000 0x0 0x4000>; + secure_conf = <0xff4500c0>; + mask_addr = <0x0>; + cru_rst_addr = <0xff4a8080>; + u-boot,dm-spl; + status = "okay"; + }; + +}; + +&grf { + u-boot,dm-spl; + status = "okay"; +}; + +&ioc_grf { + u-boot,dm-spl; + status = "okay"; +}; + +&cru { + /delete-property/ assigned-clocks; + /delete-property/ assigned-clock-rates; + u-boot,dm-spl; + status = "okay"; +}; + +&crypto { + u-boot,dm-spl; + status = "okay"; +}; + +&rng { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&psci { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&uart2 { + clock-frequency = <24000000>; + u-boot,dm-spl; + status = "okay"; +}; + +&sfc { + u-boot,dm-spl; + /delete-property/ pinctrl-names; + /delete-property/ pinctrl-0; + /delete-property/ assigned-clocks; + /delete-property/ assigned-clock-rates; + status = "okay"; + + #address-cells = <1>; + #size-cells = <0>; + spi_nand: flash@0 { + u-boot,dm-spl; + compatible = "spi-nand"; + reg = <0>; + spi-tx-bus-width = <1>; + spi-rx-bus-width = <4>; + spi-max-frequency = <75000000>; + }; + + spi_nor: flash@1 { + u-boot,dm-spl; + compatible = "jedec,spi-nor"; + label = "sfc_nor"; + reg = <0>; + spi-tx-bus-width = <1>; + spi-rx-bus-width = <4>; + spi-max-frequency = <100000000>; + }; +}; + +&sdhci { + bus-width = <8>; + u-boot,dm-spl; + /delete-property/ assigned-clocks; + /delete-property/ assigned-clock-rates; + /delete-property/ pinctrl-names; + /delete-property/ pinctrl-0; + mmc-hs400-1_8v; + mmc-hs400-enhanced-strobe; + fixed-emmc-driver-type = <1>; + status = "okay"; +}; + +&sdmmc { + u-boot,dm-spl; + status = "okay"; +}; + +&saradc { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&u2phy_otg { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&usb2phy { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&firmware { + u-boot,dm-spl; +}; + +&scmi { + u-boot,dm-spl; +}; + +&scmi_clk { + u-boot,dm-spl; +}; + +&scmi_shmem { + u-boot,dm-spl; +}; + +&pinctrl { + u-boot,dm-spl; + status = "okay"; +}; + +&gpio0 { + u-boot,dm-spl; +}; + +&gpio1 { + u-boot,dm-spl; +}; + +&gpio2 { + u-boot,dm-spl; +}; + +&pcfg_pull_none_drv_level_1 { + u-boot,dm-spl; +}; + +&pcfg_pull_none_drv_level_2 { + u-boot,dm-spl; +}; + +&pcfg_pull_up_drv_level_1 { + u-boot,dm-spl; +}; + +&pcfg_pull_up_drv_level_2 { + u-boot,dm-spl; +}; + +&pcfg_pull_up { + u-boot,dm-spl; +}; + +&pcfg_pull_none { + u-boot,dm-spl; +}; + +&sdmmc_pins { + u-boot,dm-spl; +}; + +&sdmmc_bus4 { + u-boot,dm-spl; +}; + +&sdmmc_clk { + u-boot,dm-spl; +}; + +&sdmmc_cmd { + u-boot,dm-spl; +}; + +&sdmmc_det { + u-boot,dm-spl; +}; diff --git a/u-boot/arch/arm/dts/rk3528.dtsi b/u-boot/arch/arm/dts/rk3528.dtsi new file mode 100644 index 0000000..3177904 --- /dev/null +++ b/u-boot/arch/arm/dts/rk3528.dtsi @@ -0,0 +1,2184 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ + +#include <dt-bindings/clock/rk3528-cru.h> +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/interrupt-controller/arm-gic.h> +#include <dt-bindings/interrupt-controller/irq.h> +#include <dt-bindings/phy/phy.h> +#include <dt-bindings/pinctrl/rockchip.h> +#include <dt-bindings/power/rk3528-power.h> +#include <dt-bindings/soc/rockchip,boot-mode.h> +#include <dt-bindings/soc/rockchip-system-status.h> +#include <dt-bindings/suspend/rockchip-rk3528.h> +#include <dt-bindings/thermal/thermal.h> +#include <dt-bindings/display/rockchip-tve.h> + +/ { + compatible = "rockchip,rk3528"; + + interrupt-parent = <&gic>; + #address-cells = <2>; + #size-cells = <2>; + + aliases { + ethernet0 = &gmac0; + ethernet1 = &gmac1; + gpio0 = &gpio0; + gpio1 = &gpio1; + gpio2 = &gpio2; + gpio3 = &gpio3; + gpio4 = &gpio4; + i2c0 = &i2c0; + i2c1 = &i2c1; + i2c2 = &i2c2; + i2c3 = &i2c3; + i2c4 = &i2c4; + i2c5 = &i2c5; + i2c6 = &i2c6; + i2c7 = &i2c7; + serial0 = &uart0; + serial1 = &uart1; + serial2 = &uart2; + serial3 = &uart3; + serial4 = &uart4; + serial5 = &uart5; + serial6 = &uart6; + serial7 = &uart7; + spi0 = &spi0; + spi1 = &spi1; + spi2 = &sfc; + }; + + cpus { + #address-cells = <2>; + #size-cells = <0>; + + cpu-map { + cluster0 { + core0 { + cpu = <&cpu0>; + }; + core1 { + cpu = <&cpu1>; + }; + core2 { + cpu = <&cpu2>; + }; + core3 { + cpu = <&cpu3>; + }; + }; + }; + + cpu0: cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a53"; + reg = <0x0 0x0>; + enable-method = "psci"; + clocks = <&scmi_clk SCMI_CLK_CPU>; + operating-points-v2 = <&cpu0_opp_table>; + cpu-idle-states = <&CPU_SLEEP0>; + }; + + cpu1: cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a53"; + reg = <0x0 0x1>; + enable-method = "psci"; + clocks = <&scmi_clk SCMI_CLK_CPU>; + operating-points-v2 = <&cpu0_opp_table>; + cpu-idle-states = <&CPU_SLEEP0>; + }; + + cpu2: cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a53"; + reg = <0x0 0x2>; + enable-method = "psci"; + clocks = <&scmi_clk SCMI_CLK_CPU>; + operating-points-v2 = <&cpu0_opp_table>; + cpu-idle-states = <&CPU_SLEEP1>; + }; + + cpu3: cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a53"; + reg = <0x0 0x3>; + enable-method = "psci"; + clocks = <&scmi_clk SCMI_CLK_CPU>; + operating-points-v2 = <&cpu0_opp_table>; + cpu-idle-states = <&CPU_SLEEP1>; + }; + + idle-states { + entry-method = "psci"; + + CPU_SLEEP0: cpu-sleep0 { + compatible = "arm,idle-state"; + local-timer-stop; + arm,psci-suspend-param = <0x0010000>; + entry-latency-us = <120>; + exit-latency-us = <250>; + min-residency-us = <900>; + status = "disabled"; + }; + + CPU_SLEEP1: cpu-sleep { + compatible = "arm,idle-state"; + local-timer-stop; + arm,psci-suspend-param = <0x0010000>; + entry-latency-us = <120>; + exit-latency-us = <250>; + min-residency-us = <900>; + status = "okay"; + }; + }; + }; + + cpu0_opp_table: cpu0-opp-table { + compatible = "operating-points-v2"; + opp-shared; + + nvmem-cells = <&cpu_leakage>; + nvmem-cell-names = "leakage"; + + rockchip,pvtm-voltage-sel = < + 0 1310 0 + 1311 1340 1 + 1341 1370 2 + 1371 1400 3 + 1401 1430 4 + 1431 1460 5 + 1461 9999 6 + >; + rockchip,pvtm-pvtpll; + rockchip,pvtm-offset = <0x18>; + rockchip,pvtm-sample-time = <1100>; + rockchip,pvtm-freq = <1416000>; + rockchip,pvtm-volt = <900000>; + rockchip,pvtm-ref-temp = <40>; + rockchip,pvtm-temp-prop = <0 0>; + rockchip,pvtm-thermal-zone = "soc-thermal"; + rockchip,grf = <&grf>; + + opp-408000000 { + opp-hz = /bits/ 64 <408000000>; + opp-microvolt = <825000 825000 1100000>; + clock-latency-ns = <40000>; + opp-suspend; + }; + opp-600000000 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <825000 825000 1100000>; + clock-latency-ns = <40000>; + }; + opp-816000000 { + opp-hz = /bits/ 64 <816000000>; + opp-microvolt = <825000 825000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1008000000 { + opp-hz = /bits/ 64 <1008000000>; + opp-microvolt = <825000 825000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1200000000 { + opp-hz = /bits/ 64 <1200000000>; + opp-microvolt = <875000 875000 1100000>; + opp-microvolt-L1 = <862500 862500 1100000>; + opp-microvolt-L2 = <850000 850000 1100000>; + opp-microvolt-L3 = <837500 837500 1100000>; + opp-microvolt-L4 = <837500 837500 1100000>; + opp-microvolt-L5 = <837500 837500 1100000>; + opp-microvolt-L6 = <825000 825000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1416000000 { + opp-hz = /bits/ 64 <1416000000>; + opp-microvolt = <937500 937500 1100000>; + opp-microvolt-L1 = <925000 925000 1100000>; + opp-microvolt-L2 = <912500 912500 1100000>; + opp-microvolt-L3 = <900000 900000 1100000>; + opp-microvolt-L4 = <900000 900000 1100000>; + opp-microvolt-L5 = <900000 900000 1100000>; + opp-microvolt-L6 = <887500 887500 1100000>; + clock-latency-ns = <40000>; + }; + opp-1608000000 { + opp-hz = /bits/ 64 <1608000000>; + opp-microvolt = <1012500 1012500 1100000>; + opp-microvolt-L1 = <1000000 1000000 1100000>; + opp-microvolt-L2 = <987500 987500 1100000>; + opp-microvolt-L3 = <975000 975000 1100000>; + opp-microvolt-L4 = <962500 962500 1100000>; + opp-microvolt-L5 = <950000 950000 1100000>; + opp-microvolt-L6 = <937500 937500 1100000>; + clock-latency-ns = <40000>; + }; + opp-1800000000 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <1062500 1062500 1100000>; + opp-microvolt-L1 = <1050000 1050000 1100000>; + opp-microvolt-L2 = <1037500 1037500 1100000>; + opp-microvolt-L3 = <1025000 1025000 1100000>; + opp-microvolt-L4 = <1012500 1012500 1100000>; + opp-microvolt-L5 = <1000000 1000000 1100000>; + opp-microvolt-L6 = <987500 987500 1100000>; + clock-latency-ns = <40000>; + }; + opp-2016000000 { + opp-hz = /bits/ 64 <2016000000>; + opp-microvolt = <1100000 1100000 1100000>; + opp-microvolt-L1 = <1087500 1087500 1100000>; + opp-microvolt-L2 = <1075000 1075000 1100000>; + opp-microvolt-L3 = <1062500 1062500 1100000>; + opp-microvolt-L4 = <1050000 1050000 1100000>; + opp-microvolt-L5 = <1037500 1037500 1100000>; + opp-microvolt-L6 = <1025000 1025000 1100000>; + clock-latency-ns = <40000>; + }; + }; + + arm-pmu { + compatible = "arm,cortex-a53-pmu"; + interrupts = <GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>; + interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; + }; + + cpuinfo { + compatible = "rockchip,cpuinfo"; + nvmem-cells = <&otp_id>, <&otp_cpu_version>, <&cpu_code>; + nvmem-cell-names = "id", "cpu-version", "cpu-code"; + }; + + display_subsystem: display-subsystem { + compatible = "rockchip,display-subsystem"; + ports = <&vop_out>; + status = "disabled"; + }; + + firmware: firmware { + scmi: scmi { + compatible = "arm,scmi-smc"; + shmem = <&scmi_shmem>; + arm,smc-id = <0x82000010>; + #address-cells = <1>; + #size-cells = <0>; + + scmi_clk: protocol@14 { + reg = <0x14>; + #clock-cells = <1>; + }; + }; + }; + + mpp_srv: mpp-srv { + compatible = "rockchip,mpp-service"; + rockchip,taskqueue-count = <5>; + rockchip,resetgroup-count = <5>; + status = "disabled"; + }; + + psci: psci { + compatible = "arm,psci-1.0"; + method = "smc"; + }; + + rockchip_suspend: rockchip-suspend { + compatible = "rockchip,pm-rk3528"; + status = "disabled"; + rockchip,sleep-debug-en = <0>; + rockchip,sleep-mode-config = < + (0 + | RKPM_SLP_ARMPD + ) + >; + rockchip,wakeup-config = < + (0 + | RKPM_CPU0_WKUP_EN + | RKPM_GPIO_WKUP_EN + ) + >; + }; + + rockchip_system_monitor: rockchip-system-monitor { + compatible = "rockchip,system-monitor"; + + rockchip,thermal-zone = "soc-thermal"; + }; + + thermal_zones: thermal-zones { + soc_thermal: soc-thermal { + polling-delay-passive = <20>; /* milliseconds */ + polling-delay = <1000>; /* milliseconds */ + + thermal-sensors = <&tsadc 0>; + trips { + soc_crit: soc-crit { + /* millicelsius */ + temperature = <115000>; + /* millicelsius */ + hysteresis = <2000>; + type = "critical"; + }; + }; + }; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; + }; + + xin24m: xin24m { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <24000000>; + clock-output-names = "xin24m"; + }; + + scmi_shmem: scmi-shmem@10f000 { + compatible = "arm,scmi-shmem"; + reg = <0x0 0x0010f000 0x0 0x100>; + }; + + pcie2x1: pcie@fe4f0000 { + compatible = "rockchip,rk3528-pcie", "snps,dw-pcie"; + #address-cells = <3>; + #size-cells = <2>; + bus-range = <0x0 0xff>; + clocks = <&cru ACLK_PCIE>, <&cru HCLK_PCIE_SLV>, + <&cru HCLK_PCIE_DBI>, <&cru PCLK_CRU_PCIE>, + <&cru CLK_PCIE_AUX>, <&cru PCLK_PCIE>, + <&cru PCLK_PCIE_PHY>; + clock-names = "aclk", "hclk_slv", + "hclk_dbi", "pclk_cru", + "aux", "pclk", + "pipe"; + device_type = "pci"; + interrupts = <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "msi", "pmc", "sys", "legacy", "msg", "err"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0 0 0 1 &pcie2x1_intc 0>, + <0 0 0 2 &pcie2x1_intc 1>, + <0 0 0 3 &pcie2x1_intc 2>, + <0 0 0 4 &pcie2x1_intc 3>; + linux,pci-domain = <0>; + num-ib-windows = <8>; + num-ob-windows = <8>; + num-viewport = <4>; + max-link-speed = <2>; + num-lanes = <1>; + phys = <&combphy_pu PHY_TYPE_PCIE>; + phy-names = "pcie-phy"; + ranges = <0x00000800 0x0 0xfc000000 0x0 0xfc000000 0x0 0x100000 + 0x81000000 0x0 0xfc100000 0x0 0xfc100000 0x0 0x100000 + 0x82000000 0x0 0xfc200000 0x0 0xfc200000 0x0 0x1e00000 + 0xc3000000 0x1 0x00000000 0x1 0x00000000 0x0 0x40000000>; + reg = <0x0 0xfe4f0000 0x0 0x10000>, + <0x1 0x40000000 0x0 0x400000>; + reg-names = "pcie-apb", "pcie-dbi"; + resets = <&cru SRST_RESETN_PCIE_POWER_UP>, <&cru SRST_PRESETN_PCIE>, + <&cru SRST_PRESETN_CRU_PCIE>; + reset-names = "pcie", "periph", "preset_cru"; + status = "disabled"; + + pcie2x1_intc: legacy-interrupt-controller { + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <1>; + interrupt-parent = <&gic>; + interrupts = <GIC_SPI 155 IRQ_TYPE_EDGE_RISING>; + }; + }; + + usbdrd30: usbdrd { + compatible = "rockchip,rk3528-dwc3", "rockchip,rk3399-dwc3"; + clocks = <&cru CLK_REF_USB3OTG>, <&cru CLK_SUSPEND_USB3OTG>, + <&cru ACLK_USB3OTG>; + clock-names = "ref_clk", "suspend_clk", + "bus_clk"; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + usbdrd_dwc3: dwc3@fe500000 { + compatible = "snps,dwc3"; + reg = <0x0 0xfe500000 0x0 0x400000>; + interrupts = <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>; + dr_mode = "otg"; + phys = <&u2phy_otg>, <&combphy_pu PHY_TYPE_USB3>; + phy-names = "usb2-phy", "usb3-phy"; + phy_type = "utmi_wide"; + resets = <&cru SRST_ARESETN_USB3OTG>; + reset-names = "usb3-otg"; + snps,dis_enblslpm_quirk; + snps,dis-u1u2-quirk; + snps,dis-u2-freeclk-exists-quirk; + snps,dis-del-phy-power-chg-quirk; + snps,dis-tx-ipgap-linecheck-quirk; + snps,xhci-trb-ent-quirk; + snps,dis_rxdet_inp3_quirk; + quirk-skip-phy-init; + status = "disabled"; + }; + }; + + gic: interrupt-controller@fed01000 { + compatible = "arm,gic-400"; + #interrupt-cells = <3>; + #address-cells = <0>; + interrupt-controller; + reg = <0x0 0xfed01000 0 0x1000>, + <0x0 0xfed02000 0 0x2000>, + <0x0 0xfed04000 0 0x2000>, + <0x0 0xfed06000 0 0x2000>; + interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; + }; + + usb_host0_ehci: usb@ff100000 { + compatible = "generic-ehci"; + reg = <0x0 0xff100000 0x0 0x40000>; + interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru HCLK_USBHOST>, + <&cru HCLK_USBHOST_ARB>, + <&usb2phy>; + clock-names = "usbhost", "arbiter", "utmi"; + phys = <&u2phy_host>; + phy-names = "usb2-phy"; + status = "disabled"; + }; + + usb_host0_ohci: usb@ff140000 { + compatible = "generic-ohci"; + reg = <0x0 0xff140000 0x0 0x40000>; + interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru HCLK_USBHOST>, + <&cru HCLK_USBHOST_ARB>, + <&usb2phy>; + clock-names = "usbhost", "arbiter", "utmi"; + phys = <&u2phy_host>; + phy-names = "usb2-phy"; + status = "disabled"; + }; + + debug: debug@ff190000 { + compatible = "rockchip,debug"; + reg = <0x0 0xff190000 0x0 0x1000>, + <0x0 0xff192000 0x0 0x1000>, + <0x0 0xff194000 0x0 0x1000>, + <0x0 0xff196000 0x0 0x1000>; + }; + + qos_crypto_a: qos@ff200000 { + compatible = "syscon"; + reg = <0x0 0xff200000 0x0 0x20>; + }; + + qos_crypto_p: qos@ff200080 { + compatible = "syscon"; + reg = <0x0 0xff200080 0x0 0x20>; + }; + + qos_dcf: qos@ff200100 { + compatible = "syscon"; + reg = <0x0 0xff200100 0x0 0x20>; + }; + + qos_dft2apb: qos@ff200200 { + compatible = "syscon"; + reg = <0x0 0xff200200 0x0 0x20>; + }; + + qos_dma2ddr: qos@ff200280 { + compatible = "syscon"; + reg = <0x0 0xff200280 0x0 0x20>; + }; + + qos_dmac: qos@ff200300 { + compatible = "syscon"; + reg = <0x0 0xff200300 0x0 0x20>; + }; + + qos_keyreader: qos@ff200380 { + compatible = "syscon"; + reg = <0x0 0xff200380 0x0 0x20>; + }; + + qos_cpu: qos@ff210000 { + compatible = "syscon"; + reg = <0x0 0xff210000 0x0 0x20>; + }; + + qos_debug: qos@ff210080 { + compatible = "syscon"; + reg = <0x0 0xff210080 0x0 0x20>; + }; + + qos_gpu_m0: qos@ff220000 { + compatible = "syscon"; + reg = <0x0 0xff220000 0x0 0x20>; + }; + + qos_gpu_m1: qos@ff220080 { + compatible = "syscon"; + reg = <0x0 0xff220080 0x0 0x20>; + }; + + qos_pmu_mcu: qos@ff240000 { + compatible = "syscon"; + reg = <0x0 0xff240000 0x0 0x20>; + }; + + qos_rkvdec: qos@ff250000 { + compatible = "syscon"; + reg = <0x0 0xff250000 0x0 0x20>; + }; + + qos_rkvenc: qos@ff260000 { + compatible = "syscon"; + reg = <0x0 0xff260000 0x0 0x20>; + }; + + qos_gmac0: qos@ff270000 { + compatible = "syscon"; + reg = <0x0 0xff270000 0x0 0x20>; + }; + + qos_hdcp: qos@ff270080 { + compatible = "syscon"; + reg = <0x0 0xff270080 0x0 0x20>; + }; + + qos_jpegdec: qos@ff270100 { + compatible = "syscon"; + reg = <0x0 0xff270100 0x0 0x20>; + }; + + qos_rga2_m0ro: qos@ff270200 { + compatible = "syscon"; + reg = <0x0 0xff270200 0x0 0x20>; + }; + + qos_rga2_m0wo: qos@ff270280 { + compatible = "syscon"; + reg = <0x0 0xff270280 0x0 0x20>; + }; + + qos_sdmmc0: qos@ff270300 { + compatible = "syscon"; + reg = <0x0 0xff270300 0x0 0x20>; + }; + + qos_usb2host: qos@ff270380 { + compatible = "syscon"; + reg = <0x0 0xff270380 0x0 0x20>; + }; + + qos_vdpp: qos@ff270480 { + compatible = "syscon"; + reg = <0x0 0xff270480 0x0 0x20>; + }; + + qos_vop: qos@ff270500 { + compatible = "syscon"; + reg = <0x0 0xff270500 0x0 0x20>; + }; + + qos_emmc: qos@ff280000 { + compatible = "syscon"; + reg = <0x0 0xff280000 0x0 0x20>; + }; + + qos_fspi: qos@ff280080 { + compatible = "syscon"; + reg = <0x0 0xff280080 0x0 0x20>; + }; + + qos_gmac1: qos@ff280100 { + compatible = "syscon"; + reg = <0x0 0xff280100 0x0 0x20>; + }; + + qos_pcie: qos@ff280180 { + compatible = "syscon"; + reg = <0x0 0xff280180 0x0 0x20>; + }; + + qos_sdio0: qos@ff280200 { + compatible = "syscon"; + reg = <0x0 0xff280200 0x0 0x20>; + }; + + qos_sdio1: qos@ff280280 { + compatible = "syscon"; + reg = <0x0 0xff280280 0x0 0x20>; + }; + + qos_tsp: qos@ff280300 { + compatible = "syscon"; + reg = <0x0 0xff280300 0x0 0x20>; + }; + + qos_usb3otg: qos@ff280380 { + compatible = "syscon"; + reg = <0x0 0xff280380 0x0 0x20>; + }; + + qos_vpu: qos@ff280400 { + compatible = "syscon"; + reg = <0x0 0xff280400 0x0 0x20>; + }; + + /* + * Merge all GRF, each independent GRF offset is shown as bellow: + * CORE_GRF: 0xff300000 + * GPU_GRF: 0xff310000 + * RKVENC_GRF: 0xff320000 + * DDR_GRF: 0xff330000 + * VPU_GRF: 0xff340000 + * COMBO_PIPE_PHY_GRF: 0xff348000 + * RKVDEC_GRF: 0xff350000 + * VO_GRF: 0xff360000 + * PMU_GRF: 0xff370000 + * SYS_GRF: 0xff380000 + */ + grf: syscon@ff300000 { + compatible = "rockchip,rk3528-grf", "syscon", "simple-mfd"; + reg = <0x0 0xff300000 0x0 0x90000>; + + grf_cru: grf-clock-controller { + compatible = "rockchip,rk3528-grf-cru"; + #clock-cells = <1>; + }; + + reboot_mode: reboot-mode { + compatible = "syscon-reboot-mode"; + offset = <0x70200>; + mode-bootloader = <BOOT_BL_DOWNLOAD>; + mode-charge = <BOOT_CHARGING>; + mode-fastboot = <BOOT_FASTBOOT>; + mode-loader = <BOOT_BL_DOWNLOAD>; + mode-normal = <BOOT_NORMAL>; + mode-recovery = <BOOT_RECOVERY>; + mode-ums = <BOOT_UMS>; + mode-panic = <BOOT_PANIC>; + mode-watchdog = <BOOT_WATCHDOG>; + }; + }; + + cru: clock-controller@ff4a0000 { + compatible = "rockchip,rk3528-cru"; + reg = <0x0 0xff4a0000 0x0 0x30000>; + rockchip,grf = <&grf>; + #clock-cells = <1>; + #reset-cells = <1>; + + assigned-clocks = + <&cru XIN_OSC0_DIV>, + <&cru PLL_GPLL>, + <&cru PLL_PPLL>, + <&cru PLL_CPLL>, + <&cru ARMCLK>, + <&cru CLK_MATRIX_250M_SRC>, + <&cru CLK_MATRIX_500M_SRC>, + <&cru CLK_MATRIX_50M_SRC>, + <&cru CLK_MATRIX_100M_SRC>, + <&cru CLK_MATRIX_150M_SRC>, + <&cru CLK_MATRIX_200M_SRC>, + <&cru CLK_MATRIX_300M_SRC>, + <&cru CLK_MATRIX_339M_SRC>, + <&cru CLK_MATRIX_400M_SRC>, + <&cru CLK_MATRIX_600M_SRC>, + <&cru CLK_PPLL_50M_MATRIX>, + <&cru CLK_PPLL_100M_MATRIX>, + <&cru CLK_PPLL_125M_MATRIX>, + <&cru ACLK_BUS_VOPGL_ROOT>; + + assigned-clock-rates = + <32768>, + <1188000000>, + <1000000000>, + <996000000>, + <408000000>, + <250000000>, + <500000000>, + <50000000>, + <100000000>, + <150000000>, + <200000000>, + <300000000>, + <340000000>, + <400000000>, + <600000000>, + <50000000>, + <100000000>, + <125000000>, + <500000000>; + }; + + ioc_grf: syscon@ff540000 { + compatible = "rockchip,rk3528-ioc-grf", "syscon"; + reg = <0x0 0xff540000 0x0 0x40000>; + }; + + pmu: power-management@ff600000 { + compatible = "rockchip,rk3528-pmu", "syscon", "simple-mfd"; + reg = <0x0 0xff600000 0x0 0x2000>; + + power: power-controller { + compatible = "rockchip,rk3528-power-controller"; + #power-domain-cells = <1>; + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + /* These power domains are grouped by VD_GPU */ + pd_gpu@RK3528_PD_GPU { + reg = <RK3528_PD_GPU>; + clocks = <&cru ACLK_GPU_MALI>, + <&cru PCLK_GPU_ROOT>; + pm_qos = <&qos_gpu_m0>, + <&qos_gpu_m1>; + }; + /* These power domains are grouped by VD_LOGIC */ + pd_rkvdec@RK3528_PD_RKVDEC { + reg = <RK3528_PD_RKVDEC>; + }; + pd_rkvenc@RK3528_PD_RKVENC { + reg = <RK3528_PD_RKVENC>; + }; + pd_vo@RK3528_PD_VO { + reg = <RK3528_PD_VO>; + }; + pd_vpu@RK3528_PD_VPU { + reg = <RK3528_PD_VPU>; + }; + }; + }; + + mailbox: mailbox@ff630000 { + compatible = "rockchip,rk3528-mailbox", + "rockchip,rk3368-mailbox"; + reg = <0x0 0xff630000 0x0 0x200>; + interrupts = <GIC_SPI 60 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_PMU_MAILBOX>; + clock-names = "pclk_mailbox"; + #mbox-cells = <1>; + status = "disabled"; + }; + + gpu: gpu@ff700000 { + compatible = "arm,mali-450"; + reg = <0x0 0xff700000 0x0 0x40000>; + + interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "Mali_GP_IRQ", + "Mali_GP_MMU_IRQ", + "IRQPP", + "Mali_PP0_IRQ", + "Mali_PP0_MMU_IRQ", + "Mali_PP1_IRQ", + "Mali_PP1_MMU_IRQ"; + clocks = <&scmi_clk SCMI_CLK_GPU>, <&cru ACLK_GPU_MALI>, + <&cru PCLK_GPU_ROOT>; + clock-names = "clk_mali", "aclk_gpu_mali", "pclk_gpu"; + assigned-clocks = <&scmi_clk SCMI_CLK_GPU>; + assigned-clock-rates = <300000000>; + power-domains = <&power RK3528_PD_GPU>; + operating-points-v2 = <&gpu_opp_table>; + status = "disabled"; + + gpu_power_model: power_model { + compatible = "arm,mali-simple-power-model"; + voltage = <900>; + frequency = <500>; + static-power = <300>; + dynamic-power = <396>; + ts = <32000 4700 (-80) 2>; + thermal-zone = "soc-thermal"; + }; + }; + + gpu_opp_table: gpu-opp-table { + compatible = "operating-points-v2"; + + nvmem-cells = <&gpu_leakage>; + nvmem-cell-names = "leakage"; + + rockchip,pvtm-voltage-sel = < + 0 820 0 + 821 840 1 + 841 860 2 + 861 880 3 + 881 900 4 + 901 9999 5 + >; + rockchip,pvtm-pvtpll; + rockchip,pvtm-offset = <0x10018>; + rockchip,pvtm-sample-time = <1100>; + rockchip,pvtm-freq = <700000>; + rockchip,pvtm-volt = <900000>; + rockchip,pvtm-ref-temp = <40>; + rockchip,pvtm-temp-prop = <0 0>; + rockchip,pvtm-thermal-zone = "soc-thermal"; + rockchip,grf = <&grf>; + + opp-300000000 { + opp-hz = /bits/ 64 <300000000>; + opp-microvolt = <825000 825000 1000000>; + }; + opp-500000000 { + opp-hz = /bits/ 64 <500000000>; + opp-microvolt = <825000 825000 1000000>; + }; + opp-600000000 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <825000 825000 1000000>; + }; + opp-700000000 { + opp-hz = /bits/ 64 <700000000>; + opp-microvolt = <825000 825000 1000000>; + opp-microvolt-L0 = <850000 850000 1000000>; + opp-microvolt-L1 = <837500 837500 1000000>; + clock-latency-ns = <40000>; + }; + opp-800000000 { + opp-hz = /bits/ 64 <800000000>; + opp-microvolt = <900000 900000 1000000>; + opp-microvolt-L1 = <887500 887500 1000000>; + opp-microvolt-L2 = <875000 875000 1000000>; + opp-microvolt-L3 = <862500 862500 1000000>; + opp-microvolt-L4 = <850000 850000 1000000>; + opp-microvolt-L5 = <837500 837500 1000000>; + clock-latency-ns = <40000>; + }; + }; + + rkvdec: rkvdec@ff740100 { + compatible = "rockchip,rkv-decoder-v2"; + reg = <0x0 0xff740100 0x0 0x400>, <0x0 0xff740000 0x0 0x100>; + reg-names = "regs", "link"; + interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "irq_dec"; + clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, <&cru CLK_HEVC_CA_RKVDEC>; + clock-names = "aclk_vcodec", "hclk_vcodec","clk_hevc_cabac"; + rockchip,normal-rates = <340000000>, <0>, <600000000>; + assigned-clocks = <&cru ACLK_RKVDEC>, <&cru CLK_HEVC_CA_RKVDEC>; + assigned-clock-rates = <340000000>, <600000000>; + resets = <&cru SRST_ARESETN_RKVDEC>, <&cru SRST_HRESETN_RKVDEC>, + <&cru SRST_RESETN_HEVC_CA_RKVDEC>; + reset-names = "video_a", "video_h", "video_hevc_cabac"; + power-domains = <&power RK3528_PD_RKVDEC>; + iommus = <&rkvdec_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <0>; + rockchip,resetgroup-node = <0>; + rockchip,task-capacity = <16>; + status = "disabled"; + }; + + rkvdec_mmu: iommu@ff740800 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff740800 0x0 0x40>, <0x0 0xff740900 0x0 0x40>; + interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rkvdec_mmu"; + clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, <&cru CLK_HEVC_CA_RKVDEC>; + clock-names = "aclk", "iface", "clk_hevc_cabac"; + power-domains = <&power RK3528_PD_RKVDEC>; + #iommu-cells = <0>; + status = "disabled"; + }; + + rkvenc: rkvenc@ff780000 { + compatible = "rockchip,rkv-encoder-v2"; + reg = <0x0 0xff780000 0x0 0x6000>; + interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "irq_rkvenc"; + clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>, <&cru CLK_CORE_RKVENC>; + clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core"; + rockchip,normal-rates = <300000000>, <0>, <300000000>; + resets = <&cru SRST_ARESETN_RKVENC>, <&cru SRST_HRESETN_RKVENC>, + <&cru SRST_RESETN_CORE_RKVENC>; + reset-names = "video_a", "video_h", "video_core"; + assigned-clocks = <&cru ACLK_RKVENC>, <&cru CLK_CORE_RKVENC>; + assigned-clock-rates = <300000000>, <300000000>; + power-domains = <&power RK3528_PD_RKVENC>; + iommus = <&rkvenc_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <1>; + rockchip,resetgroup-node = <1>; + status = "disabled"; + }; + + rkvenc_mmu: iommu@ff78f000 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff78f000 0x0 0x40>; + interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rkvenc_mmu"; + clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>; + clock-names = "aclk", "iface"; + power-domains = <&power RK3528_PD_RKVENC>; + #iommu-cells = <0>; + status = "disabled"; + }; + + vdpu: vdpu@ff7c0400 { + compatible = "rockchip,vpu-decoder-v2"; + reg = <0x0 0xff7c0400 0x0 0x400>; + interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "irq_dec"; + clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>; + clock-names = "aclk_vcodec", "hclk_vcodec"; + resets = <&cru SRST_ARESETN_VPU>, <&cru SRST_HRESETN_VPU>; + reset-names = "shared_video_a", "shared_video_h"; + power-domains = <&power RK3528_PD_VPU>; + iommus = <&vdpu_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <2>; + rockchip,resetgroup-node = <2>; + status = "disabled"; + }; + + vdpu_mmu: iommu@ff7c0800 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff7c0800 0x0 0x40>; + interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "vdpu_mmu"; + clock-names = "aclk", "iface"; + clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>; + power-domains = <&power RK3528_PD_VPU>; + #iommu-cells = <0>; + status = "disabled"; + }; + + avsd: avsd_plus@ff7c1000 { + compatible = "rockchip,avs-plus-decoder"; + reg = <0x0 0xff7c1000 0x0 0x200>; + interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "irq_dec"; + clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>; + clock-names = "aclk_vcodec", "hclk_vcodec"; + resets = <&cru SRST_ARESETN_VPU>, <&cru SRST_HRESETN_VPU>; + reset-names = "shared_video_a", "shared_video_h"; + iommus = <&vdpu_mmu>; + power-domains = <&power RK3528_PD_VPU>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <2>; + rockchip,resetgroup-node = <2>; + status = "disabled"; + }; + + vop: vop@ff840000 { + compatible = "rockchip,rk3528-vop"; + reg = <0x0 0xff840000 0x0 0x3000>, + <0x0 0xff845000 0x0 0x1000>, + <0x0 0xff846400 0x0 0x800>; + reg-names = "regs", + "gamma_lut", + "acm_regs"; + interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_VOP>, + <&cru HCLK_VOP>, + <&cru DCLK_VOP0>, + <&cru DCLK_VOP1>; + clock-names = "aclk_vop", + "hclk_vop", + "dclk_vp0", + "dclk_vp1"; + assigned-clocks = <&cru DCLK_VOP0>; + assigned-clock-parents = <&hdmiphy>; + iommus = <&vop_mmu>; + rockchip,grf = <&grf>; + status = "disabled"; + + vop_out: ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + #address-cells = <1>; + #size-cells = <0>; + reg = <0>; + + vp0_out_hdmi: endpoint@0 { + reg = <0>; + remote-endpoint = <&hdmi_in_vp0>; + }; + }; + + port@1 { + #address-cells = <1>; + #size-cells = <0>; + reg = <1>; + + vp1_out_tve: endpoint@0 { + reg = <0>; + remote-endpoint = <&tve_in_vp1>; + }; + }; + }; + }; + + vop_mmu: iommu@ff847e00 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff847e00 0x0 0x100>; + interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "vop_mmu"; + clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; + rockchip,disable-device-link-resume; + rockchip,shootdown-entire; + status = "disabled"; + }; + + rga2: rga@ff850000 { + compatible = "rockchip,rga2_core0"; + reg = <0x0 0xff850000 0x0 0x1000>; + interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rga2_irq"; + clocks = <&cru ACLK_RGA2E>, <&cru HCLK_RGA2E>, <&cru CLK_CORE_RGA2E>; + clock-names = "aclk_rga2", "hclk_rga2", "clk_rga2"; + iommus = <&rga2_mmu>; + status = "disabled"; + }; + + rga2_mmu: iommu@ff850f00 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff850f00 0x0 0x100>; + interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rga2_mmu"; + clocks = <&cru ACLK_RGA2E>, <&cru HCLK_RGA2E>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; + status = "disabled"; + }; + + iep: iep@ff860000 { + compatible = "rockchip,iep-v2"; + reg = <0x0 0xff860000 0x0 0x500>; + interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_VDPP>, <&cru HCLK_VDPP>, <&cru CLK_CORE_VDPP>; + clock-names = "aclk", "hclk", "sclk"; + rockchip,normal-rates = <340000000>, <0>, <340000000>; + assigned-clocks = <&cru ACLK_VDPP>, <&cru CLK_CORE_VDPP>; + assigned-clock-rates = <340000000>, <340000000>; + resets = <&cru SRST_ARESETN_VDPP>, <&cru SRST_HRESETN_VDPP>, + <&cru SRST_RESETN_CORE_VDPP>; + reset-names = "shared_rst_a", "shared_rst_h", "shared_rst_s"; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <3>; + rockchip,resetgroup-node = <3>; + power-domains = <&power RK3528_PD_VO>; + iommus = <&iep_mmu>; + status = "disabled"; + }; + + iep_mmu: iommu@ff860800 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff860800 0x0 0x100>; + interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "iep_mmu"; + clocks = <&cru ACLK_VDPP>, <&cru HCLK_VDPP>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; + power-domains = <&power RK3528_PD_VO>; + status = "disabled"; + }; + + vdpp: vdpp@ff861000 { + compatible = "rockchip,vdpp-v1"; + reg = <0x0 0xff861000 0x0 0x100>, <0x0 0xff862000 0x0 0x900>; + reg-names = "vdpp_regs", "zme_regs"; + interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_VDPP>, <&cru HCLK_VDPP>, <&cru CLK_CORE_VDPP>; + clock-names = "aclk", "hclk", "sclk"; + rockchip,normal-rates = <340000000>, <0>, <340000000>; + assigned-clocks = <&cru ACLK_VDPP>, <&cru CLK_CORE_VDPP>; + assigned-clock-rates = <340000000>, <340000000>; + resets = <&cru SRST_ARESETN_VDPP>, <&cru SRST_HRESETN_VDPP>, + <&cru SRST_RESETN_CORE_VDPP>; + reset-names = "shared_rst_a", "shared_rst_h", "shared_rst_s"; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <3>; + rockchip,resetgroup-node = <3>; + power-domains = <&power RK3528_PD_VO>; + iommus = <&iep_mmu>; + status = "disabled"; + }; + + jpegd: jpegd@ff870000 { + compatible = "rockchip,rkv-jpeg-decoder-v1"; + reg = <0x0 0xff870000 0x0 0x400>; + interrupts = <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_JPEG_DECODER>, <&cru HCLK_JPEG_DECODER>; + clock-names = "aclk_vcodec", "hclk_vcodec"; + rockchip,disable-auto-freq; + resets = <&cru SRST_ARESETN_JPEG_DECODER>, <&cru SRST_HRESETN_JPEG_DECODER>; + reset-names = "video_a", "video_h"; + power-domains = <&power RK3528_PD_VO>; + iommus = <&jpegd_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <4>; + rockchip,resetgroup-node = <4>; + status = "disabled"; + }; + + jpegd_mmu: iommu@ff870480 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff870480 0x0 0x40>; + interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "jpegd_mmu"; + clock-names = "aclk", "iface"; + clocks = <&cru ACLK_JPEG_DECODER>, <&cru HCLK_JPEG_DECODER>; + power-domains = <&power RK3528_PD_VO>; + #iommu-cells = <0>; + status = "disabled"; + }; + + tve: tve@ff880000 { + compatible = "rockchip,rk3528-tve"; + reg = <0x0 0xff880000 0x0 0x4000>, + <0x0 0xffde0000 0x0 0x300>; + interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru HCLK_CVBS>, + <&cru PCLK_VCDCPHY>, + <&cru DCLK_CVBS>, + <&cru DCLK_4X_CVBS>; + clock-names = "hclk", + "pclk_vdac", + "dclk", + "dclk_4x"; + rockchip,lumafilter0 = <0x000a0ffa>; + rockchip,lumafilter1 = <0x0ff4001a>; + rockchip,lumafilter2 = <0x00110fd2>; + rockchip,lumafilter3 = <0x0fe80051>; + rockchip,lumafilter4 = <0x001a0f74>; + rockchip,lumafilter5 = <0x0fe600ec>; + rockchip,lumafilter6 = <0x0ffa0e43>; + rockchip,lumafilter7 = <0x08200527>; + rockchip,tve-upsample = <DCLK_UPSAMPLEx4>; + rockchip,grf = <&grf>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + tve_in_vp1: endpoint@0 { + reg = <0>; + remote-endpoint = <&vp1_out_tve>; + status = "disabled"; + }; + }; + }; + }; + + hdcp2: hdcp2@ff8c0000 { + compatible = "rockchip,rk3528-hdmi-hdcp2"; + reg = <0x0 0xff8c0000 0x0 0x2000>; + interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_HDCP>, <&cru PCLK_HDCP>, + <&cru HCLK_HDCP>; + clock-names ="aclk_hdcp2", "pclk_hdcp2", "hdcp2_clk_hdmi"; + status = "disabled"; + }; + + hdmi: hdmi@ff8d0000 { + compatible = "rockchip,rk3528-dw-hdmi"; + reg = <0x0 0xff8d0000 0x0 0x20000>, + <0x0 0xff610000 0x0 0x200>; + interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_HDMI>, + <&cru CLK_SFR_HDMI>, + <&cru CLK_CEC_HDMI>; + clock-names = "iahb", "isfr", "cec"; + reg-io-width = <4>; + rockchip,grf = <&grf>; + pinctrl-names = "default"; + pinctrl-0 = <&hdmi_pins>; + phys = <&hdmiphy>; + phy-names = "hdmi"; + #sound-dai-cells = <0>; + hpd-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + hdmi_in_vp0: endpoint@0 { + reg = <0>; + remote-endpoint = <&vp0_out_hdmi>; + status = "disabled"; + }; + }; + }; + }; + + can0: can@ff960000 { + compatible = "rockchip,rk3528-can"; + reg = <0x0 0xff960000 0x0 0x100>; + interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>; + assigned-clocks = <&cru CLK_CAN0>; + assigned-clock-rates = <198000000>; + clocks = <&cru CLK_CAN0>, <&cru PCLK_CAN0>; + clock-names = "baudclk", "apb_pclk"; + resets = <&cru SRST_RESETN_CAN0>, <&cru SRST_PRESETN_CAN0>; + reset-names = "can", "can-apb"; + status = "disabled"; + }; + + can1: can@ff970000 { + compatible = "rockchip,rk3528-can"; + reg = <0x0 0xff970000 0x0 0x100>; + interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>; + assigned-clocks = <&cru CLK_CAN1>; + assigned-clock-rates = <198000000>; + clocks = <&cru CLK_CAN1>, <&cru PCLK_CAN1>; + clock-names = "baudclk", "apb_pclk"; + resets = <&cru SRST_RESETN_CAN1>, <&cru SRST_PRESETN_CAN1>; + reset-names = "can", "can-apb"; + status = "disabled"; + }; + + can2: can@ff980000 { + compatible = "rockchip,rk3528-can"; + reg = <0x0 0xff980000 0x0 0x100>; + interrupts = <GIC_SPI 50 IRQ_TYPE_LEVEL_HIGH>; + assigned-clocks = <&cru CLK_CAN2>; + assigned-clock-rates = <198000000>; + clocks = <&cru CLK_CAN2>, <&cru PCLK_CAN2>; + clock-names = "baudclk", "apb_pclk"; + resets = <&cru SRST_RESETN_CAN2>, <&cru SRST_PRESETN_CAN2>; + reset-names = "can", "can-apb"; + status = "disabled"; + }; + + can3: can@ff990000 { + compatible = "rockchip,rk3528-can"; + reg = <0x0 0xff990000 0x0 0x100>; + interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>; + assigned-clocks = <&cru CLK_CAN3>; + assigned-clock-rates = <198000000>; + clocks = <&cru CLK_CAN3>, <&cru PCLK_CAN3>; + clock-names = "baudclk", "apb_pclk"; + resets = <&cru SRST_RESETN_CAN3>, <&cru SRST_PRESETN_CAN3>; + reset-names = "can", "can-apb"; + status = "disabled"; + }; + + spi0: spi@ff9c0000 { + compatible = "rockchip,rk3066-spi"; + reg = <0x0 0xff9c0000 0x0 0x1000>; + interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&cru CLK_SPI0>, <&cru PCLK_SPI0>; + clock-names = "spiclk", "apb_pclk"; + dmas = <&dmac 25>, <&dmac 24>; + dma-names = "tx", "rx"; + pinctrl-names = "default"; + pinctrl-0 = <&spi0_csn0 &spi0_csn1 &spi0_pins>; + status = "disabled"; + }; + + spi1: spi@ff9d0000 { + compatible = "rockchip,rk3066-spi"; + reg = <0x0 0xff9d0000 0x0 0x1000>; + interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&cru CLK_SPI1>, <&cru PCLK_SPI1>; + clock-names = "spiclk", "apb_pclk"; + dmas = <&dmac 31>, <&dmac 30>; + dma-names = "tx", "rx"; + pinctrl-names = "default"; + pinctrl-0 = <&spi1_csn0 &spi1_csn1 &spi1_pins>; + status = "disabled"; + }; + + uart0: serial@ff9f0000 { + compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff9f0000 0x0 0x100>; + interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 9>, <&dmac 8>; + status = "disabled"; + }; + + uart1: serial@ff9f8000 { + compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff9f8000 0x0 0x100>; + interrupts = <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 11>, <&dmac 10>; + status = "disabled"; + }; + + uart2: serial@ffa00000 { + compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart"; + reg = <0x0 0xffa00000 0x0 0x100>; + interrupts = <GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 13>, <&dmac 12>; + status = "disabled"; + }; + + uart3: serial@ffa08000 { + compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart"; + reg = <0x0 0xffa08000 0x0 0x100>; + interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 15>, <&dmac 14>; + status = "disabled"; + }; + + uart4: serial@ffa10000 { + compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart"; + reg = <0x0 0xffa10000 0x0 0x100>; + interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 17>, <&dmac 16>; + status = "disabled"; + }; + + uart5: serial@ffa18000 { + compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart"; + reg = <0x0 0xffa18000 0x0 0x100>; + interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 19>, <&dmac 18>; + status = "disabled"; + }; + + uart6: serial@ffa20000 { + compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart"; + reg = <0x0 0xffa20000 0x0 0x100>; + interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART6>, <&cru PCLK_UART6>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 21>, <&dmac 20>; + status = "disabled"; + }; + + uart7: serial@ffa28000 { + compatible = "rockchip,rk3528-uart", "snps,dw-apb-uart"; + reg = <0x0 0xffa28000 0x0 0x100>; + interrupts = <GIC_SPI 47 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART7>, <&cru PCLK_UART7>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 23>, <&dmac 22>; + status = "disabled"; + }; + + i2c0: i2c@ffa50000 { + compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa50000 0x0 0x1000>; + clocks = <&cru CLK_I2C0>, <&cru PCLK_I2C0>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c0m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c1: i2c@ffa58000 { + compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa58000 0x0 0x1000>; + clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c1m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c2: i2c@ffa60000 { + compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa60000 0x0 0x1000>; + clocks = <&cru CLK_I2C2>, <&cru PCLK_I2C2>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c2m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c3: i2c@ffa68000 { + compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa68000 0x0 0x1000>; + clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c3m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c4: i2c@ffa70000 { + compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa70000 0x0 0x1000>; + clocks = <&cru CLK_I2C4>, <&cru PCLK_I2C4>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c4_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c5: i2c@ffa78000 { + compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa78000 0x0 0x1000>; + clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c5m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c6: i2c@ffa80000 { + compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa80000 0x0 0x1000>; + clocks = <&cru CLK_I2C6>, <&cru PCLK_I2C6>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c6m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c7: i2c@ffa88000 { + compatible = "rockchip,rk3528-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa88000 0x0 0x1000>; + clocks = <&cru CLK_I2C7>, <&cru PCLK_I2C7>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c7_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + pwm0: pwm@ffa90000 { + compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xffa90000 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm0m0_pins>; + clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm1: pwm@ffa90010 { + compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xffa90010 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm1m0_pins>; + clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm2: pwm@ffa90020 { + compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xffa90020 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm2m0_pins>; + clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm3: pwm@ffa90030 { + compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xffa90030 0x0 0x10>; + interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm3m0_pins>; + clocks = <&cru CLK_PWM0>, <&cru PCLK_PWM0>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm4: pwm@ffa98000 { + compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xffa98000 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm4m0_pins>; + clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm5: pwm@ffa98010 { + compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xffa98010 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm5m0_pins>; + clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm6: pwm@ffa98020 { + compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xffa98020 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm6m0_pins>; + clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm7: pwm@ffa98030 { + compatible = "rockchip,rk3528-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xffa98030 0x0 0x10>; + interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm7m0_pins>; + clocks = <&cru CLK_PWM1>, <&cru PCLK_PWM1>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + rktimer: timer@ffab0000 { + compatible = "rockchip,rk3528-timer", "rockchip,rk3288-timer"; + reg = <0x0 0xffab0000 0x0 0x20>; + interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_TIMER>, <&cru CLK_TIMER0>; + clock-names = "pclk", "timer"; + }; + + wdt: watchdog@ffac0000 { + compatible = "snps,dw-wdt"; + reg = <0x0 0xffac0000 0x0 0x100>; + clocks = <&cru TCLK_WDT_NS>, <&cru PCLK_WDT_NS>; + clock-names = "tclk", "pclk"; + interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; + status = "disabled"; + }; + + tsadc: tsadc@ffad0000 { + compatible = "rockchip,rk3528-tsadc"; + reg = <0x0 0xffad0000 0x0 0x400>; + rockchip,grf = <&grf>; + interrupts = <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru CLK_TSADC>, <&cru CLK_TSADC_TSEN>, <&cru PCLK_TSADC>; + clock-names = "tsadc", "tsadc_tsen", "apb_pclk"; + assigned-clocks = <&cru CLK_TSADC>, <&cru CLK_TSADC_TSEN>; + assigned-clock-rates = <1200000>, <12000000>; + resets = <&cru SRST_RESETN_TSADC>, <&cru SRST_PRESETN_TSADC>; + reset-names = "tsadc", "tsadc-apb"; + #thermal-sensor-cells = <1>; + rockchip,hw-tshut-temp = <120000>; + rockchip,hw-tshut-mode = <0>; /* tshut mode 0:CRU 1:GPIO */ + rockchip,hw-tshut-polarity = <0>; /* tshut polarity 0:LOW 1:HIGH */ + status = "disabled"; + }; + + saradc: saradc@ffae0000 { + compatible = "rockchip,rk3528-saradc"; + reg = <0x0 0xffae0000 0x0 0x10000>; + interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>; + #io-channel-cells = <1>; + clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>; + clock-names = "saradc", "apb_pclk"; + resets = <&cru SRST_PRESETN_SARADC>; + reset-names = "saradc-apb"; + status = "disabled"; + }; + + sai3: sai@ffb70000 { + compatible = "rockchip,rk3528-sai", "rockchip,sai-v1"; + reg = <0x0 0xffb70000 0x0 0x1000>; + interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru MCLK_SAI_I2S3>, <&cru HCLK_SAI_I2S3>; + clock-names = "mclk", "hclk"; + dmas = <&dmac 5>; + dma-names = "tx"; + resets = <&cru SRST_MRESETN_SAI_I2S3>, <&cru SRST_HRESETN_SAI_I2S3>; + reset-names = "m", "h"; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + sai0: sai@ffb80000 { + compatible = "rockchip,rk3528-sai", "rockchip,sai-v1"; + reg = <0x0 0xffb80000 0x0 0x1000>; + interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru MCLK_SAI_I2S0>, <&cru HCLK_SAI_I2S0>; + clock-names = "mclk", "hclk"; + dmas = <&dmac 1>, <&dmac 0>; + dma-names = "tx", "rx"; + resets = <&cru SRST_MRESETN_SAI_I2S0>, <&cru SRST_HRESETN_SAI_I2S0>; + reset-names = "m", "h"; + pinctrl-names = "default"; + pinctrl-0 = <&i2s0m0_pins>; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + sai2: sai@ffb90000 { + compatible = "rockchip,rk3528-sai", "rockchip,sai-v1"; + reg = <0x0 0xffb90000 0x0 0x1000>; + interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru MCLK_SAI_I2S2>, <&cru HCLK_SAI_I2S2>; + clock-names = "mclk", "hclk"; + dmas = <&dmac 4>; + dma-names = "tx"; + resets = <&cru SRST_MRESETN_SAI_I2S2>, <&cru SRST_HRESETN_SAI_I2S2>; + reset-names = "m", "h"; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + sai1: sai@ffba0000 { + compatible = "rockchip,rk3528-sai", "rockchip,sai-v1"; + reg = <0x0 0xffba0000 0x0 0x1000>; + interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru MCLK_SAI_I2S1>, <&cru HCLK_SAI_I2S1>; + clock-names = "mclk", "hclk"; + dmas = <&dmac 3>, <&dmac 2>; + dma-names = "tx", "rx"; + resets = <&cru SRST_MRESETN_SAI_I2S1>, <&cru SRST_HRESETN_SAI_I2S1>; + reset-names = "m", "h"; + pinctrl-names = "default"; + pinctrl-0 = <&i2s1_pins>; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + pdm: pdm@ffbb0000 { + compatible = "rockchip,rk3528-pdm", "rockchip,rk3568-pdm"; + reg = <0x0 0xffbb0000 0x0 0x1000>; + clocks = <&cru MCLK_PDM>, <&cru HCLK_PDM>; + clock-names = "pdm_clk", "pdm_hclk"; + dmas = <&dmac 6>; + dma-names = "rx"; + pinctrl-names = "default"; + pinctrl-0 = <&pdm_clk0 + &pdm_clk1 + &pdm_sdi0 + &pdm_sdi1 + &pdm_sdi2 + &pdm_sdi3>; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + spdif_8ch: spdif@ffbc0000 { + compatible = "rockchip,rk3528-spdif", "rockchip,rk3568-spdif"; + reg = <0x0 0xffbc0000 0x0 0x1000>; + interrupts = <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>; + dmas = <&dmac 7>; + dma-names = "tx"; + clock-names = "mclk", "hclk"; + clocks = <&cru MCLK_SPDIF>, <&cru HCLK_SPDIF>; + #sound-dai-cells = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&spdifm0_pins>; + status = "disabled"; + }; + + gmac0: ethernet@ffbd0000 { + compatible = "rockchip,rk3528-gmac", "snps,dwmac-4.20a"; + reg = <0x0 0xffbd0000 0x0 0x10000>; + interrupts = <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "macirq", "eth_wake_irq"; + rockchip,grf = <&grf>; + clocks = <&cru CLK_GMAC0_SRC>, <&cru CLK_GMAC0_RMII_50M>, + <&cru CLK_GMAC0_RX>, <&cru CLK_GMAC0_TX>, + <&cru PCLK_MAC_VO>, <&cru ACLK_MAC_VO>; + clock-names = "stmmaceth", "clk_mac_ref", + "mac_clk_rx", "mac_clk_tx", + "pclk_mac", "aclk_mac"; + resets = <&cru SRST_ARESETN_MAC_VO>; + reset-names = "stmmaceth"; + + snps,mixed-burst; + snps,tso; + + snps,axi-config = <&gmac0_stmmac_axi_setup>; + snps,mtl-rx-config = <&gmac0_mtl_rx_setup>; + snps,mtl-tx-config = <&gmac0_mtl_tx_setup>; + + phy-mode = "rmii"; + clock_in_out = "input"; + phy-handle = <&rmii0_phy>; + + nvmem-cells = <&macphy_bgs>; + nvmem-cell-names = "bgs"; + status = "disabled"; + + mdio0: mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <0x1>; + #size-cells = <0x0>; + rmii0_phy: ethernet-phy@2 { + compatible = "ethernet-phy-id0044.1400", "ethernet-phy-ieee802.3-c22"; + reg = <2>; + clocks = <&cru CLK_MACPHY>; + resets = <&cru SRST_RESETN_MACPHY>; + phy-is-integrated; + pinctrl-names = "default"; + pinctrl-0 = <&fephym0_led_link &fephym0_led_spd>; + nvmem-cells = <&macphy_txlevel>; + nvmem-cell-names = "txlevel"; + }; + }; + + gmac0_stmmac_axi_setup: stmmac-axi-config { + snps,wr_osr_lmt = <4>; + snps,rd_osr_lmt = <8>; + snps,blen = <0 0 0 0 16 8 4>; + }; + + gmac0_mtl_rx_setup: rx-queues-config { + snps,rx-queues-to-use = <1>; + queue0 {}; + }; + + gmac0_mtl_tx_setup: tx-queues-config { + snps,tx-queues-to-use = <1>; + queue0 {}; + }; + }; + + gmac1: ethernet@ffbe0000 { + compatible = "rockchip,rk3528-gmac", "snps,dwmac-4.20a"; + reg = <0x0 0xffbe0000 0x0 0x10000>; + interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "macirq", "eth_wake_irq"; + rockchip,grf = <&grf>; + clocks = <&cru CLK_GMAC1_SRC_VPU>, <&cru CLK_GMAC1_RMII_VPU>, + <&cru PCLK_MAC_VPU>, <&cru ACLK_MAC_VPU>; + clock-names = "stmmaceth", "clk_mac_ref", + "pclk_mac", "aclk_mac"; + resets = <&cru SRST_ARESETN_MAC>; + reset-names = "stmmaceth"; + + snps,mixed-burst; + snps,tso; + + snps,axi-config = <&gmac1_stmmac_axi_setup>; + snps,mtl-rx-config = <&gmac1_mtl_rx_setup>; + snps,mtl-tx-config = <&gmac1_mtl_tx_setup>; + + status = "disabled"; + + mdio1: mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <0x1>; + #size-cells = <0x0>; + }; + + gmac1_stmmac_axi_setup: stmmac-axi-config { + snps,wr_osr_lmt = <4>; + snps,rd_osr_lmt = <8>; + snps,blen = <0 0 0 0 16 8 4>; + }; + + gmac1_mtl_rx_setup: rx-queues-config { + snps,rx-queues-to-use = <1>; + queue0 {}; + }; + + gmac1_mtl_tx_setup: tx-queues-config { + snps,tx-queues-to-use = <1>; + queue0 {}; + }; + }; + + sdhci: mmc@ffbf0000 { + compatible = "rockchip,rk3528-dwcmshc"; + reg = <0x0 0xffbf0000 0x0 0x10000>; + interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>; + assigned-clocks = <&cru BCLK_EMMC>, <&cru TCLK_EMMC>, <&cru CCLK_SRC_EMMC>; + assigned-clock-rates = <200000000>, <24000000>, <200000000>; + clocks = <&cru CCLK_SRC_EMMC>, <&cru HCLK_EMMC>, + <&cru ACLK_EMMC>, <&cru BCLK_EMMC>, + <&cru TCLK_EMMC>; + clock-names = "core", "bus", "axi", "block", "timer"; + resets = <&cru SRST_CRESETN_EMMC>, <&cru SRST_HRESETN_EMMC>, + <&cru SRST_ARESETN_EMMC>, <&cru SRST_BRESETN_EMMC>, + <&cru SRST_TRESETN_EMMC>; + reset-names = "core", "bus", "axi", "block", "timer"; + max-frequency = <200000000>; + status = "disabled"; + }; + + sfc: spi@ffc00000 { + compatible = "rockchip,sfc"; + reg = <0x0 0xffc00000 0x0 0x4000>; + interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_SFC>, <&cru HCLK_SFC>; + clock-names = "clk_sfc", "hclk_sfc"; + assigned-clocks = <&cru SCLK_SFC>; + assigned-clock-rates = <100000000>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + sdio0: mmc@ffc10000 { + compatible = "rockchip,rk3528-dw-mshc", + "rockchip,rk3288-dw-mshc"; + reg = <0x0 0xffc10000 0x0 0x4000>; + interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>; + max-frequency = <150000000>; + clocks = <&cru HCLK_SDIO0>, <&cru CCLK_SRC_SDIO0>, + <&grf_cru SCLK_SDIO0_DRV>, <&grf_cru SCLK_SDIO0_SAMPLE>; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; + fifo-depth = <0x100>; + resets = <&cru SRST_HRESETN_SDIO0>; + reset-names = "reset"; + rockchip,use-v2-tuning; + status = "disabled"; + }; + + sdio1: mmc@ffc20000 { + compatible = "rockchip,rk3528-dw-mshc", + "rockchip,rk3288-dw-mshc"; + reg = <0x0 0xffc20000 0x0 0x4000>; + interrupts = <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>; + max-frequency = <150000000>; + clocks = <&cru HCLK_SDIO1>, <&cru CCLK_SRC_SDIO1>, + <&grf_cru SCLK_SDIO1_DRV>, <&grf_cru SCLK_SDIO1_SAMPLE>; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; + fifo-depth = <0x100>; + resets = <&cru SRST_HRESETN_SDIO1>; + reset-names = "reset"; + rockchip,use-v2-tuning; + status = "disabled"; + }; + + sdmmc: mmc@ffc30000 { + compatible = "rockchip,rk3528-dw-mshc", + "rockchip,rk3288-dw-mshc"; + reg = <0x0 0xffc30000 0x0 0x4000>; + interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>; + max-frequency = <150000000>; + clocks = <&cru HCLK_SDMMC0>, <&cru CCLK_SRC_SDMMC0>, + <&grf_cru SCLK_SDMMC_DRV>, <&grf_cru SCLK_SDMMC_SAMPLE>; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; + fifo-depth = <0x100>; + resets = <&cru SRST_HRESETN_SDMMC0>; + reset-names = "reset"; + rockchip,use-v2-tuning; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>; + status = "disabled"; + }; + + crypto: crypto@ffc40000 { + compatible = "rockchip,crypto-v4"; + reg = <0x0 0xffc40000 0x0 0x2000>; + interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&scmi_clk SCMI_ACLK_CRYPTO>, <&scmi_clk SCMI_HCLK_CRYPTO>, + <&scmi_clk SCMI_CORE_CRYPTO>, <&scmi_clk SCMI_PKA_CRYPTO>; + clock-names = "aclk", "hclk", "sclk", "pka"; + assigned-clocks = <&scmi_clk SCMI_CORE_CRYPTO>, <&scmi_clk SCMI_PKA_CRYPTO>; + assigned-clock-rates = <300000000>, <300000000>; + resets = <&cru SRST_RESETN_CORE_CRYPTO>; + reset-names = "crypto-rst"; + status = "disabled"; + }; + + rng: rng@ffc50000 { + compatible = "rockchip,rkrng"; + reg = <0x0 0xffc50000 0x0 0x200>; + interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&scmi_clk SCMI_HCLK_TRNG>; + clock-names = "hclk_trng"; + resets = <&cru SRST_HRESETN_TRNG_NS>; + reset-names = "reset"; + status = "disabled"; + }; + + otp: otp@ffce0000 { + compatible = "rockchip,rk3528-otp"; + reg = <0x0 0xffce0000 0x0 0x4000>; + #address-cells = <1>; + #size-cells = <1>; + clocks = <&cru CLK_USER_OTPC_NS>, <&cru CLK_SBPI_OTPC_NS>, + <&cru PCLK_OTPC_NS>; + clock-names = "usr", "sbpi", "apb"; + resets = <&cru SRST_RESETN_USER_OTPC_NS>, + <&cru SRST_RESETN_SBPI_OTPC_NS>, + <&cru SRST_PRESETN_OTPC_NS>; + reset-names = "usr", "sbpi", "apb"; + + /* Data cells */ + cpu_code: cpu-code@2 { + reg = <0x02 0x2>; + }; + otp_cpu_version: cpu-version@8 { + reg = <0x08 0x1>; + bits = <3 3>; + }; + otp_id: id@a { + reg = <0x0a 0x10>; + }; + cpu_leakage: cpu-leakage@1a { + reg = <0x1a 0x1>; + }; + log_leakage: log-leakage@1b { + reg = <0x1b 0x1>; + }; + gpu_leakage: gpu-leakage@1c { + reg = <0x1c 0x1>; + }; + macphy_bgs: macphy-bgs@2d { + reg = <0x2d 0x1>; + }; + macphy_txlevel: macphy-txlevel@2e { + reg = <0x2e 0x2>; + }; + }; + + dmac: dma-controller@ffd60000 { + compatible = "arm,pl330", "arm,primecell"; + reg = <0x0 0xffd60000 0x0 0x4000>; + interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_DMAC>; + clock-names = "apb_pclk"; + #dma-cells = <1>; + arm,pl330-periph-burst; + }; + + hwlock: hwspinlock@ffd70000 { + compatible = "rockchip,hwspinlock"; + reg = <0x0 0xffd70000 0x0 0x100>; + #hwlock-cells = <1>; + status = "disabled"; + }; + + combphy_pu: phy@ffdc0000 { + compatible = "rockchip,rk3528-naneng-combphy"; + reg = <0x0 0xffdc0000 0x0 0x10000>; + #phy-cells = <1>; + clocks = <&cru CLK_REF_PCIE_INNER_PHY>, <&cru PCLK_PCIE_PHY>, <&cru PCLK_PIPE_GRF>; + clock-names = "refclk", "apbclk", "pipe_clk"; + assigned-clocks = <&cru CLK_REF_PCIE_INNER_PHY>; + assigned-clock-rates = <100000000>; + resets = <&cru SRST_PRESETN_PCIE_PHY>, <&cru SRST_RESETN_PCIE_PIPE_PHY>; + reset-names = "combphy-apb", "combphy"; + rockchip,pipe-grf = <&grf>; + rockchip,pipe-phy-grf = <&grf>; + status = "disabled"; + }; + + usb2phy: usb2-phy@ffdf0000 { + compatible = "rockchip,rk3528-usb2phy"; + reg = <0x0 0xffdf0000 0x0 0x10000>; + clocks = <&cru CLK_REF_USBPHY>, <&cru PCLK_USBPHY>; + clock-names = "phyclk", "apb_pclk"; + #clock-cells = <0>; + rockchip,usbgrf = <&grf>; + status = "disabled"; + + u2phy_otg: otg-port { + #phy-cells = <0>; + interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "otg-bvalid", + "otg-id", + "linestate"; + status = "disabled"; + }; + + u2phy_host: host-port { + #phy-cells = <0>; + interrupts = <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "linestate"; + status = "disabled"; + }; + }; + + hdmiphy: hdmiphy@ffe00000 { + compatible = "rockchip,rk3528-hdmi-phy"; + reg = <0x0 0xffe00000 0x0 0x10000>; + interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>; + #phy-cells = <0>; + clocks = <&cru PCLK_HDMIPHY>, <&xin24m>; + clock-names = "sysclk", "refclk"; + #clock-cells = <0>; + clock-output-names = "clk_hdmiphy_pixel_io"; + status = "disabled"; + }; + + acodec: acodec@ffe10000 { + compatible = "rockchip,rk3528-codec"; + reg = <0x0 0xffe10000 0x0 0x1000>; + #sound-dai-cells = <0>; + clocks = <&cru PCLK_ACODEC>, <&cru MCLK_ACODEC_TX>; + clock-names = "pclk", "mclk"; + resets = <&cru SRST_PRESETN_ACODEC>; + reset-names = "acodec"; + status = "disabled"; + }; + + pinctrl: pinctrl { + compatible = "rockchip,rk3528-pinctrl"; + rockchip,grf = <&ioc_grf>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + + gpio0: gpio@ff610000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xff610000 0x0 0x200>; + interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_GPIO0>, <&cru DBCLK_GPIO0>; + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 0 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + + gpio1: gpio@ffaf0000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xffaf0000 0x0 0x200>; + interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_GPIO1>, <&cru DBCLK_GPIO1>; + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 32 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + + gpio2: gpio@ffb00000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xffb00000 0x0 0x200>; + interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_GPIO2>, <&cru DBCLK_GPIO2>; + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 64 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + + gpio3: gpio@ffb10000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xffb10000 0x0 0x200>; + interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_GPIO3>, <&cru DBCLK_GPIO3>; + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 96 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + + gpio4: gpio@ffb20000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xffb20000 0x0 0x200>; + interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_GPIO4>, <&cru DBCLK_GPIO4>; + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 128 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + }; +}; + +#include "rk3528-pinctrl.dtsi" diff --git a/u-boot/arch/arm/dts/rk3562-evb.dts b/u-boot/arch/arm/dts/rk3562-evb.dts new file mode 100644 index 0000000..070e7d8 --- /dev/null +++ b/u-boot/arch/arm/dts/rk3562-evb.dts @@ -0,0 +1,31 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + * + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + */ + +/dts-v1/; +#include "rk3562.dtsi" +#include "rk3562-u-boot.dtsi" +#include <dt-bindings/input/input.h> + +/ { + model = "Rockchip RK3562 Evaluation Board"; + compatible = "rockchip,rk3562-evb", "rockchip,rk3562"; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc0 1>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + u-boot,dm-pre-reloc; + status = "okay"; + + volumeup-key { + u-boot,dm-pre-reloc; + linux,code = <KEY_VOLUMEUP>; + label = "volume up"; + press-threshold-microvolt = <9>; + }; + }; +}; diff --git a/u-boot/arch/arm/dts/rk3562-pinctrl.dtsi b/u-boot/arch/arm/dts/rk3562-pinctrl.dtsi new file mode 100644 index 0000000..d92da5c --- /dev/null +++ b/u-boot/arch/arm/dts/rk3562-pinctrl.dtsi @@ -0,0 +1,1872 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ + +#include <dt-bindings/pinctrl/rockchip.h> +#include "rockchip-pinconf.dtsi" + +/* + * This file is auto generated by pin2dts tool, please keep these code + * by adding changes at end of this file. + */ +&pinctrl { + cam { + camm0_pins: camm0-pins { + rockchip,pins = + /* cam_clk0_out_m0 */ + <3 RK_PB2 2 &pcfg_pull_none>, + /* cam_clk1_out_m0 */ + <3 RK_PB3 2 &pcfg_pull_none>; + }; + + camm1_pins: camm1-pins { + rockchip,pins = + /* cam_clk0_out_m1 */ + <4 RK_PB1 3 &pcfg_pull_none>, + /* cam_clk1_out_m1 */ + <4 RK_PB7 3 &pcfg_pull_none>; + }; + + cam_clk2_out: cam-clk2-out { + rockchip,pins = + /* cam_clk2_out */ + <3 RK_PB4 2 &pcfg_pull_none>; + }; + cam_clk3_out: cam-clk3-out { + rockchip,pins = + /* cam_clk3_out */ + <3 RK_PB5 2 &pcfg_pull_none>; + }; + }; + + can0 { + can0m0_pins: can0m0-pins { + rockchip,pins = + /* can0_rx_m0 */ + <3 RK_PA1 4 &pcfg_pull_none>, + /* can0_tx_m0 */ + <3 RK_PA0 4 &pcfg_pull_none>; + }; + + can0m1_pins: can0m1-pins { + rockchip,pins = + /* can0_rx_m1 */ + <3 RK_PB7 6 &pcfg_pull_none>, + /* can0_tx_m1 */ + <3 RK_PB6 6 &pcfg_pull_none>; + }; + + can0m2_pins: can0m2-pins { + rockchip,pins = + /* can0_rx_m2 */ + <0 RK_PC7 2 &pcfg_pull_none>, + /* can0_tx_m2 */ + <0 RK_PC6 2 &pcfg_pull_none>; + }; + }; + + can1 { + can1m0_pins: can1m0-pins { + rockchip,pins = + /* can1_rx_m0 */ + <1 RK_PB7 4 &pcfg_pull_none>, + /* can1_tx_m0 */ + <1 RK_PC0 5 &pcfg_pull_none>; + }; + + can1m1_pins: can1m1-pins { + rockchip,pins = + /* can1_rx_m1 */ + <0 RK_PC1 4 &pcfg_pull_none>, + /* can1_tx_m1 */ + <0 RK_PC0 4 &pcfg_pull_none>; + }; + }; + + clk { + clk_32k_in: clk-32k-in { + rockchip,pins = + /* clk_32k_in */ + <0 RK_PB0 1 &pcfg_pull_none>; + }; + }; + + clk0 { + clk0_32k_out: clk0-32k-out { + rockchip,pins = + /* clk0_32k_out */ + <0 RK_PB0 2 &pcfg_pull_none>; + }; + }; + + clk1 { + clk1_32k_out: clk1-32k-out { + rockchip,pins = + /* clk1_32k_out */ + <2 RK_PA1 3 &pcfg_pull_none>; + }; + }; + + cpu { + cpu_pins: cpu-pins { + rockchip,pins = + /* cpu_avs */ + <0 RK_PB7 3 &pcfg_pull_none>; + }; + }; + + dsm { + dsm_pins: dsm-pins { + rockchip,pins = + /* dsm_aud_ln */ + <1 RK_PB4 5 &pcfg_pull_none>, + /* dsm_aud_lp */ + <1 RK_PB3 5 &pcfg_pull_none>, + /* dsm_aud_rn */ + <1 RK_PB6 6 &pcfg_pull_none>, + /* dsm_aud_rp */ + <1 RK_PB5 6 &pcfg_pull_none>; + }; + }; + + emmc { + emmc_bus8: emmc-bus8 { + rockchip,pins = + /* emmc_d0 */ + <1 RK_PA0 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d1 */ + <1 RK_PA1 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d2 */ + <1 RK_PA2 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d3 */ + <1 RK_PA3 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d4 */ + <1 RK_PA4 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d5 */ + <1 RK_PA5 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d6 */ + <1 RK_PA6 1 &pcfg_pull_up_drv_level_2>, + /* emmc_d7 */ + <1 RK_PA7 1 &pcfg_pull_up_drv_level_2>; + }; + + emmc_clk: emmc-clk { + rockchip,pins = + /* emmc_clk */ + <1 RK_PB1 1 &pcfg_pull_up_drv_level_2>; + }; + + emmc_cmd: emmc-cmd { + rockchip,pins = + /* emmc_cmd */ + <1 RK_PB0 1 &pcfg_pull_up_drv_level_2>; + }; + + emmc_strb: emmc-strb { + rockchip,pins = + /* emmc_strb */ + <1 RK_PB2 1 &pcfg_pull_none>; + }; + }; + + eth { + ethm0_pins: ethm0-pins { + rockchip,pins = + /* eth_clk_25m_out_m0 */ + <4 RK_PB1 2 &pcfg_pull_none>; + }; + + ethm1_pins: ethm1-pins { + rockchip,pins = + /* eth_clk_25m_out_m1 */ + <2 RK_PA1 2 &pcfg_pull_none>; + }; + }; + + fspi { + fspi_pins: fspi-pins { + rockchip,pins = + /* fspi_clk */ + <1 RK_PB1 2 &pcfg_pull_none>, + /* fspi_d0 */ + <1 RK_PA0 2 &pcfg_pull_none>, + /* fspi_d1 */ + <1 RK_PA1 2 &pcfg_pull_none>, + /* fspi_d2 */ + <1 RK_PA2 2 &pcfg_pull_none>, + /* fspi_d3 */ + <1 RK_PA3 2 &pcfg_pull_none>; + }; + + fspi_csn0: fspi-csn0 { + rockchip,pins = + /* fspi_csn0 */ + <1 RK_PB0 2 &pcfg_pull_none>; + }; + fspi_csn1: fspi-csn1 { + rockchip,pins = + /* fspi_csn1 */ + <1 RK_PB2 2 &pcfg_pull_none>; + }; + }; + + gpu { + gpu_pins: gpu-pins { + rockchip,pins = + /* gpu_avs */ + <0 RK_PC0 3 &pcfg_pull_none>; + }; + }; + + i2c0 { + i2c0_xfer: i2c0-xfer { + rockchip,pins = + /* i2c0_scl */ + <0 RK_PB1 1 &pcfg_pull_none_smt>, + /* i2c0_sda */ + <0 RK_PB2 1 &pcfg_pull_none_smt>; + }; + }; + + i2c1 { + i2c1m0_xfer: i2c1m0-xfer { + rockchip,pins = + /* i2c1_scl_m0 */ + <0 RK_PB3 1 &pcfg_pull_none_smt>, + /* i2c1_sda_m0 */ + <0 RK_PB4 1 &pcfg_pull_none_smt>; + }; + + i2c1m1_xfer: i2c1m1-xfer { + rockchip,pins = + /* i2c1_scl_m1 */ + <4 RK_PB4 5 &pcfg_pull_none_smt>, + /* i2c1_sda_m1 */ + <4 RK_PB5 5 &pcfg_pull_none_smt>; + }; + }; + + i2c2 { + i2c2m0_xfer: i2c2m0-xfer { + rockchip,pins = + /* i2c2_scl_m0 */ + <0 RK_PB5 1 &pcfg_pull_none_smt>, + /* i2c2_sda_m0 */ + <0 RK_PB6 1 &pcfg_pull_none_smt>; + }; + + i2c2m1_xfer: i2c2m1-xfer { + rockchip,pins = + /* i2c2_scl_m1 */ + <3 RK_PD2 5 &pcfg_pull_none_smt>, + /* i2c2_sda_m1 */ + <3 RK_PD3 5 &pcfg_pull_none_smt>; + }; + }; + + i2c3 { + i2c3m0_xfer: i2c3m0-xfer { + rockchip,pins = + /* i2c3_scl_m0 */ + <3 RK_PA0 1 &pcfg_pull_none_smt>, + /* i2c3_sda_m0 */ + <3 RK_PA1 1 &pcfg_pull_none_smt>; + }; + + i2c3m1_xfer: i2c3m1-xfer { + rockchip,pins = + /* i2c3_scl_m1 */ + <4 RK_PA5 5 &pcfg_pull_none_smt>, + /* i2c3_sda_m1 */ + <4 RK_PA6 5 &pcfg_pull_none_smt>; + }; + }; + + i2c4 { + i2c4m0_xfer: i2c4m0-xfer { + rockchip,pins = + /* i2c4_scl_m0 */ + <3 RK_PB6 5 &pcfg_pull_none_smt>, + /* i2c4_sda_m0 */ + <3 RK_PB7 5 &pcfg_pull_none_smt>; + }; + + i2c4m1_xfer: i2c4m1-xfer { + rockchip,pins = + /* i2c4_scl_m1 */ + <0 RK_PA5 2 &pcfg_pull_none_smt>, + /* i2c4_sda_m1 */ + <0 RK_PA4 2 &pcfg_pull_none_smt>; + }; + }; + + i2c5 { + i2c5m0_xfer: i2c5m0-xfer { + rockchip,pins = + /* i2c5_scl_m0 */ + <3 RK_PC2 1 &pcfg_pull_none_smt>, + /* i2c5_sda_m0 */ + <3 RK_PC3 1 &pcfg_pull_none_smt>; + }; + + i2c5m1_xfer: i2c5m1-xfer { + rockchip,pins = + /* i2c5_scl_m1 */ + <1 RK_PC7 4 &pcfg_pull_none_smt>, + /* i2c5_sda_m1 */ + <1 RK_PD0 4 &pcfg_pull_none_smt>; + }; + }; + + i2s0 { + i2s0m0_lrck: i2s0m0-lrck { + rockchip,pins = + /* i2s0_lrck_m0 */ + <3 RK_PA4 1 &pcfg_pull_none>; + }; + + i2s0m0_mclk: i2s0m0-mclk { + rockchip,pins = + /* i2s0_mclk_m0 */ + <3 RK_PA2 1 &pcfg_pull_none>; + }; + + i2s0m0_sclk: i2s0m0-sclk { + rockchip,pins = + /* i2s0_sclk_m0 */ + <3 RK_PA3 1 &pcfg_pull_none>; + }; + + i2s0m0_sdi0: i2s0m0-sdi0 { + rockchip,pins = + /* i2s0_sdi0_m0 */ + <3 RK_PB1 1 &pcfg_pull_none>; + }; + + i2s0m0_sdi1: i2s0m0-sdi1 { + rockchip,pins = + /* i2s0_sdi1_m0 */ + <3 RK_PB0 2 &pcfg_pull_none>; + }; + + i2s0m0_sdi2: i2s0m0-sdi2 { + rockchip,pins = + /* i2s0_sdi2_m0 */ + <3 RK_PA7 2 &pcfg_pull_none>; + }; + + i2s0m0_sdi3: i2s0m0-sdi3 { + rockchip,pins = + /* i2s0_sdi3_m0 */ + <3 RK_PA6 2 &pcfg_pull_none>; + }; + + i2s0m0_sdo0: i2s0m0-sdo0 { + rockchip,pins = + /* i2s0_sdo0_m0 */ + <3 RK_PA5 1 &pcfg_pull_none>; + }; + + i2s0m0_sdo1: i2s0m0-sdo1 { + rockchip,pins = + /* i2s0_sdo1_m0 */ + <3 RK_PA6 1 &pcfg_pull_none>; + }; + + i2s0m0_sdo2: i2s0m0-sdo2 { + rockchip,pins = + /* i2s0_sdo2_m0 */ + <3 RK_PA7 1 &pcfg_pull_none>; + }; + + i2s0m0_sdo3: i2s0m0-sdo3 { + rockchip,pins = + /* i2s0_sdo3_m0 */ + <3 RK_PB0 1 &pcfg_pull_none>; + }; + + i2s0m1_lrck: i2s0m1-lrck { + rockchip,pins = + /* i2s0_lrck_m1 */ + <1 RK_PC4 3 &pcfg_pull_none>; + }; + + i2s0m1_mclk: i2s0m1-mclk { + rockchip,pins = + /* i2s0_mclk_m1 */ + <1 RK_PC6 3 &pcfg_pull_none>; + }; + + i2s0m1_sclk: i2s0m1-sclk { + rockchip,pins = + /* i2s0_sclk_m1 */ + <1 RK_PC5 3 &pcfg_pull_none>; + }; + + i2s0m1_sdi0: i2s0m1-sdi0 { + rockchip,pins = + /* i2s0_sdi0_m1 */ + <1 RK_PC1 3 &pcfg_pull_none>; + }; + + i2s0m1_sdi1: i2s0m1-sdi1 { + rockchip,pins = + /* i2s0_sdi1_m1 */ + <1 RK_PC2 3 &pcfg_pull_none>; + }; + + i2s0m1_sdi2: i2s0m1-sdi2 { + rockchip,pins = + /* i2s0_sdi2_m1 */ + <1 RK_PD3 3 &pcfg_pull_none>; + }; + + i2s0m1_sdi3: i2s0m1-sdi3 { + rockchip,pins = + /* i2s0_sdi3_m1 */ + <1 RK_PD4 3 &pcfg_pull_none>; + }; + + i2s0m1_sdo0: i2s0m1-sdo0 { + rockchip,pins = + /* i2s0_sdo0_m1 */ + <1 RK_PC3 3 &pcfg_pull_none>; + }; + + i2s0m1_sdo1: i2s0m1-sdo1 { + rockchip,pins = + /* i2s0_sdo1_m1 */ + <1 RK_PD1 3 &pcfg_pull_none>; + }; + + i2s0m1_sdo2: i2s0m1-sdo2 { + rockchip,pins = + /* i2s0_sdo2_m1 */ + <1 RK_PD2 3 &pcfg_pull_none>; + }; + + i2s0m1_sdo3: i2s0m1-sdo3 { + rockchip,pins = + /* i2s0_sdo3_m1 */ + <2 RK_PA1 5 &pcfg_pull_none>; + }; + }; + + i2s1 { + i2s1m0_lrck: i2s1m0-lrck { + rockchip,pins = + /* i2s1_lrck_m0 */ + <3 RK_PC6 2 &pcfg_pull_none>; + }; + + i2s1m0_mclk: i2s1m0-mclk { + rockchip,pins = + /* i2s1_mclk_m0 */ + <3 RK_PC4 2 &pcfg_pull_none>; + }; + + i2s1m0_sclk: i2s1m0-sclk { + rockchip,pins = + /* i2s1_sclk_m0 */ + <3 RK_PC5 2 &pcfg_pull_none>; + }; + + i2s1m0_sdi0: i2s1m0-sdi0 { + rockchip,pins = + /* i2s1_sdi0_m0 */ + <3 RK_PD0 2 &pcfg_pull_none>; + }; + + i2s1m0_sdi1: i2s1m0-sdi1 { + rockchip,pins = + /* i2s1_sdi1_m0 */ + <3 RK_PD1 2 &pcfg_pull_none>; + }; + + i2s1m0_sdi2: i2s1m0-sdi2 { + rockchip,pins = + /* i2s1_sdi2_m0 */ + <3 RK_PD2 2 &pcfg_pull_none>; + }; + + i2s1m0_sdi3: i2s1m0-sdi3 { + rockchip,pins = + /* i2s1_sdi3_m0 */ + <3 RK_PD3 2 &pcfg_pull_none>; + }; + + i2s1m0_sdo0: i2s1m0-sdo0 { + rockchip,pins = + /* i2s1_sdo0_m0 */ + <3 RK_PC7 2 &pcfg_pull_none>; + }; + + i2s1m0_sdo1: i2s1m0-sdo1 { + rockchip,pins = + /* i2s1_sdo1_m0 */ + <4 RK_PB4 2 &pcfg_pull_none>; + }; + + i2s1m0_sdo2: i2s1m0-sdo2 { + rockchip,pins = + /* i2s1_sdo2_m0 */ + <4 RK_PB5 2 &pcfg_pull_none>; + }; + + i2s1m0_sdo3: i2s1m0-sdo3 { + rockchip,pins = + /* i2s1_sdo3_m0 */ + <4 RK_PB6 2 &pcfg_pull_none>; + }; + + i2s1m1_lrck: i2s1m1-lrck { + rockchip,pins = + /* i2s1_lrck_m1 */ + <3 RK_PB4 1 &pcfg_pull_none>; + }; + + i2s1m1_mclk: i2s1m1-mclk { + rockchip,pins = + /* i2s1_mclk_m1 */ + <3 RK_PB2 1 &pcfg_pull_none>; + }; + + i2s1m1_sclk: i2s1m1-sclk { + rockchip,pins = + /* i2s1_sclk_m1 */ + <3 RK_PB3 1 &pcfg_pull_none>; + }; + + i2s1m1_sdi0: i2s1m1-sdi0 { + rockchip,pins = + /* i2s1_sdi0_m1 */ + <3 RK_PC1 1 &pcfg_pull_none>; + }; + + i2s1m1_sdi1: i2s1m1-sdi1 { + rockchip,pins = + /* i2s1_sdi1_m1 */ + <3 RK_PC0 2 &pcfg_pull_none>; + }; + + i2s1m1_sdi2: i2s1m1-sdi2 { + rockchip,pins = + /* i2s1_sdi2_m1 */ + <3 RK_PB7 2 &pcfg_pull_none>; + }; + + i2s1m1_sdi3: i2s1m1-sdi3 { + rockchip,pins = + /* i2s1_sdi3_m1 */ + <3 RK_PB6 2 &pcfg_pull_none>; + }; + + i2s1m1_sdo0: i2s1m1-sdo0 { + rockchip,pins = + /* i2s1_sdo0_m1 */ + <3 RK_PB5 1 &pcfg_pull_none>; + }; + + i2s1m1_sdo1: i2s1m1-sdo1 { + rockchip,pins = + /* i2s1_sdo1_m1 */ + <3 RK_PB6 1 &pcfg_pull_none>; + }; + + i2s1m1_sdo2: i2s1m1-sdo2 { + rockchip,pins = + /* i2s1_sdo2_m1 */ + <3 RK_PB7 1 &pcfg_pull_none>; + }; + + i2s1m1_sdo3: i2s1m1-sdo3 { + rockchip,pins = + /* i2s1_sdo3_m1 */ + <3 RK_PC0 1 &pcfg_pull_none>; + }; + }; + + i2s2 { + i2s2m0_lrck: i2s2m0-lrck { + rockchip,pins = + /* i2s2_lrck_m0 */ + <1 RK_PD6 1 &pcfg_pull_none>; + }; + + i2s2m0_mclk: i2s2m0-mclk { + rockchip,pins = + /* i2s2_mclk_m0 */ + <2 RK_PA1 1 &pcfg_pull_none>; + }; + + i2s2m0_sclk: i2s2m0-sclk { + rockchip,pins = + /* i2s2_sclk_m0 */ + <1 RK_PD5 1 &pcfg_pull_none>; + }; + + i2s2m0_sdi: i2s2m0-sdi { + rockchip,pins = + /* i2s2_sdi_m0 */ + <2 RK_PA0 1 &pcfg_pull_none>; + }; + + i2s2m0_sdo: i2s2m0-sdo { + rockchip,pins = + /* i2s2_sdo_m0 */ + <1 RK_PD7 1 &pcfg_pull_none>; + }; + + i2s2m1_lrck: i2s2m1-lrck { + rockchip,pins = + /* i2s2_lrck_m1 */ + <4 RK_PA1 3 &pcfg_pull_none>; + }; + + i2s2m1_mclk: i2s2m1-mclk { + rockchip,pins = + /* i2s2_mclk_m1 */ + <3 RK_PD6 3 &pcfg_pull_none>; + }; + + i2s2m1_sclk: i2s2m1-sclk { + rockchip,pins = + /* i2s2_sclk_m1 */ + <4 RK_PB1 4 &pcfg_pull_none>; + }; + + i2s2m1_sdi: i2s2m1-sdi { + rockchip,pins = + /* i2s2_sdi_m1 */ + <3 RK_PD4 4 &pcfg_pull_none>; + }; + + i2s2m1_sdo: i2s2m1-sdo { + rockchip,pins = + /* i2s2_sdo_m1 */ + <3 RK_PD5 4 &pcfg_pull_none>; + }; + }; + + isp { + isp_pins: isp-pins { + rockchip,pins = + /* isp_flash_trigin */ + <3 RK_PC1 2 &pcfg_pull_none>, + /* isp_flash_trigout */ + <3 RK_PC3 2 &pcfg_pull_none>, + /* isp_prelight_trigout */ + <3 RK_PC2 2 &pcfg_pull_none>; + }; + }; + + jtag { + jtagm0_pins: jtagm0-pins { + rockchip,pins = + /* jtag_cpu_mcu_tck_m0 */ + <0 RK_PD1 2 &pcfg_pull_none>, + /* jtag_cpu_mcu_tms_m0 */ + <0 RK_PD0 2 &pcfg_pull_none>; + }; + + jtagm1_pins: jtagm1-pins { + rockchip,pins = + /* jtag_cpu_mcu_tck_m1 */ + <1 RK_PB5 2 &pcfg_pull_none>, + /* jtag_cpu_mcu_tms_m1 */ + <1 RK_PB6 2 &pcfg_pull_none>; + }; + }; + + npu { + npu_pins: npu-pins { + rockchip,pins = + /* npu_avs */ + <0 RK_PC1 3 &pcfg_pull_none>; + }; + }; + + pcie20 { + pcie20m0_pins: pcie20m0-pins { + rockchip,pins = + /* pcie20_clkreqn_m0 */ + <0 RK_PA6 1 &pcfg_pull_none>, + /* pcie20_perstn_m0 */ + <0 RK_PB5 2 &pcfg_pull_none>, + /* pcie20_waken_m0 */ + <0 RK_PB6 2 &pcfg_pull_none>; + }; + + pcie20m1_pins: pcie20m1-pins { + rockchip,pins = + /* pcie20_clkreqn_m1 */ + <3 RK_PA6 4 &pcfg_pull_none>, + /* pcie20_perstn_m1 */ + <3 RK_PB0 4 &pcfg_pull_none>, + /* pcie20_waken_m1 */ + <3 RK_PA7 4 &pcfg_pull_none>; + }; + + pcie20_buttonrstn: pcie20-buttonrstn { + rockchip,pins = + /* pcie20_buttonrstn */ + <0 RK_PB0 3 &pcfg_pull_none>; + }; + }; + + pdm { + pdmm0_clk0: pdmm0-clk0 { + rockchip,pins = + /* pdm_clk0_m0 */ + <3 RK_PA6 3 &pcfg_pull_none>; + }; + + pdmm0_clk1: pdmm0-clk1 { + rockchip,pins = + /* pdm_clk1_m0 */ + <3 RK_PA2 3 &pcfg_pull_none>; + }; + + pdmm0_sdi0: pdmm0-sdi0 { + rockchip,pins = + /* pdm_sdi0_m0 */ + <3 RK_PB1 2 &pcfg_pull_none>; + }; + + pdmm0_sdi1: pdmm0-sdi1 { + rockchip,pins = + /* pdm_sdi1_m0 */ + <3 RK_PB0 3 &pcfg_pull_none>; + }; + + pdmm0_sdi2: pdmm0-sdi2 { + rockchip,pins = + /* pdm_sdi2_m0 */ + <3 RK_PA7 3 &pcfg_pull_none>; + }; + + pdmm0_sdi3: pdmm0-sdi3 { + rockchip,pins = + /* pdm_sdi3_m0 */ + <3 RK_PA0 3 &pcfg_pull_none>; + }; + + pdmm1_clk0: pdmm1-clk0 { + rockchip,pins = + /* pdm_clk0_m1 */ + <4 RK_PB7 4 &pcfg_pull_none>; + }; + + pdmm1_clk1: pdmm1-clk1 { + rockchip,pins = + /* pdm_clk1_m1 */ + <4 RK_PB1 5 &pcfg_pull_none>; + }; + + pdmm1_sdi0: pdmm1-sdi0 { + rockchip,pins = + /* pdm_sdi0_m1 */ + <4 RK_PA7 4 &pcfg_pull_none>; + }; + + pdmm1_sdi1: pdmm1-sdi1 { + rockchip,pins = + /* pdm_sdi1_m1 */ + <4 RK_PB0 4 &pcfg_pull_none>; + }; + + pdmm1_sdi2: pdmm1-sdi2 { + rockchip,pins = + /* pdm_sdi2_m1 */ + <4 RK_PA5 4 &pcfg_pull_none>; + }; + + pdmm1_sdi3: pdmm1-sdi3 { + rockchip,pins = + /* pdm_sdi3_m1 */ + <4 RK_PA6 4 &pcfg_pull_none>; + }; + }; + + pmic { + pmic_int: pmic-int { + rockchip,pins = + <0 RK_PA3 0 &pcfg_pull_up>; + }; + + soc_slppin_gpio: soc-slppin-gpio { + rockchip,pins = + <0 RK_PA2 0 &pcfg_output_low>; + }; + + soc_slppin_slp: soc-slppin-slp { + rockchip,pins = + <0 RK_PA2 1 &pcfg_pull_none>; + }; + }; + + pmu { + pmu_pins: pmu-pins { + rockchip,pins = + /* pmu_debug */ + <0 RK_PA5 3 &pcfg_pull_none>; + }; + }; + + pwm0 { + pwm0m0_pins: pwm0m0-pins { + rockchip,pins = + /* pwm0_m0 */ + <0 RK_PC3 2 &pcfg_pull_none>; + }; + + pwm0m1_pins: pwm0m1-pins { + rockchip,pins = + /* pwm0_m1 */ + <1 RK_PC5 4 &pcfg_pull_none>; + }; + }; + + pwm1 { + pwm1m0_pins: pwm1m0-pins { + rockchip,pins = + /* pwm1_m0 */ + <0 RK_PC4 2 &pcfg_pull_none>; + }; + + pwm1m1_pins: pwm1m1-pins { + rockchip,pins = + /* pwm1_m1 */ + <1 RK_PC6 4 &pcfg_pull_none>; + }; + }; + + pwm2 { + pwm2m0_pins: pwm2m0-pins { + rockchip,pins = + /* pwm2_m0 */ + <0 RK_PC5 2 &pcfg_pull_none>; + }; + + pwm2m1_pins: pwm2m1-pins { + rockchip,pins = + /* pwm2_m1 */ + <1 RK_PC7 3 &pcfg_pull_none>; + }; + }; + + pwm3 { + pwm3m0_pins: pwm3m0-pins { + rockchip,pins = + /* pwm3_m0 */ + <0 RK_PA7 1 &pcfg_pull_none>; + }; + + pwm3m1_pins: pwm3m1-pins { + rockchip,pins = + /* pwm3_m1 */ + <1 RK_PD0 3 &pcfg_pull_none>; + }; + }; + + pwm4 { + pwm4m0_pins: pwm4m0-pins { + rockchip,pins = + /* pwm4_m0 */ + <0 RK_PB7 2 &pcfg_pull_none>; + }; + + pwm4m1_pins: pwm4m1-pins { + rockchip,pins = + /* pwm4_m1 */ + <1 RK_PD1 4 &pcfg_pull_none>; + }; + }; + + pwm5 { + pwm5m0_pins: pwm5m0-pins { + rockchip,pins = + /* pwm5_m0 */ + <0 RK_PC2 2 &pcfg_pull_none>; + }; + + pwm5m1_pins: pwm5m1-pins { + rockchip,pins = + /* pwm5_m1 */ + <1 RK_PD2 4 &pcfg_pull_none>; + }; + }; + + pwm6 { + pwm6m0_pins: pwm6m0-pins { + rockchip,pins = + /* pwm6_m0 */ + <0 RK_PC1 2 &pcfg_pull_none>; + }; + + pwm6m1_pins: pwm6m1-pins { + rockchip,pins = + /* pwm6_m1 */ + <1 RK_PD3 4 &pcfg_pull_none>; + }; + }; + + pwm7 { + pwm7m0_pins: pwm7m0-pins { + rockchip,pins = + /* pwm7_m0 */ + <0 RK_PC0 2 &pcfg_pull_none>; + }; + + pwm7m1_pins: pwm7m1-pins { + rockchip,pins = + /* pwm7_m1 */ + <1 RK_PD4 4 &pcfg_pull_none>; + }; + }; + + pwm8 { + pwm8m0_pins: pwm8m0-pins { + rockchip,pins = + /* pwm8_m0 */ + <3 RK_PA4 2 &pcfg_pull_none>; + }; + + pwm8m1_pins: pwm8m1-pins { + rockchip,pins = + /* pwm8_m1 */ + <1 RK_PC1 4 &pcfg_pull_none>; + }; + }; + + pwm9 { + pwm9m0_pins: pwm9m0-pins { + rockchip,pins = + /* pwm9_m0 */ + <3 RK_PA5 2 &pcfg_pull_none>; + }; + + pwm9m1_pins: pwm9m1-pins { + rockchip,pins = + /* pwm9_m1 */ + <1 RK_PC2 4 &pcfg_pull_none>; + }; + }; + + pwm10 { + pwm10m0_pins: pwm10m0-pins { + rockchip,pins = + /* pwm10_m0 */ + <1 RK_PB5 5 &pcfg_pull_none>; + }; + + pwm10m1_pins: pwm10m1-pins { + rockchip,pins = + /* pwm10_m1 */ + <1 RK_PC3 4 &pcfg_pull_none>; + }; + }; + + pwm11 { + pwm11m0_pins: pwm11m0-pins { + rockchip,pins = + /* pwm11_m0 */ + <1 RK_PB6 5 &pcfg_pull_none>; + }; + + pwm11m1_pins: pwm11m1-pins { + rockchip,pins = + /* pwm11_m1 */ + <1 RK_PC4 4 &pcfg_pull_none>; + }; + }; + + pwm12 { + pwm12m0_pins: pwm12m0-pins { + rockchip,pins = + /* pwm12_m0 */ + <4 RK_PA1 4 &pcfg_pull_none>; + }; + + pwm12m1_pins: pwm12m1-pins { + rockchip,pins = + /* pwm12_m1 */ + <3 RK_PB4 5 &pcfg_pull_none>; + }; + }; + + pwm13 { + pwm13m0_pins: pwm13m0-pins { + rockchip,pins = + /* pwm13_m0 */ + <4 RK_PA4 3 &pcfg_pull_none>; + }; + + pwm13m1_pins: pwm13m1-pins { + rockchip,pins = + /* pwm13_m1 */ + <3 RK_PB5 5 &pcfg_pull_none>; + }; + }; + + pwm14 { + pwm14m0_pins: pwm14m0-pins { + rockchip,pins = + /* pwm14_m0 */ + <3 RK_PC5 4 &pcfg_pull_none>; + }; + + pwm14m1_pins: pwm14m1-pins { + rockchip,pins = + /* pwm14_m1 */ + <1 RK_PD7 5 &pcfg_pull_none>; + }; + }; + + pwm15 { + pwm15m0_pins: pwm15m0-pins { + rockchip,pins = + /* pwm15_m0 */ + <3 RK_PC6 4 &pcfg_pull_none>; + }; + + pwm15m1_pins: pwm15m1-pins { + rockchip,pins = + /* pwm15_m1 */ + <2 RK_PA0 5 &pcfg_pull_none>; + }; + }; + + pwr { + pwr_pins: pwr-pins { + rockchip,pins = + /* pwr_ctrl0 */ + <0 RK_PA2 1 &pcfg_pull_none>, + /* pwr_ctrl1 */ + <0 RK_PA3 1 &pcfg_pull_none>; + }; + }; + + ref { + ref_pins: ref-pins { + rockchip,pins = + /* ref_clk_out */ + <0 RK_PA0 1 &pcfg_pull_none>; + }; + }; + + rgmii { + rgmiim0_miim: rgmiim0-miim { + rockchip,pins = + /* rgmii_mdc_m0 */ + <4 RK_PB2 2 &pcfg_pull_none>, + /* rgmii_mdio_m0 */ + <4 RK_PB3 2 &pcfg_pull_none>; + }; + + rgmiim0_rx_er: rgmiim0-rx_er { + rockchip,pins = + /* rgmii_rxer_m0 */ + <4 RK_PB0 2 &pcfg_pull_none>; + }; + + rgmiim0_rx_bus2: rgmiim0-rx_bus2 { + rockchip,pins = + /* rgmii_rxd0_m0 */ + <4 RK_PA5 2 &pcfg_pull_none>, + /* rgmii_rxd1_m0 */ + <4 RK_PA6 2 &pcfg_pull_none>, + /* rgmii_rxdv_m0 */ + <4 RK_PA7 2 &pcfg_pull_none>; + }; + + rgmiim0_tx_bus2: rgmiim0-tx_bus2 { + rockchip,pins = + /* rgmii_txd0_m0 */ + <4 RK_PA2 2 &pcfg_pull_none>, + /* rgmii_txd1_m0 */ + <4 RK_PA3 2 &pcfg_pull_none>, + /* rgmii_txen_m0 */ + <4 RK_PA4 2 &pcfg_pull_none>; + }; + + rgmiim0_rgmii_clk: rgmiim0-rgmii_clk { + rockchip,pins = + /* rgmii_rxclk_m0 */ + <4 RK_PA1 2 &pcfg_pull_none>, + /* rgmii_txclk_m0 */ + <3 RK_PD6 2 &pcfg_pull_none>; + }; + + rgmiim0_rgmii_bus: rgmiim0-rgmii_bus { + rockchip,pins = + /* rgmii_rxd2_m0 */ + <3 RK_PD7 2 &pcfg_pull_none>, + /* rgmii_rxd3_m0 */ + <4 RK_PA0 2 &pcfg_pull_none>, + /* rgmii_txd2_m0 */ + <3 RK_PD4 2 &pcfg_pull_none>, + /* rgmii_txd3_m0 */ + <3 RK_PD5 2 &pcfg_pull_none>; + }; + + rgmiim0_clk: rgmiim0-clk { + rockchip,pins = + /* rgmiim0_clk */ + <4 RK_PB7 2 &pcfg_pull_none>; + }; + + rgmiim1_miim: rgmiim1-miim { + rockchip,pins = + /* rgmii_mdc_m1 */ + <1 RK_PC7 2 &pcfg_pull_none>, + /* rgmii_mdio_m1 */ + <1 RK_PD0 2 &pcfg_pull_none>; + }; + + rgmiim1_rx_er: rgmiim1-rx_er { + rockchip,pins = + /* rgmii_rxer_m1 */ + <2 RK_PA0 2 &pcfg_pull_none>; + }; + + rgmiim1_rx_bus2: rgmiim1-rx_bus2 { + rockchip,pins = + /* rgmii_rxd0_m1 */ + <1 RK_PD4 2 &pcfg_pull_none>, + /* rgmii_rxd1_m1 */ + <1 RK_PD7 2 &pcfg_pull_none>, + /* rgmii_rxdv_m1 */ + <1 RK_PD6 2 &pcfg_pull_none>; + }; + + rgmiim1_tx_bus2: rgmiim1-tx_bus2 { + rockchip,pins = + /* rgmii_txd0_m1 */ + <1 RK_PD1 2 &pcfg_pull_none>, + /* rgmii_txd1_m1 */ + <1 RK_PD2 2 &pcfg_pull_none>, + /* rgmii_txen_m1 */ + <1 RK_PD3 2 &pcfg_pull_none>; + }; + + rgmiim1_rgmii_clk: rgmiim1-rgmii_clk { + rockchip,pins = + /* rgmii_rxclk_m1 */ + <1 RK_PC6 2 &pcfg_pull_none>, + /* rgmii_txclk_m1 */ + <1 RK_PC3 2 &pcfg_pull_none>; + }; + + rgmiim1_rgmii_bus: rgmiim1-rgmii_bus { + rockchip,pins = + /* rgmii_rxd2_m1 */ + <1 RK_PC4 2 &pcfg_pull_none>, + /* rgmii_rxd3_m1 */ + <1 RK_PC5 2 &pcfg_pull_none>, + /* rgmii_txd2_m1 */ + <1 RK_PC1 2 &pcfg_pull_none>, + /* rgmii_txd3_m1 */ + <1 RK_PC2 2 &pcfg_pull_none>; + }; + + rgmiim1_clk: rgmiim1-clk { + rockchip,pins = + /* rgmiim1_clk */ + <1 RK_PD5 2 &pcfg_pull_none>; + }; + }; + + rmii { + rmii_pins: rmii-pins { + rockchip,pins = + /* rmii_clk */ + <1 RK_PD5 5 &pcfg_pull_none>, + /* rmii_mdc */ + <1 RK_PC7 5 &pcfg_pull_none>, + /* rmii_mdio */ + <1 RK_PD0 5 &pcfg_pull_none>, + /* rmii_rxd0 */ + <1 RK_PD4 5 &pcfg_pull_none>, + /* rmii_rxd1 */ + <1 RK_PD7 6 &pcfg_pull_none>, + /* rmii_rxdv_crs */ + <1 RK_PD6 5 &pcfg_pull_none>, + /* rmii_rxer */ + <2 RK_PA0 6 &pcfg_pull_none>, + /* rmii_txd0 */ + <1 RK_PD1 5 &pcfg_pull_none>, + /* rmii_txd1 */ + <1 RK_PD2 5 &pcfg_pull_none>, + /* rmii_txen */ + <1 RK_PD3 5 &pcfg_pull_none>; + }; + }; + + sdmmc0_pins: sdmmc0-pins { + sdmmc0_bus4: sdmmc0-bus4 { + rockchip,pins = + /* sdmmc0_d0 */ + <1 RK_PB3 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc0_d1 */ + <1 RK_PB4 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc0_d2 */ + <1 RK_PB5 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc0_d3 */ + <1 RK_PB6 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc0_clk: sdmmc0-clk { + rockchip,pins = + /* sdmmc0_clk */ + <1 RK_PC0 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc0_cmd: sdmmc0-cmd { + rockchip,pins = + /* sdmmc0_cmd */ + <1 RK_PB7 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc0_det: sdmmc0-det { + rockchip,pins = + /* sdmmc0_detn */ + <0 RK_PA4 1 &pcfg_pull_up>; + }; + + sdmmc0_pwren: sdmmc0-pwren { + rockchip,pins = + /* sdmmc0_pwren */ + <0 RK_PA5 1 &pcfg_pull_none>; + }; + }; + + sdmmc1 { + sdmmc1_bus4: sdmmc1-bus4 { + rockchip,pins = + /* sdmmc1_d0 */ + <1 RK_PC1 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc1_d1 */ + <1 RK_PC2 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc1_d2 */ + <1 RK_PC3 1 &pcfg_pull_up_drv_level_2>, + /* sdmmc1_d3 */ + <1 RK_PC4 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc1_clk: sdmmc1-clk { + rockchip,pins = + /* sdmmc1_clk */ + <1 RK_PC6 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc1_cmd: sdmmc1-cmd { + rockchip,pins = + /* sdmmc1_cmd */ + <1 RK_PC5 1 &pcfg_pull_up_drv_level_2>; + }; + + sdmmc1_det: sdmmc1-det { + rockchip,pins = + /* sdmmc1_detn */ + <1 RK_PD0 1 &pcfg_pull_up>; + }; + + sdmmc1_pwren: sdmmc1-pwren { + rockchip,pins = + /* sdmmc1_pwren */ + <1 RK_PC7 1 &pcfg_pull_none>; + }; + }; + + spdif { + spdifm0_pins: spdifm0-pins { + rockchip,pins = + /* spdif_tx_m0 */ + <3 RK_PA1 3 &pcfg_pull_none>; + }; + + spdifm1_pins: spdifm1-pins { + rockchip,pins = + /* spdif_tx_m1 */ + <0 RK_PB7 4 &pcfg_pull_none>; + }; + + spdifm2_pins: spdifm2-pins { + rockchip,pins = + /* spdif_tx_m2 */ + <1 RK_PB7 2 &pcfg_pull_none>; + }; + }; + + spi0 { + spi0m0_pins: spi0m0-pins { + rockchip,pins = + /* spi0_clk_m0 */ + <0 RK_PC3 3 &pcfg_pull_none>, + /* spi0_miso_m0 */ + <0 RK_PC5 3 &pcfg_pull_none>, + /* spi0_mosi_m0 */ + <0 RK_PC4 3 &pcfg_pull_none>; + }; + + spi0m0_csn0: spi0m0-csn0 { + rockchip,pins = + /* spi0m0_csn0 */ + <0 RK_PC2 3 &pcfg_pull_none>; + }; + spi0m0_csn1: spi0m0-csn1 { + rockchip,pins = + /* spi0m0_csn1 */ + <0 RK_PB7 1 &pcfg_pull_none>; + }; + + spi0m1_pins: spi0m1-pins { + rockchip,pins = + /* spi0_clk_m1 */ + <3 RK_PB5 4 &pcfg_pull_none>, + /* spi0_miso_m1 */ + <3 RK_PC0 4 &pcfg_pull_none>, + /* spi0_mosi_m1 */ + <3 RK_PB4 4 &pcfg_pull_none>; + }; + + spi0m1_csn0: spi0m1-csn0 { + rockchip,pins = + /* spi0m1_csn0 */ + <3 RK_PB7 4 &pcfg_pull_none>; + }; + spi0m1_csn1: spi0m1-csn1 { + rockchip,pins = + /* spi0m1_csn1 */ + <3 RK_PB6 4 &pcfg_pull_none>; + }; + }; + + spi1 { + spi1m0_pins: spi1m0-pins { + rockchip,pins = + /* spi1_clk_m0 */ + <3 RK_PD6 4 &pcfg_pull_none>, + /* spi1_miso_m0 */ + <4 RK_PA3 4 &pcfg_pull_none>, + /* spi1_mosi_m0 */ + <4 RK_PA2 4 &pcfg_pull_none>; + }; + + spi1m0_csn0: spi1m0-csn0 { + rockchip,pins = + /* spi1m0_csn0 */ + <3 RK_PD7 4 &pcfg_pull_none>; + }; + spi1m0_csn1: spi1m0-csn1 { + rockchip,pins = + /* spi1m0_csn1 */ + <4 RK_PA0 4 &pcfg_pull_none>; + }; + + spi1m1_pins: spi1m1-pins { + rockchip,pins = + /* spi1_clk_m1 */ + <1 RK_PC0 4 &pcfg_pull_none>, + /* spi1_miso_m1 */ + <1 RK_PB4 4 &pcfg_pull_none>, + /* spi1_mosi_m1 */ + <1 RK_PB3 4 &pcfg_pull_none>; + }; + + spi1m1_csn0: spi1m1-csn0 { + rockchip,pins = + /* spi1m1_csn0 */ + <1 RK_PB6 4 &pcfg_pull_none>; + }; + spi1m1_csn1: spi1m1-csn1 { + rockchip,pins = + /* spi1m1_csn1 */ + <1 RK_PB5 4 &pcfg_pull_none>; + }; + }; + + spi2 { + spi2m0_pins: spi2m0-pins { + rockchip,pins = + /* spi2_clk_m0 */ + <4 RK_PB6 4 &pcfg_pull_none>, + /* spi2_miso_m0 */ + <3 RK_PD2 4 &pcfg_pull_none>, + /* spi2_mosi_m0 */ + <3 RK_PD3 4 &pcfg_pull_none>; + }; + + spi2m0_csn0: spi2m0-csn0 { + rockchip,pins = + /* spi2m0_csn0 */ + <4 RK_PB5 4 &pcfg_pull_none>; + }; + spi2m0_csn1: spi2m0-csn1 { + rockchip,pins = + /* spi2m0_csn1 */ + <4 RK_PB4 4 &pcfg_pull_none>; + }; + + spi2m1_pins: spi2m1-pins { + rockchip,pins = + /* spi2_clk_m1 */ + <2 RK_PA1 4 &pcfg_pull_none>, + /* spi2_miso_m1 */ + <2 RK_PA0 4 &pcfg_pull_none>, + /* spi2_mosi_m1 */ + <1 RK_PD7 4 &pcfg_pull_none>; + }; + + spi2m1_csn0: spi2m1-csn0 { + rockchip,pins = + /* spi2m1_csn0 */ + <1 RK_PD6 4 &pcfg_pull_none>; + }; + spi2m1_csn1: spi2m1-csn1 { + rockchip,pins = + /* spi2m1_csn1 */ + <1 RK_PD5 4 &pcfg_pull_none>; + }; + }; + + tsadc { + tsadcm0_pins: tsadcm0-pins { + rockchip,pins = + /* tsadc_shut_m0 */ + <0 RK_PA1 1 &pcfg_pull_none>; + }; + + tsadcm1_pins: tsadcm1-pins { + rockchip,pins = + /* tsadc_shut_m1 */ + <0 RK_PA2 2 &pcfg_pull_none>; + }; + + tsadc_shut_org: tsadc-shut-org { + rockchip,pins = + /* tsadc_shut_org */ + <0 RK_PA1 2 &pcfg_pull_none>; + }; + }; + + uart0 { + uart0m0_xfer: uart0m0-xfer { + rockchip,pins = + /* uart0_rx_m0 */ + <0 RK_PD0 1 &pcfg_pull_up>, + /* uart0_tx_m0 */ + <0 RK_PD1 1 &pcfg_pull_up>; + }; + + uart0m1_xfer: uart0m1-xfer { + rockchip,pins = + /* uart0_rx_m1 */ + <1 RK_PB3 2 &pcfg_pull_up>, + /* uart0_tx_m1 */ + <1 RK_PB4 2 &pcfg_pull_up>; + }; + }; + + uart1 { + uart1m0_xfer: uart1m0-xfer { + rockchip,pins = + /* uart1_rx_m0 */ + <1 RK_PD1 1 &pcfg_pull_up>, + /* uart1_tx_m0 */ + <1 RK_PD2 1 &pcfg_pull_up>; + }; + + uart1m0_ctsn: uart1m0-ctsn { + rockchip,pins = + /* uart1m0_ctsn */ + <1 RK_PD4 1 &pcfg_pull_none>; + }; + uart1m0_rtsn: uart1m0-rtsn { + rockchip,pins = + /* uart1m0_rtsn */ + <1 RK_PD3 1 &pcfg_pull_none>; + }; + + uart1m1_xfer: uart1m1-xfer { + rockchip,pins = + /* uart1_rx_m1 */ + <4 RK_PA6 3 &pcfg_pull_up>, + /* uart1_tx_m1 */ + <4 RK_PA5 3 &pcfg_pull_up>; + }; + + uart1m1_ctsn: uart1m1-ctsn { + rockchip,pins = + /* uart1m1_ctsn */ + <4 RK_PB0 3 &pcfg_pull_none>; + }; + uart1m1_rtsn: uart1m1-rtsn { + rockchip,pins = + /* uart1m1_rtsn */ + <4 RK_PA7 3 &pcfg_pull_none>; + }; + }; + + uart2 { + uart2m0_xfer: uart2m0-xfer { + rockchip,pins = + /* uart2_rx_m0 */ + <0 RK_PC1 1 &pcfg_pull_up>, + /* uart2_tx_m0 */ + <0 RK_PC0 1 &pcfg_pull_up>; + }; + + uart2m0_ctsn: uart2m0-ctsn { + rockchip,pins = + /* uart2m0_ctsn */ + <0 RK_PC2 1 &pcfg_pull_none>; + }; + uart2m0_rtsn: uart2m0-rtsn { + rockchip,pins = + /* uart2m0_rtsn */ + <0 RK_PC3 1 &pcfg_pull_none>; + }; + + uart2m1_xfer: uart2m1-xfer { + rockchip,pins = + /* uart2_rx_m1 */ + <3 RK_PA1 2 &pcfg_pull_up>, + /* uart2_tx_m1 */ + <3 RK_PA0 2 &pcfg_pull_up>; + }; + + uart2m1_ctsn: uart2m1-ctsn { + rockchip,pins = + /* uart2m1_ctsn */ + <3 RK_PA2 2 &pcfg_pull_none>; + }; + uart2m1_rtsn: uart2m1-rtsn { + rockchip,pins = + /* uart2m1_rtsn */ + <3 RK_PA3 2 &pcfg_pull_none>; + }; + }; + + uart3 { + uart3m0_xfer: uart3m0-xfer { + rockchip,pins = + /* uart3_rx_m0 */ + <4 RK_PB5 6 &pcfg_pull_up>, + /* uart3_tx_m0 */ + <4 RK_PB4 6 &pcfg_pull_up>; + }; + + uart3m0_ctsn: uart3m0-ctsn { + rockchip,pins = + /* uart3m0_ctsn */ + <4 RK_PB6 3 &pcfg_pull_none>; + }; + uart3m0_rtsn: uart3m0-rtsn { + rockchip,pins = + /* uart3m0_rtsn */ + <3 RK_PD1 4 &pcfg_pull_none>; + }; + + uart3m1_xfer: uart3m1-xfer { + rockchip,pins = + /* uart3_rx_m1 */ + <3 RK_PC0 3 &pcfg_pull_up>, + /* uart3_tx_m1 */ + <3 RK_PB7 3 &pcfg_pull_up>; + }; + + uart3m1_ctsn: uart3m1-ctsn { + rockchip,pins = + /* uart3m1_ctsn */ + <3 RK_PB6 3 &pcfg_pull_none>; + }; + uart3m1_rtsn: uart3m1-rtsn { + rockchip,pins = + /* uart3m1_rtsn */ + <3 RK_PC1 3 &pcfg_pull_none>; + }; + }; + + uart4 { + uart4m0_xfer: uart4m0-xfer { + rockchip,pins = + /* uart4_rx_m0 */ + <3 RK_PD1 3 &pcfg_pull_up>, + /* uart4_tx_m0 */ + <3 RK_PD0 3 &pcfg_pull_up>; + }; + + uart4m0_ctsn: uart4m0-ctsn { + rockchip,pins = + /* uart4m0_ctsn */ + <3 RK_PC5 3 &pcfg_pull_none>; + }; + uart4m0_rtsn: uart4m0-rtsn { + rockchip,pins = + /* uart4m0_rtsn */ + <3 RK_PC6 3 &pcfg_pull_none>; + }; + + uart4m1_xfer: uart4m1-xfer { + rockchip,pins = + /* uart4_rx_m1 */ + <1 RK_PD5 3 &pcfg_pull_up>, + /* uart4_tx_m1 */ + <1 RK_PD6 3 &pcfg_pull_up>; + }; + + uart4m1_ctsn: uart4m1-ctsn { + rockchip,pins = + /* uart4m1_ctsn */ + <2 RK_PA0 3 &pcfg_pull_none>; + }; + uart4m1_rtsn: uart4m1-rtsn { + rockchip,pins = + /* uart4m1_rtsn */ + <1 RK_PD7 3 &pcfg_pull_none>; + }; + }; + + uart5 { + uart5m0_xfer: uart5m0-xfer { + rockchip,pins = + /* uart5_rx_m0 */ + <1 RK_PB7 3 &pcfg_pull_up>, + /* uart5_tx_m0 */ + <1 RK_PC0 3 &pcfg_pull_up>; + }; + + uart5m0_ctsn: uart5m0-ctsn { + rockchip,pins = + /* uart5m0_ctsn */ + <1 RK_PB5 3 &pcfg_pull_none>; + }; + uart5m0_rtsn: uart5m0-rtsn { + rockchip,pins = + /* uart5m0_rtsn */ + <1 RK_PB6 3 &pcfg_pull_none>; + }; + + uart5m1_xfer: uart5m1-xfer { + rockchip,pins = + /* uart5_rx_m1 */ + <3 RK_PA7 5 &pcfg_pull_up>, + /* uart5_tx_m1 */ + <3 RK_PA6 5 &pcfg_pull_up>; + }; + + uart5m1_ctsn: uart5m1-ctsn { + rockchip,pins = + /* uart5m1_ctsn */ + <3 RK_PA0 5 &pcfg_pull_none>; + }; + uart5m1_rtsn: uart5m1-rtsn { + rockchip,pins = + /* uart5m1_rtsn */ + <3 RK_PA1 5 &pcfg_pull_none>; + }; + }; + + uart6 { + uart6m0_xfer: uart6m0-xfer { + rockchip,pins = + /* uart6_rx_m0 */ + <0 RK_PC7 1 &pcfg_pull_up>, + /* uart6_tx_m0 */ + <0 RK_PC6 1 &pcfg_pull_up>; + }; + + uart6m0_ctsn: uart6m0-ctsn { + rockchip,pins = + /* uart6m0_ctsn */ + <0 RK_PC4 1 &pcfg_pull_none>; + }; + uart6m0_rtsn: uart6m0-rtsn { + rockchip,pins = + /* uart6m0_rtsn */ + <0 RK_PC5 1 &pcfg_pull_none>; + }; + + uart6m1_xfer: uart6m1-xfer { + rockchip,pins = + /* uart6_rx_m1 */ + <4 RK_PB0 5 &pcfg_pull_up>, + /* uart6_tx_m1 */ + <4 RK_PA7 5 &pcfg_pull_up>; + }; + + uart6m1_ctsn: uart6m1-ctsn { + rockchip,pins = + /* uart6m1_ctsn */ + <4 RK_PA2 3 &pcfg_pull_none>; + }; + uart6m1_rtsn: uart6m1-rtsn { + rockchip,pins = + /* uart6m1_rtsn */ + <4 RK_PA3 3 &pcfg_pull_none>; + }; + }; + + uart7 { + uart7m0_xfer: uart7m0-xfer { + rockchip,pins = + /* uart7_rx_m0 */ + <3 RK_PC7 3 &pcfg_pull_up>, + /* uart7_tx_m0 */ + <3 RK_PC4 3 &pcfg_pull_up>; + }; + + uart7m0_ctsn: uart7m0-ctsn { + rockchip,pins = + /* uart7m0_ctsn */ + <3 RK_PD2 3 &pcfg_pull_none>; + }; + uart7m0_rtsn: uart7m0-rtsn { + rockchip,pins = + /* uart7m0_rtsn */ + <3 RK_PD3 3 &pcfg_pull_none>; + }; + + uart7m1_xfer: uart7m1-xfer { + rockchip,pins = + /* uart7_rx_m1 */ + <1 RK_PB3 3 &pcfg_pull_up>, + /* uart7_tx_m1 */ + <1 RK_PB4 3 &pcfg_pull_up>; + }; + }; + + uart8 { + uart8m0_xfer: uart8m0-xfer { + rockchip,pins = + /* uart8_rx_m0 */ + <3 RK_PB3 3 &pcfg_pull_up>, + /* uart8_tx_m0 */ + <3 RK_PB2 3 &pcfg_pull_up>; + }; + + uart8m0_ctsn: uart8m0-ctsn { + rockchip,pins = + /* uart8m0_ctsn */ + <3 RK_PB4 3 &pcfg_pull_none>; + }; + uart8m0_rtsn: uart8m0-rtsn { + rockchip,pins = + /* uart8m0_rtsn */ + <3 RK_PB5 3 &pcfg_pull_none>; + }; + + uart8m1_xfer: uart8m1-xfer { + rockchip,pins = + /* uart8_rx_m1 */ + <3 RK_PD5 3 &pcfg_pull_up>, + /* uart8_tx_m1 */ + <3 RK_PD4 3 &pcfg_pull_up>; + }; + + uart8m1_ctsn: uart8m1-ctsn { + rockchip,pins = + /* uart8m1_ctsn */ + <3 RK_PD7 3 &pcfg_pull_none>; + }; + uart8m1_rtsn: uart8m1-rtsn { + rockchip,pins = + /* uart8m1_rtsn */ + <4 RK_PA0 3 &pcfg_pull_none>; + }; + }; + + uart9 { + uart9m0_xfer: uart9m0-xfer { + rockchip,pins = + /* uart9_rx_m0 */ + <4 RK_PB3 3 &pcfg_pull_up>, + /* uart9_tx_m0 */ + <4 RK_PB2 3 &pcfg_pull_up>; + }; + + uart9m0_ctsn: uart9m0-ctsn { + rockchip,pins = + /* uart9m0_ctsn */ + <4 RK_PB4 3 &pcfg_pull_none>; + }; + uart9m0_rtsn: uart9m0-rtsn { + rockchip,pins = + /* uart9m0_rtsn */ + <4 RK_PB5 3 &pcfg_pull_none>; + }; + + uart9m1_xfer: uart9m1-xfer { + rockchip,pins = + /* uart9_rx_m1 */ + <3 RK_PC3 3 &pcfg_pull_up>, + /* uart9_tx_m1 */ + <3 RK_PC2 3 &pcfg_pull_up>; + }; + }; + + vo { + vo_pins: vo-pins { + rockchip,pins = + /* vo_lcdc_clk */ + <4 RK_PB7 1 &pcfg_pull_none>, + /* vo_lcdc_d0 */ + <4 RK_PA4 1 &pcfg_pull_none>, + /* vo_lcdc_d1 */ + <4 RK_PA5 1 &pcfg_pull_none>, + /* vo_lcdc_d2 */ + <4 RK_PB2 1 &pcfg_pull_none>, + /* vo_lcdc_d3 */ + <3 RK_PC4 1 &pcfg_pull_none>, + /* vo_lcdc_d4 */ + <3 RK_PC5 1 &pcfg_pull_none>, + /* vo_lcdc_d5 */ + <3 RK_PC6 1 &pcfg_pull_none>, + /* vo_lcdc_d6 */ + <3 RK_PC7 1 &pcfg_pull_none>, + /* vo_lcdc_d7 */ + <3 RK_PD0 1 &pcfg_pull_none>, + /* vo_lcdc_d8 */ + <4 RK_PA6 1 &pcfg_pull_none>, + /* vo_lcdc_d9 */ + <4 RK_PA7 1 &pcfg_pull_none>, + /* vo_lcdc_d10 */ + <3 RK_PD1 1 &pcfg_pull_none>, + /* vo_lcdc_d11 */ + <3 RK_PD2 1 &pcfg_pull_none>, + /* vo_lcdc_d12 */ + <3 RK_PD3 1 &pcfg_pull_none>, + /* vo_lcdc_d13 */ + <3 RK_PD4 1 &pcfg_pull_none>, + /* vo_lcdc_d14 */ + <3 RK_PD5 1 &pcfg_pull_none>, + /* vo_lcdc_d15 */ + <3 RK_PD6 1 &pcfg_pull_none>, + /* vo_lcdc_d16 */ + <4 RK_PB0 1 &pcfg_pull_none>, + /* vo_lcdc_d17 */ + <4 RK_PB1 1 &pcfg_pull_none>, + /* vo_lcdc_d18 */ + <4 RK_PB3 1 &pcfg_pull_none>, + /* vo_lcdc_d19 */ + <3 RK_PD7 1 &pcfg_pull_none>, + /* vo_lcdc_d20 */ + <4 RK_PA0 1 &pcfg_pull_none>, + /* vo_lcdc_d21 */ + <4 RK_PA1 1 &pcfg_pull_none>, + /* vo_lcdc_d22 */ + <4 RK_PA2 1 &pcfg_pull_none>, + /* vo_lcdc_d23 */ + <4 RK_PA3 1 &pcfg_pull_none>, + /* vo_lcdc_den */ + <4 RK_PB6 1 &pcfg_pull_none>, + /* vo_lcdc_hsync */ + <4 RK_PB4 1 &pcfg_pull_none>, + /* vo_lcdc_vsync */ + <4 RK_PB5 1 &pcfg_pull_none>; + }; + }; +}; diff --git a/u-boot/arch/arm/dts/rk3562-u-boot.dtsi b/u-boot/arch/arm/dts/rk3562-u-boot.dtsi new file mode 100644 index 0000000..98c2e70 --- /dev/null +++ b/u-boot/arch/arm/dts/rk3562-u-boot.dtsi @@ -0,0 +1,203 @@ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +/ { + aliases { + mmc0 = &sdhci; + mmc1 = &sdmmc0; + }; + + chosen { + stdout-path = &uart2; + u-boot,spl-boot-order = &sdmmc0, &sdhci, &spi_nand, &spi_nor; + }; + + secure-otp@ff920000 { + compatible = "rockchip,rk3562-secure-otp"; + reg = <0x0 0xff920000 0x0 0x4000>; + secure_conf = <0xff020034>; + mask_addr = <0x0>; + cru_rst_addr = <0xff130438>; + u-boot,dm-spl; + status = "okay"; + }; +}; + +&sys_grf { + u-boot,dm-spl; + status = "okay"; +}; + +&ioc_grf { + u-boot,dm-spl; + status = "okay"; +}; + +&pmu_grf { + u-boot,dm-spl; + status = "okay"; +}; + +&usbphy_grf { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&firmware { + u-boot,dm-spl; +}; + +&scmi { + u-boot,dm-spl; +}; + +&scmi_clk { + u-boot,dm-spl; +}; + +&scmi_shmem { + u-boot,dm-spl; +}; + +&cru { + u-boot,dm-spl; + status = "okay"; +}; + +&crypto { + u-boot,dm-spl; + status = "okay"; +}; + +&rng { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&uart2 { + clock-frequency = <24000000>; + u-boot,dm-spl; + status = "okay"; +}; + +&saradc0 { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&psci { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&sdhci { + bus-width = <8>; + u-boot,dm-spl; + /delete-property/ pinctrl-names; + /delete-property/ pinctrl-0; + mmc-hs400-1_8v; + mmc-hs400-enhanced-strobe; + fixed-emmc-driver-type = <1>; + status = "okay"; +}; + +&sdmmc0 { + u-boot,dm-spl; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>; + status = "okay"; +}; + +&sdmmc0_pins { + u-boot,dm-spl; +}; + +&sdmmc0_bus4 { + u-boot,dm-spl; +}; + +&sdmmc0_clk { + u-boot,dm-spl; +}; + +&sdmmc0_cmd { + u-boot,dm-spl; +}; + +&sdmmc0_det { + u-boot,dm-spl; +}; + +&sfc { + u-boot,dm-spl; + status = "okay"; + + #address-cells = <1>; + #size-cells = <0>; + spi_nand: flash@0 { + u-boot,dm-spl; + compatible = "spi-nand"; + reg = <0>; + spi-tx-bus-width = <1>; + spi-rx-bus-width = <4>; + spi-max-frequency = <80000000>; + }; + + spi_nor: flash@1 { + u-boot,dm-spl; + compatible = "jedec,spi-nor"; + label = "sfc_nor"; + reg = <0>; + spi-tx-bus-width = <1>; + spi-rx-bus-width = <4>; + spi-max-frequency = <80000000>; + }; +}; + +&pinctrl { + u-boot,dm-spl; + status = "okay"; +}; + +&gpio0 { + u-boot,dm-pre-reloc; +}; + +&gpio1 { + u-boot,dm-pre-reloc; +}; + +&gpio2 { + u-boot,dm-pre-reloc; +}; + +&gpio3 { + u-boot,dm-pre-reloc; +}; + +&gpio4 { + u-boot,dm-pre-reloc; +}; + +&pcfg_pull_up_drv_level_2 { + u-boot,dm-spl; + status = "okay"; +}; + +&pcfg_pull_up { + u-boot,dm-spl; + status = "okay"; +}; + +&u2phy { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&u2phy_otg { + u-boot,dm-pre-reloc; + status = "okay"; +}; diff --git a/u-boot/arch/arm/dts/rk3562.dtsi b/u-boot/arch/arm/dts/rk3562.dtsi new file mode 100644 index 0000000..af9d278 --- /dev/null +++ b/u-boot/arch/arm/dts/rk3562.dtsi @@ -0,0 +1,2325 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ + +#include <dt-bindings/clock/rk3562-cru.h> +#include <dt-bindings/interrupt-controller/arm-gic.h> +#include <dt-bindings/interrupt-controller/irq.h> +#include <dt-bindings/phy/phy.h> +#include <dt-bindings/power/rk3562-power.h> +#include <dt-bindings/pinctrl/rockchip.h> +#include <dt-bindings/soc/rockchip,boot-mode.h> +#include <dt-bindings/soc/rockchip-system-status.h> +#include <dt-bindings/thermal/thermal.h> + +/ { + compatible = "rockchip,rk3562"; + + interrupt-parent = <&gic>; + #address-cells = <2>; + #size-cells = <2>; + + aliases { + csi2dphy0 = &csi2_dphy0; + csi2dphy1 = &csi2_dphy1; + csi2dphy2 = &csi2_dphy2; + csi2dphy3 = &csi2_dphy3; + csi2dphy4 = &csi2_dphy4; + csi2dphy5 = &csi2_dphy5; + ethernet0 = &gmac0; + ethernet1 = &gmac1; + gpio0 = &gpio0; + gpio1 = &gpio1; + gpio2 = &gpio2; + gpio3 = &gpio3; + gpio4 = &gpio4; + i2c0 = &i2c0; + i2c1 = &i2c1; + i2c2 = &i2c2; + i2c3 = &i2c3; + i2c4 = &i2c4; + i2c5 = &i2c5; + rkcif_mipi_lvds0= &rkcif_mipi_lvds; + rkcif_mipi_lvds1= &rkcif_mipi_lvds1; + rkcif_mipi_lvds2= &rkcif_mipi_lvds2; + rkcif_mipi_lvds3= &rkcif_mipi_lvds3; + serial0 = &uart0; + serial1 = &uart1; + serial2 = &uart2; + serial3 = &uart3; + serial4 = &uart4; + serial5 = &uart5; + serial6 = &uart6; + serial7 = &uart7; + serial8 = &uart8; + serial9 = &uart9; + spi0 = &spi0; + spi1 = &spi1; + spi2 = &spi2; + spi3 = &sfc; + }; + + clocks { + compatible = "simple-bus"; + #address-cells = <2>; + #size-cells = <2>; + ranges; + + xin32k: xin32k { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "xin32k"; + }; + + xin24m: xin24m { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <24000000>; + clock-output-names = "xin24m"; + }; + + aclk_vepu: aclk_vepu@ff100324 { + compatible = "rockchip,rk3562-clock-gate-link"; + reg = <0 0xff100324 0 0x10>; + clock-names = "link"; + clocks = <&cru ACLK_ISP>; + #power-domain-cells = <1>; + #clock-cells = <0>; + }; + + aclk_vdpu: aclk_vdpu@ff100328 { + compatible = "rockchip,rk3562-clock-gate-link"; + reg = <0 0xff100328 0 0x10>; + clock-names = "link"; + clocks = <&cru ACLK_TOP_VIO>; + #power-domain-cells = <1>; + #clock-cells = <0>; + }; + + aclk_vi_isp: aclk_vi_isp@ff10032c { + compatible = "rockchip,rk3562-clock-gate-link"; + reg = <0 0xff10032c 0 0x10>; + clock-names = "link"; + clocks = <&cru ACLK_TOP_VIO>; + #power-domain-cells = <1>; + #clock-cells = <0>; + }; + + aclk_vo: aclk_vo@ff100334 { + compatible = "rockchip,rk3562-clock-gate-link"; + reg = <0 0xff100334 0 0x10>; + clock-names = "link"; + clocks = <&cru ACLK_TOP_VIO>; + #power-domain-cells = <1>; + #clock-cells = <0>; + }; + + aclk_rga_jdec: aclk_rga_jdec@ff100338 { + compatible = "rockchip,rk3562-clock-gate-link"; + reg = <0 0xff100338 0 0x10>; + clock-names = "link"; + clocks = <&cru ACLK_VOP>; + #power-domain-cells = <1>; + #clock-cells = <0>; + }; + }; + + cpus { + #address-cells = <2>; + #size-cells = <0>; + + cpu0: cpu@0 { + device_type = "cpu"; + compatible = "arm,cortex-a53"; + reg = <0x0 0x0>; + enable-method = "psci"; + clocks = <&cru ARMCLK>; + operating-points-v2 = <&cpu0_opp_table>; + }; + cpu1: cpu@1 { + device_type = "cpu"; + compatible = "arm,cortex-a53"; + reg = <0x0 0x1>; + enable-method = "psci"; + clocks = <&cru ARMCLK>; + operating-points-v2 = <&cpu0_opp_table>; + }; + cpu2: cpu@2 { + device_type = "cpu"; + compatible = "arm,cortex-a53"; + reg = <0x0 0x2>; + enable-method = "psci"; + clocks = <&cru ARMCLK>; + operating-points-v2 = <&cpu0_opp_table>; + }; + cpu3: cpu@3 { + device_type = "cpu"; + compatible = "arm,cortex-a53"; + reg = <0x0 0x3>; + enable-method = "psci"; + clocks = <&cru ARMCLK>; + operating-points-v2 = <&cpu0_opp_table>; + }; + }; + + cpu0_opp_table: cpu0-opp-table { + compatible = "operating-points-v2"; + opp-shared; + + nvmem-cells = <&cpu_leakage>; + nvmem-cell-names = "leakage"; + + opp-408000000 { + opp-hz = /bits/ 64 <408000000>; + opp-microvolt = <900000 900000 1100000>; + clock-latency-ns = <40000>; + opp-suspend; + }; + opp-600000000 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <900000 900000 1100000>; + clock-latency-ns = <40000>; + }; + opp-816000000 { + opp-hz = /bits/ 64 <816000000>; + opp-microvolt = <900000 900000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1008000000 { + opp-hz = /bits/ 64 <1008000000>; + opp-microvolt = <900000 900000 1100000>; + clock-latency-ns = <40000>; + }; + opp-1200000000 { + opp-hz = /bits/ 64 <1200000000>; + opp-microvolt = <900000 900000 1100000>; + clock-latency-ns = <40000>; + }; + }; + + arm-pmu { + compatible = "arm,cortex-a53-pmu"; + interrupts = <GIC_SPI 228 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 229 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 230 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 231 IRQ_TYPE_LEVEL_HIGH>; + interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; + }; + + cpuinfo { + compatible = "rockchip,cpuinfo"; + nvmem-cells = <&otp_id>, <&otp_cpu_version>, <&cpu_code>; + nvmem-cell-names = "id", "cpu-version", "cpu-code"; + }; + + /* dphy0 full mode */ + csi2_dphy0: csi2-dphy0 { + compatible = "rockchip,rk3562-csi2-dphy"; + rockchip,hw = <&csi2_dphy0_hw>; + status = "disabled"; + }; + + /* dphy0 split mode 01 */ + csi2_dphy1: csi2-dphy1 { + compatible = "rockchip,rk3562-csi2-dphy"; + rockchip,hw = <&csi2_dphy0_hw>; + status = "disabled"; + }; + + /* dphy0 split mode 23 */ + csi2_dphy2: csi2-dphy2 { + compatible = "rockchip,rk3562-csi2-dphy"; + rockchip,hw = <&csi2_dphy0_hw>; + status = "disabled"; + }; + + /* dphy1 full mode */ + csi2_dphy3: csi2-dphy3 { + compatible = "rockchip,rk3562-csi2-dphy"; + rockchip,hw = <&csi2_dphy1_hw>; + status = "disabled"; + }; + + /* dphy1 split mode 01 */ + csi2_dphy4: csi2-dphy4 { + compatible = "rockchip,rk3562-csi2-dphy"; + rockchip,hw = <&csi2_dphy1_hw>; + status = "disabled"; + }; + + /* dphy1 split mode 23 */ + csi2_dphy5: csi2-dphy5 { + compatible = "rockchip,rk3562-csi2-dphy"; + rockchip,hw = <&csi2_dphy1_hw>; + status = "disabled"; + }; + + display_subsystem: display-subsystem { + compatible = "rockchip,display-subsystem"; + ports = <&vop_out>; + status = "disabled"; + }; + + firmware: firmware { + scmi: scmi { + compatible = "arm,scmi-smc"; + shmem = <&scmi_shmem>; + arm,smc-id = <0x82000010>; + #address-cells = <1>; + #size-cells = <0>; + + scmi_clk: protocol@14 { + reg = <0x14>; + #clock-cells = <1>; + }; + }; + }; + + mpp_srv: mpp-srv { + compatible = "rockchip,mpp-service"; + rockchip,taskqueue-count = <3>; + rockchip,resetgroup-count = <3>; + status = "disabled"; + }; + + psci: psci { + compatible = "arm,psci-1.0"; + method = "smc"; + }; + + rkcif_mipi_lvds: rkcif-mipi-lvds { + compatible = "rockchip,rkcif-mipi-lvds"; + rockchip,hw = <&rkcif>; + iommus = <&rkcif_mmu>; + status = "disabled"; + }; + + rkcif_mipi_lvds_sditf: rkcif-mipi-lvds-sditf { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds>; + status = "disabled"; + }; + + rkcif_mipi_lvds_sditf_vir1: rkcif-mipi-lvds-sditf-vir1 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds>; + status = "disabled"; + }; + + rkcif_mipi_lvds_sditf_vir2: rkcif-mipi-lvds-sditf-vir2 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds>; + status = "disabled"; + }; + + rkcif_mipi_lvds_sditf_vir3: rkcif-mipi-lvds-sditf-vir3 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds>; + status = "disabled"; + }; + + rkcif_mipi_lvds1: rkcif-mipi-lvds1 { + compatible = "rockchip,rkcif-mipi-lvds"; + rockchip,hw = <&rkcif>; + iommus = <&rkcif_mmu>; + status = "disabled"; + }; + + rkcif_mipi_lvds1_sditf: rkcif-mipi-lvds1-sditf { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds1>; + status = "disabled"; + }; + + rkcif_mipi_lvds1_sditf_vir1: rkcif-mipi-lvds1-sditf-vir1 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds1>; + status = "disabled"; + }; + + rkcif_mipi_lvds1_sditf_vir2: rkcif-mipi-lvds1-sditf-vir2 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds1>; + status = "disabled"; + }; + + rkcif_mipi_lvds1_sditf_vir3: rkcif-mipi-lvds1-sditf-vir3 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds1>; + status = "disabled"; + }; + + rkcif_mipi_lvds2: rkcif-mipi-lvds2 { + compatible = "rockchip,rkcif-mipi-lvds"; + rockchip,hw = <&rkcif>; + iommus = <&rkcif_mmu>; + status = "disabled"; + }; + + rkcif_mipi_lvds2_sditf: rkcif-mipi-lvds2-sditf { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds2>; + status = "disabled"; + }; + + rkcif_mipi_lvds2_sditf_vir1: rkcif-mipi-lvds2-sditf-vir1 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds2>; + status = "disabled"; + }; + + rkcif_mipi_lvds2_sditf_vir2: rkcif-mipi-lvds2-sditf-vir2 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds2>; + status = "disabled"; + }; + + rkcif_mipi_lvds2_sditf_vir3: rkcif-mipi-lvds2-sditf-vir3 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds2>; + status = "disabled"; + }; + + rkcif_mipi_lvds3: rkcif-mipi-lvds3 { + compatible = "rockchip,rkcif-mipi-lvds"; + rockchip,hw = <&rkcif>; + iommus = <&rkcif_mmu>; + status = "disabled"; + }; + + rkcif_mipi_lvds3_sditf: rkcif-mipi-lvds3-sditf { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds3>; + status = "disabled"; + }; + + rkcif_mipi_lvds3_sditf_vir1: rkcif-mipi-lvds3-sditf-vir1 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds3>; + status = "disabled"; + }; + + rkcif_mipi_lvds3_sditf_vir2: rkcif-mipi-lvds3-sditf-vir2 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds3>; + status = "disabled"; + }; + + rkcif_mipi_lvds3_sditf_vir3: rkcif-mipi-lvds3-sditf-vir3 { + compatible = "rockchip,rkcif-sditf"; + rockchip,cif = <&rkcif_mipi_lvds3>; + status = "disabled"; + }; + + rkisp_vir0: rkisp-vir0 { + compatible = "rockchip,rkisp-vir"; + rockchip,hw = <&rkisp>; + status = "disabled"; + }; + + rkisp_vir1: rkisp-vir1 { + compatible = "rockchip,rkisp-vir"; + rockchip,hw = <&rkisp>; + status = "disabled"; + }; + + rkisp_vir2: rkisp-vir2 { + compatible = "rockchip,rkisp-vir"; + rockchip,hw = <&rkisp>; + status = "disabled"; + }; + + rkisp_vir3: rkisp-vir3 { + compatible = "rockchip,rkisp-vir"; + rockchip,hw = <&rkisp>; + status = "disabled"; + }; + + thermal_zones: thermal-zones { + soc_thermal: soc-thermal { + polling-delay-passive = <20>; /* milliseconds */ + polling-delay = <1000>; /* milliseconds */ + + thermal-sensors = <&tsadc 0>; + trips { + soc_crit: soc-crit { + /* millicelsius */ + temperature = <115000>; + /* millicelsius */ + hysteresis = <2000>; + type = "critical"; + }; + }; + }; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, + <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; + }; + + scmi_shmem: scmi-shmem@10f000 { + compatible = "arm,scmi-shmem"; + reg = <0x0 0x0010f000 0x0 0x100>; + }; + + usbdrd30: usbdrd { + compatible = "rockchip,rk3562-dwc3", "rockchip,rk3399-dwc3"; + clocks = <&cru CLK_USB3OTG_REF>, <&cru CLK_USB3OTG_SUSPEND>, + <&cru ACLK_USB3OTG>, <&cru PCLK_PHP>; + clock-names = "ref", "suspend", "bus", "pipe_clk"; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + usbdrd_dwc3: usb@fe500000 { + compatible = "snps,dwc3"; + reg = <0x0 0xfe500000 0x0 0x400000>; + interrupts = <GIC_SPI 149 IRQ_TYPE_LEVEL_HIGH>; + dr_mode = "otg"; + phys = <&u2phy_otg>, <&combphy_pu PHY_TYPE_USB3>; + phy-names = "usb2-phy", "usb3-phy"; + phy_type = "utmi_wide"; + power-domains = <&power RK3562_PD_PHP>; + resets = <&cru SRST_USB3OTG>; + reset-names = "usb3-otg"; + snps,dis_enblslpm_quirk; + snps,dis-u1-entry-quirk; + snps,dis-u2-entry-quirk; + snps,dis-u2-freeclk-exists-quirk; + snps,dis-del-phy-power-chg-quirk; + snps,dis-tx-ipgap-linecheck-quirk; + snps,dis_rxdet_inp3_quirk; + quirk-skip-phy-init; + status = "disabled"; + }; + }; + + gic: interrupt-controller@fe901000 { + compatible = "arm,gic-400"; + #interrupt-cells = <3>; + #address-cells = <0>; + interrupt-controller; + reg = <0x0 0xfe901000 0 0x1000>, + <0x0 0xfe902000 0 0x2000>, + <0x0 0xfe904000 0 0x2000>, + <0x0 0xfe906000 0 0x2000>; + interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; + }; + + usb_host0_ehci: usb@fed00000 { + compatible = "generic-ehci"; + reg = <0x0 0xfed00000 0x0 0x40000>; + interrupts = <GIC_SPI 150 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru HCLK_USB2HOST>, <&cru HCLK_USB2HOST_ARB>, + <&u2phy>; + clock-names = "usbhost", "arbiter", "utmi"; + phys = <&u2phy_host>; + phy-names = "usb2-phy"; + status = "disabled"; + }; + + usb_host0_ohci: usb@fed40000 { + compatible = "generic-ohci"; + reg = <0x0 0xfed40000 0x0 0x40000>; + interrupts = <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru HCLK_USB2HOST>, <&cru HCLK_USB2HOST_ARB>, + <&u2phy>; + clock-names = "usbhost", "arbiter", "utmi"; + phys = <&u2phy_host>; + phy-names = "usb2-phy"; + status = "disabled"; + }; + + qos_dma2ddr: qos@fee03800 { + compatible = "syscon"; + reg = <0x0 0xfee03800 0x0 0x20>; + }; + + qos_mcu: qos@fee10000 { + compatible = "syscon"; + reg = <0x0 0xfee10000 0x0 0x20>; + }; + + qos_dft_apb: qos@fee10100 { + compatible = "syscon"; + reg = <0x0 0xfee10100 0x0 0x20>; + }; + + qos_gmac: qos@fee10200 { + compatible = "syscon"; + reg = <0x0 0xfee10200 0x0 0x20>; + }; + + qos_mac100: qos@fee10300 { + compatible = "syscon"; + reg = <0x0 0xfee10300 0x0 0x20>; + }; + + qos_dcf: qos@fee10400 { + compatible = "syscon"; + reg = <0x0 0xfee10400 0x0 0x20>; + }; + + qos_cpu: qos@fee20000 { + compatible = "syscon"; + reg = <0x0 0xfee20000 0x0 0x20>; + }; + + qos_daplite_apb: qos@fee20100 { + compatible = "syscon"; + reg = <0x0 0xfee20100 0x0 0x20>; + }; + + qos_gpu: qos@fee30000 { + compatible = "syscon"; + reg = <0x0 0xfee30000 0x0 0x20>; + }; + + qos_npu: qos@fee40000 { + compatible = "syscon"; + reg = <0x0 0xfee40000 0x0 0x20>; + }; + + qos_rkvdec: qos@fee50000 { + compatible = "syscon"; + reg = <0x0 0xfee50000 0x0 0x20>; + }; + + qos_vepu: qos@fee60000 { + compatible = "syscon"; + reg = <0x0 0xfee60000 0x0 0x20>; + }; + + qos_isp: qos@fee70000 { + compatible = "syscon"; + reg = <0x0 0xfee70000 0x0 0x20>; + }; + + qos_vicap: qos@fee70100 { + compatible = "syscon"; + reg = <0x0 0xfee70100 0x0 0x20>; + }; + + qos_vop: qos@fee80000 { + compatible = "syscon"; + reg = <0x0 0xfee80000 0x0 0x20>; + }; + + qos_jpeg: qos@fee90000 { + compatible = "syscon"; + reg = <0x0 0xfee90000 0x0 0x20>; + }; + + qos_rga_rd: qos@fee90100 { + compatible = "syscon"; + reg = <0x0 0xfee90100 0x0 0x20>; + }; + + qos_rga_wr: qos@fee90200 { + compatible = "syscon"; + reg = <0x0 0xfee90200 0x0 0x20>; + }; + + qos_pcie: qos@feea0000 { + compatible = "syscon"; + reg = <0x0 0xfeea0000 0x0 0x20>; + }; + + qos_usb3: qos@feea0100 { + compatible = "syscon"; + reg = <0x0 0xfeea0100 0x0 0x20>; + }; + + qos_crypto_apb: qos@feeb0000 { + compatible = "syscon"; + reg = <0x0 0xfeeb0000 0x0 0x20>; + }; + + qos_crypto: qos@feeb0100 { + compatible = "syscon"; + reg = <0x0 0xfeeb0100 0x0 0x20>; + }; + + qos_dmac: qos@feeb0200 { + compatible = "syscon"; + reg = <0x0 0xfeeb0200 0x0 0x20>; + }; + + qos_emmc: qos@feeb0300 { + compatible = "syscon"; + reg = <0x0 0xfeeb0300 0x0 0x20>; + }; + + qos_fspi: qos@feeb0400 { + compatible = "syscon"; + reg = <0x0 0xfeeb0400 0x0 0x20>; + }; + + qos_rkdma: qos@feeb0500 { + compatible = "syscon"; + reg = <0x0 0xfeeb0500 0x0 0x20>; + }; + + qos_sdmmc0: qos@feeb0600 { + compatible = "syscon"; + reg = <0x0 0xfeeb0600 0x0 0x20>; + }; + + qos_sdmmc1: qos@feeb0700 { + compatible = "syscon"; + reg = <0x0 0xfeeb0700 0x0 0x20>; + }; + + qos_usb2: qos@feeb0800 { + compatible = "syscon"; + reg = <0x0 0xfeeb0800 0x0 0x20>; + }; + + pmu_grf: syscon@ff010000 { + compatible = "rockchip,rk3562-pmu-grf", "syscon", "simple-mfd"; + reg = <0x0 0xff010000 0x0 0x10000>; + + reboot_mode: reboot-mode { + compatible = "syscon-reboot-mode"; + offset = <0x200>; + mode-bootloader = <BOOT_BL_DOWNLOAD>; + mode-charge = <BOOT_CHARGING>; + mode-fastboot = <BOOT_FASTBOOT>; + mode-loader = <BOOT_BL_DOWNLOAD>; + mode-normal = <BOOT_NORMAL>; + mode-recovery = <BOOT_RECOVERY>; + mode-ums = <BOOT_UMS>; + mode-panic = <BOOT_PANIC>; + mode-watchdog = <BOOT_WATCHDOG>; + }; + }; + + sys_grf: syscon@ff030000 { + compatible = "rockchip,rk3562-sys-grf", "syscon", "simple-mfd"; + reg = <0x0 0xff030000 0x0 0x10000>; + + lvds: lvds { + compatible = "rockchip,rk3562-lvds"; + phys = <&video_phy>; + phy-names = "phy"; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + lvds_in_vp0: endpoint@0 { + reg = <0>; + remote-endpoint = <&vp0_out_lvds>; + status = "disabled"; + }; + + lvds_in_vp1: endpoint@1 { + reg = <1>; + remote-endpoint = <&vp1_out_lvds>; + status = "disabled"; + }; + }; + }; + }; + + rgb: rgb { + compatible = "rockchip,rk3562-rgb"; + pinctrl-names = "default"; + pinctrl-0 = <&vo_pins>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + rgb_in_vp0: endpoint@0 { + reg = <0>; + remote-endpoint = <&vp0_out_rgb>; + status = "disabled"; + }; + + rgb_in_vp1: endpoint@1 { + reg = <1>; + remote-endpoint = <&vp1_out_rgb>; + status = "disabled"; + }; + }; + }; + }; + }; + + peri_grf: syscon@ff040000 { + compatible = "rockchip,rk3562-peri-grf", "syscon"; + reg = <0x0 0xff040000 0x0 0x10000>; + }; + + ioc_grf: syscon@ff060000 { + compatible = "rockchip,rk3562-ioc-grf", "syscon"; + reg = <0x0 0xff060000 0x0 0x30000>; + }; + + usbphy_grf: syscon@ff090000 { + compatible = "rockchip,rk3562-usbphy-grf", "syscon"; + reg = <0x0 0xff090000 0x0 0x8000>; + }; + + pipephy_grf: syscon@ff098000 { + compatible = "rockchip,rk3562-pipephy-grf", "syscon"; + reg = <0x0 0xff098000 0x0 0x8000>; + }; + + cru: clock-controller@ff100000 { + compatible = "rockchip,rk3562-cru"; + reg = <0x0 0xff100000 0x0 0x40000>; + rockchip,grf = <&sys_grf>; + #clock-cells = <1>; + #reset-cells = <1>; + + assigned-clocks = + <&cru PLL_GPLL>, <&cru PLL_CPLL>, + <&cru ARMCLK>; + assigned-clock-rates = + <1188000000>, <1000000000>, + <600000000>; + }; + + i2c0: i2c@ff200000 { + compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xff200000 0x0 0x1000>; + clocks = <&cru CLK_PMU0_I2C0>, <&cru PCLK_PMU0_I2C0>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + uart0: serial@ff210000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff210000 0x0 0x100>; + interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_PMU1_UART0>, <&cru PCLK_PMU1_UART0>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 0>; + status = "disabled"; + }; + + spi0: spi@ff220000 { + compatible = "rockchip,rk3066-spi"; + reg = <0x0 0xff220000 0x0 0x1000>; + interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&cru CLK_PMU1_SPI0>, <&cru PCLK_PMU1_SPI0>, <&cru PCLK_PMU1_SPI0>; + clock-names = "spiclk", "apb_pclk", "sclk_in"; + dmas = <&dmac 13>, <&dmac 12>; + dma-names = "tx", "rx"; + pinctrl-names = "default"; + pinctrl-0 = <&spi0m0_csn0 &spi0m0_csn1 &spi0m0_pins>; + num-cs = <2>; + status = "disabled"; + }; + + pwm0: pwm@ff230000 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff230000 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm0m0_pins>; + clocks = <&cru CLK_PMU1_PWM0>, <&cru PCLK_PMU1_PWM0>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm1: pwm@ff230010 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff230010 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm1m0_pins>; + clocks = <&cru CLK_PMU1_PWM0>, <&cru PCLK_PMU1_PWM0>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm2: pwm@ff230020 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff230020 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm2m0_pins>; + clocks = <&cru CLK_PMU1_PWM0>, <&cru PCLK_PMU1_PWM0>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm3: pwm@ff230030 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff230030 0x0 0x10>; + interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm3m0_pins>; + clocks = <&cru CLK_PMU1_PWM0>, <&cru PCLK_PMU1_PWM0>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pmu: power-management@ff258000 { + compatible = "rockchip,rk3562-pmu", "syscon", "simple-mfd"; + reg = <0x0 0xff258000 0x0 0x1000>; + + power: power-controller { + compatible = "rockchip,rk3562-power-controller"; + #power-domain-cells = <1>; + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + /* These power domains are grouped by VD_GPU */ + pd_gpu@RK3562_PD_GPU { + reg = <RK3562_PD_GPU>; + pm_qos = <&qos_gpu>; + }; + /* These power domains are grouped by VD_NPU */ + pd_npu@RK3562_PD_NPU { + reg = <RK3562_PD_NPU>; + pm_qos = <&qos_npu>; + }; + /* These power domains are grouped by VD_LOGIC */ + pd_vdpu@RK3562_PD_VDPU { + reg = <RK3562_PD_VDPU>; + pm_qos = <&qos_rkvdec>; + }; + pd_vi@RK3562_PD_VI { + reg = <RK3562_PD_VI>; + #address-cells = <1>; + #size-cells = <0>; + pm_qos = <&qos_isp>, + <&qos_vicap>; + + pd_vepu@RK3562_PD_VEPU { + reg = <RK3562_PD_VEPU>; + pm_qos = <&qos_vepu>; + }; + }; + pd_vo@RK3562_PD_VO { + reg = <RK3562_PD_VO>; + #address-cells = <1>; + #size-cells = <0>; + pm_qos = <&qos_vop>; + + pd_rga@RK3562_PD_RGA { + reg = <RK3562_PD_RGA>; + pm_qos = <&qos_rga_rd>, + <&qos_rga_wr>, + <&qos_jpeg>; + }; + }; + pd_php@RK3562_PD_PHP { + reg = <RK3562_PD_PHP>; + pm_qos = <&qos_pcie>, + <&qos_usb3>; + }; + }; + }; + + pmu_mailbox: mailbox@ff290000 { + compatible = "rockchip,rk3562-mailbox", + "rockchip,rk3368-mailbox"; + reg = <0x0 0xff290000 0x0 0x200>; + interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_PMU1_MAILBOX>; + clock-names = "pclk_mailbox"; + #mbox-cells = <1>; + status = "disabled"; + }; + + rknpu: npu@ff300000 { + compatible = "rockchip,rk3562-rknpu"; + reg = <0x0 0xff300000 0x0 0x10000>; + interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_RKNN>, <&cru HCLK_RKNN>; + clock-names = "aclk", "hclk"; + assigned-clocks = <&cru ACLK_RKNN>; + assigned-clock-rates = <600000000>; + resets = <&cru SRST_A_RKNN>, <&cru SRST_H_RKNN>; + reset-names = "srst_a", "srst_h"; + power-domains = <&power RK3562_PD_NPU>; + iommus = <&rknpu_mmu>; + status = "disabled"; + }; + + rknpu_mmu: iommu@ff30b000 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff30b000 0x0 0x40>; + interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rknpu_mmu"; + clocks = <&cru ACLK_RKNN>, <&cru HCLK_RKNN>; + clock-names = "aclk", "iface"; + power-domains = <&power RK3562_PD_NPU>; + #iommu-cells = <0>; + status = "disabled"; + }; + + gpu: gpu@ff320000 { + compatible = "arm,mali-bifrost"; + reg = <0x0 0xff320000 0x0 0x4000>; + + interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "GPU", "MMU", "JOB"; + + upthreshold = <40>; + downdifferential = <10>; + + clocks = <&cru CLK_GPU>, <&cru CLK_GPU_BRG>; + clock-names = "clk_gpu", "clk_gpu_brg"; + power-domains = <&power RK3562_PD_GPU>; + operating-points-v2 = <&gpu_opp_table>; + #cooling-cells = <2>; + + status = "disabled"; + }; + + gpu_opp_table: gpu-opp-table { + compatible = "operating-points-v2"; + + nvmem-cells = <&gpu_leakage>; + nvmem-cell-names = "leakage"; + + opp-300000000 { + opp-hz = /bits/ 64 <300000000>; + opp-microvolt = <900000 900000 1000000>; + }; + opp-400000000 { + opp-hz = /bits/ 64 <400000000>; + opp-microvolt = <900000 900000 1000000>; + }; + }; + + rkvdec: rkvdec@ff340100 { + compatible = "rockchip,rkv-decoder-vdpu382", "rockchip,rkv-decoder-v2"; + reg = <0x0 0xff340100 0x0 0x400>, <0x0 0xff340000 0x0 0x100>; + reg-names = "regs", "link"; + interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "irq_dec"; + clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, <&cru CLK_RKVDEC_HEVC_CA>; + clock-names = "aclk_vcodec", "hclk_vcodec","clk_hevc_cabac"; + rockchip,normal-rates = <198000000>, <0>, <396000000>; + assigned-clocks = <&cru ACLK_RKVDEC>, <&cru CLK_RKVDEC_HEVC_CA>; + assigned-clock-rates = <198000000>, <396000000>; + resets = <&cru SRST_A_RKVDEC>, <&cru SRST_H_RKVDEC>, + <&cru SRST_RKVDEC_HEVC_CA>; + reset-names = "video_a", "video_h", "video_hevc_cabac"; + power-domains = <&power RK3562_PD_VDPU>; + iommus = <&rkvdec_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <0>; + rockchip,resetgroup-node = <0>; + rockchip,task-capacity = <16>; + status = "disabled"; + }; + + rkvdec_mmu: iommu@ff340800 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff340800 0x0 0x40>, <0x0 0xff340900 0x0 0x40>; + interrupts = <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rkvdec_mmu"; + clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>; + clock-names = "aclk", "iface"; + power-domains = <&power RK3562_PD_VDPU>; + #iommu-cells = <0>; + status = "disabled"; + }; + + rkvenc: rkvenc@ff360000 { + compatible = "rockchip,rkv-encoder-vepu540c", "rockchip,rkv-encoder-v2"; + reg = <0x0 0xff360000 0x0 0x6000>; + interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "irq_rkvenc"; + clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>, <&cru CLK_RKVENC_CORE>; + clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core"; + rockchip,normal-rates = <297000000>, <0>, <297000000>; + resets = <&cru SRST_A_RKVENC>, <&cru SRST_H_RKVENC>, + <&cru SRST_RKVENC_CORE>; + reset-names = "video_a", "video_h", "video_core"; + assigned-clocks = <&cru ACLK_RKVENC>, <&cru CLK_RKVENC_CORE>; + assigned-clock-rates = <297000000>, <297000000>; + power-domains = <&power RK3562_PD_VEPU>; + iommus = <&rkvenc_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <1>; + rockchip,resetgroup-node = <1>; + status = "disabled"; + }; + + rkvenc_mmu: iommu@ff36f000 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff36f000 0x0 0x40>; + interrupts = <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rkvenc_mmu"; + clocks = <&cru ACLK_RKVENC>, <&cru HCLK_RKVENC>; + clock-names = "aclk", "iface"; + power-domains = <&power RK3562_PD_VEPU>; + #iommu-cells = <0>; + status = "disabled"; + }; + + mipi0_csi2: mipi0-csi2@ff380000 { + compatible = "rockchip,rk3562-mipi-csi2"; + reg = <0x0 0xff380000 0x0 0x10000>; + reg-names = "csihost_regs"; + interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "csi-intr1", "csi-intr2"; + clocks = <&cru PCLK_CSIHOST0>; + clock-names = "pclk_csi2host"; + resets = <&cru SRST_P_CSIHOST0>; + reset-names = "srst_csihost_p"; + status = "disabled"; + }; + + mipi1_csi2: mipi1-csi2@ff390000 { + compatible = "rockchip,rk3562-mipi-csi2"; + reg = <0x0 0xff390000 0x0 0x10000>; + reg-names = "csihost_regs"; + interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "csi-intr1", "csi-intr2"; + clocks = <&cru PCLK_CSIHOST1>; + clock-names = "pclk_csi2host"; + resets = <&cru SRST_P_CSIHOST1>; + reset-names = "srst_csihost_p"; + status = "disabled"; + }; + + mipi2_csi2: mipi2-csi2@ff3a0000 { + compatible = "rockchip,rk3562-mipi-csi2"; + reg = <0x0 0xff3a0000 0x0 0x10000>; + reg-names = "csihost_regs"; + interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "csi-intr1", "csi-intr2"; + clocks = <&cru PCLK_CSIHOST2>; + clock-names = "pclk_csi2host"; + resets = <&cru SRST_P_CSIHOST2>; + reset-names = "srst_csihost_p"; + status = "disabled"; + }; + + mipi3_csi2: mipi3-csi2@ff3b0000 { + compatible = "rockchip,rk3562-mipi-csi2"; + reg = <0x0 0xff3b0000 0x0 0x10000>; + reg-names = "csihost_regs"; + interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "csi-intr1", "csi-intr2"; + clocks = <&cru PCLK_CSIHOST3>; + clock-names = "pclk_csi2host"; + resets = <&cru SRST_P_CSIHOST3>; + reset-names = "srst_csihost_p"; + status = "disabled"; + }; + + csi2_dphy0_hw: csi2-dphy0-hw@ff3c0000 { + compatible = "rockchip,rk3562-csi2-dphy-hw"; + reg = <0x0 0xff3c0000 0x0 0x10000>; + clocks = <&cru PCLK_CSIPHY0>; + clock-names = "pclk"; + resets = <&cru SRST_P_CSIPHY0>; + reset-names = "srst_p_csiphy0"; + rockchip,grf = <&sys_grf>; + status = "disabled"; + }; + + csi2_dphy1_hw: csi2-dphy1-hw@ff3d0000 { + compatible = "rockchip,rk3562-csi2-dphy-hw"; + reg = <0x0 0xff3d0000 0x0 0x10000>; + clocks = <&cru PCLK_CSIPHY1>; + clock-names = "pclk"; + resets = <&cru SRST_P_CSIPHY1>; + reset-names = "srst_p_csiphy1"; + rockchip,grf = <&sys_grf>; + status = "disabled"; + }; + + rkcif: rkcif@ff3e0000 { + compatible = "rockchip,rk3562-cif"; + reg = <0x0 0xff3e0000 0x0 0x800>; + reg-names = "cif_regs"; + interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "cif-intr"; + clocks = <&cru ACLK_VICAP>, <&cru HCLK_VICAP>, <&cru DCLK_VICAP>; + clock-names = "aclk_cif", "hclk_cif", "dclk_cif"; + resets = <&cru SRST_A_VICAP>, <&cru SRST_H_VICAP>, <&cru SRST_D_VICAP>, + <&cru SRST_I0_VICAP>, <&cru SRST_I1_VICAP>, <&cru SRST_I2_VICAP>, + <&cru SRST_I3_VICAP>; + reset-names = "rst_cif_a", "rst_cif_h", "rst_cif_d", + "rst_cif_i0", "rst_cif_i1", "rst_cif_i2", + "rst_cif_i3"; + power-domains = <&power RK3562_PD_VI>; + rockchip,grf = <&sys_grf>; + iommus = <&rkcif_mmu>; + status = "disabled"; + }; + + rkcif_mmu: iommu@ff3e0800 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff3e0800 0x0 0x100>; + interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "cif_mmu"; + clocks = <&cru ACLK_VICAP>, <&cru HCLK_VICAP>; + clock-names = "aclk", "iface"; + power-domains = <&power RK3562_PD_VI>; + rockchip,disable-mmu-reset; + #iommu-cells = <0>; + status = "disabled"; + }; + + rkisp: isp@ff3f0000 { + compatible = "rockchip,rk3562-rkisp"; + reg = <0x0 0xff3f0000 0x0 0x7f00>; + interrupts = <GIC_SPI 88 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "mipi_irq", "mi_irq", "isp_irq"; + clocks = <&cru ACLK_ISP>, <&cru HCLK_ISP>, <&cru CLK_ISP>; + clock-names = "aclk_isp", "hclk_isp", "clk_isp_core"; + power-domains = <&power RK3562_PD_VI>; + iommus = <&rkisp_mmu>; + status = "disabled"; + }; + + rkisp_mmu: iommu@ff3f7f00 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff3f7f00 0x0 0x100>; + interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "isp_mmu"; + clocks = <&cru ACLK_RGA>, <&cru HCLK_RGA>; + clock-names = "aclk", "iface"; + rockchip,disable-mmu-reset; + #iommu-cells = <0>; + power-domains = <&power RK3562_PD_VI>; + status = "disabled"; + }; + + vop: vop@ff400000 { + compatible = "rockchip,rk3562-vop"; + reg = <0x0 0xff400000 0x0 0x2000>, <0x0 0xff405000 0x0 0x1000>; + reg-names = "regs", "gamma_lut"; + interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_VOP>, + <&cru HCLK_VOP>, + <&cru DCLK_VOP>, + <&cru DCLK_VOP1>; + clock-names = "aclk_vop", + "hclk_vop", + "dclk_vp0", + "dclk_vp1"; + resets = <&cru SRST_A_VOP>, + <&cru SRST_H_VOP>, + <&cru SRST_D_VOP>, + <&cru SRST_D_VOP1>; + reset-names = "axi", + "ahb", + "dclk_vp0", + "dclk_vp1"; + iommus = <&vop_mmu>; + power-domains = <&power RK3562_PD_VO>; + rockchip,grf = <&sys_grf>; + status = "disabled"; + + vop_out: ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + #address-cells = <1>; + #size-cells = <0>; + reg = <0>; + + vp0_out_rgb: endpoint@0 { + reg = <0>; + remote-endpoint = <&rgb_in_vp0>; + }; + + vp0_out_dsi: endpoint@1 { + reg = <1>; + remote-endpoint = <&dsi_in_vp0>; + }; + + vp0_out_lvds: endpoint@2 { + reg = <2>; + remote-endpoint = <&lvds_in_vp0>; + }; + }; + + port@1 { + #address-cells = <1>; + #size-cells = <0>; + reg = <1>; + + vp1_out_rgb: endpoint@0 { + reg = <0>; + remote-endpoint = <&rgb_in_vp1>; + }; + + vp1_out_dsi: endpoint@1 { + reg = <1>; + remote-endpoint = <&dsi_in_vp1>; + }; + + vp1_out_lvds: endpoint@2 { + reg = <2>; + remote-endpoint = <&lvds_in_vp1>; + }; + }; + }; + }; + + vop_mmu: iommu@ff407e00 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff407e00 0x0 0x100>; + interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "vop_mmu"; + clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; + rockchip,disable-device-link-resume; + rockchip,shootdown-entire; + status = "disabled"; + }; + + rga2: rga@ff440000 { + compatible = "rockchip,rga2_core0"; + reg = <0x0 0xff440000 0x0 0x1000>; + interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rga2_irq"; + clocks = <&cru ACLK_RGA>, <&cru HCLK_RGA>, <&cru CLK_RGA_CORE>; + clock-names = "aclk_rga2", "hclk_rga2", "clk_rga2"; + iommus = <&rga2_mmu>; + power-domains = <&power RK3562_PD_RGA>; + status = "disabled"; + }; + + rga2_mmu: iommu@ff440f00 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff440f00 0x0 0x100>; + interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "rga2_mmu"; + clocks = <&cru ACLK_RGA>, <&cru HCLK_RGA>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; + power-domains = <&power RK3562_PD_RGA>; + status = "disabled"; + }; + + jpegd: jpegd@ff450000 { + compatible = "rockchip,rkv-jpeg-decoder-v1"; + reg = <0x0 0xff450000 0x0 0x400>; + interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_JDEC>, <&cru HCLK_JDEC>; + clock-names = "aclk_vcodec", "hclk_vcodec"; + rockchip,disable-auto-freq; + resets = <&cru SRST_A_JDEC>, <&cru SRST_H_JDEC>; + reset-names = "video_a", "video_h"; + power-domains = <&power RK3562_PD_RGA>; + iommus = <&jpegd_mmu>; + rockchip,srv = <&mpp_srv>; + rockchip,taskqueue-node = <2>; + rockchip,resetgroup-node = <2>; + status = "disabled"; + }; + + jpegd_mmu: iommu@ff450480 { + compatible = "rockchip,iommu-v2"; + reg = <0x0 0xff450480 0x0 0x40>; + interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "jpegd_mmu"; + clock-names = "aclk", "iface"; + clocks = <&cru ACLK_JDEC>, <&cru HCLK_JDEC>; + power-domains = <&power RK3562_PD_RGA>; + #iommu-cells = <0>; + status = "disabled"; + }; + + pcie2x1: pcie@ff500000 { + compatible = "rockchip,rk3562-pcie", "snps,dw-pcie"; + #address-cells = <3>; + #size-cells = <2>; + bus-range = <0x0 0xff>; + clocks = <&cru ACLK_PCIE20_MST>, <&cru ACLK_PCIE20_SLV>, + <&cru ACLK_PCIE20_DBI>, <&cru PCLK_PCIE20>, + <&cru CLK_PCIE20_AUX>; + clock-names = "aclk_mst", "aclk_slv", + "aclk_dbi", "pclk", "aux"; + device_type = "pci"; + interrupts = <GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "msi", "pmc", "sys", "legacy", "msg", "err"; + #interrupt-cells = <1>; + interrupt-map-mask = <0 0 0 7>; + interrupt-map = <0 0 0 1 &pcie2x1_intc 0>, + <0 0 0 2 &pcie2x1_intc 1>, + <0 0 0 3 &pcie2x1_intc 2>, + <0 0 0 4 &pcie2x1_intc 3>; + linux,pci-domain = <0>; + num-ib-windows = <8>; + num-viewport = <8>; + num-ob-windows = <2>; + max-link-speed = <2>; + num-lanes = <1>; + phys = <&combphy_pu PHY_TYPE_PCIE>; + phy-names = "pcie-phy"; + ranges = <0x00000800 0x0 0xfc000000 0x0 0xfc000000 0x0 0x100000 + 0x81000000 0x0 0xfc100000 0x0 0xfc100000 0x0 0x100000 + 0x82000000 0x0 0xfc200000 0x0 0xfc200000 0x0 0x1e00000 + 0xc3000000 0x3 0x00000000 0x3 0x00000000 0x0 0x40000000>; + reg = <0x0 0xfe000000 0x0 0x400000>, + <0x0 0xff500000 0x0 0x10000>; + reg-names = "pcie-dbi", "pcie-apb"; + resets = <&cru SRST_PCIE20_POWERUP>; + reset-names = "pipe"; + status = "disabled"; + + pcie2x1_intc: legacy-interrupt-controller { + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <1>; + interrupt-parent = <&gic>; + }; + }; + + spi1: spi@ff640000 { + compatible = "rockchip,rk3066-spi"; + reg = <0x0 0xff640000 0x0 0x1000>; + interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&cru CLK_SPI1>, <&cru PCLK_SPI1>; + clock-names = "spiclk", "apb_pclk"; + dmas = <&dmac 15>, <&dmac 14>; + dma-names = "tx", "rx"; + pinctrl-names = "default"; + pinctrl-0 = <&spi1m0_csn0 &spi1m0_csn1 &spi1m0_pins>; + num-cs = <2>; + status = "disabled"; + }; + + spi2: spi@ff650000 { + compatible = "rockchip,rk3066-spi"; + reg = <0x0 0xff650000 0x0 0x1000>; + interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>; + #address-cells = <1>; + #size-cells = <0>; + clocks = <&cru CLK_SPI2>, <&cru PCLK_SPI2>; + clock-names = "spiclk", "apb_pclk"; + dmas = <&dmac 17>, <&dmac 16>; + dma-names = "tx", "rx"; + pinctrl-names = "default"; + pinctrl-0 = <&spi2m0_csn0 &spi2m0_csn1 &spi2m0_pins>; + num-cs = <2>; + status = "disabled"; + }; + + uart1: serial@ff670000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff670000 0x0 0x100>; + interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART1>, <&cru PCLK_UART1>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 1>, <&dmac 10>; + status = "disabled"; + }; + + uart2: serial@ff680000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff680000 0x0 0x100>; + interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART2>, <&cru PCLK_UART2>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 2>; + status = "disabled"; + }; + + uart3: serial@ff690000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff690000 0x0 0x100>; + interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART3>, <&cru PCLK_UART3>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 3>; + status = "disabled"; + }; + + uart4: serial@ff6a0000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff6a0000 0x0 0x100>; + interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART4>, <&cru PCLK_UART4>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 4>; + status = "disabled"; + }; + + uart5: serial@ff6b0000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff6b0000 0x0 0x100>; + interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART5>, <&cru PCLK_UART5>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 5>, <&dmac 11>; + status = "disabled"; + }; + + uart6: serial@ff6c0000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff6c0000 0x0 0x100>; + interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART6>, <&cru PCLK_UART6>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 6>; + status = "disabled"; + }; + + uart7: serial@ff6d0000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff6d0000 0x0 0x100>; + interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART7>, <&cru PCLK_UART7>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 7>; + status = "disabled"; + }; + + uart8: serial@ff6e0000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff6e0000 0x0 0x100>; + interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART8>, <&cru PCLK_UART8>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 8>; + status = "disabled"; + }; + + uart9: serial@ff6f0000 { + compatible = "rockchip,rk3562-uart", "snps,dw-apb-uart"; + reg = <0x0 0xff6f0000 0x0 0x100>; + interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_UART9>, <&cru PCLK_UART9>; + clock-names = "baudclk", "apb_pclk"; + reg-shift = <2>; + reg-io-width = <4>; + dmas = <&dmac 9>; + status = "disabled"; + }; + + pwm4: pwm@ff700000 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff700000 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm4m0_pins>; + clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm5: pwm@ff700010 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff700010 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm5m0_pins>; + clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm6: pwm@ff700020 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff700020 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm6m0_pins>; + clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm7: pwm@ff700030 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff700030 0x0 0x10>; + interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm7m0_pins>; + clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm8: pwm@ff710000 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff710000 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm8m0_pins>; + clocks = <&cru CLK_PWM2_PERI>, <&cru PCLK_PWM2_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm9: pwm@ff710010 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff710010 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm9m0_pins>; + clocks = <&cru CLK_PWM2_PERI>, <&cru PCLK_PWM2_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm10: pwm@ff710020 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff710020 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm10m0_pins>; + clocks = <&cru CLK_PWM2_PERI>, <&cru PCLK_PWM2_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm11: pwm@ff710030 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff710030 0x0 0x10>; + interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm11m0_pins>; + clocks = <&cru CLK_PWM2_PERI>, <&cru PCLK_PWM2_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm12: pwm@ff720000 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff720000 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm12m0_pins>; + clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm13: pwm@ff720010 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff720010 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm13m0_pins>; + clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm14: pwm@ff720020 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff720020 0x0 0x10>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm14m0_pins>; + clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + pwm15: pwm@ff720030 { + compatible = "rockchip,rk3562-pwm", "rockchip,rk3328-pwm"; + reg = <0x0 0xff720030 0x0 0x10>; + interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>; + #pwm-cells = <3>; + pinctrl-names = "active"; + pinctrl-0 = <&pwm15m0_pins>; + clocks = <&cru CLK_PWM3_PERI>, <&cru PCLK_PWM3_PERI>; + clock-names = "pwm", "pclk"; + status = "disabled"; + }; + + saradc0: saradc@ff730000 { + compatible = "rockchip,rk3562-saradc"; + reg = <0x0 0xff730000 0x0 0x100>; + interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>; + #io-channel-cells = <1>; + clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>; + clock-names = "saradc", "apb_pclk"; + resets = <&cru SRST_P_SARADC>; + reset-names = "saradc-apb"; + status = "disabled"; + }; + + u2phy: usb2-phy@ff740000 { + compatible = "rockchip,rk3562-usb2phy"; + reg = <0x0 0xff740000 0x0 0x10000>; + clocks = <&cru CLK_USB2PHY_REF>, <&cru PCLK_USB2PHY>; + clock-names = "phyclk", "pclk"; + #clock-cells = <0>; + clock-output-names = "usb480m_phy"; + rockchip,usbgrf = <&usbphy_grf>; + status = "disabled"; + + u2phy_otg: otg-port { + #phy-cells = <0>; + interrupts = <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 155 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "otg-bvalid", "otg-id", "linestate"; + status = "disabled"; + }; + + u2phy_host: host-port { + #phy-cells = <0>; + interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "linestate"; + status = "disabled"; + }; + }; + + combphy_pu: phy@ff750000 { + compatible = "rockchip,rk3562-naneng-combphy"; + reg = <0x0 0xff750000 0x0 0x100>; + #phy-cells = <1>; + clocks = <&cru CLK_PIPEPHY_REF>, <&cru PCLK_PIPEPHY>, + <&cru PCLK_PHP>; + clock-names = "refclk", "apbclk", "pipe_clk"; + assigned-clocks = <&cru CLK_PIPEPHY_REF>; + assigned-clock-rates = <100000000>; + resets = <&cru SRST_P_PIPEPHY>, <&cru SRST_PIPEPHY>; + reset-names = "combphy-apb", "combphy"; + rockchip,pipe-grf = <&peri_grf>; + rockchip,pipe-phy-grf = <&pipephy_grf>; + status = "disabled"; + }; + + sai0: sai@ff800000 { + compatible = "rockchip,rk3562-sai", "rockchip,sai-v1"; + reg = <0x0 0xff800000 0x0 0x1000>; + interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru MCLK_SAI0>, <&cru HCLK_SAI0>; + clock-names = "mclk", "hclk"; + dmas = <&dmac 19>, <&dmac 18>; + dma-names = "tx", "rx"; + resets = <&cru SRST_M_SAI0_8CH>, <&cru SRST_H_SAI0_8CH>; + reset-names = "m", "h"; + pinctrl-names = "default"; + pinctrl-0 = <&i2s0m0_lrck + &i2s0m0_sclk + &i2s0m0_sdi0 + &i2s0m0_sdo0 + &i2s0m0_sdo1 + &i2s0m0_sdo2 + &i2s0m0_sdo3>; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + sai1: sai@ff810000 { + compatible = "rockchip,rk3562-sai", "rockchip,sai-v1"; + reg = <0x0 0xff810000 0x0 0x1000>; + interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru MCLK_SAI1>, <&cru HCLK_SAI1>; + clock-names = "mclk", "hclk"; + dmas = <&dmac 21>, <&dmac 20>; + dma-names = "tx", "rx"; + resets = <&cru SRST_M_SAI1_8CH>, <&cru SRST_H_SAI1_8CH>; + reset-names = "m", "h"; + pinctrl-names = "default"; + pinctrl-0 = <&i2s1m0_lrck + &i2s1m0_sclk + &i2s1m0_sdi0 + &i2s1m0_sdi1 + &i2s1m0_sdi2 + &i2s1m0_sdi3 + &i2s1m0_sdo0 + &i2s1m0_sdo1 + &i2s1m0_sdo2 + &i2s1m0_sdo3>; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + sai2: sai@ff820000 { + compatible = "rockchip,rk3562-sai", "rockchip,sai-v1"; + reg = <0x0 0xff820000 0x0 0x1000>; + interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru MCLK_SAI2>, <&cru HCLK_SAI2>; + clock-names = "mclk", "hclk"; + dmas = <&dmac 23>, <&dmac 22>; + dma-names = "tx", "rx"; + resets = <&cru SRST_M_SAI2_2CH>, <&cru SRST_H_SAI2_2CH>; + reset-names = "m", "h"; + pinctrl-names = "default"; + pinctrl-0 = <&i2s2m0_lrck + &i2s2m0_sclk + &i2s2m0_sdi + &i2s2m0_sdo>; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + pdm: pdm@ff830000 { + compatible = "rockchip,rk3562-pdm", "rockchip,pdm"; + reg = <0x0 0xff830000 0x0 0x1000>; + clocks = <&cru MCLK_PDM>, <&cru HCLK_PDM>; + clock-names = "pdm_clk", "pdm_hclk"; + dmas = <&dmac 31>; + dma-names = "rx"; + pinctrl-names = "default"; + pinctrl-0 = <&pdmm0_clk0 + &pdmm0_clk1 + &pdmm0_sdi0 + &pdmm0_sdi1 + &pdmm0_sdi2 + &pdmm0_sdi3>; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + spdif_8ch: spdif@ff840000 { + compatible = "rockchip,rk3562-spdif", "rockchip,rk3568-spdif"; + reg = <0x0 0xff840000 0x0 0x1000>; + interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>; + dmas = <&dmac 30>; + dma-names = "tx"; + clock-names = "mclk", "hclk"; + clocks = <&cru MCLK_SPDIF>, <&cru HCLK_SPDIF>; + #sound-dai-cells = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&spdifm0_pins>; + status = "disabled"; + }; + + acdcdig_dsm: codec-digital@ff850000 { + compatible = "rockchip,rk3562-codec-digital", "rockchip,codec-digital-v1"; + reg = <0x0 0xff850000 0x0 0x1000>; + clocks = <&cru CLK_DSM>, <&cru HCLK_DSM>; + clock-names = "dac", "pclk"; + resets = <&cru SRST_DSM>; + reset-names = "reset" ; + rockchip,grf = <&sys_grf>; + rockchip,pwm-output-mode; + pinctrl-names = "default"; + pinctrl-0 = <&dsm_pins>; + #sound-dai-cells = <0>; + status = "disabled"; + }; + + sfc: spi@ff860000 { + compatible = "rockchip,sfc"; + reg = <0x0 0xff860000 0x0 0x10000>; + interrupts = <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru SCLK_SFC>, <&cru HCLK_SFC>; + clock-names = "clk_sfc", "hclk_sfc"; + assigned-clocks = <&cru SCLK_SFC>; + assigned-clock-rates = <100000000>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + sdhci: mmc@ff870000 { + compatible = "rockchip,rk3562-dwcmshc", "rockchip,rk3528-dwcmshc"; + reg = <0x0 0xff870000 0x0 0x10000>; + interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>; + assigned-clocks = <&cru BCLK_EMMC>, <&cru CCLK_EMMC>; + assigned-clock-rates = <200000000>, <200000000>; + clocks = <&cru CCLK_EMMC>, <&cru HCLK_EMMC>, + <&cru ACLK_EMMC>, <&cru BCLK_EMMC>, + <&cru TMCLK_EMMC>; + clock-names = "core", "bus", "axi", "block", "timer"; + resets = <&cru SRST_C_EMMC>, <&cru SRST_H_EMMC>, + <&cru SRST_A_EMMC>, <&cru SRST_B_EMMC>, + <&cru SRST_T_EMMC>; + reset-names = "core", "bus", "axi", "block", "timer"; + max-frequency = <200000000>; + status = "disabled"; + }; + + sdmmc0: mmc@ff880000 { + compatible = "rockchip,rk3562-dw-mshc", + "rockchip,rk3288-dw-mshc"; + reg = <0x0 0xff880000 0x0 0x10000>; + interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>; + max-frequency = <150000000>; + clocks = <&cru HCLK_SDMMC0>, <&cru CCLK_SDMMC0>, + <&cru SCLK_SDMMC0_DRV>, <&cru SCLK_SDMMC0_SAMPLE>; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; + resets = <&cru SRST_H_SDMMC0>; + reset-names = "reset"; + fifo-depth = <0x100>; + status = "disabled"; + }; + + sdmmc1: mmc@ff890000 { + compatible = "rockchip,rk3562-dw-mshc", + "rockchip,rk3288-dw-mshc"; + reg = <0x0 0xff890000 0x0 0x10000>; + interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>; + max-frequency = <150000000>; + clocks = <&cru HCLK_SDMMC1>, <&cru CCLK_SDMMC1>, + <&cru SCLK_SDMMC1_DRV>, <&cru SCLK_SDMMC1_SAMPLE>; + clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; + resets = <&cru SRST_H_SDMMC1>; + reset-names = "reset"; + fifo-depth = <0x100>; + status = "disabled"; + }; + + crypto: crypto@ff8a0000 { + compatible = "rockchip,crypto-v4"; + reg = <0x0 0xff8a0000 0x0 0x2000>; + interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&scmi_clk CLK_CORE_CRYPTO>, <&scmi_clk CLK_PKA_CRYPTO>, + <&scmi_clk ACLK_CRYPTO>, <&scmi_clk HCLK_CRYPTO>, + <&scmi_clk PCLK_CRYPTO>; + clock-names = "sclk", "pka", "aclk", "pclk", "pclk"; + assigned-clocks = <&scmi_clk CLK_CORE_CRYPTO>, <&scmi_clk CLK_PKA_CRYPTO>; + assigned-clock-rates = <200000000>, <300000000>; + resets = <&cru SRST_CORE_CRYPTO>; + reset-names = "crypto-rst"; + status = "disabled"; + }; + + rng: rng@ff8e0000 { + compatible = "rockchip,rkrng"; + reg = <0x0 0xff8e0000 0x0 0x200>; + interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&scmi_clk HCLK_RK_RNG_NS>; + clock-names = "hclk_trng"; + resets = <&cru SRST_H_RK_RNG_NS>; + reset-names = "reset"; + status = "disabled"; + }; + + otp: otp@ff930000 { + compatible = "rockchip,rk3562-otp"; + reg = <0x0 0xff930000 0x0 0x4000>; + #address-cells = <1>; + #size-cells = <1>; + clocks = <&cru CLK_USER_OTPC_NS>, <&cru CLK_SBPI_OTPC_NS>, + <&cru PCLK_OTPC_NS>, <&cru CLK_OTPC_ARB>, + <&cru PCLK_OTPPHY>; + clock-names = "usr", "sbpi", "apb", "arb", "phy"; + resets = <&cru SRST_USER_OTPC_NS>, <&cru SRST_SBPI_OTPC_NS>, + <&cru SRST_P_OTPC_NS>, <&cru SRST_OTPC_ARB>, + <&cru SRST_P_OTPPHY>; + reset-names = "usr", "sbpi", "apb", "arb", "phy"; + + /* Data cells */ + cpu_code: cpu-code@2 { + reg = <0x02 0x2>; + }; + otp_cpu_version: cpu-version@8 { + reg = <0x08 0x1>; + bits = <3 3>; + }; + otp_id: id@a { + reg = <0x0a 0x10>; + }; + cpu_leakage: cpu-leakage@1a { + reg = <0x1a 0x1>; + }; + log_leakage: log-leakage@1b { + reg = <0x1b 0x1>; + }; + npu_leakage: npu-leakage@1c { + reg = <0x1c 0x1>; + }; + gpu_leakage: gpu-leakage@1d { + reg = <0x1d 0x1>; + }; + }; + + dmac: dma-controller@ff990000 { + compatible = "arm,pl330", "arm,primecell"; + reg = <0x0 0xff990000 0x0 0x4000>; + interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru ACLK_DMAC>; + clock-names = "apb_pclk"; + #dma-cells = <1>; + arm,pl330-periph-burst; + }; + + hwlock: hwspinlock@ff9e0000 { + compatible = "rockchip,hwspinlock"; + reg = <0x0 0xff9e0000 0x0 0x100>; + #hwlock-cells = <1>; + status = "disabled"; + }; + + i2c1: i2c@ffa00000 { + compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa00000 0x0 0x1000>; + clocks = <&cru CLK_I2C1>, <&cru PCLK_I2C1>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c1m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c2: i2c@ffa10000 { + compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa10000 0x0 0x1000>; + clocks = <&cru CLK_I2C2>, <&cru PCLK_I2C2>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c2m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c3: i2c@ffa20000 { + compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa20000 0x0 0x1000>; + clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c3m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c4: i2c@ffa30000 { + compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa30000 0x0 0x1000>; + clocks = <&cru CLK_I2C4>, <&cru PCLK_I2C4>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c4m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + i2c5: i2c@ffa40000 { + compatible = "rockchip,rk3562-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xffa40000 0x0 0x1000>; + clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&i2c5m0_xfer>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + }; + + wdt: watchdog@ffa60000 { + compatible = "snps,dw-wdt"; + reg = <0x0 0xffa60000 0x0 0x100>; + clocks = <&cru CLK_WDTNS>, <&cru PCLK_WDTNS>; + clock-names = "tclk", "pclk"; + interrupts = <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>; + status = "disabled"; + }; + + tsadc: tsadc@ffa70000 { + compatible = "rockchip,rk3562-tsadc"; + reg = <0x0 0xffa70000 0x0 0x400>; + rockchip,grf = <&sys_grf>; + interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru CLK_TSADC>, <&cru CLK_TSADC_TSEN>, <&cru PCLK_TSADC>; + clock-names = "tsadc", "tsadc_tsen", "apb_pclk"; + assigned-clocks = <&cru CLK_TSADC>, <&cru CLK_TSADC_TSEN>; + assigned-clock-rates = <1200000>, <12000000>; + resets = <&cru SRST_TSADC>, <&cru SRST_P_TSADC>, <&cru SRST_TSADCPHY>; + reset-names = "tsadc", "tsadc-apb", "tsadc-phy"; + #thermal-sensor-cells = <1>; + rockchip,hw-tshut-temp = <120000>; + rockchip,hw-tshut-mode = <0>; /* tshut mode 0:CRU 1:GPIO */ + rockchip,hw-tshut-polarity = <0>; /* tshut polarity 0:LOW 1:HIGH */ + status = "disabled"; + }; + + gmac0: ethernet@ffa80000 { + compatible = "rockchip,rk3562-gmac", "snps,dwmac-4.20a"; + reg = <0x0 0xffa80000 0x0 0x10000>; + interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "macirq", "eth_wake_irq"; + rockchip,grf = <&sys_grf>; + rockchip,php_grf = <&ioc_grf>; + clocks = <&cru CLK_GMAC_125M_CRU_I>, <&cru CLK_GMAC_50M_CRU_I>, + <&cru PCLK_GMAC>, <&cru ACLK_GMAC>; + clock-names = "stmmaceth", "clk_mac_ref", + "pclk_mac", "aclk_mac"; + resets = <&cru SRST_A_GMAC>; + reset-names = "stmmaceth"; + + snps,mixed-burst; + snps,tso; + + snps,axi-config = <&gmac0_stmmac_axi_setup>; + snps,mtl-rx-config = <&gmac0_mtl_rx_setup>; + snps,mtl-tx-config = <&gmac0_mtl_tx_setup>; + status = "disabled"; + + mdio0: mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <0x1>; + #size-cells = <0x0>; + }; + + gmac0_stmmac_axi_setup: stmmac-axi-config { + snps,wr_osr_lmt = <4>; + snps,rd_osr_lmt = <8>; + snps,blen = <0 0 0 0 16 8 4>; + }; + + gmac0_mtl_rx_setup: rx-queues-config { + snps,rx-queues-to-use = <1>; + queue0 {}; + }; + + gmac0_mtl_tx_setup: tx-queues-config { + snps,tx-queues-to-use = <1>; + queue0 {}; + }; + }; + + saradc1: saradc@ffaa0000 { + compatible = "rockchip,rk3562-saradc"; + reg = <0x0 0xffaa0000 0x0 0x100>; + interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>; + #io-channel-cells = <1>; + clocks = <&cru CLK_SARADC_VCCIO156>, <&cru PCLK_SARADC_VCCIO156>; + clock-names = "saradc", "apb_pclk"; + resets = <&cru SRST_P_SARADC_VCCIO156>; + reset-names = "saradc-apb"; + status = "disabled"; + }; + + mailbox: mailbox@ffae0000 { + compatible = "rockchip,rk3562-mailbox", + "rockchip,rk3368-mailbox"; + reg = <0x0 0xffae0000 0x0 0x200>; + interrupts = <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_MAILBOX>; + clock-names = "pclk_mailbox"; + #mbox-cells = <1>; + status = "disabled"; + }; + + dsi: dsi@ffb10000 { + compatible = "rockchip,rk3562-mipi-dsi"; + reg = <0x0 0xffb10000 0x0 0x10000>; + interrupts = <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_DSITX>; + clock-names = "pclk"; + resets = <&cru SRST_P_DSITX>; + reset-names = "apb"; + phys = <&video_phy>; + phy-names = "dphy"; + rockchip,grf = <&sys_grf>; + #address-cells = <1>; + #size-cells = <0>; + status = "disabled"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + dsi_in: port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + dsi_in_vp0: endpoint@0 { + reg = <0>; + remote-endpoint = <&vp0_out_dsi>; + status = "disabled"; + }; + + dsi_in_vp1: endpoint@1 { + reg = <1>; + remote-endpoint = <&vp1_out_dsi>; + status = "disabled"; + }; + }; + }; + }; + + video_phy: phy@ffb20000 { + compatible = "rockchip,rk3562-dsi-dphy", "rockchip,rk3562-video-phy", + "rockchip,rk3568-dsi-dphy", "rockchip,rk3568-video-phy"; + reg = <0x0 0xffb20000 0x0 0x10000>, + <0x0 0xffb10000 0x0 0x10000>; + reg-names = "phy", "host"; + clocks = <&cru CLK_MIPIDSIPHY_REF>, + <&cru PCLK_DSIPHY>, <&cru PCLK_DSITX>; + clock-names = "ref", "pclk", "pclk_host"; + #clock-cells = <0>; + resets = <&cru SRST_P_DSIPHY>; + reset-names = "apb"; + #phy-cells = <0>; + status = "disabled"; + }; + + gmac1: ethernet@ffb30000 { + compatible = "rockchip,rk3562-gmac"; + reg = <0x0 0xffb30000 0x0 0x10000>; + interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>, + <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>; + interrupt-names = "macirq", "eth_wake_irq"; + rockchip,grf = <&sys_grf>; + rockchip,php_grf = <&ioc_grf>; + clocks = <&cru CLK_GMAC_50M_CRU_I>, <&cru CLK_GMAC_50M_CRU_I>, + <&cru PCLK_GMAC>, <&cru ACLK_GMAC>; + clock-names = "stmmaceth", "clk_mac_ref", + "pclk_mac", "aclk_mac"; + resets = <&cru SRST_A_MAC100>; + reset-names = "stmmaceth"; + status = "disabled"; + + mdio1: mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <0x1>; + #size-cells = <0x0>; + }; + }; + + pinctrl: pinctrl { + compatible = "rockchip,rk3562-pinctrl"; + rockchip,grf = <&ioc_grf>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + + gpio0: gpio@ff260000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xff260000 0x0 0x100>; + interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_PMU0_GPIO0>, <&cru DBCLK_PMU0_GPIO0>; + + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 0 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + + gpio1: gpio@ff620000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xff620000 0x0 0x100>; + interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_PERI_GPIO1>, <&cru DCLK_PERI_GPIO1>; + + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 32 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + + gpio2: gpio@ff630000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xff630000 0x0 0x100>; + interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_PERI_GPIO2>, <&cru DCLK_PERI_GPIO2>; + + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 64 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + + gpio3: gpio@ffac0000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xffac0000 0x0 0x100>; + interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_GPIO3_VCCIO156>, <&cru DCLK_BUS_GPIO3>; + + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 96 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + + gpio4: gpio@ffad0000 { + compatible = "rockchip,gpio-bank"; + reg = <0x0 0xffad0000 0x0 0x100>; + interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&cru PCLK_GPIO4_VCCIO156>, <&cru DCLK_BUS_GPIO4>; + + gpio-controller; + #gpio-cells = <2>; + gpio-ranges = <&pinctrl 0 128 32>; + interrupt-controller; + #interrupt-cells = <2>; + }; + }; +}; + +#include "rk3562-pinctrl.dtsi" diff --git a/u-boot/arch/arm/dts/rk3568-u-boot.dtsi b/u-boot/arch/arm/dts/rk3568-u-boot.dtsi index 3eb3937..a0678e3 100644 --- a/u-boot/arch/arm/dts/rk3568-u-boot.dtsi +++ b/u-boot/arch/arm/dts/rk3568-u-boot.dtsi @@ -17,6 +17,15 @@ stdout-path = &uart2; u-boot,spl-boot-order = &sdmmc0, &sdhci, &nandc0, &spi_nand, &spi_nor; }; + + secure-otp@fe3a0000 { + compatible = "rockchip,rk3568-secure-otp"; + reg = <0x0 0xfe3a0000 0x0 0x4000>; + secure_conf = <0xfdd18008>; + mask_addr = <0xfe880000>; + cru_rst_addr = <0xfdd20470>; + u-boot,dm-spl; + }; }; &psci { @@ -25,7 +34,7 @@ }; &crypto { - u-boot,dm-pre-reloc; + u-boot,dm-spl; }; &uart2 { @@ -37,12 +46,12 @@ }; &grf { - u-boot,dm-pre-reloc; + u-boot,dm-spl; status = "okay"; }; &pmugrf { - u-boot,dm-pre-reloc; + u-boot,dm-spl; status = "okay"; }; @@ -87,12 +96,12 @@ }; &cru { - u-boot,dm-pre-reloc; + u-boot,dm-spl; status = "okay"; }; &pmucru { - u-boot,dm-pre-reloc; + u-boot,dm-spl; status = "okay"; }; @@ -132,7 +141,7 @@ }; &saradc { - u-boot,dm-spl; + u-boot,dm-pre-reloc; status = "okay"; }; @@ -194,7 +203,7 @@ }; }; -&gmac0_clkin{ +&gmac0_clkin { u-boot,dm-pre-reloc; }; @@ -391,15 +400,15 @@ }; &gpio2 { - u-boot,dm-pre-reloc; + u-boot,dm-spl; }; &pcfg_pull_none_drv_level_1 { - u-boot,dm-pre-reloc; + u-boot,dm-spl; }; &pcfg_pull_none_drv_level_2 { - u-boot,dm-pre-reloc; + u-boot,dm-spl; }; @@ -416,10 +425,6 @@ }; &pcfg_pull_none { - u-boot,dm-pre-reloc; -}; - -&secure_otp { u-boot,dm-spl; }; diff --git a/u-boot/arch/arm/dts/rk3568.dtsi b/u-boot/arch/arm/dts/rk3568.dtsi index 910161c..060a31b 100644 --- a/u-boot/arch/arm/dts/rk3568.dtsi +++ b/u-boot/arch/arm/dts/rk3568.dtsi @@ -1892,14 +1892,6 @@ status = "disabled"; }; - secure_otp: secure_otp@fe3a0000 { - compatible = "rockchip,rk3568-secure-otp"; - reg = <0x0 0xfe3a0000 0x0 0x4000>; - secure_conf = <0xfdd18008>; - mask_addr = <0xfe880000>; - cru_rst_addr = <0xfdd20470>; - }; - i2s0_8ch: i2s@fe400000 { compatible = "rockchip,rk3568-i2s-tdm"; reg = <0x0 0xfe400000 0x0 0x1000>; diff --git a/u-boot/arch/arm/dts/rk3588-u-boot.dtsi b/u-boot/arch/arm/dts/rk3588-u-boot.dtsi index 3fe8054..d0b82f6 100644 --- a/u-boot/arch/arm/dts/rk3588-u-boot.dtsi +++ b/u-boot/arch/arm/dts/rk3588-u-boot.dtsi @@ -173,7 +173,8 @@ &sdhci { bus-width = <8>; u-boot,dm-spl; - mmc-hs200-1_8v; + mmc-hs400-1_8v; + mmc-hs400-enhanced-strobe; non-removable; status = "okay"; }; diff --git a/u-boot/arch/arm/dts/rk3588.dtsi b/u-boot/arch/arm/dts/rk3588.dtsi index 8a13e8e..fbffe36 100644 --- a/u-boot/arch/arm/dts/rk3588.dtsi +++ b/u-boot/arch/arm/dts/rk3588.dtsi @@ -34,6 +34,8 @@ resets = <&cru SRST_A_USB3OTG1>; reset-names = "usb3-otg"; dr_mode = "host"; + phys = <&u2phy1_otg>; + phy-names = "usb2-phy"; phy_type = "utmi_wide"; snps,dis_enblslpm_quirk; snps,dis-u2-freeclk-exists-quirk; @@ -69,6 +71,8 @@ compatible = "rockchip,rk3588-usb2phy"; reg = <0x4000 0x10>; interrupts = <GIC_SPI 394 IRQ_TYPE_LEVEL_HIGH>; + resets = <&cru SRST_OTGPHY_U3_1>, <&cru SRST_P_USB2PHY_U3_1_GRF0>; + reset-names = "phy", "apb"; clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>; clock-names = "phyclk"; #clock-cells = <0>; diff --git a/u-boot/arch/arm/dts/rk3588s.dtsi b/u-boot/arch/arm/dts/rk3588s.dtsi index 53ccfba..ebe8761 100644 --- a/u-boot/arch/arm/dts/rk3588s.dtsi +++ b/u-boot/arch/arm/dts/rk3588s.dtsi @@ -44,6 +44,11 @@ spi3 = &spi3; spi4 = &spi4; spi5 = &sfc; + gpio0 = &gpio0; + gpio1 = &gpio1; + gpio2 = &gpio2; + gpio3 = &gpio3; + gpio4 = &gpio4; }; cpus { @@ -253,6 +258,8 @@ resets = <&cru SRST_A_USB3OTG0>; reset-names = "usb3-otg"; dr_mode = "otg"; + phys = <&u2phy0_otg>; + phy-names = "usb2-phy"; phy_type = "utmi_wide"; snps,dis_enblslpm_quirk; snps,dis-u1-entry-quirk; @@ -270,6 +277,8 @@ interrupts = <GIC_SPI 215 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST_ARB0>; clock-names = "usbhost", "arbiter"; + phys = <&u2phy2_host>; + phy-names = "usb2-phy"; power-domains = <&power RK3588_PD_USB>; status = "disabled"; }; @@ -280,6 +289,8 @@ interrupts = <GIC_SPI 216 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST_ARB0>; clock-names = "usbhost", "arbiter"; + phys = <&u2phy2_host>; + phy-names = "usb2-phy"; power-domains = <&power RK3588_PD_USB>; status = "disabled"; }; @@ -290,6 +301,8 @@ interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_HOST1>, <&cru HCLK_HOST_ARB1>; clock-names = "usbhost", "arbiter"; + phys = <&u2phy3_host>; + phy-names = "usb2-phy"; power-domains = <&power RK3588_PD_USB>; status = "disabled"; }; @@ -300,6 +313,8 @@ interrupts = <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru HCLK_HOST1>, <&cru HCLK_HOST_ARB1>; clock-names = "usbhost", "arbiter"; + phys = <&u2phy3_host>; + phy-names = "usb2-phy"; power-domains = <&power RK3588_PD_USB>; status = "disabled"; }; @@ -406,6 +421,8 @@ compatible = "rockchip,rk3588-usb2phy"; reg = <0x0 0x10>; interrupts = <GIC_SPI 393 IRQ_TYPE_LEVEL_HIGH>; + resets = <&cru SRST_OTGPHY_U3_0>, <&cru SRST_P_USB2PHY_U3_0_GRF0>; + reset-names = "phy", "apb"; clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>; clock-names = "phyclk"; #clock-cells = <0>; @@ -429,6 +446,8 @@ compatible = "rockchip,rk3588-usb2phy"; reg = <0x8000 0x10>; interrupts = <GIC_SPI 391 IRQ_TYPE_LEVEL_HIGH>; + resets = <&cru SRST_OTGPHY_U2_0>, <&cru SRST_P_USB2PHY_U2_0_GRF0>; + reset-names = "phy", "apb"; clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>; clock-names = "phyclk"; #clock-cells = <0>; @@ -452,6 +471,8 @@ compatible = "rockchip,rk3588-usb2phy"; reg = <0xc000 0x10>; interrupts = <GIC_SPI 392 IRQ_TYPE_LEVEL_HIGH>; + resets = <&cru SRST_OTGPHY_U2_1>, <&cru SRST_P_USB2PHY_U2_1_GRF0>; + reset-names = "phy", "apb"; clocks = <&cru CLK_USB2PHY_HDPTXRXPHY_REF>; clock-names = "phyclk"; #clock-cells = <0>; diff --git a/u-boot/arch/arm/dts/rv1106-evb2.dts b/u-boot/arch/arm/dts/rv1106-evb2.dts index ffc431c..71ad07b 100644 --- a/u-boot/arch/arm/dts/rv1106-evb2.dts +++ b/u-boot/arch/arm/dts/rv1106-evb2.dts @@ -7,6 +7,7 @@ #include "rv1106.dtsi" #include "rv1106-u-boot.dtsi" +#include <dt-bindings/input/input.h> / { model = "Rockchip RV1106 EVB2 Board"; @@ -15,6 +16,22 @@ chosen { stdout-path = &uart2; u-boot,spl-boot-order = &spi_nor, &emmc; + }; + + adc-keys { + compatible = "adc-keys"; + io-channels = <&saradc 0>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + u-boot,dm-spl; + status = "okay"; + + volumeup-key { + u-boot,dm-spl; + linux,code = <KEY_VOLUMEUP>; + label = "volume up"; + press-threshold-microvolt = <17578>; + }; }; }; @@ -63,6 +80,11 @@ status = "disabled"; }; +&saradc { + u-boot,dm-spl; + status = "okay"; +}; + &sdmmc { /delete-property/ u-boot,dm-spl; status = "disabled"; diff --git a/u-boot/arch/arm/dts/rv1106-u-boot.dtsi b/u-boot/arch/arm/dts/rv1106-u-boot.dtsi index 6196dba..b0632e9 100644 --- a/u-boot/arch/arm/dts/rv1106-u-boot.dtsi +++ b/u-boot/arch/arm/dts/rv1106-u-boot.dtsi @@ -15,7 +15,7 @@ u-boot,spl-boot-order = &sdmmc, &spi_nor, &spi_nand, &emmc; }; - secure_otp: secure_otp@ff3fd8000 { + secure-otp@ff3fd8000 { compatible = "rockchip,rv1106-secure-otp"; reg = <0xff3d8000 0x4000>; secure_conf = <0xff07a018>; @@ -112,8 +112,28 @@ u-boot,dm-spl; }; +&gpio0 { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&gpio1 { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&gpio2 { + u-boot,dm-pre-reloc; + status = "okay"; +}; + &gpio3 { u-boot,dm-spl; + status = "okay"; +}; + +&gpio4 { + u-boot,dm-pre-reloc; status = "okay"; }; @@ -159,3 +179,23 @@ spi-max-frequency = <100000000>; }; }; + +&u2phy { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&u2phy_otg { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&usbdrd { + u-boot,dm-pre-reloc; + status = "okay"; +}; + +&usbdrd_dwc3 { + u-boot,dm-pre-reloc; + status = "okay"; +}; diff --git a/u-boot/arch/arm/dts/rv1106.dtsi b/u-boot/arch/arm/dts/rv1106.dtsi index 1ac96f8..fed453e 100644 --- a/u-boot/arch/arm/dts/rv1106.dtsi +++ b/u-boot/arch/arm/dts/rv1106.dtsi @@ -492,7 +492,7 @@ }; saradc: saradc@ff3c0000 { - compatible = "rockchip,rk3588-saradc"; + compatible = "rockchip,rv1106-saradc"; reg = <0xff3c0000 0x100>; interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH>; #io-channel-cells = <1>; diff --git a/u-boot/arch/arm/dts/rv1126-u-boot.dtsi b/u-boot/arch/arm/dts/rv1126-u-boot.dtsi index 2bd1d6f..d3c98a8 100644 --- a/u-boot/arch/arm/dts/rv1126-u-boot.dtsi +++ b/u-boot/arch/arm/dts/rv1126-u-boot.dtsi @@ -15,10 +15,12 @@ u-boot,spl-boot-order = &sdmmc, &spi_nand, &spi_nor, &nandc, &emmc; }; - secure_otp: secure_otp@0xff5d0000 { + secure-otp@ff5d0000 { compatible = "rockchip,rv1126-secure-otp"; reg = <0xff5d0000 0x4000>; secure_conf = <0xfe0a0008>; + u-boot,dm-spl; + status = "okay"; }; }; @@ -147,11 +149,6 @@ }; &hw_decompress { - u-boot,dm-spl; - status = "okay"; -}; - -&secure_otp { u-boot,dm-spl; status = "okay"; }; diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h b/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h index bc1395e..063fd6b 100644 --- a/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h +++ b/u-boot/arch/arm/include/asm/arch-rockchip/boot_mode.h @@ -23,6 +23,8 @@ #define BOOT_UMS (REBOOT_FLAG + 12) /* enter dfu download mode */ #define BOOT_DFU (REBOOT_FLAG + 13) +/* reboot system quiescent */ +#define BOOT_QUIESCENT (REBOOT_FLAG + 14) /* enter bootrom download mode */ #define BOOT_BROM_DOWNLOAD 0xEF08A53C diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/clock.h b/u-boot/arch/arm/include/asm/arch-rockchip/clock.h index cabe1d5..8487615 100644 --- a/u-boot/arch/arm/include/asm/arch-rockchip/clock.h +++ b/u-boot/arch/arm/include/asm/arch-rockchip/clock.h @@ -12,6 +12,13 @@ #define RKCLK_PLL_MODE_NORMAL 1 #define RKCLK_PLL_MODE_DEEP 2 +/* + * PLL flags + */ +#define ROCKCHIP_PLL_SYNC_RATE BIT(0) +/* normal mode only. now only for pll_rk3036, pll_rk3328 type */ +#define ROCKCHIP_PLL_FIXED_MODE BIT(1) + enum { ROCKCHIP_SYSCON_NOC, ROCKCHIP_SYSCON_GRF, @@ -29,6 +36,7 @@ ROCKCHIP_SYSCON_PIPE_PHY2_GRF, ROCKCHIP_SYSCON_VOP_GRF, ROCKCHIP_SYSCON_VO_GRF, + ROCKCHIP_SYSCON_IOC, }; /* Standard Rockchip clock numbers */ diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3528.h b/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3528.h new file mode 100644 index 0000000..3576b03 --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3528.h @@ -0,0 +1,396 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2022 Rockchip Electronics Co. Ltd. + * Author: Joseph Chen <chenjh@rock-chips.com> + */ + +#ifndef _ASM_ARCH_CRU_RK3528_H +#define _ASM_ARCH_CRU_RK3528_H + +#define MHz 1000000 +#define KHz 1000 +#define OSC_HZ (24 * MHz) + +#define CPU_PVTPLL_HZ (1200 * MHz) +#define APLL_HZ (600 * MHz) +#define GPLL_HZ (1188 * MHz) +#define CPLL_HZ (996 * MHz) +#define PPLL_HZ (1000 * MHz) + +/* RK3528 pll id */ +enum rk3528_pll_id { + APLL, + CPLL, + GPLL, + PPLL, + DPLL, + PLL_COUNT, +}; + +struct rk3528_clk_info { + unsigned long id; + char *name; +}; + +struct rk3528_clk_priv { + struct rk3528_cru *cru; + struct rk3528_sysgrf *grf; + ulong ppll_hz; + ulong gpll_hz; + ulong cpll_hz; + ulong armclk_hz; + ulong armclk_enter_hz; + ulong armclk_init_hz; + bool sync_kernel; + bool set_armclk_rate; +}; + +struct rk3528_pll { + unsigned int con0; + unsigned int con1; + unsigned int con2; + unsigned int con3; + unsigned int con4; + unsigned int reserved0[3]; +}; + +struct rk3528_cru { + uint32_t apll_con[5]; + uint32_t reserved0014[3]; + uint32_t cpll_con[5]; + uint32_t reserved0034[11]; + uint32_t gpll_con[5]; + uint32_t reserved0074[51+32]; + uint32_t reserved01c0[48]; + uint32_t mode_con[1]; + uint32_t reserved0284[31]; + uint32_t clksel_con[91]; + uint32_t reserved046c[229]; + uint32_t gate_con[46]; + uint32_t reserved08b8[82]; + uint32_t softrst_con[47]; + uint32_t reserved0abc[81]; + uint32_t glb_cnt_th; + uint32_t glb_rst_st; + uint32_t glb_srst_fst; + uint32_t glb_srst_snd; + uint32_t glb_rst_con; + uint32_t reserved0c14[6]; + uint32_t corewfi_con; + uint32_t reserved0c30[15604]; + + /* pmucru */ + uint32_t reserved10000[192]; + uint32_t pmuclksel_con[3]; + uint32_t reserved1030c[317]; + uint32_t pmugate_con[3]; + uint32_t reserved1080c[125]; + uint32_t pmusoftrst_con[3]; + uint32_t reserved10a08[7550+8191]; + + /* pciecru */ + uint32_t reserved20000[32]; + uint32_t ppll_con[5]; + uint32_t reserved20094[155]; + uint32_t pcieclksel_con[2]; + uint32_t reserved20308[318]; + uint32_t pciegate_con; +}; +check_member(rk3528_cru, pciegate_con, 0x20800); + +struct rk3528_grf_clk_priv { + struct rk3528_grf *grf; +}; + +struct pll_rate_table { + unsigned long rate; + unsigned int fbdiv; + unsigned int postdiv1; + unsigned int refdiv; + unsigned int postdiv2; + unsigned int dsmpd; + unsigned int frac; +}; + +#define RK3528_PMU_CRU_BASE 0x10000 +#define RK3528_PCIE_CRU_BASE 0x20000 +#define RK3528_DDRPHY_CRU_BASE 0x28000 +#define RK3528_PLL_CON(x) ((x) * 0x4) +#define RK3528_PCIE_PLL_CON(x) ((x) * 0x4 + RK3528_PCIE_CRU_BASE) +#define RK3528_DDRPHY_PLL_CON(x) ((x) * 0x4 + RK3528_DDRPHY_CRU_BASE) +#define RK3528_MODE_CON 0x280 +#define RK3528_CLKSEL_CON(x) ((x) * 0x4 + 0x300) +#define RK3528_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3528_PMU_CRU_BASE) +#define RK3528_PCIE_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3528_PCIE_CRU_BASE) +#define RK3528_DDRPHY_MODE_CON (0x280 + RK3528_DDRPHY_CRU_BASE) + +#define RK3528_DIV_ACLK_M_CORE_MASK 0x1f +#define RK3528_DIV_ACLK_M_CORE_SHIFT 11 +#define RK3528_DIV_PCLK_DBG_MASK 0x1f +#define RK3528_DIV_PCLK_DBG_SHIFT 1 + +enum { + /* CRU_CLKSEL_CON00 */ + CLK_MATRIX_50M_SRC_DIV_SHIFT = 2, + CLK_MATRIX_50M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_50M_SRC_DIV_SHIFT, + CLK_MATRIX_100M_SRC_DIV_SHIFT = 7, + CLK_MATRIX_100M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_100M_SRC_DIV_SHIFT, + + /* CRU_CLKSEL_CON01 */ + CLK_MATRIX_150M_SRC_DIV_SHIFT = 0, + CLK_MATRIX_150M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_150M_SRC_DIV_SHIFT, + CLK_MATRIX_200M_SRC_DIV_SHIFT = 5, + CLK_MATRIX_200M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_200M_SRC_DIV_SHIFT, + CLK_MATRIX_250M_SRC_DIV_SHIFT = 10, + CLK_MATRIX_250M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_250M_SRC_DIV_SHIFT, + CLK_MATRIX_250M_SRC_SEL_SHIFT = 15, + CLK_MATRIX_250M_SRC_SEL_MASK = 0x1 << CLK_MATRIX_250M_SRC_SEL_SHIFT, + + /* CRU_CLKSEL_CON02 */ + CLK_MATRIX_300M_SRC_DIV_SHIFT = 0, + CLK_MATRIX_300M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_300M_SRC_DIV_SHIFT, + CLK_MATRIX_339M_SRC_DIV_SHIFT = 5, + CLK_MATRIX_339M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_339M_SRC_DIV_SHIFT, + CLK_MATRIX_400M_SRC_DIV_SHIFT = 10, + CLK_MATRIX_400M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_400M_SRC_DIV_SHIFT, + + /* CRU_CLKSEL_CON03 */ + CLK_MATRIX_500M_SRC_DIV_SHIFT = 6, + CLK_MATRIX_500M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_500M_SRC_DIV_SHIFT, + CLK_MATRIX_500M_SRC_SEL_SHIFT = 11, + CLK_MATRIX_500M_SRC_SEL_MASK = 0x1 << CLK_MATRIX_500M_SRC_SEL_SHIFT, + + /* CRU_CLKSEL_CON04 */ + CLK_MATRIX_600M_SRC_DIV_SHIFT = 0, + CLK_MATRIX_600M_SRC_DIV_MASK = 0x1F << CLK_MATRIX_600M_SRC_DIV_SHIFT, + CLK_MATRIX_250M_SRC_SEL_CLK_GPLL_MUX = 0U, + CLK_MATRIX_250M_SRC_SEL_CLK_CPLL_MUX = 1U, + CLK_MATRIX_500M_SRC_SEL_CLK_GPLL_MUX = 0U, + CLK_MATRIX_500M_SRC_SEL_CLK_CPLL_MUX = 1U, + + /* PMUCRU_CLKSEL_CON00 */ + CLK_I2C2_SEL_SHIFT = 0, + CLK_I2C2_SEL_MASK = 0x3 << CLK_I2C2_SEL_SHIFT, + + /* PCIE_CRU_CLKSEL_CON01 */ + PCIE_CLK_MATRIX_50M_SRC_DIV_SHIFT = 7, + PCIE_CLK_MATRIX_50M_SRC_DIV_MASK = 0x1f << PCIE_CLK_MATRIX_50M_SRC_DIV_SHIFT, + PCIE_CLK_MATRIX_100M_SRC_DIV_SHIFT = 11, + PCIE_CLK_MATRIX_100M_SRC_DIV_MASK = 0x1f << PCIE_CLK_MATRIX_100M_SRC_DIV_SHIFT, + + /* CRU_CLKSEL_CON32 */ + DCLK_VOP_SRC0_SEL_SHIFT = 10, + DCLK_VOP_SRC0_SEL_MASK = 0x1 << DCLK_VOP_SRC0_SEL_SHIFT, + DCLK_VOP_SRC0_DIV_SHIFT = 2, + DCLK_VOP_SRC0_DIV_MASK = 0xFF << DCLK_VOP_SRC0_DIV_SHIFT, + + /* CRU_CLKSEL_CON33 */ + DCLK_VOP_SRC1_SEL_SHIFT = 8, + DCLK_VOP_SRC1_SEL_MASK = 0x1 << DCLK_VOP_SRC1_SEL_SHIFT, + DCLK_VOP_SRC1_DIV_SHIFT = 0, + DCLK_VOP_SRC1_DIV_MASK = 0xFF << DCLK_VOP_SRC1_DIV_SHIFT, + + /* CRU_CLKSEL_CON43 */ + CLK_CORE_CRYPTO_SEL_SHIFT = 14, + CLK_CORE_CRYPTO_SEL_MASK = 0x3 << CLK_CORE_CRYPTO_SEL_SHIFT, + ACLK_BUS_VOPGL_ROOT_DIV_SHIFT = 0U, + ACLK_BUS_VOPGL_ROOT_DIV_MASK = 0x7U << ACLK_BUS_VOPGL_ROOT_DIV_SHIFT, + + /* CRU_CLKSEL_CON44 */ + CLK_PWM0_SEL_SHIFT = 6, + CLK_PWM0_SEL_MASK = 0x3 << CLK_PWM0_SEL_SHIFT, + CLK_PWM1_SEL_SHIFT = 8, + CLK_PWM1_SEL_MASK = 0x3 << CLK_PWM1_SEL_SHIFT, + CLK_PWM0_SEL_CLK_MATRIX_100M_SRC = 0U, + CLK_PWM0_SEL_CLK_MATRIX_50M_SRC = 1U, + CLK_PWM0_SEL_XIN_OSC0_FUNC = 2U, + CLK_PWM1_SEL_CLK_MATRIX_100M_SRC = 0U, + CLK_PWM1_SEL_CLK_MATRIX_50M_SRC = 1U, + CLK_PWM1_SEL_XIN_OSC0_FUNC = 2U, + CLK_PKA_CRYPTO_SEL_SHIFT = 0, + CLK_PKA_CRYPTO_SEL_MASK = 0x3 << CLK_PKA_CRYPTO_SEL_SHIFT, + CLK_CORE_CRYPTO_SEL_CLK_MATRIX_300M_SRC = 0U, + CLK_CORE_CRYPTO_SEL_CLK_MATRIX_200M_SRC = 1U, + CLK_CORE_CRYPTO_SEL_CLK_MATRIX_100M_SRC = 2U, + CLK_CORE_CRYPTO_SEL_XIN_OSC0_FUNC = 3U, + CLK_PKA_CRYPTO_SEL_CLK_MATRIX_300M_SRC = 0U, + CLK_PKA_CRYPTO_SEL_CLK_MATRIX_200M_SRC = 1U, + CLK_PKA_CRYPTO_SEL_CLK_MATRIX_100M_SRC = 2U, + CLK_PKA_CRYPTO_SEL_XIN_OSC0_FUNC = 3U, + + /* CRU_CLKSEL_CON60 */ + CLK_MATRIX_25M_SRC_DIV_SHIFT = 2, + CLK_MATRIX_25M_SRC_DIV_MASK = 0xff << CLK_MATRIX_25M_SRC_DIV_SHIFT, + CLK_MATRIX_125M_SRC_DIV_SHIFT = 10, + CLK_MATRIX_125M_SRC_DIV_MASK = 0x1f << CLK_MATRIX_125M_SRC_DIV_SHIFT, + + /* CRU_CLKSEL_CON61 */ + SCLK_SFC_DIV_SHIFT = 6, + SCLK_SFC_DIV_MASK = 0x3F << SCLK_SFC_DIV_SHIFT, + SCLK_SFC_SEL_SHIFT = 12, + SCLK_SFC_SEL_MASK = 0x3 << SCLK_SFC_SEL_SHIFT, + SCLK_SFC_SEL_CLK_GPLL_MUX = 0U, + SCLK_SFC_SEL_CLK_CPLL_MUX = 1U, + SCLK_SFC_SEL_XIN_OSC0_FUNC = 2U, + + /* CRU_CLKSEL_CON62 */ + CCLK_SRC_EMMC_DIV_SHIFT = 0, + CCLK_SRC_EMMC_DIV_MASK = 0x3F << CCLK_SRC_EMMC_DIV_SHIFT, + CCLK_SRC_EMMC_SEL_SHIFT = 6, + CCLK_SRC_EMMC_SEL_MASK = 0x3 << CCLK_SRC_EMMC_SEL_SHIFT, + BCLK_EMMC_SEL_SHIFT = 8, + BCLK_EMMC_SEL_MASK = 0x3 << BCLK_EMMC_SEL_SHIFT, + + /* CRU_CLKSEL_CON63 */ + CLK_I2C3_SEL_SHIFT = 12, + CLK_I2C3_SEL_MASK = 0x3 << CLK_I2C3_SEL_SHIFT, + CLK_I2C5_SEL_SHIFT = 14, + CLK_I2C5_SEL_MASK = 0x3 << CLK_I2C5_SEL_SHIFT, + CLK_SPI1_SEL_SHIFT = 10, + CLK_SPI1_SEL_MASK = 0x3 << CLK_SPI1_SEL_SHIFT, + + /* CRU_CLKSEL_CON64 */ + CLK_I2C6_SEL_SHIFT = 0, + CLK_I2C6_SEL_MASK = 0x3 << CLK_I2C6_SEL_SHIFT, + + /* CRU_CLKSEL_CON74 */ + CLK_SARADC_DIV_SHIFT = 0, + CLK_SARADC_DIV_MASK = 0x7 << CLK_SARADC_DIV_SHIFT, + CLK_TSADC_DIV_SHIFT = 3, + CLK_TSADC_DIV_MASK = 0x1F << CLK_TSADC_DIV_SHIFT, + CLK_TSADC_TSEN_DIV_SHIFT = 8, + CLK_TSADC_TSEN_DIV_MASK = 0x1F << CLK_TSADC_TSEN_DIV_SHIFT, + + /* CRU_CLKSEL_CON79 */ + CLK_I2C1_SEL_SHIFT = 9, + CLK_I2C1_SEL_MASK = 0x3 << CLK_I2C1_SEL_SHIFT, + CLK_I2C0_SEL_SHIFT = 11, + CLK_I2C0_SEL_MASK = 0x3 << CLK_I2C0_SEL_SHIFT, + CLK_SPI0_SEL_SHIFT = 13, + CLK_SPI0_SEL_MASK = 0x3 << CLK_SPI0_SEL_SHIFT, + + /* CRU_CLKSEL_CON83 */ + ACLK_VOP_ROOT_DIV_SHIFT = 12, + ACLK_VOP_ROOT_DIV_MASK = 0x7 << ACLK_VOP_ROOT_DIV_SHIFT, + ACLK_VOP_ROOT_SEL_SHIFT = 15, + ACLK_VOP_ROOT_SEL_MASK = 0x1 << ACLK_VOP_ROOT_SEL_SHIFT, + + /* CRU_CLKSEL_CON84 */ + DCLK_VOP0_SEL_SHIFT = 0, + DCLK_VOP0_SEL_MASK = 0x1 << DCLK_VOP0_SEL_SHIFT, + DCLK_VOP_SRC_SEL_CLK_GPLL_MUX = 0U, + DCLK_VOP_SRC_SEL_CLK_CPLL_MUX = 1U, + ACLK_VOP_ROOT_SEL_CLK_GPLL_MUX = 0U, + ACLK_VOP_ROOT_SEL_CLK_CPLL_MUX = 1U, + DCLK_VOP0_SEL_DCLK_VOP_SRC0 = 0U, + DCLK_VOP0_SEL_CLK_HDMIPHY_PIXEL_IO = 1U, + + /* CRU_CLKSEL_CON85 */ + CLK_I2C4_SEL_SHIFT = 13, + CLK_I2C4_SEL_MASK = 0x3 << CLK_I2C4_SEL_SHIFT, + CLK_I2C7_SEL_SHIFT = 0, + CLK_I2C7_SEL_MASK = 0x3 << CLK_I2C7_SEL_SHIFT, + CLK_I2C3_SEL_CLK_MATRIX_200M_SRC = 0U, + CLK_I2C3_SEL_CLK_MATRIX_100M_SRC = 1U, + CLK_I2C3_SEL_CLK_MATRIX_50M_SRC = 2U, + CLK_I2C3_SEL_XIN_OSC0_FUNC = 3U, + CLK_SPI1_SEL_CLK_MATRIX_200M_SRC = 0U, + CLK_SPI1_SEL_CLK_MATRIX_100M_SRC = 1U, + CLK_SPI1_SEL_CLK_MATRIX_50M_SRC = 2U, + CLK_SPI1_SEL_XIN_OSC0_FUNC = 3U, + CCLK_SRC_SDMMC0_DIV_SHIFT = 0, + CCLK_SRC_SDMMC0_DIV_MASK = 0x3F << CCLK_SRC_SDMMC0_DIV_SHIFT, + CCLK_SRC_SDMMC0_SEL_SHIFT = 6, + CCLK_SRC_SDMMC0_SEL_MASK = 0x3 << CCLK_SRC_SDMMC0_SEL_SHIFT, + CCLK_SRC_EMMC_SEL_CLK_GPLL_MUX = 0U, + CCLK_SRC_EMMC_SEL_CLK_CPLL_MUX = 1U, + CCLK_SRC_EMMC_SEL_XIN_OSC0_FUNC = 2U, + BCLK_EMMC_SEL_CLK_MATRIX_200M_SRC = 0U, + BCLK_EMMC_SEL_CLK_MATRIX_100M_SRC = 1U, + BCLK_EMMC_SEL_CLK_MATRIX_50M_SRC = 2U, + BCLK_EMMC_SEL_XIN_OSC0_FUNC = 3U, + CCLK_SRC_SDMMC0_SEL_CLK_GPLL_MUX = 0U, + CCLK_SRC_SDMMC0_SEL_CLK_CPLL_MUX = 1U, + CCLK_SRC_SDMMC0_SEL_XIN_OSC0_FUNC = 2U, + + /* CRU_CLKSEL_CON04 */ + CLK_UART0_SRC_DIV_SHIFT = 5, + CLK_UART0_SRC_DIV_MASK = 0x1F << CLK_UART0_SRC_DIV_SHIFT, + /* CRU_CLKSEL_CON05 */ + CLK_UART0_FRAC_DIV_SHIFT = 0, + CLK_UART0_FRAC_DIV_MASK = 0xFFFFFFFF << CLK_UART0_FRAC_DIV_SHIFT, + /* CRU_CLKSEL_CON06 */ + SCLK_UART0_SRC_SEL_SHIFT = 0, + SCLK_UART0_SRC_SEL_MASK = 0x3 << SCLK_UART0_SRC_SEL_SHIFT, + CLK_UART1_SRC_DIV_SHIFT = 2, + CLK_UART1_SRC_DIV_MASK = 0x1F << CLK_UART1_SRC_DIV_SHIFT, + /* CRU_CLKSEL_CON07 */ + CLK_UART1_FRAC_DIV_SHIFT = 0, + CLK_UART1_FRAC_DIV_MASK = 0xFFFFFFFF << CLK_UART1_FRAC_DIV_SHIFT, + /* CRU_CLKSEL_CON08 */ + SCLK_UART1_SRC_SEL_SHIFT = 0, + SCLK_UART1_SRC_SEL_MASK = 0x3 << SCLK_UART1_SRC_SEL_SHIFT, + CLK_UART2_SRC_DIV_SHIFT = 2, + CLK_UART2_SRC_DIV_MASK = 0x1F << CLK_UART2_SRC_DIV_SHIFT, + /* CRU_CLKSEL_CON09 */ + CLK_UART2_FRAC_DIV_SHIFT = 0, + CLK_UART2_FRAC_DIV_MASK = 0xFFFFFFFF << CLK_UART2_FRAC_DIV_SHIFT, + /* CRU_CLKSEL_CON10 */ + SCLK_UART2_SRC_SEL_SHIFT = 0, + SCLK_UART2_SRC_SEL_MASK = 0x3 << SCLK_UART2_SRC_SEL_SHIFT, + CLK_UART3_SRC_DIV_SHIFT = 2, + CLK_UART3_SRC_DIV_MASK = 0x1F << CLK_UART3_SRC_DIV_SHIFT, + /* CRU_CLKSEL_CON11 */ + CLK_UART3_FRAC_DIV_SHIFT = 0, + CLK_UART3_FRAC_DIV_MASK = 0xFFFFFFFF << CLK_UART3_FRAC_DIV_SHIFT, + /* CRU_CLKSEL_CON12 */ + SCLK_UART3_SRC_SEL_SHIFT = 0, + SCLK_UART3_SRC_SEL_MASK = 0x3 << SCLK_UART3_SRC_SEL_SHIFT, + CLK_UART4_SRC_DIV_SHIFT = 2, + CLK_UART4_SRC_DIV_MASK = 0x1F << CLK_UART4_SRC_DIV_SHIFT, + /* CRU_CLKSEL_CON13 */ + CLK_UART4_FRAC_DIV_SHIFT = 0, + CLK_UART4_FRAC_DIV_MASK = 0xFFFFFFFF << CLK_UART4_FRAC_DIV_SHIFT, + /* CRU_CLKSEL_CON14 */ + SCLK_UART4_SRC_SEL_SHIFT = 0, + SCLK_UART4_SRC_SEL_MASK = 0x3 << SCLK_UART4_SRC_SEL_SHIFT, + CLK_UART5_SRC_DIV_SHIFT = 2, + CLK_UART5_SRC_DIV_MASK = 0x1F << CLK_UART5_SRC_DIV_SHIFT, + /* CRU_CLKSEL_CON15 */ + CLK_UART5_FRAC_DIV_SHIFT = 0, + CLK_UART5_FRAC_DIV_MASK = 0xFFFFFFFF << CLK_UART5_FRAC_DIV_SHIFT, + /* CRU_CLKSEL_CON16 */ + SCLK_UART5_SRC_SEL_SHIFT = 0, + SCLK_UART5_SRC_SEL_MASK = 0x3 << SCLK_UART5_SRC_SEL_SHIFT, + CLK_UART6_SRC_DIV_SHIFT = 2, + CLK_UART6_SRC_DIV_MASK = 0x1F << CLK_UART6_SRC_DIV_SHIFT, + /* CRU_CLKSEL_CON17 */ + CLK_UART6_FRAC_DIV_SHIFT = 0, + CLK_UART6_FRAC_DIV_MASK = 0xFFFFFFFF << CLK_UART6_FRAC_DIV_SHIFT, + /* CRU_CLKSEL_CON18 */ + SCLK_UART6_SRC_SEL_SHIFT = 0, + SCLK_UART6_SRC_SEL_MASK = 0x3 << SCLK_UART6_SRC_SEL_SHIFT, + CLK_UART7_SRC_DIV_SHIFT = 2, + CLK_UART7_SRC_DIV_MASK = 0x1F << CLK_UART7_SRC_DIV_SHIFT, + /* CRU_CLKSEL_CON19 */ + CLK_UART7_FRAC_DIV_SHIFT = 0, + CLK_UART7_FRAC_DIV_MASK = 0xFFFFFFFF << CLK_UART7_FRAC_DIV_SHIFT, + /* CRU_CLKSEL_CON20 */ + SCLK_UART7_SRC_SEL_SHIFT = 0, + SCLK_UART7_SRC_SEL_MASK = 0x3 << SCLK_UART7_SRC_SEL_SHIFT, + SCLK_UART0_SRC_SEL_CLK_UART0_SRC = 0U, + SCLK_UART0_SRC_SEL_CLK_UART0_FRAC = 1U, + SCLK_UART0_SRC_SEL_XIN_OSC0_FUNC = 2U, + + /* CRU_CLKSEL_CON60 */ + CLK_GMAC1_VPU_25M_DIV_SHIFT = 2, + CLK_GMAC1_VPU_25M_DIV_MASK = 0xFF << CLK_GMAC1_VPU_25M_DIV_SHIFT, + /* CRU_CLKSEL_CON66 */ + CLK_GMAC1_SRC_VPU_DIV_SHIFT = 0, + CLK_GMAC1_SRC_VPU_DIV_MASK = 0x3F << CLK_GMAC1_SRC_VPU_DIV_SHIFT, + /* CRU_CLKSEL_CON84 */ + CLK_GMAC0_SRC_DIV_SHIFT = 3, + CLK_GMAC0_SRC_DIV_MASK = 0x3F << CLK_GMAC0_SRC_DIV_SHIFT, +}; + +#endif diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3562.h b/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3562.h new file mode 100644 index 0000000..db67e14 --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/cru_rk3562.h @@ -0,0 +1,416 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2022 Rockchip Electronics Co. Ltd. + * Author: + * Elaine Zhang <zhangqing@rock-chips.com> + * Finley Xiao <finley.xiao@rock-chips.com> + */ + +#ifndef _ASM_ARCH_CRU_RK3562_H +#define _ASM_ARCH_CRU_RK3562_H + +#define MHz 1000000 +#define KHz 1000 +#define OSC_HZ (24 * MHz) + +#define CPU_PVTPLL_HZ (1008 * MHz) +#define APLL_HZ (600 * MHz) +#define GPLL_HZ (1188 * MHz) +#define CPLL_HZ (1000 * MHz) +#define HPLL_HZ (1000 * MHz) + +/* RK3562 pll id */ +enum rk3562_pll_id { + APLL, + GPLL, + VPLL, + HPLL, + CPLL, + DPLL, + PLL_COUNT, +}; + +struct rk3562_clk_info { + unsigned long id; + char *name; +}; + +struct rk3562_clk_priv { + struct rk3562_cru *cru; + ulong gpll_hz; + ulong vpll_hz; + ulong hpll_hz; + ulong cpll_hz; + ulong armclk_hz; + ulong armclk_enter_hz; + ulong armclk_init_hz; + bool sync_kernel; + bool set_armclk_rate; +}; + +struct rk3562_cru { + /* top cru */ + uint32_t apll_con[5]; + uint32_t reserved0014[19]; + uint32_t gpll_con[5]; + uint32_t reserved0074[3]; + uint32_t vpll_con[5]; + uint32_t reserved0094[3]; + uint32_t hpll_con[5]; + uint32_t reserved00b4[19]; + uint32_t clksel_con[48]; + uint32_t reserved01c0[80]; + uint32_t gate_con[28]; + uint32_t reserved370[36]; + uint32_t softrst_con[28]; + uint32_t reserved0470[100]; + uint32_t mode_con[1]; + uint32_t reserved0604[3]; + uint32_t glb_cnt_th; + uint32_t glb_srst_fst; + uint32_t glb_srst_snd; + uint32_t glb_rst_con; + uint32_t glb_rst_st; + unsigned int sdmmc0_con[2]; + unsigned int sdmmc1_con[2]; + uint32_t reserved0634[2]; + unsigned int emmc_con[1]; + uint32_t reserved0640[15984]; + + /* pmu0 cru */ + uint32_t reserved10000[64]; + uint32_t pmu0clksel_con[4]; + uint32_t reserved10110[28]; + uint32_t pmu0gate_con[3]; + uint32_t reserved1018c[29]; + uint32_t pmu0softrst_con[3]; + uint32_t reserved1020c[8061]; + + /* pmu1 cru */ + uint32_t reserved18000[16]; + uint32_t cpll_con[5]; + uint32_t reserved18054[43]; + uint32_t pmu1clksel_con[7]; + uint32_t reserved1811c[25]; + uint32_t pmu1gate_con[4]; + uint32_t reserved18190[28]; + uint32_t pmu1softrst_con[3]; + uint32_t reserved1820c[93]; + uint32_t pmu1mode_con[1]; + uint32_t reserved18384[7967]; + + /* ddr cru */ + uint32_t reserved20000[64]; + uint32_t ddrclksel_con[2]; + uint32_t reserved20108[30]; + uint32_t ddrgate_con[2]; + uint32_t reserved20188[30]; + uint32_t ddrsoftrst_con[2]; + uint32_t reserved20208[8062]; + + /* subddr cru */ + uint32_t reserved28000[8]; + uint32_t dpll_con[5]; + uint32_t reserved28034[51]; + uint32_t sudbddrclksel_con[1]; + uint32_t reserved28104[31]; + uint32_t subddrgate_con[1]; + uint32_t reserved28184[31]; + uint32_t sudbddrsoftrst_con[1]; + uint32_t reserved28204[95]; + uint32_t subddrmode_con[1]; + uint32_t reserved28384[7967]; + + /* peri cru */ + uint32_t reserved30000[64]; + uint32_t periclksel_con[48]; + uint32_t reserved301c0[80]; + uint32_t perigate_con[18]; + uint32_t reserved30348[46]; + uint32_t perisoftrst_con[18]; + uint32_t reserved30448[143]; +}; +check_member(rk3562_cru, reserved0640[0], 0x00640); +check_member(rk3562_cru, reserved1020c[0], 0x1020c); +check_member(rk3562_cru, reserved18384[0], 0x18384); +check_member(rk3562_cru, reserved20208[0], 0x20208); +check_member(rk3562_cru, reserved28384[0], 0x28384); +check_member(rk3562_cru, reserved30448[0], 0x30448); + +struct pll_rate_table { + unsigned long rate; + unsigned int fbdiv; + unsigned int postdiv1; + unsigned int refdiv; + unsigned int postdiv2; + unsigned int dsmpd; + unsigned int frac; +}; + +#define RK3562_PMU0_CRU_BASE 0x10000 +#define RK3562_PMU1_CRU_BASE 0x18000 +#define RK3562_DDR_CRU_BASE 0x20000 +#define RK3562_SUBDDR_CRU_BASE 0x28000 +#define RK3562_PERI_CRU_BASE 0x30000 + +#define RK3562_PLL_CON(x) ((x) * 0x4) +#define RK3562_PMU1_PLL_CON(x) ((x) * 0x4 + RK3562_PMU1_CRU_BASE + 0x40) +#define RK3562_SUBDDR_PLL_CON(x) ((x) * 0x4 + RK3562_SUBDDR_CRU_BASE + 0x20) +#define RK3562_MODE_CON 0x600 +#define RK3562_PMU1_MODE_CON (RK3562_PMU1_CRU_BASE + 0x380) +#define RK3562_SUBDDR_MODE_CON (RK3562_SUBDDR_CRU_BASE + 0x380) +#define RK3562_GLB_SRST_FST 0x614 +#define RK3562_GLB_SRST_SND 0x618 +#define RK3562_GLB_RST_CON 0x61c +#define RK3562_GLB_RST_ST 0x620 + +enum { + /* CRU_CLKSEL_CON10 */ + CLK_CORE_PRE_DIV_SHIFT = 0, + CLK_CORE_PRE_DIV_MASK = 0x1f << CLK_CORE_PRE_DIV_SHIFT, + + /* CRU_CLKSEL_CON11 */ + ACLK_CORE_PRE_DIV_SHIFT = 0, + ACLK_CORE_PRE_DIV_MASK = 0x7 << ACLK_CORE_PRE_DIV_SHIFT, + CLK_SCANHS_ACLKM_CORE_DIV_SHIFT = 8, + CLK_SCANHS_ACLKM_CORE_DIV_MASK = 0x7 << CLK_SCANHS_ACLKM_CORE_DIV_SHIFT, + + /* CRU_CLKSEL_CON12 */ + PCLK_DBG_PRE_DIV_SHIFT = 0, + PCLK_DBG_PRE_DIV_MASK = 0xf << PCLK_DBG_PRE_DIV_SHIFT, + CLK_SCANHS_PCLK_DBG_DIV_SHIFT = 8, + CLK_SCANHS_PCLK_DBG_DIV_MASK = 0xf << CLK_SCANHS_PCLK_DBG_DIV_SHIFT, + + /* CRU_CLKSEL_CON28 */ + ACLK_VOP_DIV_SHIFT = 0, + ACLK_VOP_DIV_MASK = 0x1f << ACLK_VOP_DIV_SHIFT, + ACLK_VOP_SEL_SHIFT = 6, + ACLK_VOP_SEL_MASK = 0x3 << ACLK_VOP_SEL_SHIFT, + ACLK_VOP_SEL_GPLL = 0, + ACLK_VOP_SEL_CPLL, + ACLK_VOP_SEL_VPLL, + ACLK_VOP_SEL_HPLL, + + /* CRU_CLKSEL_CON30 */ + DCLK_VOP_DIV_SHIFT = 0, + DCLK_VOP_DIV_MASK = 0xff << DCLK_VOP_DIV_SHIFT, + DCLK_VOP_SEL_SHIFT = 14, + DCLK_VOP_SEL_MASK = 0x3 << DCLK_VOP_SEL_SHIFT, + DCLK_VOP_SEL_GPLL = 0, + DCLK_VOP_SEL_HPLL, + DCLK_VOP_SEL_VPLL, + DCLK_VOP_SEL_APLL, + + /* CRU_CLKSEL_CON31 */ + DCLK_VOP1_DIV_SHIFT = 0, + DCLK_VOP1_DIV_MASK = 0xff << DCLK_VOP1_DIV_SHIFT, + DCLK_VOP1_SEL_SHIFT = 14, + DCLK_VOP1_SEL_MASK = 0x3 << DCLK_VOP1_SEL_SHIFT, + + /* CRU_CLKSEL_CON40 */ + ACLK_BUS_DIV_SHIFT = 0, + ACLK_BUS_DIV_MASK = 0x1f << ACLK_BUS_DIV_SHIFT, + ACLK_BUS_SEL_SHIFT = 7, + ACLK_BUS_SEL_MASK = 0x1 << ACLK_BUS_SEL_SHIFT, + ACLK_BUS_SEL_GPLL = 0, + ACLK_BUS_SEL_CPLL, + HCLK_BUS_DIV_SHIFT = 8, + HCLK_BUS_DIV_MASK = 0x3f << HCLK_BUS_DIV_SHIFT, + HCLK_BUS_SEL_SHIFT = 15, + HCLK_BUS_SEL_MASK = 0x1 << HCLK_BUS_SEL_SHIFT, + + /* CRU_CLKSEL_CON41 */ + PCLK_BUS_DIV_SHIFT = 0, + PCLK_BUS_DIV_MASK = 0x1f << PCLK_BUS_DIV_SHIFT, + PCLK_BUS_SEL_SHIFT = 7, + PCLK_BUS_SEL_MASK = 0x1 << PCLK_BUS_SEL_SHIFT, + CLK_I2C_SEL_SHIFT = 8, + CLK_I2C_SEL_MASK = 0x3 << CLK_I2C_SEL_SHIFT, + CLK_I2C_SEL_200M = 0, + CLK_I2C_SEL_100M, + CLK_I2C_SEL_50M, + CLK_I2C_SEL_24M, + DCLK_BUS_GPIO_SEL_SHIFT = 15, + DCLK_BUS_GPIO_SEL_MASK = 0x1 << DCLK_BUS_GPIO_SEL_SHIFT, + + /* CRU_CLKSEL_CON43 */ + CLK_TSADC_DIV_SHIFT = 0, + CLK_TSADC_DIV_MASK = 0x7ff << CLK_TSADC_DIV_SHIFT, + CLK_TSADC_TSEN_DIV_SHIFT = 11, + CLK_TSADC_TSEN_DIV_MASK = 0x1f << CLK_TSADC_TSEN_DIV_SHIFT, + + /* CRU_CLKSEL_CON44 */ + CLK_SARADC_VCCIO156_DIV_SHIFT = 0, + CLK_SARADC_VCCIO156_DIV_MASK = 0xfff << CLK_SARADC_VCCIO156_DIV_SHIFT, + + /* CRU_CLKSEL_CON45 */ + CLK_GMAC_125M_SEL_SHIFT = 8, + CLK_GMAC_125M_SEL_MASK = 0x1 << CLK_GMAC_125M_SEL_SHIFT, + CLK_GMAC_125M = 0, + CLK_GMAC_24M, + CLK_GMAC_50M_SEL_SHIFT = 7, + CLK_GMAC_50M_SEL_MASK = 0x1 << CLK_GMAC_50M_SEL_SHIFT, + CLK_GMAC_50M = 0, + + /* CRU_CLKSEL_CON46 */ + CLK_GMAC_ETH_OUT2IO_SEL_SHIFT = 7, + CLK_GMAC_ETH_OUT2IO_SEL_MASK = 0x1 << CLK_GMAC_ETH_OUT2IO_SEL_SHIFT, + CLK_GMAC_ETH_OUT2IO_GPLL = 0, + CLK_GMAC_ETH_OUT2IO_CPLL, + CLK_GMAC_ETH_OUT2IO_DIV_SHIFT = 0, + CLK_GMAC_ETH_OUT2IO_DIV_MASK = 0x7f, + + /* PMU0CRU_CLKSEL_CON03 */ + CLK_PMU0_I2C0_DIV_SHIFT = 8, + CLK_PMU0_I2C0_DIV_MASK = 0x1f << CLK_PMU0_I2C0_DIV_SHIFT, + CLK_PMU0_I2C0_SEL_SHIFT = 14, + CLK_PMU0_I2C0_SEL_MASK = 0x3 << CLK_PMU0_I2C0_SEL_SHIFT, + CLK_PMU0_I2C0_SEL_200M = 0, + CLK_PMU0_I2C0_SEL_24M, + CLK_PMU0_I2C0_SEL_32K, + + /* PMU1CRU_CLKSEL_CON02 */ + CLK_PMU1_UART0_SRC_DIV_SHIFT = 0, + CLK_PMU1_UART0_SRC_DIV_MASK = 0xf << CLK_PMU1_UART0_SRC_DIV_SHIFT, + CLK_PMU1_UART0_SEL_SHIFT = 6, + CLK_PMU1_UART0_SEL_MASK = 0x3 << CLK_PMU1_UART0_SEL_SHIFT, + + /* PMU1CRU_CLKSEL_CON04 */ + CLK_PMU1_SPI0_DIV_SHIFT = 0, + CLK_PMU1_SPI0_DIV_MASK = 0x3 << CLK_PMU1_SPI0_DIV_SHIFT, + CLK_PMU1_SPI0_SEL_SHIFT = 6, + CLK_PMU1_SPI0_SEL_MASK = 0x3 << CLK_PMU1_SPI0_SEL_SHIFT, + CLK_PMU1_SPI0_SEL_200M = 0, + CLK_PMU1_SPI0_SEL_24M, + CLK_PMU1_SPI0_SEL_32K, + CLK_PMU1_PWM0_DIV_SHIFT = 8, + CLK_PMU1_PWM0_DIV_MASK = 0x3 << CLK_PMU1_PWM0_DIV_SHIFT, + CLK_PMU1_PWM0_SEL_SHIFT = 14, + CLK_PMU1_PWM0_SEL_MASK = 0x3 << CLK_PMU1_PWM0_SEL_SHIFT, + CLK_PMU1_PWM0_SEL_200M = 0, + CLK_PMU1_PWM0_SEL_24M, + CLK_PMU1_PWM0_SEL_32K, + + /* PERICRU_CLKSEL_CON00 */ + ACLK_PERI_DIV_SHIFT = 0, + ACLK_PERI_DIV_MASK = 0x1f << ACLK_PERI_DIV_SHIFT, + ACLK_PERI_SEL_SHIFT = 7, + ACLK_PERI_SEL_MASK = 0x1 << ACLK_PERI_SEL_SHIFT, + ACLK_PERI_SEL_GPLL = 0, + ACLK_PERI_SEL_CPLL, + HCLK_PERI_DIV_SHIFT = 8, + HCLK_PERI_DIV_MASK = 0x3f << HCLK_PERI_DIV_SHIFT, + HCLK_PERI_SEL_SHIFT = 15, + HCLK_PERI_SEL_MASK = 0x1 << HCLK_PERI_SEL_SHIFT, + + /* PERICRU_CLKSEL_CON01 */ + PCLK_PERI_DIV_SHIFT = 0, + PCLK_PERI_DIV_MASK = 0x1f << PCLK_PERI_DIV_SHIFT, + PCLK_PERI_SEL_SHIFT = 7, + PCLK_PERI_SEL_MASK = 0x1 << PCLK_PERI_SEL_SHIFT, + CLK_SAI0_SRC_DIV_SHIFT = 8, + CLK_SAI0_SRC_DIV_MASK = 0x3f << CLK_SAI0_SRC_DIV_SHIFT, + CLK_SAI0_SRC_SEL_SHIFT = 14, + CLK_SAI0_SRC_SEL_MASK = 0x3 << CLK_SAI0_SRC_SEL_SHIFT, + + /* PERICRU_CLKSEL_CON16 */ + CCLK_SDMMC0_DIV_SHIFT = 0, + CCLK_SDMMC0_DIV_MASK = 0xff << CCLK_SDMMC0_DIV_SHIFT, + CCLK_SDMMC0_SEL_SHIFT = 14, + CCLK_SDMMC0_SEL_MASK = 0x3 << CCLK_SDMMC0_SEL_SHIFT, + CCLK_SDMMC_SEL_GPLL = 0, + CCLK_SDMMC_SEL_CPLL, + CCLK_SDMMC_SEL_24M, + CCLK_SDMMC_SEL_HPLL, + + /* PERICRU_CLKSEL_CON17 */ + CCLK_SDMMC1_DIV_SHIFT = 0, + CCLK_SDMMC1_DIV_MASK = 0xff << CCLK_SDMMC1_DIV_SHIFT, + CCLK_SDMMC1_SEL_SHIFT = 14, + CCLK_SDMMC1_SEL_MASK = 0x3 << CCLK_SDMMC1_SEL_SHIFT, + + /* PERICRU_CLKSEL_CON18 */ + CCLK_EMMC_DIV_SHIFT = 0, + CCLK_EMMC_DIV_MASK = 0xff << CCLK_EMMC_DIV_SHIFT, + CCLK_EMMC_SEL_SHIFT = 14, + CCLK_EMMC_SEL_MASK = 0x3 << CCLK_EMMC_SEL_SHIFT, + CCLK_EMMC_SEL_GPLL = 0, + CCLK_EMMC_SEL_CPLL, + CCLK_EMMC_SEL_24M, + CCLK_EMMC_SEL_HPLL, + + /* PERICRU_CLKSEL_CON19 */ + BCLK_EMMC_DIV_SHIFT = 8, + BCLK_EMMC_DIV_MASK = 0x7f << BCLK_EMMC_DIV_SHIFT, + BCLK_EMMC_SEL_SHIFT = 15, + BCLK_EMMC_SEL_MASK = 0x1 << BCLK_EMMC_SEL_SHIFT, + BCLK_EMMC_SEL_GPLL = 0, + BCLK_EMMC_SEL_CPLL, + + /* PERICRU_CLKSEL_CON20 */ + SCLK_SFC_DIV_SHIFT = 0, + SCLK_SFC_DIV_MASK = 0xff << SCLK_SFC_DIV_SHIFT, + SCLK_SFC_SEL_SHIFT = 8, + SCLK_SFC_SEL_MASK = 0x3 << SCLK_SFC_SEL_SHIFT, + SCLK_SFC_SRC_SEL_GPLL = 0, + SCLK_SFC_SRC_SEL_CPLL, + SCLK_SFC_SRC_SEL_24M, + CLK_SPI1_SEL_SHIFT = 12, + CLK_SPI1_SEL_MASK = 0x3 << CLK_SPI1_SEL_SHIFT, + CLK_SPI_SEL_200M = 0, + CLK_SPI_SEL_100M, + CLK_SPI_SEL_50M, + CLK_SPI_SEL_24M, + CLK_SPI2_SEL_SHIFT = 14, + CLK_SPI2_SEL_MASK = 0x3 << CLK_SPI2_SEL_SHIFT, + + /* PERICRU_CLKSEL_CON21 */ + CLK_UART_SRC_DIV_SHIFT = 0, + CLK_UART_SRC_DIV_MASK = 0x7f << CLK_UART_SRC_DIV_SHIFT, + CLK_UART_SRC_SEL_SHIFT = 8, + CLK_UART_SRC_SEL_MASK = 0x1 << CLK_UART_SRC_SEL_SHIFT, + CLK_UART_SRC_SEL_GPLL = 0, + CLK_UART_SRC_SEL_CPLL, + CLK_UART_SEL_SHIFT = 14, + CLK_UART_SEL_MASK = 0x3 << CLK_UART_SEL_SHIFT, + CLK_UART_SEL_SRC = 0, + CLK_UART_SEL_FRAC, + CLK_UART_SEL_XIN24M, + + /* PERICRU_CLKSEL_CON22 */ + CLK_UART_FRAC_NUMERATOR_SHIFT = 16, + CLK_UART_FRAC_NUMERATOR_MASK = 0xffff << 16, + CLK_UART_FRAC_DENOMINATOR_SHIFT = 0, + CLK_UART_FRAC_DENOMINATOR_MASK = 0xffff, + + /* PERICRU_CLKSEL_CON40 */ + CLK_PWM1_PERI_SEL_SHIFT = 0, + CLK_PWM1_PERI_SEL_MASK = 0x3 << CLK_PWM1_PERI_SEL_SHIFT, + CLK_PWM_SEL_100M = 0, + CLK_PWM_SEL_50M, + CLK_PWM_SEL_24M, + CLK_PWM2_PERI_SEL_SHIFT = 6, + CLK_PWM2_PERI_SEL_MASK = 0x3 << CLK_PWM2_PERI_SEL_SHIFT, + CLK_PWM3_PERI_SEL_SHIFT = 8, + CLK_PWM3_PERI_SEL_MASK = 0x3 << CLK_PWM3_PERI_SEL_SHIFT, + + /* PERICRU_CLKSEL_CON43 */ + CLK_CORE_CRYPTO_SEL_SHIFT = 0, + CLK_CORE_CRYPTO_SEL_MASK = 0x3 << CLK_CORE_CRYPTO_SEL_SHIFT, + CLK_CORE_CRYPTO_SEL_200M = 0, + CLK_CORE_CRYPTO_SEL_100M, + CLK_CORE_CRYPTO_SEL_24M, + CLK_PKA_CRYPTO_SEL_SHIFT = 6, + CLK_PKA_CRYPTO_SEL_MASK = 0x3 << CLK_PKA_CRYPTO_SEL_SHIFT, + CLK_PKA_CRYPTO_SEL_300M = 0, + CLK_PKA_CRYPTO_SEL_200M, + CLK_PKA_CRYPTO_SEL_100M, + CLK_PKA_CRYPTO_SEL_24M, + TCLK_PERI_WDT_SEL_SHIFT = 15, + TCLK_PERI_WDT_SEL_MASK = 0x1 << TCLK_PERI_WDT_SEL_SHIFT, + + /* PERICRU_CLKSEL_CON46 */ + CLK_SARADC_DIV_SHIFT = 0, + CLK_SARADC_DIV_MASK = 0xfff << CLK_SARADC_DIV_SHIFT, +}; +#endif diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/fit.h b/u-boot/arch/arm/include/asm/arch-rockchip/fit.h index d10d2f2..36971ef 100644 --- a/u-boot/arch/arm/include/asm/arch-rockchip/fit.h +++ b/u-boot/arch/arm/include/asm/arch-rockchip/fit.h @@ -14,7 +14,7 @@ int fit_image_pre_process(const void *fit); int fit_image_fail_process(const void *fit); -int fit_image_init_resource(void); int fit_image_read_dtb(void *fdt_addr); +ulong fit_image_init_resource(struct blk_desc *dev_desc); #endif diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3528.h b/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3528.h new file mode 100644 index 0000000..222fcbd --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3528.h @@ -0,0 +1,89 @@ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef _ASM_ARCH_GRF_RK3528_H +#define _ASM_ARCH_GRF_RK3528_H + +#include <common.h> + +struct rk3528_grf { + uint32_t reserved0[0x40018 / 4]; + + /* vpugrf*/ + uint32_t gmac1_con0; /* Address Offset: 0x40018 */ + uint32_t gmac1_con1; /* Address Offset: 0x4001c */ + uint32_t reserved1[(0x60018 - 0x4001c) / 4 - 1]; + + /* vogrf */ + uint32_t gmac0_con; /* Address Offset: 0x60018 */ + uint32_t macphy_con0; /* Address Offset: 0x6001c */ + uint32_t macphy_con1; /* Address Offset: 0x60020 */ + uint32_t sdmmc_con0; /* Address Offset: 0x60024 */ + uint32_t sdmmc_con1; /* Address Offset: 0x60028 */ + uint32_t reserved2[(0x70000 - 0x60028) / 4 - 1]; + + /* pmugrf */ + uint32_t soc_con[8]; /* Address Offset: 0x70000 */ + uint32_t soc_status; /* Address Offset: 0x70020 */ + uint32_t reserved3[3]; /* Address Offset: 0x70024 */ + uint32_t pmuio_vsel; /* Address Offset: 0x70030 */ + uint32_t reserved4[3]; /* Address Offset: 0x70034 */ + uint32_t mem_con; /* Address Offset: 0x70040 */ + uint32_t reserved5[47]; /* Address Offset: 0x70044 */ + uint32_t rstfunc_status; /* Address Offset: 0x70100 */ + uint32_t rstfunc_clr; /* Address Offset: 0x70104 */ + uint32_t reserved6[62]; /* Address Offset: 0x70108 */ + uint32_t os_reg0; /* Address Offset: 0x70200 */ + uint32_t os_reg1; /* Address Offset: 0x70204 */ + uint32_t os_reg2; /* Address Offset: 0x70208 */ + uint32_t os_reg3; /* Address Offset: 0x7020C */ + uint32_t os_reg4; /* Address Offset: 0x70210 */ + uint32_t os_reg5; /* Address Offset: 0x70214 */ + uint32_t os_reg6; /* Address Offset: 0x70218 */ + uint32_t os_reg7; /* Address Offset: 0x7021C */ + uint32_t os_reg8; /* Address Offset: 0x70220 */ + uint32_t os_reg9; /* Address Offset: 0x70224 */ + uint32_t os_reg10; /* Address Offset: 0x70228 */ + uint32_t os_reg11; /* Address Offset: 0x7022C */ + uint32_t os_reg12; /* Address Offset: 0x70230 */ + uint32_t os_reg13; /* Address Offset: 0x70234 */ + uint32_t os_reg14; /* Address Offset: 0x70238 */ + uint32_t os_reg15; /* Address Offset: 0x7023C */ + uint32_t os_reg16; /* Address Offset: 0x70240 */ + uint32_t os_reg17; /* Address Offset: 0x70244 */ + uint32_t os_reg18; /* Address Offset: 0x70248 */ + uint32_t os_reg19; /* Address Offset: 0x7024C */ + uint32_t os_reg20; /* Address Offset: 0x70250 */ + uint32_t os_reg21; /* Address Offset: 0x70254 */ + uint32_t os_reg22; /* Address Offset: 0x70258 */ + uint32_t os_reg23; /* Address Offset: 0x7025C */ + uint32_t reserved7[(0x80000 - 0x7025C) / 4 - 1]; + + uint32_t grf_sys_con[2]; /* Address Offset: 0x80000 */ + uint32_t reserved8[2]; /* Address Offset: 0x80008 */ + uint32_t grf_sys_status; /* Address Offset: 0x80010 */ + uint32_t reserved9[3]; /* Address Offset: 0x80014 */ + uint32_t grf_biu_con[2]; /* Address Offset: 0x80020 */ + uint32_t reserved10[2]; /* Address Offset: 0x80028 */ + uint32_t grf_biu_status[3]; /* Address Offset: 0x80030 */ + uint32_t reserved11[17]; /* Address Offset: 0x8003C */ + uint32_t grf_sys_mem_con[5]; /* Address Offset: 0x80080 */ + uint32_t reserved12[59]; /* Address Offset: 0x80094 */ + uint32_t grf_soc_code; /* Address Offset: 0x80180 */ + uint32_t reserved13[3]; /* Address Offset: 0x80184 */ + uint32_t grf_soc_version; /* Address Offset: 0x80190 */ + uint32_t reserved14[3]; /* Address Offset: 0x80194 */ + uint32_t grf_chip_id; /* Address Offset: 0x801A0 */ + uint32_t reserved15[3]; /* Address Offset: 0x801A4 */ + uint32_t grf_chip_version; /* Address Offset: 0x801B0 */ + uint32_t reserved16[(0x10000 - 0x81b0) / 4 - 1]; + +}; + +check_member(rk3528_grf, sdmmc_con1, 0x60028); +check_member(rk3528_grf, os_reg23, 0x7025C); +check_member(rk3528_grf, grf_chip_version, 0x801B0); + +#endif diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3562.h b/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3562.h new file mode 100644 index 0000000..31d5fad --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/grf_rk3562.h @@ -0,0 +1,76 @@ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef _ASM_ARCH_GRF_RK3562_H +#define _ASM_ARCH_GRF_RK3562_H + +#include <common.h> + +struct rk3562_pmu_grf { + /* pmugrf */ + uint32_t reserved1[(0x0100 - 0x0000) / 4]; /* address offset: 0x0000 */ + uint32_t soc_con[13]; /* address offset: 0x0100 */ + uint32_t soc_status[1]; /* address offset: 0x0134 */ + uint32_t reserved2[(0x0180 - 0x0134) / 4 - 1]; /* address offset: 0x0138 */ + uint32_t pvtm_con[1]; /* address offset: 0x0180 */ + uint32_t reserved3[(0x0200 - 0x0180) / 4 - 1]; /* address offset: 0x0184 */ + uint32_t os_reg[12]; /* address offset: 0x0200 */ + uint32_t reset_function_status; /* address offset: 0x0230 */ + uint32_t reset_function_clr; /* address offset: 0x0234 */ + uint32_t reserved4[(0x0380 - 0x0234) / 4 - 1]; /* address offset: 0x0238 */ + uint32_t sig_detect_con; /* address offset: 0x0380 */ + uint32_t reserved5[(0x0390 - 0x0380) / 4 - 1]; /* address offset: 0x0384 */ + uint32_t sig_detect_status; /* address offset: 0x0390 */ + uint32_t reserved6[(0x03a0 - 0x0390) / 4 - 1]; /* address offset: 0x0394 */ + uint32_t sig_detect_status_clear; /* address offset: 0x03a0 */ + uint32_t reserved7[(0x03b0 - 0x03a0) / 4 - 1]; /* address offset: 0x03a4 */ + uint32_t sdmmc_det_counter; /* address offset: 0x03b0 */ +}; + +check_member(rk3562_pmu_grf, sdmmc_det_counter, 0x03b0); + +struct rk3562_grf { + /* sysgrf */ + uint32_t reserved1[(0x0400 - 0x0000) / 4]; /* address offset: 0x0000 */ + uint32_t soc_con[7]; /* address offset: 0x0400 */ + uint32_t reserved2[(0x0430 - 0x0400) / 4 - 7]; /* address offset: 0x041c */ + uint32_t soc_status[3]; /* address offset: 0x0430 */ + uint32_t reserved3; /* address offset: 0x043c */ + uint32_t biu_con[2]; /* address offset: 0x0440 */ + uint32_t reserved4[(0x0460 - 0x0440) / 4 - 2]; /* address offset: 0x0448 */ + uint32_t ram_con; /* address offset: 0x0460 */ + uint32_t core_ram_con; /* address offset: 0x0464 */ + uint32_t reserved5[(0x0500 - 0x0464) / 4 - 1]; /* address offset: 0x0468 */ + uint32_t cpu_con[2]; /* address offset: 0x0500 */ + uint32_t reserved6[(0x0510 - 0x0500) / 4 - 2]; /* address offset: 0x0508 */ + uint32_t cpu_status[2]; /* address offset: 0x0510 */ + uint32_t reserved7[(0x0520 - 0x0510) / 4 - 2]; /* address offset: 0x0518 */ + uint32_t vi_con[2]; /* address offset: 0x0520 */ + uint32_t reserved8[(0x0530 - 0x0520) / 4 - 2]; /* address offset: 0x0528 */ + uint32_t vi_status[1]; /* address offset: 0x0530 */ + uint32_t reserved9[(0x0570 - 0x0530) / 4 - 1]; /* address offset: 0x0534 */ + uint32_t gpu_con[2]; /* address offset: 0x0570 */ + uint32_t reserved10[(0x0580 - 0x0570) / 4 - 2]; /* address offset: 0x0578 */ + uint32_t tsadc_con; /* address offset: 0x0580 */ + uint32_t reserved11[(0x05d0 - 0x0580) / 4 - 1]; /* address offset: 0x0584 */ + uint32_t vo_con[2]; /* address offset: 0x05d0 */ + uint32_t reserved12[(0x0600 - 0x05d0) / 4 - 2]; /* address offset: 0x05d8 */ + uint32_t top_pvtpll_con[4]; /* address offset: 0x0600 */ + uint32_t top_pvtpll_status[2]; /* address offset: 0x0610 */ + uint32_t reserved13[(0x0620 - 0x0610) / 4 - 2]; /* address offset: 0x0618 */ + uint32_t cpu_pvtpll_con[4]; /* address offset: 0x0620 */ + uint32_t cpu_pvtpll_status[2]; /* address offset: 0x0630 */ + uint32_t reserved14[(0x0640 - 0x0630) / 4 - 2]; /* address offset: 0x0638 */ + uint32_t gpu_pvtpll_con[4]; /* address offset: 0x0640 */ + uint32_t gpu_pvtpll_status[2]; /* address offset: 0x0650 */ + uint32_t reserved15[(0x0660 - 0x0650) / 4 - 2]; /* address offset: 0x0658 */ + uint32_t npu_pvtpll_con[4]; /* address offset: 0x0660 */ + uint32_t npu_pvtpll_status[2]; /* address offset: 0x0670 */ + uint32_t reserved16[(0x0800 - 0x0670) / 4 - 2]; /* address offset: 0x0678 */ + uint32_t chip_id; /* address offset: 0x0800 */ +}; +check_member(rk3562_grf, chip_id, 0x0800); + +#endif diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3528.h b/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3528.h new file mode 100644 index 0000000..74c6116 --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3528.h @@ -0,0 +1,196 @@ +/* + * (C) Copyright 2021 Rockchip Electronics Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef _ASM_ARCH_IOC_RK3528_H +#define _ASM_ARCH_IOC_RK3528_H + +#include <common.h> + +struct rk3528_gpio0_ioc { + uint32_t gpio0a_iomux_sel_l; /* Address Offset: 0x0000 */ + uint32_t gpio0a_iomux_sel_h; /* Address Offset: 0x0004 */ + uint32_t reserved0008[62]; /* Address Offset: 0x0008 */ + uint32_t gpio0a_ds[3]; /* Address Offset: 0x0100 */ + uint32_t reserved010c[61]; /* Address Offset: 0x010C */ + uint32_t gpio0a_pull; /* Address Offset: 0x0200 */ + uint32_t reserved0204[63]; /* Address Offset: 0x0204 */ + uint32_t gpio0a_ie; /* Address Offset: 0x0300 */ + uint32_t reserved0304[63]; /* Address Offset: 0x0304 */ + uint32_t gpio0a_smt; /* Address Offset: 0x0400 */ + uint32_t reserved0404[63]; /* Address Offset: 0x0404 */ + uint32_t gpio0a_sus; /* Address Offset: 0x0500 */ + uint32_t reserved0504[63]; /* Address Offset: 0x0504 */ + uint32_t gpio0a_sl; /* Address Offset: 0x0600 */ + uint32_t reserved0604[63]; /* Address Offset: 0x0604 */ + uint32_t gpio0a_od; /* Address Offset: 0x0700 */ + uint32_t vcc5vio_ctrl; /* Address Offset: 0x0704 */ +}; +check_member(rk3528_gpio0_ioc, vcc5vio_ctrl, 0x0704); + +struct rk3528_gpio1_ioc { + uint32_t reserved0000[8]; /* Address Offset: 0x0000 */ + uint32_t gpio1a_iomux_sel_l; /* Address Offset: 0x0020 */ + uint32_t gpio1a_iomux_sel_h; /* Address Offset: 0x0024 */ + uint32_t gpio1b_iomux_sel_l; /* Address Offset: 0x0028 */ + uint32_t gpio1b_iomux_sel_h; /* Address Offset: 0x002C */ + uint32_t gpio1c_iomux_sel_l; /* Address Offset: 0x0030 */ + uint32_t gpio1c_iomux_sel_h; /* Address Offset: 0x0034 */ + uint32_t gpio1d_iomux_sel_l; /* Address Offset: 0x0038 */ + uint32_t gpio1d_iomux_sel_h; /* Address Offset: 0x003C */ + uint32_t reserved0040[56]; /* Address Offset: 0x0040 */ + uint32_t gpio1a_ds[4]; /* Address Offset: 0x0120 */ + uint32_t gpio1b_ds[4]; /* Address Offset: 0x0130 */ + uint32_t gpio1c_ds[4]; /* Address Offset: 0x0140 */ + uint32_t gpio1d_ds[4]; /* Address Offset: 0x0150 */ + uint32_t reserved0160[44]; /* Address Offset: 0x0160 */ + uint32_t gpio1a_pull; /* Address Offset: 0x0210 */ + uint32_t gpio1b_pull; /* Address Offset: 0x0214 */ + uint32_t gpio1c_pull; /* Address Offset: 0x0218 */ + uint32_t gpio1d_pull; /* Address Offset: 0x021C */ + uint32_t reserved0220[60]; /* Address Offset: 0x0220 */ + uint32_t gpio1a_ie; /* Address Offset: 0x0310 */ + uint32_t gpio1b_ie; /* Address Offset: 0x0314 */ + uint32_t gpio1c_ie; /* Address Offset: 0x0318 */ + uint32_t gpio1d_ie; /* Address Offset: 0x031C */ + uint32_t reserved0320[60]; /* Address Offset: 0x0320 */ + uint32_t gpio1a_smt; /* Address Offset: 0x0410 */ + uint32_t gpio1b_smt; /* Address Offset: 0x0414 */ + uint32_t gpio1c_smt; /* Address Offset: 0x0418 */ + uint32_t gpio1d_smt; /* Address Offset: 0x041C */ + uint32_t reserved0420[60]; /* Address Offset: 0x0420 */ + uint32_t gpio1a_sus; /* Address Offset: 0x0510 */ + uint32_t gpio1b_sus; /* Address Offset: 0x0514 */ + uint32_t gpio1c_sus; /* Address Offset: 0x0518 */ + uint32_t gpio1d_sus; /* Address Offset: 0x051C */ + uint32_t reserved0520[60]; /* Address Offset: 0x0520 */ + uint32_t gpio1a_sl; /* Address Offset: 0x0610 */ + uint32_t gpio1b_sl; /* Address Offset: 0x0614 */ + uint32_t gpio1c_sl; /* Address Offset: 0x0618 */ + uint32_t gpio1d_sl; /* Address Offset: 0x061C */ + uint32_t reserved0620[60]; /* Address Offset: 0x0620 */ + uint32_t gpio1a_od; /* Address Offset: 0x0710 */ + uint32_t gpio1b_od; /* Address Offset: 0x0714 */ + uint32_t gpio1c_od; /* Address Offset: 0x0718 */ + uint32_t gpio1d_od; /* Address Offset: 0x071C */ + uint32_t reserved0720[60]; /* Address Offset: 0x0720 */ + uint32_t vccio0_poc; /* Address Offset: 0x0810 */ + uint32_t reserved0814[3]; /* Address Offset: 0x0814 */ + uint32_t vccio1_poc; /* Address Offset: 0x0820 */ +}; +check_member(rk3528_gpio1_ioc, vccio1_poc, 0x0820); + +struct rk3528_gpio2_ioc { + uint32_t reserved0000[16]; /* Address Offset: 0x0000 */ + uint32_t gpio2a_iomux_sel_l; /* Address Offset: 0x0040 */ + uint32_t gpio2a_iomux_sel_h; /* Address Offset: 0x0044 */ + uint32_t reserved0048[70]; /* Address Offset: 0x0048 */ + uint32_t gpio2a_ds[4]; /* Address Offset: 0x0160 */ + uint32_t reserved0170[44]; /* Address Offset: 0x0170 */ + uint32_t gpio2a_pull; /* Address Offset: 0x0220 */ + uint32_t reserved0224[63]; /* Address Offset: 0x0224 */ + uint32_t gpio2a_ie; /* Address Offset: 0x0320 */ + uint32_t reserved0324[63]; /* Address Offset: 0x0324 */ + uint32_t gpio2a_smt; /* Address Offset: 0x0420 */ + uint32_t reserved0424[63]; /* Address Offset: 0x0424 */ + uint32_t gpio2a_sus; /* Address Offset: 0x0520 */ + uint32_t reserved0524[63]; /* Address Offset: 0x0524 */ + uint32_t gpio2a_sl; /* Address Offset: 0x0620 */ + uint32_t reserved0624[63]; /* Address Offset: 0x0624 */ + uint32_t gpio2a_od; /* Address Offset: 0x0720 */ + uint32_t reserved0724[67]; /* Address Offset: 0x0724 */ + uint32_t vccio2_poc; /* Address Offset: 0x0830 */ +}; +check_member(rk3528_gpio2_ioc, vccio2_poc, 0x0830); + +struct rk3528_gpio3_ioc { + uint32_t reserved0000[24]; /* Address Offset: 0x0000 */ + uint32_t gpio3a_iomux_sel_l; /* Address Offset: 0x0060 */ + uint32_t gpio3a_iomux_sel_h; /* Address Offset: 0x0064 */ + uint32_t gpio3b_iomux_sel_l; /* Address Offset: 0x0068 */ + uint32_t gpio3b_iomux_sel_h; /* Address Offset: 0x006C */ + uint32_t gpio3c_iomux_sel_l; /* Address Offset: 0x0070 */ + uint32_t reserved0074[71]; /* Address Offset: 0x0074 */ + uint32_t gpio3a_ds[4]; /* Address Offset: 0x0190 */ + uint32_t gpio3b_ds[4]; /* Address Offset: 0x01A0 */ + uint32_t gpio3c_ds[2]; /* Address Offset: 0x01B0 */ + uint32_t reserved01b8[30]; /* Address Offset: 0x01B8 */ + uint32_t gpio3a_pull; /* Address Offset: 0x0230 */ + uint32_t gpio3b_pull; /* Address Offset: 0x0234 */ + uint32_t gpio3c_pull; /* Address Offset: 0x0238 */ + uint32_t reserved023c[61]; /* Address Offset: 0x023C */ + uint32_t gpio3a_ie; /* Address Offset: 0x0330 */ + uint32_t gpio3b_ie; /* Address Offset: 0x0334 */ + uint32_t gpio3c_ie; /* Address Offset: 0x0338 */ + uint32_t reserved033c[61]; /* Address Offset: 0x033C */ + uint32_t gpio3a_smt; /* Address Offset: 0x0430 */ + uint32_t gpio3b_smt; /* Address Offset: 0x0434 */ + uint32_t gpio3c_smt; /* Address Offset: 0x0438 */ + uint32_t reserved043c[61]; /* Address Offset: 0x043C */ + uint32_t gpio3a_sus; /* Address Offset: 0x0530 */ + uint32_t gpio3b_sus; /* Address Offset: 0x0534 */ + uint32_t gpio3c_sus; /* Address Offset: 0x0538 */ + uint32_t reserved053c[61]; /* Address Offset: 0x053C */ + uint32_t gpio3a_sl; /* Address Offset: 0x0630 */ + uint32_t gpio3b_sl; /* Address Offset: 0x0634 */ + uint32_t gpio3c_sl; /* Address Offset: 0x0638 */ + uint32_t reserved063c[61]; /* Address Offset: 0x063C */ + uint32_t gpio3a_od; /* Address Offset: 0x0730 */ + uint32_t gpio3b_od; /* Address Offset: 0x0734 */ + uint32_t gpio3c_od; /* Address Offset: 0x0738 */ + uint32_t reserved073c[65]; /* Address Offset: 0x073C */ + uint32_t vccio3_poc; /* Address Offset: 0x0840 */ +}; +check_member(rk3528_gpio3_ioc, vccio3_poc, 0x0840); + +struct rk3528_gpio4_ioc { + uint32_t reserved0000[32]; /* Address Offset: 0x0000 */ + uint32_t gpio4a_iomux_sel_l; /* Address Offset: 0x0080 */ + uint32_t gpio4a_iomux_sel_h; /* Address Offset: 0x0084 */ + uint32_t gpio4b_iomux_sel_l; /* Address Offset: 0x0088 */ + uint32_t gpio4b_iomux_sel_h; /* Address Offset: 0x008C */ + uint32_t gpio4c_iomux_sel_l; /* Address Offset: 0x0090 */ + uint32_t gpio4c_iomux_sel_h; /* Address Offset: 0x0094 */ + uint32_t gpio4d_iomux_sel_l; /* Address Offset: 0x0098 */ + uint32_t reserved009c[73]; /* Address Offset: 0x009C */ + uint32_t gpio4a_ds[4]; /* Address Offset: 0x01C0 */ + uint32_t gpio4b_ds[4]; /* Address Offset: 0x01D0 */ + uint32_t gpio4c_ds[4]; /* Address Offset: 0x01E0 */ + uint32_t gpio4d_ds[1]; /* Address Offset: 0x01F0 */ + uint32_t reserved01f4[19]; /* Address Offset: 0x01F4 */ + uint32_t gpio4a_pull; /* Address Offset: 0x0240 */ + uint32_t gpio4b_pull; /* Address Offset: 0x0244 */ + uint32_t gpio4c_pull; /* Address Offset: 0x0248 */ + uint32_t gpio4d_pull; /* Address Offset: 0x024C */ + uint32_t reserved0250[60]; /* Address Offset: 0x0250 */ + uint32_t gpio4a_ie; /* Address Offset: 0x0340 */ + uint32_t gpio4b_ie; /* Address Offset: 0x0344 */ + uint32_t gpio4c_ie; /* Address Offset: 0x0348 */ + uint32_t gpio4d_ie; /* Address Offset: 0x034C */ + uint32_t reserved0350[60]; /* Address Offset: 0x0350 */ + uint32_t gpio4a_smt; /* Address Offset: 0x0440 */ + uint32_t gpio4b_smt; /* Address Offset: 0x0444 */ + uint32_t gpio4c_smt; /* Address Offset: 0x0448 */ + uint32_t gpio4d_smt; /* Address Offset: 0x044C */ + uint32_t reserved0450[60]; /* Address Offset: 0x0450 */ + uint32_t gpio4a_sus; /* Address Offset: 0x0540 */ + uint32_t gpio4b_sus; /* Address Offset: 0x0544 */ + uint32_t gpio4c_sus; /* Address Offset: 0x0548 */ + uint32_t gpio4d_sus; /* Address Offset: 0x054C */ + uint32_t reserved0550[60]; /* Address Offset: 0x0550 */ + uint32_t gpio4a_sl; /* Address Offset: 0x0640 */ + uint32_t gpio4b_sl; /* Address Offset: 0x0644 */ + uint32_t gpio4c_sl; /* Address Offset: 0x0648 */ + uint32_t gpio4d_sl; /* Address Offset: 0x064C */ + uint32_t reserved0650[60]; /* Address Offset: 0x0650 */ + uint32_t gpio4a_od; /* Address Offset: 0x0740 */ + uint32_t gpio4b_od; /* Address Offset: 0x0744 */ + uint32_t gpio4c_od; /* Address Offset: 0x0748 */ + uint32_t gpio4d_od; /* Address Offset: 0x074C */ + uint32_t reserved0750[64]; /* Address Offset: 0x0750 */ + uint32_t vccio4_poc; /* Address Offset: 0x0850 */ +}; +check_member(rk3528_gpio4_ioc, vccio4_poc, 0x0850); +#endif + diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3562.h b/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3562.h new file mode 100644 index 0000000..efe5729 --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/ioc_rk3562.h @@ -0,0 +1,211 @@ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#ifndef _ASM_ARCH_IOC_RK3562_H +#define _ASM_ARCH_IOC_RK3562_H + +#include <common.h> + +struct rk3562_ioc { + uint32_t gpio1a_iomux_sel_l; /* Address Offset: 0x0000 */ + uint32_t gpio1a_iomux_sel_h; /* Address Offset: 0x0004 */ + uint32_t gpio1b_iomux_sel_l; /* Address Offset: 0x0008 */ + uint32_t gpio1b_iomux_sel_h; /* Address Offset: 0x000C */ + uint32_t gpio1c_iomux_sel_l; /* Address Offset: 0x0010 */ + uint32_t gpio1c_iomux_sel_h; /* Address Offset: 0x0014 */ + uint32_t gpio1d_iomux_sel_l; /* Address Offset: 0x0018 */ + uint32_t gpio1d_iomux_sel_h; /* Address Offset: 0x001C */ + uint32_t gpio2a_iomux_sel_l; /* Address Offset: 0x0020 */ + uint32_t reserved0024[23]; /* Address Offset: 0x0024 */ + uint32_t gpio1a_p; /* Address Offset: 0x0080 */ + uint32_t gpio1b_p; /* Address Offset: 0x0084 */ + uint32_t gpio1c_p; /* Address Offset: 0x0088 */ + uint32_t gpio1d_p; /* Address Offset: 0x008C */ + uint32_t gpio2a_p; /* Address Offset: 0x0090 */ + uint32_t reserved0094[11]; /* Address Offset: 0x0094 */ + uint32_t gpio1a_ie; /* Address Offset: 0x00C0 */ + uint32_t gpio1b_ie; /* Address Offset: 0x00C4 */ + uint32_t gpio1c_ie; /* Address Offset: 0x00C8 */ + uint32_t gpio1d_ie; /* Address Offset: 0x00CC */ + uint32_t gpio2a_ie; /* Address Offset: 0x00D0 */ + uint32_t reserved00d4[11]; /* Address Offset: 0x00D4 */ + uint32_t gpio1a_od; /* Address Offset: 0x0100 */ + uint32_t gpio1b_od; /* Address Offset: 0x0104 */ + uint32_t gpio1c_od; /* Address Offset: 0x0108 */ + uint32_t gpio1d_od; /* Address Offset: 0x010C */ + uint32_t gpio2a_od; /* Address Offset: 0x0110 */ + uint32_t reserved0114[11]; /* Address Offset: 0x0114 */ + uint32_t gpio1a_sus; /* Address Offset: 0x0140 */ + uint32_t gpio1b_sus; /* Address Offset: 0x0144 */ + uint32_t gpio1c_sus; /* Address Offset: 0x0148 */ + uint32_t gpio1d_sus; /* Address Offset: 0x014C */ + uint32_t gpio2a_sus; /* Address Offset: 0x0150 */ + uint32_t reserved0154[11]; /* Address Offset: 0x0154 */ + uint32_t gpio1a_sl; /* Address Offset: 0x0180 */ + uint32_t gpio1b_sl; /* Address Offset: 0x0184 */ + uint32_t gpio1c_sl; /* Address Offset: 0x0188 */ + uint32_t gpio1d_sl; /* Address Offset: 0x018C */ + uint32_t gpio2a_sl; /* Address Offset: 0x0190 */ + uint32_t reserved0194[27]; /* Address Offset: 0x0194 */ + uint32_t gpio1a_ds0; /* Address Offset: 0x0200 */ + uint32_t gpio1a_ds1; /* Address Offset: 0x0204 */ + uint32_t gpio1a_ds2; /* Address Offset: 0x0208 */ + uint32_t gpio1a_ds3; /* Address Offset: 0x020C */ + uint32_t gpio1b_ds0; /* Address Offset: 0x0210 */ + uint32_t gpio1b_ds1; /* Address Offset: 0x0214 */ + uint32_t gpio1b_ds2; /* Address Offset: 0x0218 */ + uint32_t gpio1b_ds3; /* Address Offset: 0x021C */ + uint32_t gpio1c_ds0; /* Address Offset: 0x0220 */ + uint32_t gpio1c_ds1; /* Address Offset: 0x0224 */ + uint32_t gpio1c_ds2; /* Address Offset: 0x0228 */ + uint32_t gpio1c_ds3; /* Address Offset: 0x022C */ + uint32_t gpio1d_ds0; /* Address Offset: 0x0230 */ + uint32_t gpio1d_ds1; /* Address Offset: 0x0234 */ + uint32_t gpio1d_ds2; /* Address Offset: 0x0238 */ + uint32_t gpio1d_ds3; /* Address Offset: 0x023C */ + uint32_t gpio2a_ds0; /* Address Offset: 0x0240 */ + uint32_t reserved0244[47]; /* Address Offset: 0x0244 */ + uint32_t io_vsel0; /* Address Offset: 0x0300 */ + uint32_t reserved0304[63]; /* Address Offset: 0x0304 */ + uint32_t mac1_io_con0; /* Address Offset: 0x0400 */ + uint32_t mac1_io_con1; /* Address Offset: 0x0404 */ + uint32_t reserved0408[62]; /* Address Offset: 0x0408 */ + uint32_t sdcard0_io_con; /* Address Offset: 0x0500 */ + uint32_t jtag_m1_con; /* Address Offset: 0x0504 */ + uint32_t reserved0508[16078]; /* Address Offset: 0x0508 */ + uint32_t gpio3a_iomux_sel_l; /* Address Offset: 0x10040 */ + uint32_t gpio3a_iomux_sel_h; /* Address Offset: 0x10044 */ + uint32_t gpio3b_iomux_sel_l; /* Address Offset: 0x10048 */ + uint32_t gpio3b_iomux_sel_h; /* Address Offset: 0x1004C */ + uint32_t gpio3c_iomux_sel_l; /* Address Offset: 0x10050 */ + uint32_t gpio3c_iomux_sel_h; /* Address Offset: 0x10054 */ + uint32_t gpio3d_iomux_sel_l; /* Address Offset: 0x10058 */ + uint32_t gpio3d_iomux_sel_h; /* Address Offset: 0x1005C */ + uint32_t gpio4a_iomux_sel_l; /* Address Offset: 0x10060 */ + uint32_t gpio4a_iomux_sel_h; /* Address Offset: 0x10064 */ + uint32_t gpio4b_iomux_sel_l; /* Address Offset: 0x10068 */ + uint32_t gpio4b_iomux_sel_h; /* Address Offset: 0x1006C */ + uint32_t reserved10070[12]; /* Address Offset: 0x10070 */ + uint32_t gpio3a_p; /* Address Offset: 0x100A0 */ + uint32_t gpio3b_p; /* Address Offset: 0x100A4 */ + uint32_t gpio3c_p; /* Address Offset: 0x100A8 */ + uint32_t gpio3d_p; /* Address Offset: 0x100AC */ + uint32_t gpio4a_p; /* Address Offset: 0x100B0 */ + uint32_t gpio4b_p; /* Address Offset: 0x100B4 */ + uint32_t reserved100b8[10]; /* Address Offset: 0x100B8 */ + uint32_t gpio3a_ie; /* Address Offset: 0x100E0 */ + uint32_t gpio3b_ie; /* Address Offset: 0x100E4 */ + uint32_t gpio3c_ie; /* Address Offset: 0x100E8 */ + uint32_t gpio3d_ie; /* Address Offset: 0x100EC */ + uint32_t gpio4a_ie; /* Address Offset: 0x100F0 */ + uint32_t gpio4b_ie; /* Address Offset: 0x100F4 */ + uint32_t reserved100f8[10]; /* Address Offset: 0x100F8 */ + uint32_t gpio3a_od; /* Address Offset: 0x10120 */ + uint32_t gpio3b_od; /* Address Offset: 0x10124 */ + uint32_t gpio3c_od; /* Address Offset: 0x10128 */ + uint32_t gpio3d_od; /* Address Offset: 0x1012C */ + uint32_t gpio4a_od; /* Address Offset: 0x10130 */ + uint32_t gpio4b_od; /* Address Offset: 0x10134 */ + uint32_t reserved10138[10]; /* Address Offset: 0x10138 */ + uint32_t gpio3a_sus; /* Address Offset: 0x10160 */ + uint32_t gpio3b_sus; /* Address Offset: 0x10164 */ + uint32_t gpio3c_sus; /* Address Offset: 0x10168 */ + uint32_t gpio3d_sus; /* Address Offset: 0x1016C */ + uint32_t gpio4a_sus; /* Address Offset: 0x10170 */ + uint32_t gpio4b_sus; /* Address Offset: 0x10174 */ + uint32_t reserved10178[10]; /* Address Offset: 0x10178 */ + uint32_t gpio3a_sl; /* Address Offset: 0x101A0 */ + uint32_t gpio3b_sl; /* Address Offset: 0x101A4 */ + uint32_t gpio3c_sl; /* Address Offset: 0x101A8 */ + uint32_t gpio3d_sl; /* Address Offset: 0x101AC */ + uint32_t gpio4a_sl; /* Address Offset: 0x101B0 */ + uint32_t gpio4b_sl; /* Address Offset: 0x101B4 */ + uint32_t reserved101b8[50]; /* Address Offset: 0x101B8 */ + uint32_t gpio3a_ds0; /* Address Offset: 0x10280 */ + uint32_t gpio3a_ds1; /* Address Offset: 0x10284 */ + uint32_t gpio3a_ds2; /* Address Offset: 0x10288 */ + uint32_t gpio3a_ds3; /* Address Offset: 0x1028C */ + uint32_t gpio3b_ds0; /* Address Offset: 0x10290 */ + uint32_t gpio3b_ds1; /* Address Offset: 0x10294 */ + uint32_t gpio3b_ds2; /* Address Offset: 0x10298 */ + uint32_t gpio3b_ds3; /* Address Offset: 0x1029C */ + uint32_t gpio3c_ds0; /* Address Offset: 0x102A0 */ + uint32_t gpio3c_ds1; /* Address Offset: 0x102A4 */ + uint32_t gpio3c_ds2; /* Address Offset: 0x102A8 */ + uint32_t gpio3c_ds3; /* Address Offset: 0x102AC */ + uint32_t gpio3d_ds0; /* Address Offset: 0x102B0 */ + uint32_t gpio3d_ds1; /* Address Offset: 0x102B4 */ + uint32_t gpio3d_ds2; /* Address Offset: 0x102B8 */ + uint32_t gpio3d_ds3; /* Address Offset: 0x102BC */ + uint32_t gpio4a_ds0; /* Address Offset: 0x102C0 */ + uint32_t gpio4a_ds1; /* Address Offset: 0x102C4 */ + uint32_t gpio4a_ds2; /* Address Offset: 0x102C8 */ + uint32_t gpio4a_ds3; /* Address Offset: 0x102CC */ + uint32_t gpio4b_ds0; /* Address Offset: 0x102D0 */ + uint32_t gpio4b_ds1; /* Address Offset: 0x102D4 */ + uint32_t gpio4b_ds2; /* Address Offset: 0x102D8 */ + uint32_t gpio4b_ds3; /* Address Offset: 0x102DC */ + uint32_t reserved102e0[8]; /* Address Offset: 0x102E0 */ + uint32_t io_vsel1; /* Address Offset: 0x10300 */ + uint32_t reserved10304[63]; /* Address Offset: 0x10304 */ + uint32_t mac0_io_con0; /* Address Offset: 0x10400 */ + uint32_t mac0_io_con1; /* Address Offset: 0x10404 */ + uint32_t reserved10408[62]; /* Address Offset: 0x10408 */ + uint32_t vo_io_con; /* Address Offset: 0x10500 */ + uint32_t reserved10504[35]; /* Address Offset: 0x10504 */ + uint32_t saradc1_con; /* Address Offset: 0x10590 */ + uint32_t reserved10594[16027]; /* Address Offset: 0x10594 */ + uint32_t gpio0a_iomux_sel_l; /* Address Offset: 0x20000 */ + uint32_t gpio0a_iomux_sel_h; /* Address Offset: 0x20004 */ + uint32_t gpio0b_iomux_sel_l; /* Address Offset: 0x20008 */ + uint32_t gpio0b_iomux_sel_h; /* Address Offset: 0x2000C */ + uint32_t gpio0c_iomux_sel_l; /* Address Offset: 0x20010 */ + uint32_t gpio0c_iomux_sel_h; /* Address Offset: 0x20014 */ + uint32_t gpio0d_iomux_sel_l; /* Address Offset: 0x20018 */ + uint32_t reserved2001c; /* Address Offset: 0x2001C */ + uint32_t gpio0a_p; /* Address Offset: 0x20020 */ + uint32_t gpio0b_p; /* Address Offset: 0x20024 */ + uint32_t gpio0c_p; /* Address Offset: 0x20028 */ + uint32_t gpio0d_p; /* Address Offset: 0x2002C */ + uint32_t gpio0a_ie; /* Address Offset: 0x20030 */ + uint32_t gpio0b_ie; /* Address Offset: 0x20034 */ + uint32_t gpio0c_ie; /* Address Offset: 0x20038 */ + uint32_t gpio0d_ie; /* Address Offset: 0x2003C */ + uint32_t gpio0a_od; /* Address Offset: 0x20040 */ + uint32_t gpio0b_od; /* Address Offset: 0x20044 */ + uint32_t gpio0c_od; /* Address Offset: 0x20048 */ + uint32_t gpio0d_od; /* Address Offset: 0x2004C */ + uint32_t gpio0a_sus; /* Address Offset: 0x20050 */ + uint32_t gpio0b_sus; /* Address Offset: 0x20054 */ + uint32_t gpio0c_sus; /* Address Offset: 0x20058 */ + uint32_t gpio0d_sus; /* Address Offset: 0x2005C */ + uint32_t gpio0a_sl; /* Address Offset: 0x20060 */ + uint32_t gpio0b_sl; /* Address Offset: 0x20064 */ + uint32_t gpio0c_sl; /* Address Offset: 0x20068 */ + uint32_t gpio0d_sl; /* Address Offset: 0x2006C */ + uint32_t gpio0a_ds0; /* Address Offset: 0x20070 */ + uint32_t gpio0a_ds1; /* Address Offset: 0x20074 */ + uint32_t gpio0a_ds2; /* Address Offset: 0x20078 */ + uint32_t gpio0a_ds3; /* Address Offset: 0x2007C */ + uint32_t gpio0b_ds0; /* Address Offset: 0x20080 */ + uint32_t gpio0b_ds1; /* Address Offset: 0x20084 */ + uint32_t gpio0b_ds2; /* Address Offset: 0x20088 */ + uint32_t gpio0b_ds3; /* Address Offset: 0x2008C */ + uint32_t gpio0c_ds0; /* Address Offset: 0x20090 */ + uint32_t gpio0c_ds1; /* Address Offset: 0x20094 */ + uint32_t gpio0c_ds2; /* Address Offset: 0x20098 */ + uint32_t gpio0c_ds3; /* Address Offset: 0x2009C */ + uint32_t gpio0d_ds0; /* Address Offset: 0x200A0 */ + uint32_t reserved200a4[23]; /* Address Offset: 0x200A4 */ + uint32_t jtag_m0_con; /* Address Offset: 0x20100 */ + uint32_t uart_io_con; /* Address Offset: 0x20104 */ + uint32_t reserved20108[16]; /* Address Offset: 0x20108 */ + uint32_t io_vsel2; /* Address Offset: 0x20148 */ + uint32_t xin_con; /* Address Offset: 0x2014C */ +}; +check_member(rk3562_ioc, xin_con, 0x2014c); + +#endif + diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/pcie_ep_boot.h b/u-boot/arch/arm/include/asm/arch-rockchip/pcie_ep_boot.h new file mode 100644 index 0000000..dcfd657 --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/pcie_ep_boot.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (c) 2023 Rockchip Electronics Co., Ltd + */ + +#ifndef __ASM_PCIE_EP_BOOT_H +#define __ASM_PCIE_EP_BOOT_H + +void rockchip_pcie_ep_init(void); +void rockchip_pcie_ep_get_firmware(void); +#endif diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h b/u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h index 8b6701c..aa6cb0b 100644 --- a/u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h +++ b/u-boot/arch/arm/include/asm/arch-rockchip/resource_img.h @@ -11,55 +11,42 @@ #define MAX_FILE_NAME_LEN 220 #define MAX_HASH_LEN 32 -#define ROOT_COMPAT_PROP_OFFSET 0x4c /* Property: "/compatible" */ #define DTB_SUFFIX ".dtb" struct resource_file { char name[MAX_FILE_NAME_LEN]; + uint32_t blk_start; + uint32_t blk_offset; char hash[MAX_HASH_LEN]; uint32_t hash_size; - uint32_t f_offset; /* Sector offset */ - uint32_t f_size; /* Bytes */ + uint32_t size; /* in byte */ + bool in_ram; struct list_head link; - struct list_head dtbs; - /* Sector base of resource when ram=false, byte base when ram=true */ - uint32_t rsce_base; - bool ram; }; -extern struct list_head entrys_head; -extern struct list_head entrys_dtbs_head; +extern struct list_head entry_head; /* - * resource_image_check_header - check resource image header + * resource_setup_ram_list() - setup resource file list by given resource image. * - * @rsce_hdr: resource file hdr + * @dev_desc: boot device + * @hdr: resource file hdr * - * return 0 on header okay, otherwise failed + * return 0 on success, otherwise fail. */ -int resource_image_check_header(void *rsce_hdr); +int resource_setup_ram_list(struct blk_desc *dev_desc, void *hdr); /* - * resource_create_ram_list - create resource file list by data from memory - * - * @dev_desc: blk dev descritpion - * @rsce_hdr: resource file hdr - * - * return 0 on header okay, otherwise failed - */ -int resource_create_ram_list(struct blk_desc *dev_desc, void *rsce_hdr); - -/* - * rockchip_read_resource_file - read file from resource partition + * rockchip_read_resource_file() - read file from resource. * * @buf: destination buf to store file data * @name: file name - * @offset: blocks offset in the file, 1 block = 512 bytes - * @len: the size(by bytes) of file to read. + * @blk_offset: blocks offset in the file, 1 block = 512 bytes + * @len: the size(by bytes) of file to read * - * return negative num on failed, otherwise the file size + * return the length of read data. */ -int rockchip_read_resource_file(void *buf, const char *name, int offset, int len); +int rockchip_read_resource_file(void *buf, const char *name, int blk_offset, int len); /* * rockchip_read_resource_dtb() - read dtb file @@ -69,43 +56,5 @@ * @hash_size: hash value length */ int rockchip_read_resource_dtb(void *fdt_addr, char **hash, int *hash_size); - -/* - * resource_init_list - init resource list of android image from storage - */ -int resource_init_list(void); - -/* - * resource_replace_entry - replace resource entry, override if find exist one - */ -int resource_replace_entry(const char *f_name, uint32_t base, - uint32_t f_offset, uint32_t f_size); - -/* - * resource_read_logo_bmps() - read logo bmp from "logo" partition - */ -int resource_read_logo_bmps(void); - -/* - * resource_read_hwid_dtb() - read hwid dtb - */ -struct resource_file *resource_read_hwid_dtb(void); - -/* - * resource_is_empty() - return if resource is empty - */ -int resource_is_empty(void); - -/* - * resource_traverse_init_list() - traverse all image(android/fit/uimage) - */ -int resource_traverse_init_list(void); - -/* - * board_resource_dtb_accepted() - check if this dtb is accepted - * - * return 0 if not accepted, otherwise accepted. - */ -int board_resource_dtb_accepted(char *dtb_name); #endif diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h b/u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h index e31f485..2a8799d 100644 --- a/u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h +++ b/u-boot/arch/arm/include/asm/arch-rockchip/rk_meta.h @@ -64,7 +64,7 @@ #define ITEM_SIZE (1 * 1024) #define MAX_CMDLINE_LENGTH (1024 / 2) #define MAX_HEAD_SIZE 4 -#define MAX_META_SEGMENT_SIZE (16 * 1024) +#define MAX_META_SEGMENT_SIZE (64 * 1024) #define BACKUP_META_SIZE (MAX_META_SEGMENT_SIZE / 2) #define META_INFO_HEAD_OFFSET 0 #define META_INFO_SIZE ITEM_SIZE @@ -80,13 +80,17 @@ #define APP_PARAM_OFFSET (AE_TABLE_OFFSET + AE_TABLE_MAX_SIZE) #define APP_PARAM_MAX_SIZE ITEM_SIZE +#define SECONDARY_SENSOR_INIT_OFFSET (APP_PARAM_OFFSET + APP_PARAM_MAX_SIZE) +#define SECONDARY_SENSOR_INIT_MAX_SIZE ITEM_SIZE + #define SENSOR_IQ_BIN_OFFSET (MAX_META_SEGMENT_SIZE) #define SENSOR_IQ_BIN_MAX_SIZE (320 * 1024) -#define MAX_META_BIN_SIZE (MAX_META_SEGMENT_SIZE + SENSOR_IQ_BIN_MAX_SIZE) -#define META_SIZE MAX_META_BIN_SIZE -/* 512 - sizeof(tag/load/size/comp_type/comp_size/comp_off/crc32/meta_flags) */ -#define META_HEAD_RESERVED_SIZE (120*4) +#define SECONDARY_SENSOR_IQ_BIN_OFFSET (SENSOR_IQ_BIN_OFFSET + SENSOR_IQ_BIN_MAX_SIZE) +#define SECONDARY_SENSOR_IQ_BIN_MAX_SIZE (SENSOR_IQ_BIN_MAX_SIZE) + +/* 512 - sizeof(tag/load/size/comp_type/comp_size/comp_off/crc32/meta_flags/iq_item_size) */ +#define META_HEAD_RESERVED_SIZE (119*4) #define META_READ_DONE_FLAG (1 << 0) #define AE_TABLE_SHARE2KERNEL_OFFSET (PARAM_SHARE2KERNEL_OFFSET) @@ -100,6 +104,7 @@ uint32_t comp_type; uint32_t comp_size; uint32_t comp_off; + uint32_t iq_item_size; uint8_t reserved[META_HEAD_RESERVED_SIZE]; uint32_t crc32; uint32_t meta_flags; diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h b/u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h index 72db8d9..e5663bf 100644 --- a/u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h +++ b/u-boot/arch/arm/include/asm/arch-rockchip/rockchip_smccc.h @@ -29,6 +29,7 @@ #define SIP_LAST_LOG 0x8200000e #define SIP_AMP_CFG 0x82000022 #define SIP_HDCP_CONFIG 0x82000025 +#define SIP_MCU_CFG 0x82000028 #define ROCKCHIP_SIP_CONFIG_DRAM_INIT 0x00 #define ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE 0x01 @@ -46,6 +47,19 @@ #define ROCKCHIP_SIP_CONFIG_DRAM_ECC 0x0d #define ROCKCHIP_SIP_CONFIG_DRAM_GET_FREQ_INFO 0x0e #define ROCKCHIP_SIP_CONFIG_DRAM_FSP_INIT 0x0f + +/* RK_SIP_MCU_CFG child configs, MCU ID */ +#define ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID 0x00 +#define ROCKCHIP_SIP_CONFIG_BUSMCU_1_ID 0x01 +#define ROCKCHIP_SIP_CONFIG_PMUMCU_0_ID 0x10 +#define ROCKCHIP_SIP_CONFIG_DDRMCU_0_ID 0x20 +#define ROCKCHIP_SIP_CONFIG_NPUMCU_0_ID 0x30 + +/* RK_SIP_MCU_CFG child configs */ +#define ROCKCHIP_SIP_CONFIG_MCU_CODE_START_ADDR 0x01 +#define ROCKCHIP_SIP_CONFIG_MCU_EXPERI_START_ADDR 0x02 +#define ROCKCHIP_SIP_CONFIG_MCU_SRAM_START_ADDR 0x03 +#define ROCKCHIP_SIP_CONFIG_MCU_EXSRAM_START_ADDR 0x04 /* Rockchip Sip version */ #define SIP_IMPLEMENT_V1 (1) @@ -100,6 +114,8 @@ int sip_smc_set_suspend_mode(unsigned long ctrl, unsigned long config1, unsigned long config2); + +int sip_smc_remotectl_config(unsigned long func, unsigned long data); /* * sip_smc_amp_cfg() - config AMP @@ -172,6 +188,13 @@ unsigned long arg1, unsigned long arg2); /* + * sip_smc_mcu_config() - handle mcu. + * + * @return 0 on success, otherwise failed. + */ +int sip_smc_mcu_config(unsigned long mcu_id, unsigned long func, unsigned long arg2); + +/* * psci_cpu_on() - Standard ARM PSCI cpu on call. * * @cpuid: cpu id diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3528.h b/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3528.h new file mode 100644 index 0000000..ce9dacf --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3528.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2022 Rockchip Electronics Co., Ltd. + */ + +#ifndef _ASM_ARCH_SDRAM_RK3528_H +#define _ASM_ARCH_SDRAM_RK3528_H + +#include <asm/arch-rockchip/sdram.h> +#include <asm/arch-rockchip/sdram_common.h> + +#endif /* _ASM_ARCH_SDRAM_RK3528_H */ diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3562.h b/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3562.h new file mode 100644 index 0000000..3357d8f --- /dev/null +++ b/u-boot/arch/arm/include/asm/arch-rockchip/sdram_rk3562.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2022 Rockchip Electronics Co., Ltd. + */ + +#ifndef _ASM_ARCH_SDRAM_RK3562_H +#define _ASM_ARCH_SDRAM_RK3562_H + +#include <asm/arch-rockchip/sdram.h> +#include <asm/arch-rockchip/sdram_common.h> + +#endif /* _ASM_ARCH_SDRAM_RK3562_H */ diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/uimage.h b/u-boot/arch/arm/include/asm/arch-rockchip/uimage.h index f409348..a263de2 100644 --- a/u-boot/arch/arm/include/asm/arch-rockchip/uimage.h +++ b/u-boot/arch/arm/include/asm/arch-rockchip/uimage.h @@ -12,7 +12,6 @@ void *uimage_load_bootables(void); int uimage_sysmem_free_each(image_header_t *img, u32 ramdisk_sz); int uimage_sysmem_reserve_each(image_header_t *hdr, u32 *ramdisk_sz); -int uimage_init_resource(void); - +int uimage_init_resource(struct blk_desc *dev_desc); #endif diff --git a/u-boot/arch/arm/include/asm/arch-rockchip/vendor.h b/u-boot/arch/arm/include/asm/arch-rockchip/vendor.h index 2c11030..85570ca 100644 --- a/u-boot/arch/arm/include/asm/arch-rockchip/vendor.h +++ b/u-boot/arch/arm/include/asm/arch-rockchip/vendor.h @@ -46,4 +46,7 @@ void *p_data)); int vendor_handle_hdcp(struct vendor_item *vhead); + +void vendor_storage_fixup(void *blob); + #endif /* _ROCKCHIP_VENDOR_ */ diff --git a/u-boot/arch/arm/include/asm/system.h b/u-boot/arch/arm/include/asm/system.h index 795d82d..8625375 100644 --- a/u-boot/arch/arm/include/asm/system.h +++ b/u-boot/arch/arm/include/asm/system.h @@ -257,6 +257,7 @@ void wait_for_wakeup(void); void protect_secure_region(void); void smp_kick_all_cpus(void); +void smp_entry(u32 cpu); void flush_l3_cache(void); void mmu_change_region_attr(phys_addr_t start, size_t size, u64 attrs); diff --git a/u-boot/arch/arm/lib/bootm-fdt.c b/u-boot/arch/arm/lib/bootm-fdt.c index af47974..5ef0e66 100644 --- a/u-boot/arch/arm/lib/bootm-fdt.c +++ b/u-boot/arch/arm/lib/bootm-fdt.c @@ -46,6 +46,9 @@ if (ret) return ret; + /* Show "/reserved-memory" */ + boot_mem_rsv_regions(NULL, blob); + #if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_OF_LIBFDT) bd_t *bd = gd->bd; int bank; diff --git a/u-boot/arch/arm/lib/bootm.c b/u-boot/arch/arm/lib/bootm.c index 53f7444..7a94d79 100644 --- a/u-boot/arch/arm/lib/bootm.c +++ b/u-boot/arch/arm/lib/bootm.c @@ -22,6 +22,7 @@ #include <asm/byteorder.h> #include <linux/libfdt.h> #include <mapmem.h> +#include <mp_boot.h> #include <fdt_support.h> #include <asm/bootm.h> #include <asm/secure.h> @@ -80,7 +81,7 @@ */ static void announce_and_cleanup(bootm_headers_t *images, int fake) { - ulong us; + ulong us, tt_us; bootstage_mark_name(BOOTSTAGE_ID_BOOTM_HANDOFF, "start_kernel"); #ifdef CONFIG_BOOTSTAGE_FDT @@ -108,8 +109,12 @@ cleanup_before_linux(); +#ifdef CONFIG_MP_BOOT + mpb_post(4); +#endif us = (get_ticks() - gd->sys_start_tick) / (COUNTER_FREQUENCY / 1000000); - printf("Total: %ld.%ld ms\n", us / 1000, us % 1000); + tt_us = get_ticks() / (COUNTER_FREQUENCY / 1000000); + printf("Total: %ld.%ld/%ld.%ld ms\n", us / 1000, us % 1000, tt_us / 1000, tt_us % 1000); printf("\nStarting kernel ...%s\n\n", fake ? "(fake run for tracing)" : ""); diff --git a/u-boot/arch/arm/lib/crt0_64.S b/u-boot/arch/arm/lib/crt0_64.S index 27e22f9..5940253 100644 --- a/u-boot/arch/arm/lib/crt0_64.S +++ b/u-boot/arch/arm/lib/crt0_64.S @@ -66,42 +66,6 @@ */ ENTRY(_main) - /* - * Enable instruction cache (if required), stack pointer, - * data access alignment checks and SError. - */ -#ifdef CONFIG_SPL_BUILD - mov x1, #CR_I -#else - mov x1, #0 -#endif - switch_el x2, 3f, 2f, 1f -3: mrs x0, sctlr_el3 - orr x0, x0, x1 - msr sctlr_el3, x0 -#ifndef CONFIG_SUPPORT_USBPLUG - msr daifclr, #4 /* Enable SError. SCR_EL3.EA=1 was already set in start.S */ -#endif - b 0f -2: mrs x0, sctlr_el2 - orr x0, x0, x1 - msr sctlr_el2, x0 - - mrs x0, hcr_el2 - orr x0, x0, #HCR_EL2_TGE - orr x0, x0, #HCR_EL2_AMO -#if CONFIG_IS_ENABLED(IRQ) - orr x0, x0, #HCR_EL2_IMO -#endif - msr hcr_el2, x0 - msr daifclr, #4 - b 0f -1: mrs x0, sctlr_el1 - orr x0, x0, x1 - msr sctlr_el1, x0 - msr daifclr, #4 -0: - isb /* * Set up initial C runtime environment and call board_init_f(0). diff --git a/u-boot/arch/arm/mach-rockchip/Kconfig b/u-boot/arch/arm/mach-rockchip/Kconfig index 0a3c8f4..383503d 100644 --- a/u-boot/arch/arm/mach-rockchip/Kconfig +++ b/u-boot/arch/arm/mach-rockchip/Kconfig @@ -381,6 +381,61 @@ endif +config ROCKCHIP_RK3528 + bool "Support Rockchip RK3528" + select ARM64 if !ARM64_BOOT_AARCH32 + select GICV2 if !ARM64_BOOT_AARCH32 + select SUPPORT_TPL if !ARM64_BOOT_AARCH32 + select SUPPORT_SPL if !ARM64_BOOT_AARCH32 + select TPL_TINY_FRAMEWORK if TPL + select DEBUG_UART_BOARD_INIT + imply TPL if !ARM64_BOOT_AARCH32 + imply SPL if !ARM64_BOOT_AARCH32 + imply TPL_SERIAL_SUPPORT + help + The Rockchip RK3528 is a ARM-based SoC with a quad-core Cortex-A53. + +if ROCKCHIP_RK3528 + +config TPL_LDSCRIPT + default "arch/arm/mach-rockchip/u-boot-tpl-v8.lds" + +config TPL_TEXT_BASE + default 0xfe481000 + +config TPL_MAX_SIZE + default 61440 + +endif + +config ROCKCHIP_RK3562 + bool "Support Rockchip RK3562" + select GICV2 + select ARM64 + select ARM_SMCCC + select SUPPORT_TPL + select SUPPORT_SPL + select TPL_TINY_FRAMEWORK if TPL + select DEBUG_UART_BOARD_INIT + imply TPL + imply SPL + imply TPL_SERIAL_SUPPORT + help + The Rockchip RK3562 is a ARM-based SoC with a quad-core Cortex-A53. + +if ROCKCHIP_RK3562 + +config TPL_LDSCRIPT + default "arch/arm/mach-rockchip/u-boot-tpl-v8.lds" + +config TPL_TEXT_BASE + default 0xfe481000 + +config TPL_MAX_SIZE + default 61440 + +endif + config ROCKCHIP_RK3568 bool "Support Rockchip RK3568" select ARM64 if !ARM64_BOOT_AARCH32 @@ -597,6 +652,8 @@ default 0xff1005c8 if ROCKCHIP_RK3328 default 0xff738200 if ROCKCHIP_RK3368 default 0xff320300 if ROCKCHIP_RK3399 + default 0xff370200 if ROCKCHIP_RK3528 + default 0xff010220 if ROCKCHIP_RK3562 default 0xfdc20200 if ROCKCHIP_RK3568 default 0xfd588080 if ROCKCHIP_RK3588 default 0xfe020200 if ROCKCHIP_RK1808 @@ -622,6 +679,8 @@ default 0xff1d0020 if ROCKCHIP_RK3328 default 0xff830020 if ROCKCHIP_RK3368 default 0xff8680a0 if ROCKCHIP_RK3399 + default 0xff620000 if ROCKCHIP_RK3528 + default 0xffa90020 if ROCKCHIP_RK3562 default 0xfdd1c020 if ROCKCHIP_RK3568 default 0xfd8c8000 if ROCKCHIP_RK3588 default 0xff590020 if ROCKCHIP_RV1106 @@ -644,6 +703,8 @@ default 0xff091000 if ROCKCHIP_RK3328 default 0xff8c0000 if ROCKCHIP_RK3368 default 0xff8c0000 if ROCKCHIP_RK3399 + default 0xfe480000 if ROCKCHIP_RK3528 + default 0xfe480000 if ROCKCHIP_RK3562 default 0xfdcc0000 if ROCKCHIP_RK3568 default 0xff000000 if ROCKCHIP_RK3588 default 0xff6c0000 if ROCKCHIP_RV1106 @@ -813,16 +874,22 @@ - U-Boot: only some necessary U-Boot devices(storage, crypto...) in dm tree. - kernel: all the devices(except the U-Boot only) in dm tree. +config EMBED_KERNEL_DTB + bool "Enable embedded dtb support" + default n + help + Enable embedded dtb support. + config EMBED_KERNEL_DTB_PATH - string "Embeded kernel dtb file path" - depends on USING_KERNEL_DTB + string "Embedded kernel dtb file path" + depends on EMBED_KERNEL_DTB && USING_KERNEL_DTB default "dts/kern.dtb" help This file will auto be appended to the u-boot.bin. config EMBED_KERNEL_DTB_ALWAYS - bool "Always using embed kernel dtb" - depends on USING_KERNEL_DTB + bool "Always using embedded kernel dtb" + depends on EMBED_KERNEL_DTB && USING_KERNEL_DTB default n help Allow fallback to always use a prepared kernel dtb even USING_KERNEL_DTB @@ -914,6 +981,16 @@ default y help Define a lot of hotkeys for debug. + +config ROCKCHIP_CMD + string "Rockchip specific command" + default "" + help + It defines a command to be run when the key is pressed if assigned. + String format: "cmd key". + @cmd: any U-Boot cmd. + @key: any key map id, '-' standard for ignore. + e.g. "sd_update 115", 115 is KEY_VOLUMEUP. config GICV2 bool "ARM GICv2" @@ -1013,14 +1090,16 @@ default 0x0 depends on PSTORE help - This select linux pstore buffer address for uboot. + This select linux pstore buffer address for U-Boot. When value is + 0, U-Boot auto gets this address from preloader atags. config PERSISTENT_RAM_SIZE hex "Linux pstore buffer size" default 0x0 - depends on PSTORE + depends on (PERSISTENT_RAM_ADDR != 0) help - This select linux pstore buffer size for uboot. + This select linux pstore buffer size for U-Boot, the value must be + set if PERSISTENT_RAM_ADDR != 0. source "arch/arm/mach-rockchip/px30/Kconfig" source "arch/arm/mach-rockchip/rk3036/Kconfig" @@ -1033,6 +1112,8 @@ source "arch/arm/mach-rockchip/rk3328/Kconfig" source "arch/arm/mach-rockchip/rk3368/Kconfig" source "arch/arm/mach-rockchip/rk3399/Kconfig" +source "arch/arm/mach-rockchip/rk3528/Kconfig" +source "arch/arm/mach-rockchip/rk3562/Kconfig" source "arch/arm/mach-rockchip/rk3568/Kconfig" source "arch/arm/mach-rockchip/rk3588/Kconfig" source "arch/arm/mach-rockchip/rk1808/Kconfig" diff --git a/u-boot/arch/arm/mach-rockchip/Makefile b/u-boot/arch/arm/mach-rockchip/Makefile index afa18a4..75de030 100644 --- a/u-boot/arch/arm/mach-rockchip/Makefile +++ b/u-boot/arch/arm/mach-rockchip/Makefile @@ -49,7 +49,7 @@ obj-$(CONFIG_ROCKCHIP_UIMAGE) += uimage.o obj-$(CONFIG_ROCKCHIP_SMCCC) += rockchip_smccc.o obj-$(CONFIG_ROCKCHIP_VENDOR_PARTITION) += vendor.o vendor_misc.o -obj-$(CONFIG_ROCKCHIP_RESOURCE_IMAGE) += resource_img.o resource_logo.o +obj-$(CONFIG_ROCKCHIP_RESOURCE_IMAGE) += resource_img.o obj-$(CONFIG_ROCKCHIP_HWID_DTB) += resource_hwid.o obj-$(CONFIG_ROCKCHIP_DEBUGGER) += rockchip_debugger.o endif @@ -58,6 +58,7 @@ obj-$(CONFIG_RAM) += param.o obj-$(CONFIG_$(SPL_TPL_)RAM) += sdram.o obj-$(CONFIG_SPL_KERNEL_BOOT) += spl_resource_img.o +obj-$(CONFIG_SPL_PCIE_EP_SUPPORT) += spl_pcie_ep_boot.o obj-$(CONFIG_ROCKCHIP_PX30) += px30/ obj-$(CONFIG_ROCKCHIP_RK3036) += rk3036/ @@ -72,6 +73,8 @@ obj-$(CONFIG_ROCKCHIP_RK3328) += rk3328/ obj-$(CONFIG_ROCKCHIP_RK3368) += rk3368/ obj-$(CONFIG_ROCKCHIP_RK3399) += rk3399/ +obj-$(CONFIG_ROCKCHIP_RK3528) += rk3528/ +obj-$(CONFIG_ROCKCHIP_RK3562) += rk3562/ obj-$(CONFIG_ROCKCHIP_RK3568) += rk3568/ obj-$(CONFIG_ROCKCHIP_RK3588) += rk3588/ obj-$(CONFIG_ROCKCHIP_RK1808) += rk1808/ diff --git a/u-boot/arch/arm/mach-rockchip/board.c b/u-boot/arch/arm/mach-rockchip/board.c index b3bced5..a539d4b 100644 --- a/u-boot/arch/arm/mach-rockchip/board.c +++ b/u-boot/arch/arm/mach-rockchip/board.c @@ -56,6 +56,10 @@ DECLARE_GLOBAL_DATA_PTR; +#ifdef CONFIG_ARM64 +static ulong orig_images_ep; +#endif + __weak int rk_board_late_init(void) { return 0; @@ -246,30 +250,48 @@ static int boot_from_udisk(void) { struct blk_desc *desc; - char *devtype; - char *devnum; - - devtype = env_get("devtype"); - devnum = env_get("devnum"); + struct udevice *dev; + int devnum = -1; + char buf[32]; /* Booting priority: mmc1 > udisk */ - if (!strcmp(devtype, "mmc") && !strcmp(devnum, "1")) + if (!strcmp(env_get("devtype"), "mmc") && !strcmp(env_get("devnum"), "1")) return 0; if (!run_command("usb start", -1)) { - desc = blk_get_devnum_by_type(IF_TYPE_USB, 0); - if (!desc) { - printf("No usb device found\n"); + for (blk_first_device(IF_TYPE_USB, &dev); + dev; + blk_next_device(&dev)) { + desc = dev_get_uclass_platdata(dev); + printf("Scanning usb %d ...\n", desc->devnum); + if (desc->type == DEV_TYPE_UNKNOWN) + continue; + + if (desc->lba > 0L && desc->blksz > 0L) { + devnum = desc->devnum; + break; + } + } + if (devnum < 0) { + printf("No usb mass storage found\n"); return -ENODEV; } - if (!run_command("rkimgtest usb 0", -1)) { + desc = blk_get_devnum_by_type(IF_TYPE_USB, devnum); + if (!desc) { + printf("No usb %d found\n", devnum); + return -ENODEV; + } + + snprintf(buf, 32, "rkimgtest usb %d", devnum); + if (!run_command(buf, -1)) { + snprintf(buf, 32, "%d", devnum); rockchip_set_bootdev(desc); env_set("devtype", "usb"); - env_set("devnum", "0"); - printf("Boot from usb 0\n"); + env_set("devnum", buf); + printf("=== Booting from usb %d ===\n", devnum); } else { - printf("No usb dev 0 found\n"); + printf("No available udisk image on usb %d\n", devnum); return -ENODEV; } } @@ -358,6 +380,8 @@ static void cmdline_handle(void) { struct blk_desc *dev_desc; + int if_type; + int devnum; param_parse_pubkey_fuse_programmed(); @@ -373,19 +397,51 @@ * rockchip_get_boot_mode() actually only read once, * we need to update boot mode according to udisk BCB. */ - if ((dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 1) || - (dev_desc->if_type == IF_TYPE_USB && dev_desc->devnum == 0)) { + if_type = dev_desc->if_type; + devnum = dev_desc->devnum; + if ((if_type == IF_TYPE_MMC && devnum == 1) || (if_type == IF_TYPE_USB)) { if (get_bcb_recovery_msg() == BCB_MSG_RECOVERY_RK_FWUPDATE) { - if (dev_desc->if_type == IF_TYPE_MMC && dev_desc->devnum == 1) { + if (if_type == IF_TYPE_MMC && devnum == 1) { env_update("bootargs", "sdfwupdate"); - } else if (dev_desc->if_type == IF_TYPE_USB && dev_desc->devnum == 0) { + } else if (if_type == IF_TYPE_USB) { env_update("bootargs", "usbfwupdate"); env_set("reboot_mode", "recovery-usb"); } } else { - if (dev_desc->if_type == IF_TYPE_USB && dev_desc->devnum == 0) + if (if_type == IF_TYPE_USB) env_set("reboot_mode", "normal"); } + } + + if (rockchip_get_boot_mode() == BOOT_MODE_QUIESCENT) + env_update("bootargs", "androidboot.quiescent=1 pwm_bl.quiescent=1"); +} + +static void scan_run_cmd(void) +{ + char *config = CONFIG_ROCKCHIP_CMD; + char *cmd, *key; + + key = strchr(config, ' '); + if (!key) + return; + + cmd = strdup(config); + cmd[key - config] = 0; + key++; + + if (!strcmp(key, "-")) { + run_command(cmd, 0); + } else { +#ifdef CONFIG_DM_KEY + ulong map; + + map = simple_strtoul(key, NULL, 10); + if (key_is_pressed(key_read(map))) { + printf("## Key<%ld> pressed... run cmd '%s'\n", map, cmd); + run_command(cmd, 0); + } +#endif } } @@ -398,7 +454,7 @@ rockchip_set_serialno(); #endif setup_download_mode(); - + scan_run_cmd(); #ifdef CONFIG_ROCKCHIP_USB_BOOT boot_from_udisk(); #endif @@ -406,7 +462,8 @@ charge_display(); #endif #ifdef CONFIG_DRM_ROCKCHIP - rockchip_show_logo(); + if (rockchip_get_boot_mode() != BOOT_MODE_QUIESCENT) + rockchip_show_logo(); #endif #ifdef CONFIG_ROCKCHIP_EINK_DISPLAY rockchip_eink_show_uboot_logo(); @@ -458,57 +515,31 @@ printf("Cmd interface: disabled\n"); } -#if defined(CONFIG_MTD_BLK) && defined(CONFIG_USING_KERNEL_DTB) -static void board_mtd_blk_map_partitions(void) -{ - struct blk_desc *dev_desc; - - dev_desc = rockchip_get_bootdev(); - if (dev_desc) - mtd_blk_map_partitions(dev_desc); -} -#endif - int board_init(void) { board_debug_init(); - /* optee select security level */ -#ifdef CONFIG_OPTEE_CLIENT - trusty_select_security_level(); -#endif - #ifdef DEBUG soc_clk_dump(); #endif - -#ifdef CONFIG_USING_KERNEL_DTB -#ifdef CONFIG_MTD_BLK - board_mtd_blk_map_partitions(); +#ifdef CONFIG_OPTEE_CLIENT + trusty_select_security_level(); #endif +#ifdef CONFIG_USING_KERNEL_DTB init_kernel_dtb(); #endif early_download(); - /* - * pmucru isn't referenced on some platforms, so pmucru driver can't - * probe that the "assigned-clocks" is unused. - */ clks_probe(); #ifdef CONFIG_DM_REGULATOR - if (regulators_enable_boot_on(is_hotkey(HK_REGULATOR))) - debug("%s: Can't enable boot on regulator\n", __func__); + regulators_enable_boot_on(is_hotkey(HK_REGULATOR)); #endif - #ifdef CONFIG_ROCKCHIP_IO_DOMAIN io_domain_init(); #endif - set_armclk_rate(); - #ifdef CONFIG_DM_DVFS dvfs_init(true); #endif - #ifdef CONFIG_ANDROID_AB if (ab_decrease_tries()) printf("Decrease ab tries count fail!\n"); @@ -537,6 +568,10 @@ /* Common fixup for DRM */ #ifdef CONFIG_DRM_ROCKCHIP rockchip_display_fixup(blob); +#endif + +#ifdef CONFIG_ROCKCHIP_VENDOR_PARTITION + vendor_storage_fixup(blob); #endif return rk_board_fdt_fixup(blob); @@ -603,6 +638,9 @@ * But relocation is in board_quiesce_devices() until all decompress * done, mainly for saving boot time. */ + + orig_images_ep = images->ep; + if (data[10] == 0x00) { if (round_down(images->ep, SZ_2M) != images->ep) images->ep = round_down(images->ep, SZ_2M); @@ -736,9 +774,10 @@ return boot_flags; } -#if defined(CONFIG_USB_GADGET) && defined(CONFIG_USB_GADGET_DWC2_OTG) -#include <fdt_support.h> +#if defined(CONFIG_USB_GADGET) #include <usb.h> +#if defined(CONFIG_USB_GADGET_DWC2_OTG) +#include <fdt_support.h> #include <usb/dwc2_udc.h> static struct dwc2_plat_otg_data otg_data = { @@ -808,7 +847,17 @@ { return 0; } -#endif +#elif defined(CONFIG_USB_DWC3_GADGET) /* CONFIG_USB_GADGET_DWC2_OTG */ +#include <dwc3-uboot.h> + +int board_usb_cleanup(int index, enum usb_init_type init) +{ + dwc3_uboot_exit(index); + return 0; +} + +#endif /* CONFIG_USB_DWC3_GADGET */ +#endif /* CONFIG_USB_GADGET */ static void bootm_no_reloc(void) { @@ -1049,15 +1098,13 @@ #endif #ifdef CONFIG_ARM64 bootm_headers_t *bootm_images = (bootm_headers_t *)images; - ulong kernel_addr; /* relocate kernel after decompress cleanup */ - kernel_addr = env_get_ulong("kernel_addr_r", 16, 0); - if (kernel_addr != bootm_images->ep) { - memmove((char *)bootm_images->ep, (const char *)kernel_addr, + if (orig_images_ep && orig_images_ep != bootm_images->ep) { + memmove((char *)bootm_images->ep, (const char *)orig_images_ep, bootm_images->os.image_len); printf("== DO RELOCATE == Kernel from 0x%08lx to 0x%08lx\n", - kernel_addr, bootm_images->ep); + orig_images_ep, bootm_images->ep); } #endif @@ -1109,16 +1156,39 @@ #endif } -#ifdef CONFIG_ENVF - char * sys_bootargs; +#if defined(CONFIG_ENVF) || defined(CONFIG_ENV_PARTITION) + char *part_type[] = { "mtdparts", "blkdevparts" }; + char *part_list; + char *env; + int id = 0; - sys_bootargs = env_get("sys_bootargs"); - if (sys_bootargs) { - env_update("bootargs", sys_bootargs); + env = env_get(part_type[id]); + if (!env) + env = env_get(part_type[++id]); + if (env) { + if (!strstr(env, part_type[id])) { + part_list = calloc(1, strlen(env) + strlen(part_type[id]) + 2); + if (part_list) { + strcat(part_list, part_type[id]); + strcat(part_list, "="); + strcat(part_list, env); + } + } else { + part_list = env; + } + env_update("bootargs", part_list); if (dump) - printf("## sys_bootargs: %s\n\n", sys_bootargs); + printf("## parts: %s\n\n", part_list); + } + + env = env_get("sys_bootargs"); + if (env) { + env_update("bootargs", env); + if (dump) + printf("## sys_bootargs: %s\n\n", env); } #endif + #ifdef CONFIG_MTD_BLK if (!env_get("mtdparts")) { char *mtd_par_info = mtd_part_parse(NULL); @@ -1129,6 +1199,10 @@ } } #endif + +#ifdef CONFIG_ANDROID_AB + ab_update_root_partition(); +#endif /* * Initrd fixup: remove unused "initrd=0x...,0x...", * this for compatible with legacy parameter.txt diff --git a/u-boot/arch/arm/mach-rockchip/boot_mode.c b/u-boot/arch/arm/mach-rockchip/boot_mode.c index 61f0e85..6f4858b 100644 --- a/u-boot/arch/arm/mach-rockchip/boot_mode.c +++ b/u-boot/arch/arm/mach-rockchip/boot_mode.c @@ -202,6 +202,10 @@ printf("boot mode: watchdog\n"); boot_mode[PL] = BOOT_MODE_WATCHDOG; break; + case BOOT_QUIESCENT: + printf("boot mode: quiescent\n"); + boot_mode[PL] = BOOT_MODE_QUIESCENT; + break; default: printf("boot mode: None\n"); boot_mode[PL] = BOOT_MODE_UNDEFINE; diff --git a/u-boot/arch/arm/mach-rockchip/boot_rkimg.c b/u-boot/arch/arm/mach-rockchip/boot_rkimg.c index 097d976..3e133fb 100644 --- a/u-boot/arch/arm/mach-rockchip/boot_rkimg.c +++ b/u-boot/arch/arm/mach-rockchip/boot_rkimg.c @@ -19,6 +19,8 @@ #include <key.h> #include <mmc.h> #include <malloc.h> +#include <mp_boot.h> +#include <mtd_blk.h> #include <nvme.h> #include <scsi.h> #include <stdlib.h> @@ -91,6 +93,10 @@ if (done) return; + +#ifdef CONFIG_MP_BOOT + mpb_post(0); +#endif /* configuration */ if (!param_parse_assign_bootdev(&devtype, &devnum)) { @@ -269,6 +275,9 @@ printf("PartType: %s\n", part_get_type(dev_desc)); +#ifdef CONFIG_MTD_BLK + mtd_blk_map_partitions(dev_desc); +#endif return dev_desc; } @@ -512,7 +521,7 @@ LOCATE_END, }; -static int rkimg_traverse_read_dtb(void *fdt, int where) +static int dtb_scan(void *fdt, int where) { if (where == LOCATE_DISTRO) { #ifdef CONFIG_ROCKCHIP_EARLY_DISTRO_DTB @@ -557,19 +566,13 @@ int locate, ret; int size; - /* init resource list */ -#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE - resource_traverse_init_list(); -#endif - - /* traverse location */ for (locate = 0; locate < LOCATE_END; locate++) { - ret = rkimg_traverse_read_dtb(fdt, locate); + ret = dtb_scan(fdt, locate); if (!ret) break; } if (ret) { - printf("No find valid DTB, ret=%d\n", ret); + printf("No valid DTB, ret=%d\n", ret); return ret; } @@ -608,7 +611,7 @@ offset = hdr->page_size + ALIGN(hdr->kernel_size, hdr->page_size) + ALIGN(hdr->ramdisk_size, hdr->page_size); #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE - ret = resource_create_ram_list(dev_desc, (void *)hdr + offset); + ret = resource_setup_ram_list(dev_desc, (void *)hdr + offset); if (ret) return ret; @@ -650,9 +653,9 @@ if (!dev_desc) return -ENODEV; - ret = resource_create_ram_list(dev_desc, (void *)data); + ret = resource_setup_ram_list(dev_desc, (void *)data); if (ret) { - printf("resource_create_ram_list fail, ret=%d\n", ret); + printf("resource_setup_ram_list fail, ret=%d\n", ret); return ret; } diff --git a/u-boot/arch/arm/mach-rockchip/chip_info.c b/u-boot/arch/arm/mach-rockchip/chip_info.c index ee0f9a0..65667ff 100644 --- a/u-boot/arch/arm/mach-rockchip/chip_info.c +++ b/u-boot/arch/arm/mach-rockchip/chip_info.c @@ -63,6 +63,10 @@ chip_info[0] = 0x33333236; #elif defined(CONFIG_ROCKCHIP_PX30) chip_info[0] = 0x50583330; +#elif defined(CONFIG_ROCKCHIP_RK3528) + chip_info[0] = 0x33353238; +#elif defined(CONFIG_ROCKCHIP_RK3562) + chip_info[0] = 0x33353632; #elif defined(CONFIG_ROCKCHIP_RK3568) chip_info[0] = 0x33353638; #elif defined(CONFIG_ROCKCHIP_RK3588) diff --git a/u-boot/arch/arm/mach-rockchip/fit.c b/u-boot/arch/arm/mach-rockchip/fit.c index 9348c76..7c5681a 100644 --- a/u-boot/arch/arm/mach-rockchip/fit.c +++ b/u-boot/arch/arm/mach-rockchip/fit.c @@ -142,14 +142,14 @@ { __maybe_unused int conf_noffset; disk_partition_t part; - char *part_name; + char *part_name = PART_BOOT; void *fit, *fdt; int blk_num; +#ifndef CONFIG_ANDROID_AB if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY) part_name = PART_RECOVERY; - else - part_name = PART_BOOT; +#endif if (part_get_info_by_name(dev_desc, part_name, &part) < 0) { FIT_I("No %s partition\n", part_name); @@ -201,6 +201,7 @@ printf("%s: ", fdt_get_name(fit, conf_noffset, NULL)); if (fit_config_verify(fit, conf_noffset)) { puts("\n"); + /* don't remove this failure handle */ run_command("download", 0); hang(); } @@ -246,6 +247,7 @@ { int ret; + /* free for fit_image_fixup_alloc(FIT_FDT_PROP) to re-alloc */ if ((gd->flags & GD_FLG_KDTB_READY) && !gd->fdt_blob_kern) sysmem_free((phys_addr_t)gd->fdt_blob); @@ -404,65 +406,45 @@ } #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE -static int fit_image_load_resource(const void *fit, struct blk_desc *dev_desc, - disk_partition_t *part, ulong *addr) +ulong fit_image_init_resource(struct blk_desc *dev_desc) { - int offset, size; - int ret; - void *data; - - ret = fdt_image_get_offset_size(fit, FIT_MULTI_PROP, &offset, &size); - if (ret) - return ret; - - data = malloc(ALIGN(size, dev_desc->blksz)); - if (!data) - return -ENOMEM; - - *addr = (ulong)data; - - return fit_image_load_one(fit, dev_desc, part, FIT_MULTI_PROP, - data, IS_ENABLED(CONFIG_FIT_SIGNATURE)); -} - -int fit_image_init_resource(void) -{ - struct blk_desc *dev_desc; disk_partition_t part; + void *fit, *buf; + int offset, size; int ret = 0; - void *fit; - dev_desc = rockchip_get_bootdev(); - if (!dev_desc) { - FIT_I("No dev_desc!\n"); + if (!dev_desc) return -ENODEV; - } fit = fit_get_blob(dev_desc, &part, true); if (!fit) + return -EAGAIN; + + ret = fdt_image_get_offset_size(fit, FIT_MULTI_PROP, &offset, &size); + if (ret) return -EINVAL; -#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE - ulong rsce; + buf = memalign(ARCH_DMA_MINALIGN, ALIGN(size, dev_desc->blksz)); + if (!buf) + return -ENOMEM; - ret = fit_image_load_resource(fit, dev_desc, &part, &rsce); + printf("RESC: '%s', blk@0x%08lx\n", part.name, + part.start + ((FIT_ALIGN(fdt_totalsize(fit)) + offset) / dev_desc->blksz)); + ret = fit_image_load_one(fit, dev_desc, &part, FIT_MULTI_PROP, buf, 1); + if (ret) + return ret; + + ret = resource_setup_ram_list(dev_desc, buf); if (ret) { - FIT_I("Failed to load resource\n"); + FIT_I("Failed to setup resource ram list, ret=%d\n", ret); free(fit); return ret; } - ret = resource_create_ram_list(dev_desc, (void *)rsce); - if (ret) { - FIT_I("Failed to create resource list\n"); - free(fit); - return ret; - } -#endif fit_msg(fit); free(fit); - return ret; + return 0; } #else int fit_image_read_dtb(void *fdt_addr) diff --git a/u-boot/arch/arm/mach-rockchip/fit_args.sh b/u-boot/arch/arm/mach-rockchip/fit_args.sh index 6f67965..d92cbf5 100755 --- a/u-boot/arch/arm/mach-rockchip/fit_args.sh +++ b/u-boot/arch/arm/mach-rockchip/fit_args.sh @@ -107,7 +107,9 @@ # Base DARM_BASE=`sed -n "/CONFIG_SYS_SDRAM_BASE=/s/CONFIG_SYS_SDRAM_BASE=//p" ${srctree}/include/autoconf.mk|tr -d '\r'` -UBOOT_LOAD_ADDR=`sed -n "/CONFIG_SYS_TEXT_BASE=/s/CONFIG_SYS_TEXT_BASE=//p" ${srctree}/include/autoconf.mk|tr -d '\r'` +if ! grep -q '^CONFIG_FIT_OMIT_UBOOT=y' .config ; then + UBOOT_LOAD_ADDR=`sed -n "/CONFIG_SYS_TEXT_BASE=/s/CONFIG_SYS_TEXT_BASE=//p" ${srctree}/include/autoconf.mk|tr -d '\r'` +fi # ARCH U_ARCH="arm" diff --git a/u-boot/arch/arm/mach-rockchip/fit_misc.c b/u-boot/arch/arm/mach-rockchip/fit_misc.c index a279f5f..d3a2ad5 100644 --- a/u-boot/arch/arm/mach-rockchip/fit_misc.c +++ b/u-boot/arch/arm/mach-rockchip/fit_misc.c @@ -6,6 +6,7 @@ #include <common.h> #include <boot_rkimg.h> +#include <malloc.h> #include <misc.h> #ifdef CONFIG_SPL_BUILD #include <spl.h> @@ -25,7 +26,7 @@ #if CONFIG_IS_ENABLED(FIT_IMAGE_POST_PROCESS) #define FIT_UNCOMP_HASH_NODENAME "digest" -#if CONFIG_IS_ENABLED(MISC_DECOMPRESS) || CONFIG_IS_ENABLED(GZIP) +#if CONFIG_IS_ENABLED(MISC_DECOMPRESS) || CONFIG_IS_ENABLED(GZIP) || CONFIG_IS_ENABLED(LZMA) static int fit_image_get_uncomp_digest(const void *fit, int parent_noffset) { const char *name; @@ -126,8 +127,10 @@ else misc_decompress_sync(comp); #else +#if CONFIG_IS_ENABLED(GZIP) ret = gunzip((void *)(*load_addr), ALIGN(len, FIT_MAX_SPL_IMAGE_SZ), (void *)(*src_addr), (void *)(&len)); +#endif #endif } @@ -154,7 +157,7 @@ void board_fit_image_post_process(void *fit, int node, ulong *load_addr, ulong **src_addr, size_t *src_len, void *spec) { -#if CONFIG_IS_ENABLED(MISC_DECOMPRESS) || CONFIG_IS_ENABLED(GZIP) +#if CONFIG_IS_ENABLED(MISC_DECOMPRESS) || CONFIG_IS_ENABLED(GZIP) || CONFIG_IS_ENABLED(LZMA) fit_decomp_image(fit, node, load_addr, src_addr, src_len, spec); #endif @@ -169,6 +172,33 @@ } } #endif + +#ifndef CONFIG_SPL_BUILD + if (fit_image_check_type(fit, node, IH_TYPE_FIRMWARE)) { + const char *uname; + char *old, *new; + size_t len; + + uname = fdt_get_name(fit, node, NULL); + if (strcmp("bootargs", uname)) + return; + + old = env_get("bootargs"); + if (!old) + return; + + len = strlen(old) + (*src_len) + 2; + new = calloc(1, len); + if (new) { + strcpy(new, old); + strcat(new, " "); + strcat(new, (char *)(*src_addr)); + env_set("bootargs", new); + free(new); + } + + } +#endif } #endif /* FIT_IMAGE_POST_PROCESS */ /* diff --git a/u-boot/arch/arm/mach-rockchip/fit_nodes.sh b/u-boot/arch/arm/mach-rockchip/fit_nodes.sh index be7d46d..4d39ea0 100755 --- a/u-boot/arch/arm/mach-rockchip/fit_nodes.sh +++ b/u-boot/arch/arm/mach-rockchip/fit_nodes.sh @@ -27,6 +27,10 @@ # nodes function gen_uboot_node() { + if [ -z ${UBOOT_LOAD_ADDR} ]; then + return + fi + UBOOT="u-boot-nodtb.bin" echo " uboot { description = \"U-Boot\"; @@ -53,10 +57,16 @@ algo = \"sha256\"; }; };" + + LOADABLE_UBOOT="\"uboot\", " } function gen_fdt_node() { + if [ -z ${UBOOT_LOAD_ADDR} ]; then + return + fi + echo " fdt { description = \"U-Boot dtb\"; data = /incbin/(\"./u-boot.dtb\"); @@ -67,12 +77,19 @@ algo = \"sha256\"; }; };" + + FDT_SIGN=", \"fdt\"" + FDT="fdt = \"fdt\"${PROP_KERN_DTB};" }; function gen_kfdt_node() { + if [ -z ${UBOOT_LOAD_ADDR} ]; then + return + fi + KERN_DTB=`sed -n "/CONFIG_EMBED_KERNEL_DTB_PATH=/s/CONFIG_EMBED_KERNEL_DTB_PATH=//p" .config | tr -d '"'` - if [ -z "${KERN_DTB}" ]; then + if [ -z ${KERN_DTB} ]; then return; fi @@ -96,7 +113,7 @@ ${srctree}/arch/arm/mach-rockchip/decode_bl31.py NUM=1 - for ATF in `ls -l bl31_0x*.bin | sort --key=5 -nr | awk '{ print $9 }'` + for ATF in `ls -1 -S bl31_0x*.bin` do ATF_LOAD_ADDR=`echo ${ATF} | awk -F "_" '{ printf $2 }' | awk -F "." '{ printf $1 }'` # only atf-1 support compress @@ -135,7 +152,9 @@ };" fi - if [ ${NUM} -gt 1 ]; then + if [ ${NUM} -eq 2 ]; then + LOADABLE_ATF=${LOADABLE_ATF}"\"atf-${NUM}\"" + elif [ ${NUM} -gt 2 ]; then LOADABLE_ATF=${LOADABLE_ATF}", \"atf-${NUM}\"" fi NUM=`expr ${NUM} + 1` @@ -152,6 +171,12 @@ # If not AArch32 mode if ! grep -q '^CONFIG_ARM64_BOOT_AARCH32=y' .config ; then ENTRY="entry = <"${TEE_LOAD_ADDR}">;" + + # if disable packing tee.bin + if ! grep -q '^CONFIG_SPL_OPTEE=y' .config ; then + return + fi + fi fi @@ -179,7 +204,7 @@ };" LOADABLE_OPTEE=", \"optee\"" FIRMWARE_OPTEE="firmware = \"optee\";" - FIRMWARE_SIGN=", \"firmware\"" + FIRMWARE_SIGN="\"firmware\"" } function gen_mcu_node() @@ -314,8 +339,13 @@ function gen_arm64_configurations() { PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'` -if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then +if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then ALGO_PADDING=" padding = \"pss\";" +fi +if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then + ALGO_NAME=" algo = \"sha256,rsa4096\";" +else + ALGO_NAME=" algo = \"sha256,rsa2048\";" fi echo " }; @@ -325,14 +355,14 @@ description = \"${PLATFORM}\"; rollback-index = <0x0>; firmware = \"atf-1\"; - loadables = \"uboot\"${LOADABLE_ATF}${LOADABLE_OPTEE}${LOADABLE_OTHER}; + loadables = ${LOADABLE_UBOOT}${LOADABLE_ATF}${LOADABLE_OPTEE}${LOADABLE_OTHER}; ${STANDALONE_MCU} - fdt = \"fdt\"${PROP_KERN_DTB}; + ${FDT} signature { - algo = \"sha256,rsa2048\"; + ${ALGO_NAME} ${ALGO_PADDING} key-name-hint = \"dev\"; - sign-images = \"fdt\", \"firmware\", \"loadables\"${STANDALONE_SIGN}; + sign-images = \"firmware\", \"loadables\"${FDT_SIGN}${STANDALONE_SIGN}; }; }; }; @@ -343,9 +373,24 @@ function gen_arm_configurations() { PLATFORM=`sed -n "/CONFIG_DEFAULT_DEVICE_TREE/p" .config | awk -F "=" '{ print $2 }' | tr -d '"'` -if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then +if grep -q '^CONFIG_FIT_ENABLE_RSASSA_PSS_SUPPORT=y' .config ; then ALGO_PADDING=" padding = \"pss\";" fi +if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then + ALGO_NAME=" algo = \"sha256,rsa4096\";" +else + ALGO_NAME=" algo = \"sha256,rsa2048\";" +fi +if [ ! -z "${LOADABLE_UBOOT}" ] || [ ! -z "${LOADABLE_OTHER}" ]; then + LOADABLE_UBOOT="\"uboot\"" + LOADABLES="loadables = ${LOADABLE_UBOOT}${LOADABLE_OTHER};" + if [ -z ${FIRMWARE_SIGN} ]; then + LOADABLES_SIGN="\"loadables\"" + else + LOADABLES_SIGN=", \"loadables\"" + fi +fi + echo " }; configurations { @@ -354,14 +399,14 @@ description = \"${PLATFORM}\"; rollback-index = <0x0>; ${FIRMWARE_OPTEE} - loadables = \"uboot\"${LOADABLE_OTHER}; + ${LOADABLES} ${STANDALONE_MCU} - fdt = \"fdt\"${PROP_KERN_DTB}; + ${FDT} signature { - algo = \"sha256,rsa2048\"; + ${ALGO_NAME} ${ALGO_PADDING} key-name-hint = \"dev\"; - sign-images = \"fdt\", \"loadables\"${FIRMWARE_SIGN}${STANDALONE_SIGN}; + sign-images = ${FIRMWARE_SIGN}${LOADABLES_SIGN}${FDT_SIGN}${STANDALONE_SIGN}; }; }; }; diff --git a/u-boot/arch/arm/mach-rockchip/hotkey.c b/u-boot/arch/arm/mach-rockchip/hotkey.c index 37a03df..446547c 100644 --- a/u-boot/arch/arm/mach-rockchip/hotkey.c +++ b/u-boot/arch/arm/mach-rockchip/hotkey.c @@ -17,10 +17,10 @@ #define CTRL_D 0x04 /* download mde */ #define CTRL_F 0x06 /* fastboot mode */ #define CTRL_I 0x09 /* inicall debug for kernel */ +#define CTRL_L 0x0c /* late shell(cli) on BOOTM_STATE_OS_GO */ #define CTRL_M 0x0d /* memory(sysmem/bidram) */ #define CTRL_P 0x10 /* parameter(cmdline) dump */ #define CTRL_R 0x12 /* regulator initial state dump */ -#define CTRL_S 0x13 /* shell(cli) on BOOTM_STATE_OS_GO */ #define CTRL_T 0x14 /* print fdt */ bool is_hotkey(enum hotkey_t id) @@ -75,7 +75,7 @@ cli_loop(); break; case HK_CLI_OS_GO: - if (gd->console_evt == CTRL_S) + if (gd->console_evt == CTRL_L) cli_loop(); break; default: diff --git a/u-boot/arch/arm/mach-rockchip/kernel_dtb.c b/u-boot/arch/arm/mach-rockchip/kernel_dtb.c old mode 100755 new mode 100644 index 74da167..05e734f --- a/u-boot/arch/arm/mach-rockchip/kernel_dtb.c +++ b/u-boot/arch/arm/mach-rockchip/kernel_dtb.c @@ -16,503 +16,6 @@ DECLARE_GLOBAL_DATA_PTR; - -#if 1 -struct display_fixup_data { - int type; - - int delay_prepare; - int delay_enable; - int delay_disable; - int delay_unprepare; - int delay_reset; - int delay_init; - int size_width; - int size_height; - - int clock_frequency; - int hactive; - int hfront_porch; - int hsync_len; - int hback_porch; - int vactive; - int vfront_porch; - int vsync_len; - int vback_porch; - int hsync_active; - int vsync_active; - int de_active; - int pixelclk_active; - - /* for DSI Panel */ - int flags; - int format; - int lanes; - int init_cmd_length; - u8 *init_cmd; - - int nodka_lvds; -}; -enum { - PANEL_TYPE_DSI, - PANEL_TYPE_EDP, - PANEL_TYPE_LVDS, -}; - -#define CUSTOM_PARTITION_NAME "baseparameter" -#define LCD_PARAM_MAX_COUNT 27 - -int lcdParam[LCD_PARAM_MAX_COUNT]; -char param_buf_temp[4*1024] = {0}; - -void set_lcdparam_test_edp(struct display_fixup_data *data) -{ - - data->type = PANEL_TYPE_DSI; - data->delay_prepare = 100; - data->delay_enable = 100; - data->delay_disable = 100; - data->delay_unprepare = 100; - data->delay_reset = 100; - data->delay_init = 100; - data->size_width = 240; - data->size_height = 300; - data->clock_frequency = 60000000; - data->hactive = 1024; - data->hfront_porch = 12; - data->hsync_len = 16; - data->hback_porch = 48; - data->vactive = 600; - data->vfront_porch = 8; - data->vsync_len = 4; - data->vback_porch = 8; - data->hsync_active = 0; - data->vsync_active = 0; - data->de_active = 0; - data->pixelclk_active = 0; - data->flags = 0; - data->format = 0; - data->lanes = 4; - *(data->init_cmd + 0) = 0x05; - *(data->init_cmd + 1) = 0x00; - *(data->init_cmd + 2) = 0x01; - *(data->init_cmd + 3) = 0x01; - - *(data->init_cmd + 4) = 0x05; - *(data->init_cmd + 5) = 0x00; - *(data->init_cmd + 6) = 0x01; - *(data->init_cmd + 7) = 0x02; - - *(data->init_cmd + 8) = 0x05; - *(data->init_cmd + 9) = 0x00; - *(data->init_cmd + 10) = 0x01; - *(data->init_cmd + 11) = 0x03; - - *(data->init_cmd + 12) = 0x05; - *(data->init_cmd + 13) = 0x00; - *(data->init_cmd + 14) = 0x01; - *(data->init_cmd + 15) = 0x05; - -} - -int get_lcdparam_info_from_custom_partition(struct display_fixup_data *data) -{ - - struct blk_desc *dev_desc; - disk_partition_t part_info; - char *boot_partname = CUSTOM_PARTITION_NAME; - int ret,i; - - dev_desc = rockchip_get_bootdev(); - if (!dev_desc) { - printf("%s: dev_desc is NULL!\n", __func__); - return -ENODEV; - } - - ret = part_get_info_by_name(dev_desc, boot_partname, &part_info); - if (ret < 0) { - printf("%s: failed to get %s part, ret=%d\n", - __func__, boot_partname, ret); - /* RKIMG can support part table without 'boot' */ - return -1; - } - - printf("block num: %lu, name %s ,type %s,block size :%lu\n",part_info.size,part_info.name,part_info.type,part_info.blksz); - - ret = blk_dread(dev_desc, part_info.start + 512, 1, param_buf_temp); - if (ret != 1) { - printf("%s: failed to read screen parameter, ret=%d\n", - __func__, ret); - return -1; - } - - for (i = 0; i < LCD_PARAM_MAX_COUNT; i++) { - lcdParam[i] = param_buf_temp[i * 4]; - lcdParam[i] = (lcdParam[i] << 8) + param_buf_temp[i * 4 + 1]; - lcdParam[i] = (lcdParam[i] << 8) + param_buf_temp[i * 4 + 2]; - lcdParam[i] = (lcdParam[i] << 8) + param_buf_temp[i * 4 + 3]; - if(lcdParam[i] < 0){ - lcdParam[i] = -lcdParam[i]; - } - if(lcdParam[i] > 100000 && i != 9){ - lcdParam[i] = 0; - } - printf("--get-- lcd_param %d\n",lcdParam[i]); - } - - if(lcdParam[14] == 0 || lcdParam[10] == 0){ - return -1; - } - printf("-get- crc32 = 0X%02X%02X%02X%02X\n", - param_buf_temp[LCD_PARAM_MAX_COUNT * 4], param_buf_temp[LCD_PARAM_MAX_COUNT * 4 + 1], - param_buf_temp[LCD_PARAM_MAX_COUNT * 4 + 2], param_buf_temp[LCD_PARAM_MAX_COUNT * 4 + 3]); - - data->type = lcdParam[0]; - data->delay_prepare = lcdParam[4]; - data->delay_enable = lcdParam[2]; - data->delay_disable = lcdParam[3]; - data->delay_unprepare = lcdParam[1]; - data->delay_reset = lcdParam[5]; - data->delay_init = lcdParam[6]; - data->size_width = lcdParam[7]; - data->size_height = lcdParam[8]; - data->clock_frequency = lcdParam[9]; - data->hactive = lcdParam[10]; - data->hfront_porch = lcdParam[11]; - data->hsync_len = lcdParam[12]; - data->hback_porch = lcdParam[13]; - data->vactive = lcdParam[14]; - data->vfront_porch = lcdParam[15]; - data->vsync_len = lcdParam[16]; - data->vback_porch = lcdParam[17]; - data->hsync_active = lcdParam[18]; - data->vsync_active = lcdParam[19]; - data->de_active = lcdParam[20]; - data->pixelclk_active = lcdParam[21]; - data->flags = lcdParam[22]; - data->format = lcdParam[23]; - data->lanes = lcdParam[24]; - data->init_cmd_length = lcdParam[25] = 16; - data->nodka_lvds = lcdParam[26]; - data->init_cmd = malloc(sizeof(*(data->init_cmd)) * data->init_cmd_length); - for(i = 0; i < data->init_cmd_length; i++){ - *(data->init_cmd + i) = param_buf_temp[100 + i]; - // printf("init cmd = %x\n",param_buf_temp[100 + i]); - - } - -// set_lcdparam_test_edp(data); - - return 0; -} - -#endif - - -static int find_connector_node(const void *blob, int node) -{ - int phandle, remote; - int nodedepth; - - phandle = fdt_getprop_u32_default_node(blob, node, 0, - "remote-endpoint", -1); - remote = fdt_node_offset_by_phandle(blob, phandle); - nodedepth = fdt_node_depth(blob, remote); - - return fdt_supernode_atdepth_offset(blob, remote, - nodedepth - 3, NULL); -} - -static int get_panel_node(const void *blob, int conn_node) -{ - int panel, ports, port, ep, remote, ph, nodedepth; - - panel = fdt_subnode_offset(blob, conn_node, "panel"); - printf("panel_1=%d\n",panel); - if (panel > 0) { - return panel; - } - - ports = fdt_subnode_offset(blob, conn_node, "ports"); - if (ports < 0) - { - return -ENODEV; - } - - fdt_for_each_subnode(port, blob, ports) { - fdt_for_each_subnode(ep, blob, port) { - ph = fdt_getprop_u32_default_node(blob, ep, 0, - "remote-endpoint", 0); - if (!ph) - continue; - - remote = fdt_node_offset_by_phandle(blob, ph); - - nodedepth = fdt_node_depth(blob, remote); - if (nodedepth < 2) - continue; - - panel = fdt_supernode_atdepth_offset(blob, remote, - nodedepth - 2, - NULL); - break; - } - } - printf("panel_2=%d\n",panel); - return panel; -} - -static int fdt_fixup_node_status(void *blob, int node, enum fdt_status status) -{ - int ret; - -// printf("My fixup %s %d\n", fdt_get_name(blob, node, NULL), status); - -set_status: - ret = fdt_set_node_status(blob, node, status, 0); - if (ret == -FDT_ERR_NOSPACE) { - ret = fdt_increase_size(blob, 512); - if (!ret) - goto set_status; - else - goto err_size; - } else if (ret < 0) { - printf("Can't set node status: %s\n", fdt_strerror(ret)); - return ret; - } - - return 0; - -err_size: - printf("Can't increase blob size: %s\n", fdt_strerror(ret)); - return ret; -} -#if 0 -static int fdt_fixup_panel_init_sequence(void *fdt, int node,const struct display_fixup_data *data) -{ - #if 0 - u8 init_buf[] = {0x05, 0x00, 0x01, 0x78, 0x15, 0x01, 0x02, 0x03, 0x04, 0x05, 0x05, 0x01, 0x14,0x39, 0x01, 0x03, 0x02, 0x29, 0x11}; - u8 exit_buf[] = {0x05, 0x64, 0x01, 0x29, 0x05, 0x64, 0x01, 0x11}; - #endif - int ret; - -add_seq: - ret = fdt_setprop(fdt, node, "panel-init-sequence", data->init_cmd, data->init_cmd_length); - if (ret == -FDT_ERR_NOSPACE) { - printf(" init sequence FDT_ERR_NOSPACE\n"); - ret = fdt_increase_size(fdt, data->init_cmd_length * 4);//gln the length needs precision - if (!ret) - goto add_seq; - else - goto err_size; - } else if (ret < 0) { - printf("Can't add property: %s\n", fdt_strerror(ret)); - return ret; - } - -#if 0 -add_init_seq: - ret = fdt_setprop(fdt, node, "panel-init-sequence", init_buf, sizeof(init_buf)); - if (ret == -FDT_ERR_NOSPACE) { - printf(" init sequence FDT_ERR_NOSPACE\n"); - ret = fdt_increase_size(fdt, 512);//gln the length needs precision - if (!ret) - goto add_init_seq; - else - goto err_size; - } else if (ret < 0) { - printf("Can't add property: %s\n", fdt_strerror(ret)); - return ret; - } -add_exit_seq: - ret = fdt_setprop(fdt, node, "panel-exit-sequence", exit_buf, sizeof(exit_buf)); - if (ret == -FDT_ERR_NOSPACE) { - printf(" init sequence FDT_ERR_NOSPACE\n"); - ret = fdt_increase_size(fdt, 512);//gln the length needs precision - if (!ret) - goto add_exit_seq; - else - goto err_size; - } else if (ret < 0) { - printf("Can't add property: %s\n", fdt_strerror(ret)); - return ret; - } -#endif - - return 0; - -err_size: - printf("Can't increase blob size: %s\n", fdt_strerror(ret)); - return ret; -} -#endif - -static int fdt_fixup_setprop_u32(void *fdt, int node, const char *name, u32 data) -{ - int ret; - -set_prop: - ret = fdt_setprop_u32(fdt, node, name, data); - if (ret == -FDT_ERR_NOSPACE) { - ret = fdt_increase_size(fdt, 512); - if (!ret) - goto set_prop; - else - goto err_size; - } else if (ret < 0) { - printf("Can't add property: %s\n", fdt_strerror(ret)); - return ret; - } - - return 0; - -err_size: - printf("Can't increase blob size: %s\n", fdt_strerror(ret)); - return ret; -} - -static void fdt_fixup_display_timing(void *blob, int node, - const struct display_fixup_data *data) -{ - fdt_fixup_setprop_u32(blob, node, "clock-frequency", data->clock_frequency); - fdt_fixup_setprop_u32(blob, node, "hactive", data->hactive); - fdt_fixup_setprop_u32(blob, node, "hfront-porch", data->hfront_porch); - fdt_fixup_setprop_u32(blob, node, "hsync-len", data->hsync_len); - fdt_fixup_setprop_u32(blob, node, "hback-porch", data->hback_porch); - fdt_fixup_setprop_u32(blob, node, "vactive", data->vactive); - fdt_fixup_setprop_u32(blob, node, "vfront-porch", data->vfront_porch); - fdt_fixup_setprop_u32(blob, node, "vsync-len", data->vsync_len); - fdt_fixup_setprop_u32(blob, node, "vback-porch", data->vback_porch); - fdt_fixup_setprop_u32(blob, node, "hsync-active", data->hsync_active); - fdt_fixup_setprop_u32(blob, node, "vsync-active", data->vsync_active); - fdt_fixup_setprop_u32(blob, node, "de-active", data->de_active); - fdt_fixup_setprop_u32(blob, node, "pixelclk-active", data->pixelclk_active); -} - -static void fdt_fixup_panel_node(void *blob, int node, const char *name, - const struct display_fixup_data *data) -{ -/* - if (!strcmp(name, "dsi")) { - fdt_setprop_u32(blob, node, "dsi,flags", data->flags); - fdt_setprop_u32(blob, node, "dsi,format", data->format); - fdt_setprop_u32(blob, node, "dsi,lanes", data->lanes); - fdt_fixup_panel_init_sequence(blob, node,data); - } -*/ - fdt_fixup_setprop_u32(blob, node, "prepare-delay-ms", data->delay_prepare); - fdt_fixup_setprop_u32(blob, node, "enable-delay-ms", data->delay_enable); - fdt_fixup_setprop_u32(blob, node, "disable-delay-ms", data->delay_disable); - fdt_fixup_setprop_u32(blob, node, "unprepare-delay-ms", data->delay_unprepare); - fdt_fixup_setprop_u32(blob, node, "reset-delay-ms", data->delay_reset); - fdt_fixup_setprop_u32(blob, node, "init-delay-ms", data->delay_init); - fdt_fixup_setprop_u32(blob, node, "width-mm", data->size_width); - fdt_fixup_setprop_u32(blob, node, "height-mm", data->size_height); - -} -static void fdt_fixup_nodka_lvds(void *blob, int node, - const struct display_fixup_data *data) -{ - if ( data->nodka_lvds != 0 ) - fdt_fixup_setprop_u32(blob, node, "nodka-lvds", data->nodka_lvds); -} - - -static int fdt_fixup_display_sub_route(void *blob, const char *name, - enum fdt_status status, - const struct display_fixup_data *data) -{ - int route, phandle, connect, connector, panel, dt, timing, route_lvds; - char path[64]; - char path_lvds[16] = "/panel"; - int ret; - sprintf(path, "/display-subsystem/route/route-%s", name); - - - route = fdt_path_offset(blob, path); - printf("route : %d \n",route); - if (route < 0) - return route; - - route_lvds = fdt_path_offset(blob, path_lvds); - if (route_lvds < 0) - { - printf("can not get route_lvds = %d\n",route_lvds); - return route_lvds; - } - /* fixup lvds gpio channel*/ - fdt_fixup_nodka_lvds(blob, route_lvds, data); - - /* fixup route status */ - ret = fdt_fixup_node_status(blob, route, status); - if (ret < 0) - return ret; - phandle = fdt_getprop_u32_default_node(blob, route, 0, "connect", -1); - if (phandle < 0) - return phandle; - connect = fdt_node_offset_by_phandle(blob, phandle); - if (connect < 0) - return connect; - connector = find_connector_node(blob, connect); - if (connector < 0) - return connector; - /* fixup connector status */ - ret = fdt_fixup_node_status(blob, connector, status); - if (ret < 0) - return ret; - if (status != FDT_STATUS_OKAY) { - return 0; - } - panel = get_panel_node(blob, connector); - if (panel < 0) - return panel; - /* fixup panel info */ - fdt_fixup_panel_node(blob, panel, name, data); - dt = fdt_subnode_offset(blob, panel, "display-timings"); - if (dt < 0) { - return dt; - } - timing = fdt_subnode_offset(blob, dt, "timing"); - if (timing < 0) { - phandle = fdt_getprop_u32_default_node(blob, dt, 0, "native-mode", -1); - if (phandle < 0) - return phandle; - - timing = fdt_node_offset_by_phandle(blob, phandle); - if (timing < 0) - return timing; - } - - /* fixup panel display timing */ - fdt_fixup_display_timing(blob, timing, data); - return 0; -} - -static void fdt_fixup_display_route(void *blob, const struct display_fixup_data *data) -{ - if (data->type == PANEL_TYPE_DSI) { - fdt_fixup_display_sub_route(blob, "dsi1", FDT_STATUS_OKAY, data); - fdt_fixup_display_sub_route(blob, "edp", FDT_STATUS_DISABLED, data); - fdt_fixup_display_sub_route(blob, "lvds", FDT_STATUS_DISABLED, data); - } else if (data->type == PANEL_TYPE_EDP) { - fdt_fixup_display_sub_route(blob, "dsi1", FDT_STATUS_DISABLED, data); - fdt_fixup_display_sub_route(blob, "edp", FDT_STATUS_OKAY, data); - fdt_fixup_display_sub_route(blob, "lvds", FDT_STATUS_DISABLED, data); - } else if (data->type == PANEL_TYPE_LVDS) { - fdt_fixup_display_sub_route(blob, "lvds", FDT_STATUS_OKAY, data); - fdt_fixup_display_sub_route(blob, "dsi1", FDT_STATUS_DISABLED, data); - fdt_fixup_display_sub_route(blob, "edp", FDT_STATUS_DISABLED, data); - } -} - - - - - - - - - #ifdef CONFIG_USING_KERNEL_DTB_V2 static int dm_rm_kernel_dev(void) { @@ -798,7 +301,6 @@ #endif ulong fdt_addr = 0; int ret = -ENODEV; - struct display_fixup_data fix_data; printf("DM: v%d\n", IS_ENABLED(CONFIG_USING_KERNEL_DTB_V2) ? 2 : 1); @@ -815,12 +317,10 @@ return -ENODEV; } - if (IS_ENABLED(CONFIG_EMBED_KERNEL_DTB_ALWAYS)) { - resource_init_list(); - printf("Always embed kernel dtb\n"); - goto dtb_embed; - } - +#ifdef CONFIG_EMBED_KERNEL_DTB_ALWAYS + printf("Always embed kernel dtb\n"); + goto dtb_embed; +#endif ret = rockchip_read_dtb_file((void *)fdt_addr); if (!ret) { if (!dtb_check_ok((void *)fdt_addr, (void *)gd->fdt_blob)) { @@ -831,7 +331,10 @@ } } +#ifdef CONFIG_EMBED_KERNEL_DTB +#ifdef CONFIG_EMBED_KERNEL_DTB_ALWAYS dtb_embed: +#endif if (gd->fdt_blob_kern) { if (!dtb_check_ok((void *)gd->fdt_blob_kern, (void *)gd->fdt_blob)) { printf("Embedded kernel dtb mismatch this platform!\n"); @@ -850,7 +353,9 @@ memcpy((void *)fdt_addr, gd->fdt_blob_kern, fdt_totalsize(gd->fdt_blob_kern)); printf("DTB: %s\n", CONFIG_EMBED_KERNEL_DTB_PATH); - } else { + } else +#endif + { printf("Failed to get kernel dtb, ret=%d\n", ret); return -ENOENT; } @@ -870,8 +375,6 @@ phandles_fixup_cru((void *)gd->fdt_blob); phandles_fixup_gpio((void *)gd->fdt_blob, (void *)ufdt_blob); #endif - if (!get_lcdparam_info_from_custom_partition(&fix_data)) - fdt_fixup_display_route((void *)fdt_addr, &fix_data); gd->flags |= GD_FLG_KDTB_READY; gd->of_root_f = gd->of_root; diff --git a/u-boot/arch/arm/mach-rockchip/make_fit_uboot.sh b/u-boot/arch/arm/mach-rockchip/make_fit_uboot.sh deleted file mode 100755 index f7ca5e2..0000000 --- a/u-boot/arch/arm/mach-rockchip/make_fit_uboot.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2022 Rockchip Electronics Co., Ltd -# -# SPDX-License-Identifier: GPL-2.0+ -# - -source ./${srctree}/arch/arm/mach-rockchip/fit_nodes.sh -gen_header -gen_uboot_node -gen_mcu_node -gen_kfdt_node -gen_fdt_node -gen_loadable_node -gen_arm_configurations - diff --git a/u-boot/arch/arm/mach-rockchip/pstore.c b/u-boot/arch/arm/mach-rockchip/pstore.c index 6fc371f..18e452c 100644 --- a/u-boot/arch/arm/mach-rockchip/pstore.c +++ b/u-boot/arch/arm/mach-rockchip/pstore.c @@ -103,6 +103,8 @@ gd->pstore_addr = t->u.pstore.buf[LOG_UBOOT].addr; gd->pstore_size = t->u.pstore.buf[LOG_UBOOT].size - sizeof(struct persistent_ram_buffer); } +#elif (CONFIG_PERSISTENT_RAM_ADDR == 0 || CONFIG_PERSISTENT_RAM_SIZE == 0) + #error: CONFIG_PERSISTENT_RAM_SIZE and CONFIG_PERSISTENT_RAM_ADDR value should not be 0. #else gd->pstore_addr = CONFIG_PERSISTENT_RAM_ADDR; gd->pstore_size = CONFIG_PERSISTENT_RAM_SIZE - sizeof(struct persistent_ram_buffer); diff --git a/u-boot/arch/arm/mach-rockchip/resource_hwid.c b/u-boot/arch/arm/mach-rockchip/resource_hwid.c index 200160b..81e9b20 100644 --- a/u-boot/arch/arm/mach-rockchip/resource_hwid.c +++ b/u-boot/arch/arm/mach-rockchip/resource_hwid.c @@ -267,13 +267,8 @@ hwid_init_data(); - if (list_empty(&entrys_head)) { - if (resource_init_list()) - return NULL; - } - - list_for_each(node, &entrys_dtbs_head) { - file = list_entry(node, struct resource_file, dtbs); + list_for_each(node, &entry_head) { + file = list_entry(node, struct resource_file, link); if (!strstr(file->name, DTB_SUFFIX)) continue; diff --git a/u-boot/arch/arm/mach-rockchip/resource_img.c b/u-boot/arch/arm/mach-rockchip/resource_img.c index 03557d7..c2f0989 100644 --- a/u-boot/arch/arm/mach-rockchip/resource_img.c +++ b/u-boot/arch/arm/mach-rockchip/resource_img.c @@ -4,28 +4,21 @@ * SPDX-License-Identifier: GPL-2.0+ */ #include <common.h> -#include <adc.h> -#include <android_ab.h> -#include <android_bootloader.h> -#include <android_image.h> #include <boot_rkimg.h> #include <bmp_layout.h> #include <malloc.h> -#include <asm/io.h> #include <asm/unaligned.h> -#include <dm/ofnode.h> +#include <linux/libfdt.h> #include <linux/list.h> -#include <asm/arch/fit.h> -#include <asm/arch/uimage.h> #include <asm/arch/resource_img.h> +#include <asm/arch/uimage.h> +#include <asm/arch/fit.h> DECLARE_GLOBAL_DATA_PTR; #define PART_RESOURCE "resource" #define RESOURCE_MAGIC "RSCE" #define RESOURCE_MAGIC_SIZE 4 -#define RESOURCE_VERSION 0 -#define CONTENT_VERSION 0 #define ENTRY_TAG "ENTR" #define ENTRY_TAG_SIZE 4 #define MAX_FILE_NAME_LEN 220 @@ -70,7 +63,7 @@ */ /** - * struct resource_image_header + * struct resource_img_hdr * * @magic: should be "RSCE" * @version: resource image version, current is 0 @@ -80,7 +73,6 @@ * @e_blks: the size(by block) of the entry in the contents * @e_num: numbers of the entrys. */ - struct resource_img_hdr { char magic[4]; uint16_t version; @@ -96,499 +88,406 @@ char name[MAX_FILE_NAME_LEN]; char hash[MAX_HASH_LEN]; uint32_t hash_size; - uint32_t f_offset; /* Sector offset */ - uint32_t f_size; /* Bytes */ + uint32_t blk_offset; + uint32_t size; /* in byte */ }; -LIST_HEAD(entrys_head); -LIST_HEAD(entrys_dtbs_head); +LIST_HEAD(entry_head); -__weak int board_resource_dtb_accepted(char *dtb_name) +static int resource_check_header(struct resource_img_hdr *hdr) { - return 1; + return memcmp(RESOURCE_MAGIC, hdr->magic, RESOURCE_MAGIC_SIZE); } -int resource_image_check_header(void *rsce_hdr) +static void resource_dump(struct resource_file *f) { - struct resource_img_hdr *hdr = rsce_hdr; - int ret; - - ret = memcmp(RESOURCE_MAGIC, hdr->magic, RESOURCE_MAGIC_SIZE); - if (ret) { - debug("bad resource image magic: %s\n", - hdr->magic ? hdr->magic : "none"); - ret = -EINVAL; - } - - debug("resource image header:\n"); - debug("magic:%s\n", hdr->magic); - debug("version:%d\n", hdr->version); - debug("c_version:%d\n", hdr->c_version); - debug("blks:%d\n", hdr->blks); - debug("c_offset:%d\n", hdr->c_offset); - debug("e_blks:%d\n", hdr->e_blks); - debug("e_num:%d\n", hdr->e_nums); - - return ret; + printf("%s\n", f->name); + printf(" blk_start: 0x%08lx\n", (ulong)f->blk_start); + printf(" blk_offset: 0x%08lx\n", (ulong)f->blk_offset); + printf(" size: 0x%08x\n", f->size); + printf(" in_ram: %d\n", f->in_ram); + printf(" hash_size: %d\n\n", f->hash_size); } -static int add_file_to_list(struct resource_entry *entry, int rsce_base, bool ram) +static int resource_add_file(const char *name, u32 size, + u32 blk_start, u32 blk_offset, + char *hash, u32 hash_size, + bool in_ram) { - struct resource_file *file; - - if (memcmp(entry->tag, ENTRY_TAG, ENTRY_TAG_SIZE)) { - debug("invalid entry tag\n"); - return -ENOENT; - } - - file = malloc(sizeof(*file)); - if (!file) { - debug("out of memory\n"); - return -ENOMEM; - } - - strcpy(file->name, entry->name); - file->rsce_base = rsce_base; - file->f_offset = entry->f_offset; - file->f_size = entry->f_size; - file->hash_size = entry->hash_size; - file->ram = ram; - memcpy(file->hash, entry->hash, entry->hash_size); - INIT_LIST_HEAD(&file->dtbs); - list_add_tail(&file->link, &entrys_head); - if (strstr(file->name, DTB_SUFFIX) && board_resource_dtb_accepted(file->name)) - list_add_tail(&file->dtbs, &entrys_dtbs_head); - debug("ENTRY: addr: %p, name: %18s, base: 0x%08x, offset: 0x%08x, size: 0x%08x\n", - entry, file->name, file->rsce_base, file->f_offset, file->f_size); - - return 0; -} - -int resource_replace_entry(const char *f_name, uint32_t base, - uint32_t f_offset, uint32_t f_size) -{ - struct resource_entry *entry; - struct resource_file *file; + struct resource_file *f; struct list_head *node; + bool _new = true; - if (!f_name || !f_size) - return -EINVAL; - - entry = calloc(1, sizeof(*entry)); - if (!entry) - return -ENOMEM; - - strcpy(entry->tag, ENTRY_TAG); - strcpy(entry->name, f_name); - entry->f_offset = f_offset; - entry->f_size = f_size; - entry->hash_size = 0; - - /* Delete exist entry, then add this new */ - list_for_each(node, &entrys_head) { - file = list_entry(node, struct resource_file, link); - if (!strcmp(file->name, entry->name)) { - list_del(&file->link); - list_del(&file->dtbs); - free(file); + /* old one ? */ + list_for_each(node, &entry_head) { + f = list_entry(node, struct resource_file, link); + if (!strcmp(f->name, name)) { + _new = false; break; } } - add_file_to_list(entry, base, false); - free(entry); + if (_new) { + f = calloc(1, sizeof(*f)); + if (!f) + return -ENOMEM; + + list_add_tail(&f->link, &entry_head); + } + + strcpy(f->name, name); + f->size = size; + f->in_ram = in_ram; + f->blk_start = blk_start; + f->blk_offset = blk_offset; + f->hash_size = hash_size; + memcpy(f->hash, hash, hash_size); +#ifdef DEBUG + resource_dump(f); +#endif + return 0; +} + +static int resource_setup_list(struct blk_desc *desc, ulong blk_start, + void *resc_hdr, bool in_ram) +{ + struct resource_img_hdr *hdr = resc_hdr; + struct resource_entry *et; + u32 i, stride; + void *pos; + + pos = (void *)hdr + hdr->c_offset * desc->blksz; + stride = hdr->e_blks * desc->blksz; + + for (i = 0; i < hdr->e_nums; i++) { + et = pos + (i * stride); + if (memcmp(et->tag, ENTRY_TAG, ENTRY_TAG_SIZE)) + continue; + + resource_add_file(et->name, et->size, + blk_start, et->blk_offset, + et->hash, et->hash_size, in_ram); + } return 0; } -int resource_create_ram_list(struct blk_desc *dev_desc, void *rsce_hdr) +int resource_setup_ram_list(struct blk_desc *desc, void *hdr) { - struct resource_img_hdr *hdr = rsce_hdr; - struct resource_entry *entry; - int e_num, size; - void *data; - int ret = 0; + if (!desc) + return -ENODEV; - if (resource_image_check_header(hdr)) { - ret = -EINVAL; - goto out; + if (resource_check_header(hdr)) { + printf("RESC: invalid\n"); + return -EINVAL; } - list_del_init(&entrys_head); - list_del_init(&entrys_dtbs_head); - data = (void *)((ulong)hdr + hdr->c_offset * dev_desc->blksz); - for (e_num = 0; e_num < hdr->e_nums; e_num++) { - size = e_num * hdr->e_blks * dev_desc->blksz; - entry = (struct resource_entry *)(data + size); - add_file_to_list(entry, (ulong)hdr, true); + /* @blk_start: set as 'hdr' point addr, to be used in byte */ + return resource_setup_list(desc, (ulong)hdr, hdr, true); +} + +#ifdef CONFIG_ANDROID_BOOT_IMAGE +/* + * Add logo.bmp and logo_kernel.bmp from "logo" parititon + * + * Provide a "logo" partition for user to store logo.bmp and + * logo_kernel.bmp, so that the user can update them from + * kernel or user-space dynamically. + * + * "logo" partition layout, do not change order: + * + * |----------------------| 0x00 + * | raw logo.bmp | + * |----------------------| -> 512-byte aligned + * | raw logo_kernel.bmp | + * |----------------------| + * + * N: the sector count of logo.bmp + * + * How to generate: + * cat logo.bmp > logo.img && truncate -s %512 logo.img && cat logo_kernel.bmp >> logo.img + */ +static int resource_setup_logo_bmp(struct blk_desc *desc) +{ + struct bmp_header *header; + const char *name[] = { "logo.bmp", "logo_kernel.bmp" }; + disk_partition_t part; + u32 blk_offset = 0; + u32 filesz; + int ret, i; + + if (part_get_info_by_name(desc, PART_LOGO, &part) < 0) + return 0; + + header = memalign(ARCH_DMA_MINALIGN, desc->blksz); + if (!header) + return -ENOMEM; + + for (i = 0; i < ARRAY_SIZE(name); i++) { + if (blk_dread(desc, part.start + blk_offset, 1, header) != 1) { + ret = -EIO; + break; + } + + if (header->signature[0] != 'B' || header->signature[1] != 'M') { + ret = -EINVAL; + break; + } + + filesz = get_unaligned_le32(&header->file_size); + ret = resource_add_file(name[i], filesz, part.start, blk_offset, + NULL, 0, false); + if (ret) + break; + + /* move to next file */ + blk_offset += DIV_ROUND_UP(filesz, desc->blksz); + + printf("LOGO: %s\n", name[i]); + } -out: - resource_read_logo_bmps(); + + free(header); return ret; } -static int resource_create_list(struct blk_desc *dev_desc, int rsce_base) +static int resource_setup_blk_list(struct blk_desc *desc, ulong blk_start) { struct resource_img_hdr *hdr; - struct resource_entry *entry; - int blknum, e_num; - void *data = NULL; + int blk_cnt; int ret = 0; - int size; + void *buf; - hdr = memalign(ARCH_DMA_MINALIGN, dev_desc->blksz); + hdr = memalign(ARCH_DMA_MINALIGN, desc->blksz); if (!hdr) return -ENOMEM; - if (blk_dread(dev_desc, rsce_base, 1, hdr) != 1) { - printf("Failed to read resource hdr\n"); + if (blk_dread(desc, blk_start, 1, hdr) != 1) { ret = -EIO; - goto err; + goto out; } - if (resource_image_check_header(hdr)) { + if (resource_check_header(hdr)) { + printf("RESC: invalid\n"); if (fdt_check_header(hdr)) { - printf("No valid resource or dtb file\n"); ret = -EINVAL; - goto err; + goto out; } else { - free(hdr); - return resource_replace_entry(DEFAULT_DTB_FILE, rsce_base, - 0, fdt_totalsize(hdr)); + /* this is a dtb file */ + printf("RESC: this is dtb\n"); + ret = resource_add_file(DEFAULT_DTB_FILE, + fdt_totalsize(hdr), + blk_start, 0, NULL, 0, false); + goto out; } } - blknum = hdr->e_blks * hdr->e_nums; - data = memalign(ARCH_DMA_MINALIGN, blknum * dev_desc->blksz); - if (!data) { + blk_cnt = hdr->e_blks * hdr->e_nums; + hdr = realloc(hdr, (1 + blk_cnt) * desc->blksz); + if (!hdr) { ret = -ENOMEM; - goto err; + goto out; } - if (blk_dread(dev_desc, rsce_base + hdr->c_offset, - blknum, data) != blknum) { - printf("Failed to read resource entries\n"); + buf = (void *)hdr + desc->blksz; + if (blk_dread(desc, blk_start + hdr->c_offset, blk_cnt, buf) != blk_cnt) { ret = -EIO; - goto err; + goto out; } - /* - * Add all file into resource file list, and load what we want from - * storage when we really need it. - */ - for (e_num = 0; e_num < hdr->e_nums; e_num++) { - size = e_num * hdr->e_blks * dev_desc->blksz; - entry = (struct resource_entry *)(data + size); - add_file_to_list(entry, rsce_base, false); - } - -err: - if (data) - free(data); - if (hdr) - free(hdr); - - resource_read_logo_bmps(); + resource_setup_list(desc, blk_start, hdr, false); + resource_setup_logo_bmp(desc); +out: + free(hdr); return ret; } -static int read_dtb_from_android(struct blk_desc *dev_desc, - struct andr_img_hdr *hdr, - ulong rsce_base) +static int resource_init(struct blk_desc *desc, + disk_partition_t *part, + ulong blk_offset) { - ulong dtb_offset = 0; - ulong dtb_size = 0; + printf("RESC: '%s', blk@0x%08lx\n", part->name, part->start + blk_offset); - if (!hdr || hdr->header_version <= 1) { - return 0; - } else if (hdr->header_version == 2) { - dtb_offset += hdr->page_size; - dtb_offset += ALIGN(hdr->kernel_size, hdr->page_size); - dtb_offset += ALIGN(hdr->ramdisk_size, hdr->page_size); - dtb_offset += ALIGN(hdr->recovery_dtbo_size, hdr->page_size) + - ALIGN(hdr->second_size, hdr->page_size); - dtb_size = hdr->dtb_size; - } else if (hdr->header_version >= 3) { - ulong vendor_boot_hdr_size = (hdr->header_version == 3) ? - VENDOR_BOOT_HDRv3_SIZE : VENDOR_BOOT_HDRv4_SIZE; +#ifdef CONFIG_ANDROID_AVB + char hdr[512]; + ulong resc_buf = 0; + int ret; - dtb_offset += ALIGN(vendor_boot_hdr_size, - hdr->vendor_page_size) + - ALIGN(hdr->vendor_ramdisk_size, - hdr->vendor_page_size); - dtb_size = hdr->dtb_size; + if (blk_dread(desc, part->start, 1, hdr) != 1) + return -EIO; + + /* only handle android boot/recovery.img and resource.img, ignore fit */ + if (!android_image_check_header((void *)hdr) || + !resource_check_header((void *)hdr)) { + ret = android_image_verify_resource((const char *)part->name, &resc_buf); + if (ret) { + printf("RESC: '%s', avb verify fail: %d\n", part->name, ret); + return ret; + } + + /* + * unlock=0: resc_buf is valid and file was already full load in ram. + * unlock=1: resc_buf is 0. + */ + if (resc_buf && !resource_check_header((void *)resc_buf)) + return resource_setup_ram_list(desc, (void *)resc_buf); } +#endif - if (!dtb_size) - return 0; + return resource_setup_blk_list(desc, part->start + blk_offset); +} - /* - * boot_img_hdr_v234 feature. - * - * If dtb position is present, replace the old with new one if - * we don't need to verify DTB hash from resource.img file entry. - */ - dtb_offset = DIV_ROUND_UP(dtb_offset, dev_desc->blksz); - env_update("bootargs", "androidboot.dtb_idx=0"); +static int resource_default(struct blk_desc *desc, + disk_partition_t *out_part, + ulong *out_blk_offset) +{ + disk_partition_t part; + + if (part_get_info_by_name(desc, PART_RESOURCE, &part) < 0) + return -ENODEV; + + *out_part = part; + *out_blk_offset = 0; return 0; } +#endif -static int get_resource_base_sector(struct blk_desc *dev_desc, - struct andr_img_hdr **ret_hdr) +static int resource_scan(void) { + struct blk_desc *desc = rockchip_get_bootdev(); + __maybe_unused int ret; + + if (!desc) { + printf("RESC: No bootdev\n"); + return -ENODEV; + } + + if (!list_empty(&entry_head)) + return 0; + +#ifdef CONFIG_ROCKCHIP_FIT_IMAGE + ret = fit_image_init_resource(desc); + if (!ret || ret != -EAGAIN) + return ret; +#endif +#ifdef CONFIG_ROCKCHIP_UIMAGE + ret = uimage_init_resource(desc); + if (!ret || ret != -EAGAIN) + return ret; +#endif +#ifdef CONFIG_ANDROID_BOOT_IMAGE disk_partition_t part; - int rsce_base = 0; -#ifdef CONFIG_ANDROID_BOOT_IMAGE - struct andr_img_hdr *hdr; - u32 os_ver = 0, os_lvl; - const char *part_boot = PART_BOOT; + ulong blk_offset; + char hdr[512]; + char name[32]; - /* - * Anyway, we must read android hdr firstly from boot/recovery partition - * to get the 'os_version' for android_bcb_msg_sector_offset(), in order - * to confirm BCB message offset of *MISC* partition. - */ -#ifdef CONFIG_ANDROID_AB - part_boot = ab_can_find_recovery_part() ? PART_RECOVERY : PART_BOOT; -#endif + /* partition priority: boot/recovery > resource */ + if (!android_image_init_resource(desc, &part, &blk_offset)) { + if (blk_dread(desc, part.start + blk_offset, 1, hdr) != 1) + return -EIO; - if (part_get_info_by_name(dev_desc, part_boot, &part) < 0) - goto resource_part; + if (resource_check_header((void *)hdr)) { + strcpy(name, (char *)part.name); + if (resource_default(desc, &part, &blk_offset)) + return -ENOENT; - hdr = populate_andr_img_hdr(dev_desc, &part); - if (hdr) { - os_ver = hdr->os_version >> 11; - os_lvl = hdr->os_version & ((1U << 11) - 1); - if (os_ver) - gd->bd->bi_andr_version = hdr->os_version; - } - -#ifndef CONFIG_ANDROID_AB - /* Get boot mode from misc and read if recovery mode */ - if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY) { - if (hdr) - free(hdr); - - if (part_get_info_by_name(dev_desc, PART_RECOVERY, &part) < 0) - goto resource_part; - - hdr = populate_andr_img_hdr(dev_desc, &part); - if (!hdr) - goto resource_part; - } -#endif - /* If Android v012, getting resource from second position ! */ - if (hdr) { - if (os_ver) - printf("Android %u.%u, Build %u.%u, v%d\n", - (os_ver >> 14) & 0x7F, (os_ver >> 7) & 0x7F, - (os_lvl >> 4) + 2000, os_lvl & 0x0F, - hdr->header_version); - *ret_hdr = hdr; - if (hdr->header_version < 3) { - rsce_base = part.start * dev_desc->blksz; - rsce_base += hdr->page_size; - rsce_base += ALIGN(hdr->kernel_size, hdr->page_size); - rsce_base += ALIGN(hdr->ramdisk_size, hdr->page_size); - rsce_base = DIV_ROUND_UP(rsce_base, dev_desc->blksz); - goto finish; + printf("RESC: '%s' -> '%s'\n", name, part.name); } - } -resource_part: -#endif - /* resource partition */ - if (part_get_info_by_name(dev_desc, PART_RESOURCE, &part) < 0) { - printf("No resource partition\n"); - return -ENODEV; } else { - rsce_base = part.start; + if (resource_default(desc, &part, &blk_offset)) + return -ENOENT; } -#ifdef CONFIG_ANDROID_BOOT_IMAGE -finish: + + /* now, 'part' can be boot/recovery/resource */ + return resource_init(desc, &part, blk_offset); #endif - printf("Found DTB in %s part\n", part.name); - - return rsce_base; + return -ENOENT; } -/* - * There are: logo/battery pictures and dtb file in the resource image by default. - * - * This function does: - * - * 1. Get resource image base sector from: boot/recovery(AOSP) > resource(RK) - * 2. Create resource files list(addition: add logo bmps) - * 3. Add dtb from android v2 dtb pos, override the old one from resource file - */ -int resource_init_list(void) +static struct resource_file *resource_get_file(const char *name) { - struct andr_img_hdr *hdr = NULL; - struct blk_desc *dev_desc; - int rsce_base; - - dev_desc = rockchip_get_bootdev(); - if (!dev_desc) { - printf("No dev_desc!\n"); - return -ENODEV; - } - - rsce_base = get_resource_base_sector(dev_desc, &hdr); - if (rsce_base > 0) { - if (resource_create_list(dev_desc, rsce_base)) - printf("Failed to create resource list\n"); - } - - /* override the resource dtb with android dtb if need */ - return read_dtb_from_android(dev_desc, hdr, rsce_base); -} - -int resource_is_empty(void) -{ - return list_empty(&entrys_head); -} - -static struct resource_file *get_file_info(const char *name) -{ - struct resource_file *file; + struct resource_file *f; struct list_head *node; - if (list_empty(&entrys_head)) { - if (resource_init_list()) - return NULL; - } + if (resource_scan()) + return NULL; - list_for_each(node, &entrys_head) { - file = list_entry(node, struct resource_file, link); - if (!strcmp(file->name, name)) - return file; + list_for_each(node, &entry_head) { + f = list_entry(node, struct resource_file, link); + if (!strcmp(f->name, name)) + return f; } return NULL; } -/* - * read file from resource partition - * @buf: destination buf to store file data; - * @name: file name - * @offset: blocks offset in the file, 1 block = 512 bytes - * @len: the size(by bytes) of file to read. - */ -int rockchip_read_resource_file(void *buf, const char *name, int offset, int len) +int rockchip_read_resource_file(void *buf, const char *name, int blk_offset, int len) { - struct resource_file *file; - struct blk_desc *dev_desc; - int ret = 0; - int blks; - ulong src; + struct blk_desc *desc = rockchip_get_bootdev(); + struct resource_file *f; + int blk_cnt; + ulong pos; - file = get_file_info(name); - if (!file) { - printf("No file: %s\n", name); + if (!desc) + return -ENODEV; + + f = resource_get_file(name); + if (!f) { + printf("No resource file: %s\n", name); return -ENOENT; } - dev_desc = rockchip_get_bootdev(); - if (!dev_desc) { - printf("No dev_desc!\n"); - return -ENODEV; - } + if (len <= 0 || len > f->size) + len = f->size; - if (len <= 0 || len > file->f_size) - len = file->f_size; - - if (file->ram) { - src = file->rsce_base + - (file->f_offset + offset) * dev_desc->blksz; - memcpy(buf, (char *)src, len); - ret = len; + if (f->in_ram) { + pos = f->blk_start + (f->blk_offset + blk_offset) * desc->blksz; + memcpy(buf, (char *)pos, len); } else { - blks = DIV_ROUND_UP(len, dev_desc->blksz); - ret = blk_dread(dev_desc, - file->rsce_base + file->f_offset + offset, - blks, buf); - ret = (ret != blks) ? -EIO : len; + blk_cnt = DIV_ROUND_UP(len, desc->blksz); + if (blk_dread(desc, + f->blk_start + f->blk_offset + blk_offset, + blk_cnt, buf) != blk_cnt) + len = -EIO; } - return ret; + return len; } -static struct resource_file *get_default_dtb(void) -{ - struct resource_file *target_file = NULL; - struct resource_file *file; - struct list_head *node; - int num = 0; - - if (list_empty(&entrys_head)) { - if (resource_init_list()) - return NULL; - } - - list_for_each(node, &entrys_dtbs_head) { - num++; - file = list_entry(node, struct resource_file, dtbs); - if (strcmp(file->name, DEFAULT_DTB_FILE)) - target_file = file; - } - - /* - * two possible case: - * case 1. rk-kernel.dtb only - * case 2. targe_file(s) + rk-kernel.dtb(maybe they are the same), - * use (last)target_file as result one. - */ - if (num > 2) - printf("Error: find duplicate(%d) dtbs\n", num); - - return target_file ? : get_file_info(DEFAULT_DTB_FILE); -} +extern struct resource_file *resource_read_hwid_dtb(void); int rockchip_read_resource_dtb(void *fdt_addr, char **hash, int *hash_size) { - struct resource_file *file = NULL; + struct resource_file *f = NULL; int ret; #ifdef CONFIG_ROCKCHIP_HWID_DTB - file = resource_read_hwid_dtb(); -#endif - /* If no dtb matches hardware id(GPIO/ADC), use the default */ - if (!file) - file = get_default_dtb(); + if (resource_scan()) + return -ENOENT; - if (!file) + f = resource_read_hwid_dtb(); +#endif + /* If no dtb match hardware id(GPIO/ADC), use the default */ + if (!f) + f = resource_get_file(DEFAULT_DTB_FILE); + + if (!f) return -ENODEV; - ret = rockchip_read_resource_file(fdt_addr, file->name, 0, 0); + ret = rockchip_read_resource_file(fdt_addr, f->name, 0, 0); if (ret < 0) return ret; if (fdt_check_header(fdt_addr)) return -EBADF; - *hash = file->hash; - *hash_size = file->hash_size; - printf("DTB: %s\n", file->name); + *hash = f->hash; + *hash_size = f->hash_size; - return 0; -} - -int resource_traverse_init_list(void) -{ - if (!resource_is_empty()) - return 0; - -#ifdef CONFIG_ROCKCHIP_FIT_IMAGE - if (!fit_image_init_resource()) - return 0; -#endif -#ifdef CONFIG_ROCKCHIP_UIMAGE - if (!uimage_init_resource()) - return 0; -#endif - /* Android image is default supported within resource core */ + printf("DTB: %s\n", f->name); return 0; } @@ -596,30 +495,20 @@ static int do_dump_resource(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { - struct resource_file *file; + struct resource_file *f; struct list_head *node; - printf("Resources:\n"); - list_for_each(node, &entrys_head) { - file = list_entry(node, struct resource_file, link); - printf(" %s: 0x%08x(sector), 0x%08x(bytes)\n", - file->name, file->rsce_base + file->f_offset, file->f_size); + list_for_each(node, &entry_head) { + f = list_entry(node, struct resource_file, link); + resource_dump(f); } -#ifdef CONFIG_ROCKCHIP_HWID_DTB - printf("DTBs:\n"); - list_for_each(node, &entrys_dtbs_head) { - file = list_entry(node, struct resource_file, dtbs); - printf(" %s: 0x%08x(sector),0x%08x(bytes)\n", - file->name, file->rsce_base + file->f_offset, file->f_size); - } -#endif return 0; } U_BOOT_CMD( dump_resource, 1, 1, do_dump_resource, - "dump resource list", + "dump resource files", "" ); diff --git a/u-boot/arch/arm/mach-rockchip/resource_logo.c b/u-boot/arch/arm/mach-rockchip/resource_logo.c deleted file mode 100644 index 7d40ddf..0000000 --- a/u-boot/arch/arm/mach-rockchip/resource_logo.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * (C) Copyright 2021 Rockchip Electronics Co., Ltd - * - * SPDX-License-Identifier: GPL-2.0+ - */ -#include <common.h> -#include <adc.h> -#include <boot_rkimg.h> -#include <bmp_layout.h> -#include <malloc.h> -#include <asm/io.h> -#include <asm/unaligned.h> -#include <asm/arch/resource_img.h> -#include <dm/ofnode.h> - -static int read_bmp(struct blk_desc *dev_desc, const char *name, - disk_partition_t *part, uint32_t offset, - uint32_t *size) -{ - struct bmp_header *header; - u32 blk_offset; - u32 filesz; - int ret; - - blk_offset = DIV_ROUND_UP(offset, dev_desc->blksz); - header = memalign(ARCH_DMA_MINALIGN, dev_desc->blksz); - if (!header) { - ret = -ENOMEM; - goto out; - } - - if (blk_dread(dev_desc, part->start + blk_offset, 1, header) != 1) { - ret = -EIO; - goto out; - } - - if (header->signature[0] != 'B' || header->signature[1] != 'M') { - ret = -EINVAL; - goto out; - } - - filesz = get_unaligned_le32(&header->file_size); - ret = resource_replace_entry(name, part->start, blk_offset, filesz); - if (!ret) { - printf("LOGO: %s\n", name); - if (size) - *size = filesz; - } -out: - free(header); - - return ret; -} - -/* - * Add logo.bmp and logo_kernel.bmp from "logo" parititon - * - * Provide a "logo" partition for user to store logo.bmp and - * logo_kernel.bmp, so that the user can update them from - * kernel or user-space dynamically. - * - * "logo" partition layout, do not change order: - * - * |----------------------| 0x00 - * | raw logo.bmp | - * |----------------------| N*512-byte aligned - * | raw logo_kernel.bmp | - * |----------------------| - * - * N: the sector count of logo.bmp - * - * How to generate: - * cat logo.bmp > logo.img && truncate -s %512 logo.img && cat logo_kernel.bmp >> logo.img - */ -int resource_read_logo_bmps(void) -{ - struct blk_desc *dev_desc; - disk_partition_t part; - u32 filesz; - - dev_desc = rockchip_get_bootdev(); - if (!dev_desc) { - printf("No dev_desc!\n"); - return -ENODEV; - } - - if (part_get_info_by_name(dev_desc, PART_LOGO, &part) < 0) - return -ENODEV; - - if (!read_bmp(dev_desc, "logo.bmp", &part, 0, &filesz)) - read_bmp(dev_desc, "logo_kernel.bmp", &part, filesz, NULL); - - return 0; -} - diff --git a/u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c b/u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c index 965afde..ea14298 100644 --- a/u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c +++ b/u-boot/arch/arm/mach-rockchip/rk3036/syscon_rk3036.c @@ -18,4 +18,7 @@ .name = "rk3036_syscon", .id = UCLASS_SYSCON, .of_match = rk3036_syscon_ids, +#if !CONFIG_IS_ENABLED(OF_PLATDATA) + .bind = dm_scan_fdt_dev, +#endif }; diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/Kconfig b/u-boot/arch/arm/mach-rockchip/rk3528/Kconfig new file mode 100644 index 0000000..d1ab9f2 --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3528/Kconfig @@ -0,0 +1,17 @@ +if ROCKCHIP_RK3528 + +config TARGET_EVB_RK3528 + bool "EVB_RK3528" + select BOARD_LATE_INIT + help + RK3528 EVB is a evaluation board for Rockchp RK3528. + +config SYS_SOC + default "rockchip" + +config SYS_MALLOC_F_LEN + default 0x400 + +source board/rockchip/evb_rk3528/Kconfig + +endif diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/Makefile b/u-boot/arch/arm/mach-rockchip/rk3528/Makefile new file mode 100644 index 0000000..81f6939 --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3528/Makefile @@ -0,0 +1,11 @@ +# +# (C) Copyright 2020 Rockchip Electronics Co., Ltd +# +# SPDX-License-Identifier: GPL-2.0+ +# + +ifneq ($(CONFIG_TPL_BUILD)$(CONFIG_TPL_TINY_FRAMEWORK),yy) +obj-y += syscon_rk3528.o +endif +obj-y += rk3528.o +obj-y += clk_rk3528.o diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/clk_rk3528.c b/u-boot/arch/arm/mach-rockchip/rk3528/clk_rk3528.c new file mode 100644 index 0000000..639bf73 --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3528/clk_rk3528.c @@ -0,0 +1,41 @@ +/* + * (C) Copyright 2020 Rockchip Electronics Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <syscon.h> +#include <asm/arch/clock.h> +#include <asm/arch/cru_rk3528.h> + +int rockchip_get_clk(struct udevice **devp) +{ + return uclass_get_device_by_driver(UCLASS_CLK, + DM_GET_DRIVER(rockchip_rk3528_cru), devp); +} + +#if CONFIG_IS_ENABLED(CLK_SCMI) +int rockchip_get_scmi_clk(struct udevice **devp) +{ + return uclass_get_device_by_driver(UCLASS_CLK, + DM_GET_DRIVER(scmi_clock), devp); +} +#endif + +void *rockchip_get_cru(void) +{ + struct rk3528_clk_priv *priv; + struct udevice *dev; + int ret; + + ret = rockchip_get_clk(&dev); + if (ret) + return ERR_PTR(ret); + + priv = dev_get_priv(dev); + + return priv->cru; +} + diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c b/u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c new file mode 100644 index 0000000..3aae2e8 --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3528/rk3528.c @@ -0,0 +1,494 @@ +/* + * Copyright (c) 2020 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include <common.h> +#include <dm.h> +#include <asm/io.h> +#include <asm/arch/cpu.h> +#include <asm/arch/hardware.h> +#include <asm/arch/grf_rk3528.h> +#include <asm/arch/ioc_rk3528.h> + +DECLARE_GLOBAL_DATA_PTR; + +#define FIREWALL_DDR_BASE 0xff2e0000 +#define FW_DDR_MST1_REG 0x44 +#define FW_DDR_MST6_REG 0x58 +#define FW_DDR_MST7_REG 0x5c +#define FW_DDR_MST11_REG 0x6c +#define FW_DDR_MST14_REG 0x78 +#define FW_DDR_MST16_REG 0x80 +#define FW_DDR_MST_REG 0xf0 + +#define VENC_GRF_BASE 0xff320000 +#define VENC_GRF_CON1 0x4 + +#define VPU_GRF_BASE 0xff340000 +#define VPU_GRF_CON4 0x14 + +#define PMU_SGRF_BASE 0xff440000 +#define PMU_SGRF_SOC_CON4 0x10 +#define PMU_SGRF_SOC_CON5 0x14 +#define PMU_SGRF_SOC_CON6 0x18 +#define PMU_SGRF_SOC_CON8 0x20 +#define PMU_SGRF_SOC_CON11 0x2c + +#define PMU_CRU_BASE 0xff4b0000 +#define PMU_CRU_GATE_CON00 0x800 +#define PMU_CRU_SOFTRST_CON00 0xa00 + +#define GPIO1C_IOMUX_SEL_H 0x034 +#define GPIO1D_IOMUX_SEL_L 0x038 +#define GPIO1D_IOMUX_SEL_H 0x03c + +#define CPU_PRIORITY_REG 0xff210008 +#define QOS_PRIORITY_LEVEL(h, l) ((((h) & 7) << 8) | ((l) & 7)) + +#ifdef CONFIG_ARM64 +#include <asm/armv8/mmu.h> + +static struct mm_region rk3528_mem_map[] = { + { + .virt = 0x0UL, + .phys = 0x0UL, + .size = 0xfc000000UL, + .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | + PTE_BLOCK_INNER_SHARE + }, { + .virt = 0xfc000000UL, + .phys = 0xfc000000UL, + .size = 0x04000000UL, + .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | + PTE_BLOCK_NON_SHARE | + PTE_BLOCK_PXN | PTE_BLOCK_UXN + }, { + /* List terminator */ + 0, + } +}; + +struct mm_region *mem_map = rk3528_mem_map; +#endif + +#define GPIO0_IOC_BASE 0xFF540000 +#define GPIO1_IOC_BASE 0xFF560000 +#define GPIO2_IOC_BASE 0xFF570000 +#define GPIO3_IOC_BASE 0xFF560000 +#define GPIO4_IOC_BASE 0xFF550000 + +#define GPIO1_IOC_GPIO1D_IOMUX_SEL_L (GPIO1_IOC_BASE + 0x38) +#define GPIO1_IOC_GPIO1C_DS_2 (GPIO1_IOC_BASE + 0x148) +#define GPIO1_IOC_GPIO1C_DS_3 (GPIO1_IOC_BASE + 0x14C) +#define GPIO1_IOC_GPIO1D_DS_0 (GPIO1_IOC_BASE + 0x150) +#define GPIO1_IOC_GPIO1D_DS_1 (GPIO1_IOC_BASE + 0x154) +#define GPIO1_IOC_GPIO1D_DS_2 (GPIO1_IOC_BASE + 0x158) + +/* uart0 iomux */ +/* gpio4c7 */ +#define UART0_RX_M0 1 +#define UART0_RX_M0_OFFSET 12 +#define UART0_RX_M0_ADDR (GPIO4_IOC_BASE + 0x94) +/* gpio4d0 */ +#define UART0_TX_M0 1 +#define UART0_TX_M0_OFFSET 0 +#define UART0_TX_M0_ADDR (GPIO4_IOC_BASE + 0x98) + +/* gpio2a0 */ +#define UART0_RX_M1 2 +#define UART0_RX_M1_OFFSET 0 +#define UART0_RX_M1_ADDR (GPIO2_IOC_BASE + 0x40) +/* gpio2a1 */ +#define UART0_TX_M1 2 +#define UART0_TX_M1_OFFSET 4 +#define UART0_TX_M1_ADDR (GPIO2_IOC_BASE + 0x40) + +/* uart1 iomux */ +/* gpio4a7 */ +#define UART1_RX_M0 2 +#define UART1_RX_M0_OFFSET 12 +#define UART1_RX_M0_ADDR (GPIO1_IOC_BASE + 0x84) +/* gpio4a6 */ +#define UART1_TX_M0 2 +#define UART1_TX_M0_OFFSET 8 +#define UART1_TX_M0_ADDR (GPIO1_IOC_BASE + 0x84) + +/* gpio4c6 */ +#define UART1_RX_M1 2 +#define UART1_RX_M1_OFFSET 8 +#define UART1_RX_M1_ADDR (GPIO4_IOC_BASE + 0x94) +/* gpio4c5 */ +#define UART1_TX_M1 2 +#define UART1_TX_M1_OFFSET 4 +#define UART1_TX_M1_ADDR (GPIO4_IOC_BASE + 0x94) + +/* uart2 iomux */ +/* gpio3a0 */ +#define UART2_RX_M0 1 +#define UART2_RX_M0_OFFSET 0 +#define UART2_RX_M0_ADDR (GPIO3_IOC_BASE + 0x60) +/* gpio3a1 */ +#define UART2_TX_M0 1 +#define UART2_TX_M0_OFFSET 4 +#define UART2_TX_M0_ADDR (GPIO3_IOC_BASE + 0x60) + +/* gpio1b0 */ +#define UART2_RX_M1 1 +#define UART2_RX_M1_OFFSET 0 +#define UART2_RX_M1_ADDR (GPIO1_IOC_BASE + 0x28) +/* gpio1b1 */ +#define UART2_TX_M1 1 +#define UART2_TX_M1_OFFSET 4 +#define UART2_TX_M1_ADDR (GPIO1_IOC_BASE + 0x28) + +/* uart3 iomux */ +/* gpio4b0 */ +#define UART3_RX_M0 2 +#define UART3_RX_M0_OFFSET 0 +#define UART3_RX_M0_ADDR (GPIO4_IOC_BASE + 0x88) +/* gpio4b1 */ +#define UART3_TX_M0 2 +#define UART3_TX_M0_OFFSET 4 +#define UART3_TX_M0_ADDR (GPIO4_IOC_BASE + 0x88) + +/* gpio4b7 */ +#define UART3_RX_M1 3 +#define UART3_RX_M1_OFFSET 12 +#define UART3_RX_M1_ADDR (GPIO4_IOC_BASE + 0x8C) +/* gpio4c0 */ +#define UART3_TX_M1 3 +#define UART3_TX_M1_OFFSET 0 +#define UART3_TX_M1_ADDR (GPIO4_IOC_BASE + 0x90) + +/* uart4 iomux */ +/* gpio2a2 */ +#define UART4_RX_M0 3 +#define UART4_RX_M0_OFFSET 8 +#define UART4_RX_M0_ADDR (GPIO2_IOC_BASE + 0x40) +/* gpio2a3 */ +#define UART4_TX_M0 3 +#define UART4_TX_M0_OFFSET 12 +#define UART4_TX_M0_ADDR (GPIO2_IOC_BASE + 0x40) + +/* uart5 iomux */ +/* gpio1a2 */ +#define UART5_RX_M0 2 +#define UART5_RX_M0_OFFSET 8 +#define UART5_RX_M0_ADDR (GPIO1_IOC_BASE + 0x20) +/* gpio1a3 */ +#define UART5_TX_M0 2 +#define UART5_TX_M0_OFFSET 12 +#define UART5_TX_M0_ADDR (GPIO1_IOC_BASE + 0x20) + +/* gpio1d4 */ +#define UART5_RX_M1 2 +#define UART5_RX_M1_OFFSET 0 +#define UART5_RX_M1_ADDR (GPIO1_IOC_BASE + 0x3c) +/* gpio1d7 */ +#define UART5_TX_M1 2 +#define UART5_TX_M1_OFFSET 12 +#define UART5_TX_M1_ADDR (GPIO1_IOC_BASE + 0x3c) + +/* uart6 iomux */ +/* gpio3a7 */ +#define UART6_RX_M0 4 +#define UART6_RX_M0_OFFSET 12 +#define UART6_RX_M0_ADDR (GPIO3_IOC_BASE + 0x64) +/* gpio3a6 */ +#define UART6_TX_M0 4 +#define UART6_TX_M0_OFFSET 8 +#define UART6_TX_M0_ADDR (GPIO3_IOC_BASE + 0x64) + +/* gpio3c3 */ +#define UART6_RX_M1 4 +#define UART6_RX_M1_OFFSET 12 +#define UART6_RX_M1_ADDR (GPIO3_IOC_BASE + 0x70) +/* gpio3c1 */ +#define UART6_TX_M1 4 +#define UART6_TX_M1_OFFSET 4 +#define UART6_TX_M1_ADDR (GPIO3_IOC_BASE + 0x70) + +/* uart7 iomux */ +/* gpio3b3 */ +#define UART7_RX_M0 4 +#define UART7_RX_M0_OFFSET 12 +#define UART7_RX_M0_ADDR (GPIO3_IOC_BASE + 0x68) +/* gpio3b2 */ +#define UART7_TX_M0 4 +#define UART7_TX_M0_OFFSET 8 +#define UART7_TX_M0_ADDR (GPIO3_IOC_BASE + 0x68) + +/* gpio1b3 */ +#define UART7_RX_M1 4 +#define UART7_RX_M1_OFFSET 12 +#define UART7_RX_M1_ADDR (GPIO1_IOC_BASE + 0x28) +/* gpio1b2 */ +#define UART7_TX_M1 4 +#define UART7_TX_M1_OFFSET 8 +#define UART7_TX_M1_ADDR (GPIO1_IOC_BASE + 0x28) + + +#define set_uart_iomux(bits_offset, bits_val, addr) \ + writel(GENMASK(bits_offset + 19, bits_offset + 16) | (bits_val << bits_offset) , addr) + +#define set_uart_iomux_rx(ID, MODE) \ + set_uart_iomux(UART##ID##_RX_M##MODE##_OFFSET, UART##ID##_RX_M##MODE, UART##ID##_RX_M##MODE##_ADDR); +#define set_uart_iomux_tx(ID, MODE) \ + set_uart_iomux(UART##ID##_TX_M##MODE##_OFFSET, UART##ID##_TX_M##MODE, UART##ID##_TX_M##MODE##_ADDR); + +void board_debug_uart_init(void) +{ +/* UART 0 */ +#if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff9f0000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART0_M0 Switch iomux */ + set_uart_iomux_rx(0, 0); + set_uart_iomux_tx(0, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART0_M1 Switch iomux */ + set_uart_iomux_rx(0, 1); + set_uart_iomux_tx(0, 1); +#endif +/* UART 1 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff9f8000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART1_M0 Switch iomux */ + set_uart_iomux_rx(1, 0); + set_uart_iomux_tx(1, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART1_M1 Switch iomux */ + set_uart_iomux_rx(1, 1); + set_uart_iomux_tx(1, 1); +#endif +/* UART 2 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa00000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART2_M0 Switch iomux */ + set_uart_iomux_rx(2, 0); + set_uart_iomux_tx(2, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART2_M1 Switch iomux */ + set_uart_iomux_rx(2, 1); + set_uart_iomux_tx(2, 1); +#endif +/* UART 3 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa08000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART3_M0 Switch iomux */ + set_uart_iomux_rx(3, 0); + set_uart_iomux_tx(3, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART3_M1 Switch iomux */ + set_uart_iomux_rx(3, 1); + set_uart_iomux_tx(3, 1); +#endif +/* UART 4 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa10000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART4_M0 Switch iomux */ + set_uart_iomux_rx(4, 0); + set_uart_iomux_tx(4, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART4_M1 Switch iomux */ + set_uart_iomux_rx(4, 1); + set_uart_iomux_tx(4, 1); +#endif +/* UART 5 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa18000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART5_M0 Switch iomux */ + set_uart_iomux_rx(5, 0); + set_uart_iomux_tx(5, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART5_M1 Switch iomux */ + set_uart_iomux_rx(5, 1); + set_uart_iomux_tx(5, 1); +#endif +/* UART 6 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa20000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART6_M0 Switch iomux */ + set_uart_iomux_rx(6, 0); + set_uart_iomux_tx(6, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART6_M1 Switch iomux */ + set_uart_iomux_rx(6, 1); + set_uart_iomux_tx(6, 1); +#endif +/* UART 7 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xffa28000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART7_M0 Switch iomux */ + set_uart_iomux_rx(7, 0); + set_uart_iomux_tx(7, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART7_M1 Switch iomux */ + set_uart_iomux_rx(7, 1); + set_uart_iomux_tx(7, 1); +#endif +#endif +} + +#ifdef CONFIG_SPL_BUILD +void rockchip_stimer_init(void) +{ + /* If Timer already enabled, don't re-init it */ + u32 reg = readl(CONFIG_ROCKCHIP_STIMER_BASE + 0x4); + + if (reg & 0x1) + return; + + asm volatile("msr CNTFRQ_EL0, %0" : : "r" (COUNTER_FREQUENCY)); + writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 0x14); + writel(0xffffffff, CONFIG_ROCKCHIP_STIMER_BASE + 0x18); + dsb(); + writel(0x1, CONFIG_ROCKCHIP_STIMER_BASE + 0x4); +} +#endif + +int arch_cpu_init(void) +{ +#if defined(CONFIG_SPL_BUILD) + u32 val; + + /* + * Select clk_tx source as default for i2s2/i2s3 + * Set I2Sx_MCLK as input default + * + * It's safe to set mclk as input default to avoid high freq glitch + * which may make devices work unexpected. And then enabled by + * kernel stage or any state where user use it. + */ + writel(0x00020002, VPU_GRF_BASE + VPU_GRF_CON4); + writel(0x40004000, VENC_GRF_BASE + VENC_GRF_CON1); + + /* Set the emmc to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST6_REG); + writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST6_REG); + + /* Set the sdmmc to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST14_REG); + writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST14_REG); + + /* Set the crypto to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST1_REG); + writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST1_REG); + +#if defined(CONFIG_ROCKCHIP_SFC) + /* Set the fspi to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST7_REG); + writel(val & 0xffff0000, FIREWALL_DDR_BASE + FW_DDR_MST7_REG); +#endif + +#ifndef CONFIG_TPL_BUILD + /* Set cpu qos priority, then + * Peri > VOP > CPU = RKVDEC/RKVENC/VPU > GPU/RGA/Other + */ + writel(QOS_PRIORITY_LEVEL(2, 2), CPU_PRIORITY_REG); +#endif + + if (readl(GPIO1_IOC_GPIO1D_IOMUX_SEL_L) == 0x1111) { + /* + * set the emmc io drive strength: + * data and cmd: level 3 + * clock: level 5 + */ + writel(0x3F3F0F0F, GPIO1_IOC_GPIO1C_DS_2); + writel(0x3F3F0F0F, GPIO1_IOC_GPIO1C_DS_3); + writel(0x3F3F0F0F, GPIO1_IOC_GPIO1D_DS_0); + writel(0x3F3F0F0F, GPIO1_IOC_GPIO1D_DS_1); + writel(0x3F3F3F0F, GPIO1_IOC_GPIO1D_DS_2); + } + +#elif defined(CONFIG_SUPPORT_USBPLUG) + u32 val; + + /* Set the usb to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST16_REG); + writel(val & 0xffff0000, FIREWALL_DDR_BASE + FW_DDR_MST16_REG); + + /* Set the emmc to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST6_REG); + writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST6_REG); + + /* Set emmc iomux */ + writel(0xffff1111, GPIO1_IOC_BASE + GPIO1C_IOMUX_SEL_H); + writel(0xffff1111, GPIO1_IOC_BASE + GPIO1D_IOMUX_SEL_L); + writel(0xffff1111, GPIO1_IOC_BASE + GPIO1D_IOMUX_SEL_H); + +#if defined(CONFIG_ROCKCHIP_SFC) + /* Set the fspi to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST7_REG); + writel(val & 0xFFFF0000uL, FIREWALL_DDR_BASE + FW_DDR_MST7_REG); + + /* Set fspi iomux */ + writel(0xffff2222, GPIO1_IOC_BASE + GPIO1C_IOMUX_SEL_H); + writel(0x000f0002, GPIO1_IOC_BASE + GPIO1D_IOMUX_SEL_L); + writel(0x00f00020, GPIO1_IOC_BASE + GPIO1D_IOMUX_SEL_H); +#endif + +#endif + return 0; +} + +#ifdef CONFIG_SPL_BUILD +int spl_fit_standalone_release(char *id, uintptr_t entry_point) +{ + u32 val; + + /* open clk_pmu_mcu_jtag / clk_mcu_32k_en / fclk_mcu_en */ + writel(0x05800000, PMU_CRU_BASE + PMU_CRU_GATE_CON00); + /* set the mcu to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST11_REG); + writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST11_REG); + /* writel(0x00000000, FIREWALL_DDR_BASE + FW_DDR_MST_REG); */ + /* set the mcu to secure */ + writel(0x00200000, PMU_SGRF_BASE + PMU_SGRF_SOC_CON4); + /* open mcu_debug_en / mcu_dclk_en / mcu_hclk_en / mcu_sclk_en */ + writel(0x000f000f, PMU_SGRF_BASE + PMU_SGRF_SOC_CON5); + /* set start addr, mcu_code_addr_start */ + writel(0xffff0000 | (entry_point >> 16), PMU_SGRF_BASE + PMU_SGRF_SOC_CON6); + /* mcu_tcm_addr_start, multiplex pmu sram address */ + writel(0xffffff10, PMU_SGRF_BASE + PMU_SGRF_SOC_CON11); + /* jtag_mcu_m0 gpio2a4/gpio2a5 iomux */ + /* writel(0x00ff0022, GPIO2_IOC_BASE + 0x44); */ + /* release the mcu */ + writel(0x00800000, PMU_CRU_BASE + PMU_CRU_SOFTRST_CON00); + + return 0; +} +#endif + diff --git a/u-boot/arch/arm/mach-rockchip/rk3528/syscon_rk3528.c b/u-boot/arch/arm/mach-rockchip/rk3528/syscon_rk3528.c new file mode 100644 index 0000000..d8d40ee --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3528/syscon_rk3528.c @@ -0,0 +1,24 @@ +/* + * (C) Copyright 2020 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <syscon.h> +#include <asm/arch/clock.h> + +static const struct udevice_id rk3528_syscon_ids[] = { + { .compatible = "rockchip,rk3528-grf", .data = ROCKCHIP_SYSCON_GRF }, + { } +}; + +U_BOOT_DRIVER(syscon_rk3528) = { + .name = "rk3528_syscon", + .id = UCLASS_SYSCON, + .of_match = rk3528_syscon_ids, +#if !CONFIG_IS_ENABLED(OF_PLATDATA) + .bind = dm_scan_fdt_dev, +#endif +}; diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/Kconfig b/u-boot/arch/arm/mach-rockchip/rk3562/Kconfig new file mode 100644 index 0000000..9ee97e8 --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3562/Kconfig @@ -0,0 +1,17 @@ +if ROCKCHIP_RK3562 + +config TARGET_EVB_RK3562 + bool "EVB_RK3562" + select BOARD_LATE_INIT + help + RK3562 EVB is a evaluation board for Rockchp RK3562. + +config SYS_SOC + default "rockchip" + +config SYS_MALLOC_F_LEN + default 0x400 + +source board/rockchip/evb_rk3562/Kconfig + +endif diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/Makefile b/u-boot/arch/arm/mach-rockchip/rk3562/Makefile new file mode 100644 index 0000000..e643f8c --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3562/Makefile @@ -0,0 +1,11 @@ +# +# (C) Copyright 2022 Rockchip Electronics Co., Ltd +# +# SPDX-License-Identifier: GPL-2.0+ +# + +ifneq ($(CONFIG_TPL_BUILD)$(CONFIG_TPL_TINY_FRAMEWORK),yy) +obj-y += syscon_rk3562.o +endif +obj-y += rk3562.o +obj-y += clk_rk3562.o diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/clk_rk3562.c b/u-boot/arch/arm/mach-rockchip/rk3562/clk_rk3562.c new file mode 100644 index 0000000..ff059b7 --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3562/clk_rk3562.c @@ -0,0 +1,41 @@ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <syscon.h> +#include <asm/arch/clock.h> +#include <asm/arch/cru_rk3562.h> + +int rockchip_get_clk(struct udevice **devp) +{ + return uclass_get_device_by_driver(UCLASS_CLK, + DM_GET_DRIVER(rockchip_rk3562_cru), devp); +} + +#if CONFIG_IS_ENABLED(CLK_SCMI) +int rockchip_get_scmi_clk(struct udevice **devp) +{ + return uclass_get_device_by_driver(UCLASS_CLK, + DM_GET_DRIVER(scmi_clock), devp); +} +#endif + +void *rockchip_get_cru(void) +{ + struct rk3562_clk_priv *priv; + struct udevice *dev; + int ret; + + ret = rockchip_get_clk(&dev); + if (ret) + return ERR_PTR(ret); + + priv = dev_get_priv(dev); + + return priv->cru; +} + diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c b/u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c new file mode 100644 index 0000000..e417dee --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3562/rk3562.c @@ -0,0 +1,661 @@ +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include <common.h> +#include <clk.h> +#include <dm.h> +#include <asm/io.h> +#include <asm/arch/cpu.h> +#include <asm/arch/hardware.h> +#include <asm/arch/grf_rk3562.h> +#include <asm/arch/ioc_rk3562.h> +#include <asm/arch/rk_atags.h> +#include <linux/libfdt.h> +#include <fdt_support.h> +#include <asm/arch/clock.h> +#include <dt-bindings/clock/rk3562-cru.h> +#include <asm/arch-rockchip/rockchip_smccc.h> + +DECLARE_GLOBAL_DATA_PTR; + +#define FIREWALL_DDR_BASE 0xfef00000 +#define FW_DDR_MST3_REG 0x2c /* usb */ +#define FW_DDR_MST4_REG 0x30 /* emmc */ +#define FW_DDR_MST5_REG 0x34 /* fspi */ +#define FW_DDR_MST6_REG 0x38 /* sdmmc mcu */ +#define FW_DDR_CON_REG 0x80 + +#define PMU_GRF_BASE 0xff010000 +#define PMU_GRF_SOC_CON9 0x0124 + +#define SYS_GRF_BASE 0xff030000 +#define SYS_GRF_SOC_CON5 0x0414 +#define SYS_GRF_SOC_CON6 0x0418 + +#define PERI_GRF_BASE 0xff040000 +#define PERI_GRF_AUDIO_CON 0x0070 + +#define PIPEPHY_GRF_BASE 0xff098000 +#define PIPEPHY_PIPE_CON5 0x0014 + +#define TOP_CRU_BASE 0xff100000 +#define TOP_CRU_GATE_CON23 0x035c +#define TOP_CRU_SOFTRST_CON23 0x045c +#define TOP_CRU_CM0_GATEMASK 0x0680 + +#define PMU0_CRU_BASE 0xff110000 + +#define PMU1_CRU_BASE 0xff118000 +#define PMU1_CRU_GATE_CON02 0x0188 +#define PMU1_CRU_SOFTRST_CON02 0x0208 +#define PMU1_CRU_CM0_GATEMASK 0x0420 + +#define PMU_BASE_ADDR 0xff258000 +#define PMU2_BIU_IDLE_SFTCON0 0x110 +#define PMU2_BIU_IDLE_ACK_STS0 0x120 +#define PMU2_BIT_IDLE_STS0 0x128 +#define PMU2_PWR_GATE_SFTCON0 0x210 +#define PMU2_PWR_GATE_STS0 0x230 +#define PMU2_MEM_SD_SFTCON0 0x300 +/* PMU2_PWR_GATE_SFTCON0 */ +#define PD_GPU_DWN_SFTENA BIT(0) +#define PD_VI_DWN_SFTENA BIT(5) +#define PD_VO_DWN_SFTENA BIT(6) +/* PMU2_BIU_IDLE_SFTCON0 */ +#define IDLE_REQ_GPU_SFTENA BIT(1) +#define IDLE_REQ_VI_SFTENA BIT(3) +#define IDLE_REQ_VO_SFTENA BIT(4) +/* PMU2_BIU_IDLE_ACK_STS0 */ +#define IDLE_ACK_GPU BIT(1) +#define IDLE_ACK_VI BIT(3) +#define IDLE_ACK_VO BIT(4) +/* PMU2_BIT_IDLE_STS0 */ +#define IDLE_GPU BIT(1) +#define IDLE_VI BIT(3) +#define IDLE_VO BIT(4) + +#define CRYPTO_PRIORITY_REG 0xfeeb0108 +#define DCF_PRIORITY_REG 0xfee10408 +#define DMA2DDR_PRIORITY_REG 0xfee03808 +#define DMAC_PRIORITY_REG 0xfeeb0208 +#define EMMC_PRIORITY_REG 0xfeeb0308 +#define FSPI_PRIORITY_REG 0xfeeb0408 +#define GMAC_PRIORITY_REG 0xfee10208 +#define GPU_PRIORITY_REG 0xfee30008 +#define ISP_PRIORITY_REG 0xfee70008 +#define MAC100_PRIORITY_REG 0xfee10308 +#define MCU_PRIORITY_REG 0xfee10008 +#define PCIE_PRIORITY_REG 0xfeea0008 +#define RKDMA_PRIORITY_REG 0xfeeb0508 +#define SDMMC0_PRIORITY_REG 0xfeeb0608 +#define SDMMC1_PRIORITY_REG 0xfeeb0708 +#define USB2_PRIORITY_REG 0xfeeb0808 +#define USB3_PRIORITY_REG 0xfeea0108 +#define VICAP_PRIORITY_REG 0xfee70108 +#define VOP_PRIORITY_REG 0xfee80008 + +#define QOS_PRIORITY_LEVEL(h, l) ((((h) & 7) << 8) | ((l) & 7)) + +#ifdef CONFIG_ARM64 +#include <asm/armv8/mmu.h> + +static struct mm_region rk3562_mem_map[] = { + { + .virt = 0x0UL, + .phys = 0x0UL, + .size = 0xfc000000UL, + .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | + PTE_BLOCK_INNER_SHARE + }, { + .virt = 0xfc000000UL, + .phys = 0xfc000000UL, + .size = 0x04000000UL, + .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | + PTE_BLOCK_NON_SHARE | + PTE_BLOCK_PXN | PTE_BLOCK_UXN + }, { + /* List terminator */ + 0, + } +}; + +struct mm_region *mem_map = rk3562_mem_map; +#endif + +#define GPIO0_IOC_BASE 0xFF080000 +#define GPIO1_IOC_BASE 0xFF060000 +#define GPIO1A_IOMUX_SEL_L 0x0 +#define GPIO1A_IOMUX_SEL_H 0x4 +#define GPIO1B_IOMUX_SEL_L 0x8 +#define GPIO1_IOC_GPIO1A_DS0 0x200 +#define GPIO1_IOC_GPIO1A_DS1 0x204 +#define GPIO1_IOC_GPIO1B_DS0 0x210 + +#define GPIO2_IOC_BASE 0xFF060000 +#define GPIO2_IOC_IO_VSEL0 0x300 +/* GPIO2_IOC_IO_VSEL0 */ +#define POC_VCCIO2_VD_3V3 BIT(12) + +#define GPIO3_IOC_BASE 0xFF070000 +#define GPIO4_IOC_BASE 0xFF070000 + +/* UART0 iomux */ +/* gpio0d0_sel */ +#define UART0_RX_M0 1 +#define UART0_RX_M0_OFFSET 0 +#define UART0_RX_M0_ADDR (GPIO0_IOC_BASE + 0x18) +/* gpio0d1_sel */ +#define UART0_TX_M0 1 +#define UART0_TX_M0_OFFSET 4 +#define UART0_TX_M0_ADDR (GPIO0_IOC_BASE + 0x18) + +/* gpio1b3_sel */ +#define UART0_RX_M1 2 +#define UART0_RX_M1_OFFSET 12 +#define UART0_RX_M1_ADDR (GPIO1_IOC_BASE + 0x08) +/* gpio1b4_sel */ +#define UART0_TX_M1 2 +#define UART0_TX_M1_OFFSET 0 +#define UART0_TX_M1_ADDR (GPIO1_IOC_BASE + 0x0C) + +/* UART1 iomux */ +/* gpio1d1_sel */ +#define UART1_RX_M0 1 +#define UART1_RX_M0_OFFSET 4 +#define UART1_RX_M0_ADDR (GPIO1_IOC_BASE + 0x18) +/* gpio1d2_sel */ +#define UART1_TX_M0 1 +#define UART1_TX_M0_OFFSET 8 +#define UART1_TX_M0_ADDR (GPIO1_IOC_BASE + 0x18) + +/* gpio4a6_sel */ +#define UART1_RX_M1 4 +#define UART1_RX_M1_OFFSET 8 +#define UART1_RX_M1_ADDR (GPIO4_IOC_BASE + 0x64) +/* gpio4a5_sel */ +#define UART1_TX_M1 4 +#define UART1_TX_M1_OFFSET 4 +#define UART1_TX_M1_ADDR (GPIO4_IOC_BASE + 0x64) + +/* UART2 iomux */ +/* gpio0c1_sel */ +#define UART2_RX_M0 1 +#define UART2_RX_M0_OFFSET 4 +#define UART2_RX_M0_ADDR (GPIO0_IOC_BASE + 0x10) +/* gpio0c0_sel */ +#define UART2_TX_M0 1 +#define UART2_TX_M0_OFFSET 0 +#define UART2_TX_M0_ADDR (GPIO0_IOC_BASE + 0x10) + +/* gpio3a1_sel */ +#define UART2_RX_M1 2 +#define UART2_RX_M1_OFFSET 4 +#define UART2_RX_M1_ADDR (GPIO3_IOC_BASE + 0x40) +/* gpio3a0_sel */ +#define UART2_TX_M1 2 +#define UART2_TX_M1_OFFSET 0 +#define UART2_TX_M1_ADDR (GPIO3_IOC_BASE + 0x40) + +/* UART3 iomux */ +/* gpio4b5_sel */ +#define UART3_RX_M0 7 +#define UART3_RX_M0_OFFSET 4 +#define UART3_RX_M0_ADDR (GPIO4_IOC_BASE + 0x6C) +/* gpio4b4_sel */ +#define UART3_TX_M0 7 +#define UART3_TX_M0_OFFSET 0 +#define UART3_TX_M0_ADDR (GPIO4_IOC_BASE + 0x6C) + +/* gpio3c0_sel */ +#define UART3_RX_M1 3 +#define UART3_RX_M1_OFFSET 0 +#define UART3_RX_M1_ADDR (GPIO3_IOC_BASE + 0x50) +/* gpio3b7_sel */ +#define UART3_TX_M1 3 +#define UART3_TX_M1_OFFSET 12 +#define UART3_TX_M1_ADDR (GPIO3_IOC_BASE + 0x4C) + +/* UART4 iomux */ +/* gpio3d1_sel */ +#define UART4_RX_M0 4 +#define UART4_RX_M0_OFFSET 4 +#define UART4_RX_M0_ADDR (GPIO3_IOC_BASE + 0x58) +/* gpio3d0_sel */ +#define UART4_TX_M0 4 +#define UART4_TX_M0_OFFSET 0 +#define UART4_TX_M0_ADDR (GPIO3_IOC_BASE + 0x58) + +/* gpio1d5_sel */ +#define UART4_RX_M1 3 +#define UART4_RX_M1_OFFSET 4 +#define UART4_RX_M1_ADDR (GPIO1_IOC_BASE + 0x1C) +/* gpio1d6_sel */ +#define UART4_TX_M1 3 +#define UART4_TX_M1_OFFSET 8 +#define UART4_TX_M1_ADDR (GPIO1_IOC_BASE + 0x1C) + +/* UART5 iomux */ +/* gpio1b7_sel */ +#define UART5_RX_M0 3 +#define UART5_RX_M0_OFFSET 12 +#define UART5_RX_M0_ADDR (GPIO1_IOC_BASE + 0xC) +/* gpio1c0_sel */ +#define UART5_TX_M0 3 +#define UART5_TX_M0_OFFSET 0 +#define UART5_TX_M0_ADDR (GPIO1_IOC_BASE + 0x10) + +/* gpio3a7_sel */ +#define UART5_RX_M1 5 +#define UART5_RX_M1_OFFSET 12 +#define UART5_RX_M1_ADDR (GPIO3_IOC_BASE + 0x44) +/* gpio3a6_sel */ +#define UART5_TX_M1 5 +#define UART5_TX_M1_OFFSET 8 +#define UART5_TX_M1_ADDR (GPIO3_IOC_BASE + 0x44) + +/* UART6 iomux */ +/* gpio0c7_sel */ +#define UART6_RX_M0 1 +#define UART6_RX_M0_OFFSET 12 +#define UART6_RX_M0_ADDR (GPIO0_IOC_BASE + 0x14) +/* gpio0c6_sel */ +#define UART6_TX_M0 1 +#define UART6_TX_M0_OFFSET 8 +#define UART6_TX_M0_ADDR (GPIO0_IOC_BASE + 0x14) + +/* gpio4b0_sel */ +#define UART6_RX_M1 6 +#define UART6_RX_M1_OFFSET 0 +#define UART6_RX_M1_ADDR (GPIO4_IOC_BASE + 0x68) +/* gpio4a7_sel */ +#define UART6_TX_M1 6 +#define UART6_TX_M1_OFFSET 12 +#define UART6_TX_M1_ADDR (GPIO4_IOC_BASE + 0x64) + +/* UART7 iomux */ +/* gpio3c7_sel */ +#define UART7_RX_M0 4 +#define UART7_RX_M0_OFFSET 12 +#define UART7_RX_M0_ADDR (GPIO3_IOC_BASE + 0x54) +/* gpio3c4_sel */ +#define UART7_TX_M0 4 +#define UART7_TX_M0_OFFSET 0 +#define UART7_TX_M0_ADDR (GPIO3_IOC_BASE + 0x54) + +/* gpio1b3_sel */ +#define UART7_RX_M1 3 +#define UART7_RX_M1_OFFSET 12 +#define UART7_RX_M1_ADDR (GPIO1_IOC_BASE + 0x08) +/* gpio1b4_sel */ +#define UART7_TX_M1 3 +#define UART7_TX_M1_OFFSET 0 +#define UART7_TX_M1_ADDR (GPIO1_IOC_BASE + 0x0C) + +/* UART8 iomux */ +/* gpio3b3_sel */ +#define UART8_RX_M0 3 +#define UART8_RX_M0_OFFSET 12 +#define UART8_RX_M0_ADDR (GPIO3_IOC_BASE + 0x48) +/* gpio3b2_sel */ +#define UART8_TX_M0 3 +#define UART8_TX_M0_OFFSET 8 +#define UART8_TX_M0_ADDR (GPIO3_IOC_BASE + 0x48) + +/* gpio3d5_sel */ +#define UART8_RX_M1 4 +#define UART8_RX_M1_OFFSET 4 +#define UART8_RX_M1_ADDR (GPIO3_IOC_BASE + 0x5C) +/* gpio3d4_sel */ +#define UART8_TX_M1 4 +#define UART8_TX_M1_OFFSET 0 +#define UART8_TX_M1_ADDR (GPIO3_IOC_BASE + 0x5C) + +/* UART9 iomux */ +/* gpio4b3_sel */ +#define UART9_RX_M0 4 +#define UART9_RX_M0_OFFSET 12 +#define UART9_RX_M0_ADDR (GPIO4_IOC_BASE + 0x68) +/* gpio4b2_sel */ +#define UART9_TX_M0 4 +#define UART9_TX_M0_OFFSET 8 +#define UART9_TX_M0_ADDR (GPIO4_IOC_BASE + 0x68) + +/* gpio3c3_sel */ +#define UART9_RX_M1 3 +#define UART9_RX_M1_OFFSET 12 +#define UART9_RX_M1_ADDR (GPIO3_IOC_BASE + 0x50) +/* gpio3c2_sel */ +#define UART9_TX_M1 3 +#define UART9_TX_M1_OFFSET 8 +#define UART9_TX_M1_ADDR (GPIO3_IOC_BASE + 0x50) + +#define set_uart_iomux(bits_offset, bits_val, addr) \ + writel(GENMASK(bits_offset + 19, bits_offset + 16) | (bits_val << bits_offset) , addr) + +#define set_uart_iomux_rx(ID, MODE) \ + set_uart_iomux(UART##ID##_RX_M##MODE##_OFFSET, UART##ID##_RX_M##MODE, UART##ID##_RX_M##MODE##_ADDR); +#define set_uart_iomux_tx(ID, MODE) \ + set_uart_iomux(UART##ID##_TX_M##MODE##_OFFSET, UART##ID##_TX_M##MODE, UART##ID##_TX_M##MODE##_ADDR); + +void board_debug_uart_init(void) +{ +/* UART 0 */ +#if defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff210000) + +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART0_M0 Switch iomux */ + set_uart_iomux_rx(0, 0); + set_uart_iomux_tx(0, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART0_M1 Switch iomux */ + set_uart_iomux_rx(0, 1); + set_uart_iomux_tx(0, 1); +#endif +/* UART 1 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff670000) + +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART1_M0 Switch iomux */ + set_uart_iomux_rx(1, 0); + set_uart_iomux_tx(1, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART1_M1 Switch iomux */ + set_uart_iomux_rx(1, 1); + set_uart_iomux_tx(1, 1); +#endif +/* UART 2 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff680000) + +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART2_M0 Switch iomux */ + set_uart_iomux_rx(2, 0); + set_uart_iomux_tx(2, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART2_M1 Switch iomux */ + set_uart_iomux_rx(2, 1); + set_uart_iomux_tx(2, 1); +#endif +/* UART 3 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff690000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART3_M0 Switch iomux */ + set_uart_iomux_rx(3, 0); + set_uart_iomux_tx(3, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART3_M1 Switch iomux */ + set_uart_iomux_rx(3, 1); + set_uart_iomux_tx(3, 1); +#endif +/* UART 4 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6a0000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART4_M0 Switch iomux */ + set_uart_iomux_rx(4, 0); + set_uart_iomux_tx(4, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART4_M1 Switch iomux */ + set_uart_iomux_rx(4, 1); + set_uart_iomux_tx(4, 1); +#endif +/* UART 5 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6b0000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART5_M0 Switch iomux */ + set_uart_iomux_rx(5, 0); + set_uart_iomux_tx(5, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART5_M1 Switch iomux */ + set_uart_iomux_rx(5, 1); + set_uart_iomux_tx(5, 1); +#endif +/* UART 6 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6c0000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART6_M0 Switch iomux */ + set_uart_iomux_rx(6, 0); + set_uart_iomux_tx(6, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART6_M1 Switch iomux */ + set_uart_iomux_rx(6, 1); + set_uart_iomux_tx(6, 1); +#endif +/* UART 7 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6d0000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART7_M0 Switch iomux */ + set_uart_iomux_rx(7, 0); + set_uart_iomux_tx(7, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART7_M1 Switch iomux */ + set_uart_iomux_rx(7, 1); + set_uart_iomux_tx(7, 1); +#endif +/* UART 8 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6e0000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART8_M0 Switch iomux */ + set_uart_iomux_rx(8, 0); + set_uart_iomux_tx(8, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART8_M1 Switch iomux */ + set_uart_iomux_rx(8, 1); + set_uart_iomux_tx(8, 1); +#endif +/* UART 9 */ +#elif defined(CONFIG_DEBUG_UART_BASE) && (CONFIG_DEBUG_UART_BASE == 0xff6f0000) +#if defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 0) + + /* UART9_M0 Switch iomux */ + set_uart_iomux_rx(9, 0); + set_uart_iomux_tx(9, 0); +#elif defined(CONFIG_ROCKCHIP_UART_MUX_SEL_M) && \ + (CONFIG_ROCKCHIP_UART_MUX_SEL_M == 1) + + /* UART9_M1 Switch iomux */ + set_uart_iomux_rx(9, 1); + set_uart_iomux_tx(9, 1); +#endif +#endif +} + +int fit_standalone_release(char *id, uintptr_t entry_point) +{ + /* bus m0 configuration: */ + /* open hclk_dcache / hclk_icache / clk_bus m0 rtc / fclk_bus_m0_core */ + writel(0x03180000, TOP_CRU_BASE + TOP_CRU_GATE_CON23); + + /* open bus m0 sclk / bus m0 hclk / bus m0 dclk */ + writel(0x00070000, TOP_CRU_BASE + TOP_CRU_CM0_GATEMASK); + + /* mcu_cache_peripheral_addr */ + writel(0xa0000000, SYS_GRF_BASE + SYS_GRF_SOC_CON5); + writel(0xffb40000, SYS_GRF_BASE + SYS_GRF_SOC_CON6); + + sip_smc_mcu_config(ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID, + ROCKCHIP_SIP_CONFIG_MCU_CODE_START_ADDR, + 0xffff0000 | (entry_point >> 16)); + sip_smc_mcu_config(ROCKCHIP_SIP_CONFIG_BUSMCU_0_ID, + ROCKCHIP_SIP_CONFIG_MCU_EXPERI_START_ADDR, 0xffffa000); + + /* release dcache / icache / bus m0 jtag / bus m0 */ + writel(0x03280000, TOP_CRU_BASE + TOP_CRU_SOFTRST_CON23); + + /* release pmu m0 jtag / pmu m0 */ + /* writel(0x00050000, PMU1_CRU_BASE + PMU1_CRU_SOFTRST_CON02); */ + + return 0; +} + +#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) +static void qos_priority_init(void) +{ + u32 delay; + u32 i; + + /* power up vo,vi,gpu */ + rk_clrreg(PMU_BASE_ADDR + PMU2_PWR_GATE_SFTCON0, + PD_VO_DWN_SFTENA | PD_VI_DWN_SFTENA); + delay = 1000; + do { + udelay(1); + delay--; + if (delay == 0) { + printf("Fail to set domain. PMU2_PWR_GATE_STS0=0x%x\n", + readl(PMU_BASE_ADDR + PMU2_PWR_GATE_STS0)); + hang(); + } + } while (readl(PMU_BASE_ADDR + PMU2_PWR_GATE_STS0) & + (PD_VO_DWN_SFTENA | PD_VI_DWN_SFTENA)); + /* power up vop memory */ + for (i = 0; i < 16; i++) + rk_clrreg(PMU_BASE_ADDR + PMU2_MEM_SD_SFTCON0, BIT(i)); + + /* release vo,vi,gpu idle request */ + rk_clrreg(PMU_BASE_ADDR + PMU2_BIU_IDLE_SFTCON0, + (IDLE_REQ_VO_SFTENA | IDLE_REQ_VI_SFTENA)); + + delay = 1000; + /* wait ack status */ + do { + udelay(1); + delay--; + if (delay == 0) { + printf("Fail to get ack on domain. PMU2_BIU_IDLE_ACK_STS0=0x%x\n", + readl(PMU_BASE_ADDR + PMU2_BIU_IDLE_ACK_STS0)); + hang(); + } + } while (readl(PMU_BASE_ADDR + PMU2_BIU_IDLE_ACK_STS0) & + (IDLE_ACK_VO | IDLE_ACK_VI)); + + delay = 1000; + /* wait idle status */ + do { + udelay(1); + delay--; + if (delay == 0) { + printf("Fail to set idle on domain. PMU2_BIT_IDLE_STS0=0x%x\n", + readl(PMU_BASE_ADDR + PMU2_BIT_IDLE_STS0)); + hang(); + } + } while (readl(PMU_BASE_ADDR + PMU2_BIT_IDLE_STS0) & + (IDLE_VO | IDLE_VI)); + + /* + * modify default qos priority setting, then + * Peri > VOP/ISP/VICAP > CPU > GPU/NPU/RKVDEC/RGA/Other + * (5) (4) (3) (2) + * + * NOTE: GPU qos init is in kernel, in case that vdd gpu is off now. + */ + writel(QOS_PRIORITY_LEVEL(5, 5), CRYPTO_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), DMAC_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), EMMC_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), FSPI_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), GMAC_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), MAC100_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), MCU_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), RKDMA_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), SDMMC0_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), SDMMC1_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), USB2_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(5, 5), USB3_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(4, 4), ISP_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(4, 4), VICAP_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(4, 4), VOP_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(2, 2), DCF_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(2, 2), DMA2DDR_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(2, 2), PCIE_PRIORITY_REG); +} + +int arch_cpu_init(void) +{ + u32 val; + + /* Set the emmc to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST4_REG); + writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST4_REG); + + /* Set the sdmmc to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST6_REG); + writel(val & 0xff0000ff, FIREWALL_DDR_BASE + FW_DDR_MST6_REG); + + /* + * Set SAIx_MCLK as input default + * + * It's safe to set mclk as input default to avoid high freq glitch + * which may make devices work unexpected. And then enabled by + * kernel stage or any state where user use it. + */ + writel(0x0a100000, PERI_GRF_BASE + PERI_GRF_AUDIO_CON); + + /* Assert reset the pipe phy to save power and de-assert when in use */ + writel(0x00030001, PIPEPHY_GRF_BASE + PIPEPHY_PIPE_CON5); + +#if defined(CONFIG_ROCKCHIP_SFC) + /* Set the fspi to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST5_REG); + writel(val & 0x00ffffff, FIREWALL_DDR_BASE + FW_DDR_MST5_REG); + + /* + * Fix fspi io ds level: + * + * level 2 for 1V8 + * level 3 for 3V3 + */ + if (readl(GPIO1_IOC_BASE + GPIO1A_IOMUX_SEL_L) == 0x2222) { + if (readl(GPIO2_IOC_BASE + GPIO2_IOC_IO_VSEL0) & POC_VCCIO2_VD_3V3) { + writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS0); + writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS1); + writel(0x3f3f0f0f, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1B_DS0); + } else { + writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS0); + writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1A_DS1); + writel(0x3f3f0707, GPIO1_IOC_BASE + GPIO1_IOC_GPIO1B_DS0); + } + } +#endif + + qos_priority_init(); + + return 0; +} +#endif diff --git a/u-boot/arch/arm/mach-rockchip/rk3562/syscon_rk3562.c b/u-boot/arch/arm/mach-rockchip/rk3562/syscon_rk3562.c new file mode 100644 index 0000000..811c4e3 --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/rk3562/syscon_rk3562.c @@ -0,0 +1,26 @@ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <syscon.h> +#include <asm/arch/clock.h> + +static const struct udevice_id rk3562_syscon_ids[] = { + { .compatible = "rockchip,rk3562-sys-grf", .data = ROCKCHIP_SYSCON_GRF }, + { .compatible = "rockchip,rk3562-pmu-grf", .data = ROCKCHIP_SYSCON_PMUGRF }, + { .compatible = "rockchip,rk3562-ioc-grf", .data = ROCKCHIP_SYSCON_IOC }, + { } +}; + +U_BOOT_DRIVER(syscon_rk3562) = { + .name = "rk3562_syscon", + .id = UCLASS_SYSCON, + .of_match = rk3562_syscon_ids, +#if !CONFIG_IS_ENABLED(OF_PLATDATA) + .bind = dm_scan_fdt_dev, +#endif +}; diff --git a/u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c b/u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c index debd642..ef6df66 100644 --- a/u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c +++ b/u-boot/arch/arm/mach-rockchip/rk3568/rk3568.c @@ -777,6 +777,23 @@ #endif } +int fit_standalone_release(char *id, uintptr_t entry_point) +{ + /* risc-v configuration: */ + /* Reset the scr1 */ + writel(0x04000400, CRU_BASE + CRU_SOFTRST_CON26); + udelay(100); + + /* set the scr1 addr */ + writel((0xffff0000) | (entry_point >> 16), GRF_BASE + GRF_SOC_CON4); + udelay(10); + + /* release the scr1 */ + writel(0x04000000, CRU_BASE + CRU_SOFTRST_CON26); + + return 0; +} + #if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_TPL_BUILD) static void qos_priority_init(void) { diff --git a/u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c b/u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c index 7323d96..678d558 100644 --- a/u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c +++ b/u-boot/arch/arm/mach-rockchip/rk3588/rk3588.c @@ -19,20 +19,31 @@ #define FIREWALL_DDR_BASE 0xfe030000 #define FW_DDR_MST5_REG 0x54 #define FW_DDR_MST13_REG 0x74 +#define FW_DDR_MST19_REG 0x8c #define FW_DDR_MST21_REG 0x94 #define FW_DDR_MST26_REG 0xa8 #define FW_DDR_MST27_REG 0xac #define FIREWALL_SYSMEM_BASE 0xfe038000 #define FW_SYSM_MST5_REG 0x54 #define FW_SYSM_MST13_REG 0x74 +#define FW_SYSM_MST19_REG 0x8c #define FW_SYSM_MST21_REG 0x94 #define FW_SYSM_MST26_REG 0xa8 #define FW_SYSM_MST27_REG 0xac +#define PMU1_SGRF_BASE 0xfd582000 +#define PMU1_SGRF_SOC_CON0 0x0 +#define PMU1_SGRF_SOC_CON6 0x18 +#define PMU1_SGRF_SOC_CON7 0x1c +#define PMU1_SGRF_SOC_CON8 0x20 +#define PMU1_SGRF_SOC_CON9 0x24 +#define PMU1_SGRF_SOC_CON10 0x28 +#define PMU1_SGRF_SOC_CON13 0x34 #define SYS_GRF_BASE 0xfd58c000 #define SYS_GRF_SOC_CON6 0x0318 #define USBGRF_BASE 0xfd5ac000 #define USB_GRF_USB3OTG0_CON1 0x001c #define BUS_SGRF_BASE 0xfd586000 +#define BUS_SGRF_SOC_CON2 0x08 #define BUS_SGRF_FIREWALL_CON18 0x288 #define PMU_BASE 0xfd8d0000 #define PMU_PWR_GATE_SFTCON1 0x8150 @@ -66,14 +77,21 @@ #define EMMC_IOC_GPIO2D_DS_H 0x5c #define CRU_BASE 0xfd7c0000 +#define CRU_GPLL_CON1 0x01c4 #define CRU_SOFTRST_CON77 0x0b34 +#define CRU_GLB_RST_CON 0x0c10 #define PMU1CRU_BASE 0xfd7f0000 +#define PMU1CRU_SOFTRST_CON00 0x0a00 #define PMU1CRU_SOFTRST_CON03 0x0a0c #define PMU1CRU_SOFTRST_CON04 0x0a10 #define HDMIRX_NODE_FDT_PATH "/hdmirx-controller@fdee0000" #define RK3588_PHY_CONFIG 0xfdee00c0 + +#define VOP_M0_PRIORITY_REG 0xfdf82008 +#define VOP_M1_PRIORITY_REG 0xfdf82208 +#define QOS_PRIORITY_LEVEL(h, l) ((((h) & 7) << 8) | ((l) & 7)) #ifdef CONFIG_ARM64 #include <asm/armv8/mmu.h> @@ -865,8 +883,15 @@ secure_reg &= 0xffff0000; writel(secure_reg, FIREWALL_SYSMEM_BASE + FW_SYSM_MST27_REG); - /* Select clk_tx source as default for i2s2/i2s3 */ - writel(0x03400340, SYS_GRF_BASE + SYS_GRF_SOC_CON6); + /* + * Select clk_tx source as default for i2s2/i2s3 + * Set I2Sx_MCLK as input default + * + * It's safe to set mclk as input default to avoid high freq glitch + * which may make devices work unexpected. And then enabled by + * kernel stage or any state where user use it. + */ + writel(0x03c703c7, SYS_GRF_BASE + SYS_GRF_SOC_CON6); if (readl(BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_L) == 0x2222) { /* Set the fspi m0 io ds level to 55ohm */ @@ -922,7 +947,14 @@ writel(0xffff1111, BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_L); writel(0xffff1111, BUS_IOC_BASE + BUS_IOC_GPIO2D_IOMUX_SEL_H); #endif - + /* + * set VOP M0 and VOP M1 to priority 0x303,then + * Peri > VOP/MCU > ISP/VICAP > other + * Note: VOP priority can only be modified during the u-boot stage, + * as VOP default power down, and power up after trust. + */ + writel(QOS_PRIORITY_LEVEL(3, 3), VOP_M0_PRIORITY_REG); + writel(QOS_PRIORITY_LEVEL(3, 3), VOP_M1_PRIORITY_REG); #endif /* Select usb otg0 phy status to 0 that make rockusb can work at high-speed */ @@ -1245,31 +1277,36 @@ #ifdef CONFIG_SPL_BUILD int spl_fit_standalone_release(char *id, uintptr_t entry_point) { - /* gpll enable */ - writel(0x00f00042, 0xfd7c01c4); + u32 val; + + /* pmu m0 configuration: */ + /* set gpll */ + writel(0x00f00042, CRU_BASE + CRU_GPLL_CON1); + /* set pmu mcu to access ddr memory */ + val = readl(FIREWALL_DDR_BASE + FW_DDR_MST19_REG); + writel(val & 0x0000ffff, FIREWALL_DDR_BASE + FW_DDR_MST19_REG); + /* set pmu mcu to access system memory */ + val = readl(FIREWALL_SYSMEM_BASE + FW_SYSM_MST19_REG); + writel(val & 0x000000ff, FIREWALL_SYSMEM_BASE + FW_SYSM_MST19_REG); + /* set pmu mcu to secure */ + writel(0x00080000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON0); /* set start addr, pmu_mcu_code_addr_start */ - writel(0xFFFF0000 | (entry_point >> 16), 0xFD582024); - /* pmu_mcu_sram_addr_start */ - writel(0xFFFF2000, 0xFD582028); - /* pmu_mcu_tcm_addr_start */ - writel(0xFFFF2000, 0xFD582034); - /* set mcu secure */ - writel(0x00080000, 0xFD582000); + writel(0xFFFF0000 | (entry_point >> 16), PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON9); + /* set pmu_mcu_sram_addr_start */ + writel(0xFFFF2000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON10); + /* set pmu_mcu_tcm_addr_start */ + writel(0xFFFF2000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON13); /* set cache cache_peripheral_addr */ - writel(0xffff0000, 0xFD582018); - writel(0xffffee00, 0xFD58201c); - writel(0x00ff00ff, 0xFD582020); /* 0xf0000000 ~ 0xfee00000 */ - /* mcupmu access DDR secure control, each bit for a region. */ - writel(0x0000ffff, 0xFE03008C); - /* mcupmu access DDR secure control, each bit for a region. */ - writel(0x000000ff, 0xFE03808C); - /* PMU WDT reset system enable */ - writel(0x02000200, 0xFD586008); - /* WDT trigger global reset. */ - writel(0x08400840, 0xFD7C0C10); - /* Spl helps to load the mcu image, but not need to release - * mcu for rk3588. - */ + /* 0xf0000000 ~ 0xfee00000 */ + writel(0xffff0000, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON6); + writel(0xffffee00, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON7); + writel(0x00ff00ff, PMU1_SGRF_BASE + PMU1_SGRF_SOC_CON8); + /* enable PMU WDT reset system */ + writel(0x02000200, BUS_SGRF_BASE + BUS_SGRF_SOC_CON2); + /* select WDT trigger global reset. */ + writel(0x08400840, CRU_BASE + CRU_GLB_RST_CON); + /* release pmu mcu */ + /* writel(0x20000000, PMU1CRU_BASE + PMU1CRU_SOFTRST_CON00); */ return 0; } diff --git a/u-boot/arch/arm/mach-rockchip/rk_meta.c b/u-boot/arch/arm/mach-rockchip/rk_meta.c index e35391f..8c0cce9 100644 --- a/u-boot/arch/arm/mach-rockchip/rk_meta.c +++ b/u-boot/arch/arm/mach-rockchip/rk_meta.c @@ -50,6 +50,7 @@ ulong sector; char *data; u64 len; + int meta_iq_item_size = 0; if (part_get_info_by_name(info->dev, part_name, &part_info) <= 0) { debug("%s: no partition\n", __func__); @@ -91,32 +92,31 @@ /* load compress data */ data = (char *)COMPRESS_LOAD_ADDR; + meta_iq_item_size = meta_p->iq_item_size + meta.comp_size; if (meta_p->comp_type == META_COMPRESS_TYPE_GZ) { if (info->read(info, sector + (MAX_META_SEGMENT_SIZE / info->bl_len), - DIV_ROUND_UP(meta.comp_size, info->bl_len), data) - != DIV_ROUND_UP(meta.comp_size, info->bl_len)) { - debug("%s: Failed to read compress data.\n", __func__); + DIV_ROUND_UP(meta_iq_item_size, info->bl_len), data) + != DIV_ROUND_UP(meta_iq_item_size, info->bl_len)) { + printf("%s: Failed to read compress data.\n", __func__); return -EIO; } + + memcpy((void *)(meta_p->load + SENSOR_IQ_BIN_OFFSET), data, meta_p->iq_item_size); if (rk_meta_iq_decom((meta_p->load + meta_p->comp_off), (unsigned long)(data + meta_p->comp_off - MAX_META_SEGMENT_SIZE), meta.comp_size, &len)) { - debug("%s: Failed to decompress.\n", __func__); + printf("%s: Failed to decompress.\n", __func__); return -EIO; } - /* update decompress gz's file size */ - unsigned int *p_len = (unsigned int *) - (meta_p->load + MAX_META_SEGMENT_SIZE + MAX_HEAD_SIZE); - *p_len = (u32)len; - /* TODO: update decompress gz's file crc32 */ + } else { if (info->read(info, sector + (MAX_META_SEGMENT_SIZE / info->bl_len), - DIV_ROUND_UP(meta.comp_size, info->bl_len), + DIV_ROUND_UP(meta_iq_item_size, info->bl_len), (void *)(meta_p->load + MAX_META_SEGMENT_SIZE)) - != DIV_ROUND_UP(meta.comp_size, info->bl_len)) { - debug("%s: Failed to read\n", __func__); + != DIV_ROUND_UP(meta_iq_item_size, info->bl_len)) { + printf("%s: Failed to read\n", __func__); return -EIO; } } @@ -125,6 +125,7 @@ flush_cache(meta_p->load, meta_p->size); rk_meta_process(); + printf("\nMeta: ok\n"); return 0; } diff --git a/u-boot/arch/arm/mach-rockchip/rockchip_smccc.c b/u-boot/arch/arm/mach-rockchip/rockchip_smccc.c index 0cff596..cd02914 100644 --- a/u-boot/arch/arm/mach-rockchip/rockchip_smccc.c +++ b/u-boot/arch/arm/mach-rockchip/rockchip_smccc.c @@ -61,6 +61,15 @@ return res.a0; } +int sip_smc_remotectl_config(unsigned long func, unsigned long data) +{ + struct arm_smccc_res res; + + res = __invoke_sip_fn_smc(SIP_REMOTECTL_CFG, func, data, 0); + + return res.a0; +} + int sip_smc_amp_cfg(unsigned long func, unsigned long arg0, unsigned long arg1, unsigned long arg2) { @@ -142,3 +151,11 @@ return 0; } + +int sip_smc_mcu_config(unsigned long mcu_id, unsigned long func, unsigned long arg2) +{ + struct arm_smccc_res res; + + res = __invoke_sip_fn_smc(SIP_MCU_CFG, mcu_id, func, arg2); + return res.a0; +} diff --git a/u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c b/u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c index 76d3d51..cbbd106 100644 --- a/u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c +++ b/u-boot/arch/arm/mach-rockchip/rv1106/rv1106.c @@ -7,6 +7,9 @@ #include <boot_rkimg.h> #include <cli.h> #include <debug_uart.h> +#include <miiphy.h> +#include <syscon.h> +#include <asm/arch/clock.h> #include <asm/io.h> #include <asm/arch/hardware.h> #include <asm/arch/grf_rv1106.h> @@ -538,15 +541,65 @@ } #endif -int rk_board_late_init(void) -{ -#if defined(CONFIG_CMD_SCRIPT_UPDATE) - struct blk_desc *desc; +#if (defined CONFIG_MII || defined CONFIG_CMD_MII || defined CONFIG_PHYLIB) +#define GMAC_NODE_FDT_PATH "/ethernet@ffa80000" +#define RK630_MII_NAME "ethernet@ffa80000" +#define PHY_ADDR 2 +#define PAGE_SWITCH 0x1f +#define DISABLE_APS_REG 0x12 +#define DISABLE_APS_VAL 0x4824 +#define PHYAFE_PDCW_REG 0x1c +#define PHYAFE_PDCW_VAL 0x8880 +#define PD_ANALOG_REG 0x0 +#define PD_ANALOG_VAL 0x3900 +#define RV1106_MACPHY_SHUTDOWN BIT(1) +#define RV1106_MACPHY_ENABLE_MASK BIT(1) - desc = rockchip_get_bootdev(); - if (desc && desc->if_type == IF_TYPE_MMC && desc->devnum == 1) - run_command("sd_update", 0); -#endif +static int rk_board_fdt_pwrdn_gmac(const void *blob) +{ + void *fdt = (void *)gd->fdt_blob; + struct rv1106_grf *grf; + int gmac_node; + + /* Turn off GMAC FEPHY to reduce chip power consumption at uboot level, + * if the gmac node is disabled at kernel dtb. RV1106/1103 has the + * internal gmac phy, u-boot.dtb defines and enables the gmac node + * by default, so even if the gmac node of the kernel dts is disabled, + * U-Boot will enable and initialize the gmac phy. So it is not okay + * to turn off gmac phy by default in arch_cpu_init(), need to turn off + * gmac phy in the current function. + */ + gmac_node = fdt_path_offset(gd->fdt_blob, GMAC_NODE_FDT_PATH); + if (fdt_stringlist_search(fdt, gmac_node, "status", "disabled") >= 0) { + /* switch to page 1 */ + miiphy_write(RK630_MII_NAME, PHY_ADDR, PAGE_SWITCH, 0x0100); + miiphy_write(RK630_MII_NAME, PHY_ADDR, DISABLE_APS_REG, + DISABLE_APS_VAL); + /* switch to pae 6 */ + miiphy_write(RK630_MII_NAME, PHY_ADDR, PAGE_SWITCH, 0x0600); + miiphy_write(RK630_MII_NAME, PHY_ADDR, PHYAFE_PDCW_REG, + PHYAFE_PDCW_VAL); + /* switch to page 0 */ + miiphy_write(RK630_MII_NAME, PHY_ADDR, PAGE_SWITCH, 0x0000); + miiphy_write(RK630_MII_NAME, PHY_ADDR, PD_ANALOG_REG, + PD_ANALOG_VAL); + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + if (grf) + rk_clrsetreg(&grf->macphy_con0, + RV1106_MACPHY_ENABLE_MASK, + RV1106_MACPHY_SHUTDOWN); + } + return 0; } +#endif +int rk_board_fdt_fixup(const void *blob) +{ +#if (defined CONFIG_MII || defined CONFIG_CMD_MII || defined CONFIG_PHYLIB) + rk_board_fdt_pwrdn_gmac(blob); +#endif + + return 0; +} diff --git a/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c b/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c index 311310d..2f712e2 100644 --- a/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c +++ b/u-boot/arch/arm/mach-rockchip/rv1126/rv1126.c @@ -63,6 +63,9 @@ #define PMU_PWR_DWN_ST (0x108) #define PMU_PWR_GATE_SFTCON (0x110) +#define PMU_BUS_IDLE_NPU BIT(18) +#define PMU_BUS_IDLE_VEPU BIT(9) + #define CRU_BASE 0xFF490000 #define CRU_CLKSEL_CON02 0x108 #define CRU_CLKSEL_CON03 0x10c @@ -548,6 +551,7 @@ * CONFIG_DM_RAMDISK: for ramboot that without SPL. */ #if defined(CONFIG_SPL_BUILD) || defined(CONFIG_DM_RAMDISK) + u32 pd_st, idle_st; int delay; /* @@ -624,11 +628,7 @@ do { udelay(1); delay--; - if (delay == 0) { - printf("Fail to set domain."); - hang(); - } - } while (readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST)); + } while (delay && readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST)); /* release all idle request */ writel(0xffff0000, PMU_BASE_ADDR + PMU_BUS_IDLE_SFTCON(0)); @@ -639,22 +639,30 @@ do { udelay(1); delay--; - if (delay == 0) { - printf("Fail to get ack on domain.\n"); - hang(); - } - } while (readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ACK)); + } while (delay && readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ACK)); delay = 1000; /* wait idle status */ do { udelay(1); delay--; - if (delay == 0) { - printf("Fail to set idle on domain.\n"); - hang(); - } - } while (readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST)); + } while (delay && readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST)); + + pd_st = readl(PMU_BASE_ADDR + PMU_PWR_DWN_ST); + idle_st = readl(PMU_BASE_ADDR + PMU_BUS_IDLE_ST); + + if (pd_st || idle_st) { + printf("PMU_PWR_DOWN_ST: 0x%08x\n", pd_st); + printf("PMU_BUS_IDLE_ST: 0x%08x\n", idle_st); + + if (idle_st & PMU_BUS_IDLE_NPU) + printf("Failed to enable PD_NPU, please check VDD_NPU is supplied\n"); + + if (idle_st & PMU_BUS_IDLE_VEPU) + printf("Failed to enable PD_VEPU, please check VDD_VEPU is supplied\n"); + + hang(); + } writel(0x303, USB_HOST_PRIORITY_REG); writel(0x303, USB_OTG_PRIORITY_REG); diff --git a/u-boot/arch/arm/mach-rockchip/spl.c b/u-boot/arch/arm/mach-rockchip/spl.c index 6ee6933..0bf425c 100644 --- a/u-boot/arch/arm/mach-rockchip/spl.c +++ b/u-boot/arch/arm/mach-rockchip/spl.c @@ -19,6 +19,7 @@ #ifdef CONFIG_ROCKCHIP_PRELOADER_ATAGS #include <asm/arch/rk_atags.h> #endif +#include <asm/arch/pcie_ep_boot.h> #include <asm/arch/sdram.h> #include <asm/arch/boot_mode.h> #include <asm/arch-rockchip/sys_proto.h> @@ -175,6 +176,9 @@ printascii("U-Boot SPL board init"); #endif gd->sys_start_tick = get_ticks(); +#ifdef CONFIG_SPL_PCIE_EP_SUPPORT + rockchip_pcie_ep_init(); +#endif #ifdef CONFIG_SPL_FRAMEWORK ret = spl_early_init(); if (ret) { @@ -197,6 +201,9 @@ arch_cpu_init(); rk_board_init_f(); +#ifdef CONFIG_SPL_RAM_DEVICE + rockchip_pcie_ep_get_firmware(); +#endif #if CONFIG_IS_ENABLED(ROCKCHIP_BACK_TO_BROM) && !defined(CONFIG_SPL_BOARD_INIT) back_to_bootrom(BROM_BOOT_NEXTSTAGE); #endif @@ -368,7 +375,10 @@ spl->next_stage = SPL_NEXT_STAGE_KERNEL; break; default: - spl->next_stage = SPL_NEXT_STAGE_UBOOT; + if ((reg_boot_mode & REBOOT_FLAG) != REBOOT_FLAG) + spl->next_stage = SPL_NEXT_STAGE_KERNEL; + else + spl->next_stage = SPL_NEXT_STAGE_UBOOT; } } #endif diff --git a/u-boot/arch/arm/mach-rockchip/spl_pcie_ep_boot.c b/u-boot/arch/arm/mach-rockchip/spl_pcie_ep_boot.c new file mode 100644 index 0000000..9d3a6a1 --- /dev/null +++ b/u-boot/arch/arm/mach-rockchip/spl_pcie_ep_boot.c @@ -0,0 +1,689 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2023 Rockchip Electronics Co., Ltd + */ + +#include <common.h> +#include <spl.h> +#include <asm/io.h> +#include <asm/arch/cpu.h> +#include <asm/arch/hardware.h> +#include <asm/arch/ioc_rk3588.h> +#include <dt-bindings/clock/rk3588-cru.h> +#include <pci.h> +#include <asm/arch/rk_atags.h> + +#ifndef CONFIG_SPL_LOAD_FIT_ADDRESS +#error "SPL_LOAD_FIT_ADDRESS not defined!" +#endif + +#define printep(fmt, ...) \ + do { \ + printf("RKEP: %d - ", readl(CONFIG_ROCKCHIP_STIMER_BASE + 0x2c) / 24); \ + printf(fmt, ##__VA_ARGS__); \ + } while (0) + +#ifdef CONFIG_ROCKCHIP_RK3588 +#define PCIE_SNPS_DBI_BASE 0xf5000000 +#define PCIE_SNPS_APB_BASE 0xfe150000 +#define PCIE_SNPS_IATU_BASE 0xa40300000 + +#define PCI_RESBAR 0x2e8 +#elif CONFIG_ROCKCHIP_RK3568 +#define PCIE_SNPS_DBI_BASE 0xf6000000 +#define PCIE_SNPS_APB_BASE 0xfe280000 +#define PCIE_SNPS_IATU_BASE 0x3c0b00000 + +#define PCI_RESBAR 0x2b8 +#else +#error "this soc is not support pcie ep!" +#endif + +#define RKEP_BAR0_ADDR 0x3c000000 +#define RKEP_BAR2_ADDR CONFIG_SPL_LOAD_FIT_ADDRESS +#define RKEP_BAR0_CMD_ADDR (RKEP_BAR0_ADDR + 0x400) +#define RKEP_BOOT_MAGIC 0x524b4550 /* RKEP */ +#define RKEP_CMD_LOADER_RUN 0x524b4501 + +#define PCI_EXP_LNKCAP 12 /* Link Capabilities */ +#define PCI_EXP_LNKCTL2 48 /* Link Control 2 */ +#define PCI_EXP_LNKCTL2_TLS 0x000f +#define PCI_EXP_LNKCAP_SLS 0x0000000f + +#define PCI_EXP_LNKCTL2_TLS_2_5GT 0x0001 /* Supported Speed 2.5GT/s */ +#define PCI_EXP_LNKCTL2_TLS_5_0GT 0x0002 /* Supported Speed 5GT/s */ +#define PCI_EXP_LNKCTL2_TLS_8_0GT 0x0003 /* Supported Speed 8GT/s */ + +/* Synopsys-specific PCIe configuration registers */ +#define PCIE_PORT_LINK_CONTROL 0x710 +#define PORT_LINK_MODE_MASK (0x3f << 16) +#define PORT_LINK_MODE_1_LANES (0x1 << 16) +#define PORT_LINK_MODE_2_LANES (0x3 << 16) +#define PORT_LINK_MODE_4_LANES (0x7 << 16) +#define PORT_LINK_MODE_8_LANES (0xf << 16) + +#define PCIE_LINK_WIDTH_SPEED_CONTROL 0x80C +#define PORT_LOGIC_SPEED_CHANGE (0x1 << 17) +#define PORT_LOGIC_LINK_WIDTH_MASK (0x1f << 8) +#define PORT_LOGIC_LINK_WIDTH_1_LANES (0x1 << 8) +#define PORT_LOGIC_LINK_WIDTH_2_LANES (0x2 << 8) +#define PORT_LOGIC_LINK_WIDTH_4_LANES (0x4 << 8) +#define PORT_LOGIC_LINK_WIDTH_8_LANES (0x8 << 8) + +#define PCIE_DIRECT_SPEED_CHANGE (0x1 << 17) + +#define LINK_WAIT_IATU 10000 +#define PCIE_ATU_ENABLE (0x1 << 31) +#define PCIE_ATU_BAR_MODE_ENABLE (0x1 << 30 | 1 << 19) +#define PCIE_ATU_UNR_REGION_CTRL1 0x00 +#define PCIE_ATU_UNR_REGION_CTRL2 0x04 +#define PCIE_ATU_CPU_ADDR_LOW 0x14 +#define PCIE_ATU_CPU_ADDR_HIGH 0x18 + +/* SRNS: Use Separate refclk(internal clock) instead of from RC */ +// #define PCIE_ENABLE_SRNS_PLL_REFCLK + +struct rkpcie_cmd { + u32 cmd; + u32 size; + u32 data[6]; +}; + +/* rkep device mode status definition */ +#define RKEP_MODE_BOOTROM 1 +#define RKEP_MODE_LOADER 2 +#define RKEP_MODE_KERNEL 3 + +/* Common status */ +#define RKEP_SMODE_INIT 0 +#define RKEP_SMODE_LNKRDY 1 +#define RKEP_SMODE_LNKUP 2 +#define RKEP_SMODE_ERR 0xff +/* Firmware download status */ +#define RKEP_SMODE_FWDLRDY 0x10 +#define RKEP_SMODE_FWDLDONE 0x11 +/* Application status*/ +#define RKEP_SMODE_APPRDY 0x20 + +struct rkpcie_boot { + /* magic: "RKEP" */ + u32 magic; + u32 version; + struct { + u16 mode; + u16 submode; + } devmode; + /* Size of ATAGS for cap */ + u32 cap_size; + struct { + u8 cmd; + u8 status; + /* Error code for current CMD */ + u16 opcode; + } cmd_status; + u32 reserved[2]; + /* RK ATAGS, for mem and other info */ + struct tag cap; + /* offset 0x400 */ + struct rkpcie_cmd cmd; +}; + +static void pcie_inbound_config(void) +{ + u64 base = PCIE_SNPS_IATU_BASE + 0x100; + u32 val; + char i; + + /* BAR0: RKEP_BAR0_ADDR */ + writel(RKEP_BAR0_ADDR, base + PCIE_ATU_CPU_ADDR_LOW); + writel(0, base + PCIE_ATU_CPU_ADDR_HIGH); + writel(0, base + PCIE_ATU_UNR_REGION_CTRL1); + /* PCIE_ATU_UNR_REGION_CTRL2 */ + writel(PCIE_ATU_ENABLE | PCIE_ATU_BAR_MODE_ENABLE | (0 << 8), + base + PCIE_ATU_UNR_REGION_CTRL2); + for (i = 0; i < 5; i++) { + val = readl(base + PCIE_ATU_UNR_REGION_CTRL2); + if (val & PCIE_ATU_ENABLE) + break; + udelay(LINK_WAIT_IATU); + } + printep("BAR0: 0x%x\n", RKEP_BAR0_ADDR); + + /* BAR2: RKEP_BAR2_ADDR */ + writel(RKEP_BAR2_ADDR, base + PCIE_ATU_CPU_ADDR_LOW + 0x200); + writel(0, base + PCIE_ATU_CPU_ADDR_HIGH + 0x200); + writel(0, base + PCIE_ATU_UNR_REGION_CTRL1 + 0x200); + writel(PCIE_ATU_ENABLE | PCIE_ATU_BAR_MODE_ENABLE | (2 << 8), + base + PCIE_ATU_UNR_REGION_CTRL2 + 0x200); + for (i = 0; i < 5; i++) { + val = readl(base + PCIE_ATU_UNR_REGION_CTRL2 + 0x200); + if (val & PCIE_ATU_ENABLE) + break; + udelay(LINK_WAIT_IATU); + } + printep("BAR2: 0x%x%x\n", 0, RKEP_BAR2_ADDR); + + /* BAR4 is wired reg, no need iATU */ +} + +static int rockchip_pcie_ep_set_bar_flag(void *dbi_base, u32 barno, int flags) +{ + u32 reg; + + reg = PCI_BASE_ADDRESS_0 + (4 * barno); + + /* Disabled the upper 32bits BAR to make a 64bits bar pair */ + if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) + writel(0, dbi_base + reg + 0x100000 + 4); + + writel(flags, dbi_base + reg); + if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) + writel(0, dbi_base + reg + 4); + + return 0; +} + +static void pcie_bar_init(void *dbi_base) +{ + void *resbar_base; + + writel(0, dbi_base + 0x10); + writel(0, dbi_base + 0x14); + writel(0, dbi_base + 0x18); + writel(0, dbi_base + 0x1c); + writel(0, dbi_base + 0x20); + writel(0, dbi_base + 0x24); + + /* Resize BAR0 to support 4M 32bits */ + resbar_base = dbi_base + PCI_RESBAR; + writel(0xfffff0, resbar_base + 0x4); + writel(0x2c0, resbar_base + 0x8); + /* BAR2: 64M 64bits */ + writel(0xfffff0, resbar_base + 0x14); + writel(0x6c0, resbar_base + 0x18); + /* BAR4: Fixed for EP wired register, 1M 32bits */ + writel(0xfffff0, resbar_base + 0x24); + writel(0xc0, resbar_base + 0x28); + /* Set flags */ + rockchip_pcie_ep_set_bar_flag(dbi_base, 0, PCI_BASE_ADDRESS_MEM_TYPE_32); + rockchip_pcie_ep_set_bar_flag(dbi_base, 2, + PCI_BASE_ADDRESS_MEM_PREFETCH | PCI_BASE_ADDRESS_MEM_TYPE_64); + rockchip_pcie_ep_set_bar_flag(dbi_base, 4, PCI_BASE_ADDRESS_MEM_TYPE_32); + + /* Close bar1 bar3 bar5 */ + writel(0x0, dbi_base + 0x100000 + 0x14); + //writel(0x0, dbi_base + 0x100000 + 0x18); + writel(0x0, dbi_base + 0x100000 + 0x1c); + //writel(0x0, dbi_base + 0x100000 + 0x20); + writel(0x0, dbi_base + 0x100000 + 0x24); + /* Close ROM BAR */ + writel(0x0, dbi_base + 0x100000 + 0x30); +} + +static void pcie_bar0_header_init(void) +{ + struct rkpcie_boot *bh = (struct rkpcie_boot *)RKEP_BAR0_ADDR; + + bh->magic = RKEP_BOOT_MAGIC; + bh->version = 0x100; + bh->devmode.mode = RKEP_MODE_LOADER; + bh->devmode.submode = RKEP_SMODE_INIT; + bh->cap_size = 0; + + memset((char *)RKEP_BAR0_CMD_ADDR, 0, sizeof(struct rkpcie_cmd)); +} + +static void pcie_link_set_max_speed(void *dbi_base, u32 link_gen) +{ + u32 cap, ctrl2, link_speed; + u8 offset = 0x70; + + cap = readl(dbi_base + offset + PCI_EXP_LNKCAP); + ctrl2 = readl(dbi_base + offset + PCI_EXP_LNKCTL2); + ctrl2 &= ~PCI_EXP_LNKCTL2_TLS; + + link_speed = link_gen; + + cap &= ~((u32)PCI_EXP_LNKCAP_SLS); + writel(ctrl2 | link_speed, dbi_base + offset + PCI_EXP_LNKCTL2); + writel(cap | link_speed, dbi_base + offset + PCI_EXP_LNKCAP); +} + +static void pcie_link_set_lanes(void *dbi_base, u32 lanes) +{ + u32 val; + + /* Set the number of lanes */ + val = readl(dbi_base + PCIE_PORT_LINK_CONTROL); + val &= ~PORT_LINK_MODE_MASK; + switch (lanes) { + case 1: + val |= PORT_LINK_MODE_1_LANES; + break; + case 2: + val |= PORT_LINK_MODE_2_LANES; + break; + case 4: + val |= PORT_LINK_MODE_4_LANES; + break; + default: + printf("RKEP: num-lanes %u: invalid value\n", lanes); + return; + } + writel(val, dbi_base + PCIE_PORT_LINK_CONTROL); + + /* Set link width speed control register */ + val = readl(dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); + val &= ~PORT_LOGIC_LINK_WIDTH_MASK; + switch (lanes) { + case 1: + val |= PORT_LOGIC_LINK_WIDTH_1_LANES; + break; + case 2: + val |= PORT_LOGIC_LINK_WIDTH_2_LANES; + break; + case 4: + val |= PORT_LOGIC_LINK_WIDTH_4_LANES; + break; + } + + val |= PCIE_DIRECT_SPEED_CHANGE; + + writel(val, dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); +} + +static void pcie_devmode_update(int mode, int submode) +{ + struct rkpcie_boot *bh = (struct rkpcie_boot *)RKEP_BAR0_ADDR; + + bh->devmode.mode = mode; + bh->devmode.submode = submode; + flush_dcache_range(RKEP_BAR0_ADDR, RKEP_BAR0_ADDR + 64); +} + +#ifdef CONFIG_SPL_RAM_DEVICE +static void pcie_wait_for_fw(void) +{ + struct rkpcie_cmd *cmd = (struct rkpcie_cmd *)(RKEP_BAR0_CMD_ADDR); + int val; + int i = 0; + + printep("Link ready! Waiting RC to download Firmware:\n"); + printep("Download uboot.img to BAR2+0\n"); + printep("Download boot.img to BAR2+0x400000\n"); + printep("Send CMD_LOADER_RUN to BAR0+0x400\n"); + while (1) { + invalidate_dcache_range(RKEP_BAR0_CMD_ADDR, + RKEP_BAR0_CMD_ADDR + 32); + val = readl(&cmd->cmd); + if (val == RKEP_CMD_LOADER_RUN) + break; + i++; + if (!(i % 10)) + printep("Waiting for FW, CMD: %x\n", val); + mdelay(100); + } + /* Invalidate Cache for firmware area: BAR2, 64MB */ + invalidate_dcache_range(RKEP_BAR2_ADDR, RKEP_BAR2_ADDR + 0x4000000); + printep("Firmware Download complete!\n"); +} + +static void pcie_update_atags(void) +{ + struct tag_ram_partition t_ram_part; + + if (!atags_is_available()) { + printf("RKEP: No ATAGS data found, create new!\n"); + atags_destroy(); + } + + /* ram partition */ + memset(&t_ram_part, 0, sizeof(t_ram_part)); + t_ram_part.version = 0; + t_ram_part.count = 1; + strcpy(t_ram_part.part[0].name, "boot"); + t_ram_part.part[0].start = RKEP_BAR2_ADDR + 0x400000; /* 4M offset */ + t_ram_part.part[0].size = 0x3c00000; /* 60M size */ + atags_set_tag(ATAG_RAM_PARTITION, &t_ram_part); +} + +void rockchip_pcie_ep_get_firmware(void) +{ + pcie_devmode_update(RKEP_MODE_LOADER, RKEP_SMODE_FWDLRDY); + pcie_wait_for_fw(); + pcie_update_atags(); + pcie_devmode_update(RKEP_MODE_LOADER, RKEP_SMODE_FWDLDONE); +} +#endif + +#ifdef CONFIG_ROCKCHIP_RK3588 +#define BUS_IOC_GPIO3D_IOMUX_SEL_H 0xfd5f807c +#define GPIO3_BASE 0xfec40000 +#define GPIO3_SWPORT_DR_H (GPIO3_BASE + 0x4) +#define GPIO3_SWPORT_DDR_H (GPIO3_BASE + 0xc) + +static void pcie_board_init(void) +{ + /* Enable AU5426 buffer chip on EVB4v10 */ + /* Set GPIO3D4 to gpio output HIGH mode PCIE20_CLK_PWREN */ + writel(0xf << 16, BUS_IOC_GPIO3D_IOMUX_SEL_H); + writel(0x10001000, GPIO3_SWPORT_DDR_H); + writel(0x10001000, GPIO3_SWPORT_DR_H); + udelay(100); +} + +#define PHY_MODE_PCIE_AGGREGATION 4 /* PCIe3x4 */ +#define PHY_MODE_PCIE_NANBNB 0 /* P1:PCIe3x2 + P0:PCIe3x2 */ +#define PHY_MODE_PCIE_NANBBI 1 /* P1:PCIe3x2 + P0:PCIe3x1*2 */ +#define PHY_MODE_PCIE_NABINB 2 /* P1:PCIe3x1*2 + P0:PCIe3x2 */ +#define PHY_MODE_PCIE_NABIBI 3 /* P1:PCIe3x1*2 + P0:PCIe3x1*2 */ + +#define CRU_BASE_ADDR 0xfd7c0000 +#define CRU_SOFTRST_CON32 (CRU_BASE_ADDR + 0x0a80) +#define CRU_SOFTRST_CON33 (CRU_BASE_ADDR + 0x0a84) +#define CRU_SOFTRST_CON34 (CRU_BASE_ADDR + 0x0a88) +#define CRU_GATE_CON32 (CRU_BASE_ADDR + 0x0880) +#define CRU_GATE_CON33 (CRU_BASE_ADDR + 0x0884) +#define CRU_GATE_CON34 (CRU_BASE_ADDR + 0x0888) +#define CRU_GATE_CON38 (CRU_BASE_ADDR + 0x0898) +#define CRU_GATE_CON39 (CRU_BASE_ADDR + 0x089c) +#define PHPTOPCRU_BASE_ADDR 0xfd7c8000 +#define PHPTOPCRU_SOFTRST_CON00 (PHPTOPCRU_BASE_ADDR + 0x0a00) +#define PHPTOPCRU_GATE_CON00 (PHPTOPCRU_BASE_ADDR + 0x0800) +#define PCIE3PHY_GRF_BASE 0xfd5b8000 +#define RK3588_PCIE3PHY_GRF_CMN_CON0 (PCIE3PHY_GRF_BASE + 0x0000) +#define PCIE3PHY_GRF_PHY0_CON6 (PCIE3PHY_GRF_BASE + 0x0118) +#define PCIE3PHY_GRF_PHY1_CON6 (PCIE3PHY_GRF_BASE + 0x0218) +#define PCIE3PHY_GRF_PHY0_LN0_CON1 (PCIE3PHY_GRF_BASE + 0x1004) +#define PCIE3PHY_GRF_PHY0_LN1_CON1 (PCIE3PHY_GRF_BASE + 0x1104) +#define PCIE3PHY_GRF_PHY1_LN0_CON1 (PCIE3PHY_GRF_BASE + 0x2004) +#define PCIE3PHY_GRF_PHY1_LN1_CON1 (PCIE3PHY_GRF_BASE + 0x2104) +#define FIREWALL_PCIE_MASTER_SEC 0xfe0300f0 +#define FIREWALL_PCIE_ACCESS 0xfe586040 +#define CRU_PHYREF_ALT_GATE_CON (CRU_BASE_ADDR + 0x0c38) +#define PMU_PWR_GATE_SFTCON1 0xfd8d8150 +static void pcie_cru_init(void) +{ + u32 phy0_mplla, phy1_mplla, t0 = 0, t1 = 0; + u32 i, timeout = 500; + + /* Enable power domain: PD_PCIE & PD_PHP */ + writel(0x1 << 23 | 0x1 << 21, PMU_PWR_GATE_SFTCON1); + + /* FixMe init 3.0 PHY */ + /* Phy mode: Aggregation NBNB */ + writel((0x7 << 16) | PHY_MODE_PCIE_AGGREGATION, RK3588_PCIE3PHY_GRF_CMN_CON0); + printep("PHY Mode 0x%x\n", readl(RK3588_PCIE3PHY_GRF_CMN_CON0) & 7); + /* Enable clock and sfreset for Controller and PHY */ + writel(0xffff0000, CRU_SOFTRST_CON32); + writel(0xffff0000, CRU_SOFTRST_CON33); + writel(0xffff0000, CRU_SOFTRST_CON34); + writel(0xffff0000, CRU_GATE_CON32); + writel(0xffff0000, CRU_GATE_CON33); + writel(0xffff0000, CRU_GATE_CON34); + writel(0xffff0000, CRU_GATE_CON38); + writel(0xffff0000, CRU_GATE_CON39); + + writel((0x1 << 24), PHPTOPCRU_SOFTRST_CON00); + writel(0xffff0000, PHPTOPCRU_GATE_CON00); + + /* PHY Reset */ + writel((0x1 << 10) | (0x1 << 26), PHPTOPCRU_SOFTRST_CON00); + + udelay(1); + +#ifdef PCIE_ENABLE_SRNS_PLL_REFCLK + writel(0x000f0000, CRU_PHYREF_ALT_GATE_CON); + + /* PHY0 & PHY1 use internal clock */ + writel(0x0 | (0x1 << 18), PCIE3PHY_GRF_PHY0_CON6); + writel(0x0 | (0x1 << 18), PCIE3PHY_GRF_PHY1_CON6); + + /* phy0_rx0_cmn_refclk_mod */ + writel((0x0) | (0x1 << 23), PCIE3PHY_GRF_PHY0_LN0_CON1); + /* phy1_rx0_cmn_refclk_mod */ + writel((0x0) | (0x1 << 23), PCIE3PHY_GRF_PHY0_LN1_CON1); + /* phy0_rx0_cmn_refclk_mod */ + writel((0x0) | (0x1 << 23), PCIE3PHY_GRF_PHY1_LN0_CON1); + /* phy1_rx0_cmn_refclk_mod */ + writel((0x0) | (0x1 << 23), PCIE3PHY_GRF_PHY1_LN1_CON1); +#endif + + udelay(1000); + + /* Deassert PCIe PMA output clamp mode */ + writel((0x1 << 8) | (0x1 << 24), RK3588_PCIE3PHY_GRF_CMN_CON0); + + /* Deassert PHY Reset */ + writel((0x1 << 26), PHPTOPCRU_SOFTRST_CON00); + + /* S-Phy: waiting for phy locked */ + for (i = 0; i < timeout; i++) { + phy0_mplla = readl(PCIE3PHY_GRF_BASE + 0x904); + phy1_mplla = readl(PCIE3PHY_GRF_BASE + 0xA04); + + if (phy0_mplla != t0 || phy1_mplla != t1) { + printf("RKEP: GRF:904=%x, a04=%x...\n", phy0_mplla, phy1_mplla); + + t0 = phy0_mplla; + t1 = phy1_mplla; + if (phy0_mplla == 0xF && phy1_mplla == 0xF) + break; + } + + udelay(10); + } + + /* PHY config: no config need for snps3.0phy */ + + /* Enable PCIe Access in firewall and master secure mode */ + writel(0xffff0000, FIREWALL_PCIE_MASTER_SEC); + writel(0x01800000, FIREWALL_PCIE_ACCESS); +} +#elif CONFIG_ROCKCHIP_RK3568 + +static void pcie_board_init(void) +{ + /* to-do */ +} + +static const u16 phy_fw[] = { + #include "./../../../drivers/phy/phy-rockchip-snps-pcie3.fw" +}; + +#define GRF_PCIE30PHY_RK3568_CON1 0x4 +#define GRF_PCIE30PHY_RK3568_CON3 0xC +#define GRF_PCIE30PHY_RK3568_CON4 0x10 +#define GRF_PCIE30PHY_RK3568_CON5 0x14 +#define GRF_PCIE30PHY_RK3568_CON6 0x18 +#define GRF_PCIE30PHY_RK3568_CON9 0x24 +#define GRF_PCIE30PHY_RK3568_STATUS0 0x80 +#define RK3568_SRAM_INIT_DONE(reg) ((reg) & BIT(14)) + +#define PMUCRU_BASE 0xFDD00000 +#define PMUCRU_PMUGATE_CON02 (PMUCRU_BASE + 0x188) + +#define CRU_BASE 0xFDD20000 +#define CRU_GATE_CON12 (CRU_BASE + 0x330) +#define CRU_GATE_CON13 (CRU_BASE + 0x334) +#define CRU_GATE_CON33 (CRU_BASE + 0x384) +#define CRU_SOFTRST_CON12 (CRU_BASE + 0x430) +#define CRU_SOFTRST_CON27 (CRU_BASE + 0x46c) + +#define PCIE30_PHY_GRF 0xFDCB8000 + +void pcie_cru_init(void) +{ + u32 i, reg; + void __iomem *mmio = (void __iomem *)0xFE8C0000; + + /* Enable phy and controoler clk */ + writel(0xffff0000, PMUCRU_PMUGATE_CON02); + writel(0xffff0000, CRU_GATE_CON12); + writel(0xffff0000, CRU_GATE_CON13); + writel(0xffff0000, CRU_GATE_CON33); + writel(0xffff0000, CRU_SOFTRST_CON27); + + writel(0x40004000, CRU_SOFTRST_CON27); + writel(0x80008000, PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON9); + + writel((0x1 << 15) | (0x1 << 31), + PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON9); //map to access sram + +#ifdef PCIE_ENABLE_SRNS_PLL_REFCLK + /* use internal clock */ + writel(0x0 | (0x1 << 31), PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON3); + + /* rx0_cmn_refclk_mode disabled */ + writel((0x0) | (0x1 << 25), PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON5); + /* rx1_cmn_refclk_mode disabled */ + writel((0x0) | (0x1 << 25), PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON6); +#endif + + writel((0x0 << 14) | (0x1 << (14 + 16)), + PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON4); //sdram_ld_done + writel((0x0 << 13) | (0x1 << (13 + 16)), + PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON4); //sdram_bypass + + writel(0x40000000, CRU_SOFTRST_CON27); + + udelay(5); + printf("RKEP: sram initial\n"); + while (1) { + reg = readl(PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_STATUS0); + if (RK3568_SRAM_INIT_DONE(reg)) + break; + } + printf("RKEP: sram init done\n"); + + writel((0x3 << 8) | (0x3 << (8 + 16)), + PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON9); //map to access sram + for (i = 0; i < ARRAY_SIZE(phy_fw); i++) + writel(phy_fw[i], mmio + (i << 2)); + + printf("RKEP: snps pcie3phy FW update! size %ld\n", ARRAY_SIZE(phy_fw)); + writel((0x0 << 8) | (0x3 << (8 + 16)), + PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON9); + writel((0x1 << 14) | (0x1 << (14 + 16)), + PCIE30_PHY_GRF + GRF_PCIE30PHY_RK3568_CON4); //sdram_ld_done + + writel(0xffff0000, CRU_SOFTRST_CON12); + writel(0x100010, PCIE_SNPS_APB_BASE + 0x180); + + udelay(1); +} +#endif + +static void pcie_ep_init(void) +{ + u32 val; + void *dbi_base = (void *)PCIE_SNPS_DBI_BASE; + u64 apb_base = PCIE_SNPS_APB_BASE; + int i, retries = 0; + +#ifdef PCIE_ENABLE_SRNS_PLL_REFCLK + printep("RefClock in SRNS clock mode\n"); +#else + printep("RefClock in common clock_mode\n"); +#endif + + /* + * ltssm_enable enhance mode and enable delaying the link training + * after Hot Reset + */ + writel(0x120012, apb_base + 0x180); + + /* Unmask pm_turnoff_int */ + writel(0x04000000, apb_base + 0x18); + + /* PortLorgic DBI_RO_WR_EN */ + val = readl((dbi_base + 0x8bc)); + val |= 0x1; + writel(val, dbi_base + 0x8bc); + +reinit: + pcie_bar_init(dbi_base); + pcie_inbound_config(); + + /* Device PID, DID */ + writel(0x1d87, dbi_base + 0x00); + writel(0x356a, dbi_base + 0x02); + /* Device Class: Processing accelerators */ + writel(0x1200, dbi_base + 0x0a); + + pcie_link_set_max_speed(dbi_base, PCI_EXP_LNKCTL2_TLS_8_0GT); + +#ifdef CONFIG_ROCKCHIP_RK3588 + pcie_link_set_lanes(dbi_base, 4); +#elif CONFIG_ROCKCHIP_RK3568 + pcie_link_set_lanes(dbi_base, 2); +#endif + + /* EP mode */ + writel(0xf00000, apb_base); + udelay(100); + + /* Enable EP mem/io access */ + val = readl(dbi_base + 0x4); + writel(val | 0x6, dbi_base + 0x4); + + if (retries) /* Set app_dly2_done to enable app_ltssm_enable */ + writel(0x80008, apb_base + 0x180); + else /* Enable LTSSM */ + writel(0xc000c, apb_base); + printep("init PCIe fast Link up\n"); + pcie_devmode_update(RKEP_MODE_LOADER, RKEP_SMODE_LNKRDY); + + /* Waiting for Link up */ + while (1) { + val = readl(apb_base + 0x300); + if (((val & 0x3ffff) & ((0x3 << 16) | 0x11)) == 0x30011) + break; + mdelay(1); + } + printep("Link up %x\n", val); + mdelay(3); + + /* Wait for link stable */ + for (i = 0; i < 10000; i++) { + val = readl(apb_base + 0x10); + if (val & 0x4) { + writel(0x4, apb_base + 0x10); + printep("Link is reset, int status misc=%x\n", val); + if (retries < 3) { + retries++; + goto reinit; + } else { + break; + } + } + udelay(1); + } + printep("Done\n"); + pcie_devmode_update(RKEP_MODE_LOADER, RKEP_SMODE_LNKUP); +} + +void rockchip_pcie_ep_init(void) +{ + u32 val; + + printf("\nRKEP: Init PCIe EP\n"); + pcie_bar0_header_init(); + +#ifdef CONFIG_ROCKCHIP_RK3588 + writel(0x1 << 23 | 0x1 << 21, PMU_PWR_GATE_SFTCON1); + udelay(10); +#endif + /* Re-in pcie initial */ + val = readl(PCIE_SNPS_APB_BASE + 0x300); + if (((val & 0x3ffff) & ((0x3 << 16))) == 0x30000) { + printf("RKEP: already link up\n"); + return; + } + + pcie_board_init(); + /* CRU and PHY Init */ + pcie_cru_init(); + + pcie_ep_init(); +} diff --git a/u-boot/arch/arm/mach-rockchip/uimage.c b/u-boot/arch/arm/mach-rockchip/uimage.c index e805b12..e5f8416 100644 --- a/u-boot/arch/arm/mach-rockchip/uimage.c +++ b/u-boot/arch/arm/mach-rockchip/uimage.c @@ -12,8 +12,8 @@ #include <asm/arch/resource_img.h> #include <asm/arch/uimage.h> -static int uimage_load_one(struct blk_desc *dev_desc, disk_partition_t *part, - int pos_off, int size, void *dst) +int uimage_load_one(struct blk_desc *dev_desc, disk_partition_t *part, + int pos_off, int size, void *dst) { u32 blknum, blkoff; u32 unused; @@ -183,31 +183,23 @@ return 0; } -int uimage_init_resource(void) -{ - struct blk_desc *dev_desc; - disk_partition_t part; - image_header_t *hdr; - char *part_name; - ulong data, offset; - ulong size; #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE - ulong dst; - int idx = 3; -#endif - int ret; +int uimage_init_resource(struct blk_desc *dev_desc) +{ + disk_partition_t part; + ulong data, offset, size; + image_header_t *hdr; + char *part_name = PART_BOOT; + int ret, idx = 3; + void *buf; - dev_desc = rockchip_get_bootdev(); - if (!dev_desc) { - printf("No dev_desc!\n"); - return ENODEV; - } + if (!dev_desc) + return -ENODEV; +#ifndef CONFIG_ANDROID_AB if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY) part_name = PART_RECOVERY; - else - part_name = PART_BOOT; - +#endif if (part_get_info_by_name(dev_desc, part_name, &part) < 0) { UIMG_I("No %s partition\n", part_name); return -ENODEV; @@ -215,35 +207,28 @@ hdr = uimage_get_hdr(dev_desc, &part); if (!hdr) - return -ENODEV; + return -EAGAIN; image_multi_getimg(hdr, idx, &data, &size); offset = data - (ulong)hdr; free(hdr); -#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE - ulong fdt_addr; - - /* reserve enough space before fdt */ - fdt_addr = env_get_ulong("fdt_addr_r", 16, 0); - dst = (ulong)fdt_addr - - ALIGN(size, dev_desc->blksz) - CONFIG_SYS_FDT_PAD; - ret = uimage_load_one(dev_desc, &part, offset, size, (void *)dst); - if (ret) { - UIMG_I("Failed to load resource file, ret=%d\n", ret); - return ret; - } - - if (!sysmem_alloc_base(MEM_RESOURCE, (phys_addr_t)dst, - ALIGN(size, RK_BLK_SIZE))) + buf = memalign(ARCH_DMA_MINALIGN, ALIGN(size, dev_desc->blksz)); + if (!buf) return -ENOMEM; - ret = resource_create_ram_list(dev_desc, (void *)dst); + printf("RESC: '%s', blk@0x%08lx\n", part.name, + part.start + (offset / dev_desc->blksz)); + ret = uimage_load_one(dev_desc, &part, offset, size, buf); + if (ret) + return ret; + + ret = resource_setup_ram_list(dev_desc, buf); if (ret) { - UIMG_I("Failed to create resource list, ret=%d\n", ret); + UIMG_I("Failed to setup resource ram list, ret=%d\n", ret); return ret; } -#endif return 0; } +#endif diff --git a/u-boot/arch/arm/mach-rockchip/vendor.c b/u-boot/arch/arm/mach-rockchip/vendor.c index fce520d..2a146b7 100644 --- a/u-boot/arch/arm/mach-rockchip/vendor.c +++ b/u-boot/arch/arm/mach-rockchip/vendor.c @@ -10,6 +10,7 @@ #include <boot_rkimg.h> #include <nand.h> #include <part.h> +#include <fdt_support.h> /* tag for vendor check */ #define VENDOR_TAG 0x524B5644 @@ -20,6 +21,9 @@ /* align to 64 bytes */ #define VENDOR_BTYE_ALIGN 0x3F #define VENDOR_BLOCK_SIZE 512 + +#define PAGE_ALGIN_SIZE (4096uL) +#define PAGE_ALGIN_MASK (~(PAGE_ALGIN_SIZE - 1)) /* --- Emmc define --- */ /* Starting address of the Vendor in memory. */ @@ -493,13 +497,14 @@ /* Initialize */ bootdev_type = dev_desc->if_type; - /* Always use, no need to release */ - buffer = (u8 *)malloc(size); + /* Always use, no need to release, align to page size for kerenl reserved memory */ + buffer = (u8 *)memalign(PAGE_ALGIN_SIZE, size); if (!buffer) { printf("[Vendor ERROR]:Malloc failed!\n"); ret = -ENOMEM; goto out; } + /* Pointer initialization */ vendor_info.hdr = (struct vendor_hdr *)buffer; vendor_info.item = (struct vendor_item *)(buffer + sizeof(struct vendor_hdr)); @@ -566,6 +571,29 @@ return ret; } +void vendor_storage_fixup(void *blob) +{ + unsigned long size; + unsigned long start; + ulong offset; + + /* init vendor storage */ + if (!bootdev_type) { + if (vendor_storage_init() < 0) + return; + } + + offset = fdt_node_offset_by_compatible(blob, 0, "rockchip,vendor-storage-rm"); + if (offset >= 0) { + start = (unsigned long)vendor_info.hdr; + size = (unsigned long)((void *)vendor_info.version2 - (void *)vendor_info.hdr); + size += 4; + fdt_update_reserved_memory(blob, "rockchip,vendor-storage-rm", + (u64)start, + (u64)size); + } +} + /* * @id: item id, first 4 id is occupied: * VENDOR_SN_ID diff --git a/u-boot/board/rockchip/evb_rk3528/Kconfig b/u-boot/board/rockchip/evb_rk3528/Kconfig new file mode 100644 index 0000000..d0f6599 --- /dev/null +++ b/u-boot/board/rockchip/evb_rk3528/Kconfig @@ -0,0 +1,15 @@ +if TARGET_EVB_RK3528 + +config SYS_BOARD + default "evb_rk3528" + +config SYS_VENDOR + default "rockchip" + +config SYS_CONFIG_NAME + default "evb_rk3528" + +config BOARD_SPECIFIC_OPTIONS # dummy + def_bool y + +endif diff --git a/u-boot/board/rockchip/evb_rk3528/Makefile b/u-boot/board/rockchip/evb_rk3528/Makefile new file mode 100644 index 0000000..1fa46e5 --- /dev/null +++ b/u-boot/board/rockchip/evb_rk3528/Makefile @@ -0,0 +1,7 @@ +# +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c) 2020 Rockchip Electronics Co., Ltd +# + +obj-y += evb_rk3528.o diff --git a/u-boot/board/rockchip/evb_rk3528/evb_rk3528.c b/u-boot/board/rockchip/evb_rk3528/evb_rk3528.c new file mode 100644 index 0000000..d0c1e55 --- /dev/null +++ b/u-boot/board/rockchip/evb_rk3528/evb_rk3528.c @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + * + * (C) Copyright 2020 Rockchip Electronics Co., Ltd + */ + +#include <common.h> +#include <dwc3-uboot.h> +#include <usb.h> + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_USB_DWC3 +static struct dwc3_device dwc3_device_data = { + .maximum_speed = USB_SPEED_HIGH, + .base = 0xfe500000, + .dr_mode = USB_DR_MODE_PERIPHERAL, + .index = 0, + .dis_u2_susphy_quirk = 1, + .usb2_phyif_utmi_width = 16, +}; + +int usb_gadget_handle_interrupts(void) +{ + dwc3_uboot_handle_interrupt(0); + return 0; +} + +int board_usb_init(int index, enum usb_init_type init) +{ + return dwc3_uboot_init(&dwc3_device_data); +} +#endif diff --git a/u-boot/board/rockchip/evb_rk3562/Kconfig b/u-boot/board/rockchip/evb_rk3562/Kconfig new file mode 100644 index 0000000..810e563 --- /dev/null +++ b/u-boot/board/rockchip/evb_rk3562/Kconfig @@ -0,0 +1,15 @@ +if TARGET_EVB_RK3562 + +config SYS_BOARD + default "evb_rk3562" + +config SYS_VENDOR + default "rockchip" + +config SYS_CONFIG_NAME + default "evb_rk3562" + +config BOARD_SPECIFIC_OPTIONS # dummy + def_bool y + +endif diff --git a/u-boot/board/rockchip/evb_rk3562/Makefile b/u-boot/board/rockchip/evb_rk3562/Makefile new file mode 100644 index 0000000..5b6aff0 --- /dev/null +++ b/u-boot/board/rockchip/evb_rk3562/Makefile @@ -0,0 +1,7 @@ +# +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright (c) 2022 Rockchip Electronics Co., Ltd +# + +obj-y += evb_rk3562.o diff --git a/u-boot/board/rockchip/evb_rk3562/evb_rk3562.c b/u-boot/board/rockchip/evb_rk3562/evb_rk3562.c new file mode 100644 index 0000000..a7be427 --- /dev/null +++ b/u-boot/board/rockchip/evb_rk3562/evb_rk3562.c @@ -0,0 +1,33 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + * + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + */ + +#include <common.h> +#include <dwc3-uboot.h> +#include <usb.h> + +DECLARE_GLOBAL_DATA_PTR; + +#ifdef CONFIG_USB_DWC3 +static struct dwc3_device dwc3_device_data = { + .maximum_speed = USB_SPEED_HIGH, + .base = 0xfe500000, + .dr_mode = USB_DR_MODE_PERIPHERAL, + .index = 0, + .dis_u2_susphy_quirk = 1, + .usb2_phyif_utmi_width = 16, +}; + +int usb_gadget_handle_interrupts(void) +{ + dwc3_uboot_handle_interrupt(0); + return 0; +} + +int board_usb_init(int index, enum usb_init_type init) +{ + return dwc3_uboot_init(&dwc3_device_data); +} +#endif diff --git a/u-boot/cmd/Kconfig b/u-boot/cmd/Kconfig index 8273ed1..1efdeae 100644 --- a/u-boot/cmd/Kconfig +++ b/u-boot/cmd/Kconfig @@ -1020,6 +1020,13 @@ This provides various sub-commands to initialise and configure the Turndra tsi148 device. See the command help for full details. +config CMD_UFS + bool "Enable UFS - Universal Flash Subsystem commands" + depends on UFS + help + "This provides commands to initialise and configure universal flash + subsystem devices" + config CMD_UNIVERSE bool "universe - Command to set up the Turndra Universe controller" help @@ -1181,15 +1188,7 @@ endmenu -config CMD_MEMTESTER - bool "Enable memtester for ddr" - help - This enables memtester for ddr. - -config CMD_DDR_TEST_TOOL - bool "Enable ddr test tool" - help - This enable ddr test tool code. +source "cmd/ddr_tool/Kconfig" menu "Misc commands" diff --git a/u-boot/cmd/Makefile b/u-boot/cmd/Makefile index 3f71a35..d4c12a3 100644 --- a/u-boot/cmd/Makefile +++ b/u-boot/cmd/Makefile @@ -91,8 +91,7 @@ obj-$(CONFIG_ID_EEPROM) += mac.o obj-$(CONFIG_CMD_MD5SUM) += md5sum.o obj-$(CONFIG_CMD_MEMORY) += mem.o -obj-$(CONFIG_CMD_MEMTESTER) += memtester/ -obj-$(CONFIG_CMD_DDR_TEST_TOOL) += ddr_tool/ +obj-$(CONFIG_CMD_DDR_TOOL) += ddr_tool/ obj-$(CONFIG_CMD_IO) += io.o obj-$(CONFIG_CMD_MFSL) += mfsl.o obj-$(CONFIG_CMD_MII) += mii.o @@ -149,6 +148,7 @@ obj-$(CONFIG_CMD_UNZIP) += unzip.o obj-$(CONFIG_CMD_LZMADEC) += lzmadec.o obj-$(CONFIG_CMD_SCRIPT_UPDATE) += script_update.o +obj-$(CONFIG_CMD_UFS) += ufs.o obj-$(CONFIG_CMD_USB) += usb.o disk.o obj-$(CONFIG_CMD_FASTBOOT) += fastboot.o obj-$(CONFIG_CMD_FS_UUID) += fs_uuid.o diff --git a/u-boot/cmd/boot_android.c b/u-boot/cmd/boot_android.c index 98a2893..de6b8e0 100755 --- a/u-boot/cmd/boot_android.c +++ b/u-boot/cmd/boot_android.c @@ -13,6 +13,7 @@ #include <common.h> #include <bootm.h> #include <command.h> +#include <mp_boot.h> #include <android_bootloader_message.h> #include <android_avb/rk_avb_ops_user.h> #include <android_avb/avb_atx_ops.h> @@ -30,6 +31,9 @@ if (argc > 5) return CMD_RET_USAGE; +#ifdef CONFIG_MP_BOOT_BOOTM + mpb_post(5); +#endif if (argc >= 5) { load_address = simple_strtoul(argv[4], &addr_arg_endp, 16); if (addr_arg_endp == argv[4] || *addr_arg_endp != '\0') diff --git a/u-boot/cmd/bootfit.c b/u-boot/cmd/bootfit.c index a0efec7..3a8b75b 100644 --- a/u-boot/cmd/bootfit.c +++ b/u-boot/cmd/bootfit.c @@ -103,7 +103,6 @@ strcat(slot_info, slot_suffix); env_update("bootargs", slot_info); - ab_update_root_uuid(); #endif ret = do_bootm_states(NULL, 0, ARRAY_SIZE(bootm_args), bootm_args, diff --git a/u-boot/cmd/cache.c b/u-boot/cmd/cache.c index 37ab345..004dcc2 100644 --- a/u-boot/cmd/cache.c +++ b/u-boot/cmd/cache.c @@ -54,7 +54,24 @@ static int do_dcache(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { + ulong start, size; + switch (argc) { + case 4: + start = simple_strtoul(argv[2], NULL, 16); + size = simple_strtoul(argv[3], NULL, 16); + + switch (parse_argv(argv[1])) { + case 2: + printf("flush dcache: 0x%08lx - 0x%08lx\n", start, start + size); + flush_dcache_range(start, start + size); + break; + case 3: + printf("invalidate dcache: 0x%08lx - 0x%08lx\n", start, start + size); + invalidate_dcache_range(start, start + size); + break; + } + break; case 2: /* on / off */ switch (parse_argv(argv[1])) { case 0: @@ -65,6 +82,9 @@ break; case 2: flush_dcache_all(); + break; + case 3: + printf("error: dcache invalidate require [start] [size]\n"); break; } break; @@ -80,7 +100,9 @@ static int parse_argv(const char *s) { - if (strcmp(s, "flush") == 0) + if (strcmp(s, "invalidate") == 0) + return 3; + else if (strcmp(s, "flush") == 0) return 2; else if (strcmp(s, "on") == 0) return 1; @@ -99,8 +121,8 @@ ); U_BOOT_CMD( - dcache, 2, 1, do_dcache, + dcache, 4, 1, do_dcache, "enable or disable data cache", - "[on, off, flush]\n" + "[on, off, flush, invalidate] [start] [size]\n" " - enable, disable, or flush data (writethrough) cache" ); diff --git a/u-boot/cmd/ddr_tool/Kconfig b/u-boot/cmd/ddr_tool/Kconfig new file mode 100644 index 0000000..0c83e8d --- /dev/null +++ b/u-boot/cmd/ddr_tool/Kconfig @@ -0,0 +1,32 @@ +menu "DDR Tool" + +config CMD_DDR_TOOL + bool "Enable DDR Tool" + help + This enable ddr tool such as ddr dq eye, ddr test tool, memtester and stressapptest. + +config CMD_DDR_DQ_EYE + bool "Enable DDR DQ eye fuction" + depends on CMD_DDR_TOOL + help + This enable ddr dq eye fuction. + +config CMD_DDR_TEST + bool "Enable ddr test tool" + depends on CMD_DDR_TOOL + help + This enable ddr test tool code. + +config CMD_MEMTESTER + bool "Enable memtester for ddr" + depends on CMD_DDR_TOOL + help + This enables memtester for ddr. + +config CMD_STRESSAPPTEST + bool "Enable stressapptest for ddr" + depends on CMD_DDR_TOOL + help + This enables stressapptest for ddr. + +endmenu diff --git a/u-boot/cmd/ddr_tool/Makefile b/u-boot/cmd/ddr_tool/Makefile index 788b400..7fdf4fa 100644 --- a/u-boot/cmd/ddr_tool/Makefile +++ b/u-boot/cmd/ddr_tool/Makefile @@ -1,25 +1,12 @@ # -# (C) Copyright 2018 Rockchip Electronics Co., Ltd. +# (C) Copyright 2023 Rockchip Electronics Co., Ltd. # # SPDX-License-Identifier: GPL-2.0+ # -# We don't want the bootrom-helper present in a full U-Boot build, as -# this may have entered from ATF with the stack-pointer pointing to -# inaccessible/protected memory (and the bootrom-helper assumes that -# the stack-pointer is valid before switching to the U-Boot stack). -ifdef CONFIG_ROCKCHIP_PX30 -obj-$(CONFIG_CMD_DDR_TEST_TOOL) = ddr_test_px30.o -endif -ifdef CONFIG_ROCKCHIP_RK3328 -obj-$(CONFIG_CMD_DDR_TEST_TOOL) = ddr_test_rk3328.o -endif -ifdef CONFIG_ROCKCHIP_RK1808 -obj-$(CONFIG_CMD_DDR_TEST_TOOL) = ddr_test_rk1808.o -endif -ifndef CONFIG_CMD_MEMTESTER -obj-$(CONFIG_CMD_DDR_TEST_TOOL) += ../memtester/ddr_tester_common.o -obj-$(CONFIG_CMD_DDR_TEST_TOOL) += ../memtester/io_map.o -endif -obj-$(CONFIG_CMD_DDR_TEST_TOOL) += ddr_dq_eye.o +obj-$(CONFIG_CMD_DDR_TOOL) += ddr_tool_common.o ddr_tool_mp.o io_map.o +obj-$(CONFIG_CMD_DDR_DQ_EYE) += ddr_dq_eye/ +obj-$(CONFIG_CMD_DDR_TEST) += ddr_test/ +obj-$(CONFIG_CMD_MEMTESTER) += memtester/ +obj-$(CONFIG_CMD_STRESSAPPTEST) += stressapptest/ diff --git a/u-boot/cmd/ddr_tool/ddr_dq_eye/Makefile b/u-boot/cmd/ddr_tool/ddr_dq_eye/Makefile new file mode 100644 index 0000000..60f072a --- /dev/null +++ b/u-boot/cmd/ddr_tool/ddr_dq_eye/Makefile @@ -0,0 +1,7 @@ +# +# (C) Copyright 2023 Rockchip Electronics Co., Ltd. +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-$(CONFIG_CMD_DDR_DQ_EYE) += ddr_dq_eye.o diff --git a/u-boot/cmd/ddr_tool/ddr_dq_eye.c b/u-boot/cmd/ddr_tool/ddr_dq_eye/ddr_dq_eye.c similarity index 100% rename from u-boot/cmd/ddr_tool/ddr_dq_eye.c rename to u-boot/cmd/ddr_tool/ddr_dq_eye/ddr_dq_eye.c diff --git a/u-boot/cmd/ddr_tool/ddr_test/Makefile b/u-boot/cmd/ddr_tool/ddr_test/Makefile new file mode 100644 index 0000000..320a915 --- /dev/null +++ b/u-boot/cmd/ddr_tool/ddr_test/Makefile @@ -0,0 +1,20 @@ +# +# (C) Copyright 2018 Rockchip Electronics Co., Ltd. +# +# SPDX-License-Identifier: GPL-2.0+ +# + +# We don't want the bootrom-helper present in a full U-Boot build, as +# this may have entered from ATF with the stack-pointer pointing to +# inaccessible/protected memory (and the bootrom-helper assumes that +# the stack-pointer is valid before switching to the U-Boot stack). + +ifdef CONFIG_ROCKCHIP_PX30 +obj-$(CONFIG_CMD_DDR_TEST) = ddr_test_px30.o +endif +ifdef CONFIG_ROCKCHIP_RK1808 +obj-$(CONFIG_CMD_DDR_TEST) = ddr_test_rk1808.o +endif +ifdef CONFIG_ROCKCHIP_RK3328 +obj-$(CONFIG_CMD_DDR_TEST) = ddr_test_rk3328.o +endif diff --git a/u-boot/cmd/ddr_tool/ddr_test_px30.S b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_px30.S similarity index 99% rename from u-boot/cmd/ddr_tool/ddr_test_px30.S rename to u-boot/cmd/ddr_tool/ddr_test/ddr_test_px30.S index a6e9854..dc34485 100644 --- a/u-boot/cmd/ddr_tool/ddr_test_px30.S +++ b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_px30.S @@ -1814,8 +1814,8 @@ .file 36 "include/log.h" .file 37 "include/stdio.h" .file 38 "./arch/arm/include/asm/arch/sdram.h" - .file 39 "cmd/ddr_tool/../memtester/io_map.h" - .file 40 "cmd/ddr_tool/../memtester/ddr_tester_common.h" + .file 39 "cmd/ddr_tool/io_map.h" + .file 40 "cmd/ddr_tool/ddr_tool_common.h" .file 41 "include/vsprintf.h" .section .debug_info,"",@progbits .Ldebug_info0: diff --git a/u-boot/cmd/ddr_tool/ddr_test_rk1808.S b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk1808.S similarity index 99% rename from u-boot/cmd/ddr_tool/ddr_test_rk1808.S rename to u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk1808.S index 156f79f..a1e1217 100644 --- a/u-boot/cmd/ddr_tool/ddr_test_rk1808.S +++ b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk1808.S @@ -1604,8 +1604,8 @@ .file 34 "include/log.h" .file 35 "include/stdio.h" .file 36 "./arch/arm/include/asm/arch/sdram.h" - .file 37 "cmd/ddr_tool/../memtester/io_map.h" - .file 38 "cmd/ddr_tool/../memtester/ddr_tester_common.h" + .file 37 "cmd/ddr_tool/io_map.h" + .file 38 "cmd/ddr_tool/ddr_tool_common.h" .file 39 "include/vsprintf.h" .section .debug_info,"",@progbits .Ldebug_info0: diff --git a/u-boot/cmd/ddr_tool/ddr_test_px30.S b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk3328.S similarity index 99% copy from u-boot/cmd/ddr_tool/ddr_test_px30.S copy to u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk3328.S index a6e9854..dc34485 100644 --- a/u-boot/cmd/ddr_tool/ddr_test_px30.S +++ b/u-boot/cmd/ddr_tool/ddr_test/ddr_test_rk3328.S @@ -1814,8 +1814,8 @@ .file 36 "include/log.h" .file 37 "include/stdio.h" .file 38 "./arch/arm/include/asm/arch/sdram.h" - .file 39 "cmd/ddr_tool/../memtester/io_map.h" - .file 40 "cmd/ddr_tool/../memtester/ddr_tester_common.h" + .file 39 "cmd/ddr_tool/io_map.h" + .file 40 "cmd/ddr_tool/ddr_tool_common.h" .file 41 "include/vsprintf.h" .section .debug_info,"",@progbits .Ldebug_info0: diff --git a/u-boot/cmd/ddr_tool/ddr_test_rk3328.S b/u-boot/cmd/ddr_tool/ddr_test_rk3328.S deleted file mode 100644 index a6e9854..0000000 --- a/u-boot/cmd/ddr_tool/ddr_test_rk3328.S +++ /dev/null @@ -1,9940 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ -/* - * Copyright (C) 2019 Rockchip Electronics Co., Ltd. - */ - - .arch armv8-a+nosimd - .file "ddr_test_code.c" - .text -.Ltext0: - .cfi_sections .debug_frame - .section .text.crosstalk,"ax",@progbits - .align 2 - .global crosstalk - .type crosstalk, %function -crosstalk: -.LFB200: - .file 1 "cmd/ddr_tool/crosstalk.c" - .loc 1 46 0 - .cfi_startproc -.LVL0: - stp x29, x30, [sp, -144]! - .cfi_def_cfa_offset 144 - .cfi_offset 29, -144 - .cfi_offset 30, -136 - add x29, sp, 0 - .cfi_def_cfa_register 29 - stp x21, x22, [sp, 32] - .cfi_offset 21, -112 - .cfi_offset 22, -104 - .loc 1 66 0 - adrp x22, .LC2 - .loc 1 46 0 - stp x23, x24, [sp, 48] - .cfi_offset 23, -96 - .cfi_offset 24, -88 - mov x23, x0 - stp x19, x20, [sp, 16] - mov x24, x1 - stp x25, x26, [sp, 64] - .loc 1 63 0 - adrp x0, .LC1 -.LVL1: - .loc 1 46 0 - stp x27, x28, [sp, 80] - .cfi_offset 19, -128 - .cfi_offset 20, -120 - .cfi_offset 25, -80 - .cfi_offset 26, -72 - .cfi_offset 27, -64 - .cfi_offset 28, -56 - .loc 1 63 0 - add x0, x0, :lo12:.LC1 - bl printf -.LVL2: - .loc 1 71 0 - add x21, x29, 112 - .loc 1 66 0 - add x0, x22, :lo12:.LC2 - .loc 1 68 0 - adrp x25, .LC3 - .loc 1 66 0 - str x0, [x29, 104] - .loc 1 64 0 - mov w20, 0 - .loc 1 68 0 - add x0, x25, :lo12:.LC3 - str x0, [x29, 96] -.LVL3: -.L6: - .loc 1 66 0 - ldr x0, [x29, 104] - .loc 1 71 0 - mov w26, 1 - .loc 1 66 0 - mov w1, w20 - .loc 1 71 0 - lsl w26, w26, w20 - .loc 1 65 0 - mov w28, -1 - .loc 1 67 0 - mov w27, 0 - .loc 1 66 0 - bl printf -.LVL4: -.L5: - .loc 1 68 0 - ldr x0, [x29, 96] - mov w1, w27 - .loc 1 69 0 - mvn w28, w28 -.LVL5: - mov x19, 0 - .loc 1 68 0 - bl printf -.LVL6: -.L2: - .loc 1 71 0 discriminator 3 - eor w0, w26, w28 - str w0, [x19, x21] - add x19, x19, 4 - .loc 1 72 0 discriminator 3 - mvn w28, w28 -.LVL7: - .loc 1 70 0 discriminator 3 - cmp x19, 32 - bne .L2 - .loc 1 74 0 - mov w1, w19 - mov x0, x21 - bl data_cpu_2_io -.LVL8: - .loc 1 75 0 - mov x3, x24 - mov x2, x23 - mov w1, w19 - mov x0, x21 - bl write_buf_to_ddr -.LVL9: - .loc 1 76 0 - mov w4, 1 - mov x3, x24 - mov x2, x23 - mov w1, w19 - mov x0, x21 - bl cmp_buf_data -.LVL10: - cbz x0, .L3 -.LVL11: -.L11: - .loc 1 78 0 - mov w0, -1 -.L1: - .loc 1 111 0 - ldp x19, x20, [sp, 16] - ldp x21, x22, [sp, 32] - ldp x23, x24, [sp, 48] -.LVL12: - ldp x25, x26, [sp, 64] - ldp x27, x28, [sp, 80] - ldp x29, x30, [sp], 144 - .cfi_remember_state - .cfi_restore 30 - .cfi_restore 29 - .cfi_restore 27 - .cfi_restore 28 - .cfi_restore 25 - .cfi_restore 26 - .cfi_restore 23 - .cfi_restore 24 - .cfi_restore 21 - .cfi_restore 22 - .cfi_restore 19 - .cfi_restore 20 - .cfi_def_cfa 31, 0 - ret -.LVL13: -.L3: - .cfi_restore_state - .loc 1 67 0 discriminator 2 - add w27, w27, 1 -.LVL14: - cmp w27, 2 - bne .L5 - .loc 1 64 0 discriminator 2 - add w20, w20, 1 -.LVL15: - cmp w20, 32 - bne .L6 - .loc 1 85 0 - adrp x0, .LC4 - add x0, x0, :lo12:.LC4 - bl printf -.LVL16: - .loc 1 86 0 - mov x0, 128 - bl malloc -.LVL17: - mov x21, x0 -.LVL18: - .loc 1 87 0 - cbnz x0, .L7 - .loc 1 88 0 - adrp x0, .LC5 -.LVL19: - mov x1, 128 - add x0, x0, :lo12:.LC5 - bl printf -.LVL20: -.L7: - adrp x26, .LANCHOR0 - .loc 1 91 0 - add x27, x22, :lo12:.LC2 -.LVL21: - .loc 1 93 0 - add x25, x25, :lo12:.LC3 - .loc 1 98 0 - add x26, x26, :lo12:.LANCHOR0 - .loc 1 69 0 - mov w20, 0 -.LVL22: -.L14: - .loc 1 92 0 - mov w22, 0 - .loc 1 96 0 - mov w28, 1 - .loc 1 91 0 - mov w1, w20 - mov x0, x27 - bl printf -.LVL23: -.L13: - .loc 1 93 0 - mov w1, w22 - mov x0, x25 - bl printf -.LVL24: - .loc 1 96 0 - mov x19, 0 - lsl w1, w28, w22 -.LVL25: -.L10: - ldr w0, [x19, x26] - .loc 1 95 0 - cbz w20, .L8 - .loc 1 96 0 - eor w0, w0, w1 -.L8: - .loc 1 98 0 - str w0, [x21, x19] - add x19, x19, 4 - .loc 1 94 0 - cmp x19, 128 - bne .L10 - .loc 1 100 0 - mov w1, w19 - mov x0, x21 - bl data_cpu_2_io -.LVL26: - .loc 1 101 0 - mov x3, x24 - mov x2, x23 - mov w1, w19 - mov x0, x21 - bl write_buf_to_ddr -.LVL27: - .loc 1 103 0 - mov w4, 1 - mov x3, x24 - mov x2, x23 - mov w1, w19 - mov x0, x21 - bl cmp_buf_data -.LVL28: - cbnz x0, .L11 - .loc 1 106 0 - cbz w20, .L12 - .loc 1 92 0 discriminator 2 - add w22, w22, 1 -.LVL29: - cmp w22, 32 - bne .L13 -.L12: - .loc 1 90 0 discriminator 2 - add w20, w20, 1 -.LVL30: - cmp w20, 2 - bne .L14 - .loc 1 110 0 - mov w0, 0 - b .L1 - .cfi_endproc -.LFE200: - .size crosstalk, .-crosstalk - .section .text.set_ddr_freq,"ax",@progbits - .align 2 - .weak set_ddr_freq - .type set_ddr_freq, %function -set_ddr_freq: -.LFB253: - .file 2 "cmd/ddr_tool/ddr_tool.c" - .loc 2 45 0 - .cfi_startproc -.LVL31: - .loc 2 47 0 - mov w0, 0 -.LVL32: - ret - .cfi_endproc -.LFE253: - .size set_ddr_freq, .-set_ddr_freq - .section .text.set_vdd_logic,"ax",@progbits - .align 2 - .weak set_vdd_logic - .type set_vdd_logic, %function -set_vdd_logic: -.LFB254: - .loc 2 50 0 - .cfi_startproc -.LVL33: - .loc 2 52 0 - mov w0, -1 -.LVL34: - ret - .cfi_endproc -.LFE254: - .size set_vdd_logic, .-set_vdd_logic - .section .text.diagonalscan,"ax",@progbits - .align 2 - .global diagonalscan - .type diagonalscan, %function -diagonalscan: -.LFB268: - .file 3 "cmd/ddr_tool/diagonalscan.c" - .loc 3 16 0 - .cfi_startproc -.LVL35: - stp x29, x30, [sp, -112]! - .cfi_def_cfa_offset 112 - .cfi_offset 29, -112 - .cfi_offset 30, -104 - .loc 3 19 0 - mov x2, 32 - .loc 3 16 0 - add x29, sp, 0 - .cfi_def_cfa_register 29 - stp x21, x22, [sp, 32] - .cfi_offset 21, -80 - .cfi_offset 22, -72 - mov x22, x1 - stp x23, x24, [sp, 48] - .cfi_offset 23, -64 - .cfi_offset 24, -56 - sub x23, x1, #32 - .loc 3 19 0 - adrp x1, .LANCHOR1 -.LVL36: - add x1, x1, :lo12:.LANCHOR1 - .loc 3 16 0 - stp x19, x20, [sp, 16] - stp x25, x26, [sp, 64] - .cfi_offset 19, -96 - .cfi_offset 20, -88 - .cfi_offset 25, -48 - .cfi_offset 26, -40 - .loc 3 16 0 - mov x25, x0 - .loc 3 19 0 - add x0, x29, 80 -.LVL37: - bl memcpy -.LVL38: - .loc 3 24 0 - adrp x0, .LC6 - add x0, x0, :lo12:.LC6 - bl printf -.LVL39: - .loc 3 25 0 - bl get_page_size -.LVL40: - sxtw x19, w0 -.LVL41: - .loc 3 27 0 - tbz w19, #31, .L28 - .loc 3 28 0 - mov w1, w19 - adrp x0, .LC7 - add x0, x0, :lo12:.LC7 - bl printf -.LVL42: - .loc 3 29 0 - mov w0, -1 -.L31: -.LVL43: -.L27: - .loc 3 64 0 - ldp x19, x20, [sp, 16] -.LVL44: - ldp x21, x22, [sp, 32] - ldp x23, x24, [sp, 48] - ldp x25, x26, [sp, 64] -.LVL45: - ldp x29, x30, [sp], 112 - .cfi_remember_state - .cfi_restore 30 - .cfi_restore 29 - .cfi_restore 25 - .cfi_restore 26 - .cfi_restore 23 - .cfi_restore 24 - .cfi_restore 21 - .cfi_restore 22 - .cfi_restore 19 - .cfi_restore 20 - .cfi_def_cfa 31, 0 - ret -.LVL46: -.L28: - .cfi_restore_state - .loc 3 40 0 - lsr x22, x22, 1 -.LVL47: - add x23, x25, x23 -.LVL48: - mov w21, 0 - mov x20, 0 - .loc 3 37 0 - mov w1, 32 - add x0, x29, 80 - bl data_cpu_2_io -.LVL49: - .loc 3 39 0 - mov x2, 32 - add x1, x29, 80 - mov x0, x25 - bl memcpy -.LVL50: -.L30: - .loc 3 40 0 discriminator 1 - cmp x20, x22 - bcc .L34 - mov x0, 0 -.LVL51: - .loc 3 63 0 - b .L27 -.LVL52: -.L34: - .loc 3 41 0 - uxtw x24, w21 - mov x2, 32 - sub x26, x23, x24 - add x1, x29, 80 - mov x0, x26 - bl memcpy -.LVL53: - .loc 3 44 0 - add x2, x20, x25 - .loc 3 43 0 - mov x3, 32 - mov w4, 1 - add x2, x2, x24 - mov w1, w3 - add x0, x29, 80 - bl cmp_buf_data -.LVL54: - .loc 3 45 0 - cbnz x0, .L27 - .loc 3 48 0 - add x24, x24, 40 - add x20, x20, x19 -.LVL55: - cmp x19, x24 - add w21, w21, 8 -.LVL56: - csel w21, w21, wzr, cs -.LVL57: - .loc 3 50 0 - cmp x22, x20 - bls .L33 - .loc 3 51 0 - add x0, x25, x20 -.LVL58: - mov x2, 32 - add x1, x29, 80 - add x0, x0, x21, uxtw - bl memcpy -.LVL59: -.L33: - .loc 3 53 0 - mov x3, 32 - mov w4, 1 - mov x2, x26 - mov w1, w3 - add x0, x29, 80 - sub x23, x23, x19 - bl cmp_buf_data -.LVL60: - .loc 3 56 0 - cbz x0, .L30 - b .L27 - .cfi_endproc -.LFE268: - .size diagonalscan, .-diagonalscan - .section .text.random_test,"ax",@progbits - .align 2 - .global random_test - .type random_test, %function -random_test: -.LFB271: - .file 4 "cmd/ddr_tool/random_test.c" - .loc 4 97 0 - .cfi_startproc -.LVL61: - stp x29, x30, [sp, -112]! - .cfi_def_cfa_offset 112 - .cfi_offset 29, -112 - .cfi_offset 30, -104 -.LBB6: -.LBB7: - .loc 4 19 0 - mov x2, x1 -.LBE7: -.LBE6: - .loc 4 97 0 - add x29, sp, 0 - .cfi_def_cfa_register 29 - stp x19, x20, [sp, 16] - .cfi_offset 19, -96 - .cfi_offset 20, -88 - mov x20, x1 - stp x21, x22, [sp, 32] - mov x19, x0 -.LVL62: - stp x23, x24, [sp, 48] -.LBB12: -.LBB8: - .loc 4 19 0 - mov w1, -2139062144 -.LVL63: -.LBE8: -.LBE12: - .loc 4 97 0 - stp x27, x28, [sp, 80] - .cfi_offset 21, -80 - .cfi_offset 22, -72 - .cfi_offset 23, -64 - .cfi_offset 24, -56 - .cfi_offset 27, -32 - .cfi_offset 28, -24 -.LBB13: -.LBB9: - .loc 4 24 0 - adrp x24, .LC8 -.LBE9: -.LBE13: - .loc 4 97 0 - stp x25, x26, [sp, 64] - .cfi_offset 25, -48 - .cfi_offset 26, -40 -.LBB14: -.LBB10: - .loc 4 19 0 - bl memset -.LVL64: - .loc 4 25 0 - lsr x0, x20, 2 - .loc 4 24 0 - add x24, x24, :lo12:.LC8 - .loc 4 25 0 - str x0, [x29, 104] - .loc 4 15 0 - mov w27, 0 - .loc 4 41 0 - adrp x0, .LC9 - .loc 4 21 0 - mov w23, 1077952576 - .loc 4 41 0 - add x0, x0, :lo12:.LC9 - .loc 4 20 0 - mov w21, -2139062144 - .loc 4 23 0 - mov w22, 0 - .loc 4 41 0 - str x0, [x29, 96] -.LVL65: -.L43: - .loc 4 24 0 - mov w1, w22 - mov x0, x24 - bl printf -.LVL66: - .loc 4 25 0 - mov w1, 0 -.LVL67: -.L38: - ldr x2, [x29, 104] - uxtw x0, w1 - cmp x0, x2 - bcc .L42 -.LVL68: -.L41: - .loc 4 41 0 - ldr x0, [x29, 96] - .loc 4 23 0 - add w22, w22, 1 -.LVL69: - .loc 4 39 0 - lsr w23, w23, 1 -.LVL70: - .loc 4 40 0 - lsr w21, w21, 1 -.LVL71: - .loc 4 41 0 - bl printf -.LVL72: - .loc 4 23 0 - cmp w22, 8 - bne .L43 - mov x28, -1 - b .L40 -.LVL73: -.L42: - .loc 4 26 0 - lsl x0, x0, 2 - add x5, x19, x0 - ldr w26, [x19, x0] - .loc 4 27 0 - cmp w26, w21 - beq .L39 - .loc 4 28 0 - mov x28, x5 -.LVL74: - .loc 4 29 0 - add x1, x5, 4 -.LVL75: - mov x0, x5 - bl flush_dcache_range -.LVL76: - .loc 4 37 0 - cmn x28, #1 - .loc 4 32 0 - ldr w27, [x28] - .loc 4 37 0 - beq .L41 -.LVL77: -.L40: - .loc 4 43 0 - adrp x0, .LC10 - add x0, x0, :lo12:.LC10 - bl printf -.LVL78: - .loc 4 44 0 - cmn x28, #1 - beq .L44 - .loc 4 45 0 - adrp x0, .LC11 - mov w4, w21 - mov w3, w27 - mov w2, w26 - mov x1, x28 - add x0, x0, :lo12:.LC11 - bl printf -.LVL79: -.L57: -.LBE10: -.LBE14: -.LBB15: -.LBB16: - .loc 4 91 0 - mov w0, -1 -.L37: -.LBE16: -.LBE15: - .loc 4 105 0 - ldp x19, x20, [sp, 16] -.LVL80: - ldp x21, x22, [sp, 32] - ldp x23, x24, [sp, 48] - ldp x25, x26, [sp, 64] - ldp x27, x28, [sp, 80] - ldp x29, x30, [sp], 112 - .cfi_remember_state - .cfi_restore 30 - .cfi_restore 29 - .cfi_restore 27 - .cfi_restore 28 - .cfi_restore 25 - .cfi_restore 26 - .cfi_restore 23 - .cfi_restore 24 - .cfi_restore 21 - .cfi_restore 22 - .cfi_restore 19 - .cfi_restore 20 - .cfi_def_cfa 31, 0 - ret -.LVL81: -.L39: - .cfi_restore_state -.LBB18: -.LBB11: - .loc 4 35 0 - str w23, [x19, x0] - .loc 4 25 0 - add w1, w1, 1 -.LVL82: - b .L38 -.LVL83: -.L44: -.LBE11: -.LBE18: -.LBB19: -.LBB17: - .loc 4 64 0 - adrp x26, .LC12 - .loc 4 84 0 - adrp x24, .LC13 - .loc 4 72 0 - lsr x28, x20, 3 - .loc 4 64 0 - add x26, x26, :lo12:.LC12 - .loc 4 84 0 - add x24, x24, :lo12:.LC13 - .loc 4 72 0 - mov x27, 0 - mov x21, 0 -.LVL84: -.L51: - .loc 4 64 0 - mov x1, x21 - mov x0, x26 - bl printf -.LVL85: - .loc 4 66 0 - lsl x22, x21, 24 - lsl x0, x21, 8 - orr x22, x22, x21, lsl 32 - orr x0, x0, x21, lsl 16 - .loc 4 70 0 - mov x2, x20 - .loc 4 66 0 - orr x22, x22, x0 - lsl x0, x21, 40 - orr x0, x0, x21, lsl 48 - orr x22, x22, x0 - orr x0, x21, x21, lsl 56 - orr x22, x22, x0 -.LVL86: - .loc 4 70 0 - mov x0, x19 - mov w1, w22 - bl memset -.LVL87: - .loc 4 72 0 - mov x0, 0 -.LVL88: -.L46: - cmp x0, x28 - bne .L50 -.LVL89: -.L49: - .loc 4 84 0 - mov x0, x24 - .loc 4 63 0 - add x21, x21, 1 -.LVL90: - .loc 4 84 0 - bl printf -.LVL91: - .loc 4 63 0 - cmp x21, 256 - bne .L51 - mov x23, -1 - b .L48 -.LVL92: -.L50: - lsl x1, x0, 3 - add x23, x1, x19 - .loc 4 73 0 - ldr x25, [x1, x19] -.LVL93: - .loc 4 74 0 - cmp x22, x25 - beq .L47 -.LVL94: - .loc 4 76 0 - add x1, x23, 4 - mov x0, x23 -.LVL95: - bl flush_dcache_range -.LVL96: - .loc 4 78 0 - ldr x27, [x23] -.LVL97: - .loc 4 82 0 - cmn x23, #1 - beq .L49 -.LVL98: -.L48: - .loc 4 86 0 - adrp x0, .LC14 - add x0, x0, :lo12:.LC14 - bl printf -.LVL99: - .loc 4 93 0 - mov w0, 0 - .loc 4 87 0 - cmn x23, #1 - beq .L37 - .loc 4 88 0 - mov x4, x22 - mov x3, x27 - mov x2, x25 - mov x1, x23 - adrp x0, .LC15 - add x0, x0, :lo12:.LC15 - bl printf -.LVL100: - b .L57 -.LVL101: -.L47: - .loc 4 72 0 - add x0, x0, 1 -.LVL102: - b .L46 -.LBE17: -.LBE19: - .cfi_endproc -.LFE271: - .size random_test, .-random_test - .section .text.scan_freq,"ax",@progbits - .align 2 - .type scan_freq, %function -scan_freq: -.LFB255: - .loc 2 55 0 - .cfi_startproc -.LVL103: - stp x29, x30, [sp, -80]! - .cfi_def_cfa_offset 80 - .cfi_offset 29, -80 - .cfi_offset 30, -72 - add x29, sp, 0 - .cfi_def_cfa_register 29 - stp x19, x20, [sp, 16] - .cfi_offset 19, -64 - .cfi_offset 20, -56 - mov w19, w0 - stp x21, x22, [sp, 32] - .loc 2 61 0 - mov w0, 16960 -.LVL104: - .loc 2 55 0 - stp x23, x24, [sp, 48] - .loc 2 61 0 - movk w0, 0xf, lsl 16 - .loc 2 55 0 - stp x25, x26, [sp, 64] - .cfi_offset 21, -48 - .cfi_offset 22, -40 - .cfi_offset 23, -32 - .cfi_offset 24, -24 - .cfi_offset 25, -16 - .cfi_offset 26, -8 - .loc 2 55 0 - mov x22, x2 - .loc 2 61 0 - cmp w19, w0 - bls .L59 - .loc 2 62 0 - udiv w19, w19, w0 -.LVL105: -.L59: - .loc 2 63 0 - cmp w1, w0 - bls .L60 - .loc 2 64 0 - udiv w1, w1, w0 -.LVL106: -.L60: - .loc 2 66 0 - cmp w19, w1 - bls .L61 - mov w0, w19 - mov w19, w1 -.LVL107: - mov w1, w0 -.LVL108: -.L61: - .loc 2 75 0 - mov w25, 16960 - adrp x24, .LC16 - .loc 2 71 0 - sub w21, w1, w19 -.LVL109: - .loc 2 75 0 - add x24, x24, :lo12:.LC16 - .loc 2 73 0 - mov w23, 0 - .loc 2 75 0 - movk w25, 0xf, lsl 16 -.LVL110: -.L62: - .loc 2 73 0 discriminator 1 - cmp x22, x23, uxtw - bhi .L66 - .loc 2 73 0 is_stmt 0 discriminator 3 - cbnz x22, .L67 -.L66: - .loc 2 74 0 is_stmt 1 - bl rand -.LVL111: - udiv w20, w0, w21 - .loc 2 75 0 - mov w1, w23 - .loc 2 74 0 - msub w20, w20, w21, w0 - .loc 2 75 0 - mov x0, x24 -.LVL112: - .loc 2 74 0 - add w20, w20, w19 - .loc 2 75 0 - mul w20, w20, w25 - mov w2, w20 - bl printf -.LVL113: - .loc 2 76 0 - and x0, x20, 4294967232 - bl set_ddr_freq -.LVL114: - mov w26, w0 -.LVL115: - .loc 2 79 0 - ldr x0, [x18] -.LVL116: - mov x1, 1048576 - ldr x0, [x0, 136] - bl random_test -.LVL117: - mov w20, w0 -.LVL118: - .loc 2 80 0 - cbz w0, .L63 - .loc 2 81 0 - adrp x0, .LC17 -.LVL119: - mov w1, w26 - add x0, x0, :lo12:.LC17 - bl printf -.LVL120: -.L58: - .loc 2 91 0 - mov w0, w20 - ldp x19, x20, [sp, 16] -.LVL121: - ldp x21, x22, [sp, 32] -.LVL122: - ldp x23, x24, [sp, 48] -.LVL123: - ldp x25, x26, [sp, 64] - ldp x29, x30, [sp], 80 - .cfi_remember_state - .cfi_restore 30 - .cfi_restore 29 - .cfi_restore 25 - .cfi_restore 26 - .cfi_restore 23 - .cfi_restore 24 - .cfi_restore 21 - .cfi_restore 22 - .cfi_restore 19 - .cfi_restore 20 - .cfi_def_cfa 31, 0 - ret -.LVL124: -.L63: - .cfi_restore_state - .loc 2 84 0 - bl ctrlc -.LVL125: - cbz w0, .L65 -.LVL126: -.L67: - .loc 2 73 0 - mov w20, 0 - b .L58 -.LVL127: -.L65: - .loc 2 73 0 is_stmt 0 discriminator 2 - add w23, w23, 1 -.LVL128: - b .L62 - .cfi_endproc -.LFE255: - .size scan_freq, .-scan_freq - .section .text.do_ddr_test,"ax",@progbits - .align 2 - .type do_ddr_test, %function -do_ddr_test: -.LFB256: - .loc 2 100 0 is_stmt 1 - .cfi_startproc -.LVL129: - stp x29, x30, [sp, -224]! - .cfi_def_cfa_offset 224 - .cfi_offset 29, -224 - .cfi_offset 30, -216 - .loc 2 113 0 - adrp x0, .LC18 -.LVL130: - add x0, x0, :lo12:.LC18 - .loc 2 100 0 - add x29, sp, 0 - .cfi_def_cfa_register 29 - stp x19, x20, [sp, 16] - .cfi_offset 19, -208 - .cfi_offset 20, -200 - .loc 2 115 0 - add x20, x29, 152 - .loc 2 100 0 - stp x21, x22, [sp, 32] - .cfi_offset 21, -192 - .cfi_offset 22, -184 - .loc 2 115 0 - add x21, x29, 120 - .loc 2 100 0 - stp x23, x24, [sp, 48] - .cfi_offset 23, -176 - .cfi_offset 24, -168 - mov w23, w2 - stp x25, x26, [sp, 64] - .cfi_offset 25, -160 - .cfi_offset 26, -152 - mov x26, x3 - stp x27, x28, [sp, 80] - .cfi_offset 27, -144 - .cfi_offset 28, -136 - .loc 2 103 0 - stp xzr, xzr, [x29, 184] - stp xzr, xzr, [x29, 200] - str xzr, [x29, 216] -.LVL131: - .loc 2 113 0 - bl printf -.LVL132: - .loc 2 115 0 - mov w2, 1 - mov x1, x20 - mov x0, x21 - bl get_print_available_addr -.LVL133: - .loc 2 117 0 - cmp w23, 1 - ble .L160 - .loc 2 121 0 - adrp x24, .LANCHOR2 - add x27, x24, :lo12:.LANCHOR2 - mov x25, 0 - str x24, [x29, 104] -.L75: - ldr x1, [x27, x25, lsl 3] - mov w19, w25 -.LVL134: - ldr x0, [x26, 8] - bl strcasecmp -.LVL135: - cbz w0, .L74 -.LVL136: - add x25, x25, 1 - .loc 2 120 0 discriminator 2 - cmp x25, 7 - bne .L75 - .loc 2 128 0 - adrp x0, .LC27 - add x0, x0, :lo12:.LC27 - b .L161 -.LVL137: -.L112: - .loc 2 133 0 - adrp x0, .LC19 - add x0, x0, :lo12:.LC19 -.LVL138: -.L161: - .loc 2 128 0 - bl printf -.LVL139: -.L160: - .loc 2 129 0 - mov w23, -1 - b .L72 -.LVL140: -.L78: - .loc 2 138 0 - add x0, x26, x27 - add x1, x29, 184 - add x2, x1, x27 - mov w1, 0 - add x27, x27, 8 - ldr x0, [x0, 16] - bl strict_strtoul -.LVL141: - tbz w0, #31, .L77 - .loc 2 139 0 - adrp x0, .LC20 - add x0, x0, :lo12:.LC20 - b .L161 -.LVL142: -.L79: - .loc 2 157 0 - bl data_cpu_2_io_init -.LVL143: - .loc 2 159 0 - cbnz w19, .L80 - .loc 2 161 0 - ldr x0, [x29, 192] - cbz x0, .L81 - .loc 2 162 0 - bl set_vdd_logic -.LVL144: -.L81: - .loc 2 163 0 - ldr x0, [x29, 184] - bl set_ddr_freq -.LVL145: -.L82: - .loc 2 305 0 - adrp x0, .LC26 - add x0, x0, :lo12:.LC26 - bl printf -.LVL146: - b .L72 -.LVL147: -.L80: - .loc 2 164 0 - cmp w19, 1 - bne .L83 - .loc 2 166 0 - ldr x0, [x29, 208] - cbz x0, .L84 - .loc 2 167 0 - bl set_vdd_logic -.LVL148: -.L84: - .loc 2 168 0 - ldr w0, [x29, 184] - ldr w1, [x29, 192] - ldr x2, [x29, 200] - bl scan_freq -.LVL149: - b .L82 -.L83: - .loc 2 169 0 - sub w25, w25, #5 - cmp w25, 1 - bhi .L85 - .loc 2 171 0 - ldr x0, [x29, 208] - cbz x0, .L86 - .loc 2 172 0 - bl set_vdd_logic -.LVL150: -.L86: - .loc 2 173 0 - cmp w19, 5 - bne .L114 - .loc 2 175 0 - mov x1, 65535 - mov x0, 0 - movk x1, 0x9f, lsl 16 -.L90: -.LVL151: - ldr x2, [x20, x0, lsl 3] - cmp x2, x1 - bls .L88 - .loc 2 176 0 - mov w1, w0 -.LVL152: - .loc 2 185 0 - mov x2, 10485760 - str x2, [x20, w0, uxtw 3] -.LVL153: -.L89: - .loc 2 108 0 discriminator 1 - mov x0, 0 -.LVL154: -.L93: - .loc 2 188 0 - cmp w1, w0 - beq .L92 - .loc 2 190 0 - str xzr, [x21, x0, lsl 3] - .loc 2 191 0 - str xzr, [x20, x0, lsl 3] -.L92: -.LVL155: - add x0, x0, 1 -.LVL156: - .loc 2 187 0 discriminator 2 - cmp x0, 4 - bne .L93 - .loc 2 193 0 - mov w28, 60 -.L87: -.LVL157: - .loc 2 201 0 - adrp x26, .LC22 -.LVL158: - .loc 2 205 0 - adrp x27, .LC23 - .loc 2 201 0 - add x26, x26, :lo12:.LC22 - .loc 2 205 0 - add x27, x27, :lo12:.LC23 - .loc 2 198 0 - mov w25, 0 -.LVL159: -.L94: - .loc 2 199 0 - ldr x0, [x29, 200] - cbz x0, .L100 - .loc 2 199 0 is_stmt 0 discriminator 1 - cmp x0, x25, uxtw - bls .L82 -.L100: - .loc 2 201 0 is_stmt 1 - mov x19, 0 - .loc 2 200 0 - add w25, w25, 1 -.LVL160: - .loc 2 201 0 - mov w1, w25 - mov x0, x26 - bl printf -.LVL161: -.L98: - .loc 2 203 0 - ldr x3, [x20, x19, lsl 3] - cbz x3, .L95 - .loc 2 205 0 - ldr x2, [x21, x19, lsl 3] - mov w1, w19 - mov x0, x27 - bl printf -.LVL162: - .loc 2 207 0 - ldr x0, [x29, 192] - bl set_ddr_freq -.LVL163: - .loc 2 208 0 - ldr x1, [x20, x19, lsl 3] - ldr x0, [x21, x19, lsl 3] - bl random_test -.LVL164: - mov w24, w0 -.LVL165: - .loc 2 210 0 - cbnz w0, .L115 - .loc 2 211 0 - ldr x1, [x20, x19, lsl 3] - ldr x0, [x21, x19, lsl 3] -.LVL166: - bl crosstalk -.LVL167: - mov w24, w0 -.LVL168: - .loc 2 215 0 - cbnz w0, .L116 - .loc 2 216 0 - ldr x1, [x20, x19, lsl 3] - ldr x0, [x21, x19, lsl 3] -.LVL169: - bl diagonalscan -.LVL170: - mov w24, w0 -.LVL171: - .loc 2 220 0 - cbnz w0, .L117 - .loc 2 221 0 - ldr w0, [x29, 184] -.LVL172: - and x2, x28, 1020 - ldr w1, [x29, 192] - .loc 2 224 0 - mov w22, 1 - .loc 2 221 0 - bl scan_freq -.LVL173: - mov w24, w0 -.LVL174: -.L96: - .loc 2 226 0 - ldr x0, [x29, 184] -.LVL175: - bl set_ddr_freq -.LVL176: - .loc 2 227 0 - cbnz w24, .L118 - .loc 2 228 0 - ldr x1, [x20, x19, lsl 3] - ldr x0, [x21, x19, lsl 3] - bl random_test -.LVL177: - mov w2, w0 -.LVL178: - .loc 2 232 0 - cbnz w0, .L119 - .loc 2 233 0 - ldr x1, [x20, x19, lsl 3] - ldr x0, [x21, x19, lsl 3] -.LVL179: - str w2, [x29, 100] - bl crosstalk -.LVL180: - mov w22, w0 -.LVL181: - .loc 2 237 0 - ldr w2, [x29, 100] - cbnz w0, .L120 - .loc 2 238 0 - ldr x1, [x20, x19, lsl 3] - ldr x0, [x21, x19, lsl 3] -.LVL182: - bl diagonalscan -.LVL183: - mov w24, w0 -.LVL184: - .loc 2 243 0 - cbnz w0, .L121 - .loc 2 245 0 - bl ctrlc -.LVL185: - cbnz w0, .L122 - .loc 2 240 0 - mov w22, 4 -.LVL186: -.L95: - add x19, x19, 1 -.LVL187: - .loc 2 202 0 discriminator 2 - cmp x19, 4 - bne .L98 - mov w2, 0 - mov w24, 0 -.LVL188: -.L97: - .loc 2 250 0 - orr w2, w24, w2 -.LVL189: - cbz w2, .L94 -.LVL190: -.L99: - .loc 2 302 0 - cbz w24, .L82 - .loc 2 303 0 - ldr x0, [x29, 104] - add x24, x0, :lo12:.LANCHOR2 -.LVL191: - adrp x0, .LC25 - add x0, x0, :lo12:.LC25 - ldr x1, [x24, w22, sxtw 3] - bl printf -.LVL192: - b .L72 -.LVL193: -.L88: - add x0, x0, 1 -.LVL194: - .loc 2 174 0 discriminator 2 - cmp x0, 4 - bne .L90 - .loc 2 181 0 - ldr x2, [x29, 152] - mov w1, 10 - adrp x0, .LC28 - add x0, x0, :lo12:.LC28 - lsr x2, x2, 20 - bl printf -.LVL195: - .loc 2 108 0 - mov w1, 0 - b .L89 -.L114: - .loc 2 195 0 - mov w28, 1000 - b .L87 -.LVL196: -.L115: - .loc 2 209 0 - mov w22, 2 - b .L96 -.LVL197: -.L116: - .loc 2 213 0 - mov w22, 3 - b .L96 -.LVL198: -.L117: - .loc 2 218 0 - mov w22, 4 - b .L96 -.LVL199: -.L118: - mov w2, 0 - b .L97 -.LVL200: -.L119: - .loc 2 228 0 - mov w24, w0 - mov w2, 0 - .loc 2 230 0 - mov w22, 2 - b .L97 -.LVL201: -.L120: - .loc 2 233 0 - mov w24, w0 - .loc 2 235 0 - mov w22, 3 - b .L97 -.LVL202: -.L121: - mov w2, w22 -.LVL203: -.L158: - .loc 2 240 0 - mov w22, 4 - b .L97 -.L122: - .loc 2 246 0 - mov w2, -1 - b .L158 -.LVL204: -.L85: - .loc 2 259 0 - mov x2, x20 - mov x1, x21 - add x0, x29, 200 - bl judge_test_addr -.LVL205: - mov w27, w0 -.LVL206: - .loc 2 260 0 - cbz w0, .L123 - .loc 2 263 0 - ldr x0, [x29, 184] -.LVL207: - bl set_ddr_freq -.LVL208: - .loc 2 265 0 - ldr x0, [x29, 216] - cbz x0, .L102 - .loc 2 266 0 - bl set_vdd_logic -.LVL209: -.L102: - .loc 2 270 0 - adrp x26, .LC24 -.LVL210: - mov w25, 0 - add x26, x26, :lo12:.LC24 - b .L110 -.LVL211: -.L111: - .loc 2 271 0 - mov x28, 0 - .loc 2 269 0 - add w25, w25, 1 -.LVL212: - .loc 2 270 0 - mov w1, w25 - mov x0, x26 - bl printf -.LVL213: -.L103: - .loc 2 271 0 discriminator 1 - cmp w27, w28 - bhi .L109 - mov w0, 0 - mov w24, 0 -.LVL214: -.L108: - .loc 2 297 0 - orr w0, w24, w0 -.LVL215: - cbnz w0, .L99 -.LVL216: -.L110: - .loc 2 268 0 - ldr x0, [x29, 192] - cbz x0, .L111 - .loc 2 268 0 is_stmt 0 discriminator 1 - cmp x0, x25, uxtw - bhi .L111 - b .L82 -.LVL217: -.L109: - .loc 2 278 0 is_stmt 1 - ldr x1, [x20, x28, lsl 3] - .loc 2 272 0 - cmp w19, 3 - .loc 2 278 0 - ldr x0, [x21, x28, lsl 3] - .loc 2 272 0 - beq .L105 - cmp w19, 4 - beq .L106 - .loc 2 274 0 - bl random_test -.LVL218: -.L159: - .loc 2 282 0 - mov w24, w0 -.LVL219: - .loc 2 290 0 - bl ctrlc -.LVL220: - cbnz w0, .L124 - add x28, x28, 1 -.LVL221: - mov w22, w19 - .loc 2 294 0 - cbz w24, .L103 - mov w22, w19 - b .L108 -.LVL222: -.L105: - .loc 2 278 0 - bl crosstalk -.LVL223: - b .L159 -.L106: - .loc 2 282 0 - bl diagonalscan -.LVL224: - b .L159 -.LVL225: -.L124: - mov w22, w19 - .loc 2 291 0 - mov w0, -1 - b .L108 -.LVL226: -.L123: - .loc 2 261 0 - mov w23, 1 -.LVL227: - b .L72 -.LVL228: -.L74: - .loc 2 132 0 - adrp x0, .LANCHOR3 - add x0, x0, :lo12:.LANCHOR3 - ldrb w0, [x0, w25, sxtw] - cmp w23, w0 - blt .L112 - sub w23, w23, #2 -.LVL229: - .loc 2 132 0 is_stmt 0 discriminator 1 - mov x27, 0 - lsl x23, x23, 3 -.LVL230: -.L77: - .loc 2 137 0 is_stmt 1 discriminator 1 - cmp x27, x23 - bne .L78 - .loc 2 147 0 - add x2, x29, 112 - mov w1, 0 - mov w0, 53 - bl uclass_get_device -.LVL231: - mov w23, w0 -.LVL232: - .loc 2 148 0 - cbz w0, .L79 - .loc 2 149 0 - mov w1, w0 - adrp x0, .LC21 -.LVL233: - add x0, x0, :lo12:.LC21 - bl printf -.LVL234: -.L72: - .loc 2 308 0 - mov w0, w23 - ldp x19, x20, [sp, 16] - ldp x21, x22, [sp, 32] - ldp x23, x24, [sp, 48] - ldp x25, x26, [sp, 64] - ldp x27, x28, [sp, 80] - ldp x29, x30, [sp], 224 - .cfi_restore 30 - .cfi_restore 29 - .cfi_restore 27 - .cfi_restore 28 - .cfi_restore 25 - .cfi_restore 26 - .cfi_restore 23 - .cfi_restore 24 - .cfi_restore 21 - .cfi_restore 22 - .cfi_restore 19 - .cfi_restore 20 - .cfi_def_cfa 31, 0 - ret - .cfi_endproc -.LFE256: - .size do_ddr_test, .-do_ddr_test - .global _u_boot_list_2_cmd_2_ddr_test - .section .rodata - .align 3 - .set .LANCHOR1,. + 0 -.LC0: - .word 1437226410 - .word -1437226411 - .word 1515890085 - .word -1515890086 - .word -267448336 - .word 267448335 - .word 0 - .word -1 - .section .rodata.crosstalk.str1.1,"aMS",@progbits,1 -.LC1: - .string "\nbitflip: \n" -.LC2: - .string "\b\b\b%3u" -.LC3: - .string "%3u\b\b\b" -.LC4: - .string "\nISI:\n" -.LC5: - .string "malloc %lu byte fail\n" - .section .rodata.diagonalscan.str1.1,"aMS",@progbits,1 -.LC6: - .string "\nDiagonalScan\n" -.LC7: - .string "get page size fail:0x%x\n" - .section .rodata.do_ddr_test.str1.1,"aMS",@progbits,1 -.LC18: - .string "ddr tester version 1.0.1\n" -.LC19: - .string "test parameters error\n" -.LC20: - .string "test pattern error\n" -.LC21: - .string "rockchip dmc probe fail: %d\n" -.LC22: - .string "\rtimes:%08u:\n" -.LC23: - .string "loop:%d, start:0x%lx, len:0x%lx\n" -.LC24: - .string "\rtimes:%08u, " -.LC25: - .string "\n%s test fail\n" -.LC26: - .string "\ntest pass\n" -.LC27: - .string "test pattern unsupported\n" -.LC28: - .string "fasttest need %uMB, but actually only %luMB\n" - .section .rodata.g_isi_pattern,"a",@progbits - .align 3 - .set .LANCHOR0,. + 0 - .type g_isi_pattern, %object - .size g_isi_pattern, 128 -g_isi_pattern: - .word -1 - .word 0 - .word -1 - .word 0 - .word -1 - .word 0 - .word -1 - .word -1 - .word -1 - .word -1 - .word 0 - .word -1 - .word -1 - .word -1 - .word -1 - .word 0 - .word -1 - .word 0 - .word -1 - .word 0 - .word -1 - .word 0 - .word 0 - .word 0 - .word 0 - .word -1 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .word 0 - .section .rodata.random_test.str1.1,"aMS",@progbits,1 -.LC8: - .string "%u" -.LC9: - .string "\b" -.LC10: - .string " " -.LC11: - .string "\nrandom test1 fail:address:0x%lx,read:0x%x,reread:0x%x,expect:0x%x\n" -.LC12: - .string "%4lu" -.LC13: - .string "\b\b\b\b" -.LC14: - .string " " -.LC15: - .string "\nrandom test2 fail:address:0x%lx,read:0x%lx,reread:0x%lx,expect:0x%lx\n" - .section .rodata.scan_freq.str1.1,"aMS",@progbits,1 -.LC16: - .string "% d:change freq to %d Hz\n" -.LC17: - .string "check data fail at %d Hz\n" - .section .rodata.str1.1,"aMS",@progbits,1 -.LC29: - .string "ddr_test" -.LC30: - .string "for dram simple test\n" -.LC31: - .ascii "arg1: test pattern include:\n\tchangefreq\n\tscanfreq\n\tran" - .ascii "dom\n\tcrosstalk\n\tdiagonalscan\n\tfast_test\n\tfull_test\n" - .ascii "for changereq: arg2:freq(Hz),arg3[option]:volt\nfor scanfreq" - .ascii ": arg2:minfreq(Hz),arg3:maxfreq(Hz),\n\targ4:scanfreq times," - .ascii " arg5[option]:volt\nfor random, crosstalk and diagonalscan:a" - .ascii "rg2:freq(Hz), arg3:test times,\n\targ4: start addr, arg5:len" - .ascii "gth, arg6[option]:volt\nfor fast_test and full_test:arg2: mi" - .ascii "n_freq(Hz), arg3: max_freq(Hz)\n\targ4: test times, arg5[opt" - .ascii "ion]:volt\n\nfreq: means dram's target frequency,unit:Hz, if" - .ascii " 0:keep current freq\nminfreq, maxfreq: means min and max fr" - .ascii "equency for dram test,unit:Hz\ntest times: test loop, if 0: " - .ascii "endless loop\nstart_adr: start address of memory space for t" - .ascii "esting,unit:physical address\nlength: length of memory space" - .ascii " for testing,unit:Byte, if 0: full memory space test\nvolt: " - .ascii "means target voltage of vdd_logic\n\nexample:\nddr freq chan" - .ascii "ge to:786MHz, vdd_logic:1.05v:\n\t 'ddr_test changefreq 7860" - .ascii "00000 1050000'\nddr freq change to:786MHz, with default vdd_" - .ascii "logic:\n\t 'ddr_test changefreq 786000000'\nscanning ddr fre" - .ascii "quency between 200 and 786MHz for 10 times:\n\t 'ddr_test sc" - .ascii "anfreq 200000000 786000000 100'\ndoing random test 10 times " - .ascii "start from" - .string " physical address 0x200000 and\nlength is 128MB, freq:786MHz, if freq=0 may keep current freq:\n\t 'ddr_test random 786000000 10 0x200000 0x8000000'\ndoing fast test for dram between 200MHz to 786MHz with 10 times:\n\t 'ddr_test fast_test 200000000 786000000 10'" -.LC32: - .string "changefreq" -.LC33: - .string "scanfreq" -.LC34: - .string "random" -.LC35: - .string "crosstalk" -.LC36: - .string "diagonalscan" -.LC37: - .string "fast_test" -.LC38: - .string "full_test" - .section .rodata.test_pat_param,"a",@progbits - .align 3 - .set .LANCHOR3,. + 0 - .type test_pat_param, %object - .size test_pat_param, 7 -test_pat_param: - .byte 3 - .byte 5 - .byte 6 - .byte 6 - .byte 6 - .byte 5 - .byte 5 - .section .rodata.test_pattern,"a",@progbits - .align 3 - .set .LANCHOR2,. + 0 - .type test_pattern, %object - .size test_pattern, 56 -test_pattern: - .xword .LC32 - .xword .LC33 - .xword .LC34 - .xword .LC35 - .xword .LC36 - .xword .LC37 - .xword .LC38 - .section .u_boot_list_2_cmd_2_ddr_test,"aw",@progbits - .align 2 - .type _u_boot_list_2_cmd_2_ddr_test, %object - .size _u_boot_list_2_cmd_2_ddr_test, 48 -_u_boot_list_2_cmd_2_ddr_test: - .8byte .LC29 - .word 7 - .word 1 - .8byte do_ddr_test - .8byte .LC30 - .8byte .LC31 - .8byte 0 - .text -.Letext0: - .file 5 "include/common.h" - .file 6 "./arch/arm/include/asm/types.h" - .file 7 "include/linux/types.h" - .file 8 "include/errno.h" - .file 9 "include/linux/string.h" - .file 10 "include/efi.h" - .file 11 "include/dm/device.h" - .file 12 "include/ide.h" - .file 13 "include/linux/list.h" - .file 14 "include/part.h" - .file 15 "include/flash.h" - .file 16 "include/lmb.h" - .file 17 "include/asm-generic/u-boot.h" - .file 18 "./arch/arm/include/asm/u-boot-arm.h" - .file 19 "include/command.h" - .file 20 "include/linux/libfdt_env.h" - .file 21 "include/linux/../../scripts/dtc/libfdt/fdt.h" - .file 22 "include/linux/libfdt.h" - .file 23 "include/image.h" - .file 24 "include/dm/uclass-id.h" - .file 25 "./arch/arm/include/asm/global_data.h" - .file 26 "include/asm-generic/global_data.h" - .file 27 "include/dm/of.h" - .file 28 "include/net.h" - .file 29 "include/malloc.h" - .file 30 "include/dm/ofnode.h" - .file 31 "include/linux/compat.h" - .file 32 "include/dm/uclass.h" - .file 33 "include/console.h" - .file 34 "include/stdio_dev.h" - .file 35 "include/iomux.h" - .file 36 "include/log.h" - .file 37 "include/stdio.h" - .file 38 "./arch/arm/include/asm/arch/sdram.h" - .file 39 "cmd/ddr_tool/../memtester/io_map.h" - .file 40 "cmd/ddr_tool/../memtester/ddr_tester_common.h" - .file 41 "include/vsprintf.h" - .section .debug_info,"",@progbits -.Ldebug_info0: - .4byte 0x27ad - .2byte 0x4 - .4byte .Ldebug_abbrev0 - .byte 0x8 - .uleb128 0x1 - .4byte .LASF478 - .byte 0xc - .4byte .LASF479 - .4byte .LASF480 - .4byte .Ldebug_ranges0+0x90 - .8byte 0 - .4byte .Ldebug_line0 - .uleb128 0x2 - .4byte .LASF4 - .byte 0x5 - .byte 0xd - .4byte 0x34 - .uleb128 0x3 - .byte 0x1 - .byte 0x8 - .4byte .LASF0 - .uleb128 0x3 - .byte 0x8 - .byte 0x7 - .4byte .LASF1 - .uleb128 0x4 - .4byte 0x3b - .uleb128 0x3 - .byte 0x2 - .byte 0x7 - .4byte .LASF2 - .uleb128 0x5 - .4byte .LASF21 - .byte 0x8 - .byte 0xc - .4byte 0x59 - .uleb128 0x6 - .byte 0x4 - .byte 0x5 - .string "int" - .uleb128 0x3 - .byte 0x1 - .byte 0x6 - .4byte .LASF3 - .uleb128 0x2 - .4byte .LASF5 - .byte 0x6 - .byte 0xc - .4byte 0x34 - .uleb128 0x3 - .byte 0x2 - .byte 0x5 - .4byte .LASF6 - .uleb128 0x2 - .4byte .LASF7 - .byte 0x6 - .byte 0x12 - .4byte 0x84 - .uleb128 0x3 - .byte 0x4 - .byte 0x7 - .4byte .LASF8 - .uleb128 0x3 - .byte 0x8 - .byte 0x5 - .4byte .LASF9 - .uleb128 0x3 - .byte 0x8 - .byte 0x7 - .4byte .LASF10 - .uleb128 0x7 - .string "u8" - .byte 0x6 - .byte 0x1f - .4byte 0x34 - .uleb128 0x8 - .4byte 0x99 - .uleb128 0x7 - .string "u32" - .byte 0x6 - .byte 0x25 - .4byte 0x84 - .uleb128 0x4 - .4byte 0xa8 - .uleb128 0x2 - .4byte .LASF11 - .byte 0x6 - .byte 0x31 - .4byte 0x92 - .uleb128 0x2 - .4byte .LASF12 - .byte 0x6 - .byte 0x32 - .4byte 0x92 - .uleb128 0x3 - .byte 0x8 - .byte 0x7 - .4byte .LASF13 - .uleb128 0x9 - .byte 0x8 - .4byte 0xe7 - .uleb128 0x8 - .4byte 0xd5 - .uleb128 0x3 - .byte 0x1 - .byte 0x8 - .4byte .LASF14 - .uleb128 0x8 - .4byte 0xe0 - .uleb128 0x3 - .byte 0x8 - .byte 0x5 - .4byte .LASF15 - .uleb128 0x9 - .byte 0x8 - .4byte 0xe0 - .uleb128 0x8 - .4byte 0xf3 - .uleb128 0x2 - .4byte .LASF16 - .byte 0x7 - .byte 0x59 - .4byte 0x47 - .uleb128 0x2 - .4byte .LASF17 - .byte 0x7 - .byte 0x5b - .4byte 0x3b - .uleb128 0x2 - .4byte .LASF18 - .byte 0x7 - .byte 0x69 - .4byte 0x67 - .uleb128 0x2 - .4byte .LASF19 - .byte 0x7 - .byte 0x6b - .4byte 0x79 - .uleb128 0x2 - .4byte .LASF20 - .byte 0x7 - .byte 0x97 - .4byte 0x79 - .uleb128 0xa - .byte 0x8 - .uleb128 0x5 - .4byte .LASF22 - .byte 0x9 - .byte 0xb - .4byte 0xf3 - .uleb128 0x3 - .byte 0x1 - .byte 0x2 - .4byte .LASF23 - .uleb128 0xb - .4byte 0xe0 - .4byte 0x154 - .uleb128 0xc - .byte 0 - .uleb128 0xd - .4byte .LASF24 - .byte 0xa - .2byte 0x140 - .4byte 0x149 - .uleb128 0xd - .4byte .LASF25 - .byte 0xa - .2byte 0x143 - .4byte 0x149 - .uleb128 0xd - .4byte .LASF26 - .byte 0xa - .2byte 0x143 - .4byte 0x149 - .uleb128 0xe - .4byte .LASF45 - .byte 0xa0 - .byte 0xb - .byte 0x80 - .4byte 0x25d - .uleb128 0xf - .4byte .LASF27 - .byte 0xb - .byte 0x81 - .4byte 0x1517 - .byte 0 - .uleb128 0xf - .4byte .LASF28 - .byte 0xb - .byte 0x82 - .4byte 0xd5 - .byte 0x8 - .uleb128 0xf - .4byte .LASF29 - .byte 0xb - .byte 0x83 - .4byte 0x135 - .byte 0x10 - .uleb128 0xf - .4byte .LASF30 - .byte 0xb - .byte 0x84 - .4byte 0x135 - .byte 0x18 - .uleb128 0xf - .4byte .LASF31 - .byte 0xb - .byte 0x85 - .4byte 0x135 - .byte 0x20 - .uleb128 0xf - .4byte .LASF32 - .byte 0xb - .byte 0x86 - .4byte 0x14e2 - .byte 0x28 - .uleb128 0xf - .4byte .LASF33 - .byte 0xb - .byte 0x87 - .4byte 0x109 - .byte 0x30 - .uleb128 0xf - .4byte .LASF34 - .byte 0xb - .byte 0x88 - .4byte 0x25d - .byte 0x38 - .uleb128 0xf - .4byte .LASF35 - .byte 0xb - .byte 0x89 - .4byte 0x135 - .byte 0x40 - .uleb128 0xf - .4byte .LASF36 - .byte 0xb - .byte 0x8a - .4byte 0x155a - .byte 0x48 - .uleb128 0xf - .4byte .LASF37 - .byte 0xb - .byte 0x8b - .4byte 0x135 - .byte 0x50 - .uleb128 0xf - .4byte .LASF38 - .byte 0xb - .byte 0x8c - .4byte 0x135 - .byte 0x58 - .uleb128 0xf - .4byte .LASF39 - .byte 0xb - .byte 0x8d - .4byte 0x290 - .byte 0x60 - .uleb128 0xf - .4byte .LASF40 - .byte 0xb - .byte 0x8e - .4byte 0x290 - .byte 0x70 - .uleb128 0xf - .4byte .LASF41 - .byte 0xb - .byte 0x8f - .4byte 0x290 - .byte 0x80 - .uleb128 0xf - .4byte .LASF42 - .byte 0xb - .byte 0x90 - .4byte 0x11f - .byte 0x90 - .uleb128 0xf - .4byte .LASF43 - .byte 0xb - .byte 0x91 - .4byte 0x59 - .byte 0x94 - .uleb128 0x10 - .string "seq" - .byte 0xb - .byte 0x92 - .4byte 0x59 - .byte 0x98 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x178 - .uleb128 0x9 - .byte 0x8 - .4byte 0x269 - .uleb128 0x11 - .uleb128 0xb - .4byte 0x109 - .4byte 0x275 - .uleb128 0xc - .byte 0 - .uleb128 0x5 - .4byte .LASF44 - .byte 0xc - .byte 0x10 - .4byte 0x26a - .uleb128 0xb - .4byte 0x34 - .4byte 0x290 - .uleb128 0x12 - .4byte 0xce - .byte 0x5 - .byte 0 - .uleb128 0xe - .4byte .LASF46 - .byte 0x10 - .byte 0xd - .byte 0x16 - .4byte 0x2b5 - .uleb128 0xf - .4byte .LASF47 - .byte 0xd - .byte 0x17 - .4byte 0x2b5 - .byte 0 - .uleb128 0xf - .4byte .LASF48 - .byte 0xd - .byte 0x17 - .4byte 0x2b5 - .byte 0x8 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x290 - .uleb128 0xe - .4byte .LASF49 - .byte 0x10 - .byte 0xe - .byte 0xf - .4byte 0x2e0 - .uleb128 0xf - .4byte .LASF28 - .byte 0xe - .byte 0x10 - .4byte 0xf3 - .byte 0 - .uleb128 0xf - .4byte .LASF50 - .byte 0xe - .byte 0x11 - .4byte 0x2f9 - .byte 0x8 - .byte 0 - .uleb128 0x8 - .4byte 0x2bb - .uleb128 0x13 - .4byte 0x59 - .4byte 0x2f9 - .uleb128 0x14 - .4byte 0x59 - .uleb128 0x14 - .4byte 0x59 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x2e5 - .uleb128 0xb - .4byte 0x2e0 - .4byte 0x30a - .uleb128 0xc - .byte 0 - .uleb128 0x8 - .4byte 0x2ff - .uleb128 0x5 - .4byte .LASF49 - .byte 0xe - .byte 0xce - .4byte 0x30a - .uleb128 0x15 - .2byte 0x1218 - .byte 0xf - .byte 0x13 - .4byte 0x361 - .uleb128 0xf - .4byte .LASF51 - .byte 0xf - .byte 0x14 - .4byte 0x109 - .byte 0 - .uleb128 0xf - .4byte .LASF52 - .byte 0xf - .byte 0x15 - .4byte 0xfe - .byte 0x8 - .uleb128 0xf - .4byte .LASF53 - .byte 0xf - .byte 0x16 - .4byte 0x109 - .byte 0x10 - .uleb128 0xf - .4byte .LASF54 - .byte 0xf - .byte 0x17 - .4byte 0x361 - .byte 0x18 - .uleb128 0x16 - .4byte .LASF55 - .byte 0xf - .byte 0x18 - .4byte 0x372 - .2byte 0x1018 - .byte 0 - .uleb128 0xb - .4byte 0x109 - .4byte 0x372 - .uleb128 0x17 - .4byte 0xce - .2byte 0x1ff - .byte 0 - .uleb128 0xb - .4byte 0x29 - .4byte 0x383 - .uleb128 0x17 - .4byte 0xce - .2byte 0x1ff - .byte 0 - .uleb128 0x2 - .4byte .LASF56 - .byte 0xf - .byte 0x32 - .4byte 0x31a - .uleb128 0xb - .4byte 0x383 - .4byte 0x399 - .uleb128 0xc - .byte 0 - .uleb128 0x5 - .4byte .LASF57 - .byte 0xf - .byte 0x34 - .4byte 0x38e - .uleb128 0x3 - .byte 0x10 - .byte 0x4 - .4byte .LASF58 - .uleb128 0xe - .4byte .LASF59 - .byte 0x10 - .byte 0x10 - .byte 0x10 - .4byte 0x3d0 - .uleb128 0xf - .4byte .LASF60 - .byte 0x10 - .byte 0x11 - .4byte 0xb8 - .byte 0 - .uleb128 0xf - .4byte .LASF51 - .byte 0x10 - .byte 0x12 - .4byte 0xc3 - .byte 0x8 - .byte 0 - .uleb128 0xe - .4byte .LASF61 - .byte 0xa0 - .byte 0x10 - .byte 0x15 - .4byte 0x401 - .uleb128 0x10 - .string "cnt" - .byte 0x10 - .byte 0x16 - .4byte 0x3b - .byte 0 - .uleb128 0xf - .4byte .LASF51 - .byte 0x10 - .byte 0x17 - .4byte 0xc3 - .byte 0x8 - .uleb128 0xf - .4byte .LASF62 - .byte 0x10 - .byte 0x18 - .4byte 0x401 - .byte 0x10 - .byte 0 - .uleb128 0xb - .4byte 0x3ab - .4byte 0x411 - .uleb128 0x12 - .4byte 0xce - .byte 0x8 - .byte 0 - .uleb128 0x18 - .string "lmb" - .2byte 0x140 - .byte 0x10 - .byte 0x1b - .4byte 0x437 - .uleb128 0xf - .4byte .LASF63 - .byte 0x10 - .byte 0x1c - .4byte 0x3d0 - .byte 0 - .uleb128 0xf - .4byte .LASF64 - .byte 0x10 - .byte 0x1d - .4byte 0x3d0 - .byte 0xa0 - .byte 0 - .uleb128 0x19 - .string "lmb" - .byte 0x10 - .byte 0x20 - .4byte 0x411 - .uleb128 0x1a - .byte 0x10 - .byte 0x11 - .byte 0x5a - .4byte 0x463 - .uleb128 0xf - .4byte .LASF54 - .byte 0x11 - .byte 0x5b - .4byte 0xb8 - .byte 0 - .uleb128 0xf - .4byte .LASF51 - .byte 0x11 - .byte 0x5c - .4byte 0xc3 - .byte 0x8 - .byte 0 - .uleb128 0xe - .4byte .LASF65 - .byte 0xc8 - .byte 0x11 - .byte 0x1b - .4byte 0x554 - .uleb128 0xf - .4byte .LASF66 - .byte 0x11 - .byte 0x1c - .4byte 0x3b - .byte 0 - .uleb128 0xf - .4byte .LASF67 - .byte 0x11 - .byte 0x1d - .4byte 0xc3 - .byte 0x8 - .uleb128 0xf - .4byte .LASF68 - .byte 0x11 - .byte 0x1e - .4byte 0x3b - .byte 0x10 - .uleb128 0xf - .4byte .LASF69 - .byte 0x11 - .byte 0x1f - .4byte 0x3b - .byte 0x18 - .uleb128 0xf - .4byte .LASF70 - .byte 0x11 - .byte 0x20 - .4byte 0x3b - .byte 0x20 - .uleb128 0xf - .4byte .LASF71 - .byte 0x11 - .byte 0x21 - .4byte 0x3b - .byte 0x28 - .uleb128 0xf - .4byte .LASF72 - .byte 0x11 - .byte 0x22 - .4byte 0x3b - .byte 0x30 - .uleb128 0xf - .4byte .LASF73 - .byte 0x11 - .byte 0x24 - .4byte 0x3b - .byte 0x38 - .uleb128 0xf - .4byte .LASF74 - .byte 0x11 - .byte 0x25 - .4byte 0x3b - .byte 0x40 - .uleb128 0xf - .4byte .LASF75 - .byte 0x11 - .byte 0x26 - .4byte 0x3b - .byte 0x48 - .uleb128 0xf - .4byte .LASF76 - .byte 0x11 - .byte 0x31 - .4byte 0x3b - .byte 0x50 - .uleb128 0xf - .4byte .LASF77 - .byte 0x11 - .byte 0x32 - .4byte 0x3b - .byte 0x58 - .uleb128 0xf - .4byte .LASF78 - .byte 0x11 - .byte 0x33 - .4byte 0x280 - .byte 0x60 - .uleb128 0xf - .4byte .LASF79 - .byte 0x11 - .byte 0x34 - .4byte 0x47 - .byte 0x66 - .uleb128 0xf - .4byte .LASF80 - .byte 0x11 - .byte 0x35 - .4byte 0x3b - .byte 0x68 - .uleb128 0xf - .4byte .LASF81 - .byte 0x11 - .byte 0x36 - .4byte 0x3b - .byte 0x70 - .uleb128 0xf - .4byte .LASF82 - .byte 0x11 - .byte 0x57 - .4byte 0x109 - .byte 0x78 - .uleb128 0xf - .4byte .LASF83 - .byte 0x11 - .byte 0x58 - .4byte 0x109 - .byte 0x80 - .uleb128 0xf - .4byte .LASF84 - .byte 0x11 - .byte 0x5d - .4byte 0x554 - .byte 0x88 - .byte 0 - .uleb128 0xb - .4byte 0x442 - .4byte 0x564 - .uleb128 0x12 - .4byte 0xce - .byte 0x3 - .byte 0 - .uleb128 0x2 - .4byte .LASF85 - .byte 0x11 - .byte 0x5f - .4byte 0x463 - .uleb128 0x5 - .4byte .LASF86 - .byte 0x12 - .byte 0x13 - .4byte 0x109 - .uleb128 0x5 - .4byte .LASF87 - .byte 0x12 - .byte 0x14 - .4byte 0x109 - .uleb128 0x5 - .4byte .LASF88 - .byte 0x12 - .byte 0x15 - .4byte 0x109 - .uleb128 0x5 - .4byte .LASF89 - .byte 0x12 - .byte 0x16 - .4byte 0x109 - .uleb128 0x5 - .4byte .LASF90 - .byte 0x12 - .byte 0x17 - .4byte 0x109 - .uleb128 0x5 - .4byte .LASF91 - .byte 0x12 - .byte 0x18 - .4byte 0x109 - .uleb128 0x5 - .4byte .LASF92 - .byte 0x12 - .byte 0x19 - .4byte 0x109 - .uleb128 0xe - .4byte .LASF93 - .byte 0x30 - .byte 0x13 - .byte 0x1e - .4byte 0x61d - .uleb128 0xf - .4byte .LASF28 - .byte 0x13 - .byte 0x1f - .4byte 0xf3 - .byte 0 - .uleb128 0xf - .4byte .LASF94 - .byte 0x13 - .byte 0x20 - .4byte 0x59 - .byte 0x8 - .uleb128 0xf - .4byte .LASF95 - .byte 0x13 - .byte 0x21 - .4byte 0x59 - .byte 0xc - .uleb128 0x10 - .string "cmd" - .byte 0x13 - .byte 0x23 - .4byte 0x647 - .byte 0x10 - .uleb128 0xf - .4byte .LASF96 - .byte 0x13 - .byte 0x24 - .4byte 0xf3 - .byte 0x18 - .uleb128 0xf - .4byte .LASF97 - .byte 0x13 - .byte 0x26 - .4byte 0xf3 - .byte 0x20 - .uleb128 0xf - .4byte .LASF98 - .byte 0x13 - .byte 0x2a - .4byte 0x676 - .byte 0x28 - .byte 0 - .uleb128 0x13 - .4byte 0x59 - .4byte 0x63b - .uleb128 0x14 - .4byte 0x63b - .uleb128 0x14 - .4byte 0x59 - .uleb128 0x14 - .4byte 0x59 - .uleb128 0x14 - .4byte 0x641 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x5bc - .uleb128 0x9 - .byte 0x8 - .4byte 0xf9 - .uleb128 0x9 - .byte 0x8 - .4byte 0x61d - .uleb128 0x13 - .4byte 0x59 - .4byte 0x670 - .uleb128 0x14 - .4byte 0x59 - .uleb128 0x14 - .4byte 0x641 - .uleb128 0x14 - .4byte 0xe0 - .uleb128 0x14 - .4byte 0x59 - .uleb128 0x14 - .4byte 0x670 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0xf3 - .uleb128 0x9 - .byte 0x8 - .4byte 0x64d - .uleb128 0x2 - .4byte .LASF99 - .byte 0x13 - .byte 0x2e - .4byte 0x5bc - .uleb128 0x1b - .4byte .LASF167 - .byte 0x4 - .4byte 0x59 - .byte 0x13 - .byte 0x7a - .4byte 0x6aa - .uleb128 0x1c - .4byte .LASF100 - .byte 0 - .uleb128 0x1c - .4byte .LASF101 - .byte 0x1 - .uleb128 0x1d - .4byte .LASF102 - .sleb128 -1 - .byte 0 - .uleb128 0x2 - .4byte .LASF103 - .byte 0x14 - .byte 0x11 - .4byte 0x12a - .uleb128 0xe - .4byte .LASF104 - .byte 0x28 - .byte 0x15 - .byte 0x39 - .4byte 0x73a - .uleb128 0xf - .4byte .LASF105 - .byte 0x15 - .byte 0x3a - .4byte 0x6aa - .byte 0 - .uleb128 0xf - .4byte .LASF106 - .byte 0x15 - .byte 0x3b - .4byte 0x6aa - .byte 0x4 - .uleb128 0xf - .4byte .LASF107 - .byte 0x15 - .byte 0x3c - .4byte 0x6aa - .byte 0x8 - .uleb128 0xf - .4byte .LASF108 - .byte 0x15 - .byte 0x3d - .4byte 0x6aa - .byte 0xc - .uleb128 0xf - .4byte .LASF109 - .byte 0x15 - .byte 0x3e - .4byte 0x6aa - .byte 0x10 - .uleb128 0xf - .4byte .LASF110 - .byte 0x15 - .byte 0x3f - .4byte 0x6aa - .byte 0x14 - .uleb128 0xf - .4byte .LASF111 - .byte 0x15 - .byte 0x40 - .4byte 0x6aa - .byte 0x18 - .uleb128 0xf - .4byte .LASF112 - .byte 0x15 - .byte 0x43 - .4byte 0x6aa - .byte 0x1c - .uleb128 0xf - .4byte .LASF113 - .byte 0x15 - .byte 0x46 - .4byte 0x6aa - .byte 0x20 - .uleb128 0xf - .4byte .LASF114 - .byte 0x15 - .byte 0x49 - .4byte 0x6aa - .byte 0x24 - .byte 0 - .uleb128 0xd - .4byte .LASF115 - .byte 0x16 - .2byte 0x136 - .4byte 0x746 - .uleb128 0x9 - .byte 0x8 - .4byte 0x6b5 - .uleb128 0x1e - .4byte .LASF116 - .byte 0x40 - .byte 0x17 - .2byte 0x134 - .4byte 0x7f6 - .uleb128 0x1f - .4byte .LASF117 - .byte 0x17 - .2byte 0x135 - .4byte 0x12a - .byte 0 - .uleb128 0x1f - .4byte .LASF118 - .byte 0x17 - .2byte 0x136 - .4byte 0x12a - .byte 0x4 - .uleb128 0x1f - .4byte .LASF119 - .byte 0x17 - .2byte 0x137 - .4byte 0x12a - .byte 0x8 - .uleb128 0x1f - .4byte .LASF120 - .byte 0x17 - .2byte 0x138 - .4byte 0x12a - .byte 0xc - .uleb128 0x1f - .4byte .LASF121 - .byte 0x17 - .2byte 0x139 - .4byte 0x12a - .byte 0x10 - .uleb128 0x1f - .4byte .LASF122 - .byte 0x17 - .2byte 0x13a - .4byte 0x12a - .byte 0x14 - .uleb128 0x1f - .4byte .LASF123 - .byte 0x17 - .2byte 0x13b - .4byte 0x12a - .byte 0x18 - .uleb128 0x1f - .4byte .LASF124 - .byte 0x17 - .2byte 0x13c - .4byte 0x114 - .byte 0x1c - .uleb128 0x1f - .4byte .LASF125 - .byte 0x17 - .2byte 0x13d - .4byte 0x114 - .byte 0x1d - .uleb128 0x1f - .4byte .LASF126 - .byte 0x17 - .2byte 0x13e - .4byte 0x114 - .byte 0x1e - .uleb128 0x1f - .4byte .LASF127 - .byte 0x17 - .2byte 0x13f - .4byte 0x114 - .byte 0x1f - .uleb128 0x1f - .4byte .LASF128 - .byte 0x17 - .2byte 0x140 - .4byte 0x7f6 - .byte 0x20 - .byte 0 - .uleb128 0xb - .4byte 0x114 - .4byte 0x806 - .uleb128 0x12 - .4byte 0xce - .byte 0x1f - .byte 0 - .uleb128 0x20 - .4byte .LASF129 - .byte 0x17 - .2byte 0x141 - .4byte 0x74c - .uleb128 0x1e - .4byte .LASF130 - .byte 0x30 - .byte 0x17 - .2byte 0x143 - .4byte 0x894 - .uleb128 0x1f - .4byte .LASF54 - .byte 0x17 - .2byte 0x144 - .4byte 0x109 - .byte 0 - .uleb128 0x21 - .string "end" - .byte 0x17 - .2byte 0x144 - .4byte 0x109 - .byte 0x8 - .uleb128 0x1f - .4byte .LASF131 - .byte 0x17 - .2byte 0x145 - .4byte 0x109 - .byte 0x10 - .uleb128 0x1f - .4byte .LASF132 - .byte 0x17 - .2byte 0x145 - .4byte 0x109 - .byte 0x18 - .uleb128 0x1f - .4byte .LASF133 - .byte 0x17 - .2byte 0x146 - .4byte 0x109 - .byte 0x20 - .uleb128 0x1f - .4byte .LASF134 - .byte 0x17 - .2byte 0x147 - .4byte 0x114 - .byte 0x28 - .uleb128 0x1f - .4byte .LASF135 - .byte 0x17 - .2byte 0x147 - .4byte 0x114 - .byte 0x29 - .uleb128 0x21 - .string "os" - .byte 0x17 - .2byte 0x147 - .4byte 0x114 - .byte 0x2a - .uleb128 0x1f - .4byte .LASF136 - .byte 0x17 - .2byte 0x148 - .4byte 0x114 - .byte 0x2b - .byte 0 - .uleb128 0x20 - .4byte .LASF137 - .byte 0x17 - .2byte 0x149 - .4byte 0x812 - .uleb128 0x22 - .4byte .LASF138 - .2byte 0x280 - .byte 0x17 - .2byte 0x14f - .4byte 0xa3d - .uleb128 0x1f - .4byte .LASF139 - .byte 0x17 - .2byte 0x155 - .4byte 0xa3d - .byte 0 - .uleb128 0x1f - .4byte .LASF140 - .byte 0x17 - .2byte 0x156 - .4byte 0x806 - .byte 0x8 - .uleb128 0x1f - .4byte .LASF141 - .byte 0x17 - .2byte 0x157 - .4byte 0x109 - .byte 0x48 - .uleb128 0x1f - .4byte .LASF142 - .byte 0x17 - .2byte 0x15a - .4byte 0xd5 - .byte 0x50 - .uleb128 0x1f - .4byte .LASF143 - .byte 0x17 - .2byte 0x15c - .4byte 0x135 - .byte 0x58 - .uleb128 0x1f - .4byte .LASF144 - .byte 0x17 - .2byte 0x15d - .4byte 0xd5 - .byte 0x60 - .uleb128 0x1f - .4byte .LASF145 - .byte 0x17 - .2byte 0x15e - .4byte 0x59 - .byte 0x68 - .uleb128 0x1f - .4byte .LASF146 - .byte 0x17 - .2byte 0x160 - .4byte 0x135 - .byte 0x70 - .uleb128 0x1f - .4byte .LASF147 - .byte 0x17 - .2byte 0x161 - .4byte 0xd5 - .byte 0x78 - .uleb128 0x1f - .4byte .LASF148 - .byte 0x17 - .2byte 0x162 - .4byte 0x59 - .byte 0x80 - .uleb128 0x1f - .4byte .LASF149 - .byte 0x17 - .2byte 0x164 - .4byte 0x135 - .byte 0x88 - .uleb128 0x1f - .4byte .LASF150 - .byte 0x17 - .2byte 0x165 - .4byte 0xd5 - .byte 0x90 - .uleb128 0x1f - .4byte .LASF151 - .byte 0x17 - .2byte 0x166 - .4byte 0x59 - .byte 0x98 - .uleb128 0x1f - .4byte .LASF152 - .byte 0x17 - .2byte 0x168 - .4byte 0x135 - .byte 0xa0 - .uleb128 0x1f - .4byte .LASF153 - .byte 0x17 - .2byte 0x169 - .4byte 0xd5 - .byte 0xa8 - .uleb128 0x1f - .4byte .LASF154 - .byte 0x17 - .2byte 0x16a - .4byte 0x59 - .byte 0xb0 - .uleb128 0x21 - .string "os" - .byte 0x17 - .2byte 0x16e - .4byte 0x894 - .byte 0xb8 - .uleb128 0x21 - .string "ep" - .byte 0x17 - .2byte 0x16f - .4byte 0x109 - .byte 0xe8 - .uleb128 0x1f - .4byte .LASF155 - .byte 0x17 - .2byte 0x171 - .4byte 0x109 - .byte 0xf0 - .uleb128 0x1f - .4byte .LASF156 - .byte 0x17 - .2byte 0x171 - .4byte 0x109 - .byte 0xf8 - .uleb128 0x23 - .4byte .LASF157 - .byte 0x17 - .2byte 0x173 - .4byte 0xf3 - .2byte 0x100 - .uleb128 0x23 - .4byte .LASF158 - .byte 0x17 - .2byte 0x174 - .4byte 0x109 - .2byte 0x108 - .uleb128 0x23 - .4byte .LASF159 - .byte 0x17 - .2byte 0x176 - .4byte 0x109 - .2byte 0x110 - .uleb128 0x23 - .4byte .LASF160 - .byte 0x17 - .2byte 0x177 - .4byte 0x109 - .2byte 0x118 - .uleb128 0x23 - .4byte .LASF161 - .byte 0x17 - .2byte 0x178 - .4byte 0x109 - .2byte 0x120 - .uleb128 0x23 - .4byte .LASF162 - .byte 0x17 - .2byte 0x179 - .4byte 0x109 - .2byte 0x128 - .uleb128 0x24 - .string "kbd" - .byte 0x17 - .2byte 0x17a - .4byte 0xa43 - .2byte 0x130 - .uleb128 0x23 - .4byte .LASF163 - .byte 0x17 - .2byte 0x17d - .4byte 0x59 - .2byte 0x138 - .uleb128 0x23 - .4byte .LASF164 - .byte 0x17 - .2byte 0x18a - .4byte 0x59 - .2byte 0x13c - .uleb128 0x24 - .string "lmb" - .byte 0x17 - .2byte 0x18d - .4byte 0x411 - .2byte 0x140 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x806 - .uleb128 0x9 - .byte 0x8 - .4byte 0x564 - .uleb128 0x20 - .4byte .LASF165 - .byte 0x17 - .2byte 0x18f - .4byte 0x8a0 - .uleb128 0xd - .4byte .LASF166 - .byte 0x17 - .2byte 0x191 - .4byte 0xa49 - .uleb128 0x1b - .4byte .LASF168 - .byte 0x4 - .4byte 0x59 - .byte 0x18 - .byte 0xe - .4byte 0xc7c - .uleb128 0x1c - .4byte .LASF169 - .byte 0 - .uleb128 0x1c - .4byte .LASF170 - .byte 0x1 - .uleb128 0x1c - .4byte .LASF171 - .byte 0x2 - .uleb128 0x1c - .4byte .LASF172 - .byte 0x3 - .uleb128 0x1c - .4byte .LASF173 - .byte 0x4 - .uleb128 0x1c - .4byte .LASF174 - .byte 0x5 - .uleb128 0x1c - .4byte .LASF175 - .byte 0x6 - .uleb128 0x1c - .4byte .LASF176 - .byte 0x7 - .uleb128 0x1c - .4byte .LASF177 - .byte 0x8 - .uleb128 0x1c - .4byte .LASF178 - .byte 0x9 - .uleb128 0x1c - .4byte .LASF179 - .byte 0xa - .uleb128 0x1c - .4byte .LASF180 - .byte 0xb - .uleb128 0x1c - .4byte .LASF181 - .byte 0xc - .uleb128 0x1c - .4byte .LASF182 - .byte 0xd - .uleb128 0x1c - .4byte .LASF183 - .byte 0xe - .uleb128 0x1c - .4byte .LASF184 - .byte 0xf - .uleb128 0x1c - .4byte .LASF185 - .byte 0x10 - .uleb128 0x1c - .4byte .LASF186 - .byte 0x11 - .uleb128 0x1c - .4byte .LASF187 - .byte 0x12 - .uleb128 0x1c - .4byte .LASF188 - .byte 0x13 - .uleb128 0x1c - .4byte .LASF189 - .byte 0x14 - .uleb128 0x1c - .4byte .LASF190 - .byte 0x15 - .uleb128 0x1c - .4byte .LASF191 - .byte 0x16 - .uleb128 0x1c - .4byte .LASF192 - .byte 0x17 - .uleb128 0x1c - .4byte .LASF193 - .byte 0x18 - .uleb128 0x1c - .4byte .LASF194 - .byte 0x19 - .uleb128 0x1c - .4byte .LASF195 - .byte 0x1a - .uleb128 0x1c - .4byte .LASF196 - .byte 0x1b - .uleb128 0x1c - .4byte .LASF197 - .byte 0x1c - .uleb128 0x1c - .4byte .LASF198 - .byte 0x1d - .uleb128 0x1c - .4byte .LASF199 - .byte 0x1e - .uleb128 0x1c - .4byte .LASF200 - .byte 0x1f - .uleb128 0x1c - .4byte .LASF201 - .byte 0x20 - .uleb128 0x1c - .4byte .LASF202 - .byte 0x21 - .uleb128 0x1c - .4byte .LASF203 - .byte 0x22 - .uleb128 0x1c - .4byte .LASF204 - .byte 0x23 - .uleb128 0x1c - .4byte .LASF205 - .byte 0x24 - .uleb128 0x1c - .4byte .LASF206 - .byte 0x25 - .uleb128 0x1c - .4byte .LASF207 - .byte 0x26 - .uleb128 0x1c - .4byte .LASF208 - .byte 0x27 - .uleb128 0x1c - .4byte .LASF209 - .byte 0x28 - .uleb128 0x1c - .4byte .LASF210 - .byte 0x29 - .uleb128 0x1c - .4byte .LASF211 - .byte 0x2a - .uleb128 0x1c - .4byte .LASF212 - .byte 0x2b - .uleb128 0x1c - .4byte .LASF213 - .byte 0x2c - .uleb128 0x1c - .4byte .LASF214 - .byte 0x2d - .uleb128 0x1c - .4byte .LASF215 - .byte 0x2e - .uleb128 0x1c - .4byte .LASF216 - .byte 0x2f - .uleb128 0x1c - .4byte .LASF217 - .byte 0x30 - .uleb128 0x1c - .4byte .LASF218 - .byte 0x31 - .uleb128 0x1c - .4byte .LASF219 - .byte 0x32 - .uleb128 0x1c - .4byte .LASF220 - .byte 0x33 - .uleb128 0x1c - .4byte .LASF221 - .byte 0x34 - .uleb128 0x1c - .4byte .LASF222 - .byte 0x35 - .uleb128 0x1c - .4byte .LASF223 - .byte 0x36 - .uleb128 0x1c - .4byte .LASF224 - .byte 0x37 - .uleb128 0x1c - .4byte .LASF225 - .byte 0x38 - .uleb128 0x1c - .4byte .LASF226 - .byte 0x39 - .uleb128 0x1c - .4byte .LASF227 - .byte 0x3a - .uleb128 0x1c - .4byte .LASF228 - .byte 0x3b - .uleb128 0x1c - .4byte .LASF229 - .byte 0x3c - .uleb128 0x1c - .4byte .LASF230 - .byte 0x3d - .uleb128 0x1c - .4byte .LASF231 - .byte 0x3e - .uleb128 0x1c - .4byte .LASF232 - .byte 0x3f - .uleb128 0x1c - .4byte .LASF233 - .byte 0x40 - .uleb128 0x1c - .4byte .LASF234 - .byte 0x41 - .uleb128 0x1c - .4byte .LASF235 - .byte 0x42 - .uleb128 0x1c - .4byte .LASF236 - .byte 0x43 - .uleb128 0x1c - .4byte .LASF237 - .byte 0x44 - .uleb128 0x1c - .4byte .LASF238 - .byte 0x45 - .uleb128 0x1c - .4byte .LASF239 - .byte 0x46 - .uleb128 0x1c - .4byte .LASF240 - .byte 0x47 - .uleb128 0x1c - .4byte .LASF241 - .byte 0x48 - .uleb128 0x1c - .4byte .LASF242 - .byte 0x49 - .uleb128 0x1c - .4byte .LASF243 - .byte 0x4a - .uleb128 0x1c - .4byte .LASF244 - .byte 0x4b - .uleb128 0x1c - .4byte .LASF245 - .byte 0x4c - .uleb128 0x1c - .4byte .LASF246 - .byte 0x4d - .uleb128 0x1c - .4byte .LASF247 - .byte 0x4e - .uleb128 0x1c - .4byte .LASF248 - .byte 0x4f - .uleb128 0x1c - .4byte .LASF249 - .byte 0x50 - .uleb128 0x1c - .4byte .LASF250 - .byte 0x51 - .uleb128 0x1c - .4byte .LASF251 - .byte 0x52 - .uleb128 0x1c - .4byte .LASF252 - .byte 0x53 - .uleb128 0x1c - .4byte .LASF253 - .byte 0x54 - .uleb128 0x1c - .4byte .LASF254 - .byte 0x55 - .uleb128 0x1d - .4byte .LASF255 - .sleb128 -1 - .byte 0 - .uleb128 0x25 - .byte 0x4 - .4byte 0x84 - .byte 0x24 - .byte 0xe0 - .4byte 0xc8f - .uleb128 0x1c - .4byte .LASF256 - .byte 0x5 - .byte 0 - .uleb128 0xe - .4byte .LASF257 - .byte 0x40 - .byte 0x19 - .byte 0xc - .4byte 0xd08 - .uleb128 0xf - .4byte .LASF258 - .byte 0x19 - .byte 0x22 - .4byte 0x3b - .byte 0 - .uleb128 0x10 - .string "tbu" - .byte 0x19 - .byte 0x23 - .4byte 0x84 - .byte 0x8 - .uleb128 0x10 - .string "tbl" - .byte 0x19 - .byte 0x24 - .4byte 0x84 - .byte 0xc - .uleb128 0xf - .4byte .LASF259 - .byte 0x19 - .byte 0x25 - .4byte 0x3b - .byte 0x10 - .uleb128 0xf - .4byte .LASF260 - .byte 0x19 - .byte 0x26 - .4byte 0x92 - .byte 0x18 - .uleb128 0xf - .4byte .LASF261 - .byte 0x19 - .byte 0x28 - .4byte 0x3b - .byte 0x20 - .uleb128 0xf - .4byte .LASF262 - .byte 0x19 - .byte 0x29 - .4byte 0x3b - .byte 0x28 - .uleb128 0xf - .4byte .LASF263 - .byte 0x19 - .byte 0x2b - .4byte 0x3b - .byte 0x30 - .uleb128 0xf - .4byte .LASF264 - .byte 0x19 - .byte 0x2c - .4byte 0x3b - .byte 0x38 - .byte 0 - .uleb128 0xe - .4byte .LASF265 - .byte 0x18 - .byte 0x1a - .byte 0x22 - .4byte 0xd44 - .uleb128 0xf - .4byte .LASF266 - .byte 0x1a - .byte 0x23 - .4byte 0xa8 - .byte 0 - .uleb128 0x10 - .string "id" - .byte 0x1a - .byte 0x24 - .4byte 0xa8 - .byte 0x4 - .uleb128 0xf - .4byte .LASF267 - .byte 0x1a - .byte 0x25 - .4byte 0xa8 - .byte 0x8 - .uleb128 0xf - .4byte .LASF268 - .byte 0x1a - .byte 0x26 - .4byte 0x109 - .byte 0x10 - .byte 0 - .uleb128 0x26 - .4byte .LASF269 - .2byte 0x1a0 - .byte 0x1a - .byte 0x29 - .4byte 0xf3c - .uleb128 0x10 - .string "bd" - .byte 0x1a - .byte 0x2a - .4byte 0xa43 - .byte 0 - .uleb128 0xf - .4byte .LASF42 - .byte 0x1a - .byte 0x2b - .4byte 0x3b - .byte 0x8 - .uleb128 0xf - .4byte .LASF267 - .byte 0x1a - .byte 0x2c - .4byte 0x84 - .byte 0x10 - .uleb128 0xf - .4byte .LASF270 - .byte 0x1a - .byte 0x2d - .4byte 0x3b - .byte 0x18 - .uleb128 0xf - .4byte .LASF271 - .byte 0x1a - .byte 0x2e - .4byte 0x3b - .byte 0x20 - .uleb128 0xf - .4byte .LASF272 - .byte 0x1a - .byte 0x30 - .4byte 0x3b - .byte 0x28 - .uleb128 0xf - .4byte .LASF273 - .byte 0x1a - .byte 0x31 - .4byte 0x3b - .byte 0x30 - .uleb128 0xf - .4byte .LASF274 - .byte 0x1a - .byte 0x33 - .4byte 0x3b - .byte 0x38 - .uleb128 0xf - .4byte .LASF275 - .byte 0x1a - .byte 0x3d - .4byte 0x3b - .byte 0x40 - .uleb128 0xf - .4byte .LASF276 - .byte 0x1a - .byte 0x41 - .4byte 0x3b - .byte 0x48 - .uleb128 0xf - .4byte .LASF277 - .byte 0x1a - .byte 0x42 - .4byte 0x3b - .byte 0x50 - .uleb128 0xf - .4byte .LASF278 - .byte 0x1a - .byte 0x44 - .4byte 0x3b - .byte 0x58 - .uleb128 0xf - .4byte .LASF279 - .byte 0x1a - .byte 0x45 - .4byte 0x3b - .byte 0x60 - .uleb128 0xf - .4byte .LASF280 - .byte 0x1a - .byte 0x46 - .4byte 0xc3 - .byte 0x68 - .uleb128 0xf - .4byte .LASF281 - .byte 0x1a - .byte 0x47 - .4byte 0x3b - .byte 0x70 - .uleb128 0xf - .4byte .LASF282 - .byte 0x1a - .byte 0x48 - .4byte 0x3b - .byte 0x78 - .uleb128 0xf - .4byte .LASF283 - .byte 0x1a - .byte 0x49 - .4byte 0x3b - .byte 0x80 - .uleb128 0xf - .4byte .LASF284 - .byte 0x1a - .byte 0x4a - .4byte 0x3b - .byte 0x88 - .uleb128 0xf - .4byte .LASF285 - .byte 0x1a - .byte 0x4b - .4byte 0xf3c - .byte 0x90 - .uleb128 0xf - .4byte .LASF286 - .byte 0x1a - .byte 0x4e - .4byte 0x25d - .byte 0x98 - .uleb128 0xf - .4byte .LASF287 - .byte 0x1a - .byte 0x4f - .4byte 0x25d - .byte 0xa0 - .uleb128 0xf - .4byte .LASF288 - .byte 0x1a - .byte 0x50 - .4byte 0x290 - .byte 0xa8 - .uleb128 0xf - .4byte .LASF289 - .byte 0x1a - .byte 0x56 - .4byte 0x263 - .byte 0xb8 - .uleb128 0xf - .4byte .LASF290 - .byte 0x1a - .byte 0x57 - .4byte 0x135 - .byte 0xc0 - .uleb128 0xf - .4byte .LASF291 - .byte 0x1a - .byte 0x58 - .4byte 0x3b - .byte 0xc8 - .uleb128 0xf - .4byte .LASF292 - .byte 0x1a - .byte 0x5a - .4byte 0xfb4 - .byte 0xd0 - .uleb128 0x10 - .string "jt" - .byte 0x1a - .byte 0x5c - .4byte 0xfbf - .byte 0xd8 - .uleb128 0xf - .4byte .LASF293 - .byte 0x1a - .byte 0x5d - .4byte 0xfc5 - .byte 0xe0 - .uleb128 0x16 - .4byte .LASF294 - .byte 0x1a - .byte 0x67 - .4byte 0x84 - .2byte 0x100 - .uleb128 0x16 - .4byte .LASF295 - .byte 0x1a - .byte 0x68 - .4byte 0x84 - .2byte 0x104 - .uleb128 0x16 - .4byte .LASF296 - .byte 0x1a - .byte 0x6a - .4byte 0x3b - .2byte 0x108 - .uleb128 0x16 - .4byte .LASF297 - .byte 0x1a - .byte 0x6b - .4byte 0x3b - .2byte 0x110 - .uleb128 0x16 - .4byte .LASF298 - .byte 0x1a - .byte 0x6c - .4byte 0x3b - .2byte 0x118 - .uleb128 0x16 - .4byte .LASF299 - .byte 0x1a - .byte 0x75 - .4byte 0x25d - .2byte 0x120 - .uleb128 0x16 - .4byte .LASF136 - .byte 0x1a - .byte 0x76 - .4byte 0xc8f - .2byte 0x128 - .uleb128 0x16 - .4byte .LASF300 - .byte 0x1a - .byte 0x7c - .4byte 0x109 - .2byte 0x168 - .uleb128 0x16 - .4byte .LASF301 - .byte 0x1a - .byte 0x7d - .4byte 0x109 - .2byte 0x170 - .uleb128 0x16 - .4byte .LASF302 - .byte 0x1a - .byte 0x83 - .4byte 0xb8 - .2byte 0x178 - .uleb128 0x16 - .4byte .LASF303 - .byte 0x1a - .byte 0x88 - .4byte 0xd08 - .2byte 0x180 - .uleb128 0x16 - .4byte .LASF304 - .byte 0x1a - .byte 0x89 - .4byte 0x109 - .2byte 0x198 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0xd44 - .uleb128 0xe - .4byte .LASF305 - .byte 0x40 - .byte 0x1b - .byte 0x2c - .4byte 0xfaf - .uleb128 0xf - .4byte .LASF28 - .byte 0x1b - .byte 0x2d - .4byte 0xd5 - .byte 0 - .uleb128 0xf - .4byte .LASF135 - .byte 0x1b - .byte 0x2e - .4byte 0xd5 - .byte 0x8 - .uleb128 0xf - .4byte .LASF306 - .byte 0x1b - .byte 0x2f - .4byte 0x145c - .byte 0x10 - .uleb128 0xf - .4byte .LASF307 - .byte 0x1b - .byte 0x30 - .4byte 0xd5 - .byte 0x18 - .uleb128 0xf - .4byte .LASF308 - .byte 0x1b - .byte 0x32 - .4byte 0x14a4 - .byte 0x20 - .uleb128 0xf - .4byte .LASF34 - .byte 0x1b - .byte 0x33 - .4byte 0xfb4 - .byte 0x28 - .uleb128 0xf - .4byte .LASF309 - .byte 0x1b - .byte 0x34 - .4byte 0xfb4 - .byte 0x30 - .uleb128 0xf - .4byte .LASF310 - .byte 0x1b - .byte 0x35 - .4byte 0xfb4 - .byte 0x38 - .byte 0 - .uleb128 0x8 - .4byte 0xf42 - .uleb128 0x9 - .byte 0x8 - .4byte 0xf42 - .uleb128 0x27 - .4byte .LASF481 - .uleb128 0x9 - .byte 0x8 - .4byte 0xfba - .uleb128 0xb - .4byte 0xe0 - .4byte 0xfd5 - .uleb128 0x12 - .4byte 0xce - .byte 0x1f - .byte 0 - .uleb128 0x2 - .4byte .LASF311 - .byte 0x1a - .byte 0x8f - .4byte 0xd44 - .uleb128 0x4 - .4byte 0xfd5 - .uleb128 0x5 - .4byte .LASF312 - .byte 0x5 - .byte 0xab - .4byte 0x109 - .uleb128 0xb - .4byte 0x99 - .4byte 0xffb - .uleb128 0xc - .byte 0 - .uleb128 0x5 - .4byte .LASF313 - .byte 0x5 - .byte 0xad - .4byte 0xff0 - .uleb128 0x5 - .4byte .LASF314 - .byte 0x5 - .byte 0xae - .4byte 0xff0 - .uleb128 0x5 - .4byte .LASF315 - .byte 0x5 - .byte 0xfc - .4byte 0x109 - .uleb128 0x5 - .4byte .LASF316 - .byte 0x5 - .byte 0xfd - .4byte 0x109 - .uleb128 0x5 - .4byte .LASF317 - .byte 0x5 - .byte 0xfe - .4byte 0x109 - .uleb128 0xe - .4byte .LASF318 - .byte 0x4 - .byte 0x1c - .byte 0x2e - .4byte 0x104b - .uleb128 0xf - .4byte .LASF319 - .byte 0x1c - .byte 0x2f - .4byte 0x12a - .byte 0 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x29 - .uleb128 0xe - .4byte .LASF320 - .byte 0x68 - .byte 0x1c - .byte 0xa6 - .4byte 0x10ee - .uleb128 0xf - .4byte .LASF28 - .byte 0x1c - .byte 0xa8 - .4byte 0x10ee - .byte 0 - .uleb128 0xf - .4byte .LASF321 - .byte 0x1c - .byte 0xa9 - .4byte 0x280 - .byte 0x10 - .uleb128 0xf - .4byte .LASF322 - .byte 0x1c - .byte 0xaa - .4byte 0xb8 - .byte 0x18 - .uleb128 0xf - .4byte .LASF164 - .byte 0x1c - .byte 0xab - .4byte 0x59 - .byte 0x20 - .uleb128 0xf - .4byte .LASF323 - .byte 0x1c - .byte 0xad - .4byte 0x1118 - .byte 0x28 - .uleb128 0xf - .4byte .LASF324 - .byte 0x1c - .byte 0xae - .4byte 0x1137 - .byte 0x30 - .uleb128 0xf - .4byte .LASF325 - .byte 0x1c - .byte 0xaf - .4byte 0x114c - .byte 0x38 - .uleb128 0xf - .4byte .LASF326 - .byte 0x1c - .byte 0xb0 - .4byte 0x115d - .byte 0x40 - .uleb128 0xf - .4byte .LASF327 - .byte 0x1c - .byte 0xb4 - .4byte 0x114c - .byte 0x48 - .uleb128 0xf - .4byte .LASF47 - .byte 0x1c - .byte 0xb5 - .4byte 0x1112 - .byte 0x50 - .uleb128 0xf - .4byte .LASF328 - .byte 0x1c - .byte 0xb6 - .4byte 0x59 - .byte 0x58 - .uleb128 0xf - .4byte .LASF35 - .byte 0x1c - .byte 0xb7 - .4byte 0x135 - .byte 0x60 - .byte 0 - .uleb128 0xb - .4byte 0xe0 - .4byte 0x10fe - .uleb128 0x12 - .4byte 0xce - .byte 0xf - .byte 0 - .uleb128 0x13 - .4byte 0x59 - .4byte 0x1112 - .uleb128 0x14 - .4byte 0x1112 - .uleb128 0x14 - .4byte 0xa43 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x1051 - .uleb128 0x9 - .byte 0x8 - .4byte 0x10fe - .uleb128 0x13 - .4byte 0x59 - .4byte 0x1137 - .uleb128 0x14 - .4byte 0x1112 - .uleb128 0x14 - .4byte 0x135 - .uleb128 0x14 - .4byte 0x59 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x111e - .uleb128 0x13 - .4byte 0x59 - .4byte 0x114c - .uleb128 0x14 - .4byte 0x1112 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x113d - .uleb128 0x28 - .4byte 0x115d - .uleb128 0x14 - .4byte 0x1112 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x1152 - .uleb128 0x5 - .4byte .LASF329 - .byte 0x1c - .byte 0xbd - .4byte 0x1112 - .uleb128 0x28 - .4byte 0x117e - .uleb128 0x14 - .4byte 0x135 - .uleb128 0x14 - .4byte 0x59 - .byte 0 - .uleb128 0xd - .4byte .LASF330 - .byte 0x1c - .2byte 0x11e - .4byte 0x118a - .uleb128 0x9 - .byte 0x8 - .4byte 0x116e - .uleb128 0xb - .4byte 0x99 - .4byte 0x11a0 - .uleb128 0x12 - .4byte 0xce - .byte 0x5 - .byte 0 - .uleb128 0xd - .4byte .LASF331 - .byte 0x1c - .2byte 0x1fd - .4byte 0x1032 - .uleb128 0xd - .4byte .LASF332 - .byte 0x1c - .2byte 0x1fe - .4byte 0x1032 - .uleb128 0xd - .4byte .LASF333 - .byte 0x1c - .2byte 0x200 - .4byte 0x1032 - .uleb128 0xd - .4byte .LASF334 - .byte 0x1c - .2byte 0x205 - .4byte 0xfc5 - .uleb128 0xd - .4byte .LASF335 - .byte 0x1c - .2byte 0x206 - .4byte 0xfc5 - .uleb128 0xb - .4byte 0xe0 - .4byte 0x11ec - .uleb128 0x12 - .4byte 0xce - .byte 0x3f - .byte 0 - .uleb128 0xd - .4byte .LASF336 - .byte 0x1c - .2byte 0x207 - .4byte 0x11dc - .uleb128 0xd - .4byte .LASF337 - .byte 0x1c - .2byte 0x209 - .4byte 0x1190 - .uleb128 0xd - .4byte .LASF338 - .byte 0x1c - .2byte 0x20a - .4byte 0x1190 - .uleb128 0xd - .4byte .LASF339 - .byte 0x1c - .2byte 0x20b - .4byte 0x1032 - .uleb128 0xd - .4byte .LASF340 - .byte 0x1c - .2byte 0x20c - .4byte 0x1032 - .uleb128 0xd - .4byte .LASF341 - .byte 0x1c - .2byte 0x20d - .4byte 0x104b - .uleb128 0xb - .4byte 0x104b - .4byte 0x1244 - .uleb128 0x12 - .4byte 0xce - .byte 0x3 - .byte 0 - .uleb128 0xd - .4byte .LASF342 - .byte 0x1c - .2byte 0x20e - .4byte 0x1234 - .uleb128 0xd - .4byte .LASF343 - .byte 0x1c - .2byte 0x20f - .4byte 0x104b - .uleb128 0xd - .4byte .LASF344 - .byte 0x1c - .2byte 0x210 - .4byte 0x59 - .uleb128 0xb - .4byte 0xa3 - .4byte 0x1278 - .uleb128 0x12 - .4byte 0xce - .byte 0x5 - .byte 0 - .uleb128 0x8 - .4byte 0x1268 - .uleb128 0xd - .4byte .LASF345 - .byte 0x1c - .2byte 0x211 - .4byte 0x1278 - .uleb128 0xd - .4byte .LASF346 - .byte 0x1c - .2byte 0x212 - .4byte 0x1278 - .uleb128 0xd - .4byte .LASF347 - .byte 0x1c - .2byte 0x216 - .4byte 0xfe - .uleb128 0xd - .4byte .LASF348 - .byte 0x1c - .2byte 0x217 - .4byte 0xfe - .uleb128 0xd - .4byte .LASF349 - .byte 0x1c - .2byte 0x219 - .4byte 0x59 - .uleb128 0xb - .4byte 0xe0 - .4byte 0x12ca - .uleb128 0x17 - .4byte 0xce - .2byte 0x3ff - .byte 0 - .uleb128 0xd - .4byte .LASF350 - .byte 0x1c - .2byte 0x220 - .4byte 0x12b9 - .uleb128 0xd - .4byte .LASF351 - .byte 0x1c - .2byte 0x222 - .4byte 0xa8 - .uleb128 0xd - .4byte .LASF352 - .byte 0x1c - .2byte 0x224 - .4byte 0xa8 - .uleb128 0xd - .4byte .LASF353 - .byte 0x1c - .2byte 0x230 - .4byte 0x1032 - .uleb128 0x29 - .4byte .LASF354 - .byte 0x4 - .4byte 0x84 - .byte 0x1c - .2byte 0x286 - .4byte 0x1324 - .uleb128 0x1c - .4byte .LASF355 - .byte 0 - .uleb128 0x1c - .4byte .LASF356 - .byte 0x1 - .uleb128 0x1c - .4byte .LASF357 - .byte 0x2 - .uleb128 0x1c - .4byte .LASF358 - .byte 0x3 - .byte 0 - .uleb128 0xd - .4byte .LASF359 - .byte 0x1c - .2byte 0x28c - .4byte 0x12fa - .uleb128 0xd - .4byte .LASF360 - .byte 0x1d - .2byte 0x3ba - .4byte 0x109 - .uleb128 0xd - .4byte .LASF361 - .byte 0x1d - .2byte 0x3bb - .4byte 0x109 - .uleb128 0xd - .4byte .LASF362 - .byte 0x1d - .2byte 0x3bc - .4byte 0x109 - .uleb128 0xb - .4byte 0xa8 - .4byte 0x1364 - .uleb128 0x12 - .4byte 0xce - .byte 0x1f - .byte 0 - .uleb128 0x2a - .4byte .LASF379 - .byte 0x1 - .byte 0xa - .4byte 0x1354 - .uleb128 0x9 - .byte 0x3 - .8byte g_isi_pattern - .uleb128 0x9 - .byte 0x8 - .4byte 0xa8 - .uleb128 0xe - .4byte .LASF27 - .byte 0x78 - .byte 0xb - .byte 0xee - .4byte 0x1457 - .uleb128 0xf - .4byte .LASF28 - .byte 0xb - .byte 0xef - .4byte 0xf3 - .byte 0 - .uleb128 0x10 - .string "id" - .byte 0xb - .byte 0xf0 - .4byte 0xa61 - .byte 0x8 - .uleb128 0xf - .4byte .LASF363 - .byte 0xb - .byte 0xf1 - .4byte 0x158a - .byte 0x10 - .uleb128 0xf - .4byte .LASF364 - .byte 0xb - .byte 0xf2 - .4byte 0x159f - .byte 0x18 - .uleb128 0xf - .4byte .LASF365 - .byte 0xb - .byte 0xf3 - .4byte 0x159f - .byte 0x20 - .uleb128 0xf - .4byte .LASF366 - .byte 0xb - .byte 0xf4 - .4byte 0x159f - .byte 0x28 - .uleb128 0xf - .4byte .LASF367 - .byte 0xb - .byte 0xf5 - .4byte 0x159f - .byte 0x30 - .uleb128 0xf - .4byte .LASF368 - .byte 0xb - .byte 0xf6 - .4byte 0x159f - .byte 0x38 - .uleb128 0xf - .4byte .LASF369 - .byte 0xb - .byte 0xf7 - .4byte 0x159f - .byte 0x40 - .uleb128 0xf - .4byte .LASF370 - .byte 0xb - .byte 0xf8 - .4byte 0x159f - .byte 0x48 - .uleb128 0xf - .4byte .LASF371 - .byte 0xb - .byte 0xf9 - .4byte 0x159f - .byte 0x50 - .uleb128 0xf - .4byte .LASF372 - .byte 0xb - .byte 0xfa - .4byte 0x59 - .byte 0x58 - .uleb128 0xf - .4byte .LASF373 - .byte 0xb - .byte 0xfb - .4byte 0x59 - .byte 0x5c - .uleb128 0xf - .4byte .LASF374 - .byte 0xb - .byte 0xfc - .4byte 0x59 - .byte 0x60 - .uleb128 0xf - .4byte .LASF375 - .byte 0xb - .byte 0xfd - .4byte 0x59 - .byte 0x64 - .uleb128 0x10 - .string "ops" - .byte 0xb - .byte 0xfe - .4byte 0x263 - .byte 0x68 - .uleb128 0xf - .4byte .LASF42 - .byte 0xb - .byte 0xff - .4byte 0x11f - .byte 0x70 - .byte 0 - .uleb128 0x8 - .4byte 0x137f - .uleb128 0x2 - .4byte .LASF306 - .byte 0x1b - .byte 0xf - .4byte 0xa8 - .uleb128 0xe - .4byte .LASF376 - .byte 0x20 - .byte 0x1b - .byte 0x19 - .4byte 0x14a4 - .uleb128 0xf - .4byte .LASF28 - .byte 0x1b - .byte 0x1a - .4byte 0xf3 - .byte 0 - .uleb128 0xf - .4byte .LASF377 - .byte 0x1b - .byte 0x1b - .4byte 0x59 - .byte 0x8 - .uleb128 0xf - .4byte .LASF378 - .byte 0x1b - .byte 0x1c - .4byte 0x135 - .byte 0x10 - .uleb128 0xf - .4byte .LASF47 - .byte 0x1b - .byte 0x1d - .4byte 0x14a4 - .byte 0x18 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x1467 - .uleb128 0x2b - .string "gd" - .byte 0x1b - .byte 0x57 - .4byte 0x14b4 - .uleb128 0x9 - .byte 0x8 - .4byte 0xfe0 - .uleb128 0x2c - .4byte .LASF482 - .byte 0x8 - .byte 0x1e - .byte 0x33 - .4byte 0x14dc - .uleb128 0x2d - .string "np" - .byte 0x1e - .byte 0x34 - .4byte 0x14dc - .uleb128 0x2e - .4byte .LASF380 - .byte 0x1e - .byte 0x35 - .4byte 0xec - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0xfaf - .uleb128 0x2 - .4byte .LASF381 - .byte 0x1e - .byte 0x36 - .4byte 0x14ba - .uleb128 0xe - .4byte .LASF382 - .byte 0x4 - .byte 0x1f - .byte 0xc - .4byte 0x1506 - .uleb128 0x10 - .string "pid" - .byte 0x1f - .byte 0xd - .4byte 0x59 - .byte 0 - .byte 0 - .uleb128 0x5 - .4byte .LASF383 - .byte 0x1f - .byte 0x10 - .4byte 0x1511 - .uleb128 0x9 - .byte 0x8 - .4byte 0x14ed - .uleb128 0x9 - .byte 0x8 - .4byte 0x1457 - .uleb128 0xe - .4byte .LASF36 - .byte 0x30 - .byte 0x20 - .byte 0x23 - .4byte 0x155a - .uleb128 0xf - .4byte .LASF35 - .byte 0x20 - .byte 0x24 - .4byte 0x135 - .byte 0 - .uleb128 0xf - .4byte .LASF384 - .byte 0x20 - .byte 0x25 - .4byte 0x1689 - .byte 0x8 - .uleb128 0xf - .4byte .LASF385 - .byte 0x20 - .byte 0x26 - .4byte 0x290 - .byte 0x10 - .uleb128 0xf - .4byte .LASF41 - .byte 0x20 - .byte 0x27 - .4byte 0x290 - .byte 0x20 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x151d - .uleb128 0xe - .4byte .LASF386 - .byte 0x10 - .byte 0xb - .byte 0xb5 - .4byte 0x1585 - .uleb128 0xf - .4byte .LASF387 - .byte 0xb - .byte 0xb6 - .4byte 0xd5 - .byte 0 - .uleb128 0xf - .4byte .LASF388 - .byte 0xb - .byte 0xb7 - .4byte 0x109 - .byte 0x8 - .byte 0 - .uleb128 0x8 - .4byte 0x1560 - .uleb128 0x9 - .byte 0x8 - .4byte 0x1585 - .uleb128 0x13 - .4byte 0x59 - .4byte 0x159f - .uleb128 0x14 - .4byte 0x25d - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x1590 - .uleb128 0xe - .4byte .LASF389 - .byte 0x80 - .byte 0x20 - .byte 0x54 - .4byte 0x1689 - .uleb128 0xf - .4byte .LASF28 - .byte 0x20 - .byte 0x55 - .4byte 0xd5 - .byte 0 - .uleb128 0x10 - .string "id" - .byte 0x20 - .byte 0x56 - .4byte 0xa61 - .byte 0x8 - .uleb128 0xf - .4byte .LASF390 - .byte 0x20 - .byte 0x57 - .4byte 0x159f - .byte 0x10 - .uleb128 0xf - .4byte .LASF391 - .byte 0x20 - .byte 0x58 - .4byte 0x159f - .byte 0x18 - .uleb128 0xf - .4byte .LASF392 - .byte 0x20 - .byte 0x59 - .4byte 0x159f - .byte 0x20 - .uleb128 0xf - .4byte .LASF393 - .byte 0x20 - .byte 0x5a - .4byte 0x159f - .byte 0x28 - .uleb128 0xf - .4byte .LASF394 - .byte 0x20 - .byte 0x5b - .4byte 0x159f - .byte 0x30 - .uleb128 0xf - .4byte .LASF369 - .byte 0x20 - .byte 0x5c - .4byte 0x159f - .byte 0x38 - .uleb128 0xf - .4byte .LASF370 - .byte 0x20 - .byte 0x5d - .4byte 0x159f - .byte 0x40 - .uleb128 0xf - .4byte .LASF323 - .byte 0x20 - .byte 0x5e - .4byte 0x169e - .byte 0x48 - .uleb128 0xf - .4byte .LASF395 - .byte 0x20 - .byte 0x5f - .4byte 0x169e - .byte 0x50 - .uleb128 0xf - .4byte .LASF372 - .byte 0x20 - .byte 0x60 - .4byte 0x59 - .byte 0x58 - .uleb128 0xf - .4byte .LASF396 - .byte 0x20 - .byte 0x61 - .4byte 0x59 - .byte 0x5c - .uleb128 0xf - .4byte .LASF397 - .byte 0x20 - .byte 0x62 - .4byte 0x59 - .byte 0x60 - .uleb128 0xf - .4byte .LASF374 - .byte 0x20 - .byte 0x63 - .4byte 0x59 - .byte 0x64 - .uleb128 0xf - .4byte .LASF375 - .byte 0x20 - .byte 0x64 - .4byte 0x59 - .byte 0x68 - .uleb128 0x10 - .string "ops" - .byte 0x20 - .byte 0x65 - .4byte 0x263 - .byte 0x70 - .uleb128 0xf - .4byte .LASF42 - .byte 0x20 - .byte 0x66 - .4byte 0x11f - .byte 0x78 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x15a5 - .uleb128 0x13 - .4byte 0x59 - .4byte 0x169e - .uleb128 0x14 - .4byte 0x155a - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x168f - .uleb128 0x5 - .4byte .LASF398 - .byte 0x21 - .byte 0xb - .4byte 0x149 - .uleb128 0xe - .4byte .LASF399 - .byte 0x70 - .byte 0x22 - .byte 0x16 - .4byte 0x1740 - .uleb128 0xf - .4byte .LASF42 - .byte 0x22 - .byte 0x17 - .4byte 0x59 - .byte 0 - .uleb128 0x10 - .string "ext" - .byte 0x22 - .byte 0x18 - .4byte 0x59 - .byte 0x4 - .uleb128 0xf - .4byte .LASF28 - .byte 0x22 - .byte 0x19 - .4byte 0xfc5 - .byte 0x8 - .uleb128 0xf - .4byte .LASF54 - .byte 0x22 - .byte 0x1d - .4byte 0x1755 - .byte 0x28 - .uleb128 0xf - .4byte .LASF400 - .byte 0x22 - .byte 0x1e - .4byte 0x1755 - .byte 0x30 - .uleb128 0xf - .4byte .LASF401 - .byte 0x22 - .byte 0x23 - .4byte 0x176b - .byte 0x38 - .uleb128 0xf - .4byte .LASF402 - .byte 0x22 - .byte 0x25 - .4byte 0x1781 - .byte 0x40 - .uleb128 0xf - .4byte .LASF403 - .byte 0x22 - .byte 0x2a - .4byte 0x1755 - .byte 0x48 - .uleb128 0xf - .4byte .LASF404 - .byte 0x22 - .byte 0x2b - .4byte 0x1755 - .byte 0x50 - .uleb128 0xf - .4byte .LASF35 - .byte 0x22 - .byte 0x2f - .4byte 0x135 - .byte 0x58 - .uleb128 0xf - .4byte .LASF405 - .byte 0x22 - .byte 0x30 - .4byte 0x290 - .byte 0x60 - .byte 0 - .uleb128 0x13 - .4byte 0x59 - .4byte 0x174f - .uleb128 0x14 - .4byte 0x174f - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x16af - .uleb128 0x9 - .byte 0x8 - .4byte 0x1740 - .uleb128 0x28 - .4byte 0x176b - .uleb128 0x14 - .4byte 0x174f - .uleb128 0x14 - .4byte 0xe7 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x175b - .uleb128 0x28 - .4byte 0x1781 - .uleb128 0x14 - .4byte 0x174f - .uleb128 0x14 - .4byte 0xd5 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x1771 - .uleb128 0xb - .4byte 0x174f - .4byte 0x1792 - .uleb128 0xc - .byte 0 - .uleb128 0x5 - .4byte .LASF406 - .byte 0x22 - .byte 0x48 - .4byte 0x1787 - .uleb128 0xb - .4byte 0xf3 - .4byte 0x17ad - .uleb128 0x12 - .4byte 0xce - .byte 0x2 - .byte 0 - .uleb128 0x5 - .4byte .LASF407 - .byte 0x22 - .byte 0x49 - .4byte 0x179d - .uleb128 0xb - .4byte 0x17c8 - .4byte 0x17c8 - .uleb128 0x12 - .4byte 0xce - .byte 0x2 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x174f - .uleb128 0x5 - .4byte .LASF408 - .byte 0x23 - .byte 0x15 - .4byte 0x17b8 - .uleb128 0xb - .4byte 0x59 - .4byte 0x17e9 - .uleb128 0x12 - .4byte 0xce - .byte 0x2 - .byte 0 - .uleb128 0x5 - .4byte .LASF409 - .byte 0x23 - .byte 0x1a - .4byte 0x17d9 - .uleb128 0x25 - .byte 0x4 - .4byte 0x84 - .byte 0x2 - .byte 0x13 - .4byte 0x1831 - .uleb128 0x1c - .4byte .LASF410 - .byte 0 - .uleb128 0x1c - .4byte .LASF411 - .byte 0x1 - .uleb128 0x1c - .4byte .LASF412 - .byte 0x2 - .uleb128 0x1c - .4byte .LASF413 - .byte 0x3 - .uleb128 0x1c - .4byte .LASF414 - .byte 0x4 - .uleb128 0x1c - .4byte .LASF415 - .byte 0x5 - .uleb128 0x1c - .4byte .LASF416 - .byte 0x6 - .uleb128 0x1c - .4byte .LASF417 - .byte 0x7 - .byte 0 - .uleb128 0xb - .4byte 0xdb - .4byte 0x1841 - .uleb128 0x12 - .4byte 0xce - .byte 0x6 - .byte 0 - .uleb128 0x8 - .4byte 0x1831 - .uleb128 0x2a - .4byte .LASF418 - .byte 0x2 - .byte 0x1e - .4byte 0x1841 - .uleb128 0x9 - .byte 0x3 - .8byte test_pattern - .uleb128 0xb - .4byte 0xa3 - .4byte 0x186b - .uleb128 0x12 - .4byte 0xce - .byte 0x6 - .byte 0 - .uleb128 0x8 - .4byte 0x185b - .uleb128 0x2a - .4byte .LASF419 - .byte 0x2 - .byte 0x28 - .4byte 0x186b - .uleb128 0x9 - .byte 0x3 - .8byte test_pat_param - .uleb128 0x2f - .4byte .LASF420 - .byte 0x2 - .2byte 0x136 - .4byte 0x67c - .uleb128 0x9 - .byte 0x3 - .8byte _u_boot_list_2_cmd_2_ddr_test - .uleb128 0x30 - .4byte .LASF429 - .byte 0x4 - .byte 0x60 - .4byte 0x59 - .8byte .LFB271 - .8byte .LFE271-.LFB271 - .uleb128 0x1 - .byte 0x9c - .4byte 0x1b4f - .uleb128 0x31 - .4byte .LASF421 - .byte 0x4 - .byte 0x60 - .4byte 0x109 - .4byte .LLST15 - .uleb128 0x31 - .4byte .LASF422 - .byte 0x4 - .byte 0x60 - .4byte 0x109 - .4byte .LLST16 - .uleb128 0x32 - .string "ret" - .byte 0x4 - .byte 0x62 - .4byte 0x59 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x33 - .4byte 0x1bc3 - .8byte .LBB6 - .4byte .Ldebug_ranges0+0 - .byte 0x4 - .byte 0x64 - .4byte 0x1a2b - .uleb128 0x34 - .4byte 0x1bde - .4byte .LLST17 - .uleb128 0x34 - .4byte 0x1bd3 - .4byte .LLST18 - .uleb128 0x35 - .4byte .Ldebug_ranges0+0 - .uleb128 0x36 - .4byte 0x1be9 - .4byte .LLST19 - .uleb128 0x36 - .4byte 0x1bf2 - .4byte .LLST20 - .uleb128 0x36 - .4byte 0x1bfb - .4byte .LLST21 - .uleb128 0x36 - .4byte 0x1c06 - .4byte .LLST22 - .uleb128 0x37 - .4byte 0x1c11 - .uleb128 0x36 - .4byte 0x1c1c - .4byte .LLST23 - .uleb128 0x36 - .4byte 0x1c27 - .4byte .LLST24 - .uleb128 0x36 - .4byte 0x1c32 - .4byte .LLST25 - .uleb128 0x38 - .8byte .LVL64 - .4byte 0x26e7 - .4byte 0x1981 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x6 - .byte 0x11 - .sleb128 -2139062144 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x84 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL66 - .4byte 0x26f3 - .4byte 0x199f - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x88 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x86 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL72 - .4byte 0x26f3 - .4byte 0x19b9 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x4 - .byte 0x8f - .sleb128 192 - .byte 0x6 - .byte 0 - .uleb128 0x38 - .8byte .LVL76 - .4byte 0x26fe - .4byte 0x19d7 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8c - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x8c - .sleb128 4 - .byte 0 - .uleb128 0x38 - .8byte .LVL78 - .4byte 0x26f3 - .4byte 0x19f6 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC10 - .byte 0 - .uleb128 0x3a - .8byte .LVL79 - .4byte 0x26f3 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC11 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x8c - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x8a - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x53 - .uleb128 0x2 - .byte 0x8b - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x54 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x3b - .4byte 0x1b4f - .8byte .LBB15 - .4byte .Ldebug_ranges0+0x60 - .byte 0x4 - .byte 0x66 - .uleb128 0x3c - .4byte 0x1b6a - .uleb128 0x3c - .4byte 0x1b5f - .uleb128 0x35 - .4byte .Ldebug_ranges0+0x60 - .uleb128 0x36 - .4byte 0x1b75 - .4byte .LLST26 - .uleb128 0x36 - .4byte 0x1b7e - .4byte .LLST27 - .uleb128 0x3d - .4byte 0x1b87 - .uleb128 0x1 - .byte 0x66 - .uleb128 0x3d - .4byte 0x1b92 - .uleb128 0x1 - .byte 0x69 - .uleb128 0x3d - .4byte 0x1b9d - .uleb128 0x1 - .byte 0x6b - .uleb128 0x37 - .4byte 0x1ba8 - .uleb128 0x36 - .4byte 0x1bb1 - .4byte .LLST28 - .uleb128 0x38 - .8byte .LVL85 - .4byte 0x26f3 - .4byte 0x1aa0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8a - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL87 - .4byte 0x26e7 - .4byte 0x1ac4 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x86 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x84 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL91 - .4byte 0x26f3 - .4byte 0x1adc - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x88 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL96 - .4byte 0x26fe - .4byte 0x1afa - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x87 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x87 - .sleb128 4 - .byte 0 - .uleb128 0x38 - .8byte .LVL99 - .4byte 0x26f3 - .4byte 0x1b19 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC14 - .byte 0 - .uleb128 0x3a - .8byte .LVL100 - .4byte 0x26f3 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC15 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x87 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x89 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x53 - .uleb128 0x2 - .byte 0x8b - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x54 - .uleb128 0x2 - .byte 0x86 - .sleb128 0 - .byte 0 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x3e - .4byte .LASF426 - .byte 0x4 - .byte 0x36 - .4byte 0x59 - .byte 0x1 - .4byte 0x1bbd - .uleb128 0x3f - .4byte .LASF421 - .byte 0x4 - .byte 0x36 - .4byte 0x109 - .uleb128 0x3f - .4byte .LASF422 - .byte 0x4 - .byte 0x36 - .4byte 0x109 - .uleb128 0x40 - .string "i" - .byte 0x4 - .byte 0x38 - .4byte 0x109 - .uleb128 0x40 - .string "j" - .byte 0x4 - .byte 0x38 - .4byte 0x109 - .uleb128 0x41 - .4byte .LASF423 - .byte 0x4 - .byte 0x39 - .4byte 0x109 - .uleb128 0x41 - .4byte .LASF378 - .byte 0x4 - .byte 0x39 - .4byte 0x109 - .uleb128 0x41 - .4byte .LASF424 - .byte 0x4 - .byte 0x3a - .4byte 0x109 - .uleb128 0x40 - .string "p" - .byte 0x4 - .byte 0x3b - .4byte 0x1bbd - .uleb128 0x41 - .4byte .LASF425 - .byte 0x4 - .byte 0x3c - .4byte 0x109 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x42 - .uleb128 0x3e - .4byte .LASF427 - .byte 0x4 - .byte 0xb - .4byte 0x59 - .byte 0x1 - .4byte 0x1c3e - .uleb128 0x3f - .4byte .LASF421 - .byte 0x4 - .byte 0xb - .4byte 0x109 - .uleb128 0x3f - .4byte .LASF422 - .byte 0x4 - .byte 0xb - .4byte 0x109 - .uleb128 0x40 - .string "i" - .byte 0x4 - .byte 0xd - .4byte 0xa8 - .uleb128 0x40 - .string "j" - .byte 0x4 - .byte 0xd - .4byte 0xa8 - .uleb128 0x41 - .4byte .LASF428 - .byte 0x4 - .byte 0xe - .4byte 0xa8 - .uleb128 0x41 - .4byte .LASF423 - .byte 0x4 - .byte 0xe - .4byte 0xa8 - .uleb128 0x41 - .4byte .LASF378 - .byte 0x4 - .byte 0xe - .4byte 0xa8 - .uleb128 0x41 - .4byte .LASF424 - .byte 0x4 - .byte 0xf - .4byte 0xa8 - .uleb128 0x40 - .string "p32" - .byte 0x4 - .byte 0x10 - .4byte 0x1c3e - .uleb128 0x41 - .4byte .LASF425 - .byte 0x4 - .byte 0x11 - .4byte 0x109 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0xb3 - .uleb128 0x30 - .4byte .LASF430 - .byte 0x3 - .byte 0xf - .4byte 0x59 - .8byte .LFB268 - .8byte .LFE268-.LFB268 - .uleb128 0x1 - .byte 0x9c - .4byte 0x1e70 - .uleb128 0x31 - .4byte .LASF431 - .byte 0x3 - .byte 0xf - .4byte 0x109 - .4byte .LLST9 - .uleb128 0x31 - .4byte .LASF377 - .byte 0x3 - .byte 0xf - .4byte 0x109 - .4byte .LLST10 - .uleb128 0x42 - .4byte .LASF268 - .byte 0x3 - .byte 0x11 - .4byte 0x109 - .4byte .LLST11 - .uleb128 0x2a - .4byte .LASF432 - .byte 0x3 - .byte 0x11 - .4byte 0x109 - .uleb128 0x1 - .byte 0x64 - .uleb128 0x42 - .4byte .LASF433 - .byte 0x3 - .byte 0x12 - .4byte 0x59 - .4byte .LLST12 - .uleb128 0x2a - .4byte .LASF434 - .byte 0x3 - .byte 0x13 - .4byte 0x1e70 - .uleb128 0x2 - .byte 0x91 - .sleb128 -32 - .uleb128 0x43 - .string "col" - .byte 0x3 - .byte 0x15 - .4byte 0xa8 - .4byte .LLST13 - .uleb128 0x2a - .4byte .LASF435 - .byte 0x3 - .byte 0x15 - .4byte 0xa8 - .uleb128 0x1 - .byte 0x65 - .uleb128 0x42 - .4byte .LASF436 - .byte 0x3 - .byte 0x16 - .4byte 0x109 - .4byte .LLST14 - .uleb128 0x44 - .4byte .LASF483 - .byte 0x3 - .byte 0x3e - .8byte .L31 - .uleb128 0x38 - .8byte .LVL38 - .4byte 0x270a - .4byte 0x1d22 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x3 - .byte 0x8f - .sleb128 144 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x9 - .byte 0x3 - .8byte .LANCHOR1 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .byte 0 - .uleb128 0x38 - .8byte .LVL39 - .4byte 0x26f3 - .4byte 0x1d41 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC6 - .byte 0 - .uleb128 0x45 - .8byte .LVL40 - .4byte 0x2713 - .uleb128 0x38 - .8byte .LVL42 - .4byte 0x26f3 - .4byte 0x1d73 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC7 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL49 - .4byte 0x271e - .4byte 0x1d92 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x3 - .byte 0x8f - .sleb128 144 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .byte 0 - .uleb128 0x38 - .8byte .LVL50 - .4byte 0x2729 - .4byte 0x1db7 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x89 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x3 - .byte 0x8f - .sleb128 144 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .byte 0 - .uleb128 0x38 - .8byte .LVL53 - .4byte 0x2729 - .4byte 0x1ddc - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8a - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x3 - .byte 0x8f - .sleb128 144 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .byte 0 - .uleb128 0x38 - .8byte .LVL54 - .4byte 0x2735 - .4byte 0x1e12 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x3 - .byte 0x8f - .sleb128 144 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x8 - .byte 0x84 - .sleb128 0 - .byte 0x88 - .sleb128 0 - .byte 0x22 - .byte 0x89 - .sleb128 0 - .byte 0x22 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x53 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x54 - .uleb128 0x1 - .byte 0x31 - .byte 0 - .uleb128 0x38 - .8byte .LVL59 - .4byte 0x2729 - .4byte 0x1e43 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0xe - .byte 0x85 - .sleb128 0 - .byte 0xc - .4byte 0xffffffff - .byte 0x1a - .byte 0x84 - .sleb128 0 - .byte 0x22 - .byte 0x89 - .sleb128 0 - .byte 0x22 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x3 - .byte 0x8f - .sleb128 144 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .byte 0 - .uleb128 0x3a - .8byte .LVL60 - .4byte 0x2735 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x3 - .byte 0x8f - .sleb128 144 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x8a - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x53 - .uleb128 0x2 - .byte 0x8 - .byte 0x20 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x54 - .uleb128 0x1 - .byte 0x31 - .byte 0 - .byte 0 - .uleb128 0xb - .4byte 0xa8 - .4byte 0x1e80 - .uleb128 0x12 - .4byte 0xce - .byte 0x7 - .byte 0 - .uleb128 0x46 - .4byte .LASF448 - .byte 0x2 - .byte 0x62 - .4byte 0x59 - .8byte .LFB256 - .8byte .LFE256-.LFB256 - .uleb128 0x1 - .byte 0x9c - .4byte 0x2293 - .uleb128 0x31 - .4byte .LASF437 - .byte 0x2 - .byte 0x62 - .4byte 0x2293 - .4byte .LLST37 - .uleb128 0x31 - .4byte .LASF438 - .byte 0x2 - .byte 0x62 - .4byte 0x59 - .4byte .LLST38 - .uleb128 0x31 - .4byte .LASF439 - .byte 0x2 - .byte 0x62 - .4byte 0x59 - .4byte .LLST39 - .uleb128 0x31 - .4byte .LASF440 - .byte 0x2 - .byte 0x63 - .4byte 0x641 - .4byte .LLST40 - .uleb128 0x43 - .string "i" - .byte 0x2 - .byte 0x65 - .4byte 0x59 - .4byte .LLST41 - .uleb128 0x42 - .4byte .LASF441 - .byte 0x2 - .byte 0x66 - .4byte 0x59 - .4byte .LLST42 - .uleb128 0x42 - .4byte .LASF442 - .byte 0x2 - .byte 0x66 - .4byte 0x59 - .4byte .LLST43 - .uleb128 0x32 - .string "arg" - .byte 0x2 - .byte 0x67 - .4byte 0x2299 - .uleb128 0x2 - .byte 0x91 - .sleb128 -40 - .uleb128 0x2a - .4byte .LASF431 - .byte 0x2 - .byte 0x68 - .4byte 0x22a9 - .uleb128 0x3 - .byte 0x91 - .sleb128 -104 - .uleb128 0x2a - .4byte .LASF377 - .byte 0x2 - .byte 0x69 - .4byte 0x22a9 - .uleb128 0x3 - .byte 0x91 - .sleb128 -72 - .uleb128 0x42 - .4byte .LASF443 - .byte 0x2 - .byte 0x6a - .4byte 0xa8 - .4byte .LLST44 - .uleb128 0x42 - .4byte .LASF444 - .byte 0x2 - .byte 0x6b - .4byte 0xa8 - .4byte .LLST45 - .uleb128 0x42 - .4byte .LASF445 - .byte 0x2 - .byte 0x6c - .4byte 0xa8 - .4byte .LLST46 - .uleb128 0x43 - .string "ret" - .byte 0x2 - .byte 0x6d - .4byte 0x59 - .4byte .LLST47 - .uleb128 0x42 - .4byte .LASF446 - .byte 0x2 - .byte 0x6e - .4byte 0x59 - .4byte .LLST48 - .uleb128 0x42 - .4byte .LASF447 - .byte 0x2 - .byte 0x6f - .4byte 0xa8 - .4byte .LLST49 - .uleb128 0x32 - .string "dev" - .byte 0x2 - .byte 0x91 - .4byte 0x25d - .uleb128 0x3 - .byte 0x91 - .sleb128 -112 - .uleb128 0x38 - .8byte .LVL132 - .4byte 0x26f3 - .4byte 0x1fbc - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC18 - .byte 0 - .uleb128 0x38 - .8byte .LVL133 - .4byte 0x2740 - .4byte 0x1fdf - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x84 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x1 - .byte 0x31 - .byte 0 - .uleb128 0x38 - .8byte .LVL135 - .4byte 0x274b - .4byte 0x1ffd - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x8 - .byte 0x89 - .sleb128 0 - .byte 0x33 - .byte 0x24 - .byte 0x8b - .sleb128 0 - .byte 0x22 - .byte 0x6 - .byte 0 - .uleb128 0x45 - .8byte .LVL139 - .4byte 0x26f3 - .uleb128 0x38 - .8byte .LVL141 - .4byte 0x2756 - .4byte 0x202d - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x1 - .byte 0x30 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x8 - .byte 0x8f - .sleb128 0 - .byte 0x8b - .sleb128 0 - .byte 0x22 - .byte 0x23 - .uleb128 0x110 - .byte 0 - .uleb128 0x45 - .8byte .LVL143 - .4byte 0x2761 - .uleb128 0x45 - .8byte .LVL144 - .4byte 0x23eb - .uleb128 0x45 - .8byte .LVL145 - .4byte 0x241b - .uleb128 0x38 - .8byte .LVL146 - .4byte 0x26f3 - .4byte 0x2073 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC26 - .byte 0 - .uleb128 0x45 - .8byte .LVL148 - .4byte 0x23eb - .uleb128 0x45 - .8byte .LVL149 - .4byte 0x22b9 - .uleb128 0x45 - .8byte .LVL150 - .4byte 0x23eb - .uleb128 0x38 - .8byte .LVL161 - .4byte 0x26f3 - .4byte 0x20b8 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8a - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x89 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL162 - .4byte 0x26f3 - .4byte 0x20d6 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8b - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .byte 0 - .uleb128 0x45 - .8byte .LVL163 - .4byte 0x241b - .uleb128 0x45 - .8byte .LVL164 - .4byte 0x189b - .uleb128 0x45 - .8byte .LVL167 - .4byte 0x244c - .uleb128 0x45 - .8byte .LVL170 - .4byte 0x1c44 - .uleb128 0x38 - .8byte .LVL173 - .4byte 0x22b9 - .4byte 0x2126 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x6 - .byte 0x8c - .sleb128 0 - .byte 0xa - .2byte 0x3fc - .byte 0x1a - .byte 0 - .uleb128 0x45 - .8byte .LVL176 - .4byte 0x241b - .uleb128 0x45 - .8byte .LVL177 - .4byte 0x189b - .uleb128 0x45 - .8byte .LVL180 - .4byte 0x244c - .uleb128 0x45 - .8byte .LVL183 - .4byte 0x1c44 - .uleb128 0x45 - .8byte .LVL185 - .4byte 0x276c - .uleb128 0x38 - .8byte .LVL192 - .4byte 0x26f3 - .4byte 0x2198 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC25 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0xe - .byte 0x86 - .sleb128 0 - .byte 0x33 - .byte 0x24 - .byte 0x9 - .byte 0xe5 - .byte 0x24 - .byte 0x9 - .byte 0xe5 - .byte 0x26 - .byte 0x88 - .sleb128 0 - .byte 0x22 - .byte 0x6 - .byte 0 - .uleb128 0x38 - .8byte .LVL195 - .4byte 0x26f3 - .4byte 0x21bc - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC28 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x1 - .byte 0x3a - .byte 0 - .uleb128 0x38 - .8byte .LVL205 - .4byte 0x2777 - .4byte 0x21e1 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x3 - .byte 0x8f - .sleb128 296 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x84 - .sleb128 0 - .byte 0 - .uleb128 0x45 - .8byte .LVL208 - .4byte 0x241b - .uleb128 0x45 - .8byte .LVL209 - .4byte 0x23eb - .uleb128 0x38 - .8byte .LVL213 - .4byte 0x26f3 - .4byte 0x2219 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8a - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x89 - .sleb128 0 - .byte 0 - .uleb128 0x45 - .8byte .LVL218 - .4byte 0x189b - .uleb128 0x45 - .8byte .LVL220 - .4byte 0x276c - .uleb128 0x45 - .8byte .LVL223 - .4byte 0x244c - .uleb128 0x45 - .8byte .LVL224 - .4byte 0x1c44 - .uleb128 0x38 - .8byte .LVL231 - .4byte 0x2782 - .4byte 0x2271 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8 - .byte 0x35 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x1 - .byte 0x30 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x3 - .byte 0x8f - .sleb128 208 - .byte 0 - .uleb128 0x3a - .8byte .LVL234 - .4byte 0x26f3 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC21 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x87 - .sleb128 0 - .byte 0 - .byte 0 - .uleb128 0x9 - .byte 0x8 - .4byte 0x67c - .uleb128 0xb - .4byte 0x109 - .4byte 0x22a9 - .uleb128 0x12 - .4byte 0xce - .byte 0x4 - .byte 0 - .uleb128 0xb - .4byte 0x109 - .4byte 0x22b9 - .uleb128 0x12 - .4byte 0xce - .byte 0x3 - .byte 0 - .uleb128 0x46 - .4byte .LASF449 - .byte 0x2 - .byte 0x36 - .4byte 0x59 - .8byte .LFB255 - .8byte .LFE255-.LFB255 - .uleb128 0x1 - .byte 0x9c - .4byte 0x23eb - .uleb128 0x31 - .4byte .LASF450 - .byte 0x2 - .byte 0x36 - .4byte 0xa8 - .4byte .LLST29 - .uleb128 0x31 - .4byte .LASF451 - .byte 0x2 - .byte 0x36 - .4byte 0xa8 - .4byte .LLST30 - .uleb128 0x31 - .4byte .LASF452 - .byte 0x2 - .byte 0x36 - .4byte 0x109 - .4byte .LLST31 - .uleb128 0x43 - .string "i" - .byte 0x2 - .byte 0x39 - .4byte 0xa8 - .4byte .LLST32 - .uleb128 0x42 - .4byte .LASF453 - .byte 0x2 - .byte 0x3a - .4byte 0xa8 - .4byte .LLST33 - .uleb128 0x42 - .4byte .LASF454 - .byte 0x2 - .byte 0x3a - .4byte 0xa8 - .4byte .LLST34 - .uleb128 0x42 - .4byte .LASF455 - .byte 0x2 - .byte 0x3a - .4byte 0xa8 - .4byte .LLST35 - .uleb128 0x43 - .string "ret" - .byte 0x2 - .byte 0x3b - .4byte 0x59 - .4byte .LLST36 - .uleb128 0x45 - .8byte .LVL111 - .4byte 0x278d - .uleb128 0x38 - .8byte .LVL113 - .4byte 0x26f3 - .4byte 0x2381 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x88 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x87 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x84 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL114 - .4byte 0x241b - .4byte 0x239f - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x8 - .byte 0x84 - .sleb128 0 - .byte 0xc - .4byte 0xffffffc0 - .byte 0x1a - .byte 0 - .uleb128 0x38 - .8byte .LVL117 - .4byte 0x189b - .4byte 0x23b8 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x3 - .byte 0x40 - .byte 0x40 - .byte 0x24 - .byte 0 - .uleb128 0x38 - .8byte .LVL120 - .4byte 0x26f3 - .4byte 0x23dd - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC17 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x8a - .sleb128 0 - .byte 0 - .uleb128 0x45 - .8byte .LVL125 - .4byte 0x276c - .byte 0 - .uleb128 0x30 - .4byte .LASF456 - .byte 0x2 - .byte 0x31 - .4byte 0x59 - .8byte .LFB254 - .8byte .LFE254-.LFB254 - .uleb128 0x1 - .byte 0x9c - .4byte 0x241b - .uleb128 0x47 - .string "uv" - .byte 0x2 - .byte 0x31 - .4byte 0xa8 - .4byte .LLST8 - .byte 0 - .uleb128 0x30 - .4byte .LASF457 - .byte 0x2 - .byte 0x2c - .4byte 0x59 - .8byte .LFB253 - .8byte .LFE253-.LFB253 - .uleb128 0x1 - .byte 0x9c - .4byte 0x244c - .uleb128 0x31 - .4byte .LASF455 - .byte 0x2 - .byte 0x2c - .4byte 0x109 - .4byte .LLST7 - .byte 0 - .uleb128 0x30 - .4byte .LASF458 - .byte 0x1 - .byte 0x2d - .4byte 0x59 - .8byte .LFB200 - .8byte .LFE200-.LFB200 - .uleb128 0x1 - .byte 0x9c - .4byte 0x26d2 - .uleb128 0x31 - .4byte .LASF431 - .byte 0x1 - .byte 0x2d - .4byte 0x109 - .4byte .LLST0 - .uleb128 0x31 - .4byte .LASF377 - .byte 0x1 - .byte 0x2d - .4byte 0x109 - .4byte .LLST1 - .uleb128 0x42 - .4byte .LASF459 - .byte 0x1 - .byte 0x2f - .4byte 0xa8 - .4byte .LLST2 - .uleb128 0x43 - .string "i" - .byte 0x1 - .byte 0x2f - .4byte 0xa8 - .4byte .LLST3 - .uleb128 0x43 - .string "j" - .byte 0x1 - .byte 0x2f - .4byte 0xa8 - .4byte .LLST4 - .uleb128 0x43 - .string "q" - .byte 0x1 - .byte 0x2f - .4byte 0xa8 - .4byte .LLST5 - .uleb128 0x32 - .string "buf" - .byte 0x1 - .byte 0x30 - .4byte 0x1e70 - .uleb128 0x2 - .byte 0x91 - .sleb128 -32 - .uleb128 0x43 - .string "p" - .byte 0x1 - .byte 0x31 - .4byte 0x1379 - .4byte .LLST6 - .uleb128 0x48 - .4byte .LASF460 - .4byte 0x26e2 - .uleb128 0x9 - .byte 0x3 - .8byte .LC35 - .uleb128 0x38 - .8byte .LVL2 - .4byte 0x26f3 - .4byte 0x250e - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC1 - .byte 0 - .uleb128 0x38 - .8byte .LVL4 - .4byte 0x26f3 - .4byte 0x252e - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x4 - .byte 0x8f - .sleb128 200 - .byte 0x6 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x84 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL6 - .4byte 0x26f3 - .4byte 0x254e - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x4 - .byte 0x8f - .sleb128 192 - .byte 0x6 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x8b - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL8 - .4byte 0x271e - .4byte 0x256c - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL9 - .4byte 0x2799 - .4byte 0x2596 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x87 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x53 - .uleb128 0x2 - .byte 0x88 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL10 - .4byte 0x2735 - .4byte 0x25c5 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x87 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x53 - .uleb128 0x2 - .byte 0x88 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x54 - .uleb128 0x1 - .byte 0x31 - .byte 0 - .uleb128 0x38 - .8byte .LVL16 - .4byte 0x26f3 - .4byte 0x25e4 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC4 - .byte 0 - .uleb128 0x38 - .8byte .LVL17 - .4byte 0x27a4 - .4byte 0x25fc - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8 - .byte 0x80 - .byte 0 - .uleb128 0x38 - .8byte .LVL20 - .4byte 0x26f3 - .4byte 0x2621 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x9 - .byte 0x3 - .8byte .LC5 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x8 - .byte 0x80 - .byte 0 - .uleb128 0x38 - .8byte .LVL23 - .4byte 0x26f3 - .4byte 0x263f - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x8b - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x84 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL24 - .4byte 0x26f3 - .4byte 0x265d - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x89 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x86 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL26 - .4byte 0x271e - .4byte 0x267b - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .byte 0 - .uleb128 0x38 - .8byte .LVL27 - .4byte 0x2799 - .4byte 0x26a5 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x87 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x53 - .uleb128 0x2 - .byte 0x88 - .sleb128 0 - .byte 0 - .uleb128 0x3a - .8byte .LVL28 - .4byte 0x2735 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x50 - .uleb128 0x2 - .byte 0x85 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x51 - .uleb128 0x2 - .byte 0x83 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x52 - .uleb128 0x2 - .byte 0x87 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x53 - .uleb128 0x2 - .byte 0x88 - .sleb128 0 - .uleb128 0x39 - .uleb128 0x1 - .byte 0x54 - .uleb128 0x2 - .byte 0x8c - .sleb128 0 - .byte 0 - .byte 0 - .uleb128 0xb - .4byte 0xe7 - .4byte 0x26e2 - .uleb128 0x12 - .4byte 0xce - .byte 0x9 - .byte 0 - .uleb128 0x8 - .4byte 0x26d2 - .uleb128 0x49 - .4byte .LASF461 - .4byte .LASF461 - .byte 0x1d - .2byte 0x16c - .uleb128 0x4a - .4byte .LASF462 - .4byte .LASF462 - .byte 0x25 - .byte 0x12 - .uleb128 0x49 - .4byte .LASF463 - .4byte .LASF463 - .byte 0x5 - .2byte 0x258 - .uleb128 0x4b - .4byte .LASF466 - .4byte .LASF466 - .uleb128 0x4a - .4byte .LASF464 - .4byte .LASF464 - .byte 0x26 - .byte 0x5f - .uleb128 0x4a - .4byte .LASF465 - .4byte .LASF465 - .byte 0x27 - .byte 0xb - .uleb128 0x49 - .4byte .LASF466 - .4byte .LASF466 - .byte 0x1d - .2byte 0x16d - .uleb128 0x4a - .4byte .LASF467 - .4byte .LASF467 - .byte 0x28 - .byte 0xe - .uleb128 0x4a - .4byte .LASF468 - .4byte .LASF468 - .byte 0x28 - .byte 0x11 - .uleb128 0x4a - .4byte .LASF469 - .4byte .LASF469 - .byte 0x9 - .byte 0x2d - .uleb128 0x4a - .4byte .LASF470 - .4byte .LASF470 - .byte 0x29 - .byte 0x29 - .uleb128 0x4a - .4byte .LASF471 - .4byte .LASF471 - .byte 0x27 - .byte 0xc - .uleb128 0x4a - .4byte .LASF472 - .4byte .LASF472 - .byte 0x21 - .byte 0x11 - .uleb128 0x4a - .4byte .LASF473 - .4byte .LASF473 - .byte 0x28 - .byte 0x12 - .uleb128 0x4a - .4byte .LASF474 - .4byte .LASF474 - .byte 0x20 - .byte 0x94 - .uleb128 0x49 - .4byte .LASF475 - .4byte .LASF475 - .byte 0x5 - .2byte 0x2b9 - .uleb128 0x4a - .4byte .LASF476 - .4byte .LASF476 - .byte 0x28 - .byte 0xd - .uleb128 0x49 - .4byte .LASF477 - .4byte .LASF477 - .byte 0x1d - .2byte 0x398 - .byte 0 - .section .debug_abbrev,"",@progbits -.Ldebug_abbrev0: - .uleb128 0x1 - .uleb128 0x11 - .byte 0x1 - .uleb128 0x25 - .uleb128 0xe - .uleb128 0x13 - .uleb128 0xb - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x1b - .uleb128 0xe - .uleb128 0x55 - .uleb128 0x17 - .uleb128 0x11 - .uleb128 0x1 - .uleb128 0x10 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x2 - .uleb128 0x16 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x3 - .uleb128 0x24 - .byte 0 - .uleb128 0xb - .uleb128 0xb - .uleb128 0x3e - .uleb128 0xb - .uleb128 0x3 - .uleb128 0xe - .byte 0 - .byte 0 - .uleb128 0x4 - .uleb128 0x35 - .byte 0 - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x5 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x3c - .uleb128 0x19 - .byte 0 - .byte 0 - .uleb128 0x6 - .uleb128 0x24 - .byte 0 - .uleb128 0xb - .uleb128 0xb - .uleb128 0x3e - .uleb128 0xb - .uleb128 0x3 - .uleb128 0x8 - .byte 0 - .byte 0 - .uleb128 0x7 - .uleb128 0x16 - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x8 - .uleb128 0x26 - .byte 0 - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x9 - .uleb128 0xf - .byte 0 - .uleb128 0xb - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0xa - .uleb128 0xf - .byte 0 - .uleb128 0xb - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0xb - .uleb128 0x1 - .byte 0x1 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0xc - .uleb128 0x21 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0xd - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x3c - .uleb128 0x19 - .byte 0 - .byte 0 - .uleb128 0xe - .uleb128 0x13 - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0xb - .uleb128 0xb - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0xf - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x38 - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x10 - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x38 - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x11 - .uleb128 0x26 - .byte 0 - .byte 0 - .byte 0 - .uleb128 0x12 - .uleb128 0x21 - .byte 0 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2f - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x13 - .uleb128 0x15 - .byte 0x1 - .uleb128 0x27 - .uleb128 0x19 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x14 - .uleb128 0x5 - .byte 0 - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x15 - .uleb128 0x13 - .byte 0x1 - .uleb128 0xb - .uleb128 0x5 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x16 - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x38 - .uleb128 0x5 - .byte 0 - .byte 0 - .uleb128 0x17 - .uleb128 0x21 - .byte 0 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2f - .uleb128 0x5 - .byte 0 - .byte 0 - .uleb128 0x18 - .uleb128 0x13 - .byte 0x1 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0xb - .uleb128 0x5 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x19 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x3c - .uleb128 0x19 - .byte 0 - .byte 0 - .uleb128 0x1a - .uleb128 0x13 - .byte 0x1 - .uleb128 0xb - .uleb128 0xb - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x1b - .uleb128 0x4 - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0xb - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x1c - .uleb128 0x28 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x1c - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x1d - .uleb128 0x28 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x1c - .uleb128 0xd - .byte 0 - .byte 0 - .uleb128 0x1e - .uleb128 0x13 - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0xb - .uleb128 0xb - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x1f - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x38 - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x20 - .uleb128 0x16 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x21 - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x38 - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x22 - .uleb128 0x13 - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0xb - .uleb128 0x5 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x23 - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x38 - .uleb128 0x5 - .byte 0 - .byte 0 - .uleb128 0x24 - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x38 - .uleb128 0x5 - .byte 0 - .byte 0 - .uleb128 0x25 - .uleb128 0x4 - .byte 0x1 - .uleb128 0xb - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x26 - .uleb128 0x13 - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0xb - .uleb128 0x5 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x27 - .uleb128 0x13 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3c - .uleb128 0x19 - .byte 0 - .byte 0 - .uleb128 0x28 - .uleb128 0x15 - .byte 0x1 - .uleb128 0x27 - .uleb128 0x19 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x29 - .uleb128 0x4 - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0xb - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x2a - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x18 - .byte 0 - .byte 0 - .uleb128 0x2b - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x3f - .uleb128 0x19 - .byte 0 - .byte 0 - .uleb128 0x2c - .uleb128 0x17 - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0xb - .uleb128 0xb - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x2d - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x2e - .uleb128 0xd - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x2f - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x2 - .uleb128 0x18 - .byte 0 - .byte 0 - .uleb128 0x30 - .uleb128 0x2e - .byte 0x1 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x27 - .uleb128 0x19 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x11 - .uleb128 0x1 - .uleb128 0x12 - .uleb128 0x7 - .uleb128 0x40 - .uleb128 0x18 - .uleb128 0x2117 - .uleb128 0x19 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x31 - .uleb128 0x5 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x32 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x18 - .byte 0 - .byte 0 - .uleb128 0x33 - .uleb128 0x1d - .byte 0x1 - .uleb128 0x31 - .uleb128 0x13 - .uleb128 0x52 - .uleb128 0x1 - .uleb128 0x55 - .uleb128 0x17 - .uleb128 0x58 - .uleb128 0xb - .uleb128 0x59 - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x34 - .uleb128 0x5 - .byte 0 - .uleb128 0x31 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x35 - .uleb128 0xb - .byte 0x1 - .uleb128 0x55 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x36 - .uleb128 0x34 - .byte 0 - .uleb128 0x31 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x37 - .uleb128 0x34 - .byte 0 - .uleb128 0x31 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x38 - .uleb128 0x4109 - .byte 0x1 - .uleb128 0x11 - .uleb128 0x1 - .uleb128 0x31 - .uleb128 0x13 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x39 - .uleb128 0x410a - .byte 0 - .uleb128 0x2 - .uleb128 0x18 - .uleb128 0x2111 - .uleb128 0x18 - .byte 0 - .byte 0 - .uleb128 0x3a - .uleb128 0x4109 - .byte 0x1 - .uleb128 0x11 - .uleb128 0x1 - .uleb128 0x31 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x3b - .uleb128 0x1d - .byte 0x1 - .uleb128 0x31 - .uleb128 0x13 - .uleb128 0x52 - .uleb128 0x1 - .uleb128 0x55 - .uleb128 0x17 - .uleb128 0x58 - .uleb128 0xb - .uleb128 0x59 - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x3c - .uleb128 0x5 - .byte 0 - .uleb128 0x31 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x3d - .uleb128 0x34 - .byte 0 - .uleb128 0x31 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x18 - .byte 0 - .byte 0 - .uleb128 0x3e - .uleb128 0x2e - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x27 - .uleb128 0x19 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x20 - .uleb128 0xb - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x3f - .uleb128 0x5 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x40 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x41 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x42 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x43 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x44 - .uleb128 0xa - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x11 - .uleb128 0x1 - .byte 0 - .byte 0 - .uleb128 0x45 - .uleb128 0x4109 - .byte 0 - .uleb128 0x11 - .uleb128 0x1 - .uleb128 0x31 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x46 - .uleb128 0x2e - .byte 0x1 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x27 - .uleb128 0x19 - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x11 - .uleb128 0x1 - .uleb128 0x12 - .uleb128 0x7 - .uleb128 0x40 - .uleb128 0x18 - .uleb128 0x2117 - .uleb128 0x19 - .uleb128 0x1 - .uleb128 0x13 - .byte 0 - .byte 0 - .uleb128 0x47 - .uleb128 0x5 - .byte 0 - .uleb128 0x3 - .uleb128 0x8 - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x2 - .uleb128 0x17 - .byte 0 - .byte 0 - .uleb128 0x48 - .uleb128 0x34 - .byte 0 - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x49 - .uleb128 0x13 - .uleb128 0x34 - .uleb128 0x19 - .uleb128 0x2 - .uleb128 0x18 - .byte 0 - .byte 0 - .uleb128 0x49 - .uleb128 0x2e - .byte 0 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x3c - .uleb128 0x19 - .uleb128 0x6e - .uleb128 0xe - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0x5 - .byte 0 - .byte 0 - .uleb128 0x4a - .uleb128 0x2e - .byte 0 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x3c - .uleb128 0x19 - .uleb128 0x6e - .uleb128 0xe - .uleb128 0x3 - .uleb128 0xe - .uleb128 0x3a - .uleb128 0xb - .uleb128 0x3b - .uleb128 0xb - .byte 0 - .byte 0 - .uleb128 0x4b - .uleb128 0x2e - .byte 0 - .uleb128 0x3f - .uleb128 0x19 - .uleb128 0x3c - .uleb128 0x19 - .uleb128 0x6e - .uleb128 0xe - .uleb128 0x3 - .uleb128 0xe - .byte 0 - .byte 0 - .byte 0 - .section .debug_loc,"",@progbits -.Ldebug_loc0: -.LLST15: - .8byte .LVL61 - .8byte .LVL64-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL64-1 - .8byte .LVL80 - .2byte 0x1 - .byte 0x63 - .8byte .LVL80 - .8byte .LVL81 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x50 - .byte 0x9f - .8byte .LVL81 - .8byte .LFE271 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST16: - .8byte .LVL61 - .8byte .LVL63 - .2byte 0x1 - .byte 0x51 - .8byte .LVL63 - .8byte .LVL64-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL64-1 - .8byte .LVL80 - .2byte 0x1 - .byte 0x64 - .8byte .LVL80 - .8byte .LVL81 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x51 - .byte 0x9f - .8byte .LVL81 - .8byte .LFE271 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST17: - .8byte .LVL62 - .8byte .LVL63 - .2byte 0x1 - .byte 0x51 - .8byte .LVL63 - .8byte .LVL64-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL64-1 - .8byte .LVL79 - .2byte 0x1 - .byte 0x64 - .8byte .LVL81 - .8byte .LFE271 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST18: - .8byte .LVL62 - .8byte .LVL64-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL64-1 - .8byte .LVL79 - .2byte 0x1 - .byte 0x63 - .8byte .LVL81 - .8byte .LFE271 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST19: - .8byte .LVL66 - .8byte .LVL67 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL67 - .8byte .LVL68 - .2byte 0x1 - .byte 0x51 - .8byte .LVL73 - .8byte .LVL75 - .2byte 0x1 - .byte 0x51 - .8byte .LVL81 - .8byte .LVL83 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST20: - .8byte .LVL64 - .8byte .LVL65 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL65 - .8byte .LVL69 - .2byte 0x1 - .byte 0x66 - .8byte .LVL69 - .8byte .LVL72 - .2byte 0x3 - .byte 0x86 - .sleb128 -1 - .byte 0x9f - .8byte .LVL72 - .8byte .LVL79 - .2byte 0x1 - .byte 0x66 - .8byte .LVL81 - .8byte .LVL84 - .2byte 0x1 - .byte 0x66 - .8byte 0 - .8byte 0 -.LLST21: - .8byte .LVL64 - .8byte .LVL65 - .2byte 0x6 - .byte 0x9e - .uleb128 0x4 - .4byte 0x80808080 - .8byte .LVL65 - .8byte .LVL79 - .2byte 0x1 - .byte 0x65 - .8byte .LVL81 - .8byte .LVL84 - .2byte 0x1 - .byte 0x65 - .8byte 0 - .8byte 0 -.LLST22: - .8byte .LVL64 - .8byte .LVL65 - .2byte 0x6 - .byte 0xc - .4byte 0x40404040 - .byte 0x9f - .8byte .LVL65 - .8byte .LVL79 - .2byte 0x1 - .byte 0x67 - .8byte .LVL81 - .8byte .LVL84 - .2byte 0x1 - .byte 0x67 - .8byte 0 - .8byte 0 -.LLST23: - .8byte .LVL62 - .8byte .LVL65 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST24: - .8byte .LVL64 - .8byte .LVL80 - .2byte 0x1 - .byte 0x63 - .8byte .LVL80 - .8byte .LVL81 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x50 - .byte 0x9f - .8byte .LVL81 - .8byte .LFE271 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST25: - .8byte .LVL62 - .8byte .LVL68 - .2byte 0x3 - .byte 0x9 - .byte 0xff - .byte 0x9f - .8byte .LVL72 - .8byte .LVL74 - .2byte 0x3 - .byte 0x9 - .byte 0xff - .byte 0x9f - .8byte .LVL74 - .8byte .LVL76-1 - .2byte 0x1 - .byte 0x55 - .8byte .LVL76-1 - .8byte .LVL79 - .2byte 0x1 - .byte 0x6c - .8byte .LVL81 - .8byte .LFE271 - .2byte 0x3 - .byte 0x9 - .byte 0xff - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST26: - .8byte .LVL87 - .8byte .LVL88 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL88 - .8byte .LVL89 - .2byte 0x1 - .byte 0x50 - .8byte .LVL92 - .8byte .LVL95 - .2byte 0x1 - .byte 0x50 - .8byte .LVL101 - .8byte .LFE271 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST27: - .8byte .LVL84 - .8byte .LVL90 - .2byte 0x1 - .byte 0x65 - .8byte .LVL90 - .8byte .LVL91 - .2byte 0x3 - .byte 0x85 - .sleb128 -1 - .byte 0x9f - .8byte .LVL91 - .8byte .LFE271 - .2byte 0x1 - .byte 0x65 - .8byte 0 - .8byte 0 -.LLST28: - .8byte .LVL84 - .8byte .LVL89 - .2byte 0x3 - .byte 0x9 - .byte 0xff - .byte 0x9f - .8byte .LVL91 - .8byte .LVL94 - .2byte 0x3 - .byte 0x9 - .byte 0xff - .byte 0x9f - .8byte .LVL94 - .8byte .LVL101 - .2byte 0x1 - .byte 0x67 - .8byte .LVL101 - .8byte .LFE271 - .2byte 0x3 - .byte 0x9 - .byte 0xff - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST9: - .8byte .LVL35 - .8byte .LVL37 - .2byte 0x1 - .byte 0x50 - .8byte .LVL37 - .8byte .LVL45 - .2byte 0x1 - .byte 0x69 - .8byte .LVL45 - .8byte .LVL46 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x50 - .byte 0x9f - .8byte .LVL46 - .8byte .LFE268 - .2byte 0x1 - .byte 0x69 - .8byte 0 - .8byte 0 -.LLST10: - .8byte .LVL35 - .8byte .LVL36 - .2byte 0x1 - .byte 0x51 - .8byte .LVL36 - .8byte .LVL43 - .2byte 0x1 - .byte 0x66 - .8byte .LVL43 - .8byte .LVL46 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x51 - .byte 0x9f - .8byte .LVL46 - .8byte .LVL47 - .2byte 0x1 - .byte 0x66 - .8byte .LVL47 - .8byte .LVL48 - .2byte 0x3 - .byte 0x87 - .sleb128 32 - .byte 0x9f - .8byte .LVL48 - .8byte .LFE268 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x51 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST11: - .8byte .LVL50 - .8byte .LVL55 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST12: - .8byte .LVL41 - .8byte .LVL44 - .2byte 0x1 - .byte 0x63 - .8byte .LVL46 - .8byte .LFE268 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST13: - .8byte .LVL50 - .8byte .LVL56 - .2byte 0x1 - .byte 0x65 - .8byte .LVL56 - .8byte .LVL57 - .2byte 0x3 - .byte 0x85 - .sleb128 -8 - .byte 0x9f - .8byte .LVL57 - .8byte .LFE268 - .2byte 0x3 - .byte 0x88 - .sleb128 -40 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST14: - .8byte .LVL38 - .8byte .LVL43 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL46 - .8byte .LVL51 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL51 - .8byte .LVL52 - .2byte 0x1 - .byte 0x50 - .8byte .LVL52 - .8byte .LVL54 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL54 - .8byte .LVL58 - .2byte 0x1 - .byte 0x50 - .8byte .LVL60 - .8byte .LFE268 - .2byte 0x1 - .byte 0x50 - .8byte 0 - .8byte 0 -.LLST37: - .8byte .LVL129 - .8byte .LVL130 - .2byte 0x1 - .byte 0x50 - .8byte .LVL130 - .8byte .LFE256 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x50 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST38: - .8byte .LVL129 - .8byte .LVL132-1 - .2byte 0x1 - .byte 0x51 - .8byte .LVL132-1 - .8byte .LFE256 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x51 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST39: - .8byte .LVL129 - .8byte .LVL132-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL132-1 - .8byte .LVL138 - .2byte 0x1 - .byte 0x67 - .8byte .LVL138 - .8byte .LVL228 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x52 - .byte 0x9f - .8byte .LVL228 - .8byte .LVL229 - .2byte 0x1 - .byte 0x67 - .8byte .LVL229 - .8byte .LFE256 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x52 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST40: - .8byte .LVL129 - .8byte .LVL132-1 - .2byte 0x1 - .byte 0x53 - .8byte .LVL132-1 - .8byte .LVL145 - .2byte 0x1 - .byte 0x6a - .8byte .LVL145 - .8byte .LVL147 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x53 - .byte 0x9f - .8byte .LVL147 - .8byte .LVL158 - .2byte 0x1 - .byte 0x6a - .8byte .LVL158 - .8byte .LVL193 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x53 - .byte 0x9f - .8byte .LVL193 - .8byte .LVL196 - .2byte 0x1 - .byte 0x6a - .8byte .LVL196 - .8byte .LVL204 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x53 - .byte 0x9f - .8byte .LVL204 - .8byte .LVL210 - .2byte 0x1 - .byte 0x6a - .8byte .LVL210 - .8byte .LVL226 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x53 - .byte 0x9f - .8byte .LVL226 - .8byte .LVL234 - .2byte 0x1 - .byte 0x6a - .8byte .LVL234 - .8byte .LFE256 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x53 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST41: - .8byte .LVL134 - .8byte .LVL136 - .2byte 0x1 - .byte 0x63 - .8byte .LVL136 - .8byte .LVL137 - .2byte 0x3 - .byte 0x83 - .sleb128 1 - .byte 0x9f - .8byte .LVL137 - .8byte .LVL138 - .2byte 0x1 - .byte 0x63 - .8byte .LVL151 - .8byte .LVL153 - .2byte 0x1 - .byte 0x50 - .8byte .LVL153 - .8byte .LVL154 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL154 - .8byte .LVL155 - .2byte 0x1 - .byte 0x50 - .8byte .LVL155 - .8byte .LVL156 - .2byte 0x3 - .byte 0x70 - .sleb128 1 - .byte 0x9f - .8byte .LVL161 - .8byte .LVL186 - .2byte 0x1 - .byte 0x63 - .8byte .LVL186 - .8byte .LVL187 - .2byte 0x3 - .byte 0x83 - .sleb128 1 - .byte 0x9f - .8byte .LVL193 - .8byte .LVL194 - .2byte 0x3 - .byte 0x70 - .sleb128 1 - .byte 0x9f - .8byte .LVL196 - .8byte .LVL204 - .2byte 0x1 - .byte 0x63 - .8byte .LVL213 - .8byte .LVL214 - .2byte 0x1 - .byte 0x6c - .8byte .LVL217 - .8byte .LVL221 - .2byte 0x1 - .byte 0x6c - .8byte .LVL222 - .8byte .LVL226 - .2byte 0x1 - .byte 0x6c - .8byte .LVL228 - .8byte .LVL230 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST42: - .8byte .LVL137 - .8byte .LVL138 - .2byte 0x1 - .byte 0x63 - .8byte .LVL140 - .8byte .LVL145 - .2byte 0x1 - .byte 0x63 - .8byte .LVL147 - .8byte .LVL159 - .2byte 0x1 - .byte 0x63 - .8byte .LVL193 - .8byte .LVL196 - .2byte 0x1 - .byte 0x63 - .8byte .LVL204 - .8byte .LVL234 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST43: - .8byte .LVL165 - .8byte .LVL168 - .2byte 0x2 - .byte 0x32 - .byte 0x9f - .8byte .LVL168 - .8byte .LVL171 - .2byte 0x2 - .byte 0x33 - .byte 0x9f - .8byte .LVL171 - .8byte .LVL174 - .2byte 0x2 - .byte 0x34 - .byte 0x9f - .8byte .LVL178 - .8byte .LVL181 - .2byte 0x2 - .byte 0x32 - .byte 0x9f - .8byte .LVL181 - .8byte .LVL184 - .2byte 0x2 - .byte 0x33 - .byte 0x9f - .8byte .LVL184 - .8byte .LVL186 - .2byte 0x2 - .byte 0x34 - .byte 0x9f - .8byte .LVL196 - .8byte .LVL197 - .2byte 0x2 - .byte 0x32 - .byte 0x9f - .8byte .LVL197 - .8byte .LVL198 - .2byte 0x2 - .byte 0x33 - .byte 0x9f - .8byte .LVL198 - .8byte .LVL199 - .2byte 0x2 - .byte 0x34 - .byte 0x9f - .8byte .LVL200 - .8byte .LVL201 - .2byte 0x2 - .byte 0x32 - .byte 0x9f - .8byte .LVL201 - .8byte .LVL202 - .2byte 0x2 - .byte 0x33 - .byte 0x9f - .8byte .LVL202 - .8byte .LVL204 - .2byte 0x2 - .byte 0x34 - .byte 0x9f - .8byte .LVL219 - .8byte .LVL222 - .2byte 0x1 - .byte 0x63 - .8byte .LVL225 - .8byte .LVL226 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST44: - .8byte .LVL157 - .8byte .LVL159 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL159 - .8byte .LVL193 - .2byte 0x1 - .byte 0x69 - .8byte .LVL196 - .8byte .LVL204 - .2byte 0x1 - .byte 0x69 - .8byte .LVL211 - .8byte .LVL226 - .2byte 0x1 - .byte 0x69 - .8byte 0 - .8byte 0 -.LLST45: - .8byte .LVL131 - .8byte .LVL145 - .2byte 0x2 - .byte 0x31 - .byte 0x9f - .8byte .LVL147 - .8byte .LVL190 - .2byte 0x2 - .byte 0x31 - .byte 0x9f - .8byte .LVL193 - .8byte .LVL206 - .2byte 0x2 - .byte 0x31 - .byte 0x9f - .8byte .LVL206 - .8byte .LVL207 - .2byte 0x1 - .byte 0x50 - .8byte .LVL207 - .8byte .LVL226 - .2byte 0x1 - .byte 0x6b - .8byte .LVL226 - .8byte .LVL228 - .2byte 0x1 - .byte 0x50 - .8byte .LVL228 - .8byte .LVL234 - .2byte 0x2 - .byte 0x31 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST46: - .8byte .LVL131 - .8byte .LVL145 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL147 - .8byte .LVL152 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL152 - .8byte .LVL153 - .2byte 0x1 - .byte 0x50 - .8byte .LVL193 - .8byte .LVL196 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL204 - .8byte .LVL234 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST47: - .8byte .LVL131 - .8byte .LVL142 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL142 - .8byte .LVL143-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL143-1 - .8byte .LVL145 - .2byte 0x1 - .byte 0x67 - .8byte .LVL147 - .8byte .LVL159 - .2byte 0x1 - .byte 0x67 - .8byte .LVL159 - .8byte .LVL165 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL165 - .8byte .LVL166 - .2byte 0x1 - .byte 0x50 - .8byte .LVL166 - .8byte .LVL168 - .2byte 0x1 - .byte 0x68 - .8byte .LVL168 - .8byte .LVL169 - .2byte 0x1 - .byte 0x50 - .8byte .LVL169 - .8byte .LVL171 - .2byte 0x1 - .byte 0x68 - .8byte .LVL171 - .8byte .LVL172 - .2byte 0x1 - .byte 0x50 - .8byte .LVL172 - .8byte .LVL174 - .2byte 0x1 - .byte 0x68 - .8byte .LVL174 - .8byte .LVL175 - .2byte 0x1 - .byte 0x50 - .8byte .LVL175 - .8byte .LVL178 - .2byte 0x1 - .byte 0x68 - .8byte .LVL178 - .8byte .LVL179 - .2byte 0x1 - .byte 0x50 - .8byte .LVL179 - .8byte .LVL180-1 - .2byte 0x1 - .byte 0x52 - .8byte .LVL180-1 - .8byte .LVL181 - .2byte 0x3 - .byte 0x8f - .sleb128 196 - .8byte .LVL181 - .8byte .LVL182 - .2byte 0x1 - .byte 0x50 - .8byte .LVL182 - .8byte .LVL184 - .2byte 0x1 - .byte 0x66 - .8byte .LVL184 - .8byte .LVL185-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL185-1 - .8byte .LVL186 - .2byte 0x1 - .byte 0x68 - .8byte .LVL186 - .8byte .LVL188 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL188 - .8byte .LVL191 - .2byte 0x1 - .byte 0x68 - .8byte .LVL193 - .8byte .LVL196 - .2byte 0x1 - .byte 0x67 - .8byte .LVL196 - .8byte .LVL199 - .2byte 0x1 - .byte 0x50 - .8byte .LVL199 - .8byte .LVL200 - .2byte 0x1 - .byte 0x68 - .8byte .LVL200 - .8byte .LVL203 - .2byte 0x1 - .byte 0x50 - .8byte .LVL203 - .8byte .LVL204 - .2byte 0x1 - .byte 0x68 - .8byte .LVL204 - .8byte .LVL211 - .2byte 0x1 - .byte 0x67 - .8byte .LVL211 - .8byte .LVL214 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL214 - .8byte .LVL216 - .2byte 0x1 - .byte 0x68 - .8byte .LVL216 - .8byte .LVL219 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL219 - .8byte .LVL220-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL220-1 - .8byte .LVL222 - .2byte 0x1 - .byte 0x68 - .8byte .LVL222 - .8byte .LVL225 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL225 - .8byte .LVL226 - .2byte 0x1 - .byte 0x68 - .8byte .LVL226 - .8byte .LVL227 - .2byte 0x1 - .byte 0x67 - .8byte .LVL228 - .8byte .LVL232 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL232 - .8byte .LVL233 - .2byte 0x1 - .byte 0x50 - .8byte .LVL233 - .8byte .LVL234-1 - .2byte 0x1 - .byte 0x51 - .8byte .LVL234-1 - .8byte .LVL234 - .2byte 0x1 - .byte 0x67 - .8byte 0 - .8byte 0 -.LLST48: - .8byte .LVL131 - .8byte .LVL145 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL147 - .8byte .LVL188 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL188 - .8byte .LVL189 - .2byte 0x1 - .byte 0x52 - .8byte .LVL193 - .8byte .LVL214 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL214 - .8byte .LVL215 - .2byte 0x1 - .byte 0x50 - .8byte .LVL216 - .8byte .LVL234 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST49: - .8byte .LVL157 - .8byte .LVL190 - .2byte 0x1 - .byte 0x6c - .8byte .LVL196 - .8byte .LVL204 - .2byte 0x1 - .byte 0x6c - .8byte 0 - .8byte 0 -.LLST29: - .8byte .LVL103 - .8byte .LVL104 - .2byte 0x1 - .byte 0x50 - .8byte .LVL104 - .8byte .LVL107 - .2byte 0x1 - .byte 0x63 - .8byte .LVL107 - .8byte .LVL108 - .2byte 0x1 - .byte 0x50 - .8byte .LVL108 - .8byte .LVL121 - .2byte 0x1 - .byte 0x63 - .8byte .LVL124 - .8byte .LFE255 - .2byte 0x1 - .byte 0x63 - .8byte 0 - .8byte 0 -.LLST30: - .8byte .LVL103 - .8byte .LVL106 - .2byte 0x1 - .byte 0x51 - .8byte .LVL106 - .8byte .LVL110 - .2byte 0x1 - .byte 0x51 - .8byte 0 - .8byte 0 -.LLST31: - .8byte .LVL103 - .8byte .LVL110 - .2byte 0x1 - .byte 0x52 - .8byte .LVL110 - .8byte .LVL122 - .2byte 0x1 - .byte 0x66 - .8byte .LVL122 - .8byte .LVL124 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x52 - .byte 0x9f - .8byte .LVL124 - .8byte .LFE255 - .2byte 0x1 - .byte 0x66 - .8byte 0 - .8byte 0 -.LLST32: - .8byte .LVL109 - .8byte .LVL110 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL110 - .8byte .LVL123 - .2byte 0x1 - .byte 0x67 - .8byte .LVL124 - .8byte .LFE255 - .2byte 0x1 - .byte 0x67 - .8byte 0 - .8byte 0 -.LLST33: - .8byte .LVL109 - .8byte .LVL122 - .2byte 0x1 - .byte 0x65 - .8byte .LVL124 - .8byte .LFE255 - .2byte 0x1 - .byte 0x65 - .8byte 0 - .8byte 0 -.LLST34: - .8byte .LVL111 - .8byte .LVL112 - .2byte 0x9 - .byte 0x70 - .sleb128 0 - .byte 0x85 - .sleb128 0 - .byte 0x1d - .byte 0x83 - .sleb128 0 - .byte 0x22 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST35: - .8byte .LVL115 - .8byte .LVL116 - .2byte 0x1 - .byte 0x50 - .8byte .LVL116 - .8byte .LVL120 - .2byte 0x1 - .byte 0x6a - .8byte .LVL124 - .8byte .LVL126 - .2byte 0x1 - .byte 0x6a - .8byte .LVL127 - .8byte .LFE255 - .2byte 0x1 - .byte 0x6a - .8byte 0 - .8byte 0 -.LLST36: - .8byte .LVL103 - .8byte .LVL118 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL118 - .8byte .LVL119 - .2byte 0x1 - .byte 0x50 - .8byte .LVL119 - .8byte .LVL120 - .2byte 0x1 - .byte 0x64 - .8byte .LVL124 - .8byte .LVL125-1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL125-1 - .8byte .LVL126 - .2byte 0x1 - .byte 0x64 - .8byte .LVL127 - .8byte .LFE255 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST8: - .8byte .LVL33 - .8byte .LVL34 - .2byte 0x1 - .byte 0x50 - .8byte .LVL34 - .8byte .LFE254 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x50 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST7: - .8byte .LVL31 - .8byte .LVL32 - .2byte 0x1 - .byte 0x50 - .8byte .LVL32 - .8byte .LFE253 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x50 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST0: - .8byte .LVL0 - .8byte .LVL1 - .2byte 0x1 - .byte 0x50 - .8byte .LVL1 - .8byte .LVL12 - .2byte 0x1 - .byte 0x67 - .8byte .LVL12 - .8byte .LVL13 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x50 - .byte 0x9f - .8byte .LVL13 - .8byte .LFE200 - .2byte 0x1 - .byte 0x67 - .8byte 0 - .8byte 0 -.LLST1: - .8byte .LVL0 - .8byte .LVL2-1 - .2byte 0x1 - .byte 0x51 - .8byte .LVL2-1 - .8byte .LVL12 - .2byte 0x1 - .byte 0x68 - .8byte .LVL12 - .8byte .LVL13 - .2byte 0x4 - .byte 0xf3 - .uleb128 0x1 - .byte 0x51 - .byte 0x9f - .8byte .LVL13 - .8byte .LFE200 - .2byte 0x1 - .byte 0x68 - .8byte 0 - .8byte 0 -.LLST2: - .8byte .LVL2 - .8byte .LVL3 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte .LVL3 - .8byte .LVL11 - .2byte 0x1 - .byte 0x64 - .8byte .LVL13 - .8byte .LVL22 - .2byte 0x1 - .byte 0x64 - .8byte .LVL23 - .8byte .LFE200 - .2byte 0x1 - .byte 0x66 - .8byte 0 - .8byte 0 -.LLST3: - .8byte .LVL24 - .8byte .LVL25 - .2byte 0x2 - .byte 0x30 - .byte 0x9f - .8byte 0 - .8byte 0 -.LLST4: - .8byte .LVL4 - .8byte .LVL11 - .2byte 0x1 - .byte 0x6b - .8byte .LVL13 - .8byte .LVL21 - .2byte 0x1 - .byte 0x6b - .8byte .LVL22 - .8byte .LFE200 - .2byte 0x1 - .byte 0x64 - .8byte 0 - .8byte 0 -.LLST5: - .8byte .LVL3 - .8byte .LVL4 - .2byte 0x3 - .byte 0x9 - .byte 0xff - .byte 0x9f - .8byte .LVL4 - .8byte .LVL5 - .2byte 0x1 - .byte 0x6c - .8byte .LVL5 - .8byte .LVL6 - .2byte 0x4 - .byte 0x8c - .sleb128 0 - .byte 0x20 - .byte 0x9f - .8byte .LVL6 - .8byte .LVL11 - .2byte 0x1 - .byte 0x6c - .8byte .LVL13 - .8byte .LVL22 - .2byte 0x1 - .byte 0x6c - .8byte 0 - .8byte 0 -.LLST6: - .8byte .LVL18 - .8byte .LVL19 - .2byte 0x1 - .byte 0x50 - .8byte .LVL19 - .8byte .LFE200 - .2byte 0x1 - .byte 0x65 - .8byte 0 - .8byte 0 - .section .debug_aranges,"",@progbits - .4byte 0x8c - .2byte 0x2 - .4byte .Ldebug_info0 - .byte 0x8 - .byte 0 - .2byte 0 - .2byte 0 - .8byte .LFB200 - .8byte .LFE200-.LFB200 - .8byte .LFB253 - .8byte .LFE253-.LFB253 - .8byte .LFB254 - .8byte .LFE254-.LFB254 - .8byte .LFB268 - .8byte .LFE268-.LFB268 - .8byte .LFB271 - .8byte .LFE271-.LFB271 - .8byte .LFB255 - .8byte .LFE255-.LFB255 - .8byte .LFB256 - .8byte .LFE256-.LFB256 - .8byte 0 - .8byte 0 - .section .debug_ranges,"",@progbits -.Ldebug_ranges0: - .8byte .LBB6 - .8byte .LBE6 - .8byte .LBB12 - .8byte .LBE12 - .8byte .LBB13 - .8byte .LBE13 - .8byte .LBB14 - .8byte .LBE14 - .8byte .LBB18 - .8byte .LBE18 - .8byte 0 - .8byte 0 - .8byte .LBB15 - .8byte .LBE15 - .8byte .LBB19 - .8byte .LBE19 - .8byte 0 - .8byte 0 - .8byte .LFB200 - .8byte .LFE200 - .8byte .LFB253 - .8byte .LFE253 - .8byte .LFB254 - .8byte .LFE254 - .8byte .LFB268 - .8byte .LFE268 - .8byte .LFB271 - .8byte .LFE271 - .8byte .LFB255 - .8byte .LFE255 - .8byte .LFB256 - .8byte .LFE256 - .8byte 0 - .8byte 0 - .section .debug_line,"",@progbits -.Ldebug_line0: - .section .debug_str,"MS",@progbits,1 -.LASF30: - .string "parent_platdata" -.LASF109: - .string "off_mem_rsvmap" -.LASF193: - .string "UCLASS_I2C_EEPROM" -.LASF481: - .string "jt_funcs" -.LASF198: - .string "UCLASS_IRQ" -.LASF159: - .string "initrd_start" -.LASF192: - .string "UCLASS_I2C" -.LASF13: - .string "sizetype" -.LASF335: - .string "net_hostname" -.LASF330: - .string "push_packet" -.LASF54: - .string "start" -.LASF231: - .string "UCLASS_SPI" -.LASF309: - .string "child" -.LASF196: - .string "UCLASS_I2S" -.LASF356: - .string "NETLOOP_RESTART" -.LASF194: - .string "UCLASS_I2C_GENERIC" -.LASF206: - .string "UCLASS_MOD_EXP" -.LASF253: - .string "UCLASS_IO_DOMAIN" -.LASF266: - .string "using_pre_serial" -.LASF37: - .string "uclass_priv" -.LASF226: - .string "UCLASS_RKNAND" -.LASF170: - .string "UCLASS_DEMO" -.LASF379: - .string "g_isi_pattern" -.LASF117: - .string "ih_magic" -.LASF46: - .string "list_head" -.LASF425: - .string "err_addr" -.LASF370: - .string "child_pre_probe" -.LASF302: - .string "pm_ctx_phys" -.LASF174: - .string "UCLASS_TEST_PROBE" -.LASF307: - .string "full_name" -.LASF249: - .string "UCLASS_KEY" -.LASF80: - .string "bi_intfreq" -.LASF460: - .string "__func__" -.LASF11: - .string "phys_addr_t" -.LASF244: - .string "UCLASS_VIDEO_BRIDGE" -.LASF301: - .string "video_bottom" -.LASF457: - .string "set_ddr_freq" -.LASF5: - .string "__u8" -.LASF355: - .string "NETLOOP_CONTINUE" -.LASF234: - .string "UCLASS_SPI_GENERIC" -.LASF296: - .string "malloc_base" -.LASF464: - .string "get_page_size" -.LASF56: - .string "flash_info_t" -.LASF210: - .string "UCLASS_PANEL" -.LASF134: - .string "comp" -.LASF129: - .string "image_header_t" -.LASF164: - .string "state" -.LASF186: - .string "UCLASS_CROS_EC" -.LASF74: - .string "bi_dsp_freq" -.LASF131: - .string "image_start" -.LASF445: - .string "fast_test_bank" -.LASF172: - .string "UCLASS_TEST_FDT" -.LASF430: - .string "diagonalscan" -.LASF65: - .string "bd_info" -.LASF168: - .string "uclass_id" -.LASF121: - .string "ih_load" -.LASF314: - .string "__dtb_dt_spl_begin" -.LASF394: - .string "pre_remove" -.LASF427: - .string "random_test1" -.LASF426: - .string "random_test2" -.LASF7: - .string "__u32" -.LASF35: - .string "priv" -.LASF299: - .string "cur_serial_dev" -.LASF469: - .string "strcasecmp" -.LASF143: - .string "fit_hdr_os" -.LASF341: - .string "net_tx_packet" -.LASF248: - .string "UCLASS_FG" -.LASF340: - .string "net_server_ip" -.LASF482: - .string "ofnode_union" -.LASF348: - .string "net_native_vlan" -.LASF246: - .string "UCLASS_VIDEO_CRTC" -.LASF185: - .string "UCLASS_CODEC" -.LASF478: - .ascii "GNU C11 6.3.1 20170404 -ms" - .string "trict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -fno-pic -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18" -.LASF293: - .string "env_buf" -.LASF21: - .string "errno" -.LASF15: - .string "long int" -.LASF69: - .string "bi_flashsize" -.LASF401: - .string "putc" -.LASF29: - .string "platdata" -.LASF215: - .string "UCLASS_PHY" -.LASF92: - .string "IRQ_STACK_START_IN" -.LASF113: - .string "size_dt_strings" -.LASF243: - .string "UCLASS_VIDEO" -.LASF402: - .string "puts" -.LASF475: - .string "rand" -.LASF279: - .string "relocaddr" -.LASF385: - .string "dev_head" -.LASF351: - .string "net_boot_file_size" -.LASF407: - .string "stdio_names" -.LASF123: - .string "ih_dcrc" -.LASF79: - .string "bi_ethspeed" -.LASF169: - .string "UCLASS_ROOT" -.LASF44: - .string "ide_bus_offset" -.LASF419: - .string "test_pat_param" -.LASF338: - .string "net_server_ethaddr" -.LASF82: - .string "bi_arch_number" -.LASF3: - .string "signed char" -.LASF199: - .string "UCLASS_KEYBOARD" -.LASF18: - .string "uint8_t" -.LASF375: - .string "per_child_platdata_auto_alloc_size" -.LASF45: - .string "udevice" -.LASF467: - .string "cmp_buf_data" -.LASF125: - .string "ih_arch" -.LASF106: - .string "totalsize" -.LASF446: - .string "abort" -.LASF118: - .string "ih_hcrc" -.LASF281: - .string "mon_len" -.LASF133: - .string "load" -.LASF239: - .string "UCLASS_TPM" -.LASF428: - .string "cmp_value" -.LASF59: - .string "lmb_property" -.LASF111: - .string "last_comp_version" -.LASF0: - .string "unsigned char" -.LASF392: - .string "pre_probe" -.LASF453: - .string "delta_freq" -.LASF412: - .string "RANDOM" -.LASF166: - .string "images" -.LASF252: - .string "UCLASS_DVFS" -.LASF75: - .string "bi_ddr_freq" -.LASF200: - .string "UCLASS_LED" -.LASF120: - .string "ih_size" -.LASF39: - .string "uclass_node" -.LASF23: - .string "_Bool" -.LASF376: - .string "property" -.LASF359: - .string "net_state" -.LASF378: - .string "value" -.LASF195: - .string "UCLASS_I2C_MUX" -.LASF14: - .string "char" -.LASF25: - .string "_binary_u_boot_bin_start" -.LASF418: - .string "test_pattern" -.LASF357: - .string "NETLOOP_SUCCESS" -.LASF36: - .string "uclass" -.LASF382: - .string "p_current" -.LASF384: - .string "uc_drv" -.LASF354: - .string "net_loop_state" -.LASF43: - .string "req_seq" -.LASF310: - .string "sibling" -.LASF287: - .string "dm_root_f" -.LASF321: - .string "enetaddr" -.LASF221: - .string "UCLASS_PWRSEQ" -.LASF452: - .string "times" -.LASF454: - .string "target_freq" -.LASF380: - .string "of_offset" -.LASF149: - .string "fit_hdr_fdt" -.LASF349: - .string "net_restart_wrap" -.LASF404: - .string "getc" -.LASF337: - .string "net_ethaddr" -.LASF42: - .string "flags" -.LASF437: - .string "cmdtp" -.LASF126: - .string "ih_type" -.LASF107: - .string "off_dt_struct" -.LASF458: - .string "crosstalk" -.LASF70: - .string "bi_flashoffset" -.LASF350: - .string "net_boot_file_name" -.LASF387: - .string "compatible" -.LASF171: - .string "UCLASS_TEST" -.LASF119: - .string "ih_time" -.LASF274: - .string "fb_base" -.LASF271: - .string "bus_clk" -.LASF222: - .string "UCLASS_RAM" -.LASF189: - .string "UCLASS_ETH" -.LASF32: - .string "node" -.LASF130: - .string "image_info" -.LASF408: - .string "console_devices" -.LASF136: - .string "arch" -.LASF273: - .string "mem_clk" -.LASF476: - .string "write_buf_to_ddr" -.LASF270: - .string "cpu_clk" -.LASF50: - .string "select_hwpart" -.LASF342: - .string "net_rx_packets" -.LASF360: - .string "mem_malloc_start" -.LASF91: - .string "_datarelro_start_ofs" -.LASF17: - .string "ulong" -.LASF122: - .string "ih_ep" -.LASF61: - .string "lmb_region" -.LASF448: - .string "do_ddr_test" -.LASF462: - .string "printf" -.LASF144: - .string "fit_uname_os" -.LASF76: - .string "bi_bootflags" -.LASF339: - .string "net_ip" -.LASF291: - .string "fdt_size" -.LASF333: - .string "net_dns_server" -.LASF353: - .string "net_ping_ip" -.LASF63: - .string "memory" -.LASF104: - .string "fdt_header" -.LASF361: - .string "mem_malloc_end" -.LASF202: - .string "UCLASS_MAILBOX" -.LASF156: - .string "rd_end" -.LASF364: - .string "bind" -.LASF282: - .string "irq_sp" -.LASF161: - .string "cmdline_start" -.LASF328: - .string "index" -.LASF269: - .string "global_data" -.LASF400: - .string "stop" -.LASF396: - .string "per_device_auto_alloc_size" -.LASF472: - .string "ctrlc" -.LASF95: - .string "repeatable" -.LASF229: - .string "UCLASS_SCSI" -.LASF241: - .string "UCLASS_USB_DEV_GENERIC" -.LASF203: - .string "UCLASS_MASS_STORAGE" -.LASF1: - .string "long unsigned int" -.LASF179: - .string "UCLASS_SIMPLE_BUS" -.LASF455: - .string "freq" -.LASF311: - .string "gd_t" -.LASF334: - .string "net_nis_domain" -.LASF398: - .string "console_buffer" -.LASF151: - .string "fit_noffset_fdt" -.LASF432: - .string "next_adr" -.LASF423: - .string "wr_value" -.LASF459: - .string "shift" -.LASF358: - .string "NETLOOP_FAIL" -.LASF247: - .string "UCLASS_WDT" -.LASF260: - .string "timer_reset_value" -.LASF283: - .string "start_addr_sp" -.LASF71: - .string "bi_sramstart" -.LASF26: - .string "_binary_u_boot_bin_end" -.LASF284: - .string "reloc_off" -.LASF473: - .string "judge_test_addr" -.LASF112: - .string "boot_cpuid_phys" -.LASF259: - .string "lastinc" -.LASF263: - .string "tlb_fillptr" -.LASF456: - .string "set_vdd_logic" -.LASF147: - .string "fit_uname_rd" -.LASF235: - .string "UCLASS_SYSCON" -.LASF184: - .string "UCLASS_CPU" -.LASF142: - .string "fit_uname_cfg" -.LASF230: - .string "UCLASS_SERIAL" -.LASF347: - .string "net_our_vlan" -.LASF303: - .string "serial" -.LASF365: - .string "probe" -.LASF182: - .string "UCLASS_BLK" -.LASF137: - .string "image_info_t" -.LASF178: - .string "UCLASS_USB_EMUL" -.LASF439: - .string "argc" -.LASF261: - .string "tlb_addr" -.LASF214: - .string "UCLASS_PCI_GENERIC" -.LASF440: - .string "argv" -.LASF132: - .string "image_len" -.LASF77: - .string "bi_ip_addr" -.LASF216: - .string "UCLASS_PINCONFIG" -.LASF324: - .string "send" -.LASF237: - .string "UCLASS_THERMAL" -.LASF140: - .string "legacy_hdr_os_copy" -.LASF9: - .string "long long int" -.LASF417: - .string "TESTCASSMAX" -.LASF443: - .string "test_times" -.LASF167: - .string "command_ret_t" -.LASF290: - .string "new_fdt" -.LASF22: - .string "___strtok" -.LASF352: - .string "net_boot_file_expected_size_in_blocks" -.LASF451: - .string "max_freq" -.LASF363: - .string "of_match" -.LASF209: - .string "UCLASS_NVME" -.LASF264: - .string "tlb_emerg" -.LASF138: - .string "bootm_headers" -.LASF470: - .string "strict_strtoul" -.LASF55: - .string "protect" -.LASF240: - .string "UCLASS_USB" -.LASF447: - .string "scan_freq_loop" -.LASF389: - .string "uclass_driver" -.LASF250: - .string "UCLASS_RC" -.LASF294: - .string "timebase_h" -.LASF295: - .string "timebase_l" -.LASF187: - .string "UCLASS_DISPLAY" -.LASF346: - .string "net_null_ethaddr" -.LASF277: - .string "env_valid" -.LASF416: - .string "FULLTEST" -.LASF34: - .string "parent" -.LASF177: - .string "UCLASS_PCI_EMUL" -.LASF38: - .string "parent_priv" -.LASF251: - .string "UCLASS_CHARGE_DISPLAY" -.LASF315: - .string "load_addr" -.LASF98: - .string "complete" -.LASF89: - .string "_datarelrolocal_start_ofs" -.LASF97: - .string "help" -.LASF268: - .string "addr" -.LASF101: - .string "CMD_RET_FAILURE" -.LASF8: - .string "unsigned int" -.LASF16: - .string "ushort" -.LASF320: - .string "eth_device" -.LASF372: - .string "priv_auto_alloc_size" -.LASF297: - .string "malloc_limit" -.LASF218: - .string "UCLASS_PMIC" -.LASF422: - .string "capacity" -.LASF139: - .string "legacy_hdr_os" -.LASF108: - .string "off_dt_strings" -.LASF312: - .string "monitor_flash_len" -.LASF204: - .string "UCLASS_MISC" -.LASF67: - .string "bi_memsize" -.LASF438: - .string "flag" -.LASF24: - .string "image_base" -.LASF236: - .string "UCLASS_SYSRESET" -.LASF383: - .string "current" -.LASF191: - .string "UCLASS_FIRMWARE" -.LASF450: - .string "min_freq" -.LASF201: - .string "UCLASS_LPC" -.LASF197: - .string "UCLASS_IDE" -.LASF405: - .string "list" -.LASF306: - .string "phandle" -.LASF300: - .string "video_top" -.LASF397: - .string "per_device_platdata_auto_alloc_size" -.LASF165: - .string "bootm_headers_t" -.LASF73: - .string "bi_arm_freq" -.LASF224: - .string "UCLASS_REMOTEPROC" -.LASF465: - .string "data_cpu_2_io" -.LASF325: - .string "recv" -.LASF135: - .string "type" -.LASF146: - .string "fit_hdr_rd" -.LASF276: - .string "env_addr" -.LASF72: - .string "bi_sramsize" -.LASF449: - .string "scan_freq" -.LASF431: - .string "start_adr" -.LASF288: - .string "uclass_root" -.LASF190: - .string "UCLASS_GPIO" -.LASF219: - .string "UCLASS_PWM" -.LASF444: - .string "test_banks" -.LASF58: - .string "long double" -.LASF278: - .string "ram_top" -.LASF421: - .string "baseaddr" -.LASF480: - .string "/home/typ/src/u-boot_gerrit/u-boot-ddr" -.LASF155: - .string "rd_start" -.LASF220: - .string "UCLASS_POWER_DOMAIN" -.LASF223: - .string "UCLASS_REGULATOR" -.LASF317: - .string "save_size" -.LASF183: - .string "UCLASS_CLK" -.LASF31: - .string "uclass_platdata" -.LASF322: - .string "iobase" -.LASF429: - .string "random_test" -.LASF88: - .string "_datarel_start_ofs" -.LASF265: - .string "pre_serial" -.LASF128: - .string "ih_name" -.LASF435: - .string "next_col" -.LASF124: - .string "ih_os" -.LASF162: - .string "cmdline_end" -.LASF343: - .string "net_rx_packet" -.LASF256: - .string "LOGF_MAX_CATEGORIES" -.LASF289: - .string "fdt_blob" -.LASF386: - .string "udevice_id" -.LASF51: - .string "size" -.LASF10: - .string "long long unsigned int" -.LASF395: - .string "destroy" -.LASF116: - .string "image_header" -.LASF377: - .string "length" -.LASF20: - .string "__be32" -.LASF68: - .string "bi_flashstart" -.LASF145: - .string "fit_noffset_os" -.LASF205: - .string "UCLASS_MMC" -.LASF327: - .string "write_hwaddr" -.LASF479: - .string "cmd/ddr_tool/ddr_test_code.c" -.LASF255: - .string "UCLASS_INVALID" -.LASF471: - .string "data_cpu_2_io_init" -.LASF94: - .string "maxargs" -.LASF242: - .string "UCLASS_USB_HUB" -.LASF414: - .string "DIAGONALSCAN" -.LASF371: - .string "child_post_remove" -.LASF93: - .string "cmd_tbl_s" -.LASF99: - .string "cmd_tbl_t" -.LASF41: - .string "sibling_node" -.LASF292: - .string "of_root" -.LASF461: - .string "memset" -.LASF57: - .string "flash_info" -.LASF110: - .string "version" -.LASF326: - .string "halt" -.LASF62: - .string "region" -.LASF114: - .string "size_dt_struct" -.LASF286: - .string "dm_root" -.LASF304: - .string "sys_start_tick" -.LASF308: - .string "properties" -.LASF207: - .string "UCLASS_MTD" -.LASF103: - .string "fdt32_t" -.LASF285: - .string "new_gd" -.LASF468: - .string "get_print_available_addr" -.LASF208: - .string "UCLASS_NORTHBRIDGE" -.LASF78: - .string "bi_enetaddr" -.LASF477: - .string "malloc" -.LASF369: - .string "child_post_bind" -.LASF483: - .string "exit" -.LASF318: - .string "in_addr" -.LASF344: - .string "net_rx_packet_len" -.LASF323: - .string "init" -.LASF102: - .string "CMD_RET_USAGE" -.LASF313: - .string "__dtb_dt_begin" -.LASF225: - .string "UCLASS_RESET" -.LASF148: - .string "fit_noffset_rd" -.LASF436: - .string "err_adr" -.LASF181: - .string "UCLASS_AHCI" -.LASF12: - .string "phys_size_t" -.LASF27: - .string "driver" -.LASF87: - .string "FIQ_STACK_START" -.LASF163: - .string "verify" -.LASF381: - .string "ofnode" -.LASF28: - .string "name" -.LASF441: - .string "test_case" -.LASF211: - .string "UCLASS_PANEL_BACKLIGHT" -.LASF238: - .string "UCLASS_TIMER" -.LASF233: - .string "UCLASS_SPI_FLASH" -.LASF424: - .string "reread_val" -.LASF275: - .string "have_console" -.LASF81: - .string "bi_busfreq" -.LASF6: - .string "short int" -.LASF217: - .string "UCLASS_PINCTRL" -.LASF227: - .string "UCLASS_RAMDISK" -.LASF434: - .string "pattern" -.LASF176: - .string "UCLASS_I2C_EMUL" -.LASF232: - .string "UCLASS_SPMI" -.LASF96: - .string "usage" -.LASF366: - .string "remove" -.LASF173: - .string "UCLASS_TEST_BUS" -.LASF316: - .string "save_addr" -.LASF374: - .string "per_child_auto_alloc_size" -.LASF463: - .string "flush_dcache_range" -.LASF413: - .string "CROSSTALK" -.LASF298: - .string "malloc_ptr" -.LASF160: - .string "initrd_end" -.LASF391: - .string "pre_unbind" -.LASF267: - .string "baudrate" -.LASF90: - .string "_datarellocal_start_ofs" -.LASF40: - .string "child_head" -.LASF257: - .string "arch_global_data" -.LASF254: - .string "UCLASS_COUNT" -.LASF399: - .string "stdio_dev" -.LASF272: - .string "pci_clk" -.LASF49: - .string "block_drvr" -.LASF466: - .string "memcpy" -.LASF53: - .string "flash_id" -.LASF305: - .string "device_node" -.LASF280: - .string "ram_size" -.LASF154: - .string "fit_noffset_setup" -.LASF115: - .string "working_fdt" -.LASF336: - .string "net_root_path" -.LASF188: - .string "UCLASS_DMA" -.LASF85: - .string "bd_t" -.LASF319: - .string "s_addr" -.LASF393: - .string "post_probe" -.LASF345: - .string "net_bcast_ethaddr" -.LASF83: - .string "bi_boot_params" -.LASF19: - .string "uint32_t" -.LASF362: - .string "mem_malloc_brk" -.LASF331: - .string "net_gateway" -.LASF373: - .string "platdata_auto_alloc_size" -.LASF403: - .string "tstc" -.LASF66: - .string "bi_memstart" -.LASF245: - .string "UCLASS_VIDEO_CONSOLE" -.LASF406: - .string "stdio_devices" -.LASF329: - .string "eth_current" -.LASF420: - .string "_u_boot_list_2_cmd_2_ddr_test" -.LASF368: - .string "ofdata_to_platdata" -.LASF64: - .string "reserved" -.LASF410: - .string "CHANGEFREQ" -.LASF433: - .string "page_size" -.LASF415: - .string "FASTTEST" -.LASF409: - .string "cd_count" -.LASF84: - .string "bi_dram" -.LASF2: - .string "short unsigned int" -.LASF105: - .string "magic" -.LASF152: - .string "fit_hdr_setup" -.LASF141: - .string "legacy_hdr_valid" -.LASF411: - .string "SCANFREQ" -.LASF60: - .string "base" -.LASF442: - .string "err_case" -.LASF228: - .string "UCLASS_RTC" -.LASF258: - .string "timer_rate_hz" -.LASF52: - .string "sector_count" -.LASF127: - .string "ih_comp" -.LASF390: - .string "post_bind" -.LASF367: - .string "unbind" -.LASF157: - .string "ft_addr" -.LASF474: - .string "uclass_get_device" -.LASF4: - .string "uchar" -.LASF158: - .string "ft_len" -.LASF47: - .string "next" -.LASF388: - .string "data" -.LASF100: - .string "CMD_RET_SUCCESS" -.LASF153: - .string "fit_uname_setup" -.LASF48: - .string "prev" -.LASF212: - .string "UCLASS_PCH" -.LASF213: - .string "UCLASS_PCI" -.LASF332: - .string "net_netmask" -.LASF33: - .string "driver_data" -.LASF86: - .string "IRQ_STACK_START" -.LASF180: - .string "UCLASS_ADC" -.LASF175: - .string "UCLASS_SPI_EMUL" -.LASF262: - .string "tlb_size" -.LASF150: - .string "fit_uname_fdt" - .hidden malloc - .ident "GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404" - .section .note.GNU-stack,"",@progbits diff --git a/u-boot/cmd/memtester/ddr_tester_common.c b/u-boot/cmd/ddr_tool/ddr_tool_common.c similarity index 92% rename from u-boot/cmd/memtester/ddr_tester_common.c rename to u-boot/cmd/ddr_tool/ddr_tool_common.c index 713d1a9..e2faf6a 100644 --- a/u-boot/cmd/memtester/ddr_tester_common.c +++ b/u-boot/cmd/ddr_tool/ddr_tool_common.c @@ -5,7 +5,7 @@ #include <common.h> #include <power/regulator.h> -#include "ddr_tester_common.h" +#include "ddr_tool_common.h" DECLARE_GLOBAL_DATA_PTR; @@ -84,6 +84,13 @@ for (i = 0; i < max_bank; i++) { start_adr[i] = gd->bd->bi_dram[i].start; length[i] = gd->bd->bi_dram[i].size; +#if defined(CONFIG_ROCKCHIP_RV1126) + /* On RV1126, writing data to 0x00600000 will cause a crash. */ + if (start_adr[i] == 0 && length[i] > 0x00700000) { + start_adr[i] = 0x00700000; + length[i] -= 0x00700000; + } +#endif } length[max_bank - 1] = (gd->start_addr_sp - RESERVED_SP_SIZE - diff --git a/u-boot/cmd/memtester/ddr_tester_common.h b/u-boot/cmd/ddr_tool/ddr_tool_common.h similarity index 81% rename from u-boot/cmd/memtester/ddr_tester_common.h rename to u-boot/cmd/ddr_tool/ddr_tool_common.h index 2ff3fd7..59422b2 100644 --- a/u-boot/cmd/memtester/ddr_tester_common.h +++ b/u-boot/cmd/ddr_tool/ddr_tool_common.h @@ -4,8 +4,8 @@ */ /* Function declaration. */ -#ifndef _CMD_MEMTESTER_DDR_TOOL_COMMON_H -#define _CMD_MEMTESTER_DDR_TOOL_COMMON_H +#ifndef __CMD_DDR_TOOL_DDR_TOOL_COMMON_H +#define __CMD_DDR_TOOL_DDR_TOOL_COMMON_H /* reserved 1MB for stack */ #define RESERVED_SP_SIZE 0x100000 @@ -17,4 +17,4 @@ void get_print_available_addr(ulong *start_adr, ulong *length, int print_en); int judge_test_addr(ulong *arg, ulong *start_adr, ulong *length); int set_vdd_logic(u32 uv); -#endif /* _CMD_MEMTESTER_DDR_TOOL_COMMON_H */ +#endif /* __CMD_DDR_TOOL_DDR_TOOL_COMMON_H */ diff --git a/u-boot/cmd/ddr_tool/ddr_tool_mp.S b/u-boot/cmd/ddr_tool/ddr_tool_mp.S new file mode 100644 index 0000000..ca53486 --- /dev/null +++ b/u-boot/cmd/ddr_tool/ddr_tool_mp.S @@ -0,0 +1,171 @@ +/* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */ +/* + * Copyright (C) 2023 Rockchip Electronics Co., Ltd. + */ + + .global __sp + + .global secondary_main + .global secondary_init + .global get_cpu_id + .global lock_byte_mutex + .global unlock_byte_mutex + +#ifndef CONFIG_ARM64 + .align 7 +vectors_2: + ldr pc, =die_loop /* reset */ + ldr pc, =die_loop /* undefine */ + ldr pc, =die_loop /* swi */ + ldr pc, =die_loop /* iabort */ + ldr pc, =die_loop /* dabort */ + ldr pc, =die_loop /* reserved */ + ldr pc, =die_loop /* irq */ + ldr pc, =die_loop /* fiq */ + + .align 7 +die_loop: + b die_loop + + .align 7 + .type secondary_init, %function +secondary_init: + bl irq_disable + bl icache_invalid + + /* set sp */ + ldr r2, =__sp + ldr r1, [r2] + bic r1, r1, #0xf + mov sp, r1 + bl icache_invalid + + mrc p15, 0, r0, c1, c0, 0 /* CP15 C1 System Control Register */ + bic r0, r0, #0x2000 /* clear V (bit[13], VBAR) */ + mcr p15, 0, r0, c1, c0, 0 /* for remap VBAR */ + ldr r0, =vectors_2 + mcr p15, 0, r0, c12, c0, 0 + bl icache_invalid + + b secondary_main + +irq_disable: + mrs r0, cpsr + orr r0, r0, #0xc0 + msr cpsr, r0 + bx lr + +icache_invalid: + mov r0, #0 + mcr p15, 0, r0, c7, c5, 0 + bx lr + + .type get_cpu_id, %function +get_cpu_id: + mrc p15, 0, r0, c0, c0, 5 + and r0, r0, #0x3 + bx lr + + .align 7 + .type lock_byte_mutex, %function +lock_byte_mutex: + mov r2, #0x1 +try: + ldrex r1, [r0] + cmp r1, #0 + strexeq r1, r2, [r0] + cmpeq r1, #0 + bne try + dmb + bx lr + + .align 7 + .type unlock_byte_mutex, %function +unlock_byte_mutex: + dmb + mov r1, #0 + str r1, [r0] + dsb + bx lr +#else /* CONFIG_ARM64 */ + .align 7 +el2_vectors: +synchronous_sp0: + b secondary_init + .align 7 +irq_sp0: + b irq_sp0 + .align 7 +fiq_sp0: + b fiq_sp0 + .align 7 +serror_sp0: + b serror_sp0 + .align 7 +synchronous_spx: + b synchronous_spx + .align 7 +irq_spx: + b irq_spx + .align 7 +fiq_spx: + b fiq_spx + .align 7 +serror_spx: + b serror_spx + + .align 7 + .type secondary_init, %function +secondary_init: + bl irq_disable + + /* set sp */ + ldr x2, =__sp + ldr x1, [x2] + bic x1, x1, #0xf + mov sp, x1 + bl icache_invalid + + ldr w0, =el2_vectors + msr vbar_el2, x0 + bl icache_invalid + + bl secondary_main + + .type irq_disable, %function +irq_disable: + msr daifset, #0x3 + ic iallu + ret + + .type icache_invalid, %function +icache_invalid: + ic iallu + ret + + .align 7 + .type lock_byte_mutex, %function +lock_byte_mutex: + ldxrb w1, [x0] + cmp w1, #1 + bne 1f + wfe + b lock_byte_mutex +1: + mov x1, #1 + stxrb w2, w1, [x0] + cmp w2, #0 + bne lock_byte_mutex + dmb sy + ret + + .align 7 + .type unlock_byte_mutex, %function +unlock_byte_mutex: + dmb sy + mov x1, #0 + strb w1, [x0] + dsb sy + sev + ret +#endif /* #ifdef CONFIG_ARM */ diff --git a/u-boot/cmd/memtester/io_map.c b/u-boot/cmd/ddr_tool/io_map.c similarity index 100% rename from u-boot/cmd/memtester/io_map.c rename to u-boot/cmd/ddr_tool/io_map.c diff --git a/u-boot/cmd/memtester/io_map.h b/u-boot/cmd/ddr_tool/io_map.h similarity index 64% rename from u-boot/cmd/memtester/io_map.h rename to u-boot/cmd/ddr_tool/io_map.h index 3b17440..5ec4994 100644 --- a/u-boot/cmd/memtester/io_map.h +++ b/u-boot/cmd/ddr_tool/io_map.h @@ -3,12 +3,12 @@ * Copyright (C) 2019 Rockchip Electronics Co., Ltd. */ -#ifndef _CMD_MEMTESTER_IO_MAP_H -#define _CMD_MEMTESTER_IO_MAP_H +#ifndef __CMD_DDR_TOOL_MEMTESTER_IO_MAP_H +#define __CMD_DDR_TOOL_MEMTESTER_IO_MAP_H #define CPU_2_IO_ALIGN_LEN (16) /* 16 byte */ int data_cpu_2_io(void *p, u32 len); void data_cpu_2_io_init(void); -#endif /* _CMD_MEMTESTER_IO_MAP_H */ +#endif /* __CMD_DDR_TOOL_MEMTESTER_IO_MAP_H */ diff --git a/u-boot/cmd/ddr_tool/memtester/Makefile b/u-boot/cmd/ddr_tool/memtester/Makefile new file mode 100644 index 0000000..7e26994 --- /dev/null +++ b/u-boot/cmd/ddr_tool/memtester/Makefile @@ -0,0 +1,8 @@ +# +# (C) Copyright 2023 Rockchip Electronics Co., Ltd. +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-$(CONFIG_CMD_MEMTESTER) += memtester.o +obj-$(CONFIG_CMD_MEMTESTER) += tests.o diff --git a/u-boot/cmd/memtester/memtester.c b/u-boot/cmd/ddr_tool/memtester/memtester.c similarity index 98% rename from u-boot/cmd/memtester/memtester.c rename to u-boot/cmd/ddr_tool/memtester/memtester.c index 7936c03..37aaa5c 100644 --- a/u-boot/cmd/memtester/memtester.c +++ b/u-boot/cmd/ddr_tool/memtester/memtester.c @@ -20,8 +20,8 @@ #include "sizes.h" #include "types.h" #include "tests.h" -#include "io_map.h" -#include "ddr_tester_common.h" +#include "../ddr_tool_common.h" +#include "../io_map.h" #define EXIT_FAIL_NONSTARTER 0x01 #define EXIT_FAIL_ADDRESSLINES 0x02 diff --git a/u-boot/cmd/memtester/memtester.h b/u-boot/cmd/ddr_tool/memtester/memtester.h similarity index 86% rename from u-boot/cmd/memtester/memtester.h rename to u-boot/cmd/ddr_tool/memtester/memtester.h index 5275a8c..8e5d91f 100644 --- a/u-boot/cmd/memtester/memtester.h +++ b/u-boot/cmd/ddr_tool/memtester/memtester.h @@ -13,8 +13,8 @@ * See other comments in that file. * */ -#ifndef _CMD_MEMTESTER_H -#define _CMD_MEMTESTER_H +#ifndef __CMD_DDR_TOOL_MEMTESTER_MEMTESTER_H +#define __CMD_DDR_TOOL_MEMTESTER_MEMTESTER_H #include <linux/types.h> /* extern declarations. */ @@ -25,4 +25,4 @@ int doing_memtester(unsigned long *arg, unsigned long testenable, unsigned long loops, unsigned long err_exit, unsigned long fix_bit, unsigned long fix_level); -#endif /* _CMD_MEMTESTER_H */ +#endif /* __CMD_DDR_TOOL_MEMTESTER_MEMTESTER_H */ diff --git a/u-boot/cmd/memtester/sizes.h b/u-boot/cmd/ddr_tool/memtester/sizes.h similarity index 86% rename from u-boot/cmd/memtester/sizes.h rename to u-boot/cmd/ddr_tool/memtester/sizes.h index 8c86e11..71d1988 100644 --- a/u-boot/cmd/memtester/sizes.h +++ b/u-boot/cmd/ddr_tool/memtester/sizes.h @@ -12,8 +12,8 @@ * This file contains some macro definitions for handling 32/64 bit platforms. * */ -#ifndef __MEMTESTER_SIZES_H -#define __MEMTESTER_SIZES_H +#ifndef __CMD_DDR_TOOL_MEMTESTER_SIZES_H +#define __CMD_DDR_TOOL_MEMTESTER_SIZES_H #include <common.h> @@ -26,4 +26,4 @@ #define CHECKERBOARD2 0xaaaaaaaa #define UL_BYTE(x) ((x | x << 8 | x << 16 | x << 24)) -#endif /* __MEMTESTER_SIZES_H */ +#endif /* __CMD_DDR_TOOL_MEMTESTER_SIZES_H */ diff --git a/u-boot/cmd/memtester/tests.c b/u-boot/cmd/ddr_tool/memtester/tests.c similarity index 99% rename from u-boot/cmd/memtester/tests.c rename to u-boot/cmd/ddr_tool/memtester/tests.c index 4f27c1c..b4aa288 100644 --- a/u-boot/cmd/memtester/tests.c +++ b/u-boot/cmd/ddr_tool/memtester/tests.c @@ -17,7 +17,7 @@ #include "memtester.h" #include "sizes.h" #include "types.h" -#include "io_map.h" +#include "../io_map.h" union { unsigned char bytes[UL_LEN / 8]; diff --git a/u-boot/cmd/memtester/tests.h b/u-boot/cmd/ddr_tool/memtester/tests.h similarity index 94% rename from u-boot/cmd/memtester/tests.h rename to u-boot/cmd/ddr_tool/memtester/tests.h index b3ddcae..5082dbc 100644 --- a/u-boot/cmd/memtester/tests.h +++ b/u-boot/cmd/ddr_tool/memtester/tests.h @@ -15,6 +15,9 @@ * */ +#ifndef __CMD_DDR_TOOL_MEMTESTER_TESTS_H +#define __CMD_DDR_TOOL_MEMTESTER_TESTS_H + /* Function declaration. */ int test_stuck_address(u32v *bufa, size_t count); @@ -54,3 +57,5 @@ int test_16bit_wide_random(u32v *bufa, u32v *bufb, size_t count, ul fix_bit, ul fix_level); #endif + +#endif /* __CMD_DDR_TOOL_MEMTESTER_TESTS_H */ diff --git a/u-boot/cmd/memtester/types.h b/u-boot/cmd/ddr_tool/memtester/types.h similarity index 100% rename from u-boot/cmd/memtester/types.h rename to u-boot/cmd/ddr_tool/memtester/types.h diff --git a/u-boot/cmd/ddr_tool/stressapptest/Makefile b/u-boot/cmd/ddr_tool/stressapptest/Makefile new file mode 100644 index 0000000..94e332f --- /dev/null +++ b/u-boot/cmd/ddr_tool/stressapptest/Makefile @@ -0,0 +1,7 @@ +# +# (C) Copyright 2023 Rockchip Electronics Co., Ltd. +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-$(CONFIG_CMD_STRESSAPPTEST) += stressapptest.o diff --git a/u-boot/cmd/ddr_tool/stressapptest/stressapptest.c b/u-boot/cmd/ddr_tool/stressapptest/stressapptest.c new file mode 100644 index 0000000..35b493c --- /dev/null +++ b/u-boot/cmd/ddr_tool/stressapptest/stressapptest.c @@ -0,0 +1,1207 @@ +// Copyright 2006 Google Inc. All Rights Reserved. +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This is stressapptest for Rockchip platform in U-Boot, the design idea and + * the patterns are from code.google.com/p/stressapptest. + */ + +#include <common.h> +#include <amp.h> +#include <div64.h> +#include <malloc.h> +#include <asm/arch/rockchip_smccc.h> +#include "stressapptest.h" +#include "../ddr_tool_common.h" + +#define __version__ "v1.2.0 20230619" + +#if defined(CONFIG_ARM64) +/* Float operation in TOOLCHAIN_ARM32 will cause the compile error */ +#define WARM_CPU +#endif + +#define PAT_NUM 26 +#define PATTERN_LIST_SIZE (PAT_NUM * 2 * 4) + +#define CPU_NUM_MAX 16 + +static u32 walking_1_data[] = { + 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x00000800, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0x00020000, 0x00040000, 0x00080000, + 0x00100000, 0x00200000, 0x00400000, 0x00800000, + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x40000000, 0x20000000, 0x10000000, 0x08000000, + 0x04000000, 0x02000000, 0x01000000, 0x00800000, + 0x00400000, 0x00200000, 0x00100000, 0x00080000, + 0x00040000, 0x00020000, 0x00010000, 0x00008000, + 0x00004000, 0x00002000, 0x00001000, 0x00000800, + 0x00000400, 0x00000200, 0x00000100, 0x00000080, + 0x00000040, 0x00000020, 0x00000010, 0x00000008, + 0x00000004, 0x00000002, 0x00000001, 0x00000000 +}; + +static struct pat walking_1 = { + "walking_1", + walking_1_data, + ARRAY_SIZE(walking_1_data) - 1, /* mask */ + {1, 1, 2, 1} /* weight */ +}; + +static u32 walking_1_x16_data[] = { + 0x00020001, 0x00080004, 0x00200010, 0x00800040, + 0x02000100, 0x08000400, 0x20001000, 0x80004000, + 0x20004000, 0x08001000, 0x02000400, 0x00800100, + 0x00200040, 0x00080010, 0x00020004, 0x00000001 +}; + +static struct pat walking_1_x16 = { + "walking_1_x16", + walking_1_x16_data, + ARRAY_SIZE(walking_1_x16_data) - 1, /* mask */ + {2, 0, 0, 0} /* Weight for choosing 32/64/128/256 bit wide of this pattern */ + /* Reuse for walking_0_x16, because of invert */ +}; + +static u32 walking_1_x16_repeat_data[] = { + 0x00010001, 0x00020002, 0x00040004, 0x00080008, + 0x00100010, 0x00200020, 0x00400040, 0x00800080, + 0x01000100, 0x02000200, 0x04000400, 0x08000800, + 0x10001000, 0x20002000, 0x40004000, 0x80008000, + 0x40004000, 0x20002000, 0x10001000, 0x08000800, + 0x04000400, 0x02000200, 0x01000100, 0x00800080, + 0x00400040, 0x00200020, 0x00100010, 0x00080008, + 0x00040004, 0x00020002, 0x00010001, 0x00000000 +}; + +static struct pat walking_1_x16_repeat = { + "walking_1_x16_repeat", + walking_1_x16_repeat_data, + ARRAY_SIZE(walking_1_x16_repeat_data) - 1, /* mask */ + {2, 4, 2, 0} /* Weight for choosing 32/64/128/256 bit wide of this pattern */ + /* Reuse for walking_0_x16_repeat, because of invert */ +}; + +static u32 walking_inv_1_data[] = { + 0x00000001, 0xfffffffe, 0x00000002, 0xfffffffd, + 0x00000004, 0xfffffffb, 0x00000008, 0xfffffff7, + 0x00000010, 0xffffffef, 0x00000020, 0xffffffdf, + 0x00000040, 0xffffffbf, 0x00000080, 0xffffff7f, + 0x00000100, 0xfffffeff, 0x00000200, 0xfffffdff, + 0x00000400, 0xfffffbff, 0x00000800, 0xfffff7ff, + 0x00001000, 0xffffefff, 0x00002000, 0xffffdfff, + 0x00004000, 0xffffbfff, 0x00008000, 0xffff7fff, + 0x00010000, 0xfffeffff, 0x00020000, 0xfffdffff, + 0x00040000, 0xfffbffff, 0x00080000, 0xfff7ffff, + 0x00100000, 0xffefffff, 0x00200000, 0xffdfffff, + 0x00400000, 0xffbfffff, 0x00800000, 0xff7fffff, + 0x01000000, 0xfeffffff, 0x02000000, 0xfdffffff, + 0x04000000, 0xfbffffff, 0x08000000, 0xf7ffffff, + 0x10000000, 0xefffffff, 0x20000000, 0xdfffffff, + 0x40000000, 0xbfffffff, 0x80000000, 0x7fffffff, + 0x40000000, 0xbfffffff, 0x20000000, 0xdfffffff, + 0x10000000, 0xefffffff, 0x08000000, 0xf7ffffff, + 0x04000000, 0xfbffffff, 0x02000000, 0xfdffffff, + 0x01000000, 0xfeffffff, 0x00800000, 0xff7fffff, + 0x00400000, 0xffbfffff, 0x00200000, 0xffdfffff, + 0x00100000, 0xffefffff, 0x00080000, 0xfff7ffff, + 0x00040000, 0xfffbffff, 0x00020000, 0xfffdffff, + 0x00010000, 0xfffeffff, 0x00008000, 0xffff7fff, + 0x00004000, 0xffffbfff, 0x00002000, 0xffffdfff, + 0x00001000, 0xffffefff, 0x00000800, 0xfffff7ff, + 0x00000400, 0xfffffbff, 0x00000200, 0xfffffdff, + 0x00000100, 0xfffffeff, 0x00000080, 0xffffff7f, + 0x00000040, 0xffffffbf, 0x00000020, 0xffffffdf, + 0x00000010, 0xffffffef, 0x00000008, 0xfffffff7, + 0x00000004, 0xfffffffb, 0x00000002, 0xfffffffd, + 0x00000001, 0xfffffffe, 0x00000000, 0xffffffff +}; + +static struct pat walking_inv_1 = { + "walking_inv_1", + walking_inv_1_data, + ARRAY_SIZE(walking_inv_1_data) - 1, /* mask */ + {2, 2, 5, 5} /* weight */ +}; + +static u32 walking_inv_1_x16_data[] = { + 0xfffe0001, 0xfffd0002, 0xfffb0004, 0xfff70008, + 0xffef0010, 0xffdf0020, 0xffbf0040, 0xff7f0080, + 0xfeff0100, 0xfdff0200, 0xfbff0400, 0xf7ff0800, + 0xefff1000, 0xdfff2000, 0xbfff4000, 0x7fff8000, + 0xbfff4000, 0xdfff2000, 0xefff1000, 0xf7ff0800, + 0xfbff0400, 0xfdff0200, 0xfeff0100, 0xff7f0080, + 0xffbf0040, 0xffdf0020, 0xffef0010, 0xfff70008, + 0xfffb0004, 0xfffd0002, 0xfffe0001, 0xffff0000 +}; + +static struct pat walking_inv_1_x16 = { + "walking_inv_1_x16", + walking_inv_1_x16_data, + ARRAY_SIZE(walking_inv_1_x16_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static u32 walking_inv_1_x16_repeat_data[] = { + 0x00010001, 0xfffefffe, 0x00020002, 0xfffdfffd, + 0x00040004, 0xfffbfffb, 0x00080008, 0xfff7fff7, + 0x00100010, 0xffefffef, 0x00200020, 0xffdfffdf, + 0x00400040, 0xffbfffbf, 0x00800080, 0xff7fff7f, + 0x01000100, 0xfefffeff, 0x02000200, 0xfdfffdff, + 0x04000400, 0xfbfffbff, 0x08000800, 0xf7fff7ff, + 0x10001000, 0xefffefff, 0x20002000, 0xdfffdfff, + 0x40004000, 0xbfffbfff, 0x80008000, 0x7fff7fff, + 0x40004000, 0xbfffbfff, 0x20002000, 0xdfffdfff, + 0x10001000, 0xefffefff, 0x08000800, 0xf7fff7ff, + 0x04000400, 0xfbfffbff, 0x02000200, 0xfdfffdff, + 0x01000100, 0xfefffeff, 0x00800080, 0xff7fff7f, + 0x00400040, 0xffbfffbf, 0x00200020, 0xffdfffdf, + 0x00100010, 0xffefffef, 0x00080008, 0xfff7fff7, + 0x00040004, 0xfffbfffb, 0x00020002, 0xfffdfffd, + 0x00010001, 0xfffefffe, 0x00000000, 0xffffffff +}; + +static struct pat walking_inv_1_x16_repeat = { + "walking_inv_1_x16_repeat", + walking_inv_1_x16_repeat_data, + ARRAY_SIZE(walking_inv_1_x16_repeat_data) - 1, /* mask */ + {2, 5, 5, 0} /* weight */ +}; + +static u32 walking_0_data[] = { + 0xfffffffe, 0xfffffffd, 0xfffffffb, 0xfffffff7, + 0xffffffef, 0xffffffdf, 0xffffffbf, 0xffffff7f, + 0xfffffeff, 0xfffffdff, 0xfffffbff, 0xfffff7ff, + 0xffffefff, 0xffffdfff, 0xffffbfff, 0xffff7fff, + 0xfffeffff, 0xfffdffff, 0xfffbffff, 0xfff7ffff, + 0xffefffff, 0xffdfffff, 0xffbfffff, 0xff7fffff, + 0xfeffffff, 0xfdffffff, 0xfbffffff, 0xf7ffffff, + 0xefffffff, 0xdfffffff, 0xbfffffff, 0x7fffffff, + 0xbfffffff, 0xdfffffff, 0xefffffff, 0xf7ffffff, + 0xfbffffff, 0xfdffffff, 0xfeffffff, 0xff7fffff, + 0xffbfffff, 0xffdfffff, 0xffefffff, 0xfff7ffff, + 0xfffbffff, 0xfffdffff, 0xfffeffff, 0xffff7fff, + 0xffffbfff, 0xffffdfff, 0xffffefff, 0xfffff7ff, + 0xfffffbff, 0xfffffdff, 0xfffffeff, 0xffffff7f, + 0xffffffbf, 0xffffffdf, 0xffffffef, 0xfffffff7, + 0xfffffffb, 0xfffffffd, 0xfffffffe, 0xffffffff +}; + +static struct pat walking_0 = { + "walking_0", + walking_0_data, + ARRAY_SIZE(walking_0_data) - 1, /* mask */ + {1, 1, 2, 1} /* weight */ +}; + +static u32 one_zero_data[] = {0x00000000, 0xffffffff}; + +static struct pat one_zero = { + "one_zero", + one_zero_data, + ARRAY_SIZE(one_zero_data) - 1, /* mask */ + {5, 5, 15, 5} /* weight */ +}; + +static unsigned int one_zero_x16_data[] = {0x0000ffff, 0x0000ffff}; + +static struct pat one_zero_x16 = { + "one_zero_x16", + one_zero_x16_data, + ARRAY_SIZE(one_zero_x16_data) - 1, /* mask */ + {5, 0, 0, 0} /* weight */ +}; + +static u32 just_0_data[] = {0x00000000, 0x00000000}; + +static struct pat just_0 = { + "just_0", + just_0_data, + ARRAY_SIZE(just_0_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static u32 just_1_data[] = {0xffffffff, 0xffffffff}; + +static struct pat just_1 = { + "just_1", + just_1_data, + ARRAY_SIZE(just_1_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static u32 just_5_data[] = {0x55555555, 0x55555555}; + +static struct pat just_5 = { + "just_5", + just_5_data, + ARRAY_SIZE(just_5_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static u32 just_a_data[] = {0xaaaaaaaa, 0xaaaaaaaa}; + +static struct pat just_a = { + "just_a", + just_a_data, + ARRAY_SIZE(just_a_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static u32 five_a_data[] = {0x55555555, 0xaaaaaaaa}; + +static struct pat five_a = { + "five_a", + five_a_data, + ARRAY_SIZE(five_a_data) - 1, /* mask */ + {1, 1, 1, 1} /* weight */ +}; + +static unsigned int five_a_x16_data[] = {0x5555aaaa, 0x5555aaaa}; + +static struct pat five_a_x16 = { + "five_a_x16", + five_a_x16_data, + ARRAY_SIZE(five_a_x16_data) - 1, /* mask */ + {1, 0, 0, 0} /* weight */ +}; + +static u32 five_a8_data[] = { + 0x5aa5a55a, 0xa55a5aa5, 0xa55a5aa5, 0x5aa5a55a +}; + +static struct pat five_a8 = { + "five_a8", + five_a8_data, + ARRAY_SIZE(five_a8_data) - 1, /* mask */ + {1, 1, 1, 1} /* weight */ +}; + +static u32 five_a8_x16_data[] = {0x5aa5a55a, 0xa55a5aa5}; + +static struct pat five_a8_x16 = { + "five_a8_x16", + five_a8_x16_data, + ARRAY_SIZE(five_a8_x16_data) - 1, /* mask */ + {1, 0, 0, 0} /* weight */ +}; + +static unsigned int five_a8_x16_repeat_data[] = { + 0x5aa55aa5, 0xa55aa55a, 0xa55aa55a, 0x5aa55aa5 +}; + +static struct pat five_a8_x16_repeat = { + "five_a8_x16_repeat", + five_a8_x16_repeat_data, + ARRAY_SIZE(five_a8_x16_repeat_data) - 1, /* mask */ + {1, 1, 1, 0} /* weight */ +}; + +static u32 long_8b10b_data[] = {0x16161616, 0x16161616}; + +static struct pat long_8b10b = { + "long_8b10b", + long_8b10b_data, + ARRAY_SIZE(long_8b10b_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static u32 short_8b10b_data[] = {0xb5b5b5b5, 0xb5b5b5b5}; + +static struct pat short_8b10b = { + "short_8b10b", + short_8b10b_data, + ARRAY_SIZE(short_8b10b_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static u32 checker_8b10b_data[] = {0xb5b5b5b5, 0x4a4a4a4a}; + +static struct pat checker_8b10b = { + "checker_8b10b", + checker_8b10b_data, + ARRAY_SIZE(checker_8b10b_data) - 1, /* mask */ + {1, 0, 1, 1} /* weight */ +}; + +static u32 checker_8b10b_x16_data[] = {0xb5b54a4a, 0xb5b54a4a}; + +static struct pat checker_8b10b_x16 = { + "checker_8b10b_x16", + checker_8b10b_x16_data, + ARRAY_SIZE(checker_8b10b_x16_data) - 1, /* mask */ + {1, 0, 0, 0} /* weight */ +}; + +static u32 five_7_data[] = {0x55555557, 0x55575555}; + +static struct pat five_7 = { + "five_7", + five_7_data, + ARRAY_SIZE(five_7_data) - 1, /* mask */ + {0, 2, 0, 0} /* weight */ +}; + +static u32 five_7_x16_data[] = {0x55575557, 0x57555755}; + +static struct pat five_7_x16 = { + "five_7_x16", + five_7_x16_data, + ARRAY_SIZE(five_7_x16_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static u32 zero2_fd_data[] = {0x00020002, 0xfffdfffd}; + +static struct pat zero2_fd = { + "zero2_fd", + zero2_fd_data, + ARRAY_SIZE(zero2_fd_data) - 1, /* mask */ + {0, 2, 0, 0} /* weight */ +}; + +static u32 zero2_fd_x16_data[] = {0x02020202, 0xfdfdfdfd}; + +static struct pat zero2_fd_x16 = { + "zero2_fd_x16", + zero2_fd_x16_data, + ARRAY_SIZE(zero2_fd_x16_data) - 1, /* mask */ + {2, 0, 0, 0} /* weight */ +}; + +static struct pat *pat_array[] = { + &walking_1, + &walking_1_x16, + &walking_1_x16_repeat, + &walking_inv_1, + &walking_inv_1_x16, + &walking_inv_1_x16_repeat, + &walking_0, + &one_zero, + &one_zero_x16, + &just_0, + &just_1, + &just_5, + &just_a, + &five_a, + &five_a_x16, + &five_a8, + &five_a8_x16, + &five_a8_x16_repeat, + &long_8b10b, + &short_8b10b, + &checker_8b10b, + &checker_8b10b_x16, + &five_7, + &five_7_x16, + &zero2_fd, + &zero2_fd_x16 +}; + +static u32 cpu_copy_err[CPU_NUM_MAX]; +static u32 cpu_inv_err[CPU_NUM_MAX]; + +static u64 start_time_us; +static u64 test_time_us; + +static bool cpu_init_finish[CPU_NUM_MAX]; +static bool cpu_test_finish[CPU_NUM_MAX]; +static bool pattern_page_init_finish; + +#if (CPU_NUM_MAX > 1) +static ulong test_count = 0; +static ulong __gd; /* set r9/x18 of secondary cpu to gd addr */ +#endif +ulong __sp; /* set sp of secondary cpu */ + +u32 print_mutex; /* 0: unlock, 1: lock */ + +static u64 get_time_us(void) +{ + return lldiv(get_ticks(), CONFIG_SYS_HZ_CLOCK / (CONFIG_SYS_HZ * 1000)); +} + +static u64 run_time_us(void) +{ + return get_time_us() - start_time_us; +} + +static void print_time_stamp(void) +{ + u64 time_us; + + time_us = run_time_us(); + + printf("[%5d.%06d] ", (u32)(time_us / 1000000), (u32)(time_us % 1000000)); +} + +static u32 pattern_get(struct pattern *pattern, u32 offset) +{ + u32 ret; + + ret = pattern->pat->data_array[(offset >> pattern->repeat) & + pattern->pat->mask]; + + return pattern->inv ? ~ret : ret; +} + +static void pattern_adler_sum_calc(struct pattern *pattern, + struct stressapptest_params *sat) +{ + int i = 0; + u64 a1 = 1; + u64 b1 = 0; + u64 a2 = 1; + u64 b2 = 0; + + while (i < sat->block_size_byte / sizeof(u32)) { + a1 += (u64)pattern_get(pattern, i++); + b1 += a1; + a1 += pattern_get(pattern, i++); + b1 += a1; + + a2 += (u64)pattern_get(pattern, i++); + b2 += a2; + a2 += pattern_get(pattern, i++); + b2 += a2; + } + + pattern->adler_sum.a1 = a1; + pattern->adler_sum.b1 = b1; + pattern->adler_sum.a2 = a2; + pattern->adler_sum.b2 = b2; +} + +static void pattern_list_init(struct pattern *pattern_list, + struct stressapptest_params *sat) +{ + u32 weight_count = 0; + int k = 0; + + for (int i = 0; i < PAT_NUM; i++) { + for (int j = 0; j < 8; j++) { + pattern_list[k].pat = pat_array[i]; + pattern_list[k].inv = j % 2; + pattern_list[k].repeat = j / 2; + pattern_list[k].weight = pattern_list[k].pat->weight[j / 2]; + pattern_adler_sum_calc(&pattern_list[k], sat); + weight_count += pattern_list[k].weight; + k++; + } + } + + sat->weight_count = weight_count; +} + +static u32 get_max_page_num(ulong page_size_byte) +{ + ulong start_adr[CONFIG_NR_DRAM_BANKS], length[CONFIG_NR_DRAM_BANKS]; + u32 page_num = 0; + + get_print_available_addr(start_adr, length, 0); + + page_num = 0; + for (int i = 0; i < ARRAY_SIZE(start_adr) || i < ARRAY_SIZE(length); i++) { + if ((start_adr[i] == 0 && length[i] == 0)) + break; + page_num += (u32)(length[i] / page_size_byte); + } + + return page_num; +} + +static int get_page_addr(struct page *page_list, + struct stressapptest_params *sat) +{ + ulong start_adr[CONFIG_NR_DRAM_BANKS], length[CONFIG_NR_DRAM_BANKS]; + ulong used_length; + u32 page = 0; + + get_print_available_addr(start_adr, length, 0); + + printf("Address for test:\n Start End Length\n"); + for (int i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { + if ((start_adr[i] == 0 && length[i] == 0) || page >= sat->page_num) + break; + if (start_adr[i] + length[i] < sat->total_start_addr) + continue; + if (start_adr[i] < sat->total_start_addr) { + length[i] -= sat->total_start_addr - start_adr[i]; + start_adr[i] = sat->total_start_addr; + } + + used_length = 0; + while (page < sat->page_num && + length[i] >= used_length + sat->page_size_byte) { + page_list[page].base_addr = (void *)(start_adr[i] + used_length); + used_length += sat->page_size_byte; + page++; + } + printf(" 0x%09lx - 0x%09lx 0x%09lx\n", + start_adr[i], start_adr[i] + used_length, used_length); + } + + printf("page_num = %d, page_size = 0x%lx, total_test_size = 0x%lx\n", + page, sat->page_size_byte, sat->page_size_byte * page); + + if (sat->total_test_size_mb == 0) { + /* No arg for total_test_size_mb, test all available space by default. */ + sat->page_num = page; + } else if (page < sat->page_num || page < sat->cpu_num * 4) { + printf("ERROR: Cannot get enough pages to test.\n"); + printf("Please decrease page_size or test_size\n"); + + return -1; + } + + return 0; +} + +static void page_init_valid(struct page *page, struct pattern *pattern_list, + struct stressapptest_params *sat) +{ + int target; + int i = 0; + u64 *mem; + + target = (rand() % sat->weight_count) + 1; + do { + target -= pattern_list[i++].weight; + if (target <= 0) + break; + } while (i < PATTERN_LIST_SIZE); + page->pattern = &pattern_list[--i]; + page->valid = 1; + + mem = (u64 *)page->base_addr; + for (i = 0; i < sat->page_size_byte / sizeof(u64); i++) + mem[i] = (u64)pattern_get(page->pattern, i * 2) | + (u64)pattern_get(page->pattern, i * 2 + 1) << 32; +} + +static void page_init_empty(struct page *page) +{ + page->valid = 0; +} + +static void page_init(struct pattern *pattern_list, + struct stressapptest_params *sat) +{ + int i, cpu; + u32 empty_page_num; + + for (cpu = 0; cpu < sat->cpu_num; cpu++) { + empty_page_num = 0; + for (i = cpu; i < sat->page_num; i += sat->cpu_num) { + if (rand() % 5 < 3) { + page_list[i].valid = 1; + } else { + page_list[i].valid = 0; + empty_page_num++; + } + } + while (empty_page_num >= sat->page_num / sat->cpu_num / 2 && i > 0) { + i -= sat->cpu_num; + if (page_list[i].valid == 0) { + page_list[i].valid = 1; + empty_page_num--; + } + } + i = cpu; + while (empty_page_num < 2 && i < sat->page_num) { + if (page_list[i].valid == 1) { + page_list[i].valid = 0; + empty_page_num++; + } + i += sat->cpu_num; + } + } + + for (i = 0; i < sat->page_num; i++) { + if (page_list[i].valid == 1) + page_init_valid(&page_list[i], pattern_list, sat); + else + page_init_empty(&page_list[i]); + } + flush_dcache_all(); +} + +static u32 page_rand_pick(struct page *page_list, bool valid, + struct stressapptest_params *sat, u8 cpu_id) +{ + u32 pick; + + pick = rand() % sat->page_num; + pick = pick / sat->cpu_num * sat->cpu_num + cpu_id; + if (pick >= sat->page_num) + pick = cpu_id; + + while (page_list[pick].valid != valid) { + pick += sat->cpu_num; + if (pick >= sat->page_num) + pick = cpu_id; + } + + return pick; +} + +static u32 block_mis_search(void *dst_addr, struct pattern *src_pattern, char *item, + struct stressapptest_params *sat, u8 cpu_id) +{ + u32 *dst_mem; + u32 read, reread, expected; + u32 err = 0; + u32 *print_addr; + int i, j; + + dst_mem = (u32 *)dst_addr; + + for (i = 0; i < sat->block_size_byte / sizeof(u32); i++) { + read = dst_mem[i]; + expected = pattern_get(src_pattern, i); + + if (read != expected) { + flush_dcache_range((ulong)&dst_mem[i], (ulong)&dst_mem[i + 1]); + reread = dst_mem[i]; + + lock_byte_mutex(&print_mutex); + + print_time_stamp(); + printf("%s Hardware Error: miscompare on CPU %d at 0x%lx:\n", + item, cpu_id, (ulong)&dst_mem[i]); + printf(" read: 0x%08x\n", read); + printf(" reread: 0x%08x(reread^read:0x%08x)\n", + reread, reread ^ read); + printf(" expected:0x%08x(expected^read:0x%08x)\n", + expected, expected ^ read); + printf(" \'%s%s%d\'", src_pattern->pat->name, + src_pattern->inv ? "~" : "", + 32 << src_pattern->repeat); + if (reread == expected) + printf(" read error"); + printf("\n"); + + /* Dump data around the error address */ + print_addr = &dst_mem[i] - 64; + for (j = 0; j < 128; j += 8) + printf(" [0x%010lx] 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x\n", + (ulong)(print_addr + j), + *(print_addr + j), *(print_addr + j + 1), + *(print_addr + j + 2), *(print_addr + j + 3), + *(print_addr + j + 4), *(print_addr + j + 5), + *(print_addr + j + 6), *(print_addr + j + 7)); + + unlock_byte_mutex(&print_mutex); + + /* fix the error */ + dst_mem[i] = expected; + err++; + } + } + flush_dcache_all(); + + if (err == 0) { + lock_byte_mutex(&print_mutex); + printf("%s ERROR detected but cannot find mismatch data (maybe read error).\n", item); + unlock_byte_mutex(&print_mutex); + } + + return err; +} + +static u32 block_inv_check(void *dst_addr, struct pattern *src_pattern, + struct stressapptest_params *sat, u8 cpu_id) +{ + u32 *dst_mem; + u32 err = 0; + int i = 0; +#if defined(WARM_CPU) + double a, b, c, d; +#endif + + struct adler_sum adler_sum = { + 1, 0, 1, 0 + }; + + dst_mem = (u32 *)dst_addr; + +#if defined(WARM_CPU) + a = 2.0 * dst_mem[0]; + b = 5.0 * dst_mem[0]; + c = 7.0 * dst_mem[0]; + d = 9.0 * dst_mem[0]; +#endif + + while (i < sat->block_size_byte / sizeof(u32)) { + adler_sum.a1 += dst_mem[i++]; + adler_sum.b1 += adler_sum.a1; + adler_sum.a1 += dst_mem[i++]; + adler_sum.b1 += adler_sum.a1; + +#if defined(WARM_CPU) + a = a * b; + b = b + c; +#endif + + adler_sum.a2 += dst_mem[i++]; + adler_sum.b2 += adler_sum.a2; + adler_sum.a2 += dst_mem[i++]; + adler_sum.b2 += adler_sum.a2; +#if defined(WARM_CPU) + c = c * d; + d = d + d; +#endif + } + +#if defined(WARM_CPU) + d = a + b + c + d; + if (d == 1.0) + /* Reference the result so that it can't be discarded by the compiler. */ + printf("This will probably never happen.\n"); +#endif + + if (adler_sum.a1 != src_pattern->adler_sum.a1 || + adler_sum.b1 != src_pattern->adler_sum.b1 || + adler_sum.a2 != src_pattern->adler_sum.a2 || + adler_sum.b2 != src_pattern->adler_sum.b2) + err = block_mis_search(dst_addr, src_pattern, "Inv", sat, cpu_id); + + return err; +} + +static void page_inv_up(void *src_addr, struct stressapptest_params *sat) +{ + void *dst_addr = src_addr; + uint data; + uint *dst_mem; + + for (int i = 0; i < sat->block_num; i++) { + dst_mem = (uint *)dst_addr; + for (int j = 0; j < sat->block_size_byte / sizeof(uint); j++) { + data = dst_mem[j]; + dst_mem[j] = ~data; + } + dst_addr += sat->block_size_byte; + flush_dcache_all(); + } +} + +static void page_inv_down(void *src_addr, struct stressapptest_params *sat) +{ + void *dst_addr = src_addr; + uint data; + uint *dst_mem; + + dst_addr += sat->block_size_byte * (sat->block_num - 1); + + for (int i = sat->block_num - 1; i >= 0; i--) { + dst_mem = (uint *)dst_addr; + for (int j = sat->block_size_byte / sizeof(uint) - 1; j >= 0; j--) { + data = dst_mem[j]; + dst_mem[j] = ~data; + } + dst_addr -= sat->block_size_byte; + flush_dcache_all(); + } +} + +static u32 page_inv(struct stressapptest_params *sat, u8 cpu_id) +{ + u32 src; + void *dst_block_addr; + u32 err = 0; + + src = page_rand_pick(page_list, 1, sat, cpu_id); /* pick a valid page */ + dst_block_addr = page_list[src].base_addr; + + for (int i = 0; i < 4; i++) { + if (rand() % 2 == 0) + page_inv_up(page_list[src].base_addr, sat); + else + page_inv_down(page_list[src].base_addr, sat); + } + + for (int i = 0; i < sat->block_num; i++) { + err += block_inv_check(dst_block_addr, page_list[src].pattern, sat, cpu_id); + dst_block_addr += sat->block_size_byte; + } + + flush_dcache_all(); + + return err; +} + +static u32 block_copy_check(void *dst_addr, struct adler_sum *adler_sum, + struct pattern *src_pattern, struct stressapptest_params *sat, + u8 cpu_id) +{ + u32 err = 0; + + if (adler_sum->a1 != src_pattern->adler_sum.a1 || + adler_sum->b1 != src_pattern->adler_sum.b1 || + adler_sum->a2 != src_pattern->adler_sum.a2 || + adler_sum->b2 != src_pattern->adler_sum.b2) + err = block_mis_search(dst_addr, src_pattern, "Copy", sat, cpu_id); + + return err; +} + +static u32 block_copy(void *dst_addr, void *src_addr, + struct pattern *src_pattern, + struct stressapptest_params *sat, u8 cpu_id) +{ + u64 *dst_mem; + u64 *src_mem; + u64 data; + int i = 0; +#if defined(WARM_CPU) + double a, b, c, d; +#endif + + struct adler_sum adler_sum = { + 1, 0, 1, 0 + }; + + dst_mem = (u64 *)dst_addr; + src_mem = (u64 *)src_addr; + +#if defined(WARM_CPU) + a = 2.0 * src_mem[0]; + b = 5.0 * src_mem[0]; + c = 7.0 * src_mem[0]; + d = 9.0 * src_mem[0]; +#endif + + while (i < sat->block_size_byte / sizeof(u64)) { + data = src_mem[i]; + adler_sum.a1 += data & 0xffffffff; + adler_sum.b1 += adler_sum.a1; + adler_sum.a1 += data >> 32; + adler_sum.b1 += adler_sum.a1; + dst_mem[i] = data; + i++; + +#if defined(WARM_CPU) + a = a * b; + b = b + c; +#endif + + data = src_mem[i]; + adler_sum.a2 += data & 0xffffffff; + adler_sum.b2 += adler_sum.a2; + adler_sum.a2 += data >> 32; + adler_sum.b2 += adler_sum.a2; + dst_mem[i] = data; + i++; + +#if defined(WARM_CPU) + c = c * d; + d = d + d; +#endif + } + + flush_dcache_all(); + +#if defined(WARM_CPU) + d = a + b + c + d; + if (d == 1.0) + /* Reference the result so that it can't be discarded by the compiler. */ + printf("This will probably never happen.\n"); +#endif + + return block_copy_check(dst_addr, &adler_sum, src_pattern, sat, cpu_id); +} + +static u32 page_copy(struct stressapptest_params *sat, u8 cpu_id) +{ + u32 dst; + u32 src; + void *dst_block_addr; + void *src_block_addr; + u32 err = 0; + + dst = page_rand_pick(page_list, 0, sat, cpu_id); /* pick a empty page */ + dst_block_addr = page_list[dst].base_addr; + src = page_rand_pick(page_list, 1, sat, cpu_id); /* pick a valid page */ + src_block_addr = page_list[src].base_addr; + flush_dcache_all(); + + for (int i = 0; i < sat->block_num; i++) { + err += block_copy(dst_block_addr, src_block_addr, + page_list[src].pattern, sat, cpu_id); + dst_block_addr += sat->block_size_byte; + src_block_addr += sat->block_size_byte; + } + + page_list[dst].pattern = page_list[src].pattern; + page_list[dst].valid = 1; + page_list[src].valid = 0; + flush_dcache_all(); + + return err; +} + +void secondary_main(void) +{ +#if (CPU_NUM_MAX > 1) + u8 cpu_id; + ulong test = 0; + +#ifndef CONFIG_ARM64 + asm volatile("mov r9, %0" : : "r" (__gd)); /* set r9 to gd addr */ +#else + asm volatile("mov x18, %0" : : "r" (__gd)); /* set x18 to gd addr */ +#endif + dcache_enable(); + icache_enable(); + + udelay(100); + + flush_dcache_all(); + + cpu_id = sat.cpu_num; + cpu_init_finish[cpu_id] = 1; + printf("CPU%d start OK.\n", cpu_id); + + while (pattern_page_init_finish == 0) { + udelay(100); + flush_dcache_all(); + } + + while (1) { + udelay(100); + flush_dcache_all(); + while (test < test_count) { + cpu_test_finish[cpu_id] = 0; + flush_dcache_all(); + while (run_time_us() < test_time_us) { + if (rand() % 2 == 0) + cpu_copy_err[cpu_id] += page_copy(&sat, cpu_id); + else + cpu_inv_err[cpu_id] += page_inv(&sat, cpu_id); + } + test++; + cpu_test_finish[cpu_id] = 1; + flush_dcache_all(); + } + } +#else + return; +#endif +} + +static int doing_stressapptest(void) +{ + int i; + u32 pre_10s; + u32 now_10s; + + struct pattern pattern_list[PATTERN_LIST_SIZE]; + void *page_info; + + u32 all_copy_err = 0; + u32 all_inv_err = 0; + u32 cpu_no_response_err = 0; + + int ret = CMD_RET_SUCCESS; + + for (i = 0; i < CPU_NUM_MAX; i++) { + cpu_copy_err[i] = 0; + cpu_inv_err[i] = 0; + cpu_init_finish[i] = 0; + cpu_test_finish[i] = 0; + } + pattern_page_init_finish = 0; + print_mutex = 0; + asm volatile("clrex"); + +#if (CPU_NUM_MAX > 1) + if (test_count == 0) { + __gd = (ulong)gd; + asm volatile("mov %0, sp" : "=r" (__sp)); + printf("CPU0 sp is at 0x%lx now.\n", __sp); + __sp &= ~(ulong)0xffff; + for (sat.cpu_num = 1; sat.cpu_num < CPU_NUM_MAX; sat.cpu_num++) { + __sp -= 0x10000; + flush_dcache_all(); + if (psci_cpu_on(sat.cpu_num, (ulong)secondary_init) == 0) { + mdelay(10); + printf("Calling CPU%d, sp = 0x%lx\n", sat.cpu_num, __sp); + } else { + break; + } + while (cpu_init_finish[sat.cpu_num] == 0) { + udelay(1000); + flush_dcache_all(); + } + } + } +#else + sat.cpu_num = 1; +#endif + + if (sat.total_test_size_mb == 0) + sat.page_num = get_max_page_num(sat.page_size_byte); + else + sat.page_num = (sat.total_test_size_mb << 20) / sat.page_size_byte; + sat.block_num = sat.page_size_byte / sat.block_size_byte; + + udelay(100); + + page_info = malloc(sizeof(struct page) * sat.page_num); + if (page_info == 0) { + printf("ERROR: StressAppTest fail to malloc.\n"); + printf("Please try increasing CONFIG_SYS_MALLOC_LEN in include/configs/rxxxxx_common.h.\n"); + ret = CMD_RET_FAILURE; + goto out; + } + page_list = (struct page *)page_info; + + if (get_page_addr(page_list, &sat) < 0) { + ret = CMD_RET_FAILURE; + goto out; + } + + pattern_list_init(pattern_list, &sat); + page_init(pattern_list, &sat); + +#if (CPU_NUM_MAX > 1) + if (sat.cpu_num > 1) { + pattern_page_init_finish = 1; + test_count++; + flush_dcache_all(); + } +#endif + + pre_10s = (u32)(run_time_us() / 1000000 / 10); + lock_byte_mutex(&print_mutex); + print_time_stamp(); + printf("Start StressAppTest in U-Boot:\n"); + unlock_byte_mutex(&print_mutex); + + while (run_time_us() < test_time_us) { + if (rand() % 2 == 0) + cpu_copy_err[0] += page_copy(&sat, 0); + else + cpu_inv_err[0] += page_inv(&sat, 0); + + /* Print every 10 seconds */ + now_10s = (u32)(run_time_us() / 1000000 / 10); + if (now_10s > pre_10s) { + pre_10s = now_10s; + lock_byte_mutex(&print_mutex); + print_time_stamp(); + printf("Seconds remaining: %d\n", (u32)(test_time_us / 1000000 - now_10s * 10)); + unlock_byte_mutex(&print_mutex); + } + } + +#if (CPU_NUM_MAX > 1) + for (i = 1; i < sat.cpu_num; i++) { + while (cpu_test_finish[i] == 0) { + if ((u32)(run_time_us() / 1000000 / 10) > pre_10s + 6) { + /* wait for secondary CPU in 60s */ + lock_byte_mutex(&print_mutex); + print_time_stamp(); + printf("ERROR: Cannot wait for CPU%d to finish!\n", i); + unlock_byte_mutex(&print_mutex); + cpu_no_response_err++; + break; + } + mdelay(1); + flush_dcache_all(); + } + } +#endif + + for (i = 0; i < sat.cpu_num; i++) { + all_copy_err += cpu_copy_err[i]; + all_inv_err += cpu_inv_err[i]; + } + print_time_stamp(); + printf("StressAppTest Result: "); + if (all_copy_err == 0 && all_inv_err == 0 && cpu_no_response_err == 0) + printf("Pass.\n"); + else + printf("FAIL!\nStressAppTest detects %d copy errors, %d inv errors.\n", + all_copy_err, all_inv_err); + +out: + free(page_info); + + return ret; +} + +static int do_stressapptest(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +{ + ulong test_time_sec = 20; + ulong page_size_kb = 1024; + + sat.total_test_size_mb = 0; + sat.block_size_byte = 4096; + sat.total_start_addr = 0x0; + + printf("StressAppTest in U-Boot, " __version__ "\n"); + + if (argc > 1) { + if (strict_strtoul(argv[1], 0, &test_time_sec) < 0) + return CMD_RET_USAGE; + if (test_time_sec < 1) + test_time_sec = 20; + } + if (argc > 2) { + if (strict_strtoul(argv[2], 0, &sat.total_test_size_mb) < 0) + return CMD_RET_USAGE; + if (sat.total_test_size_mb < 1) + sat.total_test_size_mb = 0; + } + if (argc > 3) { + if (strict_strtoul(argv[3], 0, &sat.total_start_addr) < 0) + return CMD_RET_USAGE; + if (sat.total_start_addr < 0x1) + sat.total_start_addr = 0x0; + } + if (argc > 4) { + if (strict_strtoul(argv[4], 0, &page_size_kb) < 0) + return CMD_RET_USAGE; + if (page_size_kb < 1) + page_size_kb = 1024; + } + + sat.page_size_byte = page_size_kb << 10; + + start_time_us = get_time_us(); + test_time_us = (u64)test_time_sec * 1000000; + + /* Change rand seed. If not do this, rand() would be same after boot.*/ + srand((unsigned int)(start_time_us & 0xffffffff)); + + return doing_stressapptest(); +} + +U_BOOT_CMD(stressapptest, 5, 1, do_stressapptest, + "StressAppTest for Rockchip\n", + "\narg1: test time in second, default value is 20s.\n" + "arg2: test size in MB, default value is all available space.\n" + "arg3: start addr for test.\n" + "arg4: test page size in kB, default value is 1024kB(1MB).\n" + "example:\n" + " stressapptest: test for 20s, test size is all available space, each page size is 1MB.\n" + " stressapptest 43200 64: test for 12h, test size is 64MB, each page size is 1MB (64 pages).\n" + " stressapptest 86400 1024 0x80000000: test for 24h, test size is 1024MB, start addr for test is 0x80000000, each page size is 1MB (1024 pages).\n" + " stressapptest 43200 16 0x40000000 512: test for 12h, test size is 16MB, start addr for test is 0x40000000, each page size is 512kB (32 pages).\n" +); diff --git a/u-boot/cmd/ddr_tool/stressapptest/stressapptest.h b/u-boot/cmd/ddr_tool/stressapptest/stressapptest.h new file mode 100644 index 0000000..e1e8fb7 --- /dev/null +++ b/u-boot/cmd/ddr_tool/stressapptest/stressapptest.h @@ -0,0 +1,70 @@ +/* Copyright 2006 Google Inc. All Rights Reserved. */ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* This is stressapptest for Rockchip platform in U-Boot, the design idea and + * the patterns are from code.google.com/p/stressapptest. + */ + +#ifndef __CMD_DDR_TOOL_STRESSAPPTEST_STRESSAPPTEST_H +#define __CMD_DDR_TOOL_STRESSAPPTEST_STRESSAPPTEST_H + +struct stressapptest_params { + ulong total_start_addr; + ulong total_test_size_mb; + /* total_test_size = page_size * page_num */ + ulong page_size_byte; + u32 page_num; + /* page_size = block_size * block_num */ + u32 block_size_byte; + u32 block_num; + + u32 weight_count; + + u8 cpu_num; +} sat; + +struct pat { + const char *name; + const unsigned int *data_array; + /* mask = size - 1, So data_array[index & mask] is always valid. */ + const unsigned int mask; + const unsigned int weight[4]; /* Weighted frequency of this pattern. */ +}; + +struct adler_sum { + u64 a1; + u64 b1; + u64 a2; + u64 b2; +}; + +struct pattern { + struct pat *pat; + bool inv; + u32 repeat; + u32 weight; + struct adler_sum adler_sum; +}; + +struct page { + void *base_addr; + struct pattern *pattern; + bool valid; /* 1: valid, 0: empty */ +} *page_list; + +extern void secondary_init(void); +extern void lock_byte_mutex(u32 *flag); +extern u32 unlock_byte_mutex(u32 *flag); + +#endif /* __CMD_DDR_TOOL_STRESSAPPTEST_STRESSAPPTEST_H */ diff --git a/u-boot/cmd/memtester/Makefile b/u-boot/cmd/memtester/Makefile deleted file mode 100644 index 6a4347a..0000000 --- a/u-boot/cmd/memtester/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -obj-$(CONFIG_CMD_MEMTESTER) += tests.o -obj-$(CONFIG_CMD_MEMTESTER) += memtester.o -obj-$(CONFIG_CMD_MEMTESTER) += io_map.o -obj-$(CONFIG_CMD_MEMTESTER) += ddr_tester_common.o diff --git a/u-boot/cmd/mmc.c b/u-boot/cmd/mmc.c index 0813330..ef6321f 100644 --- a/u-boot/cmd/mmc.c +++ b/u-boot/cmd/mmc.c @@ -129,6 +129,7 @@ static int do_mmc_test_secure_storage(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { +#ifdef CONFIG_MMC struct mmc *mmc; if (curr_device < 0) { @@ -143,7 +144,8 @@ mmc = init_mmc_device(curr_device, false); if (!mmc) - return CMD_RET_FAILURE; + printf("No mmc device\n"); +#endif int i, count = 100; diff --git a/u-boot/cmd/mtd.c b/u-boot/cmd/mtd.c index 31ef7be..1f7542e 100644 --- a/u-boot/cmd/mtd.c +++ b/u-boot/cmd/mtd.c @@ -13,6 +13,10 @@ #include <mapmem.h> #include <mtd.h> +#define DEV_NAME_MAX_LENGTH 0x40 +static char g_devname[DEV_NAME_MAX_LENGTH]; +static struct mtd_info *g_mtd; + static uint mtd_len_to_pages(struct mtd_info *mtd, u64 len) { do_div(len, mtd->writesize); @@ -244,14 +248,20 @@ return CMD_RET_USAGE; mtd_name = argv[2]; - mtd_probe_devices(); - mtd = get_mtd_device_nm(mtd_name); - if (IS_ERR_OR_NULL(mtd)) { - printf("MTD device %s not found, ret %ld\n", - mtd_name, PTR_ERR(mtd)); - return CMD_RET_FAILURE; + if (!strncmp(mtd_name, g_devname, strlen(mtd_name)) && g_mtd) { + mtd = g_mtd; + } else { + mtd_probe_devices(); + mtd = get_mtd_device_nm(mtd_name); + if (IS_ERR_OR_NULL(mtd)) { + printf("MTD device %s not found, ret %ld\n", + mtd_name, PTR_ERR(mtd)); + return CMD_RET_FAILURE; + } + put_mtd_device(mtd); + g_mtd = mtd; + strncpy(g_devname, mtd_name, strlen(mtd_name)); } - put_mtd_device(mtd); argc -= 3; argv += 3; diff --git a/u-boot/cmd/pci.c b/u-boot/cmd/pci.c index b8c799f..6eecd69 100644 --- a/u-boot/cmd/pci.c +++ b/u-boot/cmd/pci.c @@ -47,7 +47,6 @@ return pci_byte_size(size) * 2; } -#ifdef CONFIG_DM_PCI static void pci_show_regs(struct udevice *dev, struct pci_reg_info *regs) { for (; regs->name; regs++) { @@ -59,41 +58,8 @@ pci_field_width(regs->size), val); } } -#else -static unsigned long pci_read_config(pci_dev_t dev, int offset, - enum pci_size_t size) -{ - u32 val32; - u16 val16; - u8 val8; - switch (size) { - case PCI_SIZE_8: - pci_read_config_byte(dev, offset, &val8); - return val8; - case PCI_SIZE_16: - pci_read_config_word(dev, offset, &val16); - return val16; - case PCI_SIZE_32: - default: - pci_read_config_dword(dev, offset, &val32); - return val32; - } -} - -static void pci_show_regs(pci_dev_t dev, struct pci_reg_info *regs) -{ - for (; regs->name; regs++) { - printf(" %s =%*s%#.*lx\n", regs->name, - (int)(28 - strlen(regs->name)), "", - pci_field_width(regs->size), - pci_read_config(dev, regs->offset, regs->size)); - } -} -#endif - -#ifdef CONFIG_DM_PCI -int pci_bar_show(struct udevice *dev) +static int pci_bar_show(struct udevice *dev) { u8 header_type; int bar_cnt, bar_id, mem_type; @@ -105,9 +71,14 @@ int prefetchable; dm_pci_read_config8(dev, PCI_HEADER_TYPE, &header_type); + header_type &= 0x7f; if (header_type == PCI_HEADER_TYPE_CARDBUS) { printf("CardBus doesn't support BARs\n"); + return -ENOSYS; + } else if (header_type != PCI_HEADER_TYPE_NORMAL && + header_type != PCI_HEADER_TYPE_BRIDGE) { + printf("unknown header type\n"); return -ENOSYS; } @@ -149,7 +120,7 @@ if ((!is_64 && size_low) || (is_64 && size)) { size = ~size + 1; - printf(" %d %#016llx %#016llx %d %s %s\n", + printf(" %d %#018llx %#018llx %d %s %s\n", bar_id, (unsigned long long)base, (unsigned long long)size, is_64 ? 64 : 32, is_io ? "I/O" : "MEM", @@ -162,7 +133,6 @@ return 0; } -#endif static struct pci_reg_info regs_start[] = { { "vendor ID", PCI_SIZE_16, PCI_VENDOR_ID }, @@ -258,29 +228,18 @@ * * @dev: Bus+Device+Function number */ -#ifdef CONFIG_DM_PCI -void pci_header_show(struct udevice *dev) -#else -void pci_header_show(pci_dev_t dev) -#endif +static void pci_header_show(struct udevice *dev) { -#ifdef CONFIG_DM_PCI unsigned long class, header_type; dm_pci_read_config(dev, PCI_CLASS_CODE, &class, PCI_SIZE_8); dm_pci_read_config(dev, PCI_HEADER_TYPE, &header_type, PCI_SIZE_8); -#else - u8 class, header_type; - - pci_read_config_byte(dev, PCI_CLASS_CODE, &class); - pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type); -#endif pci_show_regs(dev, regs_start); printf(" class code = 0x%.2x (%s)\n", (int)class, pci_class_str(class)); pci_show_regs(dev, regs_rest); - switch (header_type & 0x03) { + switch (header_type & 0x7f) { case PCI_HEADER_TYPE_NORMAL: /* "normal" PCI device */ pci_show_regs(dev, regs_normal); break; @@ -297,17 +256,14 @@ } } -void pciinfo_header(int busnum, bool short_listing) +static void pciinfo_header(bool short_listing) { - printf("Scanning PCI devices on bus %d\n", busnum); - if (short_listing) { printf("BusDevFun VendorId DeviceId Device Class Sub-Class\n"); printf("_____________________________________________________________\n"); } } -#ifdef CONFIG_DM_PCI /** * pci_header_show_brief() - Show the short-form PCI device header * @@ -330,11 +286,15 @@ pci_class_str(class), subclass); } -static void pciinfo(struct udevice *bus, bool short_listing) +static void pciinfo(struct udevice *bus, bool short_listing, bool multi) { struct udevice *dev; - pciinfo_header(bus->seq, short_listing); + if (!multi) + printf("Scanning PCI devices on bus %d\n", bus->seq); + + if (!multi || bus->seq == 0) + pciinfo_header(short_listing); for (device_find_first_child(bus, &dev); dev; @@ -353,102 +313,6 @@ } } } - -#else - -/** - * pci_header_show_brief() - Show the short-form PCI device header - * - * Reads and prints the header of the specified PCI device in short form. - * - * @dev: Bus+Device+Function number - */ -void pci_header_show_brief(pci_dev_t dev) -{ - u16 vendor, device; - u8 class, subclass; - - pci_read_config_word(dev, PCI_VENDOR_ID, &vendor); - pci_read_config_word(dev, PCI_DEVICE_ID, &device); - pci_read_config_byte(dev, PCI_CLASS_CODE, &class); - pci_read_config_byte(dev, PCI_CLASS_SUB_CODE, &subclass); - - printf("0x%.4x 0x%.4x %-23s 0x%.2x\n", - vendor, device, - pci_class_str(class), subclass); -} - -/** - * pciinfo() - Show a list of devices on the PCI bus - * - * Show information about devices on PCI bus. Depending on @short_pci_listing - * the output will be more or less exhaustive. - * - * @bus_num: The number of the bus to be scanned - * @short_pci_listing: true to use short form, showing only a brief header - * for each device - */ -void pciinfo(int bus_num, int short_pci_listing) -{ - struct pci_controller *hose = pci_bus_to_hose(bus_num); - int device; - int function; - unsigned char header_type; - unsigned short vendor_id; - pci_dev_t dev; - int ret; - - if (!hose) - return; - - pciinfo_header(bus_num, short_pci_listing); - - for (device = 0; device < PCI_MAX_PCI_DEVICES; device++) { - header_type = 0; - vendor_id = 0; - for (function = 0; function < PCI_MAX_PCI_FUNCTIONS; - function++) { - /* - * If this is not a multi-function device, we skip - * the rest. - */ - if (function && !(header_type & 0x80)) - break; - - dev = PCI_BDF(bus_num, device, function); - - if (pci_skip_dev(hose, dev)) - continue; - - ret = pci_read_config_word(dev, PCI_VENDOR_ID, - &vendor_id); - if (ret) - goto error; - if ((vendor_id == 0xFFFF) || (vendor_id == 0x0000)) - continue; - - if (!function) { - pci_read_config_byte(dev, PCI_HEADER_TYPE, - &header_type); - } - - if (short_pci_listing) { - printf("%02x.%02x.%02x ", bus_num, device, - function); - pci_header_show_brief(dev); - } else { - printf("\nFound PCI device %02x.%02x.%02x:\n", - bus_num, device, function); - pci_header_show(dev); - } - } - } - - return; -error: - printf("Cannot read bus configuration: %d\n", ret); -} -#endif /** * get_pci_dev() - Convert the "bus.device.function" identifier into a number @@ -481,13 +345,8 @@ return PCI_BDF(bdfs[0], bdfs[1], bdfs[2]); } -#ifdef CONFIG_DM_PCI static int pci_cfg_display(struct udevice *dev, ulong addr, enum pci_size_t size, ulong length) -#else -static int pci_cfg_display(pci_dev_t bdf, ulong addr, enum pci_size_t size, - ulong length) -#endif { #define DISP_LINE_LEN 16 ulong i, nbytes, linebytes; @@ -508,11 +367,7 @@ for (i = 0; i < linebytes; i += byte_size) { unsigned long val; -#ifdef CONFIG_DM_PCI dm_pci_read_config(dev, addr, &val, size); -#else - val = pci_read_config(bdf, addr, size); -#endif printf(" %0*lx", pci_field_width(size), val); addr += byte_size; } @@ -527,31 +382,8 @@ return (rc); } -#ifndef CONFIG_DM_PCI -static int pci_cfg_write (pci_dev_t bdf, ulong addr, ulong size, ulong value) -{ - if (size == 4) { - pci_write_config_dword(bdf, addr, value); - } - else if (size == 2) { - ushort val = value & 0xffff; - pci_write_config_word(bdf, addr, val); - } - else { - u_char val = value & 0xff; - pci_write_config_byte(bdf, addr, val); - } - return 0; -} -#endif - -#ifdef CONFIG_DM_PCI static int pci_cfg_modify(struct udevice *dev, ulong addr, ulong size, ulong value, int incrflag) -#else -static int pci_cfg_modify(pci_dev_t bdf, ulong addr, ulong size, ulong value, - int incrflag) -#endif { ulong i; int nbytes; @@ -562,11 +394,7 @@ */ do { printf("%08lx:", addr); -#ifdef CONFIG_DM_PCI dm_pci_read_config(dev, addr, &val, size); -#else - val = pci_read_config(bdf, addr, size); -#endif printf(" %0*lx", pci_field_width(size), val); nbytes = cli_readline(" ? "); @@ -593,11 +421,7 @@ /* good enough to not time out */ bootretry_reset_cmd_timeout(); -#ifdef CONFIG_DM_PCI dm_pci_write_config(dev, addr, i, size); -#else - pci_cfg_write(bdf, addr, size, i); -#endif if (incrflag) addr += size; } @@ -607,7 +431,6 @@ return 0; } -#ifdef CONFIG_DM_PCI static const struct pci_flag_info { uint flag; const char *name; @@ -621,7 +444,7 @@ static void pci_show_regions(struct udevice *bus) { - struct pci_controller *hose = dev_get_uclass_priv(bus); + struct pci_controller *hose = dev_get_uclass_priv(pci_get_controller(bus)); const struct pci_region *reg; int i, j; @@ -630,10 +453,11 @@ return; } - printf("# %-16s %-16s %-16s %s\n", "Bus start", "Phys start", "Size", + printf("Buses %02x-%02x\n", hose->first_busno, hose->last_busno); + printf("# %-18s %-18s %-18s %s\n", "Bus start", "Phys start", "Size", "Flags"); for (i = 0, reg = hose->regions; i < hose->region_count; i++, reg++) { - printf("%d %#016llx %#016llx %#016llx ", i, + printf("%d %#018llx %#018llx %#018llx ", i, (unsigned long long)reg->bus_start, (unsigned long long)reg->phys_start, (unsigned long long)reg->size); @@ -646,7 +470,6 @@ printf("\n"); } } -#endif /* PCI Configuration Space access commands * @@ -660,15 +483,12 @@ { ulong addr = 0, value = 0, cmd_size = 0; enum pci_size_t size = PCI_SIZE_32; -#ifdef CONFIG_DM_PCI struct udevice *dev, *bus; -#else - pci_dev_t dev; -#endif - int busnum = 0; + int busnum = -1; pci_dev_t bdf = 0; char cmd = 's'; int ret = 0; + char *endp; if (argc > 1) cmd = argv[1][0]; @@ -686,19 +506,15 @@ if (argc > 4) value = simple_strtoul(argv[4], NULL, 16); case 'h': /* header */ -#ifdef CONFIG_DM_PCI case 'b': /* bars */ -#endif if (argc < 3) goto usage; if ((bdf = get_pci_dev(argv[2])) == -1) return 1; break; -#if defined(CONFIG_DM_PCI) case 'e': pci_init(); return 0; -#endif case 'r': /* no break */ default: /* scan bus */ value = 1; /* short listing */ @@ -707,10 +523,37 @@ value = 0; argc--; } - if (argc > 1) - busnum = simple_strtoul(argv[1], NULL, 16); + if (argc > 2 || (argc > 1 && cmd != 'r' && argv[1][0] != 's')) { + if (argv[argc - 1][0] != '*') { + busnum = simple_strtoul(argv[argc - 1], &endp, 16); + if (*endp) + goto usage; + } + argc--; + } + if (cmd == 'r' && argc > 2) + goto usage; + else if (cmd != 'r' && (argc > 2 || (argc == 2 && argv[1][0] != 's'))) + goto usage; } -#ifdef CONFIG_DM_PCI + if (busnum == -1) { + if (cmd != 'r') { + for (busnum = 0; + uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus) == 0; + busnum++) + pciinfo(bus, value, true); + } else { + for (busnum = 0; + uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus) == 0; + busnum++) { + /* Regions are controller specific so skip non-root buses */ + if (device_is_on_pci_bus(bus)) + continue; + pci_show_regions(bus); + } + } + return 0; + } ret = uclass_get_device_by_seq(UCLASS_PCI, busnum, &bus); if (ret) { printf("No such bus\n"); @@ -719,22 +562,15 @@ if (cmd == 'r') pci_show_regions(bus); else - pciinfo(bus, value); -#else - pciinfo(busnum, value); -#endif + pciinfo(bus, value, false); return 0; } -#ifdef CONFIG_DM_PCI ret = dm_pci_bus_find_bdf(bdf, &dev); if (ret) { printf("No such device\n"); return CMD_RET_FAILURE; } -#else - dev = bdf; -#endif switch (argv[1][0]) { case 'h': /* header */ @@ -755,17 +591,10 @@ case 'w': /* write */ if (argc < 5) goto usage; -#ifdef CONFIG_DM_PCI ret = dm_pci_write_config(dev, addr, value, size); -#else - ret = pci_cfg_write(dev, addr, size, value); -#endif break; -#ifdef CONFIG_DM_PCI - case 'b': /* bars */ return pci_bar_show(dev); -#endif default: ret = CMD_RET_USAGE; break; @@ -780,20 +609,16 @@ #ifdef CONFIG_SYS_LONGHELP static char pci_help_text[] = - "[bus] [long]\n" + "[bus|*] [long]\n" " - short or long list of PCI devices on bus 'bus'\n" -#if defined(CONFIG_DM_PCI) "pci enum\n" " - Enumerate PCI buses\n" -#endif "pci header b.d.f\n" " - show header of PCI device 'bus.device.function'\n" -#ifdef CONFIG_DM_PCI "pci bar b.d.f\n" " - show BARs base and size for device b.d.f'\n" - "pci regions\n" + "pci regions [bus|*]\n" " - show PCI regions\n" -#endif "pci display[.b, .w, .l] b.d.f [address] [# of objects]\n" " - display PCI configuration space (CFG)\n" "pci next[.b, .w, .l] b.d.f address\n" diff --git a/u-boot/cmd/script_update.c b/u-boot/cmd/script_update.c index 2d6e423..d4a7da7 100644 --- a/u-boot/cmd/script_update.c +++ b/u-boot/cmd/script_update.c @@ -6,6 +6,7 @@ #include <common.h> #include <malloc.h> +#include <dm/device.h> /* * Script file example: @@ -144,6 +145,8 @@ int argc, char * const argv[]) { struct blk_desc *desc; + struct udevice *dev; + int devnum = -1; int part_type; char cmd[128]; char *buf; @@ -151,9 +154,31 @@ printf("## retrieving usb_update.txt ...\n"); - desc = blk_get_devnum_by_type(IF_TYPE_USB, 0); - if (!desc) + if (run_command("usb reset", 0)) return CMD_RET_FAILURE; + + for (blk_first_device(IF_TYPE_USB, &dev); + dev; + blk_next_device(&dev)) { + desc = dev_get_uclass_platdata(dev); + if (desc->type == DEV_TYPE_UNKNOWN) + continue; + + if (desc->lba > 0L && desc->blksz > 0L) { + devnum = desc->devnum; + break; + } + } + if (devnum < 0) { + printf("No available udisk\n"); + return CMD_RET_FAILURE; + } + + desc = blk_get_devnum_by_type(IF_TYPE_USB, devnum); + if (!desc) { + printf("No usb %d found\n", devnum); + return CMD_RET_FAILURE; + } buf = memalign(ARCH_DMA_MINALIGN, SCRIPT_FILE_MAX_SIZE * 2); if (!buf) @@ -162,18 +187,15 @@ part_type = desc->part_type; desc->part_type = PART_TYPE_DOS; - snprintf(cmd, sizeof(cmd), "usb reset"); + printf("## scanning usb %d\n", devnum); + snprintf(cmd, sizeof(cmd), "fatload usb %d 0x%08lx usb_update.txt", + devnum, (ulong)buf); ret = run_command(cmd, 0); - if (!ret) { - snprintf(cmd, sizeof(cmd), "fatload usb 0 0x%08lx usb_update.txt", (ulong)buf); - ret = run_command(cmd, 0); - } if (!ret) { snprintf(cmd, sizeof(cmd), "script 0x%08lx", (ulong)buf); ret = run_command(cmd, 0); } free(buf); - desc->part_type = part_type; return ret; diff --git a/u-boot/cmd/ufs.c b/u-boot/cmd/ufs.c new file mode 100644 index 0000000..5b25788 --- /dev/null +++ b/u-boot/cmd/ufs.c @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0+ +/** + * ufs.c - UFS specific U-boot commands + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com + * + */ +#include <common.h> +#include <command.h> +#include <ufs.h> + +static int do_ufs(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + int dev, ret; + + if (argc >= 2) { + if (!strcmp(argv[1], "init")) { + if (argc == 3) { + dev = simple_strtoul(argv[2], NULL, 10); + ret = ufs_probe_dev(dev); + if (ret) + return CMD_RET_FAILURE; + } else { + ufs_probe(); + } + + return CMD_RET_SUCCESS; + } + } + + return CMD_RET_USAGE; +} + +U_BOOT_CMD(ufs, 3, 1, do_ufs, + "UFS sub system", + "init [dev] - init UFS subsystem\n" +); diff --git a/u-boot/common/Kconfig b/u-boot/common/Kconfig index 2de87b3..cc0753c 100644 --- a/u-boot/common/Kconfig +++ b/u-boot/common/Kconfig @@ -682,5 +682,17 @@ endmenu +menu "MT support" + +config MP_BOOT + bool "Support MT boot" + default n + +config MP_BOOT_BOOTM + bool "MT simple bootm image" + depends on MP_BOOT + +endmenu + source "common/spl/Kconfig" source "common/usbplug/Kconfig" diff --git a/u-boot/common/Makefile b/u-boot/common/Makefile index 1901154..e6f1c11 100644 --- a/u-boot/common/Makefile +++ b/u-boot/common/Makefile @@ -49,7 +49,6 @@ obj-$(CONFIG_CONSOLE_MUX) += iomux.o obj-$(CONFIG_MTD_NOR_FLASH) += flash.o obj-$(CONFIG_CMD_KGDB) += kgdb.o kgdb_stubs.o -obj-$(CONFIG_I2C_EDID) += edid.o obj-$(CONFIG_KALLSYMS) += kallsyms.o obj-y += splash.o obj-$(CONFIG_SPLASH_SOURCE) += splash_source.o @@ -67,6 +66,7 @@ endif # !CONFIG_SPL_BUILD +obj-$(CONFIG_$(SPL_TPL_)I2C_EDID) += edid.o obj-$(CONFIG_$(SPL_TPL_)BOOTSTAGE) += bootstage.o ifdef CONFIG_SPL_BUILD @@ -166,3 +166,11 @@ obj-$(CONFIG_ANDROID_KEYMASTER_CA) += keymaster.o obj-$(CONFIG_ANDROID_KEYMASTER_CA) += attestation_key.o endif + +ifdef CONFIG_MP_BOOT +ifndef CONFIG_SPL_BUILD +obj-$(CONFIG_ROCKCHIP_RK3528) += mp_boot_rk3528.o +else +obj-$(CONFIG_ROCKCHIP_RK3528) += spl_mp_boot_rk3528.o +endif +endif diff --git a/u-boot/common/android_ab.c b/u-boot/common/android_ab.c index 2182d3d..5655274 100644 --- a/u-boot/common/android_ab.c +++ b/u-boot/common/android_ab.c @@ -406,7 +406,7 @@ return 0; } -void ab_update_root_uuid(void) +static void ab_update_root_uuid(void) { /* * In android a/b & avb process, the system.img is mandory and the @@ -441,6 +441,60 @@ } } +void ab_update_root_partition(void) +{ + char *boot_args = env_get("bootargs"); + char root_part_dev[64] = {0}; + disk_partition_t part_info; + struct blk_desc *dev_desc; + const char *part_type; + int part_num; + + dev_desc = rockchip_get_bootdev(); + if (!dev_desc) + return; + + if (ab_is_support_dynamic_partition(dev_desc)) + return; + + /* Get 'system' partition device number. */ + part_num = part_get_info_by_name(dev_desc, ANDROID_PARTITION_SYSTEM, &part_info); + if (part_num < 0) { + printf("%s: Failed to get partition '%s'.\n", __func__, ANDROID_PARTITION_SYSTEM); + return; + } + + /* Get partition type. */ + part_type = part_get_type(dev_desc); + if (!part_type) + return; + + /* Judge the partition device type. */ + switch (dev_desc->if_type) { + case IF_TYPE_MMC: + if (strstr(part_type, "ENV")) + snprintf(root_part_dev, 64, "root=/dev/mmcblk0p%d", part_num); + else if (strstr(part_type, "EFI")) + ab_update_root_uuid(); + break; + case IF_TYPE_MTD: + if (dev_desc->devnum == BLK_MTD_NAND || dev_desc->devnum == BLK_MTD_SPI_NAND) { + if (strstr(boot_args, "rootfstype=squashfs") || strstr(boot_args, "rootfstype=erofs")) + snprintf(root_part_dev, 64, "ubi.mtd=%d root=/dev/ubiblock0_0", part_num - 1); + else if (strstr(boot_args, "rootfstype=ubifs")) + snprintf(root_part_dev, 64, "ubi.mtd=%d root=ubi0:system", part_num - 1); + } else if (dev_desc->devnum == BLK_MTD_SPI_NOR) { + snprintf(root_part_dev, 64, "root=/dev/mtdblock%d", part_num - 1); + } + break; + default: + printf("%s: Not found part type, failed to set root part device.\n", __func__); + return; + } + + env_update("bootargs", root_part_dev); +} + int ab_get_slot_suffix(char *slot_suffix) { /* TODO: get from pre-loader or misc partition */ diff --git a/u-boot/common/android_bootloader.c b/u-boot/common/android_bootloader.c index 772e6bf..ab080b8 100644 --- a/u-boot/common/android_bootloader.c +++ b/u-boot/common/android_bootloader.c @@ -18,6 +18,7 @@ #include <dt_table.h> #include <image-android-dt.h> #include <malloc.h> +#include <mp_boot.h> #include <fdt_support.h> #include <fs.h> #include <boot_rkimg.h> @@ -462,15 +463,305 @@ slot->successful_boot = 0; } +static char *join_str(const char *a, const char *b) +{ + size_t len = strlen(a) + strlen(b) + 1 /* null term */; + char *ret = (char *)malloc(len); + + if (!ret) { + debug("failed to alloc %zu\n", len); + return NULL; + } + strcpy(ret, a); + strcat(ret, b); + + return ret; +} + +static size_t get_partition_size(AvbOps *ops, char *name, + const char *slot_suffix) +{ + char *partition_name = join_str(name, slot_suffix); + uint64_t size = 0; + AvbIOResult res; + + if (partition_name == NULL) + goto bail; + + res = ops->get_size_of_partition(ops, partition_name, &size); + if (res != AVB_IO_RESULT_OK && res != AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION) + size = 0; +bail: + if (partition_name) + free(partition_name); + + return size; +} + +static struct AvbOpsData preload_user_data; + +static int avb_image_distribute_prepare(AvbSlotVerifyData *slot_data, + AvbOps *ops, char *slot_suffix) +{ + struct AvbOpsData *data = (struct AvbOpsData *)(ops->user_data); + size_t vendor_boot_size; + size_t init_boot_size; + size_t resource_size; + size_t boot_size; + void *image_buf; + + boot_size = max(get_partition_size(ops, ANDROID_PARTITION_BOOT, slot_suffix), + get_partition_size(ops, ANDROID_PARTITION_RECOVERY, slot_suffix)); + init_boot_size = get_partition_size(ops, + ANDROID_PARTITION_INIT_BOOT, slot_suffix); + vendor_boot_size = get_partition_size(ops, + ANDROID_PARTITION_VENDOR_BOOT, slot_suffix); + resource_size = get_partition_size(ops, + ANDROID_PARTITION_RESOURCE, slot_suffix); + image_buf = sysmem_alloc(MEM_AVB_ANDROID, + boot_size + init_boot_size + + vendor_boot_size + resource_size); + if (!image_buf) { + printf("avb: sysmem alloc failed\n"); + return -ENOMEM; + } + + /* layout: | boot/recovery | vendor_boot | init_boot | resource | */ + data->slot_suffix = slot_suffix; + data->boot.addr = image_buf; + data->boot.size = 0; + data->vendor_boot.addr = data->boot.addr + boot_size; + data->vendor_boot.size = 0; + data->init_boot.addr = data->vendor_boot.addr + vendor_boot_size; + data->init_boot.size = 0; + data->resource.addr = data->init_boot.addr + init_boot_size; + data->resource.size = 0; + + return 0; +} + +static int avb_image_distribute_finish(AvbSlotVerifyData *slot_data, + AvbSlotVerifyFlags flags, + ulong *load_address) +{ + struct andr_img_hdr *hdr; + ulong load_addr = *load_address; + void *vendor_boot_hdr = NULL; + void *init_boot_hdr = NULL; + void *boot_hdr = NULL; + char *part_name; + int i, ret; + + for (i = 0; i < slot_data->num_loaded_partitions; i++) { + part_name = slot_data->loaded_partitions[i].partition_name; + if (!strncmp(ANDROID_PARTITION_BOOT, part_name, 4) || + !strncmp(ANDROID_PARTITION_RECOVERY, part_name, 8)) { + boot_hdr = slot_data->loaded_partitions[i].data; + } else if (!strncmp(ANDROID_PARTITION_INIT_BOOT, part_name, 9)) { + init_boot_hdr = slot_data->loaded_partitions[i].data; + } else if (!strncmp(ANDROID_PARTITION_VENDOR_BOOT, part_name, 11)) { + vendor_boot_hdr = slot_data->loaded_partitions[i].data; + } + } + + /* + * populate boot_img_hdr_v34 + * + * If allow verification error: the images are loaded by + * ops->get_preloaded_partition() which auto populates + * boot_img_hdr_v34. + * + * If not allow verification error: the images are full loaded + * by ops->read_from_partition() which doesn't populate + * boot_img_hdr_v34, we need to fix it here for bootm and + */ + + hdr = boot_hdr; + if (hdr->header_version >= 3 && + !(flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR)) { + hdr = malloc(sizeof(struct andr_img_hdr)); + if (!hdr) + return -ENOMEM; + + ret = populate_boot_info(boot_hdr, vendor_boot_hdr, + init_boot_hdr, hdr, true); + if (ret < 0) { + printf("avb: populate boot info failed, ret=%d\n", ret); + return ret; + } + memcpy(boot_hdr, hdr, sizeof(*hdr)); + } + + /* distribute ! */ + load_addr -= hdr->page_size; + if (android_image_memcpy_separate(boot_hdr, &load_addr)) { + printf("Failed to separate copy android image\n"); + return AVB_SLOT_VERIFY_RESULT_ERROR_IO; + } + + *load_address = load_addr; + + return 0; +} + +int android_image_verify_resource(const char *boot_part, ulong *resc_buf) +{ + const char *requested_partitions[] = { + NULL, + NULL, + }; + struct AvbOpsData *data; + uint8_t unlocked = true; + AvbOps *ops; + AvbSlotVerifyFlags flags; + AvbSlotVerifyData *slot_data = {NULL}; + AvbSlotVerifyResult verify_result; + char slot_suffix[3] = {0}; + char *part_name; + void *image_buf = NULL; + int retry_no_vbmeta_partition = 1; + int i, ret; + + ops = avb_ops_user_new(); + if (ops == NULL) { + printf("avb_ops_user_new() failed!\n"); + return -AVB_SLOT_VERIFY_RESULT_ERROR_OOM; + } + + if (ops->read_is_device_unlocked(ops, (bool *)&unlocked) != AVB_IO_RESULT_OK) + printf("Error determining whether device is unlocked.\n"); + + printf("Device is: %s\n", (unlocked & LOCK_MASK)? "UNLOCKED" : "LOCKED"); + + if (unlocked & LOCK_MASK) { + *resc_buf = 0; + return 0; + } + + flags = AVB_SLOT_VERIFY_FLAGS_NONE; + if (strcmp(boot_part, ANDROID_PARTITION_RECOVERY) == 0) + flags |= AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION; + +#ifdef CONFIG_ANDROID_AB + part_name = strdup(boot_part); + *(part_name + strlen(boot_part) - 2) = '\0'; + requested_partitions[0] = part_name; + + ret = rk_avb_get_current_slot(slot_suffix); + if (ret) { + printf("Failed to get slot suffix, ret=%d\n", ret); + return ret; + } +#else + requested_partitions[0] = boot_part; +#endif + data = (struct AvbOpsData *)(ops->user_data); + ret = avb_image_distribute_prepare(slot_data, ops, slot_suffix); + if (ret) { + printf("avb image distribute prepare failed %d\n", ret); + return ret; + } + +retry_verify: + verify_result = + avb_slot_verify(ops, + requested_partitions, + slot_suffix, + flags, + AVB_HASHTREE_ERROR_MODE_RESTART, + &slot_data); + if (verify_result != AVB_SLOT_VERIFY_RESULT_OK && + verify_result != AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED) { + if (retry_no_vbmeta_partition && strcmp(boot_part, ANDROID_PARTITION_RECOVERY) == 0) { + printf("Verify recovery with vbmeta.\n"); + flags &= ~AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION; + retry_no_vbmeta_partition = 0; + goto retry_verify; + } + } + + if (verify_result != AVB_SLOT_VERIFY_RESULT_OK || !slot_data) { + sysmem_free((ulong)data->boot.addr); + return verify_result; + } + + for (i = 0; i < slot_data->num_loaded_partitions; i++) { + part_name = slot_data->loaded_partitions[i].partition_name; + if (!strncmp(ANDROID_PARTITION_RESOURCE, part_name, 8)) { + image_buf = slot_data->loaded_partitions[i].data; + break; + } else if (!strncmp(ANDROID_PARTITION_BOOT, part_name, 4) || + !strncmp(ANDROID_PARTITION_RECOVERY, part_name, 8)) { + struct andr_img_hdr *hdr; + + hdr = (void *)slot_data->loaded_partitions[i].data; + if (android_image_check_header(hdr)) + continue; + + if (hdr->header_version <= 2) { + image_buf = (void *)hdr + hdr->page_size + + ALIGN(hdr->kernel_size, hdr->page_size) + + ALIGN(hdr->ramdisk_size, hdr->page_size); + break; + } + } + } + + if (image_buf) { + memcpy((char *)&preload_user_data, (char *)data, sizeof(*data)); + *resc_buf = (ulong)image_buf; + } + + return 0; +} + +/* + * AVB Policy. + * + * == avb with unlock: + * Don't process hash verify. + * Go pre-loaded path: Loading vendor_boot and init_boot + * directly to where they should be, while loading the + * boot/recovery. The boot message tells like: + * ··· + * preloaded: distribute image from 'boot_a' + * preloaded: distribute image from 'init_boot_a' + * preloaded: distribute image from 'vendor_boot_a' + * ··· + * + * == avb with lock: + * Process hash verify. + * Go pre-loaded path: Loading full vendor_boot, init_boot and + * boot/recovery one by one to verify, and distributing them to + * where they should be by memcpy at last. + * + * The three images share a large memory buffer that allocated + * by sysmem_alloc(), it locate at high memory address that + * just lower than SP bottom. The boot message tells like: + * ··· + * preloaded: full image from 'boot_a' at 0xe47f90c0 - 0xe7a4b0c0 + * preloaded: full image from 'init_boot_a' at 0xeaff90c0 - 0xeb2950c0 + * preloaded: full image from 'vendor_boot_a' at 0xe87f90c0 - 0xe9f6e0c0 + * ··· + */ static AvbSlotVerifyResult android_slot_verify(char *boot_partname, unsigned long *android_load_address, char *slot_suffix) { - const char *requested_partitions[1] = {NULL}; + const char *requested_partitions[] = { + boot_partname, + NULL, + NULL, + NULL, + }; + struct AvbOpsData *data; + struct blk_desc *dev_desc; + struct andr_img_hdr *hdr; + disk_partition_t part_info; uint8_t unlocked = true; AvbOps *ops; AvbSlotVerifyFlags flags; - AvbSlotVerifyData *slot_data[1] = {NULL}; + AvbSlotVerifyData *slot_data = {NULL}; AvbSlotVerifyResult verify_result; AvbABData ab_data, ab_data_orig; size_t slot_index_to_boot = 0; @@ -478,9 +769,29 @@ char can_boot = 1; char retry_no_vbmeta_partition = 1; unsigned long load_address = *android_load_address; - struct andr_img_hdr *hdr; + int ret; - requested_partitions[0] = boot_partname; + dev_desc = rockchip_get_bootdev(); + if (!dev_desc) + return AVB_IO_RESULT_ERROR_IO; + + if (part_get_info_by_name(dev_desc, boot_partname, &part_info) < 0) { + printf("Could not find \"%s\" partition\n", boot_partname); + return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; + } + + hdr = populate_andr_img_hdr(dev_desc, &part_info); + if (!hdr) { + printf("No valid android hdr\n"); + return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE; + } + + if (hdr->header_version >= 4) { + requested_partitions[1] = ANDROID_PARTITION_VENDOR_BOOT; + if (((hdr->os_version >> 25) & 0x7f) >= 13) + requested_partitions[2] = ANDROID_PARTITION_INIT_BOOT; + } + ops = avb_ops_user_new(); if (ops == NULL) { printf("avb_ops_user_new() failed!\n"); @@ -497,7 +808,7 @@ if (unlocked & LOCK_MASK) flags |= AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR; - if(load_metadata(ops->ab_ops, &ab_data, &ab_data_orig)) { + if (load_metadata(ops->ab_ops, &ab_data, &ab_data_orig)) { printf("Can not load metadata\n"); return AVB_SLOT_VERIFY_RESULT_ERROR_IO; } @@ -509,8 +820,30 @@ else slot_index_to_boot = 0; - if (strcmp(boot_partname, "recovery") == 0) + if (strcmp(boot_partname, ANDROID_PARTITION_RECOVERY) == 0) flags |= AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION; + +#ifdef CONFIG_MP_BOOT + preload_user_data.boot.addr = (void *)mpb_post(1); + preload_user_data.boot.size = (size_t)mpb_post(2); +#endif + + /* use preload one if available */ + if (preload_user_data.boot.addr) { + data = (struct AvbOpsData *)(ops->user_data); + + data->slot_suffix = slot_suffix; + data->boot = preload_user_data.boot; + data->vendor_boot = preload_user_data.vendor_boot; + data->init_boot = preload_user_data.init_boot; + data->resource = preload_user_data.resource; + } else { + ret = avb_image_distribute_prepare(slot_data, ops, slot_suffix); + if (ret < 0) { + printf("avb image distribute prepare failed %d\n", ret); + return AVB_SLOT_VERIFY_RESULT_ERROR_OOM; + } + } retry_verify: verify_result = @@ -519,10 +852,10 @@ slot_suffix, flags, AVB_HASHTREE_ERROR_MODE_RESTART, - &slot_data[0]); + &slot_data); if (verify_result != AVB_SLOT_VERIFY_RESULT_OK && verify_result != AVB_SLOT_VERIFY_RESULT_ERROR_PUBLIC_KEY_REJECTED) { - if (retry_no_vbmeta_partition && strcmp(boot_partname, "recovery") == 0) { + if (retry_no_vbmeta_partition && strcmp(boot_partname, ANDROID_PARTITION_RECOVERY) == 0) { printf("Verify recovery with vbmeta.\n"); flags &= ~AVB_SLOT_VERIFY_FLAGS_NO_VBMETA_PARTITION; retry_no_vbmeta_partition = 0; @@ -558,7 +891,7 @@ break; } - if (!slot_data[0]) { + if (!slot_data) { can_boot = 0; goto out; } @@ -569,12 +902,12 @@ int len = 0; char *bootargs, *newbootargs; #ifdef CONFIG_ANDROID_AVB_ROLLBACK_INDEX - if (rk_avb_update_stored_rollback_indexes_for_slot(ops, slot_data[0])) + if (rk_avb_update_stored_rollback_indexes_for_slot(ops, slot_data)) printf("Fail to update the rollback indexes.\n"); #endif - if (*slot_data[0]->cmdline) { - debug("Kernel command line: %s\n", slot_data[0]->cmdline); - len += strlen(slot_data[0]->cmdline); + if (slot_data->cmdline) { + debug("Kernel command line: %s\n", slot_data->cmdline); + len += strlen(slot_data->cmdline); } bootargs = env_get("bootargs"); @@ -593,49 +926,15 @@ strcpy(newbootargs, bootargs); strcat(newbootargs, " "); } - if (*slot_data[0]->cmdline) - strcat(newbootargs, slot_data[0]->cmdline); + if (slot_data->cmdline) + strcat(newbootargs, slot_data->cmdline); env_set("bootargs", newbootargs); - hdr = (void *)slot_data[0]->loaded_partitions->data; - - /* - * populate boot_img_hdr_v34 - * - * If allow verification error: the image is loaded by - * ops->get_preloaded_partition() which auto populates - * boot_img_hdr_v34. - * - * If not allow verification error: the image is full loaded - * by ops->read_from_partition() which doesn't populate - * boot_img_hdr_v34, we need to fix it here. - */ - if (hdr->header_version >= 3 && - !(flags & AVB_SLOT_VERIFY_FLAGS_ALLOW_VERIFICATION_ERROR)) { - struct andr_img_hdr *v3hdr; - struct blk_desc *dev_desc; - disk_partition_t part; - - dev_desc = rockchip_get_bootdev(); - if (!dev_desc) - return -1; - - if (part_get_info_by_name(dev_desc, - boot_partname, &part) < 0) - return -1; - - v3hdr = populate_andr_img_hdr(dev_desc, &part); - if (v3hdr) { - memcpy(hdr, v3hdr, sizeof(*v3hdr)); - free(v3hdr); - } - } - - /* Reserve page_size */ - load_address -= hdr->page_size; - if (android_image_memcpy_separate(hdr, &load_address)) { - printf("Failed to separate copy android image\n"); - return AVB_SLOT_VERIFY_RESULT_ERROR_IO; + /* if need, distribute full image to where they should be */ + ret = avb_image_distribute_finish(slot_data, flags, &load_address); + if (ret) { + printf("avb image distribute finish failed %d\n", ret); + return ret; } *android_load_address = load_address; } else { @@ -649,8 +948,8 @@ verify_result = AVB_SLOT_VERIFY_RESULT_ERROR_IO; } - if (slot_data[0] != NULL) - avb_slot_verify_data_free(slot_data[0]); + if (slot_data != NULL) + avb_slot_verify_data_free(slot_data); if ((unlocked & LOCK_MASK) && can_boot) return 0; @@ -1047,10 +1346,6 @@ printf("Android image load failed\n"); return -1; } -#endif - -#ifdef CONFIG_ANDROID_AB - ab_update_root_uuid(); #endif /* Set Android root variables. */ diff --git a/u-boot/common/board_f.c b/u-boot/common/board_f.c index 190e5a4..dd76efc 100644 --- a/u-boot/common/board_f.c +++ b/u-boot/common/board_f.c @@ -21,6 +21,7 @@ #include <init_helpers.h> #include <malloc.h> #include <mapmem.h> +#include <mp_boot.h> #include <os.h> #include <post.h> #include <relocate.h> @@ -254,6 +255,9 @@ /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; #endif +#ifdef CONFIG_MP_BOOT + mpb_init_x(3); +#endif return 0; } diff --git a/u-boot/common/board_info.c b/u-boot/common/board_info.c index b48fd1e..1d0155e 100644 --- a/u-boot/common/board_info.c +++ b/u-boot/common/board_info.c @@ -26,6 +26,7 @@ if (model) printf("Model: %s\n", model); #endif + printf("MPIDR: 0x%lx\n", (ulong)read_mpidr()); #ifdef CONFIG_ARM64_BOOT_AARCH32 if (!(gd->flags & GD_FLG_RELOC)) diff --git a/u-boot/common/board_r.c b/u-boot/common/board_r.c index 74fee37..c3d7d9c 100644 --- a/u-boot/common/board_r.c +++ b/u-boot/common/board_r.c @@ -481,21 +481,6 @@ } #endif -#ifdef CONFIG_MTD_BLK -static int initr_mtd_blk(void) -{ -#ifndef CONFIG_USING_KERNEL_DTB - struct blk_desc *dev_desc; - - puts("mtd_blk: "); - dev_desc = rockchip_get_bootdev(); - if (dev_desc) - mtd_blk_map_partitions(dev_desc); -#endif - return 0; -} -#endif - #if !defined(CONFIG_USING_KERNEL_DTB) || !defined(CONFIG_ENV_IS_NOWHERE) /* * Tell if it's OK to load the environment early in boot. @@ -966,9 +951,6 @@ #endif #ifdef CONFIG_CMD_ONENAND initr_onenand, -#endif -#ifdef CONFIG_MTD_BLK - initr_mtd_blk, #endif #ifdef CONFIG_MMC initr_mmc, diff --git a/u-boot/common/bootm.c b/u-boot/common/bootm.c index fcb561d..1bc426b 100644 --- a/u-boot/common/bootm.c +++ b/u-boot/common/bootm.c @@ -31,7 +31,7 @@ #include <image.h> #ifdef USE_HOSTCC -#define CONFIG_SYS_BOOTM_LEN 0x4000000 +#define CONFIG_SYS_BOOTM_LEN 0x10000000 #endif #ifndef CONFIG_SYS_BOOTM_LEN diff --git a/u-boot/common/fb_mmc.c b/u-boot/common/fb_mmc.c index e083daa..f292d0d 100755 --- a/u-boot/common/fb_mmc.c +++ b/u-boot/common/fb_mmc.c @@ -31,6 +31,15 @@ #define CONFIG_FASTBOOT_MBR_NAME "mbr" #endif +#ifndef CONFIG_FASTBOOT_IDBLOCK_NAME +#define CONFIG_FASTBOOT_IDBLOCK_NAME "idblock" +#endif + +#define CONFIG_FASTBOOT_MMC_BLOCK_SIZE 512 +#define CONFIG_FASTBOOT_IDBLOCK_SECTOR 64 +/* idblock sector:64 ~ 64 + 5 * 1024(512K for each MiniloadAll.bin) */ +#define CONFIG_FASTBOOT_IDBLOCK_SECTOR_SIZE 5184 + #define BOOT_PARTITION_NAME "boot" #define FASTBOOT_MAX_BLK_WRITE 16384 static ulong timer; @@ -363,6 +372,14 @@ } #endif + if (strcmp(cmd, CONFIG_FASTBOOT_IDBLOCK_NAME) == 0) { + printf("%s: updating IDBLOCK\n", __func__); + info.blksz = CONFIG_FASTBOOT_MMC_BLOCK_SIZE; + info.start = CONFIG_FASTBOOT_IDBLOCK_SECTOR; + info.size = CONFIG_FASTBOOT_IDBLOCK_SECTOR_SIZE; + goto download; + } + #ifdef CONFIG_ANDROID_BOOT_IMAGE if (strncasecmp(cmd, "zimage", 6) == 0) { fb_mmc_update_zimage(dev_desc, download_buffer, download_bytes, response); @@ -376,6 +393,7 @@ return; } +download: if (is_sparse_image(download_buffer)) { struct fb_mmc_sparse sparse_priv; struct sparse_storage sparse; diff --git a/u-boot/common/image-android.c b/u-boot/common/image-android.c index fbd9bad..a77c0f3 100644 --- a/u-boot/common/image-android.c +++ b/u-boot/common/image-android.c @@ -6,14 +6,16 @@ #include <common.h> #include <image.h> -#include <android_image.h> +#include <android_ab.h> #include <android_bootloader.h> +#include <android_image.h> #include <malloc.h> #include <mapmem.h> #include <errno.h> #include <boot_rkimg.h> #include <crypto.h> #include <sysmem.h> +#include <mp_boot.h> #include <u-boot/sha1.h> #ifdef CONFIG_RKIMG_BOOTLOADER #include <asm/arch/resource_img.h> @@ -28,8 +30,8 @@ DECLARE_GLOBAL_DATA_PTR; #define ANDROID_IMAGE_DEFAULT_KERNEL_ADDR 0x10008000 -#define ANDROID_Q_VER 10 #define ANDROID_PARTITION_VENDOR_BOOT "vendor_boot" +#define ANDROID_PARTITION_INIT_BOOT "init_boot" #define BLK_CNT(_num_bytes, _block_size) \ ((_num_bytes + _block_size - 1) / _block_size) @@ -37,27 +39,110 @@ static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1]; static u32 android_kernel_comp_type = IH_COMP_NONE; -u32 android_image_major_version(void) +static int android_version_init(void) { - /* MSB 7-bits */ - return gd->bd->bi_andr_version >> 25; + struct andr_img_hdr *hdr = NULL; + struct blk_desc *desc; + const char *part_name = PART_BOOT; + disk_partition_t part; + int os_version; + + desc = rockchip_get_bootdev(); + if (!desc) { + printf("No bootdev\n"); + return -1; + } + +#ifdef CONFIG_ANDROID_AB + part_name = ab_can_find_recovery_part() ? PART_RECOVERY : PART_BOOT; +#endif + if (part_get_info_by_name(desc, part_name, &part) < 0) + return -1; + + hdr = populate_andr_img_hdr(desc, &part); + if (!hdr) + return -1; + + os_version = hdr->os_version; + if (os_version) + printf("Android %u.%u, Build %u.%u, v%d\n", + (os_version >> 25) & 0x7f, (os_version >> 18) & 0x7F, + ((os_version >> 4) & 0x7f) + 2000, os_version & 0x0F, + hdr->header_version); + free(hdr); + + return (os_version >> 25) & 0x7f; } u32 android_bcb_msg_sector_offset(void) { + static int android_version = -1; /* static */ + /* - * Rockchip platforms defines BCB message at the 16KB offset of - * misc partition while the Google defines it at 0x00 offset. + * get android os version: * - * From Android-Q, the 0x00 offset is mandary on Google VTS, so that - * this is a compatibility according to android image 'os_version'. + * There are two types of misc.img: + * Rockchip platforms defines BCB message at the 16KB offset of + * misc.img except for the Android version >= 10. Because Google + * defines it at 0x00 offset, and from Android-10 it becoms mandary + * on Google VTS. + * + * So we must get android 'os_version' to identify which type we + * are using, then we could able to use rockchip_get_boot_mode() + * which reads BCB from misc.img. */ #ifdef CONFIG_RKIMG_BOOTLOADER - return (android_image_major_version() >= ANDROID_Q_VER) ? 0x00 : 0x20; + if (android_version < 0) + android_version = android_version_init(); + + return (android_version >= 10) ? 0x00 : 0x20; #else return 0x00; #endif } + +#ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE +int android_image_init_resource(struct blk_desc *desc, + disk_partition_t *out_part, + ulong *out_blk_offset) +{ + struct andr_img_hdr *hdr = NULL; + const char *part_name = ANDROID_PARTITION_BOOT; + disk_partition_t part; + ulong offset; + int ret = 0; + + if (!desc) + return -ENODEV; + +#ifndef CONFIG_ANDROID_AB + if (rockchip_get_boot_mode() == BOOT_MODE_RECOVERY) + part_name = ANDROID_PARTITION_RECOVERY; +#endif + if (part_get_info_by_name(desc, part_name, &part) < 0) + return -ENOENT; + + hdr = populate_andr_img_hdr(desc, &part); + if (!hdr) + return -EINVAL; + + if (hdr->header_version >= 2 && hdr->dtb_size) + env_update("bootargs", "androidboot.dtb_idx=0"); + + if (hdr->header_version <= 2) { + offset = hdr->page_size + + ALIGN(hdr->kernel_size, hdr->page_size) + + ALIGN(hdr->ramdisk_size, hdr->page_size); + *out_part = part; + *out_blk_offset = DIV_ROUND_UP(offset, desc->blksz); + } else { + ret = -EINVAL; + } + free(hdr); + + return ret; +} +#endif static ulong android_image_get_kernel_addr(const struct andr_img_hdr *hdr) { @@ -323,7 +408,7 @@ typedef enum { IMG_KERNEL, - IMG_RAMDISK, + IMG_RAMDISK, /* within boot.img or init_boot.img(Android-13 or later) */ IMG_SECOND, IMG_RECOVERY_DTBO, IMG_RK_DTB, /* within resource.img in second position */ @@ -343,7 +428,9 @@ { struct blk_desc *desc = rockchip_get_bootdev(); disk_partition_t part_vendor_boot; + disk_partition_t part_init_boot; __maybe_unused u32 typesz; + u32 andr_version = (hdr->os_version >> 25) & 0x7f; ulong pgsz = hdr->page_size; ulong blksz = desc->blksz; ulong blkcnt, blkoff; @@ -352,6 +439,7 @@ ulong extra = 0; ulong length; void *buffer; + void *tmp = NULL; int ret = 0; switch (img) { @@ -366,17 +454,20 @@ return -ENOMEM; break; case IMG_VENDOR_RAMDISK: - if (part_get_info_by_name(desc, - ANDROID_PARTITION_VENDOR_BOOT, - &part_vendor_boot) < 0) { - printf("No vendor boot partition\n"); - return -ENOENT; + if (hdr->vendor_boot_buf) { + ram_base = hdr->vendor_boot_buf; + } else { + if (part_get_info_by_name(desc, + ANDROID_PARTITION_VENDOR_BOOT, + &part_vendor_boot) < 0) { + printf("No vendor boot partition\n"); + return -ENOENT; + } + ram_base = 0; } - /* Always load vendor boot from storage: avb full load boot/recovery */ + blkstart = part_vendor_boot.start; pgsz = hdr->vendor_page_size; - ram_base = 0; - bsoffs = ALIGN(VENDOR_BOOT_HDRv3_SIZE, pgsz); length = hdr->vendor_ramdisk_size; buffer = (void *)env_get_ulong("ramdisk_addr_r", 16, 0); @@ -400,7 +491,25 @@ return -ENOMEM; break; case IMG_RAMDISK: - bsoffs = pgsz + ALIGN(hdr->kernel_size, pgsz); + /* get ramdisk from init_boot.img ? */ + if (hdr->header_version >= 4 && andr_version >= 13) { + if (hdr->init_boot_buf) { + ram_base = hdr->init_boot_buf; + } else { + if (part_get_info_by_name(desc, + ANDROID_PARTITION_INIT_BOOT, &part_init_boot) < 0) { + printf("No init boot partition\n"); + return -ENOENT; + } + blkstart = part_init_boot.start; + ram_base = 0; + } + bsoffs = pgsz; + } else { + /* get ramdisk from generic boot.img */ + bsoffs = pgsz + ALIGN(hdr->kernel_size, pgsz); + } + length = hdr->ramdisk_size; buffer = (void *)env_get_ulong("ramdisk_addr_r", 16, 0); blkcnt = DIV_ROUND_UP(hdr->ramdisk_size, blksz); @@ -412,15 +521,20 @@ * | ramdisk | * |----------------| * - * ramdisk_addr_r v3: + * ramdisk_addr_r v3 (Android-11 and later): * |----------------|---------| * | vendor-ramdisk | ramdisk | * |----------------|---------| * - * ramdisk_addr_r v4: + * ramdisk_addr_r v4 (Android-12 and later): * |----------------|---------|------------|------------| * | vendor-ramdisk | ramdisk | bootconfig | bootparams | * |----------------|---------|------------|------------| + * + * ramdisk_addr_r v4 + init_boot(Android-13 and later): + * |----------------|----------------|------------|------------| + * | vendor-ramdisk | (init_)ramdisk | bootconfig | bootparams | + * |----------------|----------------|------------|------------| */ if (hdr->header_version >= 3) { buffer += hdr->vendor_ramdisk_size; @@ -439,17 +553,20 @@ case IMG_BOOTCONFIG: if (hdr->header_version < 4) return 0; - if (part_get_info_by_name(desc, - ANDROID_PARTITION_VENDOR_BOOT, - &part_vendor_boot) < 0) { - printf("No vendor boot partition\n"); - return -ENOENT; - } + if (hdr->vendor_boot_buf) { + ram_base = hdr->vendor_boot_buf; + } else { + if (part_get_info_by_name(desc, + ANDROID_PARTITION_VENDOR_BOOT, + &part_vendor_boot) < 0) { + printf("No vendor boot partition\n"); + return -ENOENT; + } + ram_base = 0; + } blkstart = part_vendor_boot.start; pgsz = hdr->vendor_page_size; - ram_base = 0; - bsoffs = ALIGN(VENDOR_BOOT_HDRv4_SIZE, pgsz) + ALIGN(hdr->vendor_ramdisk_size, pgsz) + ALIGN(hdr->dtb_size, pgsz) + @@ -471,7 +588,7 @@ ALIGN(hdr->ramdisk_size, pgsz); length = hdr->second_size; blkcnt = DIV_ROUND_UP(hdr->second_size, blksz); - buffer = malloc(blkcnt * blksz); + buffer = tmp = malloc(blkcnt * blksz); typesz = sizeof(hdr->second_size); break; case IMG_RECOVERY_DTBO: @@ -481,7 +598,7 @@ ALIGN(hdr->second_size, pgsz); length = hdr->recovery_dtbo_size; blkcnt = DIV_ROUND_UP(hdr->recovery_dtbo_size, blksz); - buffer = malloc(blkcnt * blksz); + buffer = tmp = malloc(blkcnt * blksz); typesz = sizeof(hdr->recovery_dtbo_size); break; case IMG_DTB: @@ -492,7 +609,7 @@ ALIGN(hdr->recovery_dtbo_size, pgsz); length = hdr->dtb_size; blkcnt = DIV_ROUND_UP(hdr->dtb_size, blksz); - buffer = malloc(blkcnt * blksz); + buffer = tmp = malloc(blkcnt * blksz); typesz = sizeof(hdr->dtb_size); break; case IMG_RK_DTB: @@ -540,14 +657,19 @@ if (hdr->header_version < 3) { #ifdef CONFIG_ANDROID_BOOT_IMAGE_HASH #ifdef CONFIG_DM_CRYPTO - crypto_sha_update(crypto, (u32 *)buffer, length); - crypto_sha_update(crypto, (u32 *)&length, typesz); + if (crypto) { + crypto_sha_update(crypto, (u32 *)buffer, length); + crypto_sha_update(crypto, (u32 *)&length, typesz); + } #else sha1_update(&sha1_ctx, (void *)buffer, length); sha1_update(&sha1_ctx, (void *)&length, typesz); #endif #endif } + + if (tmp) + free(tmp); return 0; } @@ -605,7 +727,12 @@ return -1; #ifdef CONFIG_ANDROID_BOOT_IMAGE_HASH - if (hdr->header_version < 3) { + int verify = 1; + +#ifdef CONFIG_MP_BOOT + verify = mpb_post(3); +#endif + if (hdr->header_version < 3 && verify) { struct udevice *dev = NULL; uchar hash[20]; #ifdef CONFIG_DM_CRYPTO @@ -936,6 +1063,7 @@ const disk_partition_t *boot_img) { struct boot_img_hdr_v34 *boot_hdr; + disk_partition_t part; long blk_cnt, blks_read; blk_cnt = BLK_CNT(sizeof(struct boot_img_hdr_v34), dev_desc->blksz); @@ -960,6 +1088,13 @@ printf("boot header %d, is not >= v3.\n", boot_hdr->header_version); return NULL; + } + + /* Start from android-13 GKI, it doesn't assign 'os_version' */ + if (boot_hdr->header_version >= 4 && boot_hdr->os_version == 0) { + if (part_get_info_by_name(dev_desc, + ANDROID_PARTITION_INIT_BOOT, &part) > 0) + boot_hdr->os_version = 13 << 25; } return boot_hdr; @@ -1003,19 +1138,26 @@ return vboot_hdr; } -static int populate_boot_info(const struct boot_img_hdr_v34 *boot_hdr, - const struct vendor_boot_img_hdr_v34 *vendor_hdr, - struct andr_img_hdr *hdr) +int populate_boot_info(const struct boot_img_hdr_v34 *boot_hdr, + const struct vendor_boot_img_hdr_v34 *vendor_boot_hdr, + const struct boot_img_hdr_v34 *init_boot_hdr, + struct andr_img_hdr *hdr, bool save_hdr) { memset(hdr->magic, 0, ANDR_BOOT_MAGIC_SIZE); memcpy(hdr->magic, boot_hdr->magic, ANDR_BOOT_MAGIC_SIZE); hdr->kernel_size = boot_hdr->kernel_size; - /* don't use vendor_hdr->kernel_addr, we prefer "hdr + hdr->page_size" */ + /* don't use vendor_boot_hdr->kernel_addr, we prefer "hdr + hdr->page_size" */ hdr->kernel_addr = ANDROID_IMAGE_DEFAULT_KERNEL_ADDR; - /* generic ramdisk: immediately following the vendor ramdisk */ - hdr->boot_ramdisk_size = boot_hdr->ramdisk_size; - hdr->ramdisk_size = boot_hdr->ramdisk_size; + + /* + * generic ramdisk: immediately following the vendor ramdisk. + * It can be from init_boot.img or boot.img. + */ + if (init_boot_hdr) + hdr->ramdisk_size = init_boot_hdr->ramdisk_size; + else + hdr->ramdisk_size = boot_hdr->ramdisk_size; /* actually, useless */ hdr->ramdisk_addr = env_get_ulong("ramdisk_addr_r", 16, 0); @@ -1024,7 +1166,7 @@ hdr->second_size = 0; hdr->second_addr = 0; - hdr->tags_addr = vendor_hdr->tags_addr; + hdr->tags_addr = vendor_boot_hdr->tags_addr; /* fixed in v3 */ hdr->page_size = 4096; @@ -1032,7 +1174,7 @@ hdr->os_version = boot_hdr->os_version; memset(hdr->name, 0, ANDR_BOOT_NAME_SIZE); - strncpy(hdr->name, (const char *)vendor_hdr->name, ANDR_BOOT_NAME_SIZE); + strncpy(hdr->name, (const char *)vendor_boot_hdr->name, ANDR_BOOT_NAME_SIZE); /* removed in v3 */ memset(hdr->cmdline, 0, ANDR_BOOT_ARGS_SIZE); @@ -1042,14 +1184,14 @@ hdr->recovery_dtbo_offset = 0; hdr->header_size = boot_hdr->header_size; - hdr->dtb_size = vendor_hdr->dtb_size; - hdr->dtb_addr = vendor_hdr->dtb_addr; + hdr->dtb_size = vendor_boot_hdr->dtb_size; + hdr->dtb_addr = vendor_boot_hdr->dtb_addr; /* boot_img_hdr_v34 fields */ - hdr->vendor_ramdisk_size = vendor_hdr->vendor_ramdisk_size; - hdr->vendor_page_size = vendor_hdr->page_size; - hdr->vendor_header_version = vendor_hdr->header_version; - hdr->vendor_header_size = vendor_hdr->header_size; + hdr->vendor_ramdisk_size = vendor_boot_hdr->vendor_ramdisk_size; + hdr->vendor_page_size = vendor_boot_hdr->page_size; + hdr->vendor_header_version = vendor_boot_hdr->header_version; + hdr->vendor_header_size = vendor_boot_hdr->header_size; hdr->total_cmdline = calloc(1, TOTAL_BOOT_ARGS_SIZE); if (!hdr->total_cmdline) @@ -1057,30 +1199,33 @@ strncpy(hdr->total_cmdline, (const char *)boot_hdr->cmdline, sizeof(boot_hdr->cmdline)); strncat(hdr->total_cmdline, " ", 1); - strncat(hdr->total_cmdline, (const char *)vendor_hdr->cmdline, - sizeof(vendor_hdr->cmdline)); + strncat(hdr->total_cmdline, (const char *)vendor_boot_hdr->cmdline, + sizeof(vendor_boot_hdr->cmdline)); /* new for header v4 */ - if (vendor_hdr->header_version > 3) { + if (vendor_boot_hdr->header_version >= 4) { hdr->vendor_ramdisk_table_size = - vendor_hdr->vendor_ramdisk_table_size; + vendor_boot_hdr->vendor_ramdisk_table_size; hdr->vendor_ramdisk_table_entry_num = - vendor_hdr->vendor_ramdisk_table_entry_num; + vendor_boot_hdr->vendor_ramdisk_table_entry_num; hdr->vendor_ramdisk_table_entry_size = - vendor_hdr->vendor_ramdisk_table_entry_size; + vendor_boot_hdr->vendor_ramdisk_table_entry_size; /* * If we place additional "androidboot.xxx" parameters after * bootconfig, this field value should be increased, * but not over than ANDROID_ADDITION_BOOTCONFIG_PARAMS_MAX_SIZE. */ hdr->vendor_bootconfig_size = - vendor_hdr->vendor_bootconfig_size; + vendor_boot_hdr->vendor_bootconfig_size; } else { hdr->vendor_ramdisk_table_size = 0; hdr->vendor_ramdisk_table_entry_num = 0; hdr->vendor_ramdisk_table_entry_size = 0; hdr->vendor_bootconfig_size = 0; } + + hdr->init_boot_buf = save_hdr ? (void *)init_boot_hdr : 0; + hdr->vendor_boot_buf = save_hdr ? (void *)vendor_boot_hdr : 0; if (hdr->page_size < sizeof(*hdr)) { printf("android hdr is over size\n"); @@ -1110,10 +1255,13 @@ disk_partition_t *part_boot) { disk_partition_t part_vendor_boot; - struct vendor_boot_img_hdr_v34 *vboot_hdr; - struct boot_img_hdr_v34 *boot_hdr; - struct andr_img_hdr *andr_hdr; + disk_partition_t part_init_boot; + struct vendor_boot_img_hdr_v34 *vboot_hdr = NULL; + struct boot_img_hdr_v34 *iboot_hdr = NULL; + struct boot_img_hdr_v34 *boot_hdr = NULL; + struct andr_img_hdr *andr_hdr = NULL; int header_version; + int andr_version; if (!dev_desc || !part_boot) return NULL; @@ -1134,6 +1282,7 @@ header_version = andr_hdr->header_version; free(andr_hdr); + andr_hdr = NULL; if (header_version < 3) { return extract_boot_image_v012_header(dev_desc, part_boot); @@ -1150,6 +1299,23 @@ if (!boot_hdr || !vboot_hdr) goto image_load_exit; + andr_version = (boot_hdr->os_version >> 25) & 0x7f; + if (header_version >= 4 && andr_version >= 13) { + if (part_get_info_by_name(dev_desc, + ANDROID_PARTITION_INIT_BOOT, + &part_init_boot) < 0) { + printf("No init boot partition\n"); + return NULL; + } + iboot_hdr = extract_boot_image_v34_header(dev_desc, &part_init_boot); + if (!iboot_hdr) + goto image_load_exit; + if (!iboot_hdr->ramdisk_size) { + printf("No ramdisk in init boot partition\n"); + goto image_load_exit; + } + } + andr_hdr = (struct andr_img_hdr *) malloc(sizeof(struct andr_img_hdr)); if (!andr_hdr) { @@ -1157,21 +1323,21 @@ goto image_load_exit; } - if (populate_boot_info(boot_hdr, vboot_hdr, andr_hdr)) { + if (populate_boot_info(boot_hdr, vboot_hdr, + iboot_hdr, andr_hdr, false)) { printf("populate boot info failed\n"); goto image_load_exit; } - free(boot_hdr); - free(vboot_hdr); +image_load_exit: + if (boot_hdr) + free(boot_hdr); + if (iboot_hdr) + free(iboot_hdr); + if (vboot_hdr) + free(vboot_hdr); return andr_hdr; - -image_load_exit: - free(boot_hdr); - free(vboot_hdr); - - return NULL; } return NULL; diff --git a/u-boot/common/image-fdt.c b/u-boot/common/image-fdt.c index 2c79b96..2884880 100644 --- a/u-boot/common/image-fdt.c +++ b/u-boot/common/image-fdt.c @@ -78,39 +78,16 @@ } #endif -/** - * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable - * @lmb: pointer to lmb handle, will be used for memory mgmt - * @fdt_blob: pointer to fdt blob base address - * - * Adds the memreserve regions in the dtb to the lmb block. Adding the - * memreserve regions prevents u-boot from using them to store the initrd - * or the fdt blob. - */ -void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob) +void boot_mem_rsv_regions(struct lmb *lmb, void *fdt_blob) { - uint64_t addr, size; - int i, total; int rsv_offset, offset; fdt_size_t rsv_size; fdt_addr_t rsv_addr; - /* we needn't repeat do reserve, do_bootm_linux would call this again */ - static int rsv_done; const void *prop; + int i = 0; - if (fdt_check_header(fdt_blob) != 0 || rsv_done) + if (fdt_check_header(fdt_blob) != 0) return; - - rsv_done = 1; - - total = fdt_num_mem_rsv(fdt_blob); - for (i = 0; i < total; i++) { - if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0) - continue; - printf(" reserving fdt memory region: addr=%llx size=%llx\n", - (unsigned long long)addr, (unsigned long long)size); - lmb_reserve(lmb, addr, size); - } rsv_offset = fdt_subnode_offset(fdt_blob, 0, "reserved-memory"); if (rsv_offset == -FDT_ERR_NOTFOUND) @@ -128,13 +105,56 @@ &rsv_size, false); if (rsv_addr == FDT_ADDR_T_NONE || !rsv_size) continue; - printf(" 'reserved-memory' %s: addr=%llx size=%llx\n", - fdt_get_name(fdt_blob, offset, NULL), - (unsigned long long)rsv_addr, (unsigned long long)rsv_size); - lmb_reserve(lmb, rsv_addr, rsv_size); + + i++; + /* be quiet while reserve */ + if (lmb) { + lmb_reserve(lmb, rsv_addr, rsv_size); + } else { + if (i == 1) + printf("## reserved-memory:\n"); + + printf(" %s: addr=%llx size=%llx\n", + fdt_get_name(fdt_blob, offset, NULL), + (unsigned long long)rsv_addr, (unsigned long long)rsv_size); + } } } +/** + * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable + * @lmb: pointer to lmb handle, will be used for memory mgmt + * @fdt_blob: pointer to fdt blob base address + * + * Adds the memreserve regions in the dtb to the lmb block. Adding the + * memreserve regions prevents u-boot from using them to store the initrd + * or the fdt blob. + */ +void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob) +{ + uint64_t addr, size; + int i, total; + /* we needn't repeat do reserve, do_bootm_linux would call this again */ + static int rsv_done; + + if (fdt_check_header(fdt_blob) != 0 || rsv_done) + return; + + rsv_done = 1; + + total = fdt_num_mem_rsv(fdt_blob); + for (i = 0; i < total; i++) { + if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0) + continue; + printf(" reserving fdt memory region: addr=%llx size=%llx\n", + (unsigned long long)addr, (unsigned long long)size); + lmb_reserve(lmb, addr, size); + } + + /* lmb_reserve() for "reserved-memory" */ + boot_mem_rsv_regions(lmb, fdt_blob); +} + #ifdef CONFIG_SYSMEM /** * boot_fdt_add_mem_rsv_regions - Mark the memreserve sections as unusable diff --git a/u-boot/common/image-fit.c b/u-boot/common/image-fit.c index d364788..0ee9eab 100644 --- a/u-boot/common/image-fit.c +++ b/u-boot/common/image-fit.c @@ -2175,6 +2175,7 @@ fit_image_check_os(fit, noffset, IH_OS_ARM_TRUSTED_FIRMWARE) || fit_image_check_os(fit, noffset, IH_OS_OP_TEE) || fit_image_check_os(fit, noffset, IH_OS_U_BOOT) || + fit_image_check_os(fit, noffset, IH_OS_QNX) || fit_image_check_os(fit, noffset, IH_OS_OPENRTOS); /* diff --git a/u-boot/common/image-sparse.c b/u-boot/common/image-sparse.c index f1382bd..505428e 100644 --- a/u-boot/common/image-sparse.c +++ b/u-boot/common/image-sparse.c @@ -56,10 +56,10 @@ lbaint_t blk; lbaint_t blkcnt; lbaint_t blks; - uint32_t bytes_written = 0; + uint64_t bytes_written = 0; unsigned int chunk; unsigned int offset; - unsigned int chunk_data_sz; + uint64_t chunk_data_sz; uint32_t *fill_buf = NULL; uint32_t fill_val; sparse_header_t *sparse_header; @@ -130,8 +130,8 @@ sizeof(chunk_header_t)); } - chunk_data_sz = sparse_header->blk_sz * chunk_header->chunk_sz; - blkcnt = chunk_data_sz / info->blksz; + chunk_data_sz = ((u64)sparse_header->blk_sz) * chunk_header->chunk_sz; + blkcnt = DIV_ROUND_UP_ULL(chunk_data_sz, info->blksz); switch (chunk_header->chunk_type) { case CHUNK_TYPE_RAW: if (chunk_header->total_sz != @@ -161,7 +161,7 @@ return; } blk += blks; - bytes_written += blkcnt * info->blksz; + bytes_written += ((u64)blkcnt) * info->blksz; total_blocks += chunk_header->chunk_sz; data += chunk_data_sz; break; @@ -222,8 +222,9 @@ blk += blks; i += j; } - bytes_written += blkcnt * info->blksz; - total_blocks += chunk_data_sz / sparse_header->blk_sz; + bytes_written += ((u64)blkcnt) * info->blksz; + total_blocks += DIV_ROUND_UP_ULL(chunk_data_sz, + sparse_header->blk_sz); free(fill_buf); break; @@ -253,7 +254,7 @@ debug("Wrote %d blocks, expected to write %d blocks\n", total_blocks, sparse_header->total_blks); - printf("........ wrote %u bytes to '%s'\n", bytes_written, part_name); + printf("........ wrote %llu bytes to '%s'\n", bytes_written, part_name); if (total_blocks != sparse_header->total_blks) fastboot_fail("sparse image write failure", response); diff --git a/u-boot/common/mp_boot_rk3528.S b/u-boot/common/mp_boot_rk3528.S new file mode 100644 index 0000000..6d7c51a --- /dev/null +++ b/u-boot/common/mp_boot_rk3528.S @@ -0,0 +1,9682 @@ + .arch armv8-a+nosimd + .file "mp_boot.c" + .text +.Ltext0: + .cfi_sections .debug_frame + .section .text.mpb_task_set_state,"ax",@progbits + .align 2 + .type mpb_task_set_state, %function +mpb_task_set_state: +.LFB225: + .file 1 "common/mp_boot.c" + .loc 1 227 0 + .cfi_startproc +.LVL0: +.LBB30: +.LBB31: + .loc 1 146 0 + mov x4, 136314880 + mov w3, 1 + lsl w3, w3, w1 + ldr w5, [x4] +.LBE31: +.LBE30: + .loc 1 232 0 + tst w3, w5 + beq .L11 +.LBB32: +.LBB33: + .loc 1 199 0 + uxtw x5, w0 + mov x3, 328 + umull x0, w0, w3 +.LVL1: + madd x4, x5, x3, x4 + mov w3, 0 + ldrb w6, [x4, 328] + mov x4, 20 + movk x4, 0x820, lsl 16 + add x4, x0, x4 +.L3: +.LVL2: + cmp w3, w6 + blt .L5 +.LVL3: +.L11: +.LBE33: +.LBE32: + .loc 1 252 0 + mov w0, 0 + ret +.LVL4: +.L5: +.LBB35: +.LBB34: + .loc 1 200 0 + ldr w7, [x4], 40 + cmp w1, w7 + beq .L4 + .loc 1 199 0 + add w3, w3, 1 +.LVL5: + b .L3 +.L4: +.LVL6: +.LBE34: +.LBE35: + .loc 1 239 0 + mov x8, 328 + sxtw x4, w3 + mov x7, 40 + .loc 1 240 0 + add x0, x0, 16 + .loc 1 239 0 + mul x5, x5, x8 + .loc 1 227 0 + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 239 0 + nop // between mem op and mult-accumulate + madd x4, x4, x7, x5 + mov x6, 136314880 + .loc 1 240 0 + smaddl x3, w3, w7, x0 + .loc 1 227 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 239 0 + add x4, x6, x4 + .loc 1 227 0 + .loc 1 239 0 + add w1, w1, w2 +.LVL7: + .loc 1 240 0 + add x0, x3, x6 + .loc 1 239 0 + str w1, [x4, 16] + .loc 1 241 0 + add x1, x0, 4 + bl flush_dcache_range +.LVL8: + .loc 1 252 0 + mov w0, 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE225: + .size mpb_task_set_state, .-mpb_task_set_state + .section .text.mpb_quit_load_image,"ax",@progbits + .align 2 + .type mpb_quit_load_image, %function +mpb_quit_load_image: +.LFB238: + .loc 1 560 0 + .cfi_startproc + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 + .loc 1 563 0 + bl rockchip_get_boot_mode +.LVL9: + cmp w0, 1 + bne .L15 + mov w19, w0 +.LBB38: +.LBB39: + .loc 1 564 0 + adrp x0, .LANCHOR0 + ldr w1, [x0, #:lo12:.LANCHOR0] + cbnz w1, .L13 + .loc 1 565 0 + str w19, [x0, #:lo12:.LANCHOR0] + .loc 1 566 0 + adrp x0, .LC1 + add x0, x0, :lo12:.LC1 + bl printf +.LVL10: +.L13: +.LBE39: +.LBE38: + .loc 1 573 0 + mov w0, w19 + ldr x19, [sp, 16] + ldp x29, x30, [sp], 32 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + ret +.L15: + .cfi_restore_state + .loc 1 572 0 + mov w19, 0 + b .L13 + .cfi_endproc +.LFE238: + .size mpb_quit_load_image, .-mpb_quit_load_image + .section .text.spl_init_display,"ax",@progbits + .align 2 + .weak spl_init_display + .type spl_init_display, %function +spl_init_display: +.LFB252: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE252: + .size spl_init_display, .-spl_init_display + .section .text.spl_load_baseparamter,"ax",@progbits + .align 2 + .weak spl_load_baseparamter + .type spl_load_baseparamter, %function +spl_load_baseparamter: +.LFB250: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE250: + .size spl_load_baseparamter, .-spl_load_baseparamter + .section .text.spl_load_fit,"ax",@progbits + .align 2 + .weak spl_load_fit + .type spl_load_fit, %function +spl_load_fit: +.LFB248: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE248: + .size spl_load_fit, .-spl_load_fit + .section .text.spl_load_android,"ax",@progbits + .align 2 + .weak spl_load_android + .type spl_load_android, %function +spl_load_android: +.LFB246: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE246: + .size spl_load_android, .-spl_load_android + .section .text.spl_hash_android,"ax",@progbits + .align 2 + .weak spl_hash_android + .type spl_hash_android, %function +spl_hash_android: +.LFB244: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE244: + .size spl_hash_android, .-spl_hash_android + .section .text.spl_dummy,"ax",@progbits + .align 2 + .weak spl_dummy + .type spl_dummy, %function +spl_dummy: +.LFB218: + .loc 1 52 0 + .cfi_startproc +.LVL11: + .loc 1 52 0 + mov w0, 0 +.LVL12: + ret + .cfi_endproc +.LFE218: + .size spl_dummy, .-spl_dummy + .section .text.mpb_task_is_done,"ax",@progbits + .align 2 + .global mpb_task_is_done + .type mpb_task_is_done, %function +mpb_task_is_done: +.LFB226: + .loc 1 261 0 + .cfi_startproc +.LVL13: +.LBB40: +.LBB41: + .loc 1 146 0 + mov x2, 136314880 + mov w1, 1 + lsl w1, w1, w0 + ldr w2, [x2] +.LBE41: +.LBE40: + .loc 1 265 0 + tst w1, w2 + beq .L39 + .loc 1 261 0 + stp x29, x30, [sp, -96]! + .cfi_def_cfa_offset 96 + .cfi_offset 29, -96 + .cfi_offset 30, -88 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -80 + .cfi_offset 20, -72 + mov w19, w0 + stp x23, x24, [sp, 48] + .cfi_offset 23, -48 + .cfi_offset 24, -40 + .loc 1 275 0 + mov w24, -559087616 + .loc 1 261 0 + str x27, [sp, 80] + .loc 1 275 0 + add w24, w0, w24 + .cfi_offset 27, -16 + .loc 1 277 0 + sub w27, w0, #65536 + .loc 1 261 0 + stp x21, x22, [sp, 32] + stp x25, x26, [sp, 64] + .cfi_offset 21, -64 + .cfi_offset 22, -56 + .cfi_offset 25, -32 + .cfi_offset 26, -24 + mov x21, 0 +.LVL14: +.L31: + mov x22, 16 + mov x20, 20 + .loc 1 269 0 + mov x26, 328 + movk x22, 0x820, lsl 16 + movk x20, 0x820, lsl 16 + add x22, x21, x22 + add x20, x21, x20 + .loc 1 261 0 + mov w23, 0 + .loc 1 269 0 + movk x26, 0x820, lsl 16 + .loc 1 279 0 + mov w25, 1431655765 + b .L27 +.LVL15: +.L30: + .loc 1 270 0 + ldr w0, [x20] + cmp w19, w0 + beq .L26 +.L29: + .loc 1 269 0 + add w23, w23, 1 +.LVL16: + add x22, x22, 40 + add x20, x20, 40 +.LVL17: +.L27: + .loc 1 269 0 is_stmt 0 discriminator 1 + ldrb w0, [x21, x26] + cmp w23, w0 + blt .L30 +.LVL18: + add x21, x21, 328 + .loc 1 268 0 is_stmt 1 discriminator 2 + cmp x21, 1312 + bne .L31 + .loc 1 286 0 + mov w0, 0 +.L23: + .loc 1 287 0 + ldp x19, x20, [sp, 16] +.LVL19: + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] +.LVL20: + ldp x25, x26, [sp, 64] + ldr x27, [sp, 80] +.LVL21: + ldp x29, x30, [sp], 96 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 27 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL22: +.L26: + .cfi_restore_state + .loc 1 272 0 + mov x0, x22 + mov x1, x20 + bl invalidate_dcache_range +.LVL23: + .loc 1 275 0 + ldr w0, [x22] + cmp w0, w24 + beq .L32 + .loc 1 277 0 + cmp w0, w27 + beq .L24 + .loc 1 279 0 + add w1, w19, w25 + cmp w0, w1 + bne .L29 + .loc 1 280 0 + mov w0, -2 + b .L23 +.L24: + .loc 1 266 0 + mov w0, -1 + b .L23 +.L32: + .loc 1 276 0 + mov w0, 1 + b .L23 +.LVL24: +.L39: + .cfi_def_cfa 31, 0 + .cfi_restore 19 + .cfi_restore 20 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 27 + .cfi_restore 29 + .cfi_restore 30 + .loc 1 266 0 + mov w0, -1 +.LVL25: + .loc 1 287 0 + ret + .cfi_endproc +.LFE226: + .size mpb_task_is_done, .-mpb_task_is_done + .section .text.mpb_task_dump,"ax",@progbits + .align 2 + .global mpb_task_dump + .type mpb_task_dump, %function +mpb_task_dump: +.LFB227: + .loc 1 290 0 + .cfi_startproc + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 + .loc 1 294 0 + mov x0, 136314880 + .loc 1 290 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 294 0 + ldr x1, [x0, 1360] + ldr x2, [x0, 1368] + adrp x0, .LC2 + .loc 1 290 0 + stp x19, x20, [sp, 16] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + .loc 1 294 0 + mov x20, 20 + .loc 1 290 0 + stp x23, x24, [sp, 48] + .loc 1 294 0 + movk x20, 0x820, lsl 16 + .loc 1 290 0 + stp x21, x22, [sp, 32] + .cfi_offset 23, -32 + .cfi_offset 24, -24 + .cfi_offset 21, -48 + .cfi_offset 22, -40 + .loc 1 299 0 + adrp x23, .LANCHOR1 + adrp x24, .LC3 + .loc 1 296 0 + mov w21, 0 + .loc 1 299 0 + add x23, x23, :lo12:.LANCHOR1 + add x24, x24, :lo12:.LC3 + .loc 1 294 0 + add x0, x0, :lo12:.LC2 + .loc 1 290 0 + str x25, [sp, 64] + .cfi_offset 25, -16 + .loc 1 294 0 + bl printf +.LVL26: +.L43: + .loc 1 290 0 + mov x19, x20 + mov w22, 0 + .loc 1 300 0 + adrp x25, .LC4 + b .L46 +.LVL27: +.L44: + .loc 1 299 0 discriminator 3 + ldr w2, [x19] + mov w1, w21 + mov x0, x24 + .loc 1 297 0 discriminator 3 + add w22, w22, 1 +.LVL28: + add x19, x19, 40 + .loc 1 299 0 discriminator 3 + ldr x3, [x23, w2, uxtw 3] + bl printf +.LVL29: + .loc 1 300 0 discriminator 3 + ldr w1, [x19, -40] + add x0, x25, :lo12:.LC4 + bl printf +.LVL30: + .loc 1 301 0 discriminator 3 + ldr x1, [x19, -52] + adrp x0, .LC5 + add x0, x0, :lo12:.LC5 + bl printf +.LVL31: + .loc 1 302 0 discriminator 3 + ldr w1, [x19, -44] + adrp x0, .LC6 + add x0, x0, :lo12:.LC6 + bl printf +.LVL32: + .loc 1 303 0 discriminator 3 + ldr w1, [x19, -28] + adrp x0, .LC7 + add x0, x0, :lo12:.LC7 + bl printf +.LVL33: + .loc 1 304 0 discriminator 3 + ldr x1, [x19, -20] + adrp x0, .LC8 + add x0, x0, :lo12:.LC8 + bl printf +.LVL34: + .loc 1 305 0 discriminator 3 + ldr w1, [x19, -36] + adrp x0, .LC9 + add x0, x0, :lo12:.LC9 + bl printf +.LVL35: + .loc 1 306 0 discriminator 3 + ldr w1, [x19, -32] + adrp x0, .LC10 + add x0, x0, :lo12:.LC10 + bl printf +.LVL36: +.L46: + .loc 1 297 0 discriminator 1 + ldrb w0, [x20, 308] + cmp w22, w0 + blt .L44 + .loc 1 296 0 discriminator 2 + add w21, w21, 1 +.LVL37: + add x20, x20, 328 + cmp w21, 4 + bne .L43 + .loc 1 310 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL38: + ldp x23, x24, [sp, 48] + ldr x25, [sp, 64] + ldp x29, x30, [sp], 80 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE227: + .size mpb_task_dump, .-mpb_task_dump + .section .text.core_task_run.part.2,"ax",@progbits + .align 2 + .type core_task_run.part.2, %function +core_task_run.part.2: +.LFB242: + .loc 1 370 0 + .cfi_startproc +.LVL39: + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + mov w19, w0 + stp x21, x22, [sp, 32] + mov w20, w2 +.LVL40: + stp x23, x24, [sp, 48] + .cfi_offset 21, -48 + .cfi_offset 22, -40 + .cfi_offset 23, -32 + .cfi_offset 24, -24 + and x22, x1, 255 + stp x25, x26, [sp, 64] + .cfi_offset 25, -16 + .cfi_offset 26, -8 +.LBB52: +.LBB53: + .loc 1 319 0 + cbz w3, .L49 + mov w25, w3 + mov w23, 0 + mov w21, 0 + .loc 1 324 0 + mov w26, 1 +.LVL41: +.L54: + lsl w0, w26, w21 + tst w0, w25 + beq .L50 +.L51: + .loc 1 319 0 + mov w24, 20000 +.L52: +.LVL42: + .loc 1 329 0 + mov w0, w21 + bl mpb_task_is_done +.LVL43: + cbz w0, .L53 + .loc 1 344 0 + mov w0, w21 + bl mpb_task_is_done +.LVL44: + .loc 1 345 0 + cmp w0, 0 + cinc w23, w23, lt +.LVL45: +.L50: + .loc 1 323 0 + add w21, w21, 1 +.LVL46: + cmp w21, 8 + bne .L54 +.LVL47: +.LBE53: +.LBE52: + .loc 1 387 0 + cbz w23, .L49 +.LVL48: + .loc 1 389 0 + uxtw x1, w19 + mov x2, 328 + sxtw x0, w22 + mul x1, x1, x2 + mov x2, 40 + madd x0, x0, x2, x1 + mov x1, 136314880 + add x0, x1, x0 + ldr w0, [x0, 28] + cbnz w0, .L55 +.LVL49: +.L56: + .loc 1 410 0 + mov w2, w20 + mov w1, w19 + adrp x0, .LC12 + add x0, x0, :lo12:.LC12 + bl printf +.LVL50: + .loc 1 374 0 + mov w21, 0 + .loc 1 411 0 + mov w2, 1431655765 + mov w1, w20 + mov w0, w19 + bl mpb_task_set_state +.LVL51: + b .L62 +.LVL52: +.L53: +.LBB55: +.LBB54: + .loc 1 330 0 + mov x0, 100 + bl udelay +.LVL53: + .loc 1 333 0 + subs w24, w24, #1 +.LVL54: + bne .L52 +.LVL55: + .loc 1 337 0 + bl mpb_task_dump +.LVL56: + b .L51 +.LVL57: +.L49: +.LBE54: +.LBE55: + .loc 1 392 0 + uxtw x1, w19 + mov x2, 328 + sxtw x0, w22 + mul x1, x1, x2 + mov x2, 40 + madd x0, x0, x2, x1 + mov x1, 136314880 + add x0, x1, x0 + ldr w0, [x0, 28] + cbnz w0, .L56 +.L55: +.LVL58: + .loc 1 397 0 + mov w2, w20 + mov w1, w19 + adrp x0, .LC13 + add x0, x0, :lo12:.LC13 + bl printf +.LVL59: + .loc 1 401 0 + uxtw x24, w19 + .loc 1 398 0 + bl get_ticks +.LVL60: + mov x23, x0 +.LVL61: + .loc 1 400 0 + mov w2, 286331153 + mov w1, w20 + mov w0, w19 +.LVL62: + bl mpb_task_set_state +.LVL63: + .loc 1 401 0 + mov x1, 328 + mov x0, 40 + mul x1, x24, x1 + madd x1, x22, x0, x1 + mov x0, 8 + movk x0, 0x820, lsl 16 + ldr x1, [x0, x1] + mov x0, 1320 + movk x0, 0x820, lsl 16 + blr x1 +.LVL64: + mov w21, w0 +.LVL65: + .loc 1 402 0 + cbnz w0, .L63 + .loc 1 405 0 + mov w2, -559087616 + b .L81 +.L63: + .loc 1 403 0 + mov w2, -65536 +.L81: + .loc 1 405 0 + mov w1, w20 + mov w0, w19 +.LVL66: + bl mpb_task_set_state +.LVL67: + .loc 1 407 0 + bl get_ticks +.LVL68: + sub x0, x0, x23 + mov x4, 24000 + .loc 1 408 0 + mov w3, w21 + mov w2, w20 + mov w1, w19 + .loc 1 407 0 + udiv x4, x0, x4 + mov x0, 328 + mul x0, x24, x0 + mov x24, 40 + madd x24, x22, x24, x0 + mov x22, 40 +.LVL69: + movk x22, 0x820, lsl 16 + .loc 1 408 0 + adrp x0, .LC11 + add x0, x0, :lo12:.LC11 + .loc 1 407 0 + str x4, [x22, x24] + .loc 1 408 0 + bl printf +.LVL70: +.L62: +.LBB56: +.LBB57: +.LBB58: +.LBB59: + .loc 1 146 0 + mov x0, 136314880 + mov w1, 1 + lsl w1, w1, w20 + ldr w2, [x0] +.LBE59: +.LBE58: + .loc 1 212 0 + tst w1, w2 + beq .L48 +.LBB60: +.LBB61: + .loc 1 199 0 + uxtw x3, w19 + mov x1, 328 + umull x19, w19, w1 +.LVL71: + madd x0, x3, x1, x0 + mov w1, 0 + ldrb w2, [x0, 328] + mov x0, 20 + movk x0, 0x820, lsl 16 + add x0, x19, x0 +.L59: +.LVL72: + cmp w1, w2 + blt .L61 +.LVL73: +.L48: +.LBE61: +.LBE60: +.LBE57: +.LBE56: + .loc 1 417 0 + ldp x19, x20, [sp, 16] +.LVL74: + ldp x21, x22, [sp, 32] +.LVL75: + ldp x23, x24, [sp, 48] + ldp x25, x26, [sp, 64] + ldp x29, x30, [sp], 80 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL76: +.L61: + .cfi_restore_state +.LBB69: +.LBB64: +.LBB63: +.LBB62: + .loc 1 200 0 + ldr w4, [x0], 40 + cmp w20, w4 + beq .L60 + .loc 1 199 0 + add w1, w1, 1 +.LVL77: + b .L59 +.L60: +.LVL78: +.LBE62: +.LBE63: + .loc 1 219 0 + sxtw x2, w1 + mov x5, 328 + mov x4, 40 + .loc 1 220 0 + add x19, x19, 32 + .loc 1 219 0 + mul x3, x3, x5 + mov x0, 136314880 + madd x2, x2, x4, x3 + .loc 1 220 0 + smaddl x19, w1, w4, x19 + .loc 1 219 0 + add x2, x0, x2 +.LBE64: +.LBE69: + .loc 1 417 0 + ldp x23, x24, [sp, 48] +.LBB70: +.LBB65: + .loc 1 220 0 + add x0, x19, x0 +.LBE65: +.LBE70: + .loc 1 417 0 + ldp x25, x26, [sp, 64] +.LBB71: +.LBB66: + .loc 1 221 0 + add x1, x0, 4 +.LBE66: +.LBE71: + .loc 1 417 0 + ldp x19, x20, [sp, 16] +.LVL79: +.LBB72: +.LBB67: + .loc 1 219 0 + str w21, [x2, 32] +.LBE67: +.LBE72: + .loc 1 417 0 + ldp x21, x22, [sp, 32] +.LVL80: + ldp x29, x30, [sp], 80 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 +.LBB73: +.LBB68: + .loc 1 221 0 + b flush_dcache_range +.LVL81: +.LBE68: +.LBE73: + .cfi_endproc +.LFE242: + .size core_task_run.part.2, .-core_task_run.part.2 + .section .text.mpb_task_wait_done,"ax",@progbits + .align 2 + .global mpb_task_wait_done + .type mpb_task_wait_done, %function +mpb_task_wait_done: +.LFB230: + .loc 1 366 0 + .cfi_startproc +.LVL82: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 + mov w19, w0 +.LVL83: +.L84: +.LBB78: +.LBB79: + .loc 1 355 0 + mov w0, w19 + bl mpb_task_is_done +.LVL84: + cbnz w0, .L83 +.LVL85: +.LBB80: +.LBB81: + .file 2 "include/linux/delay.h" + .loc 2 16 0 + mov x0, 1000 + bl udelay +.LVL86: + mov x0, 1000 + bl udelay +.LVL87: + b .L84 +.L83: +.LBE81: +.LBE80: + .loc 1 362 0 + mov w0, w19 +.LBE79: +.LBE78: + .loc 1 368 0 + ldr x19, [sp, 16] +.LVL88: + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 +.LBB83: +.LBB82: + .loc 1 362 0 + b mpb_task_is_done +.LVL89: +.LBE82: +.LBE83: + .cfi_endproc +.LFE230: + .size mpb_task_wait_done, .-mpb_task_wait_done + .section .text.mpb_task_run,"ax",@progbits + .align 2 + .global mpb_task_run + .type mpb_task_run, %function +mpb_task_run: +.LFB232: + .loc 1 420 0 + .cfi_startproc +.LVL90: + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 +.LBB90: +.LBB91: + .loc 1 146 0 + mov x3, 136314880 +.LBE91: +.LBE90: + .loc 1 420 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x23, x24, [sp, 48] + .cfi_offset 23, -32 + .cfi_offset 24, -24 +.LBB93: +.LBB92: + .loc 1 146 0 + mov w24, 1 + ldr w2, [x3] + lsl w24, w24, w1 +.LVL91: +.LBE92: +.LBE93: + .loc 1 420 0 + stp x19, x20, [sp, 16] + stp x21, x22, [sp, 32] + .loc 1 424 0 + tst w24, w2 + .loc 1 420 0 + str x25, [sp, 64] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + .cfi_offset 21, -48 + .cfi_offset 22, -40 + .cfi_offset 25, -16 + .loc 1 424 0 + beq .L86 + .loc 1 424 0 is_stmt 0 discriminator 1 + cbz w1, .L86 + uxtw x25, w0 +.LVL92: + .loc 1 421 0 is_stmt 1 + mov w19, 328 + mov x0, 8 +.LVL93: + mov x22, x25 + mov w21, w1 + .loc 1 427 0 + mov x20, x3 + .loc 1 421 0 + umaddl x19, w25, w19, x0 + .loc 1 427 0 + mov x0, 328 + .loc 1 421 0 + mov w23, 0 + .loc 1 427 0 + madd x25, x25, x0, x3 +.LVL94: + .loc 1 421 0 + add x19, x19, x3 +.LVL95: +.L89: + .loc 1 427 0 discriminator 1 + ldrb w0, [x25, 328] + cmp w23, w0 + blt .L91 +.LVL96: +.L86: + .loc 1 431 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] + ldr x25, [sp, 64] + ldp x29, x30, [sp], 80 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL97: +.L91: + .cfi_restore_state + .loc 1 428 0 + ldr w0, [x19, 12] + cmp w21, w0 + bne .L90 + .loc 1 428 0 is_stmt 0 discriminator 1 + ldr x0, [x19] + cbz x0, .L90 +.LVL98: +.LBB94: +.LBB95: +.LBB96: +.LBB97: + .loc 1 146 0 is_stmt 1 + ldr w0, [x20] +.LBE97: +.LBE96: + .loc 1 377 0 + tst w24, w0 + beq .L90 + ldr w3, [x19, 16] + mov w2, w21 + mov w1, w23 + mov w0, w22 + bl core_task_run.part.2 +.LVL99: +.L90: +.LBE95: +.LBE94: + .loc 1 427 0 discriminator 2 + add w23, w23, 1 +.LVL100: + add x19, x19, 40 + b .L89 + .cfi_endproc +.LFE232: + .size mpb_task_run, .-mpb_task_run + .section .text.core_main,"ax",@progbits + .align 2 + .global core_main + .type core_main, %function +core_main: +.LFB233: + .loc 1 434 0 + .cfi_startproc +.LVL101: + stp x29, x30, [sp, -64]! + .cfi_def_cfa_offset 64 + .cfi_offset 29, -64 + .cfi_offset 30, -56 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x21, x22, [sp, 32] + .cfi_offset 21, -32 + .cfi_offset 22, -24 + uxtw x22, w0 + stp x19, x20, [sp, 16] + .loc 1 435 0 + mov x0, 8 +.LVL102: + .cfi_offset 19, -48 + .cfi_offset 20, -40 + mov w19, 328 + mov x20, 136314880 + .loc 1 434 0 + stp x23, x24, [sp, 48] + .cfi_offset 23, -16 + .cfi_offset 24, -8 + .loc 1 434 0 + mov x23, x22 +.LVL103: + .loc 1 435 0 + umaddl x19, w22, w19, x0 + .loc 1 438 0 + mov x0, 328 + mov w21, 0 +.LBB102: +.LBB103: +.LBB104: +.LBB105: + .loc 1 146 0 + mov w24, 1 +.LBE105: +.LBE104: +.LBE103: +.LBE102: + .loc 1 438 0 + madd x22, x22, x0, x20 +.LVL104: + .loc 1 435 0 + add x19, x19, x20 +.LVL105: +.L103: + .loc 1 438 0 discriminator 1 + ldrb w0, [x22, 328] + cmp w21, w0 + blt .L105 + .loc 1 442 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL106: + ldp x23, x24, [sp, 48] +.LVL107: + ldp x29, x30, [sp], 64 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL108: +.L105: + .cfi_restore_state + .loc 1 439 0 + ldr x0, [x19] + cbz x0, .L104 + .loc 1 440 0 + ldr w2, [x19, 12] +.LVL109: +.LBB109: +.LBB108: +.LBB107: +.LBB106: + .loc 1 146 0 + ldr w0, [x20] + lsl w1, w24, w2 +.LBE106: +.LBE107: + .loc 1 377 0 + tst w1, w0 + beq .L104 + ldr w3, [x19, 16] + mov w1, w21 + mov w0, w23 + bl core_task_run.part.2 +.LVL110: +.L104: +.LBE108: +.LBE109: + .loc 1 438 0 discriminator 2 + add w21, w21, 1 +.LVL111: + add x19, x19, 40 + b .L103 + .cfi_endproc +.LFE233: + .size core_main, .-core_main + .section .text.smp_entry,"ax",@progbits + .align 2 + .global smp_entry + .type smp_entry, %function +smp_entry: +.LFB234: + .loc 1 448 0 + .cfi_startproc +.LVL112: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 + .loc 1 448 0 + mov w19, w0 + .loc 1 450 0 + adrp x0, .LANCHOR2 +.LVL113: + ldr x0, [x0, #:lo12:.LANCHOR2] +.LVL114: +.LBB110: +.LBB111: + .loc 1 131 0 +#APP +// 131 "common/mp_boot.c" 1 + mov x18, x0 + +// 0 "" 2 +.LVL115: +#NO_APP +.LBE111: +.LBE110: + .loc 1 451 0 + bl dcache_enable +.LVL116: + .loc 1 455 0 + cmp w19, 1 + bne .L114 +.L118: + .loc 1 460 0 + mov w0, w19 + bl core_main +.LVL117: + b .L115 +.L114: + .loc 1 459 0 + cmp w19, 2 + beq .L118 +.L115: + .loc 1 468 0 + bl flush_dcache_all +.LVL118: + .loc 1 469 0 + bl disable_interrupts +.LVL119: +.LBB112: +.LBB113: + .file 3 "./arch/arm/include/asm/system.h" + .loc 3 193 0 +#APP +// 193 "./arch/arm/include/asm/system.h" 1 + msr daifset, #0x04 +// 0 "" 2 +#NO_APP +.LBE113: +.LBE112: + .loc 1 471 0 + bl icache_disable +.LVL120: + .loc 1 472 0 + bl invalidate_icache_all +.LVL121: + .loc 1 473 0 + bl dcache_disable +.LVL122: +.LBB114: +.LBB115: + .loc 1 138 0 +#APP +// 138 "common/mp_boot.c" 1 + mrs x0, S3_1_c15_c2_1 +// 0 "" 2 + .loc 1 139 0 +// 139 "common/mp_boot.c" 1 + bic x0, x0, #0x40 +// 0 "" 2 + .loc 1 140 0 +// 140 "common/mp_boot.c" 1 + msr S3_1_c15_c2_1, x0 +// 0 "" 2 +#NO_APP +.LBE115: +.LBE114: + .loc 1 475 0 + bl invalidate_dcache_all +.LVL123: + .loc 1 478 0 +#APP +// 478 "common/mp_boot.c" 1 + dsb sy +// 0 "" 2 + .loc 1 479 0 +// 479 "common/mp_boot.c" 1 + isb sy +// 0 "" 2 +#NO_APP +.L116: + .loc 1 481 0 discriminator 1 +#APP +// 481 "common/mp_boot.c" 1 + wfe +// 0 "" 2 +#NO_APP + b .L116 + .cfi_endproc +.LFE234: + .size smp_entry, .-smp_entry + .section .text.mpb_init_1,"ax",@progbits + .align 2 + .global mpb_init_1 + .type mpb_init_1, %function +mpb_init_1: +.LFB236: + .loc 1 527 0 + .cfi_startproc + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 528 0 + mov x2, 40 + mov x1, x0 + mov x0, 1320 + .loc 1 527 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 528 0 + movk x0, 0x820, lsl 16 + .loc 1 527 0 + .loc 1 528 0 + bl memcpy +.LVL124: + .loc 1 530 0 + mov w1, 2 + mov w0, 0 + bl mpb_task_run +.LVL125: + .loc 1 531 0 + mov w2, 286331153 + mov w1, 3 + mov w0, 0 + bl mpb_task_set_state +.LVL126: + .loc 1 532 0 + bl flush_dcache_all +.LVL127: + .loc 1 533 0 +#APP +// 533 "common/mp_boot.c" 1 + dsb sy +// 0 "" 2 + .loc 1 534 0 +// 534 "common/mp_boot.c" 1 + isb sy +// 0 "" 2 + .loc 1 535 0 +#NO_APP + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE236: + .size mpb_init_1, .-mpb_init_1 + .section .text.mpb_init_x,"ax",@progbits + .align 2 + .global mpb_init_x + .type mpb_init_x, %function +mpb_init_x: +.LFB237: + .loc 1 538 0 + .cfi_startproc +.LVL128: + stp x29, x30, [sp, -64]! + .cfi_def_cfa_offset 64 + .cfi_offset 29, -64 + .cfi_offset 30, -56 + .loc 1 539 0 + cmp w0, 2 + .loc 1 538 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 539 0 + beq .L123 + cmp w0, 3 + beq .L124 + cbnz w0, .L121 +.LBB124: +.LBB125: + .loc 1 494 0 + adrp x1, .LANCHOR3 + add x1, x1, :lo12:.LANCHOR3 + mov x2, 48 + add x0, x29, 16 +.LVL129: + bl memcpy +.LVL130: + .loc 1 509 0 + adrp x0, .LC14 + add x0, x0, :lo12:.LC14 + bl printf +.LVL131: + .loc 1 511 0 + mov x2, 1376 + mov w1, 0 + mov x0, 136314880 + bl memset +.LVL132: + .loc 1 512 0 + adrp x0, .LANCHOR2 + add x6, x29, 64 +.LBB126: +.LBB127: + .loc 1 177 0 + mov x4, 136314880 + mov x7, 328 +.LBE127: +.LBE126: + .loc 1 512 0 + str x18, [x0, #:lo12:.LANCHOR2] +.LVL133: + add x0, x29, 16 +.LBB130: +.LBB128: + .loc 1 179 0 + mov x8, 40 + .loc 1 185 0 + mov w10, 1 +.LVL134: +.L126: +.LBE128: +.LBE130: + .loc 1 514 0 + cmp x6, x0 + bne .L128 + .loc 1 517 0 + bl flush_dcache_all +.LVL135: +.LBB131: + .loc 1 518 0 +#APP +// 518 "common/mp_boot.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov x1, 8 + adrp x0, save_boot_params_ret + movk x1, 0xfe48, lsl 16 + add x0, x0, :lo12:save_boot_params_ret + str w0, [x1] +.LVL136: +.LBE131: +.LBB132: + .loc 1 519 0 +#APP +// 519 "common/mp_boot.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov x0, 4 + mov w1, 48815 + movk x0, 0xfe48, lsl 16 + movk w1, 0xdead, lsl 16 + str w1, [x0] +.LBE132: + .loc 1 520 0 +#APP +// 520 "common/mp_boot.c" 1 + dsb sy +// 0 "" 2 + .loc 1 522 0 +// 522 "common/mp_boot.c" 1 + sev +// 0 "" 2 + .loc 1 523 0 +// 523 "common/mp_boot.c" 1 + isb sy +// 0 "" 2 +.LVL137: +#NO_APP +.L121: +.LBE125: +.LBE124: + .loc 1 556 0 + ldp x29, x30, [sp], 64 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret +.L128: + .cfi_restore_state + ldp w1, w3, [x0] +.LVL138: + ldp w12, w11, [x0, 16] +.LBB135: +.LBB134: +.LBB133: +.LBB129: + .loc 1 172 0 + cmp w1, 3 + ldr x13, [x0, 8] +.LVL139: + beq .L127 + .loc 1 176 0 + sub w2, w3, #1 + cmp w2, 6 + bhi .L127 +.LVL140: + .loc 1 177 0 + uxtw x1, w1 + mul x2, x1, x7 + add x5, x4, x2 + .loc 1 179 0 + ldrb w1, [x5, 328] +.LVL141: + madd x1, x1, x8, x2 + add x1, x4, x1 + .loc 1 181 0 + stp w3, w12, [x1, 20] +.LVL142: + .loc 1 185 0 + lsl w3, w10, w3 +.LVL143: + .loc 1 183 0 + stp w11, wzr, [x1, 28] + .loc 1 179 0 + str x13, [x1, 8] + .loc 1 184 0 + str xzr, [x1, 40] + .loc 1 185 0 + ldr w1, [x4] +.LVL144: + orr w3, w1, w3 + str w3, [x4] + .loc 1 186 0 + ldrb w1, [x5, 328] + add w1, w1, 1 + strb w1, [x5, 328] +.L127: + add x0, x0, 24 + b .L126 +.LVL145: +.L123: +.LBE129: +.LBE133: +.LBE134: +.LBE135: + .loc 1 544 0 + mov w2, -559087616 + mov w1, 3 + mov w0, 0 +.LVL146: + bl mpb_task_set_state +.LVL147: + .loc 1 545 0 + bl flush_dcache_all +.LVL148: + .loc 1 546 0 +#APP +// 546 "common/mp_boot.c" 1 + dsb sy +// 0 "" 2 + .loc 1 547 0 +// 547 "common/mp_boot.c" 1 + isb sy +// 0 "" 2 +.LVL149: + .loc 1 556 0 +#NO_APP + ldp x29, x30, [sp], 64 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 +.LBB136: +.LBB137: + .loc 2 16 0 + mov x0, 1000 + b udelay +.LVL150: +.L124: + .cfi_restore_state +.LBE137: +.LBE136: + .loc 1 556 0 + ldp x29, x30, [sp], 64 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + .loc 1 553 0 + mov w2, -559087616 + mov w1, 7 + mov w0, 0 +.LVL151: + b mpb_task_set_state +.LVL152: + .cfi_endproc +.LFE237: + .size mpb_init_x, .-mpb_init_x + .section .text.mpb_post,"ax",@progbits + .align 2 + .global mpb_post + .type mpb_post, %function +mpb_post: +.LFB239: + .loc 1 576 0 + .cfi_startproc +.LVL153: + .loc 1 580 0 + cmp w0, 5 + bhi .L147 + .loc 1 576 0 + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + .loc 1 580 0 + adrp x1, .L136 + add x1, x1, :lo12:.L136 + .loc 1 576 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 580 0 + ldrb w0, [x1,w0,uxtw] + adr x1, .Lrtx136 + add x0, x1, w0, sxtb #2 + br x0 +.Lrtx136: +.LVL154: + .section .rodata.mpb_post,"a",@progbits + .align 0 + .align 2 +.L136: + .byte (.L135 - .Lrtx136) / 4 + .byte (.L137 - .Lrtx136) / 4 + .byte (.L138 - .Lrtx136) / 4 + .byte (.L139 - .Lrtx136) / 4 + .byte (.L140 - .Lrtx136) / 4 + .byte (.L141 - .Lrtx136) / 4 + .section .text.mpb_post +.L135: + .loc 1 582 0 + mov w0, 5 +.L155: + .loc 1 602 0 + bl mpb_task_wait_done +.LVL155: + sxtw x0, w0 + b .L133 +.L137: +.LVL156: + .loc 1 586 0 + mov w0, 5 + bl mpb_task_wait_done +.LVL157: + .loc 1 587 0 + bl mpb_quit_load_image +.LVL158: + cbz w0, .L142 +.LVL159: +.L156: + .loc 1 621 0 + mov x0, 0 + .loc 1 617 0 + b .L133 +.LVL160: +.L142: + .loc 1 587 0 discriminator 1 + mov x0, 136314880 + ldr x0, [x0, 1360] +.LVL161: +.L133: + .loc 1 622 0 + ldp x29, x30, [sp], 48 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret +.L138: + .cfi_restore_state + .loc 1 590 0 + bl mpb_quit_load_image +.LVL162: + cbnz w0, .L156 + .loc 1 590 0 is_stmt 0 discriminator 1 + mov x0, 136314880 + ldr x0, [x0, 1368] + b .L133 +.L139: + .loc 1 594 0 is_stmt 1 + bl mpb_quit_load_image +.LVL163: + cbz w0, .L156 + .loc 1 596 0 + mov w0, 6 + bl mpb_task_wait_done +.LVL164: + .loc 1 597 0 + mov x0, 1 + b .L133 +.L140: + .loc 1 602 0 + mov w0, 6 + b .L155 +.L141: + .loc 1 605 0 + bl mpb_quit_load_image +.LVL165: + cbnz w0, .L156 +.LVL166: + .loc 1 609 0 + mov w0, 5 + bl mpb_task_wait_done +.LVL167: + cmp w0, 0 + ble .L144 +.L146: + .loc 1 611 0 + mov x0, 136314880 + adrp x2, .LC15 + add x2, x2, :lo12:.LC15 + mov x1, 32 + ldr x3, [x0, 1360] + add x0, x29, 16 + bl snprintf +.LVL168: + .loc 1 612 0 + mov w1, 0 + add x0, x29, 16 + bl run_command +.LVL169: +.L145: + .loc 1 616 0 + bl mpb_task_dump +.LVL170: + b .L156 +.L144: + .loc 1 610 0 discriminator 1 + mov w0, 4 + bl mpb_task_wait_done +.LVL171: + .loc 1 609 0 discriminator 1 + cmp w0, 0 + bgt .L146 + b .L145 +.LVL172: +.L147: + .cfi_def_cfa 31, 0 + .cfi_restore 29 + .cfi_restore 30 + .loc 1 621 0 + mov x0, 0 +.LVL173: + ret + .cfi_endproc +.LFE239: + .size mpb_post, .-mpb_post + .section .rodata + .align 3 + .set .LANCHOR3,. + 0 +.LC0: + .word 0 + .word 2 + .xword spl_load_baseparamter + .word 0 + .word 0 + .word 2 + .word 1 + .xword spl_init_display + .word 0 + .word 0 + .section .bss.mpb_gd,"aw",@nobits + .align 3 + .set .LANCHOR2,. + 0 + .type mpb_gd, %object + .size mpb_gd, 8 +mpb_gd: + .zero 8 + .section .bss.once.6657,"aw",@nobits + .align 2 + .set .LANCHOR0,. + 0 + .type once.6657, %object + .size once.6657, 4 +once.6657: + .zero 4 + .section .rodata.core_task_run.part.2.str1.1,"aMS",@progbits,1 +.LC11: + .string "-- T%d.%d [%d, %ld]\n" +.LC12: + .string "++ T%d.%d -\n" +.LC13: + .string "++ T%d.%d\n" + .section .rodata.mpb_init_x.str1.1,"aMS",@progbits,1 +.LC14: + .string "U-Boot SPL MP\n" + .section .rodata.mpb_post.str1.1,"aMS",@progbits,1 +.LC15: + .string "bootm 0x%lx" + .section .rodata.mpb_quit_load_image.str1.1,"aMS",@progbits,1 +.LC1: + .string "++ serial boot\n" + .section .rodata.mpb_task_dump.str1.1,"aMS",@progbits,1 +.LC2: + .string "data: %08lx, %08lx\n" +.LC3: + .string "T%d.%d:[%s]\n" +.LC4: + .string " tid: %d\n" +.LC5: + .string " fn: 0x%08lx\n" +.LC6: + .string " state: 0x%08x\n" +.LC7: + .string " ret: %d\n" +.LC8: + .string " ms: %ld\n" +.LC9: + .string " ptid_mask: 0x%08x\n" +.LC10: + .string " rip_fail: %d\n\n" + .section .rodata.str1.1,"aMS",@progbits,1 +.LC16: + .string "none" +.LC17: + .string "init-display" +.LC18: + .string "load-baseparameter" +.LC19: + .string "load-uboot" +.LC20: + .string "load-fit" +.LC21: + .string "load-android" +.LC22: + .string "hash-android" +.LC23: + .string "run-uboot" + .section .rodata.tid_name,"a",@progbits + .align 3 + .set .LANCHOR1,. + 0 + .type tid_name, %object + .size tid_name, 64 +tid_name: + .xword .LC16 + .xword .LC17 + .xword .LC18 + .xword .LC19 + .xword .LC20 + .xword .LC21 + .xword .LC22 + .xword .LC23 + .text +.Letext0: + .file 4 "include/common.h" + .file 5 "./arch/arm/include/asm/types.h" + .file 6 "include/linux/types.h" + .file 7 "include/errno.h" + .file 8 "include/linux/string.h" + .file 9 "include/efi.h" + .file 10 "include/ide.h" + .file 11 "include/linux/list.h" + .file 12 "include/part.h" + .file 13 "include/flash.h" + .file 14 "include/lmb.h" + .file 15 "include/asm-generic/u-boot.h" + .file 16 "./arch/arm/include/asm/u-boot-arm.h" + .file 17 "include/linux/libfdt_env.h" + .file 18 "include/linux/../../scripts/dtc/libfdt/fdt.h" + .file 19 "include/linux/libfdt.h" + .file 20 "include/image.h" + .file 21 "./arch/arm/include/asm/global_data.h" + .file 22 "include/asm-generic/global_data.h" + .file 23 "include/net.h" + .file 24 "include/dm/uclass-id.h" + .file 25 "./arch/arm/include/asm/spl.h" + .file 26 "include/spl.h" + .file 27 "include/mp_boot.h" + .file 28 "include/boot_rkimg.h" + .file 29 "include/log.h" + .file 30 "include/vsprintf.h" + .file 31 "include/stdio.h" + .section .debug_info,"",@progbits +.Ldebug_info0: + .4byte 0x2575 + .2byte 0x4 + .4byte .Ldebug_abbrev0 + .byte 0x8 + .uleb128 0x1 + .4byte .LASF447 + .byte 0xc + .4byte .LASF448 + .4byte .LASF449 + .4byte .Ldebug_ranges0+0x230 + .8byte 0 + .4byte .Ldebug_line0 + .uleb128 0x2 + .4byte .LASF4 + .byte 0x4 + .byte 0xd + .4byte 0x34 + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF0 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF1 + .uleb128 0x3 + .byte 0x2 + .byte 0x7 + .4byte .LASF2 + .uleb128 0x4 + .4byte .LASF20 + .byte 0x7 + .byte 0xc + .4byte 0x54 + .uleb128 0x5 + .byte 0x4 + .byte 0x5 + .string "int" + .uleb128 0x3 + .byte 0x1 + .byte 0x6 + .4byte .LASF3 + .uleb128 0x2 + .4byte .LASF5 + .byte 0x5 + .byte 0xc + .4byte 0x34 + .uleb128 0x3 + .byte 0x2 + .byte 0x5 + .4byte .LASF6 + .uleb128 0x2 + .4byte .LASF7 + .byte 0x5 + .byte 0x12 + .4byte 0x7f + .uleb128 0x3 + .byte 0x4 + .byte 0x7 + .4byte .LASF8 + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF9 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF10 + .uleb128 0x6 + .string "u8" + .byte 0x5 + .byte 0x1f + .4byte 0x34 + .uleb128 0x7 + .4byte 0x94 + .uleb128 0x6 + .string "u32" + .byte 0x5 + .byte 0x25 + .4byte 0x7f + .uleb128 0x6 + .string "u64" + .byte 0x5 + .byte 0x28 + .4byte 0x8d + .uleb128 0x2 + .4byte .LASF11 + .byte 0x5 + .byte 0x31 + .4byte 0x8d + .uleb128 0x2 + .4byte .LASF12 + .byte 0x5 + .byte 0x32 + .4byte 0x8d + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF13 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe3 + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF14 + .uleb128 0x7 + .4byte 0xdc + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF15 + .uleb128 0x8 + .byte 0x8 + .4byte 0xdc + .uleb128 0x2 + .4byte .LASF16 + .byte 0x6 + .byte 0x59 + .4byte 0x42 + .uleb128 0x2 + .4byte .LASF17 + .byte 0x6 + .byte 0x5b + .4byte 0x3b + .uleb128 0x9 + .4byte 0x100 + .uleb128 0x2 + .4byte .LASF18 + .byte 0x6 + .byte 0x69 + .4byte 0x62 + .uleb128 0x2 + .4byte .LASF19 + .byte 0x6 + .byte 0x97 + .4byte 0x74 + .uleb128 0xa + .byte 0x8 + .uleb128 0x4 + .4byte .LASF21 + .byte 0x8 + .byte 0xb + .4byte 0xef + .uleb128 0x3 + .byte 0x1 + .byte 0x2 + .4byte .LASF22 + .uleb128 0xb + .4byte 0xdc + .4byte 0x145 + .uleb128 0xc + .byte 0 + .uleb128 0xd + .4byte .LASF23 + .byte 0x9 + .2byte 0x140 + .4byte 0x13a + .uleb128 0xd + .4byte .LASF24 + .byte 0x9 + .2byte 0x143 + .4byte 0x13a + .uleb128 0xd + .4byte .LASF25 + .byte 0x9 + .2byte 0x143 + .4byte 0x13a + .uleb128 0xe + .4byte .LASF38 + .uleb128 0x8 + .byte 0x8 + .4byte 0x169 + .uleb128 0x8 + .byte 0x8 + .4byte 0x17a + .uleb128 0xf + .uleb128 0xb + .4byte 0x100 + .4byte 0x186 + .uleb128 0xc + .byte 0 + .uleb128 0x4 + .4byte .LASF26 + .byte 0xa + .byte 0x10 + .4byte 0x17b + .uleb128 0xb + .4byte 0x34 + .4byte 0x1a1 + .uleb128 0x10 + .4byte 0xcf + .byte 0x5 + .byte 0 + .uleb128 0x11 + .4byte .LASF29 + .byte 0x10 + .byte 0xb + .byte 0x16 + .4byte 0x1c6 + .uleb128 0x12 + .4byte .LASF27 + .byte 0xb + .byte 0x17 + .4byte 0x1c6 + .byte 0 + .uleb128 0x12 + .4byte .LASF28 + .byte 0xb + .byte 0x17 + .4byte 0x1c6 + .byte 0x8 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1a1 + .uleb128 0x11 + .4byte .LASF30 + .byte 0x10 + .byte 0xc + .byte 0xf + .4byte 0x1f1 + .uleb128 0x12 + .4byte .LASF31 + .byte 0xc + .byte 0x10 + .4byte 0xef + .byte 0 + .uleb128 0x12 + .4byte .LASF32 + .byte 0xc + .byte 0x11 + .4byte 0x20a + .byte 0x8 + .byte 0 + .uleb128 0x7 + .4byte 0x1cc + .uleb128 0x13 + .4byte 0x54 + .4byte 0x20a + .uleb128 0x14 + .4byte 0x54 + .uleb128 0x14 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1f6 + .uleb128 0xb + .4byte 0x1f1 + .4byte 0x21b + .uleb128 0xc + .byte 0 + .uleb128 0x7 + .4byte 0x210 + .uleb128 0x4 + .4byte .LASF30 + .byte 0xc + .byte 0xe1 + .4byte 0x21b + .uleb128 0x15 + .2byte 0x1220 + .byte 0xd + .byte 0x13 + .4byte 0x27f + .uleb128 0x12 + .4byte .LASF33 + .byte 0xd + .byte 0x14 + .4byte 0x100 + .byte 0 + .uleb128 0x12 + .4byte .LASF34 + .byte 0xd + .byte 0x15 + .4byte 0xf5 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF35 + .byte 0xd + .byte 0x16 + .4byte 0x100 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF36 + .byte 0xd + .byte 0x17 + .4byte 0x27f + .byte 0x18 + .uleb128 0x16 + .4byte .LASF37 + .byte 0xd + .byte 0x18 + .4byte 0x290 + .2byte 0x1018 + .uleb128 0x17 + .string "mtd" + .byte 0xd + .byte 0x31 + .4byte 0x2a6 + .2byte 0x1218 + .byte 0 + .uleb128 0xb + .4byte 0x100 + .4byte 0x290 + .uleb128 0x18 + .4byte 0xcf + .2byte 0x1ff + .byte 0 + .uleb128 0xb + .4byte 0x29 + .4byte 0x2a1 + .uleb128 0x18 + .4byte 0xcf + .2byte 0x1ff + .byte 0 + .uleb128 0xe + .4byte .LASF39 + .uleb128 0x8 + .byte 0x8 + .4byte 0x2a1 + .uleb128 0x2 + .4byte .LASF40 + .byte 0xd + .byte 0x37 + .4byte 0x22b + .uleb128 0xb + .4byte 0x2ac + .4byte 0x2c2 + .uleb128 0xc + .byte 0 + .uleb128 0x4 + .4byte .LASF41 + .byte 0xd + .byte 0x39 + .4byte 0x2b7 + .uleb128 0x3 + .byte 0x10 + .byte 0x4 + .4byte .LASF42 + .uleb128 0x11 + .4byte .LASF43 + .byte 0x10 + .byte 0xe + .byte 0x10 + .4byte 0x2f9 + .uleb128 0x12 + .4byte .LASF44 + .byte 0xe + .byte 0x11 + .4byte 0xb9 + .byte 0 + .uleb128 0x12 + .4byte .LASF33 + .byte 0xe + .byte 0x12 + .4byte 0xc4 + .byte 0x8 + .byte 0 + .uleb128 0x19 + .4byte .LASF45 + .2byte 0x120 + .byte 0xe + .byte 0x15 + .4byte 0x32b + .uleb128 0x1a + .string "cnt" + .byte 0xe + .byte 0x16 + .4byte 0x3b + .byte 0 + .uleb128 0x12 + .4byte .LASF33 + .byte 0xe + .byte 0x17 + .4byte 0xc4 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF46 + .byte 0xe + .byte 0x18 + .4byte 0x32b + .byte 0x10 + .byte 0 + .uleb128 0xb + .4byte 0x2d4 + .4byte 0x33b + .uleb128 0x10 + .4byte 0xcf + .byte 0x10 + .byte 0 + .uleb128 0x1b + .string "lmb" + .2byte 0x240 + .byte 0xe + .byte 0x1b + .4byte 0x362 + .uleb128 0x12 + .4byte .LASF47 + .byte 0xe + .byte 0x1c + .4byte 0x2f9 + .byte 0 + .uleb128 0x16 + .4byte .LASF48 + .byte 0xe + .byte 0x1d + .4byte 0x2f9 + .2byte 0x120 + .byte 0 + .uleb128 0x1c + .string "lmb" + .byte 0xe + .byte 0x20 + .4byte 0x33b + .uleb128 0x1d + .byte 0x10 + .byte 0xf + .byte 0x5b + .4byte 0x38e + .uleb128 0x12 + .4byte .LASF36 + .byte 0xf + .byte 0x5c + .4byte 0xae + .byte 0 + .uleb128 0x12 + .4byte .LASF33 + .byte 0xf + .byte 0x5d + .4byte 0xae + .byte 0x8 + .byte 0 + .uleb128 0x19 + .4byte .LASF49 + .2byte 0x148 + .byte 0xf + .byte 0x1b + .4byte 0x480 + .uleb128 0x12 + .4byte .LASF50 + .byte 0xf + .byte 0x1c + .4byte 0x3b + .byte 0 + .uleb128 0x12 + .4byte .LASF51 + .byte 0xf + .byte 0x1d + .4byte 0xc4 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF52 + .byte 0xf + .byte 0x1e + .4byte 0x3b + .byte 0x10 + .uleb128 0x12 + .4byte .LASF53 + .byte 0xf + .byte 0x1f + .4byte 0x3b + .byte 0x18 + .uleb128 0x12 + .4byte .LASF54 + .byte 0xf + .byte 0x20 + .4byte 0x3b + .byte 0x20 + .uleb128 0x12 + .4byte .LASF55 + .byte 0xf + .byte 0x21 + .4byte 0x3b + .byte 0x28 + .uleb128 0x12 + .4byte .LASF56 + .byte 0xf + .byte 0x22 + .4byte 0x3b + .byte 0x30 + .uleb128 0x12 + .4byte .LASF57 + .byte 0xf + .byte 0x24 + .4byte 0x3b + .byte 0x38 + .uleb128 0x12 + .4byte .LASF58 + .byte 0xf + .byte 0x25 + .4byte 0x3b + .byte 0x40 + .uleb128 0x12 + .4byte .LASF59 + .byte 0xf + .byte 0x26 + .4byte 0x3b + .byte 0x48 + .uleb128 0x12 + .4byte .LASF60 + .byte 0xf + .byte 0x31 + .4byte 0x3b + .byte 0x50 + .uleb128 0x12 + .4byte .LASF61 + .byte 0xf + .byte 0x32 + .4byte 0x3b + .byte 0x58 + .uleb128 0x12 + .4byte .LASF62 + .byte 0xf + .byte 0x33 + .4byte 0x191 + .byte 0x60 + .uleb128 0x12 + .4byte .LASF63 + .byte 0xf + .byte 0x34 + .4byte 0x42 + .byte 0x66 + .uleb128 0x12 + .4byte .LASF64 + .byte 0xf + .byte 0x35 + .4byte 0x3b + .byte 0x68 + .uleb128 0x12 + .4byte .LASF65 + .byte 0xf + .byte 0x36 + .4byte 0x3b + .byte 0x70 + .uleb128 0x12 + .4byte .LASF66 + .byte 0xf + .byte 0x57 + .4byte 0x100 + .byte 0x78 + .uleb128 0x12 + .4byte .LASF67 + .byte 0xf + .byte 0x58 + .4byte 0x100 + .byte 0x80 + .uleb128 0x12 + .4byte .LASF68 + .byte 0xf + .byte 0x5e + .4byte 0x480 + .byte 0x88 + .byte 0 + .uleb128 0xb + .4byte 0x36d + .4byte 0x490 + .uleb128 0x10 + .4byte 0xcf + .byte 0xb + .byte 0 + .uleb128 0x2 + .4byte .LASF69 + .byte 0xf + .byte 0x60 + .4byte 0x38e + .uleb128 0x4 + .4byte .LASF70 + .byte 0x10 + .byte 0x13 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF71 + .byte 0x10 + .byte 0x14 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF72 + .byte 0x10 + .byte 0x15 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF73 + .byte 0x10 + .byte 0x16 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF74 + .byte 0x10 + .byte 0x17 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF75 + .byte 0x10 + .byte 0x18 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF76 + .byte 0x10 + .byte 0x19 + .4byte 0x100 + .uleb128 0x2 + .4byte .LASF77 + .byte 0x11 + .byte 0x11 + .4byte 0x11b + .uleb128 0x11 + .4byte .LASF78 + .byte 0x28 + .byte 0x12 + .byte 0x39 + .4byte 0x578 + .uleb128 0x12 + .4byte .LASF79 + .byte 0x12 + .byte 0x3a + .4byte 0x4e8 + .byte 0 + .uleb128 0x12 + .4byte .LASF80 + .byte 0x12 + .byte 0x3b + .4byte 0x4e8 + .byte 0x4 + .uleb128 0x12 + .4byte .LASF81 + .byte 0x12 + .byte 0x3c + .4byte 0x4e8 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF82 + .byte 0x12 + .byte 0x3d + .4byte 0x4e8 + .byte 0xc + .uleb128 0x12 + .4byte .LASF83 + .byte 0x12 + .byte 0x3e + .4byte 0x4e8 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF84 + .byte 0x12 + .byte 0x3f + .4byte 0x4e8 + .byte 0x14 + .uleb128 0x12 + .4byte .LASF85 + .byte 0x12 + .byte 0x40 + .4byte 0x4e8 + .byte 0x18 + .uleb128 0x12 + .4byte .LASF86 + .byte 0x12 + .byte 0x43 + .4byte 0x4e8 + .byte 0x1c + .uleb128 0x12 + .4byte .LASF87 + .byte 0x12 + .byte 0x46 + .4byte 0x4e8 + .byte 0x20 + .uleb128 0x12 + .4byte .LASF88 + .byte 0x12 + .byte 0x49 + .4byte 0x4e8 + .byte 0x24 + .byte 0 + .uleb128 0xd + .4byte .LASF89 + .byte 0x13 + .2byte 0x136 + .4byte 0x584 + .uleb128 0x8 + .byte 0x8 + .4byte 0x4f3 + .uleb128 0x1e + .4byte .LASF90 + .byte 0x40 + .byte 0x14 + .2byte 0x137 + .4byte 0x634 + .uleb128 0x1f + .4byte .LASF91 + .byte 0x14 + .2byte 0x138 + .4byte 0x11b + .byte 0 + .uleb128 0x1f + .4byte .LASF92 + .byte 0x14 + .2byte 0x139 + .4byte 0x11b + .byte 0x4 + .uleb128 0x1f + .4byte .LASF93 + .byte 0x14 + .2byte 0x13a + .4byte 0x11b + .byte 0x8 + .uleb128 0x1f + .4byte .LASF94 + .byte 0x14 + .2byte 0x13b + .4byte 0x11b + .byte 0xc + .uleb128 0x1f + .4byte .LASF95 + .byte 0x14 + .2byte 0x13c + .4byte 0x11b + .byte 0x10 + .uleb128 0x1f + .4byte .LASF96 + .byte 0x14 + .2byte 0x13d + .4byte 0x11b + .byte 0x14 + .uleb128 0x1f + .4byte .LASF97 + .byte 0x14 + .2byte 0x13e + .4byte 0x11b + .byte 0x18 + .uleb128 0x1f + .4byte .LASF98 + .byte 0x14 + .2byte 0x13f + .4byte 0x110 + .byte 0x1c + .uleb128 0x1f + .4byte .LASF99 + .byte 0x14 + .2byte 0x140 + .4byte 0x110 + .byte 0x1d + .uleb128 0x1f + .4byte .LASF100 + .byte 0x14 + .2byte 0x141 + .4byte 0x110 + .byte 0x1e + .uleb128 0x1f + .4byte .LASF101 + .byte 0x14 + .2byte 0x142 + .4byte 0x110 + .byte 0x1f + .uleb128 0x1f + .4byte .LASF102 + .byte 0x14 + .2byte 0x143 + .4byte 0x634 + .byte 0x20 + .byte 0 + .uleb128 0xb + .4byte 0x110 + .4byte 0x644 + .uleb128 0x10 + .4byte 0xcf + .byte 0x1f + .byte 0 + .uleb128 0x20 + .4byte .LASF103 + .byte 0x14 + .2byte 0x144 + .4byte 0x58a + .uleb128 0x1e + .4byte .LASF104 + .byte 0x30 + .byte 0x14 + .2byte 0x146 + .4byte 0x6d2 + .uleb128 0x1f + .4byte .LASF36 + .byte 0x14 + .2byte 0x147 + .4byte 0x100 + .byte 0 + .uleb128 0x21 + .string "end" + .byte 0x14 + .2byte 0x147 + .4byte 0x100 + .byte 0x8 + .uleb128 0x1f + .4byte .LASF105 + .byte 0x14 + .2byte 0x148 + .4byte 0x100 + .byte 0x10 + .uleb128 0x1f + .4byte .LASF106 + .byte 0x14 + .2byte 0x148 + .4byte 0x100 + .byte 0x18 + .uleb128 0x1f + .4byte .LASF107 + .byte 0x14 + .2byte 0x149 + .4byte 0x100 + .byte 0x20 + .uleb128 0x1f + .4byte .LASF108 + .byte 0x14 + .2byte 0x14a + .4byte 0x110 + .byte 0x28 + .uleb128 0x1f + .4byte .LASF109 + .byte 0x14 + .2byte 0x14a + .4byte 0x110 + .byte 0x29 + .uleb128 0x21 + .string "os" + .byte 0x14 + .2byte 0x14a + .4byte 0x110 + .byte 0x2a + .uleb128 0x1f + .4byte .LASF110 + .byte 0x14 + .2byte 0x14b + .4byte 0x110 + .byte 0x2b + .byte 0 + .uleb128 0x20 + .4byte .LASF111 + .byte 0x14 + .2byte 0x14c + .4byte 0x650 + .uleb128 0x22 + .4byte .LASF112 + .2byte 0x380 + .byte 0x14 + .2byte 0x152 + .4byte 0x87b + .uleb128 0x1f + .4byte .LASF113 + .byte 0x14 + .2byte 0x158 + .4byte 0x87b + .byte 0 + .uleb128 0x1f + .4byte .LASF114 + .byte 0x14 + .2byte 0x159 + .4byte 0x644 + .byte 0x8 + .uleb128 0x1f + .4byte .LASF115 + .byte 0x14 + .2byte 0x15a + .4byte 0x100 + .byte 0x48 + .uleb128 0x1f + .4byte .LASF116 + .byte 0x14 + .2byte 0x15d + .4byte 0xd6 + .byte 0x50 + .uleb128 0x1f + .4byte .LASF117 + .byte 0x14 + .2byte 0x15f + .4byte 0x126 + .byte 0x58 + .uleb128 0x1f + .4byte .LASF118 + .byte 0x14 + .2byte 0x160 + .4byte 0xd6 + .byte 0x60 + .uleb128 0x1f + .4byte .LASF119 + .byte 0x14 + .2byte 0x161 + .4byte 0x54 + .byte 0x68 + .uleb128 0x1f + .4byte .LASF120 + .byte 0x14 + .2byte 0x163 + .4byte 0x126 + .byte 0x70 + .uleb128 0x1f + .4byte .LASF121 + .byte 0x14 + .2byte 0x164 + .4byte 0xd6 + .byte 0x78 + .uleb128 0x1f + .4byte .LASF122 + .byte 0x14 + .2byte 0x165 + .4byte 0x54 + .byte 0x80 + .uleb128 0x1f + .4byte .LASF123 + .byte 0x14 + .2byte 0x167 + .4byte 0x126 + .byte 0x88 + .uleb128 0x1f + .4byte .LASF124 + .byte 0x14 + .2byte 0x168 + .4byte 0xd6 + .byte 0x90 + .uleb128 0x1f + .4byte .LASF125 + .byte 0x14 + .2byte 0x169 + .4byte 0x54 + .byte 0x98 + .uleb128 0x1f + .4byte .LASF126 + .byte 0x14 + .2byte 0x16b + .4byte 0x126 + .byte 0xa0 + .uleb128 0x1f + .4byte .LASF127 + .byte 0x14 + .2byte 0x16c + .4byte 0xd6 + .byte 0xa8 + .uleb128 0x1f + .4byte .LASF128 + .byte 0x14 + .2byte 0x16d + .4byte 0x54 + .byte 0xb0 + .uleb128 0x21 + .string "os" + .byte 0x14 + .2byte 0x171 + .4byte 0x6d2 + .byte 0xb8 + .uleb128 0x21 + .string "ep" + .byte 0x14 + .2byte 0x172 + .4byte 0x100 + .byte 0xe8 + .uleb128 0x1f + .4byte .LASF129 + .byte 0x14 + .2byte 0x174 + .4byte 0x100 + .byte 0xf0 + .uleb128 0x1f + .4byte .LASF130 + .byte 0x14 + .2byte 0x174 + .4byte 0x100 + .byte 0xf8 + .uleb128 0x23 + .4byte .LASF131 + .byte 0x14 + .2byte 0x176 + .4byte 0xef + .2byte 0x100 + .uleb128 0x23 + .4byte .LASF132 + .byte 0x14 + .2byte 0x177 + .4byte 0x100 + .2byte 0x108 + .uleb128 0x23 + .4byte .LASF133 + .byte 0x14 + .2byte 0x179 + .4byte 0x100 + .2byte 0x110 + .uleb128 0x23 + .4byte .LASF134 + .byte 0x14 + .2byte 0x17a + .4byte 0x100 + .2byte 0x118 + .uleb128 0x23 + .4byte .LASF135 + .byte 0x14 + .2byte 0x17b + .4byte 0x100 + .2byte 0x120 + .uleb128 0x23 + .4byte .LASF136 + .byte 0x14 + .2byte 0x17c + .4byte 0x100 + .2byte 0x128 + .uleb128 0x24 + .string "kbd" + .byte 0x14 + .2byte 0x17d + .4byte 0x881 + .2byte 0x130 + .uleb128 0x23 + .4byte .LASF137 + .byte 0x14 + .2byte 0x180 + .4byte 0x54 + .2byte 0x138 + .uleb128 0x23 + .4byte .LASF138 + .byte 0x14 + .2byte 0x18d + .4byte 0x54 + .2byte 0x13c + .uleb128 0x24 + .string "lmb" + .byte 0x14 + .2byte 0x190 + .4byte 0x33b + .2byte 0x140 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x644 + .uleb128 0x8 + .byte 0x8 + .4byte 0x490 + .uleb128 0x20 + .4byte .LASF139 + .byte 0x14 + .2byte 0x196 + .4byte 0x6de + .uleb128 0xd + .4byte .LASF140 + .byte 0x14 + .2byte 0x198 + .4byte 0x887 + .uleb128 0xb + .4byte 0xdc + .4byte 0x8b0 + .uleb128 0x18 + .4byte 0xcf + .2byte 0x3ff + .byte 0 + .uleb128 0x25 + .4byte .LASF331 + .byte 0x4 + .4byte 0x54 + .byte 0x18 + .byte 0xe + .4byte 0xb19 + .uleb128 0x26 + .4byte .LASF141 + .byte 0 + .uleb128 0x26 + .4byte .LASF142 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF143 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF144 + .byte 0x3 + .uleb128 0x26 + .4byte .LASF145 + .byte 0x4 + .uleb128 0x26 + .4byte .LASF146 + .byte 0x5 + .uleb128 0x26 + .4byte .LASF147 + .byte 0x6 + .uleb128 0x26 + .4byte .LASF148 + .byte 0x7 + .uleb128 0x26 + .4byte .LASF149 + .byte 0x8 + .uleb128 0x26 + .4byte .LASF150 + .byte 0x9 + .uleb128 0x26 + .4byte .LASF151 + .byte 0xa + .uleb128 0x26 + .4byte .LASF152 + .byte 0xb + .uleb128 0x26 + .4byte .LASF153 + .byte 0xc + .uleb128 0x26 + .4byte .LASF154 + .byte 0xd + .uleb128 0x26 + .4byte .LASF155 + .byte 0xe + .uleb128 0x26 + .4byte .LASF156 + .byte 0xf + .uleb128 0x26 + .4byte .LASF157 + .byte 0x10 + .uleb128 0x26 + .4byte .LASF158 + .byte 0x11 + .uleb128 0x26 + .4byte .LASF159 + .byte 0x12 + .uleb128 0x26 + .4byte .LASF160 + .byte 0x13 + .uleb128 0x26 + .4byte .LASF161 + .byte 0x14 + .uleb128 0x26 + .4byte .LASF162 + .byte 0x15 + .uleb128 0x26 + .4byte .LASF163 + .byte 0x16 + .uleb128 0x26 + .4byte .LASF164 + .byte 0x17 + .uleb128 0x26 + .4byte .LASF165 + .byte 0x18 + .uleb128 0x26 + .4byte .LASF166 + .byte 0x19 + .uleb128 0x26 + .4byte .LASF167 + .byte 0x1a + .uleb128 0x26 + .4byte .LASF168 + .byte 0x1b + .uleb128 0x26 + .4byte .LASF169 + .byte 0x1c + .uleb128 0x26 + .4byte .LASF170 + .byte 0x1d + .uleb128 0x26 + .4byte .LASF171 + .byte 0x1e + .uleb128 0x26 + .4byte .LASF172 + .byte 0x1f + .uleb128 0x26 + .4byte .LASF173 + .byte 0x20 + .uleb128 0x26 + .4byte .LASF174 + .byte 0x21 + .uleb128 0x26 + .4byte .LASF175 + .byte 0x22 + .uleb128 0x26 + .4byte .LASF176 + .byte 0x23 + .uleb128 0x26 + .4byte .LASF177 + .byte 0x24 + .uleb128 0x26 + .4byte .LASF178 + .byte 0x25 + .uleb128 0x26 + .4byte .LASF179 + .byte 0x26 + .uleb128 0x26 + .4byte .LASF180 + .byte 0x27 + .uleb128 0x26 + .4byte .LASF181 + .byte 0x28 + .uleb128 0x26 + .4byte .LASF182 + .byte 0x29 + .uleb128 0x26 + .4byte .LASF183 + .byte 0x2a + .uleb128 0x26 + .4byte .LASF184 + .byte 0x2b + .uleb128 0x26 + .4byte .LASF185 + .byte 0x2c + .uleb128 0x26 + .4byte .LASF186 + .byte 0x2d + .uleb128 0x26 + .4byte .LASF187 + .byte 0x2e + .uleb128 0x26 + .4byte .LASF188 + .byte 0x2f + .uleb128 0x26 + .4byte .LASF189 + .byte 0x30 + .uleb128 0x26 + .4byte .LASF190 + .byte 0x31 + .uleb128 0x26 + .4byte .LASF191 + .byte 0x32 + .uleb128 0x26 + .4byte .LASF192 + .byte 0x33 + .uleb128 0x26 + .4byte .LASF193 + .byte 0x34 + .uleb128 0x26 + .4byte .LASF194 + .byte 0x35 + .uleb128 0x26 + .4byte .LASF195 + .byte 0x36 + .uleb128 0x26 + .4byte .LASF196 + .byte 0x37 + .uleb128 0x26 + .4byte .LASF197 + .byte 0x38 + .uleb128 0x26 + .4byte .LASF198 + .byte 0x39 + .uleb128 0x26 + .4byte .LASF199 + .byte 0x3a + .uleb128 0x26 + .4byte .LASF200 + .byte 0x3b + .uleb128 0x26 + .4byte .LASF201 + .byte 0x3c + .uleb128 0x26 + .4byte .LASF202 + .byte 0x3d + .uleb128 0x26 + .4byte .LASF203 + .byte 0x3e + .uleb128 0x26 + .4byte .LASF204 + .byte 0x3f + .uleb128 0x26 + .4byte .LASF205 + .byte 0x40 + .uleb128 0x26 + .4byte .LASF206 + .byte 0x41 + .uleb128 0x26 + .4byte .LASF207 + .byte 0x42 + .uleb128 0x26 + .4byte .LASF208 + .byte 0x43 + .uleb128 0x26 + .4byte .LASF209 + .byte 0x44 + .uleb128 0x26 + .4byte .LASF210 + .byte 0x45 + .uleb128 0x26 + .4byte .LASF211 + .byte 0x46 + .uleb128 0x26 + .4byte .LASF212 + .byte 0x47 + .uleb128 0x26 + .4byte .LASF213 + .byte 0x48 + .uleb128 0x26 + .4byte .LASF214 + .byte 0x49 + .uleb128 0x26 + .4byte .LASF215 + .byte 0x4a + .uleb128 0x26 + .4byte .LASF216 + .byte 0x4b + .uleb128 0x26 + .4byte .LASF217 + .byte 0x4c + .uleb128 0x26 + .4byte .LASF218 + .byte 0x4d + .uleb128 0x26 + .4byte .LASF219 + .byte 0x4e + .uleb128 0x26 + .4byte .LASF220 + .byte 0x4f + .uleb128 0x26 + .4byte .LASF221 + .byte 0x50 + .uleb128 0x26 + .4byte .LASF222 + .byte 0x51 + .uleb128 0x26 + .4byte .LASF223 + .byte 0x52 + .uleb128 0x26 + .4byte .LASF224 + .byte 0x53 + .uleb128 0x26 + .4byte .LASF225 + .byte 0x54 + .uleb128 0x26 + .4byte .LASF226 + .byte 0x55 + .uleb128 0x26 + .4byte .LASF227 + .byte 0x56 + .uleb128 0x26 + .4byte .LASF228 + .byte 0x57 + .uleb128 0x26 + .4byte .LASF229 + .byte 0x58 + .uleb128 0x26 + .4byte .LASF230 + .byte 0x59 + .uleb128 0x26 + .4byte .LASF231 + .byte 0x5a + .uleb128 0x26 + .4byte .LASF232 + .byte 0x5b + .uleb128 0x26 + .4byte .LASF233 + .byte 0x5c + .uleb128 0x26 + .4byte .LASF234 + .byte 0x5d + .uleb128 0x26 + .4byte .LASF235 + .byte 0x5e + .uleb128 0x26 + .4byte .LASF236 + .byte 0x5f + .uleb128 0x26 + .4byte .LASF237 + .byte 0x60 + .uleb128 0x26 + .4byte .LASF238 + .byte 0x61 + .uleb128 0x26 + .4byte .LASF239 + .byte 0x62 + .uleb128 0x27 + .4byte .LASF240 + .sleb128 -1 + .byte 0 + .uleb128 0x28 + .byte 0x4 + .4byte 0x7f + .byte 0x1d + .byte 0xf6 + .4byte 0xb2c + .uleb128 0x26 + .4byte .LASF241 + .byte 0x5 + .byte 0 + .uleb128 0x11 + .4byte .LASF242 + .byte 0x40 + .byte 0x15 + .byte 0xc + .4byte 0xba5 + .uleb128 0x12 + .4byte .LASF243 + .byte 0x15 + .byte 0x22 + .4byte 0x3b + .byte 0 + .uleb128 0x1a + .string "tbu" + .byte 0x15 + .byte 0x23 + .4byte 0x7f + .byte 0x8 + .uleb128 0x1a + .string "tbl" + .byte 0x15 + .byte 0x24 + .4byte 0x7f + .byte 0xc + .uleb128 0x12 + .4byte .LASF244 + .byte 0x15 + .byte 0x25 + .4byte 0x3b + .byte 0x10 + .uleb128 0x12 + .4byte .LASF245 + .byte 0x15 + .byte 0x26 + .4byte 0x8d + .byte 0x18 + .uleb128 0x12 + .4byte .LASF246 + .byte 0x15 + .byte 0x29 + .4byte 0x3b + .byte 0x20 + .uleb128 0x12 + .4byte .LASF247 + .byte 0x15 + .byte 0x2a + .4byte 0x3b + .byte 0x28 + .uleb128 0x12 + .4byte .LASF248 + .byte 0x15 + .byte 0x2c + .4byte 0x3b + .byte 0x30 + .uleb128 0x12 + .4byte .LASF249 + .byte 0x15 + .byte 0x2d + .4byte 0x3b + .byte 0x38 + .byte 0 + .uleb128 0x11 + .4byte .LASF250 + .byte 0x18 + .byte 0x16 + .byte 0x22 + .4byte 0xbed + .uleb128 0x12 + .4byte .LASF251 + .byte 0x16 + .byte 0x23 + .4byte 0xa3 + .byte 0 + .uleb128 0x12 + .4byte .LASF252 + .byte 0x16 + .byte 0x24 + .4byte 0xa3 + .byte 0x4 + .uleb128 0x1a + .string "id" + .byte 0x16 + .byte 0x25 + .4byte 0xa3 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF253 + .byte 0x16 + .byte 0x26 + .4byte 0xa3 + .byte 0xc + .uleb128 0x12 + .4byte .LASF254 + .byte 0x16 + .byte 0x27 + .4byte 0x100 + .byte 0x10 + .byte 0 + .uleb128 0x19 + .4byte .LASF255 + .2byte 0x1c8 + .byte 0x16 + .byte 0x2a + .4byte 0xe23 + .uleb128 0x1a + .string "bd" + .byte 0x16 + .byte 0x2b + .4byte 0x881 + .byte 0 + .uleb128 0x12 + .4byte .LASF256 + .byte 0x16 + .byte 0x2c + .4byte 0x3b + .byte 0x8 + .uleb128 0x12 + .4byte .LASF253 + .byte 0x16 + .byte 0x2d + .4byte 0x7f + .byte 0x10 + .uleb128 0x12 + .4byte .LASF257 + .byte 0x16 + .byte 0x2e + .4byte 0x3b + .byte 0x18 + .uleb128 0x12 + .4byte .LASF258 + .byte 0x16 + .byte 0x2f + .4byte 0x3b + .byte 0x20 + .uleb128 0x12 + .4byte .LASF259 + .byte 0x16 + .byte 0x31 + .4byte 0x3b + .byte 0x28 + .uleb128 0x12 + .4byte .LASF260 + .byte 0x16 + .byte 0x32 + .4byte 0x3b + .byte 0x30 + .uleb128 0x12 + .4byte .LASF261 + .byte 0x16 + .byte 0x3e + .4byte 0x3b + .byte 0x38 + .uleb128 0x12 + .4byte .LASF262 + .byte 0x16 + .byte 0x42 + .4byte 0x3b + .byte 0x40 + .uleb128 0x12 + .4byte .LASF263 + .byte 0x16 + .byte 0x43 + .4byte 0x3b + .byte 0x48 + .uleb128 0x12 + .4byte .LASF264 + .byte 0x16 + .byte 0x45 + .4byte 0x3b + .byte 0x50 + .uleb128 0x12 + .4byte .LASF265 + .byte 0x16 + .byte 0x46 + .4byte 0x3b + .byte 0x58 + .uleb128 0x12 + .4byte .LASF266 + .byte 0x16 + .byte 0x47 + .4byte 0x3b + .byte 0x60 + .uleb128 0x12 + .4byte .LASF267 + .byte 0x16 + .byte 0x48 + .4byte 0xc4 + .byte 0x68 + .uleb128 0x12 + .4byte .LASF268 + .byte 0x16 + .byte 0x49 + .4byte 0x3b + .byte 0x70 + .uleb128 0x12 + .4byte .LASF269 + .byte 0x16 + .byte 0x4a + .4byte 0x3b + .byte 0x78 + .uleb128 0x12 + .4byte .LASF270 + .byte 0x16 + .byte 0x4b + .4byte 0x3b + .byte 0x80 + .uleb128 0x12 + .4byte .LASF271 + .byte 0x16 + .byte 0x4c + .4byte 0x3b + .byte 0x88 + .uleb128 0x12 + .4byte .LASF272 + .byte 0x16 + .byte 0x4d + .4byte 0xe23 + .byte 0x90 + .uleb128 0x12 + .4byte .LASF273 + .byte 0x16 + .byte 0x50 + .4byte 0x16e + .byte 0x98 + .uleb128 0x12 + .4byte .LASF274 + .byte 0x16 + .byte 0x51 + .4byte 0x16e + .byte 0xa0 + .uleb128 0x12 + .4byte .LASF275 + .byte 0x16 + .byte 0x52 + .4byte 0x1a1 + .byte 0xa8 + .uleb128 0x12 + .4byte .LASF276 + .byte 0x16 + .byte 0x57 + .4byte 0x174 + .byte 0xb8 + .uleb128 0x12 + .4byte .LASF277 + .byte 0x16 + .byte 0x58 + .4byte 0x126 + .byte 0xc0 + .uleb128 0x12 + .4byte .LASF278 + .byte 0x16 + .byte 0x59 + .4byte 0x3b + .byte 0xc8 + .uleb128 0x12 + .4byte .LASF279 + .byte 0x16 + .byte 0x5b + .4byte 0xe2e + .byte 0xd0 + .uleb128 0x12 + .4byte .LASF280 + .byte 0x16 + .byte 0x5c + .4byte 0xe2e + .byte 0xd8 + .uleb128 0x12 + .4byte .LASF281 + .byte 0x16 + .byte 0x5e + .4byte 0x174 + .byte 0xe0 + .uleb128 0x12 + .4byte .LASF282 + .byte 0x16 + .byte 0x5f + .4byte 0x174 + .byte 0xe8 + .uleb128 0x1a + .string "jt" + .byte 0x16 + .byte 0x60 + .4byte 0xe39 + .byte 0xf0 + .uleb128 0x12 + .4byte .LASF283 + .byte 0x16 + .byte 0x61 + .4byte 0xe3f + .byte 0xf8 + .uleb128 0x16 + .4byte .LASF284 + .byte 0x16 + .byte 0x6b + .4byte 0x7f + .2byte 0x118 + .uleb128 0x16 + .4byte .LASF285 + .byte 0x16 + .byte 0x6c + .4byte 0x7f + .2byte 0x11c + .uleb128 0x16 + .4byte .LASF286 + .byte 0x16 + .byte 0x6e + .4byte 0x3b + .2byte 0x120 + .uleb128 0x16 + .4byte .LASF287 + .byte 0x16 + .byte 0x6f + .4byte 0x3b + .2byte 0x128 + .uleb128 0x16 + .4byte .LASF288 + .byte 0x16 + .byte 0x70 + .4byte 0x3b + .2byte 0x130 + .uleb128 0x16 + .4byte .LASF289 + .byte 0x16 + .byte 0x79 + .4byte 0x16e + .2byte 0x138 + .uleb128 0x16 + .4byte .LASF110 + .byte 0x16 + .byte 0x7a + .4byte 0xb2c + .2byte 0x140 + .uleb128 0x16 + .4byte .LASF290 + .byte 0x16 + .byte 0x80 + .4byte 0x100 + .2byte 0x180 + .uleb128 0x16 + .4byte .LASF291 + .byte 0x16 + .byte 0x81 + .4byte 0x100 + .2byte 0x188 + .uleb128 0x16 + .4byte .LASF292 + .byte 0x16 + .byte 0x87 + .4byte 0xb9 + .2byte 0x190 + .uleb128 0x16 + .4byte .LASF293 + .byte 0x16 + .byte 0x8a + .4byte 0x54 + .2byte 0x198 + .uleb128 0x16 + .4byte .LASF294 + .byte 0x16 + .byte 0x8c + .4byte 0xba5 + .2byte 0x1a0 + .uleb128 0x16 + .4byte .LASF295 + .byte 0x16 + .byte 0x8d + .4byte 0x100 + .2byte 0x1b8 + .uleb128 0x16 + .4byte .LASF296 + .byte 0x16 + .byte 0x8e + .4byte 0x54 + .2byte 0x1c0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0xbed + .uleb128 0xe + .4byte .LASF297 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe29 + .uleb128 0xe + .4byte .LASF298 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe34 + .uleb128 0xb + .4byte 0xdc + .4byte 0xe4f + .uleb128 0x10 + .4byte 0xcf + .byte 0x1f + .byte 0 + .uleb128 0x2 + .4byte .LASF299 + .byte 0x16 + .byte 0x9b + .4byte 0xbed + .uleb128 0x9 + .4byte 0xe4f + .uleb128 0x4 + .4byte .LASF300 + .byte 0x4 + .byte 0xad + .4byte 0x100 + .uleb128 0xb + .4byte 0x94 + .4byte 0xe75 + .uleb128 0xc + .byte 0 + .uleb128 0x4 + .4byte .LASF301 + .byte 0x4 + .byte 0xaf + .4byte 0xe6a + .uleb128 0x4 + .4byte .LASF302 + .byte 0x4 + .byte 0xb0 + .4byte 0xe6a + .uleb128 0x4 + .4byte .LASF303 + .byte 0x4 + .byte 0xfe + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF304 + .byte 0x4 + .byte 0xff + .4byte 0x100 + .uleb128 0xd + .4byte .LASF305 + .byte 0x4 + .2byte 0x100 + .4byte 0x100 + .uleb128 0x11 + .4byte .LASF306 + .byte 0x4 + .byte 0x17 + .byte 0x2e + .4byte 0xec6 + .uleb128 0x12 + .4byte .LASF307 + .byte 0x17 + .byte 0x2f + .4byte 0x11b + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x29 + .uleb128 0xb + .4byte 0x94 + .4byte 0xedc + .uleb128 0x10 + .4byte 0xcf + .byte 0x5 + .byte 0 + .uleb128 0xd + .4byte .LASF308 + .byte 0x17 + .2byte 0x1fd + .4byte 0xead + .uleb128 0xd + .4byte .LASF309 + .byte 0x17 + .2byte 0x1fe + .4byte 0xead + .uleb128 0xd + .4byte .LASF310 + .byte 0x17 + .2byte 0x200 + .4byte 0xead + .uleb128 0xd + .4byte .LASF311 + .byte 0x17 + .2byte 0x205 + .4byte 0xe3f + .uleb128 0xd + .4byte .LASF312 + .byte 0x17 + .2byte 0x206 + .4byte 0xe3f + .uleb128 0xb + .4byte 0xdc + .4byte 0xf28 + .uleb128 0x10 + .4byte 0xcf + .byte 0x3f + .byte 0 + .uleb128 0xd + .4byte .LASF313 + .byte 0x17 + .2byte 0x207 + .4byte 0xf18 + .uleb128 0xd + .4byte .LASF314 + .byte 0x17 + .2byte 0x209 + .4byte 0xecc + .uleb128 0xd + .4byte .LASF315 + .byte 0x17 + .2byte 0x20a + .4byte 0xecc + .uleb128 0xd + .4byte .LASF316 + .byte 0x17 + .2byte 0x20b + .4byte 0xead + .uleb128 0xd + .4byte .LASF317 + .byte 0x17 + .2byte 0x20c + .4byte 0xead + .uleb128 0xd + .4byte .LASF318 + .byte 0x17 + .2byte 0x20d + .4byte 0xec6 + .uleb128 0xb + .4byte 0xec6 + .4byte 0xf80 + .uleb128 0x10 + .4byte 0xcf + .byte 0x3 + .byte 0 + .uleb128 0xd + .4byte .LASF319 + .byte 0x17 + .2byte 0x20e + .4byte 0xf70 + .uleb128 0xd + .4byte .LASF320 + .byte 0x17 + .2byte 0x20f + .4byte 0xec6 + .uleb128 0xd + .4byte .LASF321 + .byte 0x17 + .2byte 0x210 + .4byte 0x54 + .uleb128 0xb + .4byte 0x9e + .4byte 0xfb4 + .uleb128 0x10 + .4byte 0xcf + .byte 0x5 + .byte 0 + .uleb128 0x7 + .4byte 0xfa4 + .uleb128 0xd + .4byte .LASF322 + .byte 0x17 + .2byte 0x211 + .4byte 0xfb4 + .uleb128 0xd + .4byte .LASF323 + .byte 0x17 + .2byte 0x212 + .4byte 0xfb4 + .uleb128 0xd + .4byte .LASF324 + .byte 0x17 + .2byte 0x216 + .4byte 0xf5 + .uleb128 0xd + .4byte .LASF325 + .byte 0x17 + .2byte 0x217 + .4byte 0xf5 + .uleb128 0xd + .4byte .LASF326 + .byte 0x17 + .2byte 0x219 + .4byte 0x54 + .uleb128 0xd + .4byte .LASF327 + .byte 0x17 + .2byte 0x220 + .4byte 0x89f + .uleb128 0xd + .4byte .LASF328 + .byte 0x17 + .2byte 0x222 + .4byte 0xa3 + .uleb128 0xd + .4byte .LASF329 + .byte 0x17 + .2byte 0x224 + .4byte 0xa3 + .uleb128 0xd + .4byte .LASF330 + .byte 0x17 + .2byte 0x230 + .4byte 0xead + .uleb128 0x29 + .4byte .LASF332 + .byte 0x4 + .4byte 0x7f + .byte 0x17 + .2byte 0x286 + .4byte 0x104f + .uleb128 0x26 + .4byte .LASF333 + .byte 0 + .uleb128 0x26 + .4byte .LASF334 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF335 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF336 + .byte 0x3 + .byte 0 + .uleb128 0xd + .4byte .LASF337 + .byte 0x17 + .2byte 0x28c + .4byte 0x1025 + .uleb128 0x4 + .4byte .LASF338 + .byte 0x19 + .byte 0x2b + .4byte 0x13a + .uleb128 0x4 + .4byte .LASF339 + .byte 0x19 + .byte 0x2b + .4byte 0x13a + .uleb128 0x11 + .4byte .LASF340 + .byte 0x28 + .byte 0x1a + .byte 0x39 + .4byte 0x10ba + .uleb128 0x1a + .string "dev" + .byte 0x1a + .byte 0x3a + .4byte 0x126 + .byte 0 + .uleb128 0x12 + .4byte .LASF341 + .byte 0x1a + .byte 0x3b + .4byte 0x126 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF342 + .byte 0x1a + .byte 0x3c + .4byte 0x54 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF343 + .byte 0x1a + .byte 0x3d + .4byte 0xd6 + .byte 0x18 + .uleb128 0x12 + .4byte .LASF344 + .byte 0x1a + .byte 0x3e + .4byte 0x10de + .byte 0x20 + .byte 0 + .uleb128 0x13 + .4byte 0x100 + .4byte 0x10d8 + .uleb128 0x14 + .4byte 0x10d8 + .uleb128 0x14 + .4byte 0x100 + .uleb128 0x14 + .4byte 0x100 + .uleb128 0x14 + .4byte 0x126 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1071 + .uleb128 0x8 + .byte 0x8 + .4byte 0x10ba + .uleb128 0x11 + .4byte .LASF345 + .byte 0x38 + .byte 0x1b + .byte 0xc + .4byte 0x1115 + .uleb128 0x12 + .4byte .LASF346 + .byte 0x1b + .byte 0xd + .4byte 0x1071 + .byte 0 + .uleb128 0x12 + .4byte .LASF347 + .byte 0x1b + .byte 0x10 + .4byte 0x126 + .byte 0x28 + .uleb128 0x12 + .4byte .LASF348 + .byte 0x1b + .byte 0x11 + .4byte 0x100 + .byte 0x30 + .byte 0 + .uleb128 0x25 + .4byte .LASF349 + .byte 0x4 + .4byte 0x7f + .byte 0x1c + .byte 0xb + .4byte 0x116e + .uleb128 0x26 + .4byte .LASF350 + .byte 0 + .uleb128 0x26 + .4byte .LASF351 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF352 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF353 + .byte 0x3 + .uleb128 0x26 + .4byte .LASF354 + .byte 0x4 + .uleb128 0x26 + .4byte .LASF355 + .byte 0x5 + .uleb128 0x26 + .4byte .LASF356 + .byte 0x6 + .uleb128 0x26 + .4byte .LASF357 + .byte 0x7 + .uleb128 0x26 + .4byte .LASF358 + .byte 0x8 + .uleb128 0x26 + .4byte .LASF359 + .byte 0x9 + .uleb128 0x26 + .4byte .LASF360 + .byte 0xa + .uleb128 0x26 + .4byte .LASF361 + .byte 0xb + .byte 0 + .uleb128 0x2a + .string "gd" + .byte 0x1 + .byte 0xf + .4byte 0x1178 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe5a + .uleb128 0x28 + .byte 0x4 + .4byte 0x7f + .byte 0x1 + .byte 0x40 + .4byte 0x11a3 + .uleb128 0x26 + .4byte .LASF362 + .byte 0 + .uleb128 0x26 + .4byte .LASF363 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF364 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF365 + .byte 0x3 + .byte 0 + .uleb128 0x28 + .byte 0x4 + .4byte 0x7f + .byte 0x1 + .byte 0x47 + .4byte 0x11da + .uleb128 0x26 + .4byte .LASF366 + .byte 0 + .uleb128 0x26 + .4byte .LASF367 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF368 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF369 + .byte 0x3 + .uleb128 0x26 + .4byte .LASF370 + .byte 0x4 + .uleb128 0x26 + .4byte .LASF371 + .byte 0x5 + .uleb128 0x26 + .4byte .LASF372 + .byte 0x6 + .byte 0 + .uleb128 0x28 + .byte 0x4 + .4byte 0x7f + .byte 0x1 + .byte 0x51 + .4byte 0x121d + .uleb128 0x26 + .4byte .LASF373 + .byte 0 + .uleb128 0x26 + .4byte .LASF374 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF375 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF376 + .byte 0x3 + .uleb128 0x26 + .4byte .LASF377 + .byte 0x4 + .uleb128 0x26 + .4byte .LASF378 + .byte 0x5 + .uleb128 0x26 + .4byte .LASF379 + .byte 0x6 + .uleb128 0x26 + .4byte .LASF380 + .byte 0x7 + .uleb128 0x26 + .4byte .LASF381 + .byte 0x8 + .byte 0 + .uleb128 0xb + .4byte 0xd6 + .4byte 0x122d + .uleb128 0x10 + .4byte 0xcf + .byte 0x7 + .byte 0 + .uleb128 0x2b + .4byte .LASF382 + .byte 0x1 + .byte 0x5d + .4byte 0x121d + .uleb128 0x9 + .byte 0x3 + .8byte tid_name + .uleb128 0x2 + .4byte .LASF383 + .byte 0x1 + .byte 0x68 + .4byte 0x124d + .uleb128 0x8 + .byte 0x8 + .4byte 0x1253 + .uleb128 0x13 + .4byte 0x54 + .4byte 0x1262 + .uleb128 0x14 + .4byte 0x1262 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x10e4 + .uleb128 0x11 + .4byte .LASF384 + .byte 0x28 + .byte 0x1 + .byte 0x69 + .4byte 0x12c7 + .uleb128 0x1a + .string "fn" + .byte 0x1 + .byte 0x6a + .4byte 0x1242 + .byte 0 + .uleb128 0x12 + .4byte .LASF138 + .byte 0x1 + .byte 0x6b + .4byte 0xa3 + .byte 0x8 + .uleb128 0x1a + .string "tid" + .byte 0x1 + .byte 0x6c + .4byte 0xa3 + .byte 0xc + .uleb128 0x12 + .4byte .LASF385 + .byte 0x1 + .byte 0x6d + .4byte 0xa3 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF386 + .byte 0x1 + .byte 0x6e + .4byte 0xa3 + .byte 0x14 + .uleb128 0x1a + .string "ret" + .byte 0x1 + .byte 0x6f + .4byte 0x54 + .byte 0x18 + .uleb128 0x1a + .string "ms" + .byte 0x1 + .byte 0x70 + .4byte 0x100 + .byte 0x20 + .byte 0 + .uleb128 0x19 + .4byte .LASF387 + .2byte 0x148 + .byte 0x1 + .byte 0x73 + .4byte 0x12ee + .uleb128 0x12 + .4byte .LASF388 + .byte 0x1 + .byte 0x74 + .4byte 0x12ee + .byte 0 + .uleb128 0x17 + .string "num" + .byte 0x1 + .byte 0x75 + .4byte 0x94 + .2byte 0x140 + .byte 0 + .uleb128 0xb + .4byte 0x1268 + .4byte 0x12fe + .uleb128 0x10 + .4byte 0xcf + .byte 0x7 + .byte 0 + .uleb128 0x19 + .4byte .LASF389 + .2byte 0x560 + .byte 0x1 + .byte 0x78 + .4byte 0x1331 + .uleb128 0x12 + .4byte .LASF390 + .byte 0x1 + .byte 0x79 + .4byte 0xa3 + .byte 0 + .uleb128 0x1a + .string "cpu" + .byte 0x1 + .byte 0x7a + .4byte 0x1331 + .byte 0x8 + .uleb128 0x16 + .4byte .LASF391 + .byte 0x1 + .byte 0x7b + .4byte 0x10e4 + .2byte 0x528 + .byte 0 + .uleb128 0xb + .4byte 0x12c7 + .4byte 0x1341 + .uleb128 0x10 + .4byte 0xcf + .byte 0x3 + .byte 0 + .uleb128 0x2c + .string "mpb" + .byte 0x1 + .byte 0x7e + .4byte 0x134c + .uleb128 0x8 + .byte 0x8 + .4byte 0x12fe + .uleb128 0x2b + .4byte .LASF392 + .byte 0x1 + .byte 0x7f + .4byte 0x100 + .uleb128 0x9 + .byte 0x3 + .8byte mpb_gd + .uleb128 0x11 + .4byte .LASF393 + .byte 0x18 + .byte 0x1 + .byte 0x95 + .4byte 0x13af + .uleb128 0x1a + .string "cid" + .byte 0x1 + .byte 0x96 + .4byte 0xa3 + .byte 0 + .uleb128 0x1a + .string "tid" + .byte 0x1 + .byte 0x97 + .4byte 0xa3 + .byte 0x4 + .uleb128 0x1a + .string "fn" + .byte 0x1 + .byte 0x98 + .4byte 0x1242 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF385 + .byte 0x1 + .byte 0x99 + .4byte 0xa3 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF386 + .byte 0x1 + .byte 0x9a + .4byte 0xa3 + .byte 0x14 + .byte 0 + .uleb128 0x2d + .4byte .LASF406 + .byte 0x1 + .2byte 0x23f + .4byte 0x100 + .8byte .LFB239 + .8byte .LFE239-.LFB239 + .uleb128 0x1 + .byte 0x9c + .4byte 0x14ef + .uleb128 0x2e + .string "evt" + .byte 0x1 + .2byte 0x23f + .4byte 0x54 + .4byte .LLST61 + .uleb128 0x2f + .4byte .LASF394 + .byte 0x1 + .2byte 0x241 + .4byte 0x54 + .4byte .LLST62 + .uleb128 0x30 + .string "cmd" + .byte 0x1 + .2byte 0x242 + .4byte 0xe3f + .uleb128 0x2 + .byte 0x91 + .sleb128 -32 + .uleb128 0x31 + .8byte .LVL155 + .4byte 0x1b59 + .uleb128 0x32 + .8byte .LVL157 + .4byte 0x1b59 + .4byte 0x1424 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x35 + .byte 0 + .uleb128 0x31 + .8byte .LVL158 + .4byte 0x14ef + .uleb128 0x31 + .8byte .LVL162 + .4byte 0x14ef + .uleb128 0x31 + .8byte .LVL163 + .4byte 0x14ef + .uleb128 0x32 + .8byte .LVL164 + .4byte 0x1b59 + .4byte 0x1462 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x36 + .byte 0 + .uleb128 0x31 + .8byte .LVL165 + .4byte 0x14ef + .uleb128 0x32 + .8byte .LVL167 + .4byte 0x1b59 + .4byte 0x1486 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x35 + .byte 0 + .uleb128 0x32 + .8byte .LVL168 + .4byte 0x24b5 + .4byte 0x14b1 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8f + .sleb128 16 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x8 + .byte 0x20 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x9 + .byte 0x3 + .8byte .LC15 + .byte 0 + .uleb128 0x32 + .8byte .LVL169 + .4byte 0x24c0 + .4byte 0x14ce + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8f + .sleb128 16 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x30 + .byte 0 + .uleb128 0x31 + .8byte .LVL170 + .4byte 0x1cdf + .uleb128 0x34 + .8byte .LVL171 + .4byte 0x1b59 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x34 + .byte 0 + .byte 0 + .uleb128 0x35 + .4byte .LASF402 + .byte 0x1 + .2byte 0x22f + .4byte 0x54 + .byte 0x1 + .4byte 0x150d + .uleb128 0x36 + .4byte .LASF395 + .byte 0x1 + .2byte 0x231 + .4byte 0x54 + .byte 0 + .uleb128 0x37 + .4byte .LASF396 + .byte 0x1 + .2byte 0x219 + .8byte .LFB237 + .8byte .LFE237-.LFB237 + .uleb128 0x1 + .byte 0x9c + .4byte 0x16f6 + .uleb128 0x2e + .string "evt" + .byte 0x1 + .2byte 0x219 + .4byte 0x54 + .4byte .LLST53 + .uleb128 0x38 + .4byte 0x178a + .8byte .LBB124 + .4byte .Ldebug_ranges0+0x1c0 + .byte 0x1 + .2byte 0x21d + .4byte 0x1665 + .uleb128 0x39 + .4byte .Ldebug_ranges0+0x1c0 + .uleb128 0x3a + .4byte 0x1797 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x3b + .4byte 0x17a3 + .4byte .LLST54 + .uleb128 0x38 + .4byte 0x2027 + .8byte .LBB126 + .4byte .Ldebug_ranges0+0x1f0 + .byte 0x1 + .2byte 0x203 + .4byte 0x15ac + .uleb128 0x3c + .4byte 0x2037 + .4byte .LLST55 + .uleb128 0x39 + .4byte .Ldebug_ranges0+0x1f0 + .uleb128 0x3b + .4byte 0x2042 + .4byte .LLST56 + .uleb128 0x3b + .4byte 0x204d + .4byte .LLST57 + .uleb128 0x3b + .4byte 0x2058 + .4byte .LLST58 + .byte 0 + .byte 0 + .uleb128 0x3d + .8byte .LBB131 + .8byte .LBE131-.LBB131 + .4byte 0x15c7 + .uleb128 0x3e + .4byte 0x17b2 + .byte 0 + .uleb128 0x3d + .8byte .LBB132 + .8byte .LBE132-.LBB132 + .4byte 0x15e6 + .uleb128 0x3b + .4byte 0x17c0 + .4byte .LLST59 + .byte 0 + .uleb128 0x32 + .8byte .LVL130 + .4byte 0x24cb + .4byte 0x1611 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8f + .sleb128 16 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LANCHOR3 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x8 + .byte 0x30 + .byte 0 + .uleb128 0x32 + .8byte .LVL131 + .4byte 0x24d4 + .4byte 0x1630 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC14 + .byte 0 + .uleb128 0x32 + .8byte .LVL132 + .4byte 0x24df + .4byte 0x1656 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x4 + .byte 0x8 + .byte 0x82 + .byte 0x44 + .byte 0x24 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x3 + .byte 0xa + .2byte 0x560 + .byte 0 + .uleb128 0x31 + .8byte .LVL135 + .4byte 0x24ea + .byte 0 + .byte 0 + .uleb128 0x3f + .4byte 0x2149 + .8byte .LBB136 + .8byte .LBE136-.LBB136 + .byte 0x1 + .2byte 0x226 + .4byte 0x16a0 + .uleb128 0x3c + .4byte 0x2155 + .4byte .LLST60 + .uleb128 0x40 + .8byte .LVL150 + .4byte 0x24f6 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xa + .2byte 0x3e8 + .byte 0 + .byte 0 + .uleb128 0x32 + .8byte .LVL147 + .4byte 0x1edd + .4byte 0x16c6 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x33 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x6 + .byte 0x11 + .sleb128 -559087616 + .byte 0 + .uleb128 0x31 + .8byte .LVL148 + .4byte 0x24ea + .uleb128 0x40 + .8byte .LVL152 + .4byte 0x1edd + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x37 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x6 + .byte 0x11 + .sleb128 -559087616 + .byte 0 + .byte 0 + .uleb128 0x37 + .4byte .LASF397 + .byte 0x1 + .2byte 0x20e + .8byte .LFB236 + .8byte .LFE236-.LFB236 + .uleb128 0x1 + .byte 0x9c + .4byte 0x178a + .uleb128 0x41 + .4byte .LASF346 + .byte 0x1 + .2byte 0x20e + .4byte 0x1071 + .uleb128 0x2 + .byte 0x70 + .sleb128 0 + .uleb128 0x32 + .8byte .LVL124 + .4byte 0x24cb + .4byte 0x173b + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x8 + .byte 0x28 + .byte 0 + .uleb128 0x32 + .8byte .LVL125 + .4byte 0x19bc + .4byte 0x1757 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .byte 0 + .uleb128 0x32 + .8byte .LVL126 + .4byte 0x1edd + .4byte 0x177c + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x33 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x5 + .byte 0xc + .4byte 0x11111111 + .byte 0 + .uleb128 0x31 + .8byte .LVL127 + .4byte 0x24ea + .byte 0 + .uleb128 0x42 + .4byte .LASF419 + .byte 0x1 + .2byte 0x1e9 + .byte 0x1 + .4byte 0x17ce + .uleb128 0x36 + .4byte .LASF398 + .byte 0x1 + .2byte 0x1ee + .4byte 0x17ce + .uleb128 0x43 + .string "i" + .byte 0x1 + .2byte 0x1fb + .4byte 0x54 + .uleb128 0x44 + .4byte 0x17bf + .uleb128 0x43 + .string "__v" + .byte 0x1 + .2byte 0x206 + .4byte 0xa3 + .byte 0 + .uleb128 0x45 + .uleb128 0x43 + .string "__v" + .byte 0x1 + .2byte 0x207 + .4byte 0xa3 + .byte 0 + .byte 0 + .uleb128 0xb + .4byte 0x1367 + .4byte 0x17de + .uleb128 0x10 + .4byte 0xcf + .byte 0x1 + .byte 0 + .uleb128 0x37 + .4byte .LASF399 + .byte 0x1 + .2byte 0x1bf + .8byte .LFB234 + .8byte .LFE234-.LFB234 + .uleb128 0x1 + .byte 0x9c + .4byte 0x18d6 + .uleb128 0x2e + .string "cpu" + .byte 0x1 + .2byte 0x1bf + .4byte 0xa3 + .4byte .LLST51 + .uleb128 0x3f + .4byte 0x2086 + .8byte .LBB110 + .8byte .LBE110-.LBB110 + .byte 0x1 + .2byte 0x1c2 + .4byte 0x1832 + .uleb128 0x3c + .4byte 0x2092 + .4byte .LLST52 + .byte 0 + .uleb128 0x46 + .4byte 0x2141 + .8byte .LBB112 + .8byte .LBE112-.LBB112 + .byte 0x1 + .2byte 0x1d6 + .uleb128 0x46 + .4byte 0x207e + .8byte .LBB114 + .8byte .LBE114-.LBB114 + .byte 0x1 + .2byte 0x1da + .uleb128 0x31 + .8byte .LVL116 + .4byte 0x2501 + .uleb128 0x32 + .8byte .LVL117 + .4byte 0x18d6 + .4byte 0x1887 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x31 + .8byte .LVL118 + .4byte 0x24ea + .uleb128 0x31 + .8byte .LVL119 + .4byte 0x250d + .uleb128 0x31 + .8byte .LVL120 + .4byte 0x2519 + .uleb128 0x31 + .8byte .LVL121 + .4byte 0x2525 + .uleb128 0x31 + .8byte .LVL122 + .4byte 0x2531 + .uleb128 0x31 + .8byte .LVL123 + .4byte 0x253d + .byte 0 + .uleb128 0x37 + .4byte .LASF400 + .byte 0x1 + .2byte 0x1b1 + .8byte .LFB233 + .8byte .LFE233-.LFB233 + .uleb128 0x1 + .byte 0x9c + .4byte 0x19b6 + .uleb128 0x2e + .string "cpu" + .byte 0x1 + .2byte 0x1b1 + .4byte 0xa3 + .4byte .LLST42 + .uleb128 0x2f + .4byte .LASF388 + .byte 0x1 + .2byte 0x1b3 + .4byte 0x19b6 + .4byte .LLST43 + .uleb128 0x47 + .string "i" + .byte 0x1 + .2byte 0x1b4 + .4byte 0x54 + .4byte .LLST44 + .uleb128 0x48 + .4byte 0x1ae8 + .8byte .LBB102 + .4byte .Ldebug_ranges0+0x160 + .byte 0x1 + .2byte 0x1b8 + .uleb128 0x3c + .4byte 0x1b1c + .4byte .LLST45 + .uleb128 0x3c + .4byte 0x1b10 + .4byte .LLST46 + .uleb128 0x3c + .4byte 0x1b05 + .4byte .LLST47 + .uleb128 0x3c + .4byte 0x1af9 + .4byte .LLST48 + .uleb128 0x39 + .4byte .Ldebug_ranges0+0x160 + .uleb128 0x3e + .4byte 0x1b28 + .uleb128 0x3e + .4byte 0x1b34 + .uleb128 0x3b + .4byte 0x1b40 + .4byte .LLST49 + .uleb128 0x3b + .4byte 0x1b4c + .4byte .LLST50 + .uleb128 0x38 + .4byte 0x2062 + .8byte .LBB104 + .4byte .Ldebug_ranges0+0x190 + .byte 0x1 + .2byte 0x179 + .4byte 0x1999 + .uleb128 0x49 + .4byte 0x2072 + .byte 0 + .uleb128 0x34 + .8byte .LVL110 + .4byte 0x21f4 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x87 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1268 + .uleb128 0x37 + .4byte .LASF401 + .byte 0x1 + .2byte 0x1a3 + .8byte .LFB232 + .8byte .LFE232-.LFB232 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1ae8 + .uleb128 0x2e + .string "cid" + .byte 0x1 + .2byte 0x1a3 + .4byte 0xa3 + .4byte .LLST31 + .uleb128 0x2e + .string "tid" + .byte 0x1 + .2byte 0x1a3 + .4byte 0xa3 + .4byte .LLST32 + .uleb128 0x2f + .4byte .LASF388 + .byte 0x1 + .2byte 0x1a5 + .4byte 0x19b6 + .4byte .LLST33 + .uleb128 0x47 + .string "i" + .byte 0x1 + .2byte 0x1a6 + .4byte 0x54 + .4byte .LLST34 + .uleb128 0x38 + .4byte 0x2062 + .8byte .LBB90 + .4byte .Ldebug_ranges0+0x130 + .byte 0x1 + .2byte 0x1a8 + .4byte 0x1a3a + .uleb128 0x3c + .4byte 0x2072 + .4byte .LLST35 + .byte 0 + .uleb128 0x4a + .4byte 0x1ae8 + .8byte .LBB94 + .8byte .LBE94-.LBB94 + .byte 0x1 + .2byte 0x1ad + .uleb128 0x3c + .4byte 0x1b1c + .4byte .LLST36 + .uleb128 0x3c + .4byte 0x1b10 + .4byte .LLST37 + .uleb128 0x3c + .4byte 0x1b05 + .4byte .LLST38 + .uleb128 0x3c + .4byte 0x1af9 + .4byte .LLST39 + .uleb128 0x4b + .8byte .LBB95 + .8byte .LBE95-.LBB95 + .uleb128 0x3e + .4byte 0x1b28 + .uleb128 0x3e + .4byte 0x1b34 + .uleb128 0x3b + .4byte 0x1b40 + .4byte .LLST40 + .uleb128 0x3b + .4byte 0x1b4c + .4byte .LLST41 + .uleb128 0x3f + .4byte 0x2062 + .8byte .LBB96 + .8byte .LBE96-.LBB96 + .byte 0x1 + .2byte 0x179 + .4byte 0x1ac5 + .uleb128 0x49 + .4byte 0x2072 + .byte 0 + .uleb128 0x34 + .8byte .LVL99 + .4byte 0x21f4 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x87 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x35 + .4byte .LASF403 + .byte 0x1 + .2byte 0x172 + .4byte 0x54 + .byte 0x1 + .4byte 0x1b59 + .uleb128 0x4c + .string "cid" + .byte 0x1 + .2byte 0x172 + .4byte 0xa3 + .uleb128 0x4c + .string "id" + .byte 0x1 + .2byte 0x172 + .4byte 0x94 + .uleb128 0x4c + .string "tid" + .byte 0x1 + .2byte 0x172 + .4byte 0xa3 + .uleb128 0x4d + .4byte .LASF385 + .byte 0x1 + .2byte 0x172 + .4byte 0xa3 + .uleb128 0x36 + .4byte .LASF404 + .byte 0x1 + .2byte 0x174 + .4byte 0x8d + .uleb128 0x36 + .4byte .LASF405 + .byte 0x1 + .2byte 0x175 + .4byte 0x54 + .uleb128 0x43 + .string "ret" + .byte 0x1 + .2byte 0x176 + .4byte 0x54 + .uleb128 0x43 + .string "run" + .byte 0x1 + .2byte 0x177 + .4byte 0x54 + .byte 0 + .uleb128 0x2d + .4byte .LASF407 + .byte 0x1 + .2byte 0x16d + .4byte 0x54 + .8byte .LFB230 + .8byte .LFE230-.LFB230 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1c3c + .uleb128 0x2e + .string "tid" + .byte 0x1 + .2byte 0x16d + .4byte 0xa3 + .4byte .LLST28 + .uleb128 0x48 + .4byte 0x1c3c + .8byte .LBB78 + .4byte .Ldebug_ranges0+0x100 + .byte 0x1 + .2byte 0x16f + .uleb128 0x4e + .4byte 0x1c59 + .byte 0 + .uleb128 0x3c + .4byte 0x1c4d + .4byte .LLST29 + .uleb128 0x39 + .4byte .Ldebug_ranges0+0x100 + .uleb128 0x3e + .4byte 0x1c65 + .uleb128 0x3f + .4byte 0x2149 + .8byte .LBB80 + .8byte .LBE80-.LBB80 + .byte 0x1 + .2byte 0x164 + .4byte 0x1c0c + .uleb128 0x3c + .4byte 0x2155 + .4byte .LLST30 + .uleb128 0x32 + .8byte .LVL86 + .4byte 0x24f6 + .4byte 0x1bf6 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xa + .2byte 0x3e8 + .byte 0 + .uleb128 0x34 + .8byte .LVL87 + .4byte 0x24f6 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xa + .2byte 0x3e8 + .byte 0 + .byte 0 + .uleb128 0x32 + .8byte .LVL84 + .4byte 0x1e3e + .4byte 0x1c24 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x40 + .8byte .LVL89 + .4byte 0x1e3e + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x35 + .4byte .LASF408 + .byte 0x1 + .2byte 0x15f + .4byte 0x54 + .byte 0x1 + .4byte 0x1c70 + .uleb128 0x4c + .string "tid" + .byte 0x1 + .2byte 0x15f + .4byte 0xa3 + .uleb128 0x4d + .4byte .LASF409 + .byte 0x1 + .2byte 0x15f + .4byte 0xa3 + .uleb128 0x43 + .string "i" + .byte 0x1 + .2byte 0x161 + .4byte 0xa3 + .byte 0 + .uleb128 0x35 + .4byte .LASF410 + .byte 0x1 + .2byte 0x138 + .4byte 0x54 + .byte 0x1 + .4byte 0x1cdf + .uleb128 0x4c + .string "cid" + .byte 0x1 + .2byte 0x138 + .4byte 0xa3 + .uleb128 0x4c + .string "tid" + .byte 0x1 + .2byte 0x138 + .4byte 0xa3 + .uleb128 0x4d + .4byte .LASF385 + .byte 0x1 + .2byte 0x138 + .4byte 0xa3 + .uleb128 0x36 + .4byte .LASF405 + .byte 0x1 + .2byte 0x13a + .4byte 0x54 + .uleb128 0x43 + .string "us" + .byte 0x1 + .2byte 0x13b + .4byte 0x54 + .uleb128 0x43 + .string "i" + .byte 0x1 + .2byte 0x13c + .4byte 0x54 + .uleb128 0x36 + .4byte .LASF411 + .byte 0x1 + .2byte 0x13c + .4byte 0x54 + .uleb128 0x36 + .4byte .LASF412 + .byte 0x1 + .2byte 0x13d + .4byte 0x54 + .byte 0 + .uleb128 0x37 + .4byte .LASF413 + .byte 0x1 + .2byte 0x121 + .8byte .LFB227 + .8byte .LFE227-.LFB227 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1e3e + .uleb128 0x2f + .4byte .LASF388 + .byte 0x1 + .2byte 0x123 + .4byte 0x19b6 + .4byte .LLST8 + .uleb128 0x47 + .string "cid" + .byte 0x1 + .2byte 0x124 + .4byte 0x54 + .4byte .LLST9 + .uleb128 0x47 + .string "i" + .byte 0x1 + .2byte 0x124 + .4byte 0x54 + .4byte .LLST10 + .uleb128 0x32 + .8byte .LVL26 + .4byte 0x24d4 + .4byte 0x1d4a + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC2 + .byte 0 + .uleb128 0x32 + .8byte .LVL29 + .4byte 0x24d4 + .4byte 0x1d68 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .uleb128 0x32 + .8byte .LVL30 + .4byte 0x24d4 + .4byte 0x1d87 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC4 + .byte 0 + .uleb128 0x32 + .8byte .LVL31 + .4byte 0x24d4 + .4byte 0x1da6 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC5 + .byte 0 + .uleb128 0x32 + .8byte .LVL32 + .4byte 0x24d4 + .4byte 0x1dc5 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC6 + .byte 0 + .uleb128 0x32 + .8byte .LVL33 + .4byte 0x24d4 + .4byte 0x1de4 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC7 + .byte 0 + .uleb128 0x32 + .8byte .LVL34 + .4byte 0x24d4 + .4byte 0x1e03 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC8 + .byte 0 + .uleb128 0x32 + .8byte .LVL35 + .4byte 0x24d4 + .4byte 0x1e22 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC9 + .byte 0 + .uleb128 0x34 + .8byte .LVL36 + .4byte 0x24d4 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC10 + .byte 0 + .byte 0 + .uleb128 0x2d + .4byte .LASF414 + .byte 0x1 + .2byte 0x104 + .4byte 0x54 + .8byte .LFB226 + .8byte .LFE226-.LFB226 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1ed7 + .uleb128 0x2e + .string "tid" + .byte 0x1 + .2byte 0x104 + .4byte 0xa3 + .4byte .LLST5 + .uleb128 0x43 + .string "cid" + .byte 0x1 + .2byte 0x106 + .4byte 0x54 + .uleb128 0x47 + .string "i" + .byte 0x1 + .2byte 0x106 + .4byte 0x54 + .4byte .LLST6 + .uleb128 0x47 + .string "ptr" + .byte 0x1 + .2byte 0x107 + .4byte 0x1ed7 + .4byte .LLST7 + .uleb128 0x3f + .4byte 0x2062 + .8byte .LBB40 + .8byte .LBE40-.LBB40 + .byte 0x1 + .2byte 0x109 + .4byte 0x1ebc + .uleb128 0x49 + .4byte 0x2072 + .byte 0 + .uleb128 0x34 + .8byte .LVL23 + .4byte 0x2549 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0xa3 + .uleb128 0x4f + .4byte .LASF450 + .byte 0x1 + .byte 0xe2 + .4byte 0x54 + .8byte .LFB225 + .8byte .LFE225-.LFB225 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1faa + .uleb128 0x50 + .string "cid" + .byte 0x1 + .byte 0xe2 + .4byte 0xa3 + .4byte .LLST0 + .uleb128 0x50 + .string "tid" + .byte 0x1 + .byte 0xe2 + .4byte 0xa3 + .4byte .LLST1 + .uleb128 0x50 + .string "st" + .byte 0x1 + .byte 0xe2 + .4byte 0xa3 + .4byte .LLST2 + .uleb128 0x51 + .4byte .LASF31 + .byte 0x1 + .byte 0xe4 + .4byte 0xef + .uleb128 0x2c + .string "ptr" + .byte 0x1 + .byte 0xe5 + .4byte 0x1ed7 + .uleb128 0x2c + .string "id" + .byte 0x1 + .byte 0xe6 + .4byte 0x54 + .uleb128 0x52 + .4byte 0x2062 + .8byte .LBB30 + .8byte .LBE30-.LBB30 + .byte 0x1 + .byte 0xe8 + .4byte 0x1f6b + .uleb128 0x49 + .4byte 0x2072 + .byte 0 + .uleb128 0x53 + .4byte 0x1ff7 + .8byte .LBB32 + .4byte .Ldebug_ranges0+0 + .byte 0x1 + .byte 0xeb + .4byte 0x1f9c + .uleb128 0x49 + .4byte 0x2012 + .uleb128 0x49 + .4byte 0x2007 + .uleb128 0x39 + .4byte .Ldebug_ranges0+0 + .uleb128 0x3b + .4byte 0x201d + .4byte .LLST3 + .byte 0 + .byte 0 + .uleb128 0x31 + .8byte .LVL8 + .4byte 0x2555 + .byte 0 + .uleb128 0x54 + .4byte .LASF415 + .byte 0x1 + .byte 0xcf + .4byte 0x54 + .byte 0x1 + .4byte 0x1ff1 + .uleb128 0x55 + .string "cid" + .byte 0x1 + .byte 0xcf + .4byte 0xa3 + .uleb128 0x55 + .string "tid" + .byte 0x1 + .byte 0xcf + .4byte 0xa3 + .uleb128 0x55 + .string "ret" + .byte 0x1 + .byte 0xcf + .4byte 0xa3 + .uleb128 0x2c + .string "ptr" + .byte 0x1 + .byte 0xd1 + .4byte 0x1ff1 + .uleb128 0x2c + .string "id" + .byte 0x1 + .byte 0xd2 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x54 + .uleb128 0x54 + .4byte .LASF416 + .byte 0x1 + .byte 0xc3 + .4byte 0x54 + .byte 0x1 + .4byte 0x2027 + .uleb128 0x55 + .string "cid" + .byte 0x1 + .byte 0xc3 + .4byte 0xa3 + .uleb128 0x55 + .string "tid" + .byte 0x1 + .byte 0xc3 + .4byte 0xa3 + .uleb128 0x2c + .string "i" + .byte 0x1 + .byte 0xc5 + .4byte 0x54 + .byte 0 + .uleb128 0x54 + .4byte .LASF417 + .byte 0x1 + .byte 0x9d + .4byte 0x54 + .byte 0x1 + .4byte 0x2062 + .uleb128 0x56 + .4byte .LASF398 + .byte 0x1 + .byte 0x9d + .4byte 0x1367 + .uleb128 0x2c + .string "cid" + .byte 0x1 + .byte 0x9f + .4byte 0xa3 + .uleb128 0x2c + .string "tid" + .byte 0x1 + .byte 0xa0 + .4byte 0xa3 + .uleb128 0x2c + .string "i" + .byte 0x1 + .byte 0xa1 + .4byte 0x94 + .byte 0 + .uleb128 0x54 + .4byte .LASF418 + .byte 0x1 + .byte 0x90 + .4byte 0x54 + .byte 0x3 + .4byte 0x207e + .uleb128 0x55 + .string "tid" + .byte 0x1 + .byte 0x90 + .4byte 0xa3 + .byte 0 + .uleb128 0x57 + .4byte .LASF427 + .byte 0x1 + .byte 0x86 + .byte 0x3 + .uleb128 0x58 + .4byte .LASF420 + .byte 0x1 + .byte 0x81 + .byte 0x3 + .4byte 0x209e + .uleb128 0x55 + .string "ptr" + .byte 0x1 + .byte 0x81 + .4byte 0x10b + .byte 0 + .uleb128 0x59 + .4byte .LASF451 + .byte 0x1 + .byte 0x34 + .4byte 0x54 + .byte 0x1 + .4byte 0x20ba + .uleb128 0x56 + .4byte .LASF421 + .byte 0x1 + .byte 0x34 + .4byte 0x1262 + .byte 0 + .uleb128 0x5a + .4byte .LASF422 + .byte 0x1 + .byte 0x33 + .4byte 0x54 + .4byte 0x20d5 + .uleb128 0x56 + .4byte .LASF421 + .byte 0x1 + .byte 0x33 + .4byte 0x1262 + .byte 0 + .uleb128 0x5a + .4byte .LASF423 + .byte 0x1 + .byte 0x32 + .4byte 0x54 + .4byte 0x20f0 + .uleb128 0x56 + .4byte .LASF421 + .byte 0x1 + .byte 0x32 + .4byte 0x1262 + .byte 0 + .uleb128 0x5a + .4byte .LASF424 + .byte 0x1 + .byte 0x31 + .4byte 0x54 + .4byte 0x210b + .uleb128 0x56 + .4byte .LASF421 + .byte 0x1 + .byte 0x31 + .4byte 0x1262 + .byte 0 + .uleb128 0x5a + .4byte .LASF425 + .byte 0x1 + .byte 0x30 + .4byte 0x54 + .4byte 0x2126 + .uleb128 0x56 + .4byte .LASF421 + .byte 0x1 + .byte 0x30 + .4byte 0x1262 + .byte 0 + .uleb128 0x5a + .4byte .LASF426 + .byte 0x1 + .byte 0x2f + .4byte 0x54 + .4byte 0x2141 + .uleb128 0x56 + .4byte .LASF421 + .byte 0x1 + .byte 0x2f + .4byte 0x1262 + .byte 0 + .uleb128 0x57 + .4byte .LASF428 + .byte 0x3 + .byte 0xbf + .byte 0x3 + .uleb128 0x58 + .4byte .LASF429 + .byte 0x2 + .byte 0xd + .byte 0x3 + .4byte 0x2161 + .uleb128 0x56 + .4byte .LASF430 + .byte 0x2 + .byte 0xd + .4byte 0x3b + .byte 0 + .uleb128 0x5b + .4byte 0x14ef + .8byte .LFB238 + .8byte .LFE238-.LFB238 + .uleb128 0x1 + .byte 0x9c + .4byte 0x21cf + .uleb128 0x3a + .4byte 0x1500 + .uleb128 0x9 + .byte 0x3 + .8byte once.6657 + .uleb128 0x3d + .8byte .LBB39 + .8byte .LBE39-.LBB39 + .4byte 0x21c1 + .uleb128 0x3e + .4byte 0x217c + .uleb128 0x34 + .8byte .LVL10 + .4byte 0x24d4 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC1 + .byte 0 + .byte 0 + .uleb128 0x31 + .8byte .LVL9 + .4byte 0x2561 + .byte 0 + .uleb128 0x5b + .4byte 0x209e + .8byte .LFB218 + .8byte .LFE218-.LFB218 + .uleb128 0x1 + .byte 0x9c + .4byte 0x21f4 + .uleb128 0x3c + .4byte 0x20ae + .4byte .LLST4 + .byte 0 + .uleb128 0x5c + .4byte 0x1ae8 + .8byte .LFB242 + .8byte .LFE242-.LFB242 + .uleb128 0x1 + .byte 0x9c + .4byte 0x24b5 + .uleb128 0x3c + .4byte 0x1af9 + .4byte .LLST11 + .uleb128 0x3c + .4byte 0x1b05 + .4byte .LLST12 + .uleb128 0x3c + .4byte 0x1b10 + .4byte .LLST13 + .uleb128 0x3c + .4byte 0x1b1c + .4byte .LLST14 + .uleb128 0x3b + .4byte 0x1b28 + .4byte .LLST15 + .uleb128 0x3e + .4byte 0x1b34 + .uleb128 0x3b + .4byte 0x1b40 + .4byte .LLST16 + .uleb128 0x3b + .4byte 0x1b4c + .4byte .LLST17 + .uleb128 0x38 + .4byte 0x1c70 + .8byte .LBB52 + .4byte .Ldebug_ranges0+0x30 + .byte 0x1 + .2byte 0x17f + .4byte 0x2308 + .uleb128 0x3c + .4byte 0x1c81 + .4byte .LLST18 + .uleb128 0x3c + .4byte 0x1c8d + .4byte .LLST19 + .uleb128 0x3c + .4byte 0x1c99 + .4byte .LLST20 + .uleb128 0x39 + .4byte .Ldebug_ranges0+0x30 + .uleb128 0x3b + .4byte 0x1ca5 + .4byte .LLST21 + .uleb128 0x5d + .4byte 0x1cb1 + .byte 0x64 + .uleb128 0x3e + .4byte 0x1cbc + .uleb128 0x3b + .4byte 0x1cc6 + .4byte .LLST22 + .uleb128 0x3b + .4byte 0x1cd2 + .4byte .LLST23 + .uleb128 0x32 + .8byte .LVL43 + .4byte 0x1e3e + .4byte 0x22c9 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .uleb128 0x32 + .8byte .LVL44 + .4byte 0x1e3e + .4byte 0x22e1 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .uleb128 0x32 + .8byte .LVL53 + .4byte 0x24f6 + .4byte 0x22f9 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8 + .byte 0x64 + .byte 0 + .uleb128 0x31 + .8byte .LVL56 + .4byte 0x1cdf + .byte 0 + .byte 0 + .uleb128 0x38 + .4byte 0x1faa + .8byte .LBB56 + .4byte .Ldebug_ranges0+0x60 + .byte 0x1 + .2byte 0x19e + .4byte 0x23ab + .uleb128 0x3c + .4byte 0x1fd0 + .4byte .LLST24 + .uleb128 0x3c + .4byte 0x1fc5 + .4byte .LLST25 + .uleb128 0x3c + .4byte 0x1fba + .4byte .LLST26 + .uleb128 0x39 + .4byte .Ldebug_ranges0+0x60 + .uleb128 0x3e + .4byte 0x1fdb + .uleb128 0x3e + .4byte 0x1fe6 + .uleb128 0x52 + .4byte 0x2062 + .8byte .LBB58 + .8byte .LBE58-.LBB58 + .byte 0x1 + .byte 0xd4 + .4byte 0x236b + .uleb128 0x49 + .4byte 0x2072 + .byte 0 + .uleb128 0x53 + .4byte 0x1ff7 + .8byte .LBB60 + .4byte .Ldebug_ranges0+0xd0 + .byte 0x1 + .byte 0xd7 + .4byte 0x239c + .uleb128 0x49 + .4byte 0x2012 + .uleb128 0x49 + .4byte 0x2007 + .uleb128 0x39 + .4byte .Ldebug_ranges0+0xd0 + .uleb128 0x3b + .4byte 0x201d + .4byte .LLST27 + .byte 0 + .byte 0 + .uleb128 0x5e + .8byte .LVL81 + .4byte 0x2555 + .byte 0 + .byte 0 + .uleb128 0x32 + .8byte .LVL50 + .4byte 0x24d4 + .4byte 0x23d6 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC12 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x32 + .8byte .LVL51 + .4byte 0x1edd + .4byte 0x23fd + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x5 + .byte 0xc + .4byte 0x55555555 + .byte 0 + .uleb128 0x32 + .8byte .LVL59 + .4byte 0x24d4 + .4byte 0x2428 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC13 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x31 + .8byte .LVL60 + .4byte 0x256c + .uleb128 0x32 + .8byte .LVL63 + .4byte 0x1edd + .4byte 0x245c + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x5 + .byte 0xc + .4byte 0x11111111 + .byte 0 + .uleb128 0x32 + .8byte .LVL67 + .4byte 0x1edd + .4byte 0x247a + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x31 + .8byte .LVL68 + .4byte 0x256c + .uleb128 0x34 + .8byte .LVL70 + .4byte 0x24d4 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC11 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x33 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .byte 0 + .uleb128 0x5f + .4byte .LASF431 + .4byte .LASF431 + .byte 0x1e + .byte 0x8e + .uleb128 0x5f + .4byte .LASF432 + .4byte .LASF432 + .byte 0x4 + .byte 0x6b + .uleb128 0x60 + .4byte .LASF452 + .4byte .LASF452 + .uleb128 0x5f + .4byte .LASF433 + .4byte .LASF433 + .byte 0x1f + .byte 0x13 + .uleb128 0x5f + .4byte .LASF434 + .4byte .LASF434 + .byte 0x8 + .byte 0x66 + .uleb128 0x61 + .4byte .LASF435 + .4byte .LASF435 + .byte 0x4 + .2byte 0x260 + .uleb128 0x5f + .4byte .LASF436 + .4byte .LASF436 + .byte 0x2 + .byte 0xb + .uleb128 0x61 + .4byte .LASF437 + .4byte .LASF437 + .byte 0x4 + .2byte 0x1f3 + .uleb128 0x61 + .4byte .LASF438 + .4byte .LASF438 + .byte 0x4 + .2byte 0x248 + .uleb128 0x61 + .4byte .LASF439 + .4byte .LASF439 + .byte 0x4 + .2byte 0x1f1 + .uleb128 0x61 + .4byte .LASF440 + .4byte .LASF440 + .byte 0x4 + .2byte 0x264 + .uleb128 0x61 + .4byte .LASF441 + .4byte .LASF441 + .byte 0x4 + .2byte 0x1f4 + .uleb128 0x61 + .4byte .LASF442 + .4byte .LASF442 + .byte 0x4 + .2byte 0x263 + .uleb128 0x61 + .4byte .LASF443 + .4byte .LASF443 + .byte 0x4 + .2byte 0x262 + .uleb128 0x61 + .4byte .LASF444 + .4byte .LASF444 + .byte 0x4 + .2byte 0x261 + .uleb128 0x5f + .4byte .LASF445 + .4byte .LASF445 + .byte 0x1c + .byte 0x50 + .uleb128 0x61 + .4byte .LASF446 + .4byte .LASF446 + .byte 0x4 + .2byte 0x276 + .byte 0 + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 + .uleb128 0x11 + .byte 0x1 + .uleb128 0x25 + .uleb128 0xe + .uleb128 0x13 + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1b + .uleb128 0xe + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x10 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x2 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x4 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x5 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0 + .byte 0 + .uleb128 0x6 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x7 + .uleb128 0x26 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x8 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x9 + .uleb128 0x35 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xa + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0xb + .uleb128 0x1 + .byte 0x1 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xc + .uleb128 0x21 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0xd + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0xe + .uleb128 0x13 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0xf + .uleb128 0x26 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x10 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x11 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x12 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x13 + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x14 + .uleb128 0x5 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x15 + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x16 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x17 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x18 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x19 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1a + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x1b + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x1d + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1e + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1f + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x20 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x21 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x22 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x23 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x24 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x25 + .uleb128 0x4 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x26 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x27 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x28 + .uleb128 0x4 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x29 + .uleb128 0x4 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2a + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x2b + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x2c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2d + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2e + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x2f + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x30 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x31 + .uleb128 0x4109 + .byte 0 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x32 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x33 + .uleb128 0x410a + .byte 0 + .uleb128 0x2 + .uleb128 0x18 + .uleb128 0x2111 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x34 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x35 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x36 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x37 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x38 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x52 + .uleb128 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x39 + .uleb128 0xb + .byte 0x1 + .uleb128 0x55 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3a + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x3b + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3c + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3d + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3e + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3f + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x40 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x2115 + .uleb128 0x19 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x41 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x42 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x43 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x44 + .uleb128 0xb + .byte 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x45 + .uleb128 0xb + .byte 0x1 + .byte 0 + .byte 0 + .uleb128 0x46 + .uleb128 0x1d + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x47 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x48 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x52 + .uleb128 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x49 + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4a + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x4b + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .byte 0 + .byte 0 + .uleb128 0x4c + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4d + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4e + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x4f + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x50 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x51 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x52 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x53 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x52 + .uleb128 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x54 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x55 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x56 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x57 + .uleb128 0x2e + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x58 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x59 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5a + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5b + .uleb128 0x2e + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5c + .uleb128 0x2e + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2116 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5d + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x5e + .uleb128 0x4109 + .byte 0 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x2115 + .uleb128 0x19 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5f + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x60 + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x61 + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LLST61: + .8byte .LVL153 + .8byte .LVL154 + .2byte 0x1 + .byte 0x50 + .8byte .LVL154 + .8byte .LVL172 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL172 + .8byte .LVL173 + .2byte 0x1 + .byte 0x50 + .8byte .LVL173 + .8byte .LFE239 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST62: + .8byte .LVL156 + .8byte .LVL159 + .2byte 0x2 + .byte 0x35 + .byte 0x9f + .8byte .LVL160 + .8byte .LVL161 + .2byte 0x2 + .byte 0x35 + .byte 0x9f + .8byte .LVL166 + .8byte .LVL172 + .2byte 0x2 + .byte 0x35 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST53: + .8byte .LVL128 + .8byte .LVL129 + .2byte 0x1 + .byte 0x50 + .8byte .LVL129 + .8byte .LVL145 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL145 + .8byte .LVL146 + .2byte 0x1 + .byte 0x50 + .8byte .LVL146 + .8byte .LVL150 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL150 + .8byte .LVL151 + .2byte 0x1 + .byte 0x50 + .8byte .LVL151 + .8byte .LFE237 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST54: + .8byte .LVL133 + .8byte .LVL134 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST55: + .8byte .LVL138 + .8byte .LVL139 + .2byte 0x7 + .byte 0x93 + .uleb128 0x4 + .byte 0x53 + .byte 0x93 + .uleb128 0x4 + .byte 0x93 + .uleb128 0x10 + .8byte .LVL139 + .8byte .LVL143 + .2byte 0xe + .byte 0x93 + .uleb128 0x4 + .byte 0x53 + .byte 0x93 + .uleb128 0x4 + .byte 0x5d + .byte 0x93 + .uleb128 0x8 + .byte 0x5c + .byte 0x93 + .uleb128 0x4 + .byte 0x5b + .byte 0x93 + .uleb128 0x4 + .8byte .LVL143 + .8byte .LVL144 + .2byte 0xf + .byte 0x93 + .uleb128 0x4 + .byte 0x71 + .sleb128 20 + .byte 0x93 + .uleb128 0x4 + .byte 0x5d + .byte 0x93 + .uleb128 0x8 + .byte 0x5c + .byte 0x93 + .uleb128 0x4 + .byte 0x5b + .byte 0x93 + .uleb128 0x4 + .8byte .LVL144 + .8byte .LVL145 + .2byte 0xb + .byte 0x93 + .uleb128 0x8 + .byte 0x5d + .byte 0x93 + .uleb128 0x8 + .byte 0x5c + .byte 0x93 + .uleb128 0x4 + .byte 0x5b + .byte 0x93 + .uleb128 0x4 + .8byte 0 + .8byte 0 +.LLST56: + .8byte .LVL139 + .8byte .LVL141 + .2byte 0x1 + .byte 0x51 + .8byte .LVL141 + .8byte .LVL142 + .2byte 0x2 + .byte 0x70 + .sleb128 0 + .8byte 0 + .8byte 0 +.LLST57: + .8byte .LVL139 + .8byte .LVL143 + .2byte 0x1 + .byte 0x53 + .8byte .LVL143 + .8byte .LVL144 + .2byte 0x2 + .byte 0x71 + .sleb128 20 + .8byte 0 + .8byte 0 +.LLST58: + .8byte .LVL140 + .8byte .LVL141 + .2byte 0x11 + .byte 0x71 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200148 + .8byte .LVL141 + .8byte .LVL142 + .2byte 0x13 + .byte 0x70 + .sleb128 0 + .byte 0x94 + .byte 0x4 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200148 + .8byte 0 + .8byte 0 +.LLST59: + .8byte .LVL136 + .8byte .LVL137 + .2byte 0x6 + .byte 0x9e + .uleb128 0x4 + .4byte 0xdeadbeaf + .8byte 0 + .8byte 0 +.LLST60: + .8byte .LVL149 + .8byte .LVL150 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST51: + .8byte .LVL112 + .8byte .LVL113 + .2byte 0x1 + .byte 0x50 + .8byte .LVL113 + .8byte .LFE234 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST52: + .8byte .LVL114 + .8byte .LVL115 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST42: + .8byte .LVL101 + .8byte .LVL102 + .2byte 0x1 + .byte 0x50 + .8byte .LVL102 + .8byte .LVL104 + .2byte 0x1 + .byte 0x66 + .8byte .LVL104 + .8byte .LVL107 + .2byte 0x1 + .byte 0x67 + .8byte .LVL107 + .8byte .LFE233 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST43: + .8byte .LVL103 + .8byte .LVL104 + .2byte 0x12 + .byte 0x86 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL104 + .8byte .LVL107 + .2byte 0x12 + .byte 0x87 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL107 + .8byte .LVL108 + .2byte 0x13 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL108 + .8byte .LFE233 + .2byte 0x12 + .byte 0x87 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST44: + .8byte .LVL103 + .8byte .LVL105 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL105 + .8byte .LVL106 + .2byte 0x1 + .byte 0x65 + .8byte .LVL108 + .8byte .LFE233 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST45: + .8byte .LVL109 + .8byte .LVL110-1 + .2byte 0x2 + .byte 0x83 + .sleb128 16 + .8byte 0 + .8byte 0 +.LLST46: + .8byte .LVL109 + .8byte .LVL110-1 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST47: + .8byte .LVL109 + .8byte .LVL110 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST48: + .8byte .LVL109 + .8byte .LVL110 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST49: + .8byte .LVL109 + .8byte .LVL110 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST50: + .8byte .LVL109 + .8byte .LVL110 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST31: + .8byte .LVL90 + .8byte .LVL93 + .2byte 0x1 + .byte 0x50 + .8byte .LVL93 + .8byte .LVL94 + .2byte 0x1 + .byte 0x69 + .8byte .LVL94 + .8byte .LVL96 + .2byte 0x1 + .byte 0x66 + .8byte .LVL96 + .8byte .LFE232 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST32: + .8byte .LVL90 + .8byte .LVL95 + .2byte 0x1 + .byte 0x51 + .8byte .LVL95 + .8byte .LVL96 + .2byte 0x1 + .byte 0x65 + .8byte .LVL96 + .8byte .LVL97 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL97 + .8byte .LFE232 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST33: + .8byte .LVL90 + .8byte .LVL92 + .2byte 0x12 + .byte 0x70 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL92 + .8byte .LVL94 + .2byte 0xc + .byte 0x89 + .sleb128 0 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL94 + .8byte .LVL96 + .2byte 0xc + .byte 0x86 + .sleb128 0 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL96 + .8byte .LVL97 + .2byte 0x13 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL97 + .8byte .LFE232 + .2byte 0xc + .byte 0x86 + .sleb128 0 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST34: + .8byte .LVL95 + .8byte .LVL96 + .2byte 0x1 + .byte 0x67 + .8byte .LVL97 + .8byte .LFE232 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST35: + .8byte .LVL90 + .8byte .LVL91 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST36: + .8byte .LVL98 + .8byte .LVL99-1 + .2byte 0x2 + .byte 0x83 + .sleb128 16 + .8byte 0 + .8byte 0 +.LLST37: + .8byte .LVL98 + .8byte .LVL99 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST38: + .8byte .LVL98 + .8byte .LVL99 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST39: + .8byte .LVL98 + .8byte .LVL99 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST40: + .8byte .LVL98 + .8byte .LVL99 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST41: + .8byte .LVL98 + .8byte .LVL99 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST28: + .8byte .LVL82 + .8byte .LVL83 + .2byte 0x1 + .byte 0x50 + .8byte .LVL83 + .8byte .LVL88 + .2byte 0x1 + .byte 0x63 + .8byte .LVL88 + .8byte .LVL89-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL89-1 + .8byte .LFE230 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST29: + .8byte .LVL83 + .8byte .LVL88 + .2byte 0x1 + .byte 0x63 + .8byte .LVL88 + .8byte .LVL89-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL89-1 + .8byte .LFE230 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST30: + .8byte .LVL85 + .8byte .LVL86 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte .LVL86 + .8byte .LVL87 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST8: + .8byte .LVL27 + .8byte .LVL28 + .2byte 0x1e + .byte 0x86 + .sleb128 0 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0x8 + .byte 0x28 + .byte 0x1e + .byte 0x85 + .sleb128 0 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x22 + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL28 + .8byte .LVL36 + .2byte 0x1e + .byte 0x86 + .sleb128 -1 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0x8 + .byte 0x28 + .byte 0x1e + .byte 0x85 + .sleb128 0 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x22 + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST9: + .8byte .LVL26 + .8byte .LVL38 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST10: + .8byte .LVL27 + .8byte .LVL28 + .2byte 0x1 + .byte 0x66 + .8byte .LVL28 + .8byte .LVL36 + .2byte 0x3 + .byte 0x86 + .sleb128 -1 + .byte 0x9f + .8byte .LVL36 + .8byte .LVL38 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST5: + .8byte .LVL13 + .8byte .LVL14 + .2byte 0x1 + .byte 0x50 + .8byte .LVL14 + .8byte .LVL19 + .2byte 0x1 + .byte 0x63 + .8byte .LVL19 + .8byte .LVL21 + .2byte 0x5 + .byte 0x8b + .sleb128 65536 + .byte 0x9f + .8byte .LVL21 + .8byte .LVL22 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL22 + .8byte .LVL24 + .2byte 0x1 + .byte 0x63 + .8byte .LVL24 + .8byte .LVL25 + .2byte 0x1 + .byte 0x50 + .8byte .LVL25 + .8byte .LFE226 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST6: + .8byte .LVL15 + .8byte .LVL20 + .2byte 0x1 + .byte 0x67 + .8byte .LVL22 + .8byte .LVL24 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST7: + .8byte .LVL22 + .8byte .LVL24 + .2byte 0x3 + .byte 0x84 + .sleb128 -4 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST0: + .8byte .LVL0 + .8byte .LVL1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1 + .8byte .LVL3 + .2byte 0x1 + .byte 0x55 + .8byte .LVL3 + .8byte .LFE225 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST1: + .8byte .LVL0 + .8byte .LVL7 + .2byte 0x1 + .byte 0x51 + .8byte .LVL7 + .8byte .LFE225 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST2: + .8byte .LVL0 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL8-1 + .8byte .LFE225 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST3: + .8byte .LVL2 + .8byte .LVL3 + .2byte 0x1 + .byte 0x53 + .8byte .LVL4 + .8byte .LVL6 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST4: + .8byte .LVL11 + .8byte .LVL12 + .2byte 0x1 + .byte 0x50 + .8byte .LVL12 + .8byte .LFE218 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST11: + .8byte .LVL39 + .8byte .LVL41 + .2byte 0x1 + .byte 0x50 + .8byte .LVL41 + .8byte .LVL71 + .2byte 0x1 + .byte 0x63 + .8byte .LVL71 + .8byte .LVL73 + .2byte 0x1 + .byte 0x53 + .8byte .LVL73 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST12: + .8byte .LVL39 + .8byte .LVL41 + .2byte 0x1 + .byte 0x51 + .8byte .LVL41 + .8byte .LVL69 + .2byte 0x1 + .byte 0x66 + .8byte .LVL69 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST13: + .8byte .LVL39 + .8byte .LVL41 + .2byte 0x1 + .byte 0x52 + .8byte .LVL41 + .8byte .LVL74 + .2byte 0x1 + .byte 0x64 + .8byte .LVL74 + .8byte .LVL76 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte .LVL76 + .8byte .LVL79 + .2byte 0x1 + .byte 0x64 + .8byte .LVL79 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST14: + .8byte .LVL39 + .8byte .LVL41 + .2byte 0x1 + .byte 0x53 + .8byte .LVL41 + .8byte .LVL49 + .2byte 0x1 + .byte 0x69 + .8byte .LVL49 + .8byte .LVL52 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL52 + .8byte .LVL57 + .2byte 0x1 + .byte 0x69 + .8byte .LVL57 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST15: + .8byte .LVL61 + .8byte .LVL62 + .2byte 0x1 + .byte 0x50 + .8byte .LVL62 + .8byte .LVL70 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST16: + .8byte .LVL65 + .8byte .LVL66 + .2byte 0x1 + .byte 0x50 + .8byte .LVL66 + .8byte .LVL75 + .2byte 0x1 + .byte 0x65 + .8byte .LVL76 + .8byte .LVL80 + .2byte 0x1 + .byte 0x65 + .8byte .LVL80 + .8byte .LVL81-1 + .2byte 0x2 + .byte 0x72 + .sleb128 32 + .8byte 0 + .8byte 0 +.LLST17: + .8byte .LVL48 + .8byte .LVL52 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL58 + .8byte .LVL70 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST18: + .8byte .LVL40 + .8byte .LVL41 + .2byte 0x1 + .byte 0x50 + .8byte .LVL41 + .8byte .LVL71 + .2byte 0x1 + .byte 0x63 + .8byte .LVL71 + .8byte .LVL73 + .2byte 0x1 + .byte 0x53 + .8byte .LVL73 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST19: + .8byte .LVL40 + .8byte .LVL41 + .2byte 0x1 + .byte 0x52 + .8byte .LVL41 + .8byte .LVL74 + .2byte 0x1 + .byte 0x64 + .8byte .LVL74 + .8byte .LVL76 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte .LVL76 + .8byte .LVL79 + .2byte 0x1 + .byte 0x64 + .8byte .LVL79 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST20: + .8byte .LVL40 + .8byte .LVL41 + .2byte 0x1 + .byte 0x53 + .8byte .LVL41 + .8byte .LVL47 + .2byte 0x1 + .byte 0x69 + .8byte .LVL52 + .8byte .LVL57 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST21: + .8byte .LVL40 + .8byte .LVL41 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL41 + .8byte .LVL47 + .2byte 0x1 + .byte 0x67 + .8byte .LVL52 + .8byte .LVL57 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST22: + .8byte .LVL41 + .8byte .LVL47 + .2byte 0x1 + .byte 0x65 + .8byte .LVL52 + .8byte .LVL57 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST23: + .8byte .LVL42 + .8byte .LVL45 + .2byte 0x7 + .byte 0xa + .2byte 0x4e20 + .byte 0x88 + .sleb128 0 + .byte 0x1c + .byte 0x9f + .8byte .LVL52 + .8byte .LVL53 + .2byte 0x7 + .byte 0xa + .2byte 0x4e20 + .byte 0x88 + .sleb128 0 + .byte 0x1c + .byte 0x9f + .8byte .LVL53 + .8byte .LVL54 + .2byte 0x7 + .byte 0xa + .2byte 0x4e21 + .byte 0x88 + .sleb128 0 + .byte 0x1c + .byte 0x9f + .8byte .LVL54 + .8byte .LVL55 + .2byte 0x7 + .byte 0xa + .2byte 0x4e20 + .byte 0x88 + .sleb128 0 + .byte 0x1c + .byte 0x9f + .8byte .LVL55 + .8byte .LVL57 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST24: + .8byte .LVL70 + .8byte .LVL75 + .2byte 0x1 + .byte 0x65 + .8byte .LVL76 + .8byte .LVL80 + .2byte 0x1 + .byte 0x65 + .8byte .LVL80 + .8byte .LVL81-1 + .2byte 0x2 + .byte 0x72 + .sleb128 32 + .8byte 0 + .8byte 0 +.LLST25: + .8byte .LVL70 + .8byte .LVL74 + .2byte 0x1 + .byte 0x64 + .8byte .LVL74 + .8byte .LVL76 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte .LVL76 + .8byte .LVL79 + .2byte 0x1 + .byte 0x64 + .8byte .LVL79 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST26: + .8byte .LVL70 + .8byte .LVL71 + .2byte 0x1 + .byte 0x63 + .8byte .LVL71 + .8byte .LVL73 + .2byte 0x1 + .byte 0x53 + .8byte .LVL73 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST27: + .8byte .LVL72 + .8byte .LVL73 + .2byte 0x1 + .byte 0x51 + .8byte .LVL76 + .8byte .LVL78 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 + .section .debug_aranges,"",@progbits + .4byte 0xec + .2byte 0x2 + .4byte .Ldebug_info0 + .byte 0x8 + .byte 0 + .2byte 0 + .2byte 0 + .8byte .LFB225 + .8byte .LFE225-.LFB225 + .8byte .LFB238 + .8byte .LFE238-.LFB238 + .8byte .LFB218 + .8byte .LFE218-.LFB218 + .8byte .LFB226 + .8byte .LFE226-.LFB226 + .8byte .LFB227 + .8byte .LFE227-.LFB227 + .8byte .LFB242 + .8byte .LFE242-.LFB242 + .8byte .LFB230 + .8byte .LFE230-.LFB230 + .8byte .LFB232 + .8byte .LFE232-.LFB232 + .8byte .LFB233 + .8byte .LFE233-.LFB233 + .8byte .LFB234 + .8byte .LFE234-.LFB234 + .8byte .LFB236 + .8byte .LFE236-.LFB236 + .8byte .LFB237 + .8byte .LFE237-.LFB237 + .8byte .LFB239 + .8byte .LFE239-.LFB239 + .8byte 0 + .8byte 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .8byte .LBB32 + .8byte .LBE32 + .8byte .LBB35 + .8byte .LBE35 + .8byte 0 + .8byte 0 + .8byte .LBB52 + .8byte .LBE52 + .8byte .LBB55 + .8byte .LBE55 + .8byte 0 + .8byte 0 + .8byte .LBB56 + .8byte .LBE56 + .8byte .LBB69 + .8byte .LBE69 + .8byte .LBB70 + .8byte .LBE70 + .8byte .LBB71 + .8byte .LBE71 + .8byte .LBB72 + .8byte .LBE72 + .8byte .LBB73 + .8byte .LBE73 + .8byte 0 + .8byte 0 + .8byte .LBB60 + .8byte .LBE60 + .8byte .LBB63 + .8byte .LBE63 + .8byte 0 + .8byte 0 + .8byte .LBB78 + .8byte .LBE78 + .8byte .LBB83 + .8byte .LBE83 + .8byte 0 + .8byte 0 + .8byte .LBB90 + .8byte .LBE90 + .8byte .LBB93 + .8byte .LBE93 + .8byte 0 + .8byte 0 + .8byte .LBB102 + .8byte .LBE102 + .8byte .LBB109 + .8byte .LBE109 + .8byte 0 + .8byte 0 + .8byte .LBB104 + .8byte .LBE104 + .8byte .LBB107 + .8byte .LBE107 + .8byte 0 + .8byte 0 + .8byte .LBB124 + .8byte .LBE124 + .8byte .LBB135 + .8byte .LBE135 + .8byte 0 + .8byte 0 + .8byte .LBB126 + .8byte .LBE126 + .8byte .LBB130 + .8byte .LBE130 + .8byte .LBB133 + .8byte .LBE133 + .8byte 0 + .8byte 0 + .8byte .LFB225 + .8byte .LFE225 + .8byte .LFB238 + .8byte .LFE238 + .8byte .LFB218 + .8byte .LFE218 + .8byte .LFB226 + .8byte .LFE226 + .8byte .LFB227 + .8byte .LFE227 + .8byte .LFB242 + .8byte .LFE242 + .8byte .LFB230 + .8byte .LFE230 + .8byte .LFB232 + .8byte .LFE232 + .8byte .LFB233 + .8byte .LFE233 + .8byte .LFB234 + .8byte .LFE234 + .8byte .LFB236 + .8byte .LFE236 + .8byte .LFB237 + .8byte .LFE237 + .8byte .LFB239 + .8byte .LFE239 + .8byte 0 + .8byte 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF83: + .string "off_mem_rsvmap" +.LASF166: + .string "UCLASS_I2C_EEPROM" +.LASF298: + .string "jt_funcs" +.LASF171: + .string "UCLASS_IRQ" +.LASF133: + .string "initrd_start" +.LASF165: + .string "UCLASS_I2C" +.LASF13: + .string "sizetype" +.LASF312: + .string "net_hostname" +.LASF36: + .string "start" +.LASF206: + .string "UCLASS_SPI" +.LASF169: + .string "UCLASS_I2S" +.LASF334: + .string "NETLOOP_RESTART" +.LASF167: + .string "UCLASS_I2C_GENERIC" +.LASF179: + .string "UCLASS_MOD_EXP" +.LASF230: + .string "UCLASS_IO_DOMAIN" +.LASF251: + .string "using_pre_serial" +.LASF200: + .string "UCLASS_RKNAND" +.LASF142: + .string "UCLASS_DEMO" +.LASF386: + .string "rip_fail" +.LASF91: + .string "ih_magic" +.LASF29: + .string "list_head" +.LASF292: + .string "pm_ctx_phys" +.LASF146: + .string "UCLASS_TEST_PROBE" +.LASF226: + .string "UCLASS_KEY" +.LASF64: + .string "bi_intfreq" +.LASF11: + .string "phys_addr_t" +.LASF221: + .string "UCLASS_VIDEO_BRIDGE" +.LASF291: + .string "video_bottom" +.LASF5: + .string "__u8" +.LASF390: + .string "task_list" +.LASF333: + .string "NETLOOP_CONTINUE" +.LASF209: + .string "UCLASS_SPI_GENERIC" +.LASF286: + .string "malloc_base" +.LASF382: + .string "tid_name" +.LASF40: + .string "flash_info_t" +.LASF184: + .string "UCLASS_PANEL" +.LASF108: + .string "comp" +.LASF103: + .string "image_header_t" +.LASF138: + .string "state" +.LASF428: + .string "disable_serror" +.LASF159: + .string "UCLASS_CROS_EC" +.LASF360: + .string "BOOT_MODE_QUIESCENT" +.LASF58: + .string "bi_dsp_freq" +.LASF105: + .string "image_start" +.LASF350: + .string "BOOT_MODE_NORMAL" +.LASF440: + .string "invalidate_icache_all" +.LASF438: + .string "disable_interrupts" +.LASF144: + .string "UCLASS_TEST_FDT" +.LASF49: + .string "bd_info" +.LASF331: + .string "uclass_id" +.LASF95: + .string "ih_load" +.LASF215: + .string "UCLASS_UFS" +.LASF302: + .string "__dtb_dt_spl_begin" +.LASF376: + .string "TASK_LOAD_UBOOT" +.LASF7: + .string "__u32" +.LASF149: + .string "UCLASS_PCI_EMUL" +.LASF449: + .string "/home4/cjh/uboot-nextdev-v3" +.LASF289: + .string "cur_serial_dev" +.LASF351: + .string "BOOT_MODE_RECOVERY" +.LASF318: + .string "net_tx_packet" +.LASF225: + .string "UCLASS_FG" +.LASF317: + .string "net_server_ip" +.LASF325: + .string "net_native_vlan" +.LASF265: + .string "ram_top_ext_size" +.LASF223: + .string "UCLASS_VIDEO_CRTC" +.LASF158: + .string "UCLASS_CODEC" +.LASF447: + .ascii "GNU C11 6.3.1 20170404 -ms" + .string "trict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -fno-pic -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18" +.LASF283: + .string "env_buf" +.LASF20: + .string "errno" +.LASF15: + .string "long int" +.LASF53: + .string "bi_flashsize" +.LASF339: + .string "__bss_end" +.LASF189: + .string "UCLASS_PHY" +.LASF76: + .string "IRQ_STACK_START_IN" +.LASF87: + .string "size_dt_strings" +.LASF220: + .string "UCLASS_VIDEO" +.LASF369: + .string "EVT_CRYPTO" +.LASF266: + .string "relocaddr" +.LASF406: + .string "mpb_post" +.LASF448: + .string "common/mp_boot.c" +.LASF328: + .string "net_boot_file_size" +.LASF387: + .string "cpu_core" +.LASF432: + .string "run_command" +.LASF97: + .string "ih_dcrc" +.LASF63: + .string "bi_ethspeed" +.LASF141: + .string "UCLASS_ROOT" +.LASF26: + .string "ide_bus_offset" +.LASF374: + .string "TASK_INIT_DISPLAY" +.LASF315: + .string "net_server_ethaddr" +.LASF66: + .string "bi_arch_number" +.LASF3: + .string "signed char" +.LASF172: + .string "UCLASS_KEYBOARD" +.LASF18: + .string "uint8_t" +.LASF38: + .string "udevice" +.LASF436: + .string "udelay" +.LASF99: + .string "ih_arch" +.LASF80: + .string "totalsize" +.LASF92: + .string "ih_hcrc" +.LASF268: + .string "mon_len" +.LASF107: + .string "load" +.LASF214: + .string "UCLASS_TPM" +.LASF43: + .string "lmb_property" +.LASF85: + .string "last_comp_version" +.LASF0: + .string "unsigned char" +.LASF140: + .string "images" +.LASF341: + .string "priv" +.LASF229: + .string "UCLASS_DVFS" +.LASF59: + .string "bi_ddr_freq" +.LASF419: + .string "mpb_initial" +.LASF173: + .string "UCLASS_LED" +.LASF94: + .string "ih_size" +.LASF445: + .string "rockchip_get_boot_mode" +.LASF437: + .string "dcache_enable" +.LASF203: + .string "UCLASS_SCMI_AGENT" +.LASF233: + .string "UCLASS_MDIO" +.LASF22: + .string "_Bool" +.LASF337: + .string "net_state" +.LASF168: + .string "UCLASS_I2C_MUX" +.LASF14: + .string "char" +.LASF24: + .string "_binary_u_boot_bin_start" +.LASF219: + .string "UCLASS_USB_GADGET_GENERIC" +.LASF335: + .string "NETLOOP_SUCCESS" +.LASF433: + .string "printf" +.LASF385: + .string "ptid_mask" +.LASF332: + .string "net_loop_state" +.LASF247: + .string "tlb_size" +.LASF274: + .string "dm_root_f" +.LASF157: + .string "UCLASS_AMP" +.LASF195: + .string "UCLASS_PWRSEQ" +.LASF123: + .string "fit_hdr_fdt" +.LASF326: + .string "net_restart_wrap" +.LASF314: + .string "net_ethaddr" +.LASF256: + .string "flags" +.LASF100: + .string "ih_type" +.LASF368: + .string "EVT_BOOT_SIZE" +.LASF81: + .string "off_dt_struct" +.LASF429: + .string "mdelay" +.LASF54: + .string "bi_flashoffset" +.LASF327: + .string "net_boot_file_name" +.LASF143: + .string "UCLASS_TEST" +.LASF413: + .string "mpb_task_dump" +.LASF93: + .string "ih_time" +.LASF258: + .string "bus_clk" +.LASF196: + .string "UCLASS_RAM" +.LASF162: + .string "UCLASS_ETH" +.LASF377: + .string "TASK_LOAD_FIT" +.LASF104: + .string "image_info" +.LASF110: + .string "arch" +.LASF260: + .string "mem_clk" +.LASF257: + .string "cpu_clk" +.LASF32: + .string "select_hwpart" +.LASF319: + .string "net_rx_packets" +.LASF75: + .string "_datarelro_start_ofs" +.LASF17: + .string "ulong" +.LASF384: + .string "task_fn" +.LASF96: + .string "ih_ep" +.LASF45: + .string "lmb_region" +.LASF388: + .string "task" +.LASF408: + .string "mpb_task_wait_timeout_done" +.LASF416: + .string "tid_to_task_index" +.LASF118: + .string "fit_uname_os" +.LASF60: + .string "bi_bootflags" +.LASF316: + .string "net_ip" +.LASF278: + .string "fdt_size" +.LASF310: + .string "net_dns_server" +.LASF338: + .string "__bss_start" +.LASF330: + .string "net_ping_ip" +.LASF47: + .string "memory" +.LASF78: + .string "fdt_header" +.LASF175: + .string "UCLASS_MAILBOX" +.LASF343: + .string "filename" +.LASF130: + .string "rd_end" +.LASF269: + .string "irq_sp" +.LASF135: + .string "cmdline_start" +.LASF255: + .string "global_data" +.LASF371: + .string "EVT_SIMPLE_BOOTM" +.LASF379: + .string "TASK_HASH_ANDROID" +.LASF204: + .string "UCLASS_SCSI" +.LASF217: + .string "UCLASS_USB_DEV_GENERIC" +.LASF176: + .string "UCLASS_MASS_STORAGE" +.LASF1: + .string "long unsigned int" +.LASF151: + .string "UCLASS_SIMPLE_BUS" +.LASF299: + .string "gd_t" +.LASF311: + .string "net_nis_domain" +.LASF125: + .string "fit_noffset_fdt" +.LASF370: + .string "EVT_LINUX" +.LASF342: + .string "bl_len" +.LASF446: + .string "get_ticks" +.LASF336: + .string "NETLOOP_FAIL" +.LASF224: + .string "UCLASS_WDT" +.LASF245: + .string "timer_reset_value" +.LASF270: + .string "start_addr_sp" +.LASF55: + .string "bi_sramstart" +.LASF25: + .string "_binary_u_boot_bin_end" +.LASF271: + .string "reloc_off" +.LASF86: + .string "boot_cpuid_phys" +.LASF244: + .string "lastinc" +.LASF248: + .string "tlb_fillptr" +.LASF121: + .string "fit_uname_rd" +.LASF210: + .string "UCLASS_SYSCON" +.LASF116: + .string "fit_uname_cfg" +.LASF205: + .string "UCLASS_SERIAL" +.LASF324: + .string "net_our_vlan" +.LASF294: + .string "serial" +.LASF154: + .string "UCLASS_BLK" +.LASF111: + .string "image_info_t" +.LASF150: + .string "UCLASS_USB_EMUL" +.LASF439: + .string "icache_disable" +.LASF246: + .string "tlb_addr" +.LASF354: + .string "BOOT_MODE_CHARGING" +.LASF188: + .string "UCLASS_PCI_GENERIC" +.LASF383: + .string "task_t" +.LASF423: + .string "spl_load_android" +.LASF404: + .string "ticks" +.LASF106: + .string "image_len" +.LASF375: + .string "TASK_LOAD_BASEPARAMETER" +.LASF394: + .string "wait_evt" +.LASF61: + .string "bi_ip_addr" +.LASF409: + .string "timeout_ms" +.LASF190: + .string "UCLASS_PINCONFIG" +.LASF399: + .string "smp_entry" +.LASF212: + .string "UCLASS_THERMAL" +.LASF114: + .string "legacy_hdr_os_copy" +.LASF367: + .string "EVT_BOOT_ADDR" +.LASF9: + .string "long long int" +.LASF277: + .string "new_fdt" +.LASF21: + .string "___strtok" +.LASF329: + .string "net_boot_file_expected_size_in_blocks" +.LASF252: + .string "enable" +.LASF411: + .string "ptid" +.LASF183: + .string "UCLASS_NVME" +.LASF249: + .string "tlb_emerg" +.LASF112: + .string "bootm_headers" +.LASF37: + .string "protect" +.LASF216: + .string "UCLASS_USB" +.LASF227: + .string "UCLASS_RC" +.LASF414: + .string "mpb_task_is_done" +.LASF284: + .string "timebase_h" +.LASF285: + .string "timebase_l" +.LASF160: + .string "UCLASS_DISPLAY" +.LASF323: + .string "net_null_ethaddr" +.LASF263: + .string "env_valid" +.LASF228: + .string "UCLASS_CHARGE_DISPLAY" +.LASF303: + .string "load_addr" +.LASF117: + .string "fit_hdr_os" +.LASF73: + .string "_datarelrolocal_start_ofs" +.LASF412: + .string "timeout" +.LASF361: + .string "BOOT_MODE_UNDEFINE" +.LASF254: + .string "addr" +.LASF344: + .string "read" +.LASF355: + .string "BOOT_MODE_UMS" +.LASF8: + .string "unsigned int" +.LASF16: + .string "ushort" +.LASF418: + .string "task_is_registered" +.LASF281: + .string "ufdt_blob" +.LASF426: + .string "spl_init_display" +.LASF287: + .string "malloc_limit" +.LASF417: + .string "mpb_task_register" +.LASF192: + .string "UCLASS_PMIC" +.LASF113: + .string "legacy_hdr_os" +.LASF82: + .string "off_dt_strings" +.LASF397: + .string "mpb_init_1" +.LASF300: + .string "monitor_flash_len" +.LASF177: + .string "UCLASS_MISC" +.LASF51: + .string "bi_memsize" +.LASF410: + .string "mpb_task_wait_parent" +.LASF23: + .string "image_base" +.LASF395: + .string "once" +.LASF211: + .string "UCLASS_SYSRESET" +.LASF164: + .string "UCLASS_FIRMWARE" +.LASF443: + .string "invalidate_dcache_range" +.LASF174: + .string "UCLASS_LPC" +.LASF170: + .string "UCLASS_IDE" +.LASF290: + .string "video_top" +.LASF431: + .string "snprintf" +.LASF280: + .string "of_root_f" +.LASF139: + .string "bootm_headers_t" +.LASF57: + .string "bi_arm_freq" +.LASF198: + .string "UCLASS_REMOTEPROC" +.LASF109: + .string "type" +.LASF120: + .string "fit_hdr_rd" +.LASF405: + .string "fail" +.LASF262: + .string "env_addr" +.LASF56: + .string "bi_sramsize" +.LASF348: + .string "boot_size" +.LASF407: + .string "mpb_task_wait_done" +.LASF422: + .string "spl_hash_android" +.LASF275: + .string "uclass_root" +.LASF163: + .string "UCLASS_GPIO" +.LASF193: + .string "UCLASS_PWM" +.LASF420: + .string "set_gd" +.LASF42: + .string "long double" +.LASF264: + .string "ram_top" +.LASF296: + .string "console_evt" +.LASF396: + .string "mpb_init_x" +.LASF450: + .string "mpb_task_set_state" +.LASF129: + .string "rd_start" +.LASF194: + .string "UCLASS_POWER_DOMAIN" +.LASF197: + .string "UCLASS_REGULATOR" +.LASF305: + .string "save_size" +.LASF430: + .string "msec" +.LASF155: + .string "UCLASS_CLK" +.LASF403: + .string "core_task_run" +.LASF346: + .string "info" +.LASF72: + .string "_datarel_start_ofs" +.LASF250: + .string "pre_serial" +.LASF102: + .string "ih_name" +.LASF98: + .string "ih_os" +.LASF345: + .string "task_data" +.LASF136: + .string "cmdline_end" +.LASF320: + .string "net_rx_packet" +.LASF241: + .string "LOGF_MAX_CATEGORIES" +.LASF276: + .string "fdt_blob" +.LASF33: + .string "size" +.LASF357: + .string "BOOT_MODE_PANIC" +.LASF10: + .string "long long unsigned int" +.LASF90: + .string "image_header" +.LASF363: + .string "CPU_1" +.LASF19: + .string "__be32" +.LASF402: + .string "mpb_quit_load_image" +.LASF52: + .string "bi_flashstart" +.LASF119: + .string "fit_noffset_os" +.LASF415: + .string "mpb_task_set_result" +.LASF178: + .string "UCLASS_MMC" +.LASF240: + .string "UCLASS_INVALID" +.LASF389: + .string "mpb_core" +.LASF218: + .string "UCLASS_USB_HUB" +.LASF279: + .string "of_root" +.LASF234: + .string "UCLASS_EBC" +.LASF340: + .string "spl_load_info" +.LASF293: + .string "new_line" +.LASF434: + .string "memset" +.LASF41: + .string "flash_info" +.LASF84: + .string "version" +.LASF46: + .string "region" +.LASF88: + .string "size_dt_struct" +.LASF273: + .string "dm_root" +.LASF236: + .string "UCLASS_RNG" +.LASF295: + .string "sys_start_tick" +.LASF180: + .string "UCLASS_MTD" +.LASF352: + .string "BOOT_MODE_BOOTLOADER" +.LASF77: + .string "fdt32_t" +.LASF272: + .string "new_gd" +.LASF182: + .string "UCLASS_NORTHBRIDGE" +.LASF62: + .string "bi_enetaddr" +.LASF39: + .string "mtd_info" +.LASF306: + .string "in_addr" +.LASF353: + .string "BOOT_MODE_LOADER" +.LASF321: + .string "net_rx_packet_len" +.LASF398: + .string "init" +.LASF301: + .string "__dtb_dt_begin" +.LASF199: + .string "UCLASS_RESET" +.LASF122: + .string "fit_noffset_rd" +.LASF153: + .string "UCLASS_AHCI" +.LASF12: + .string "phys_size_t" +.LASF156: + .string "UCLASS_CPU" +.LASF71: + .string "FIQ_STACK_START" +.LASF137: + .string "verify" +.LASF31: + .string "name" +.LASF235: + .string "UCLASS_EINK_DISPLAY" +.LASF185: + .string "UCLASS_PANEL_BACKLIGHT" +.LASF213: + .string "UCLASS_TIMER" +.LASF208: + .string "UCLASS_SPI_FLASH" +.LASF261: + .string "have_console" +.LASF65: + .string "bi_busfreq" +.LASF6: + .string "short int" +.LASF347: + .string "boot_addr" +.LASF191: + .string "UCLASS_PINCTRL" +.LASF201: + .string "UCLASS_RAMDISK" +.LASF148: + .string "UCLASS_I2C_EMUL" +.LASF378: + .string "TASK_LOAD_ANDROID" +.LASF207: + .string "UCLASS_SPMI" +.LASF391: + .string "tdata" +.LASF145: + .string "UCLASS_TEST_BUS" +.LASF435: + .string "flush_dcache_all" +.LASF304: + .string "save_addr" +.LASF444: + .string "flush_dcache_range" +.LASF288: + .string "malloc_ptr" +.LASF427: + .string "cpuectlr_disable" +.LASF401: + .string "mpb_task_run" +.LASF424: + .string "spl_load_fit" +.LASF134: + .string "initrd_end" +.LASF372: + .string "EVT_VIDEO_BP" +.LASF253: + .string "baudrate" +.LASF74: + .string "_datarellocal_start_ofs" +.LASF242: + .string "arch_global_data" +.LASF239: + .string "UCLASS_COUNT" +.LASF362: + .string "CPU_0" +.LASF259: + .string "pci_clk" +.LASF364: + .string "CPU_2" +.LASF365: + .string "CPU_3" +.LASF30: + .string "block_drvr" +.LASF452: + .string "memcpy" +.LASF35: + .string "flash_id" +.LASF231: + .string "UCLASS_CRYPTO" +.LASF297: + .string "device_node" +.LASF267: + .string "ram_size" +.LASF128: + .string "fit_noffset_setup" +.LASF89: + .string "working_fdt" +.LASF282: + .string "fdt_blob_kern" +.LASF313: + .string "net_root_path" +.LASF161: + .string "UCLASS_DMA" +.LASF69: + .string "bd_t" +.LASF237: + .string "UCLASS_DMC" +.LASF307: + .string "s_addr" +.LASF322: + .string "net_bcast_ethaddr" +.LASF392: + .string "mpb_gd" +.LASF67: + .string "bi_boot_params" +.LASF359: + .string "BOOT_MODE_DFU" +.LASF308: + .string "net_gateway" +.LASF50: + .string "bi_memstart" +.LASF222: + .string "UCLASS_VIDEO_CONSOLE" +.LASF48: + .string "reserved" +.LASF373: + .string "TASK_NONE" +.LASF238: + .string "UCLASS_PD" +.LASF441: + .string "dcache_disable" +.LASF68: + .string "bi_dram" +.LASF2: + .string "short unsigned int" +.LASF79: + .string "magic" +.LASF126: + .string "fit_hdr_setup" +.LASF115: + .string "legacy_hdr_valid" +.LASF381: + .string "TASK_MAX" +.LASF44: + .string "base" +.LASF451: + .string "spl_dummy" +.LASF202: + .string "UCLASS_RTC" +.LASF366: + .string "EVT_BOOT_DEV" +.LASF243: + .string "timer_rate_hz" +.LASF34: + .string "sector_count" +.LASF101: + .string "ih_comp" +.LASF400: + .string "core_main" +.LASF131: + .string "ft_addr" +.LASF232: + .string "UCLASS_ETH_PHY" +.LASF393: + .string "task_init" +.LASF4: + .string "uchar" +.LASF132: + .string "ft_len" +.LASF27: + .string "next" +.LASF421: + .string "data" +.LASF181: + .string "UCLASS_NOP" +.LASF380: + .string "TASK_RUN_UBOOT" +.LASF349: + .string "_boot_mode" +.LASF127: + .string "fit_uname_setup" +.LASF28: + .string "prev" +.LASF442: + .string "invalidate_dcache_all" +.LASF186: + .string "UCLASS_PCH" +.LASF187: + .string "UCLASS_PCI" +.LASF309: + .string "net_netmask" +.LASF358: + .string "BOOT_MODE_WATCHDOG" +.LASF70: + .string "IRQ_STACK_START" +.LASF152: + .string "UCLASS_ADC" +.LASF356: + .string "BOOT_MODE_BROM_DOWNLOAD" +.LASF147: + .string "UCLASS_SPI_EMUL" +.LASF425: + .string "spl_load_baseparamter" +.LASF124: + .string "fit_uname_fdt" + .ident "GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404" + .section .note.GNU-stack,"",@progbits diff --git a/u-boot/common/spl/Kconfig b/u-boot/common/spl/Kconfig index c62938c..dfa3fcd 100644 --- a/u-boot/common/spl/Kconfig +++ b/u-boot/common/spl/Kconfig @@ -144,6 +144,17 @@ The SPL code will be relocated to a high memory if you say no here. Only ARM64 and PowerPC SPL support relocate now. +config SPL_BOOT_IMAGE + bool "SPL boot image load support" + default n + help + This enable SPL boot image load support + +config SPL_BOOT_IMAGE_BUF + hex "SPL boot image memory buffer" + depends on SPL_BOOT_IMAGE + default 0x10000000 + config SPL_RELOC_TEXT_BASE hex "Address the SPL relocate to" depends on !SPL_SKIP_RELOCATE @@ -598,6 +609,12 @@ boot. This enables the drivers in drivers/pch as part of an SPL build. +config SPL_PCIE_EP_SUPPORT + bool "Support loading from PCIE EP" + help + Enable support for PCIE EP driver in SPL. The RC will download the + image as a RAM partition for firmware. + config SPL_POST_MEM_SUPPORT bool "Support POST drivers" help @@ -900,6 +917,13 @@ help Enable boot kernel in SPL. +config SPL_KERNEL_BOOT_PREBUILT + bool "Enable boot kernel in SPL with prebuilt program" + depends on SPL_KERNEL_BOOT + default y + help + Enable boot kernel in SPL with prebuilt program. + config SPL_KERNEL_BOOT_SECTOR hex "Sector address to load kernel in SPL" depends on SPL_KERNEL_BOOT diff --git a/u-boot/common/spl/Makefile b/u-boot/common/spl/Makefile index 3bab93f..cf9d874 100644 --- a/u-boot/common/spl/Makefile +++ b/u-boot/common/spl/Makefile @@ -24,7 +24,7 @@ ifdef CONFIG_SPL_BUILD obj-$(CONFIG_$(SPL_TPL_)BOOTROM_SUPPORT) += spl_bootrom.o -ifdef CONFIG_SPL_KERNEL_BOOT +ifdef CONFIG_SPL_KERNEL_BOOT_PREBUILT ifdef CONFIG_ARM64 obj-$(CONFIG_$(SPL_TPL_)LOAD_FIT) += spl_fit_tb_arm64.o else @@ -57,4 +57,5 @@ obj-$(CONFIG_$(SPL_TPL_)SPI_LOAD) += spl_spi.o obj-$(CONFIG_$(SPL_TPL_)RAM_SUPPORT) += spl_ram.o obj-$(CONFIG_$(SPL_TPL_)USB_SDP_SUPPORT) += spl_sdp.o +obj-$(CONFIG_$(SPL_TPL_)BOOT_IMAGE) += spl_boot_image.o endif diff --git a/u-boot/common/spl/spl.c b/u-boot/common/spl/spl.c index 6836796..bcb37ec 100644 --- a/u-boot/common/spl/spl.c +++ b/u-boot/common/spl/spl.c @@ -17,6 +17,7 @@ #include <version.h> #include <image.h> #include <malloc.h> +#include <mp_boot.h> #include <dm/root.h> #include <linux/compiler.h> #include <fdt_support.h> @@ -547,6 +548,10 @@ memset(&spl_image, '\0', sizeof(spl_image)); +#ifdef CONFIG_MP_BOOT + mpb_init_x(0); +#endif + #if CONFIG_IS_ENABLED(ATF) /* * Bl32 ep is optional, initial it as an invalid value. @@ -574,6 +579,10 @@ } spl_perform_fixups(&spl_image); + +#ifdef CONFIG_MP_BOOT + mpb_init_x(2); +#endif #ifdef CONFIG_CPU_V7M spl_image.entry_point |= 0x1; @@ -710,7 +719,7 @@ /* cleanup before jump to next stage */ void spl_cleanup_before_jump(struct spl_image_info *spl_image) { - ulong us; + ulong us, tt_us; spl_board_prepare_for_jump(spl_image); @@ -738,5 +747,6 @@ isb(); us = (get_ticks() - gd->sys_start_tick) / 24UL; - printf("Total: %ld.%ld ms\n\n", us / 1000, us % 1000); + tt_us = get_ticks() / (COUNTER_FREQUENCY / 1000000); + printf("Total: %ld.%ld/%ld.%ld ms\n\n", us / 1000, us % 1000, tt_us / 1000, tt_us % 1000); } diff --git a/u-boot/common/spl/spl_ab.c b/u-boot/common/spl/spl_ab.c index 31b63f7..842c36c 100644 --- a/u-boot/common/spl/spl_ab.c +++ b/u-boot/common/spl/spl_ab.c @@ -319,3 +319,38 @@ out: return ret; } + +/* + * If boot A/B system fail, tries-remaining decrease 1 + * and do reset automatically if still bootable. + */ +int spl_ab_decrease_reset(struct blk_desc *dev_desc) +{ + AvbABData ab_data; + int ret; + + ret = spl_ab_data_read(dev_desc, &ab_data, "misc"); + if (ret) + return ret; + + /* If current device cannot boot, return and try other devices. */ + if (!spl_slot_is_bootable(&ab_data.slots[0]) && + !spl_slot_is_bootable(&ab_data.slots[1])) { + printf("A/B: no bootable slot\n"); + return -ENODEV; + } + + /* If current device still can boot, decrease and do reset. */ + ret = spl_ab_decrease_tries(dev_desc); + if (ret) + return ret; + + printf("A/B: slot boot fail, do reset\n"); + do_reset(NULL, 0, 0, NULL); + + /* + * Only do_reset() fail will arrive here, return a + * negative number, then enter maskrom in the caller. + */ + return -EINVAL; +} diff --git a/u-boot/common/spl/spl_boot_image.c b/u-boot/common/spl/spl_boot_image.c new file mode 100644 index 0000000..dd49817 --- /dev/null +++ b/u-boot/common/spl/spl_boot_image.c @@ -0,0 +1,305 @@ +/* + * (C) Copyright 2023 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <android_image.h> +#include <crypto.h> +#include <image.h> +#include <mp_boot.h> +#include <part.h> +#include <spl.h> +#include <asm/io.h> + +#define BLK_CNT(_num_bytes, _block_size) \ + ((_num_bytes + _block_size - 1) / _block_size) + +#ifdef CONFIG_ANDROID_BOOT_IMAGE +static int android_check_header(const struct andr_img_hdr *hdr) +{ + return memcmp(ANDR_BOOT_MAGIC, hdr->magic, ANDR_BOOT_MAGIC_SIZE); +} + +static void print_hash(const char *label, u8 *hash, int len) +{ + int i; + + printf("%s:\n 0x", label ? : "Hash"); + for (i = 0; i < len; i++) + printf("%02x", hash[i]); + printf("\n"); +} + +#if 0 +static void spl_android_print_contents(const struct andr_img_hdr *hdr) +{ + const char * const p = IMAGE_INDENT_STRING; + /* os_version = ver << 11 | lvl */ + u32 os_ver = hdr->os_version >> 11; + u32 os_lvl = hdr->os_version & ((1U << 11) - 1); + u32 header_version = hdr->header_version; + + printf("%skernel size: %x\n", p, hdr->kernel_size); + printf("%skernel address: %x\n", p, hdr->kernel_addr); + printf("%sramdisk size: %x\n", p, hdr->ramdisk_size); + printf("%sramdisk address: %x\n", p, hdr->ramdisk_addr); + printf("%ssecond size: %x\n", p, hdr->second_size); + printf("%ssecond address: %x\n", p, hdr->second_addr); + printf("%stags address: %x\n", p, hdr->tags_addr); + printf("%spage size: %x\n", p, hdr->page_size); + printf("%sheader_version: %x\n", p, header_version); + /* ver = A << 14 | B << 7 | C (7 bits for each of A, B, C) + * lvl = ((Y - 2000) & 127) << 4 | M (7 bits for Y, 4 bits for M) */ + printf("%sos_version: %x (ver: %u.%u.%u, level: %u.%u)\n", + p, hdr->os_version, + (os_ver >> 7) & 0x7F, (os_ver >> 14) & 0x7F, os_ver & 0x7F, + (os_lvl >> 4) + 2000, os_lvl & 0x0F); + printf("%sname: %s\n", p, hdr->name); + printf("%scmdline: %s\n", p, hdr->cmdline); + + if (header_version == 1 || header_version == 2) { + printf("%srecovery dtbo size: %x\n", p, hdr->recovery_dtbo_size); + printf("%srecovery dtbo offset: %llx\n", p, hdr->recovery_dtbo_offset); + printf("%sheader size: %x\n", p, hdr->header_size); + } + + if (header_version == 2 || header_version == 3) { + printf("%sdtb size: %x\n", p, hdr->dtb_size); + printf("%sdtb addr: %llx\n", p, hdr->dtb_addr); + } + + if (header_version >= 3) { + printf("%scmdline: %s\n", p, hdr->total_cmdline); + printf("%svendor ramdisk size: %x\n", p, hdr->vendor_ramdisk_size); + printf("%svendor page size: %x\n", p, hdr->vendor_page_size); + printf("%svendor header version: %d\n", p, hdr->vendor_header_version); + printf("%svendor header size: %x\n", p, hdr->vendor_header_size); + } + + if (header_version >= 4) { + printf("%svendor ramdisk table size: %x\n", + p, hdr->vendor_ramdisk_table_size); + printf("%svendor ramdisk table entry num: %x\n", + p, hdr->vendor_ramdisk_table_entry_num); + printf("%svendor ramdisk table entry size: %x\n", + p, hdr->vendor_ramdisk_table_entry_size); + printf("%svendor bootconfig size: %d\n", + p, hdr->vendor_bootconfig_size); + } +} +#endif + +static ulong android_size(struct andr_img_hdr *hdr) +{ + ulong len; + + len = hdr->page_size + + ALIGN(hdr->kernel_size, hdr->page_size) + + ALIGN(hdr->ramdisk_size, hdr->page_size) + + ALIGN(hdr->second_size, hdr->page_size); + if (hdr->header_version > 0) + len += ALIGN(hdr->recovery_dtbo_size, hdr->page_size); + if (hdr->header_version > 1) + len += ALIGN(hdr->dtb_size, hdr->page_size); +#if 0 + spl_android_print_contents(hdr); +#endif + + return len; +} + +int spl_load_android(struct task_data *data) +{ + struct spl_load_info *info = &data->info; + void *buf = (void *)CONFIG_SPL_BOOT_IMAGE_BUF; + disk_partition_t part; + ulong blkcnt; + + debug("== Android: load start\n"); + + if (part_get_info_by_name(info->dev, "boot", &part) < 0) { + printf("No boot partition\n"); + return -ENOENT; + } + + blkcnt = BLK_CNT(sizeof(struct andr_img_hdr), info->bl_len); + if (info->read(info, part.start, blkcnt, buf) != blkcnt) + return -EIO; + + if (android_check_header(buf)) + return -EINVAL; + + blkcnt = BLK_CNT(android_size(buf), info->bl_len); + if (info->read(info, part.start, blkcnt, buf) != blkcnt) + return -EIO; + + data->boot_addr = (void *)CONFIG_SPL_BOOT_IMAGE_BUF; + data->boot_size = blkcnt * info->bl_len; + + flush_dcache_range((ulong)data, (ulong)data + sizeof(*data)); + flush_dcache_range((ulong)buf, (ulong)buf + blkcnt); + + debug("== Android: load 0x%08lx size OK\n", blkcnt * info->bl_len); + + return 0; +} + +#ifdef CONFIG_ARMV8_CE_SHA1 +int spl_hash_android(struct task_data *data) +{ + struct andr_img_hdr *hdr = (void *)CONFIG_SPL_BOOT_IMAGE_BUF; + sha1_context ctx; + uchar hash[32]; + void *buf; + + printf("== Android: hash start\n"); + + if (hdr->header_version >= 3) + return -EINVAL; + + sha1_starts(&ctx); + + buf = (void *)hdr + hdr->page_size; + sha1_update(&ctx, (const uchar *)buf, hdr->kernel_size); + sha1_update(&ctx, (const uchar *)&hdr->kernel_size, sizeof(hdr->kernel_size)); + + buf += ALIGN(hdr->kernel_size, hdr->page_size); + sha1_update(&ctx, (const uchar *)buf, hdr->ramdisk_size); + sha1_update(&ctx, (const uchar *)&hdr->ramdisk_size, sizeof(hdr->ramdisk_size)); + + buf += ALIGN(hdr->ramdisk_size, hdr->page_size); + sha1_update(&ctx, (const uchar *)buf, hdr->second_size); + sha1_update(&ctx, (const uchar *)&hdr->second_size, sizeof(hdr->second_size)); + + if (hdr->header_version > 0) { + buf += ALIGN(hdr->second_size, hdr->page_size); + sha1_update(&ctx, (const uchar *)buf, hdr->recovery_dtbo_size); + sha1_update(&ctx, (const uchar *)&hdr->recovery_dtbo_size, sizeof(hdr->recovery_dtbo_size)); + } + if (hdr->header_version > 1) { + buf += ALIGN(hdr->recovery_dtbo_size, hdr->page_size); + sha1_update(&ctx, (const uchar *)buf, hdr->dtb_size); + sha1_update(&ctx, (const uchar *)&hdr->dtb_size, sizeof(hdr->dtb_size)); + } + + sha1_finish(&ctx, hash); + + if (memcmp(hash, hdr->id, 20)) { + print_hash("Hash from header", (u8 *)hdr->id, 20); + print_hash("Hash real", (u8 *)hash, 20); + return -EBADFD; + } + + printf("== Android: hash OK, 0x%08lx\n", (ulong)data->boot_addr); + + return 0; +} + +#else +int spl_hash_android(struct task_data *data) +{ + struct andr_img_hdr *hdr = (void *)CONFIG_SPL_BOOT_IMAGE_BUF; + struct udevice *dev; + sha_context ctx; + uchar hash[32]; + void *buf; + + debug("== Android: hash start\n"); + + if (hdr->header_version >= 3) + return -EINVAL; + + ctx.algo = CRYPTO_SHA1; + dev = crypto_get_device(ctx.algo); + if (!dev) { + printf("No crypto device for sha1\n"); + return -ENODEV; + } + + ctx.length = hdr->kernel_size + sizeof(hdr->kernel_size) + + hdr->ramdisk_size + sizeof(hdr->ramdisk_size) + + hdr->second_size + sizeof(hdr->second_size); + if (hdr->header_version > 0) + ctx.length += hdr->recovery_dtbo_size + sizeof(hdr->recovery_dtbo_size); + if (hdr->header_version > 1) + ctx.length += hdr->dtb_size + sizeof(hdr->dtb_size); + + crypto_sha_init(dev, &ctx); + + buf = (void *)hdr + hdr->page_size; + crypto_sha_update(dev, buf, hdr->kernel_size); + crypto_sha_update(dev, &hdr->kernel_size, sizeof(hdr->kernel_size)); + + buf += ALIGN(hdr->kernel_size, hdr->page_size); + crypto_sha_update(dev, buf, hdr->ramdisk_size); + crypto_sha_update(dev, &hdr->ramdisk_size, sizeof(hdr->ramdisk_size)); + + buf += ALIGN(hdr->ramdisk_size, hdr->page_size); + crypto_sha_update(dev, buf, hdr->second_size); + crypto_sha_update(dev, &hdr->second_size, sizeof(hdr->second_size)); + + if (hdr->header_version > 0) { + buf += ALIGN(hdr->second_size, hdr->page_size); + crypto_sha_update(dev, buf, hdr->recovery_dtbo_size); + crypto_sha_update(dev, &hdr->recovery_dtbo_size, sizeof(hdr->recovery_dtbo_size)); + } + if (hdr->header_version > 1) { + buf += ALIGN(hdr->recovery_dtbo_size, hdr->page_size); + crypto_sha_update(dev, buf, hdr->dtb_size); + crypto_sha_update(dev, &hdr->dtb_size, sizeof(hdr->dtb_size)); + } + + crypto_sha_final(dev, &ctx, hash); + + if (memcmp(hash, hdr->id, 20)) { + print_hash("Hash from header", (u8 *)hdr->id, 20); + print_hash("Hash real", (u8 *)hash, 20); + return -EBADFD; + } + + debug("== Android: hash OK, 0x%08lx\n", (ulong)data->boot_addr); + + return 0; +} + +#endif +#endif + +#ifdef CONFIG_ROCKCHIP_FIT_IMAGE +int spl_load_fit(struct task_data *data) +{ + struct spl_load_info *info = &data->info; + void *buf = (void *)CONFIG_SPL_BOOT_IMAGE_BUF; + disk_partition_t part; + ulong blkcnt; + int size; + + debug("== FIT: load start\n"); + + if (part_get_info_by_name(info->dev, "boot", &part) < 0) { + printf("No boot partition\n"); + return -ENOENT; + } + + blkcnt = BLK_CNT(sizeof(struct fdt_header), info->bl_len); + if (info->read(info, part.start, blkcnt, buf) != blkcnt) + return -EIO; + + if (fdt_check_header(buf)) + return -EINVAL; + + size = fit_get_totalsize(buf, &size); + blkcnt = BLK_CNT(size, info->bl_len); + if (info->read(info, part.start, blkcnt, buf) != blkcnt) + return -EIO; + + flush_dcache_range((ulong)buf, (ulong)buf + blkcnt); + + debug("== FIT: load 0x%08x size OK\n", size); + + return 0; +} +#endif + diff --git a/u-boot/common/spl/spl_fit.c b/u-boot/common/spl/spl_fit.c index b19e0c6..29f9436 100644 --- a/u-boot/common/spl/spl_fit.c +++ b/u-boot/common/spl/spl_fit.c @@ -12,6 +12,7 @@ #include <image.h> #include <malloc.h> #include <mtd_blk.h> +#include <mp_boot.h> #include <spl.h> #include <spl_ab.h> #include <linux/libfdt.h> @@ -481,6 +482,8 @@ #else sector = CONFIG_SPL_KERNEL_BOOT_SECTOR; #endif + printf("Trying kernel at 0x%x sector from '%s' part\n", sector, part_name); + if (info->read(info, sector, 1, &fit_header) != 1) { debug("%s: Failed to read header\n", __func__); return -EIO; @@ -793,6 +796,10 @@ int ret = -EINVAL; int i; +#ifdef CONFIG_MP_BOOT + mpb_init_1(*info); +#endif + printf("Trying fit image at 0x%lx sector\n", sector_offs); for (i = 0; i < CONFIG_SPL_FIT_IMAGE_MULTIPLE; i++) { if (i > 0) { @@ -820,15 +827,18 @@ } } #ifdef CONFIG_SPL_AB + /* If boot fail in spl, spl must decrease 1 and do_reset. */ + if (ret) + return spl_ab_decrease_reset(info->dev); /* - * If boot fail in spl, spl must decrease 1. If boot - * successfully, it is no need to do that and U-boot will - * always to decrease 1. If in thunderboot process, - * always need to decrease 1. + * If boot successfully, it is no need to do decrease + * and U-boot will always decrease 1. + * If in thunderboot process, always need to decrease 1. */ - if (IS_ENABLED(CONFIG_SPL_KERNEL_BOOT) || ret) + if (spl_image->next_stage == SPL_NEXT_STAGE_KERNEL) spl_ab_decrease_tries(info->dev); #endif + return ret; } diff --git a/u-boot/common/spl_mp_boot_rk3528.S b/u-boot/common/spl_mp_boot_rk3528.S new file mode 100644 index 0000000..6c1f25a --- /dev/null +++ b/u-boot/common/spl_mp_boot_rk3528.S @@ -0,0 +1,9214 @@ + .arch armv8-a+nosimd + .file "mp_boot.c" + .text +.Ltext0: + .cfi_sections .debug_frame + .section .text.mpb_task_set_state,"ax",@progbits + .align 2 + .type mpb_task_set_state, %function +mpb_task_set_state: +.LFB227: + .file 1 "common/mp_boot.c" + .loc 1 227 0 + .cfi_startproc +.LVL0: +.LBB30: +.LBB31: + .loc 1 146 0 + mov x4, 136314880 + mov w3, 1 + lsl w3, w3, w1 + ldr w5, [x4] +.LBE31: +.LBE30: + .loc 1 232 0 + tst w3, w5 + beq .L11 +.LBB32: +.LBB33: + .loc 1 199 0 + uxtw x5, w0 + mov x3, 328 + umull x0, w0, w3 +.LVL1: + madd x4, x5, x3, x4 + mov w3, 0 + ldrb w6, [x4, 328] + mov x4, 20 + movk x4, 0x820, lsl 16 + add x4, x0, x4 +.L3: +.LVL2: + cmp w3, w6 + blt .L5 +.LVL3: +.L11: +.LBE33: +.LBE32: + .loc 1 252 0 + mov w0, 0 + ret +.LVL4: +.L5: +.LBB35: +.LBB34: + .loc 1 200 0 + ldr w7, [x4], 40 + cmp w1, w7 + beq .L4 + .loc 1 199 0 + add w3, w3, 1 +.LVL5: + b .L3 +.L4: +.LVL6: +.LBE34: +.LBE35: + .loc 1 239 0 + mov x8, 328 + sxtw x4, w3 + mov x7, 40 + .loc 1 240 0 + add x0, x0, 16 + .loc 1 239 0 + mul x5, x5, x8 + .loc 1 227 0 + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 239 0 + nop // between mem op and mult-accumulate + madd x4, x4, x7, x5 + mov x6, 136314880 + .loc 1 240 0 + smaddl x3, w3, w7, x0 + .loc 1 227 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 239 0 + add x4, x6, x4 + .loc 1 227 0 + .loc 1 239 0 + add w1, w1, w2 +.LVL7: + .loc 1 240 0 + add x0, x3, x6 + .loc 1 239 0 + str w1, [x4, 16] + .loc 1 241 0 + add x1, x0, 4 + bl flush_dcache_range +.LVL8: + .loc 1 252 0 + mov w0, 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE227: + .size mpb_task_set_state, .-mpb_task_set_state + .section .text.spl_init_display,"ax",@progbits + .align 2 + .weak spl_init_display + .type spl_init_display, %function +spl_init_display: +.LFB252: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE252: + .size spl_init_display, .-spl_init_display + .section .text.spl_load_baseparamter,"ax",@progbits + .align 2 + .weak spl_load_baseparamter + .type spl_load_baseparamter, %function +spl_load_baseparamter: +.LFB250: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE250: + .size spl_load_baseparamter, .-spl_load_baseparamter + .section .text.spl_load_fit,"ax",@progbits + .align 2 + .weak spl_load_fit + .type spl_load_fit, %function +spl_load_fit: +.LFB248: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE248: + .size spl_load_fit, .-spl_load_fit + .section .text.spl_load_android,"ax",@progbits + .align 2 + .weak spl_load_android + .type spl_load_android, %function +spl_load_android: +.LFB246: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE246: + .size spl_load_android, .-spl_load_android + .section .text.spl_hash_android,"ax",@progbits + .align 2 + .weak spl_hash_android + .type spl_hash_android, %function +spl_hash_android: +.LFB244: + .cfi_startproc + mov w0, 0 + ret + .cfi_endproc +.LFE244: + .size spl_hash_android, .-spl_hash_android + .section .text.spl_dummy,"ax",@progbits + .align 2 + .weak spl_dummy + .type spl_dummy, %function +spl_dummy: +.LFB220: + .loc 1 52 0 + .cfi_startproc +.LVL9: + .loc 1 52 0 + mov w0, 0 +.LVL10: + ret + .cfi_endproc +.LFE220: + .size spl_dummy, .-spl_dummy + .section .text.mpb_task_is_done,"ax",@progbits + .align 2 + .global mpb_task_is_done + .type mpb_task_is_done, %function +mpb_task_is_done: +.LFB228: + .loc 1 261 0 + .cfi_startproc +.LVL11: +.LBB36: +.LBB37: + .loc 1 146 0 + mov x2, 136314880 + mov w1, 1 + lsl w1, w1, w0 + ldr w2, [x2] +.LBE37: +.LBE36: + .loc 1 265 0 + tst w1, w2 + beq .L35 + .loc 1 261 0 + stp x29, x30, [sp, -96]! + .cfi_def_cfa_offset 96 + .cfi_offset 29, -96 + .cfi_offset 30, -88 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -80 + .cfi_offset 20, -72 + mov w19, w0 + stp x23, x24, [sp, 48] + .cfi_offset 23, -48 + .cfi_offset 24, -40 + .loc 1 275 0 + mov w24, -559087616 + .loc 1 261 0 + str x27, [sp, 80] + .loc 1 275 0 + add w24, w0, w24 + .cfi_offset 27, -16 + .loc 1 277 0 + sub w27, w0, #65536 + .loc 1 261 0 + stp x21, x22, [sp, 32] + stp x25, x26, [sp, 64] + .cfi_offset 21, -64 + .cfi_offset 22, -56 + .cfi_offset 25, -32 + .cfi_offset 26, -24 + mov x21, 0 +.LVL12: +.L27: + mov x22, 16 + mov x20, 20 + .loc 1 269 0 + mov x26, 328 + movk x22, 0x820, lsl 16 + movk x20, 0x820, lsl 16 + add x22, x21, x22 + add x20, x21, x20 + .loc 1 261 0 + mov w23, 0 + .loc 1 269 0 + movk x26, 0x820, lsl 16 + .loc 1 279 0 + mov w25, 1431655765 + b .L23 +.LVL13: +.L26: + .loc 1 270 0 + ldr w0, [x20] + cmp w19, w0 + beq .L22 +.L25: + .loc 1 269 0 + add w23, w23, 1 +.LVL14: + add x22, x22, 40 + add x20, x20, 40 +.LVL15: +.L23: + .loc 1 269 0 is_stmt 0 discriminator 1 + ldrb w0, [x21, x26] + cmp w23, w0 + blt .L26 +.LVL16: + add x21, x21, 328 + .loc 1 268 0 is_stmt 1 discriminator 2 + cmp x21, 1312 + bne .L27 + .loc 1 286 0 + mov w0, 0 +.L19: + .loc 1 287 0 + ldp x19, x20, [sp, 16] +.LVL17: + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] +.LVL18: + ldp x25, x26, [sp, 64] + ldr x27, [sp, 80] +.LVL19: + ldp x29, x30, [sp], 96 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 27 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL20: +.L22: + .cfi_restore_state + .loc 1 272 0 + mov x0, x22 + mov x1, x20 + bl invalidate_dcache_range +.LVL21: + .loc 1 275 0 + ldr w0, [x22] + cmp w0, w24 + beq .L28 + .loc 1 277 0 + cmp w0, w27 + beq .L20 + .loc 1 279 0 + add w1, w19, w25 + cmp w0, w1 + bne .L25 + .loc 1 280 0 + mov w0, -2 + b .L19 +.L20: + .loc 1 266 0 + mov w0, -1 + b .L19 +.L28: + .loc 1 276 0 + mov w0, 1 + b .L19 +.LVL22: +.L35: + .cfi_def_cfa 31, 0 + .cfi_restore 19 + .cfi_restore 20 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 27 + .cfi_restore 29 + .cfi_restore 30 + .loc 1 266 0 + mov w0, -1 +.LVL23: + .loc 1 287 0 + ret + .cfi_endproc +.LFE228: + .size mpb_task_is_done, .-mpb_task_is_done + .section .text.mpb_task_dump,"ax",@progbits + .align 2 + .global mpb_task_dump + .type mpb_task_dump, %function +mpb_task_dump: +.LFB229: + .loc 1 290 0 + .cfi_startproc + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 + .loc 1 294 0 + mov x0, 136314880 + .loc 1 290 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 294 0 + ldr x1, [x0, 1360] + ldr x2, [x0, 1368] + adrp x0, .LC1 + .loc 1 290 0 + stp x19, x20, [sp, 16] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + .loc 1 294 0 + mov x20, 20 + .loc 1 290 0 + stp x23, x24, [sp, 48] + .loc 1 294 0 + movk x20, 0x820, lsl 16 + .loc 1 290 0 + stp x21, x22, [sp, 32] + .cfi_offset 23, -32 + .cfi_offset 24, -24 + .cfi_offset 21, -48 + .cfi_offset 22, -40 + .loc 1 299 0 + adrp x23, .LANCHOR0 + adrp x24, .LC2 + .loc 1 296 0 + mov w21, 0 + .loc 1 299 0 + add x23, x23, :lo12:.LANCHOR0 + add x24, x24, :lo12:.LC2 + .loc 1 294 0 + add x0, x0, :lo12:.LC1 + .loc 1 290 0 + str x25, [sp, 64] + .cfi_offset 25, -16 + .loc 1 294 0 + bl printf +.LVL24: +.L39: + .loc 1 290 0 + mov x19, x20 + mov w22, 0 + .loc 1 300 0 + adrp x25, .LC3 + b .L42 +.LVL25: +.L40: + .loc 1 299 0 discriminator 3 + ldr w2, [x19] + mov w1, w21 + mov x0, x24 + .loc 1 297 0 discriminator 3 + add w22, w22, 1 +.LVL26: + add x19, x19, 40 + .loc 1 299 0 discriminator 3 + ldr x3, [x23, w2, uxtw 3] + bl printf +.LVL27: + .loc 1 300 0 discriminator 3 + ldr w1, [x19, -40] + add x0, x25, :lo12:.LC3 + bl printf +.LVL28: + .loc 1 301 0 discriminator 3 + ldr x1, [x19, -52] + adrp x0, .LC4 + add x0, x0, :lo12:.LC4 + bl printf +.LVL29: + .loc 1 302 0 discriminator 3 + ldr w1, [x19, -44] + adrp x0, .LC5 + add x0, x0, :lo12:.LC5 + bl printf +.LVL30: + .loc 1 303 0 discriminator 3 + ldr w1, [x19, -28] + adrp x0, .LC6 + add x0, x0, :lo12:.LC6 + bl printf +.LVL31: + .loc 1 304 0 discriminator 3 + ldr x1, [x19, -20] + adrp x0, .LC7 + add x0, x0, :lo12:.LC7 + bl printf +.LVL32: + .loc 1 305 0 discriminator 3 + ldr w1, [x19, -36] + adrp x0, .LC8 + add x0, x0, :lo12:.LC8 + bl printf +.LVL33: + .loc 1 306 0 discriminator 3 + ldr w1, [x19, -32] + adrp x0, .LC9 + add x0, x0, :lo12:.LC9 + bl printf +.LVL34: +.L42: + .loc 1 297 0 discriminator 1 + ldrb w0, [x20, 308] + cmp w22, w0 + blt .L40 + .loc 1 296 0 discriminator 2 + add w21, w21, 1 +.LVL35: + add x20, x20, 328 + cmp w21, 4 + bne .L39 + .loc 1 310 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL36: + ldp x23, x24, [sp, 48] + ldr x25, [sp, 64] + ldp x29, x30, [sp], 80 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE229: + .size mpb_task_dump, .-mpb_task_dump + .section .text.core_task_run.part.1,"ax",@progbits + .align 2 + .type core_task_run.part.1, %function +core_task_run.part.1: +.LFB242: + .loc 1 370 0 + .cfi_startproc +.LVL37: + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + mov w19, w0 + stp x21, x22, [sp, 32] + mov w20, w2 +.LVL38: + stp x23, x24, [sp, 48] + .cfi_offset 21, -48 + .cfi_offset 22, -40 + .cfi_offset 23, -32 + .cfi_offset 24, -24 + and x22, x1, 255 + stp x25, x26, [sp, 64] + .cfi_offset 25, -16 + .cfi_offset 26, -8 +.LBB48: +.LBB49: + .loc 1 319 0 + cbz w3, .L45 + mov w25, w3 + mov w23, 0 + mov w21, 0 + .loc 1 324 0 + mov w26, 1 +.LVL39: +.L50: + lsl w0, w26, w21 + tst w0, w25 + beq .L46 +.L47: + .loc 1 319 0 + mov w24, 20000 +.L48: +.LVL40: + .loc 1 329 0 + mov w0, w21 + bl mpb_task_is_done +.LVL41: + cbz w0, .L49 + .loc 1 344 0 + mov w0, w21 + bl mpb_task_is_done +.LVL42: + .loc 1 345 0 + cmp w0, 0 + cinc w23, w23, lt +.LVL43: +.L46: + .loc 1 323 0 + add w21, w21, 1 +.LVL44: + cmp w21, 8 + bne .L50 +.LVL45: +.LBE49: +.LBE48: + .loc 1 387 0 + cbz w23, .L45 +.LVL46: + .loc 1 389 0 + uxtw x1, w19 + mov x2, 328 + sxtw x0, w22 + mul x1, x1, x2 + mov x2, 40 + madd x0, x0, x2, x1 + mov x1, 136314880 + add x0, x1, x0 + ldr w0, [x0, 28] + cbnz w0, .L51 +.LVL47: +.L52: + .loc 1 410 0 + mov w2, w20 + mov w1, w19 + adrp x0, .LC11 + add x0, x0, :lo12:.LC11 + bl printf +.LVL48: + .loc 1 374 0 + mov w21, 0 + .loc 1 411 0 + mov w2, 1431655765 + mov w1, w20 + mov w0, w19 + bl mpb_task_set_state +.LVL49: + b .L58 +.LVL50: +.L49: +.LBB51: +.LBB50: + .loc 1 330 0 + mov x0, 100 + bl udelay +.LVL51: + .loc 1 333 0 + subs w24, w24, #1 +.LVL52: + bne .L48 +.LVL53: + .loc 1 337 0 + bl mpb_task_dump +.LVL54: + b .L47 +.LVL55: +.L45: +.LBE50: +.LBE51: + .loc 1 392 0 + uxtw x1, w19 + mov x2, 328 + sxtw x0, w22 + mul x1, x1, x2 + mov x2, 40 + madd x0, x0, x2, x1 + mov x1, 136314880 + add x0, x1, x0 + ldr w0, [x0, 28] + cbnz w0, .L52 +.L51: +.LVL56: + .loc 1 397 0 + mov w2, w20 + mov w1, w19 + adrp x0, .LC12 + add x0, x0, :lo12:.LC12 + bl printf +.LVL57: + .loc 1 401 0 + uxtw x24, w19 + .loc 1 398 0 + bl get_ticks +.LVL58: + mov x23, x0 +.LVL59: + .loc 1 400 0 + mov w2, 286331153 + mov w1, w20 + mov w0, w19 +.LVL60: + bl mpb_task_set_state +.LVL61: + .loc 1 401 0 + mov x1, 328 + mov x0, 40 + mul x1, x24, x1 + madd x1, x22, x0, x1 + mov x0, 8 + movk x0, 0x820, lsl 16 + ldr x1, [x0, x1] + mov x0, 1320 + movk x0, 0x820, lsl 16 + blr x1 +.LVL62: + mov w21, w0 +.LVL63: + .loc 1 402 0 + cbnz w0, .L59 + .loc 1 405 0 + mov w2, -559087616 + b .L77 +.L59: + .loc 1 403 0 + mov w2, -65536 +.L77: + .loc 1 405 0 + mov w1, w20 + mov w0, w19 +.LVL64: + bl mpb_task_set_state +.LVL65: + .loc 1 407 0 + bl get_ticks +.LVL66: + sub x0, x0, x23 + mov x4, 24000 + .loc 1 408 0 + mov w3, w21 + mov w2, w20 + mov w1, w19 + .loc 1 407 0 + udiv x4, x0, x4 + mov x0, 328 + mul x0, x24, x0 + mov x24, 40 + madd x24, x22, x24, x0 + mov x22, 40 +.LVL67: + movk x22, 0x820, lsl 16 + .loc 1 408 0 + adrp x0, .LC10 + add x0, x0, :lo12:.LC10 + .loc 1 407 0 + str x4, [x22, x24] + .loc 1 408 0 + bl printf +.LVL68: +.L58: +.LBB52: +.LBB53: +.LBB54: +.LBB55: + .loc 1 146 0 + mov x0, 136314880 + mov w1, 1 + lsl w1, w1, w20 + ldr w2, [x0] +.LBE55: +.LBE54: + .loc 1 212 0 + tst w1, w2 + beq .L44 +.LBB56: +.LBB57: + .loc 1 199 0 + uxtw x3, w19 + mov x1, 328 + umull x19, w19, w1 +.LVL69: + madd x0, x3, x1, x0 + mov w1, 0 + ldrb w2, [x0, 328] + mov x0, 20 + movk x0, 0x820, lsl 16 + add x0, x19, x0 +.L55: +.LVL70: + cmp w1, w2 + blt .L57 +.LVL71: +.L44: +.LBE57: +.LBE56: +.LBE53: +.LBE52: + .loc 1 417 0 + ldp x19, x20, [sp, 16] +.LVL72: + ldp x21, x22, [sp, 32] +.LVL73: + ldp x23, x24, [sp, 48] + ldp x25, x26, [sp, 64] + ldp x29, x30, [sp], 80 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL74: +.L57: + .cfi_restore_state +.LBB65: +.LBB60: +.LBB59: +.LBB58: + .loc 1 200 0 + ldr w4, [x0], 40 + cmp w20, w4 + beq .L56 + .loc 1 199 0 + add w1, w1, 1 +.LVL75: + b .L55 +.L56: +.LVL76: +.LBE58: +.LBE59: + .loc 1 219 0 + sxtw x2, w1 + mov x5, 328 + mov x4, 40 + .loc 1 220 0 + add x19, x19, 32 + .loc 1 219 0 + mul x3, x3, x5 + mov x0, 136314880 + madd x2, x2, x4, x3 + .loc 1 220 0 + smaddl x19, w1, w4, x19 + .loc 1 219 0 + add x2, x0, x2 +.LBE60: +.LBE65: + .loc 1 417 0 + ldp x23, x24, [sp, 48] +.LBB66: +.LBB61: + .loc 1 220 0 + add x0, x19, x0 +.LBE61: +.LBE66: + .loc 1 417 0 + ldp x25, x26, [sp, 64] +.LBB67: +.LBB62: + .loc 1 221 0 + add x1, x0, 4 +.LBE62: +.LBE67: + .loc 1 417 0 + ldp x19, x20, [sp, 16] +.LVL77: +.LBB68: +.LBB63: + .loc 1 219 0 + str w21, [x2, 32] +.LBE63: +.LBE68: + .loc 1 417 0 + ldp x21, x22, [sp, 32] +.LVL78: + ldp x29, x30, [sp], 80 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 +.LBB69: +.LBB64: + .loc 1 221 0 + b flush_dcache_range +.LVL79: +.LBE64: +.LBE69: + .cfi_endproc +.LFE242: + .size core_task_run.part.1, .-core_task_run.part.1 + .section .text.mpb_task_wait_done,"ax",@progbits + .align 2 + .global mpb_task_wait_done + .type mpb_task_wait_done, %function +mpb_task_wait_done: +.LFB232: + .loc 1 366 0 + .cfi_startproc +.LVL80: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 + mov w19, w0 +.LVL81: +.L80: +.LBB74: +.LBB75: + .loc 1 355 0 + mov w0, w19 + bl mpb_task_is_done +.LVL82: + cbnz w0, .L79 +.LVL83: +.LBB76: +.LBB77: + .file 2 "include/linux/delay.h" + .loc 2 16 0 + mov x0, 1000 + bl udelay +.LVL84: + mov x0, 1000 + bl udelay +.LVL85: + b .L80 +.L79: +.LBE77: +.LBE76: + .loc 1 362 0 + mov w0, w19 +.LBE75: +.LBE74: + .loc 1 368 0 + ldr x19, [sp, 16] +.LVL86: + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 +.LBB79: +.LBB78: + .loc 1 362 0 + b mpb_task_is_done +.LVL87: +.LBE78: +.LBE79: + .cfi_endproc +.LFE232: + .size mpb_task_wait_done, .-mpb_task_wait_done + .section .text.mpb_task_run,"ax",@progbits + .align 2 + .global mpb_task_run + .type mpb_task_run, %function +mpb_task_run: +.LFB234: + .loc 1 420 0 + .cfi_startproc +.LVL88: + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 +.LBB86: +.LBB87: + .loc 1 146 0 + mov x3, 136314880 +.LBE87: +.LBE86: + .loc 1 420 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x23, x24, [sp, 48] + .cfi_offset 23, -32 + .cfi_offset 24, -24 +.LBB89: +.LBB88: + .loc 1 146 0 + mov w24, 1 + ldr w2, [x3] + lsl w24, w24, w1 +.LVL89: +.LBE88: +.LBE89: + .loc 1 420 0 + stp x19, x20, [sp, 16] + stp x21, x22, [sp, 32] + .loc 1 424 0 + tst w24, w2 + .loc 1 420 0 + str x25, [sp, 64] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + .cfi_offset 21, -48 + .cfi_offset 22, -40 + .cfi_offset 25, -16 + .loc 1 424 0 + beq .L82 + .loc 1 424 0 is_stmt 0 discriminator 1 + cbz w1, .L82 + uxtw x25, w0 +.LVL90: + .loc 1 421 0 is_stmt 1 + mov w19, 328 + mov x0, 8 +.LVL91: + mov x22, x25 + mov w21, w1 + .loc 1 427 0 + mov x20, x3 + .loc 1 421 0 + umaddl x19, w25, w19, x0 + .loc 1 427 0 + mov x0, 328 + .loc 1 421 0 + mov w23, 0 + .loc 1 427 0 + madd x25, x25, x0, x3 +.LVL92: + .loc 1 421 0 + add x19, x19, x3 +.LVL93: +.L85: + .loc 1 427 0 discriminator 1 + ldrb w0, [x25, 328] + cmp w23, w0 + blt .L87 +.LVL94: +.L82: + .loc 1 431 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] + ldr x25, [sp, 64] + ldp x29, x30, [sp], 80 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL95: +.L87: + .cfi_restore_state + .loc 1 428 0 + ldr w0, [x19, 12] + cmp w21, w0 + bne .L86 + .loc 1 428 0 is_stmt 0 discriminator 1 + ldr x0, [x19] + cbz x0, .L86 +.LVL96: +.LBB90: +.LBB91: +.LBB92: +.LBB93: + .loc 1 146 0 is_stmt 1 + ldr w0, [x20] +.LBE93: +.LBE92: + .loc 1 377 0 + tst w24, w0 + beq .L86 + ldr w3, [x19, 16] + mov w2, w21 + mov w1, w23 + mov w0, w22 + bl core_task_run.part.1 +.LVL97: +.L86: +.LBE91: +.LBE90: + .loc 1 427 0 discriminator 2 + add w23, w23, 1 +.LVL98: + add x19, x19, 40 + b .L85 + .cfi_endproc +.LFE234: + .size mpb_task_run, .-mpb_task_run + .section .text.core_main,"ax",@progbits + .align 2 + .global core_main + .type core_main, %function +core_main: +.LFB235: + .loc 1 434 0 + .cfi_startproc +.LVL99: + stp x29, x30, [sp, -64]! + .cfi_def_cfa_offset 64 + .cfi_offset 29, -64 + .cfi_offset 30, -56 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x21, x22, [sp, 32] + .cfi_offset 21, -32 + .cfi_offset 22, -24 + uxtw x22, w0 + stp x19, x20, [sp, 16] + .loc 1 435 0 + mov x0, 8 +.LVL100: + .cfi_offset 19, -48 + .cfi_offset 20, -40 + mov w19, 328 + mov x20, 136314880 + .loc 1 434 0 + stp x23, x24, [sp, 48] + .cfi_offset 23, -16 + .cfi_offset 24, -8 + .loc 1 434 0 + mov x23, x22 +.LVL101: + .loc 1 435 0 + umaddl x19, w22, w19, x0 + .loc 1 438 0 + mov x0, 328 + mov w21, 0 +.LBB98: +.LBB99: +.LBB100: +.LBB101: + .loc 1 146 0 + mov w24, 1 +.LBE101: +.LBE100: +.LBE99: +.LBE98: + .loc 1 438 0 + madd x22, x22, x0, x20 +.LVL102: + .loc 1 435 0 + add x19, x19, x20 +.LVL103: +.L99: + .loc 1 438 0 discriminator 1 + ldrb w0, [x22, 328] + cmp w21, w0 + blt .L101 + .loc 1 442 0 + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] +.LVL104: + ldp x23, x24, [sp, 48] +.LVL105: + ldp x29, x30, [sp], 64 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL106: +.L101: + .cfi_restore_state + .loc 1 439 0 + ldr x0, [x19] + cbz x0, .L100 + .loc 1 440 0 + ldr w2, [x19, 12] +.LVL107: +.LBB105: +.LBB104: +.LBB103: +.LBB102: + .loc 1 146 0 + ldr w0, [x20] + lsl w1, w24, w2 +.LBE102: +.LBE103: + .loc 1 377 0 + tst w1, w0 + beq .L100 + ldr w3, [x19, 16] + mov w1, w21 + mov w0, w23 + bl core_task_run.part.1 +.LVL108: +.L100: +.LBE104: +.LBE105: + .loc 1 438 0 discriminator 2 + add w21, w21, 1 +.LVL109: + add x19, x19, 40 + b .L99 + .cfi_endproc +.LFE235: + .size core_main, .-core_main + .section .text.smp_entry,"ax",@progbits + .align 2 + .global smp_entry + .type smp_entry, %function +smp_entry: +.LFB236: + .loc 1 448 0 + .cfi_startproc +.LVL110: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 + .loc 1 448 0 + mov w19, w0 + .loc 1 450 0 + adrp x0, .LANCHOR1 +.LVL111: + ldr x0, [x0, #:lo12:.LANCHOR1] +.LVL112: +.LBB106: +.LBB107: + .loc 1 131 0 +#APP +// 131 "common/mp_boot.c" 1 + mov x18, x0 + +// 0 "" 2 +.LVL113: +#NO_APP +.LBE107: +.LBE106: + .loc 1 451 0 + bl dcache_enable +.LVL114: + .loc 1 455 0 + cmp w19, 1 + bne .L110 +.L114: + .loc 1 460 0 + mov w0, w19 + bl core_main +.LVL115: + b .L111 +.L110: + .loc 1 459 0 + cmp w19, 2 + beq .L114 +.L111: + .loc 1 468 0 + bl flush_dcache_all +.LVL116: + .loc 1 469 0 + bl disable_interrupts +.LVL117: +.LBB108: +.LBB109: + .file 3 "./arch/arm/include/asm/system.h" + .loc 3 193 0 +#APP +// 193 "./arch/arm/include/asm/system.h" 1 + msr daifset, #0x04 +// 0 "" 2 +#NO_APP +.LBE109: +.LBE108: + .loc 1 471 0 + bl icache_disable +.LVL118: + .loc 1 472 0 + bl invalidate_icache_all +.LVL119: + .loc 1 473 0 + bl dcache_disable +.LVL120: +.LBB110: +.LBB111: + .loc 1 138 0 +#APP +// 138 "common/mp_boot.c" 1 + mrs x0, S3_1_c15_c2_1 +// 0 "" 2 + .loc 1 139 0 +// 139 "common/mp_boot.c" 1 + bic x0, x0, #0x40 +// 0 "" 2 + .loc 1 140 0 +// 140 "common/mp_boot.c" 1 + msr S3_1_c15_c2_1, x0 +// 0 "" 2 +#NO_APP +.LBE111: +.LBE110: + .loc 1 475 0 + bl invalidate_dcache_all +.LVL121: + .loc 1 478 0 +#APP +// 478 "common/mp_boot.c" 1 + dsb sy +// 0 "" 2 + .loc 1 479 0 +// 479 "common/mp_boot.c" 1 + isb sy +// 0 "" 2 +#NO_APP +.L112: + .loc 1 481 0 discriminator 1 +#APP +// 481 "common/mp_boot.c" 1 + wfe +// 0 "" 2 +#NO_APP + b .L112 + .cfi_endproc +.LFE236: + .size smp_entry, .-smp_entry + .section .text.mpb_init_1,"ax",@progbits + .align 2 + .global mpb_init_1 + .type mpb_init_1, %function +mpb_init_1: +.LFB238: + .loc 1 527 0 + .cfi_startproc + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 528 0 + mov x2, 40 + mov x1, x0 + mov x0, 1320 + .loc 1 527 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 528 0 + movk x0, 0x820, lsl 16 + .loc 1 527 0 + .loc 1 528 0 + bl memcpy +.LVL122: + .loc 1 530 0 + mov w1, 2 + mov w0, 0 + bl mpb_task_run +.LVL123: + .loc 1 531 0 + mov w2, 286331153 + mov w1, 3 + mov w0, 0 + bl mpb_task_set_state +.LVL124: + .loc 1 532 0 + bl flush_dcache_all +.LVL125: + .loc 1 533 0 +#APP +// 533 "common/mp_boot.c" 1 + dsb sy +// 0 "" 2 + .loc 1 534 0 +// 534 "common/mp_boot.c" 1 + isb sy +// 0 "" 2 + .loc 1 535 0 +#NO_APP + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE238: + .size mpb_init_1, .-mpb_init_1 + .section .text.mpb_init_x,"ax",@progbits + .align 2 + .global mpb_init_x + .type mpb_init_x, %function +mpb_init_x: +.LFB239: + .loc 1 538 0 + .cfi_startproc +.LVL126: + stp x29, x30, [sp, -64]! + .cfi_def_cfa_offset 64 + .cfi_offset 29, -64 + .cfi_offset 30, -56 + .loc 1 539 0 + cmp w0, 2 + .loc 1 538 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 539 0 + beq .L119 + cmp w0, 3 + beq .L120 + cbnz w0, .L117 +.LBB120: +.LBB121: + .loc 1 494 0 + adrp x1, .LANCHOR2 + add x1, x1, :lo12:.LANCHOR2 + mov x2, 48 + add x0, x29, 16 +.LVL127: + bl memcpy +.LVL128: + .loc 1 509 0 + adrp x0, .LC13 + add x0, x0, :lo12:.LC13 + bl printf +.LVL129: + .loc 1 511 0 + mov x2, 1376 + mov w1, 0 + mov x0, 136314880 + bl memset +.LVL130: + .loc 1 512 0 + adrp x0, .LANCHOR1 + add x6, x29, 64 +.LBB122: +.LBB123: + .loc 1 177 0 + mov x4, 136314880 + mov x7, 328 +.LBE123: +.LBE122: + .loc 1 512 0 + str x18, [x0, #:lo12:.LANCHOR1] +.LVL131: + add x0, x29, 16 +.LBB126: +.LBB124: + .loc 1 179 0 + mov x8, 40 + .loc 1 185 0 + mov w10, 1 +.LVL132: +.L122: +.LBE124: +.LBE126: + .loc 1 514 0 + cmp x6, x0 + bne .L124 + .loc 1 517 0 + bl flush_dcache_all +.LVL133: +.LBB127: + .loc 1 518 0 +#APP +// 518 "common/mp_boot.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov x1, 8 + adrp x0, save_boot_params_ret + movk x1, 0xfe48, lsl 16 + add x0, x0, :lo12:save_boot_params_ret + str w0, [x1] +.LVL134: +.LBE127: +.LBB128: + .loc 1 519 0 +#APP +// 519 "common/mp_boot.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov x0, 4 + mov w1, 48815 + movk x0, 0xfe48, lsl 16 + movk w1, 0xdead, lsl 16 + str w1, [x0] +.LBE128: + .loc 1 520 0 +#APP +// 520 "common/mp_boot.c" 1 + dsb sy +// 0 "" 2 + .loc 1 522 0 +// 522 "common/mp_boot.c" 1 + sev +// 0 "" 2 + .loc 1 523 0 +// 523 "common/mp_boot.c" 1 + isb sy +// 0 "" 2 +.LVL135: +#NO_APP +.L117: +.LBE121: +.LBE120: + .loc 1 556 0 + ldp x29, x30, [sp], 64 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret +.L124: + .cfi_restore_state + ldp w1, w3, [x0] +.LVL136: + ldp w12, w11, [x0, 16] +.LBB131: +.LBB130: +.LBB129: +.LBB125: + .loc 1 172 0 + cmp w1, 3 + ldr x13, [x0, 8] +.LVL137: + beq .L123 + .loc 1 176 0 + sub w2, w3, #1 + cmp w2, 6 + bhi .L123 +.LVL138: + .loc 1 177 0 + uxtw x1, w1 + mul x2, x1, x7 + add x5, x4, x2 + .loc 1 179 0 + ldrb w1, [x5, 328] +.LVL139: + madd x1, x1, x8, x2 + add x1, x4, x1 + .loc 1 181 0 + stp w3, w12, [x1, 20] +.LVL140: + .loc 1 185 0 + lsl w3, w10, w3 +.LVL141: + .loc 1 183 0 + stp w11, wzr, [x1, 28] + .loc 1 179 0 + str x13, [x1, 8] + .loc 1 184 0 + str xzr, [x1, 40] + .loc 1 185 0 + ldr w1, [x4] +.LVL142: + orr w3, w1, w3 + str w3, [x4] + .loc 1 186 0 + ldrb w1, [x5, 328] + add w1, w1, 1 + strb w1, [x5, 328] +.L123: + add x0, x0, 24 + b .L122 +.LVL143: +.L119: +.LBE125: +.LBE129: +.LBE130: +.LBE131: + .loc 1 544 0 + mov w2, -559087616 + mov w1, 3 + mov w0, 0 +.LVL144: + bl mpb_task_set_state +.LVL145: + .loc 1 545 0 + bl flush_dcache_all +.LVL146: + .loc 1 546 0 +#APP +// 546 "common/mp_boot.c" 1 + dsb sy +// 0 "" 2 + .loc 1 547 0 +// 547 "common/mp_boot.c" 1 + isb sy +// 0 "" 2 +.LVL147: + .loc 1 556 0 +#NO_APP + ldp x29, x30, [sp], 64 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 +.LBB132: +.LBB133: + .loc 2 16 0 + mov x0, 1000 + b udelay +.LVL148: +.L120: + .cfi_restore_state +.LBE133: +.LBE132: + .loc 1 556 0 + ldp x29, x30, [sp], 64 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + .loc 1 553 0 + mov w2, -559087616 + mov w1, 7 + mov w0, 0 +.LVL149: + b mpb_task_set_state +.LVL150: + .cfi_endproc +.LFE239: + .size mpb_init_x, .-mpb_init_x + .section .text.mpb_post,"ax",@progbits + .align 2 + .global mpb_post + .type mpb_post, %function +mpb_post: +.LFB240: + .loc 1 626 0 + .cfi_startproc +.LVL151: + .loc 1 627 0 + cmp w0, 6 + bne .L133 + .loc 1 626 0 + stp x29, x30, [sp, -16]! + .cfi_def_cfa_offset 16 + .cfi_offset 29, -16 + .cfi_offset 30, -8 + .loc 1 629 0 + mov w0, 2 +.LVL152: + .loc 1 626 0 + add x29, sp, 0 + .cfi_def_cfa_register 29 + .loc 1 629 0 + bl mpb_task_wait_done +.LVL153: + sxtw x0, w0 + .loc 1 633 0 + ldp x29, x30, [sp], 16 + .cfi_restore 30 + .cfi_restore 29 + .cfi_def_cfa 31, 0 + ret +.LVL154: +.L133: + .loc 1 632 0 + mov x0, 0 +.LVL155: + ret + .cfi_endproc +.LFE240: + .size mpb_post, .-mpb_post + .section .rodata + .align 3 + .set .LANCHOR2,. + 0 +.LC0: + .word 0 + .word 2 + .xword spl_load_baseparamter + .word 0 + .word 0 + .word 2 + .word 1 + .xword spl_init_display + .word 0 + .word 0 + .section .bss.mpb_gd,"aw",@nobits + .align 3 + .set .LANCHOR1,. + 0 + .type mpb_gd, %object + .size mpb_gd, 8 +mpb_gd: + .zero 8 + .section .rodata.core_task_run.part.1.str1.1,"aMS",@progbits,1 +.LC10: + .string "-- T%d.%d [%d, %ld]\n" +.LC11: + .string "++ T%d.%d -\n" +.LC12: + .string "++ T%d.%d\n" + .section .rodata.mpb_init_x.str1.1,"aMS",@progbits,1 +.LC13: + .string "U-Boot SPL MP\n" + .section .rodata.mpb_task_dump.str1.1,"aMS",@progbits,1 +.LC1: + .string "data: %08lx, %08lx\n" +.LC2: + .string "T%d.%d:[%s]\n" +.LC3: + .string " tid: %d\n" +.LC4: + .string " fn: 0x%08lx\n" +.LC5: + .string " state: 0x%08x\n" +.LC6: + .string " ret: %d\n" +.LC7: + .string " ms: %ld\n" +.LC8: + .string " ptid_mask: 0x%08x\n" +.LC9: + .string " rip_fail: %d\n\n" + .section .rodata.str1.1,"aMS",@progbits,1 +.LC14: + .string "none" +.LC15: + .string "init-display" +.LC16: + .string "load-baseparameter" +.LC17: + .string "load-uboot" +.LC18: + .string "load-fit" +.LC19: + .string "load-android" +.LC20: + .string "hash-android" +.LC21: + .string "run-uboot" + .section .rodata.tid_name,"a",@progbits + .align 3 + .set .LANCHOR0,. + 0 + .type tid_name, %object + .size tid_name, 64 +tid_name: + .xword .LC14 + .xword .LC15 + .xword .LC16 + .xword .LC17 + .xword .LC18 + .xword .LC19 + .xword .LC20 + .xword .LC21 + .text +.Letext0: + .file 4 "include/common.h" + .file 5 "./arch/arm/include/asm/types.h" + .file 6 "include/linux/types.h" + .file 7 "include/errno.h" + .file 8 "include/linux/string.h" + .file 9 "include/efi.h" + .file 10 "include/ide.h" + .file 11 "include/linux/list.h" + .file 12 "include/part.h" + .file 13 "include/flash.h" + .file 14 "include/lmb.h" + .file 15 "include/asm-generic/u-boot.h" + .file 16 "./arch/arm/include/asm/u-boot-arm.h" + .file 17 "include/linux/libfdt_env.h" + .file 18 "include/linux/../../scripts/dtc/libfdt/fdt.h" + .file 19 "include/linux/libfdt.h" + .file 20 "include/image.h" + .file 21 "./arch/arm/include/asm/global_data.h" + .file 22 "include/asm-generic/global_data.h" + .file 23 "include/net.h" + .file 24 "include/dm/uclass-id.h" + .file 25 "./arch/arm/include/asm/spl.h" + .file 26 "include/spl.h" + .file 27 "include/mp_boot.h" + .file 28 "include/log.h" + .file 29 "include/stdio.h" + .section .debug_info,"",@progbits +.Ldebug_info0: + .4byte 0x2374 + .2byte 0x4 + .4byte .Ldebug_abbrev0 + .byte 0x8 + .uleb128 0x1 + .4byte .LASF428 + .byte 0xc + .4byte .LASF429 + .4byte .LASF430 + .4byte .Ldebug_ranges0+0x230 + .8byte 0 + .4byte .Ldebug_line0 + .uleb128 0x2 + .4byte .LASF4 + .byte 0x4 + .byte 0xd + .4byte 0x34 + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF0 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF1 + .uleb128 0x3 + .byte 0x2 + .byte 0x7 + .4byte .LASF2 + .uleb128 0x4 + .4byte .LASF20 + .byte 0x7 + .byte 0xc + .4byte 0x54 + .uleb128 0x5 + .byte 0x4 + .byte 0x5 + .string "int" + .uleb128 0x3 + .byte 0x1 + .byte 0x6 + .4byte .LASF3 + .uleb128 0x2 + .4byte .LASF5 + .byte 0x5 + .byte 0xc + .4byte 0x34 + .uleb128 0x3 + .byte 0x2 + .byte 0x5 + .4byte .LASF6 + .uleb128 0x2 + .4byte .LASF7 + .byte 0x5 + .byte 0x12 + .4byte 0x7f + .uleb128 0x3 + .byte 0x4 + .byte 0x7 + .4byte .LASF8 + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF9 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF10 + .uleb128 0x6 + .string "u8" + .byte 0x5 + .byte 0x1f + .4byte 0x34 + .uleb128 0x7 + .4byte 0x94 + .uleb128 0x6 + .string "u32" + .byte 0x5 + .byte 0x25 + .4byte 0x7f + .uleb128 0x6 + .string "u64" + .byte 0x5 + .byte 0x28 + .4byte 0x8d + .uleb128 0x2 + .4byte .LASF11 + .byte 0x5 + .byte 0x31 + .4byte 0x8d + .uleb128 0x2 + .4byte .LASF12 + .byte 0x5 + .byte 0x32 + .4byte 0x8d + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF13 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe3 + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF14 + .uleb128 0x7 + .4byte 0xdc + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF15 + .uleb128 0x8 + .byte 0x8 + .4byte 0xdc + .uleb128 0x2 + .4byte .LASF16 + .byte 0x6 + .byte 0x59 + .4byte 0x42 + .uleb128 0x2 + .4byte .LASF17 + .byte 0x6 + .byte 0x5b + .4byte 0x3b + .uleb128 0x9 + .4byte 0x100 + .uleb128 0x2 + .4byte .LASF18 + .byte 0x6 + .byte 0x69 + .4byte 0x62 + .uleb128 0x2 + .4byte .LASF19 + .byte 0x6 + .byte 0x97 + .4byte 0x74 + .uleb128 0xa + .byte 0x8 + .uleb128 0x4 + .4byte .LASF21 + .byte 0x8 + .byte 0xb + .4byte 0xef + .uleb128 0x3 + .byte 0x1 + .byte 0x2 + .4byte .LASF22 + .uleb128 0xb + .4byte 0xdc + .4byte 0x145 + .uleb128 0xc + .byte 0 + .uleb128 0xd + .4byte .LASF23 + .byte 0x9 + .2byte 0x140 + .4byte 0x13a + .uleb128 0xd + .4byte .LASF24 + .byte 0x9 + .2byte 0x143 + .4byte 0x13a + .uleb128 0xd + .4byte .LASF25 + .byte 0x9 + .2byte 0x143 + .4byte 0x13a + .uleb128 0xe + .4byte .LASF38 + .uleb128 0x8 + .byte 0x8 + .4byte 0x169 + .uleb128 0x8 + .byte 0x8 + .4byte 0x17a + .uleb128 0xf + .uleb128 0xb + .4byte 0x100 + .4byte 0x186 + .uleb128 0xc + .byte 0 + .uleb128 0x4 + .4byte .LASF26 + .byte 0xa + .byte 0x10 + .4byte 0x17b + .uleb128 0xb + .4byte 0x34 + .4byte 0x1a1 + .uleb128 0x10 + .4byte 0xcf + .byte 0x5 + .byte 0 + .uleb128 0x11 + .4byte .LASF29 + .byte 0x10 + .byte 0xb + .byte 0x16 + .4byte 0x1c6 + .uleb128 0x12 + .4byte .LASF27 + .byte 0xb + .byte 0x17 + .4byte 0x1c6 + .byte 0 + .uleb128 0x12 + .4byte .LASF28 + .byte 0xb + .byte 0x17 + .4byte 0x1c6 + .byte 0x8 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1a1 + .uleb128 0x11 + .4byte .LASF30 + .byte 0x10 + .byte 0xc + .byte 0xf + .4byte 0x1f1 + .uleb128 0x12 + .4byte .LASF31 + .byte 0xc + .byte 0x10 + .4byte 0xef + .byte 0 + .uleb128 0x12 + .4byte .LASF32 + .byte 0xc + .byte 0x11 + .4byte 0x20a + .byte 0x8 + .byte 0 + .uleb128 0x7 + .4byte 0x1cc + .uleb128 0x13 + .4byte 0x54 + .4byte 0x20a + .uleb128 0x14 + .4byte 0x54 + .uleb128 0x14 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1f6 + .uleb128 0xb + .4byte 0x1f1 + .4byte 0x21b + .uleb128 0xc + .byte 0 + .uleb128 0x7 + .4byte 0x210 + .uleb128 0x4 + .4byte .LASF30 + .byte 0xc + .byte 0xe1 + .4byte 0x21b + .uleb128 0x15 + .2byte 0x1220 + .byte 0xd + .byte 0x13 + .4byte 0x27f + .uleb128 0x12 + .4byte .LASF33 + .byte 0xd + .byte 0x14 + .4byte 0x100 + .byte 0 + .uleb128 0x12 + .4byte .LASF34 + .byte 0xd + .byte 0x15 + .4byte 0xf5 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF35 + .byte 0xd + .byte 0x16 + .4byte 0x100 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF36 + .byte 0xd + .byte 0x17 + .4byte 0x27f + .byte 0x18 + .uleb128 0x16 + .4byte .LASF37 + .byte 0xd + .byte 0x18 + .4byte 0x290 + .2byte 0x1018 + .uleb128 0x17 + .string "mtd" + .byte 0xd + .byte 0x31 + .4byte 0x2a6 + .2byte 0x1218 + .byte 0 + .uleb128 0xb + .4byte 0x100 + .4byte 0x290 + .uleb128 0x18 + .4byte 0xcf + .2byte 0x1ff + .byte 0 + .uleb128 0xb + .4byte 0x29 + .4byte 0x2a1 + .uleb128 0x18 + .4byte 0xcf + .2byte 0x1ff + .byte 0 + .uleb128 0xe + .4byte .LASF39 + .uleb128 0x8 + .byte 0x8 + .4byte 0x2a1 + .uleb128 0x2 + .4byte .LASF40 + .byte 0xd + .byte 0x37 + .4byte 0x22b + .uleb128 0xb + .4byte 0x2ac + .4byte 0x2c2 + .uleb128 0xc + .byte 0 + .uleb128 0x4 + .4byte .LASF41 + .byte 0xd + .byte 0x39 + .4byte 0x2b7 + .uleb128 0x3 + .byte 0x10 + .byte 0x4 + .4byte .LASF42 + .uleb128 0x11 + .4byte .LASF43 + .byte 0x10 + .byte 0xe + .byte 0x10 + .4byte 0x2f9 + .uleb128 0x12 + .4byte .LASF44 + .byte 0xe + .byte 0x11 + .4byte 0xb9 + .byte 0 + .uleb128 0x12 + .4byte .LASF33 + .byte 0xe + .byte 0x12 + .4byte 0xc4 + .byte 0x8 + .byte 0 + .uleb128 0x19 + .4byte .LASF45 + .2byte 0x120 + .byte 0xe + .byte 0x15 + .4byte 0x32b + .uleb128 0x1a + .string "cnt" + .byte 0xe + .byte 0x16 + .4byte 0x3b + .byte 0 + .uleb128 0x12 + .4byte .LASF33 + .byte 0xe + .byte 0x17 + .4byte 0xc4 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF46 + .byte 0xe + .byte 0x18 + .4byte 0x32b + .byte 0x10 + .byte 0 + .uleb128 0xb + .4byte 0x2d4 + .4byte 0x33b + .uleb128 0x10 + .4byte 0xcf + .byte 0x10 + .byte 0 + .uleb128 0x1b + .string "lmb" + .2byte 0x240 + .byte 0xe + .byte 0x1b + .4byte 0x362 + .uleb128 0x12 + .4byte .LASF47 + .byte 0xe + .byte 0x1c + .4byte 0x2f9 + .byte 0 + .uleb128 0x16 + .4byte .LASF48 + .byte 0xe + .byte 0x1d + .4byte 0x2f9 + .2byte 0x120 + .byte 0 + .uleb128 0x1c + .string "lmb" + .byte 0xe + .byte 0x20 + .4byte 0x33b + .uleb128 0x1d + .byte 0x10 + .byte 0xf + .byte 0x5b + .4byte 0x38e + .uleb128 0x12 + .4byte .LASF36 + .byte 0xf + .byte 0x5c + .4byte 0xae + .byte 0 + .uleb128 0x12 + .4byte .LASF33 + .byte 0xf + .byte 0x5d + .4byte 0xae + .byte 0x8 + .byte 0 + .uleb128 0x11 + .4byte .LASF49 + .byte 0xa8 + .byte 0xf + .byte 0x1b + .4byte 0x47f + .uleb128 0x12 + .4byte .LASF50 + .byte 0xf + .byte 0x1c + .4byte 0x3b + .byte 0 + .uleb128 0x12 + .4byte .LASF51 + .byte 0xf + .byte 0x1d + .4byte 0xc4 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF52 + .byte 0xf + .byte 0x1e + .4byte 0x3b + .byte 0x10 + .uleb128 0x12 + .4byte .LASF53 + .byte 0xf + .byte 0x1f + .4byte 0x3b + .byte 0x18 + .uleb128 0x12 + .4byte .LASF54 + .byte 0xf + .byte 0x20 + .4byte 0x3b + .byte 0x20 + .uleb128 0x12 + .4byte .LASF55 + .byte 0xf + .byte 0x21 + .4byte 0x3b + .byte 0x28 + .uleb128 0x12 + .4byte .LASF56 + .byte 0xf + .byte 0x22 + .4byte 0x3b + .byte 0x30 + .uleb128 0x12 + .4byte .LASF57 + .byte 0xf + .byte 0x24 + .4byte 0x3b + .byte 0x38 + .uleb128 0x12 + .4byte .LASF58 + .byte 0xf + .byte 0x25 + .4byte 0x3b + .byte 0x40 + .uleb128 0x12 + .4byte .LASF59 + .byte 0xf + .byte 0x26 + .4byte 0x3b + .byte 0x48 + .uleb128 0x12 + .4byte .LASF60 + .byte 0xf + .byte 0x31 + .4byte 0x3b + .byte 0x50 + .uleb128 0x12 + .4byte .LASF61 + .byte 0xf + .byte 0x32 + .4byte 0x3b + .byte 0x58 + .uleb128 0x12 + .4byte .LASF62 + .byte 0xf + .byte 0x33 + .4byte 0x191 + .byte 0x60 + .uleb128 0x12 + .4byte .LASF63 + .byte 0xf + .byte 0x34 + .4byte 0x42 + .byte 0x66 + .uleb128 0x12 + .4byte .LASF64 + .byte 0xf + .byte 0x35 + .4byte 0x3b + .byte 0x68 + .uleb128 0x12 + .4byte .LASF65 + .byte 0xf + .byte 0x36 + .4byte 0x3b + .byte 0x70 + .uleb128 0x12 + .4byte .LASF66 + .byte 0xf + .byte 0x57 + .4byte 0x100 + .byte 0x78 + .uleb128 0x12 + .4byte .LASF67 + .byte 0xf + .byte 0x58 + .4byte 0x100 + .byte 0x80 + .uleb128 0x12 + .4byte .LASF68 + .byte 0xf + .byte 0x5e + .4byte 0x47f + .byte 0x88 + .byte 0 + .uleb128 0xb + .4byte 0x36d + .4byte 0x48f + .uleb128 0x10 + .4byte 0xcf + .byte 0x1 + .byte 0 + .uleb128 0x2 + .4byte .LASF69 + .byte 0xf + .byte 0x60 + .4byte 0x38e + .uleb128 0x4 + .4byte .LASF70 + .byte 0x10 + .byte 0x13 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF71 + .byte 0x10 + .byte 0x14 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF72 + .byte 0x10 + .byte 0x15 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF73 + .byte 0x10 + .byte 0x16 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF74 + .byte 0x10 + .byte 0x17 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF75 + .byte 0x10 + .byte 0x18 + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF76 + .byte 0x10 + .byte 0x19 + .4byte 0x100 + .uleb128 0x2 + .4byte .LASF77 + .byte 0x11 + .byte 0x11 + .4byte 0x11b + .uleb128 0x11 + .4byte .LASF78 + .byte 0x28 + .byte 0x12 + .byte 0x39 + .4byte 0x577 + .uleb128 0x12 + .4byte .LASF79 + .byte 0x12 + .byte 0x3a + .4byte 0x4e7 + .byte 0 + .uleb128 0x12 + .4byte .LASF80 + .byte 0x12 + .byte 0x3b + .4byte 0x4e7 + .byte 0x4 + .uleb128 0x12 + .4byte .LASF81 + .byte 0x12 + .byte 0x3c + .4byte 0x4e7 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF82 + .byte 0x12 + .byte 0x3d + .4byte 0x4e7 + .byte 0xc + .uleb128 0x12 + .4byte .LASF83 + .byte 0x12 + .byte 0x3e + .4byte 0x4e7 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF84 + .byte 0x12 + .byte 0x3f + .4byte 0x4e7 + .byte 0x14 + .uleb128 0x12 + .4byte .LASF85 + .byte 0x12 + .byte 0x40 + .4byte 0x4e7 + .byte 0x18 + .uleb128 0x12 + .4byte .LASF86 + .byte 0x12 + .byte 0x43 + .4byte 0x4e7 + .byte 0x1c + .uleb128 0x12 + .4byte .LASF87 + .byte 0x12 + .byte 0x46 + .4byte 0x4e7 + .byte 0x20 + .uleb128 0x12 + .4byte .LASF88 + .byte 0x12 + .byte 0x49 + .4byte 0x4e7 + .byte 0x24 + .byte 0 + .uleb128 0xd + .4byte .LASF89 + .byte 0x13 + .2byte 0x136 + .4byte 0x583 + .uleb128 0x8 + .byte 0x8 + .4byte 0x4f2 + .uleb128 0x1e + .4byte .LASF90 + .byte 0x40 + .byte 0x14 + .2byte 0x137 + .4byte 0x633 + .uleb128 0x1f + .4byte .LASF91 + .byte 0x14 + .2byte 0x138 + .4byte 0x11b + .byte 0 + .uleb128 0x1f + .4byte .LASF92 + .byte 0x14 + .2byte 0x139 + .4byte 0x11b + .byte 0x4 + .uleb128 0x1f + .4byte .LASF93 + .byte 0x14 + .2byte 0x13a + .4byte 0x11b + .byte 0x8 + .uleb128 0x1f + .4byte .LASF94 + .byte 0x14 + .2byte 0x13b + .4byte 0x11b + .byte 0xc + .uleb128 0x1f + .4byte .LASF95 + .byte 0x14 + .2byte 0x13c + .4byte 0x11b + .byte 0x10 + .uleb128 0x1f + .4byte .LASF96 + .byte 0x14 + .2byte 0x13d + .4byte 0x11b + .byte 0x14 + .uleb128 0x1f + .4byte .LASF97 + .byte 0x14 + .2byte 0x13e + .4byte 0x11b + .byte 0x18 + .uleb128 0x1f + .4byte .LASF98 + .byte 0x14 + .2byte 0x13f + .4byte 0x110 + .byte 0x1c + .uleb128 0x1f + .4byte .LASF99 + .byte 0x14 + .2byte 0x140 + .4byte 0x110 + .byte 0x1d + .uleb128 0x1f + .4byte .LASF100 + .byte 0x14 + .2byte 0x141 + .4byte 0x110 + .byte 0x1e + .uleb128 0x1f + .4byte .LASF101 + .byte 0x14 + .2byte 0x142 + .4byte 0x110 + .byte 0x1f + .uleb128 0x1f + .4byte .LASF102 + .byte 0x14 + .2byte 0x143 + .4byte 0x633 + .byte 0x20 + .byte 0 + .uleb128 0xb + .4byte 0x110 + .4byte 0x643 + .uleb128 0x10 + .4byte 0xcf + .byte 0x1f + .byte 0 + .uleb128 0x20 + .4byte .LASF103 + .byte 0x14 + .2byte 0x144 + .4byte 0x589 + .uleb128 0x1e + .4byte .LASF104 + .byte 0x30 + .byte 0x14 + .2byte 0x146 + .4byte 0x6d1 + .uleb128 0x1f + .4byte .LASF36 + .byte 0x14 + .2byte 0x147 + .4byte 0x100 + .byte 0 + .uleb128 0x21 + .string "end" + .byte 0x14 + .2byte 0x147 + .4byte 0x100 + .byte 0x8 + .uleb128 0x1f + .4byte .LASF105 + .byte 0x14 + .2byte 0x148 + .4byte 0x100 + .byte 0x10 + .uleb128 0x1f + .4byte .LASF106 + .byte 0x14 + .2byte 0x148 + .4byte 0x100 + .byte 0x18 + .uleb128 0x1f + .4byte .LASF107 + .byte 0x14 + .2byte 0x149 + .4byte 0x100 + .byte 0x20 + .uleb128 0x1f + .4byte .LASF108 + .byte 0x14 + .2byte 0x14a + .4byte 0x110 + .byte 0x28 + .uleb128 0x1f + .4byte .LASF109 + .byte 0x14 + .2byte 0x14a + .4byte 0x110 + .byte 0x29 + .uleb128 0x21 + .string "os" + .byte 0x14 + .2byte 0x14a + .4byte 0x110 + .byte 0x2a + .uleb128 0x1f + .4byte .LASF110 + .byte 0x14 + .2byte 0x14b + .4byte 0x110 + .byte 0x2b + .byte 0 + .uleb128 0x20 + .4byte .LASF111 + .byte 0x14 + .2byte 0x14c + .4byte 0x64f + .uleb128 0x22 + .4byte .LASF112 + .2byte 0x380 + .byte 0x14 + .2byte 0x152 + .4byte 0x87a + .uleb128 0x1f + .4byte .LASF113 + .byte 0x14 + .2byte 0x158 + .4byte 0x87a + .byte 0 + .uleb128 0x1f + .4byte .LASF114 + .byte 0x14 + .2byte 0x159 + .4byte 0x643 + .byte 0x8 + .uleb128 0x1f + .4byte .LASF115 + .byte 0x14 + .2byte 0x15a + .4byte 0x100 + .byte 0x48 + .uleb128 0x1f + .4byte .LASF116 + .byte 0x14 + .2byte 0x15d + .4byte 0xd6 + .byte 0x50 + .uleb128 0x1f + .4byte .LASF117 + .byte 0x14 + .2byte 0x15f + .4byte 0x126 + .byte 0x58 + .uleb128 0x1f + .4byte .LASF118 + .byte 0x14 + .2byte 0x160 + .4byte 0xd6 + .byte 0x60 + .uleb128 0x1f + .4byte .LASF119 + .byte 0x14 + .2byte 0x161 + .4byte 0x54 + .byte 0x68 + .uleb128 0x1f + .4byte .LASF120 + .byte 0x14 + .2byte 0x163 + .4byte 0x126 + .byte 0x70 + .uleb128 0x1f + .4byte .LASF121 + .byte 0x14 + .2byte 0x164 + .4byte 0xd6 + .byte 0x78 + .uleb128 0x1f + .4byte .LASF122 + .byte 0x14 + .2byte 0x165 + .4byte 0x54 + .byte 0x80 + .uleb128 0x1f + .4byte .LASF123 + .byte 0x14 + .2byte 0x167 + .4byte 0x126 + .byte 0x88 + .uleb128 0x1f + .4byte .LASF124 + .byte 0x14 + .2byte 0x168 + .4byte 0xd6 + .byte 0x90 + .uleb128 0x1f + .4byte .LASF125 + .byte 0x14 + .2byte 0x169 + .4byte 0x54 + .byte 0x98 + .uleb128 0x1f + .4byte .LASF126 + .byte 0x14 + .2byte 0x16b + .4byte 0x126 + .byte 0xa0 + .uleb128 0x1f + .4byte .LASF127 + .byte 0x14 + .2byte 0x16c + .4byte 0xd6 + .byte 0xa8 + .uleb128 0x1f + .4byte .LASF128 + .byte 0x14 + .2byte 0x16d + .4byte 0x54 + .byte 0xb0 + .uleb128 0x21 + .string "os" + .byte 0x14 + .2byte 0x171 + .4byte 0x6d1 + .byte 0xb8 + .uleb128 0x21 + .string "ep" + .byte 0x14 + .2byte 0x172 + .4byte 0x100 + .byte 0xe8 + .uleb128 0x1f + .4byte .LASF129 + .byte 0x14 + .2byte 0x174 + .4byte 0x100 + .byte 0xf0 + .uleb128 0x1f + .4byte .LASF130 + .byte 0x14 + .2byte 0x174 + .4byte 0x100 + .byte 0xf8 + .uleb128 0x23 + .4byte .LASF131 + .byte 0x14 + .2byte 0x176 + .4byte 0xef + .2byte 0x100 + .uleb128 0x23 + .4byte .LASF132 + .byte 0x14 + .2byte 0x177 + .4byte 0x100 + .2byte 0x108 + .uleb128 0x23 + .4byte .LASF133 + .byte 0x14 + .2byte 0x179 + .4byte 0x100 + .2byte 0x110 + .uleb128 0x23 + .4byte .LASF134 + .byte 0x14 + .2byte 0x17a + .4byte 0x100 + .2byte 0x118 + .uleb128 0x23 + .4byte .LASF135 + .byte 0x14 + .2byte 0x17b + .4byte 0x100 + .2byte 0x120 + .uleb128 0x23 + .4byte .LASF136 + .byte 0x14 + .2byte 0x17c + .4byte 0x100 + .2byte 0x128 + .uleb128 0x24 + .string "kbd" + .byte 0x14 + .2byte 0x17d + .4byte 0x880 + .2byte 0x130 + .uleb128 0x23 + .4byte .LASF137 + .byte 0x14 + .2byte 0x180 + .4byte 0x54 + .2byte 0x138 + .uleb128 0x23 + .4byte .LASF138 + .byte 0x14 + .2byte 0x18d + .4byte 0x54 + .2byte 0x13c + .uleb128 0x24 + .string "lmb" + .byte 0x14 + .2byte 0x190 + .4byte 0x33b + .2byte 0x140 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x643 + .uleb128 0x8 + .byte 0x8 + .4byte 0x48f + .uleb128 0x20 + .4byte .LASF139 + .byte 0x14 + .2byte 0x196 + .4byte 0x6dd + .uleb128 0xd + .4byte .LASF140 + .byte 0x14 + .2byte 0x198 + .4byte 0x886 + .uleb128 0xb + .4byte 0xdc + .4byte 0x8af + .uleb128 0x18 + .4byte 0xcf + .2byte 0x3ff + .byte 0 + .uleb128 0x25 + .4byte .LASF331 + .byte 0x4 + .4byte 0x54 + .byte 0x18 + .byte 0xe + .4byte 0xb18 + .uleb128 0x26 + .4byte .LASF141 + .byte 0 + .uleb128 0x26 + .4byte .LASF142 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF143 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF144 + .byte 0x3 + .uleb128 0x26 + .4byte .LASF145 + .byte 0x4 + .uleb128 0x26 + .4byte .LASF146 + .byte 0x5 + .uleb128 0x26 + .4byte .LASF147 + .byte 0x6 + .uleb128 0x26 + .4byte .LASF148 + .byte 0x7 + .uleb128 0x26 + .4byte .LASF149 + .byte 0x8 + .uleb128 0x26 + .4byte .LASF150 + .byte 0x9 + .uleb128 0x26 + .4byte .LASF151 + .byte 0xa + .uleb128 0x26 + .4byte .LASF152 + .byte 0xb + .uleb128 0x26 + .4byte .LASF153 + .byte 0xc + .uleb128 0x26 + .4byte .LASF154 + .byte 0xd + .uleb128 0x26 + .4byte .LASF155 + .byte 0xe + .uleb128 0x26 + .4byte .LASF156 + .byte 0xf + .uleb128 0x26 + .4byte .LASF157 + .byte 0x10 + .uleb128 0x26 + .4byte .LASF158 + .byte 0x11 + .uleb128 0x26 + .4byte .LASF159 + .byte 0x12 + .uleb128 0x26 + .4byte .LASF160 + .byte 0x13 + .uleb128 0x26 + .4byte .LASF161 + .byte 0x14 + .uleb128 0x26 + .4byte .LASF162 + .byte 0x15 + .uleb128 0x26 + .4byte .LASF163 + .byte 0x16 + .uleb128 0x26 + .4byte .LASF164 + .byte 0x17 + .uleb128 0x26 + .4byte .LASF165 + .byte 0x18 + .uleb128 0x26 + .4byte .LASF166 + .byte 0x19 + .uleb128 0x26 + .4byte .LASF167 + .byte 0x1a + .uleb128 0x26 + .4byte .LASF168 + .byte 0x1b + .uleb128 0x26 + .4byte .LASF169 + .byte 0x1c + .uleb128 0x26 + .4byte .LASF170 + .byte 0x1d + .uleb128 0x26 + .4byte .LASF171 + .byte 0x1e + .uleb128 0x26 + .4byte .LASF172 + .byte 0x1f + .uleb128 0x26 + .4byte .LASF173 + .byte 0x20 + .uleb128 0x26 + .4byte .LASF174 + .byte 0x21 + .uleb128 0x26 + .4byte .LASF175 + .byte 0x22 + .uleb128 0x26 + .4byte .LASF176 + .byte 0x23 + .uleb128 0x26 + .4byte .LASF177 + .byte 0x24 + .uleb128 0x26 + .4byte .LASF178 + .byte 0x25 + .uleb128 0x26 + .4byte .LASF179 + .byte 0x26 + .uleb128 0x26 + .4byte .LASF180 + .byte 0x27 + .uleb128 0x26 + .4byte .LASF181 + .byte 0x28 + .uleb128 0x26 + .4byte .LASF182 + .byte 0x29 + .uleb128 0x26 + .4byte .LASF183 + .byte 0x2a + .uleb128 0x26 + .4byte .LASF184 + .byte 0x2b + .uleb128 0x26 + .4byte .LASF185 + .byte 0x2c + .uleb128 0x26 + .4byte .LASF186 + .byte 0x2d + .uleb128 0x26 + .4byte .LASF187 + .byte 0x2e + .uleb128 0x26 + .4byte .LASF188 + .byte 0x2f + .uleb128 0x26 + .4byte .LASF189 + .byte 0x30 + .uleb128 0x26 + .4byte .LASF190 + .byte 0x31 + .uleb128 0x26 + .4byte .LASF191 + .byte 0x32 + .uleb128 0x26 + .4byte .LASF192 + .byte 0x33 + .uleb128 0x26 + .4byte .LASF193 + .byte 0x34 + .uleb128 0x26 + .4byte .LASF194 + .byte 0x35 + .uleb128 0x26 + .4byte .LASF195 + .byte 0x36 + .uleb128 0x26 + .4byte .LASF196 + .byte 0x37 + .uleb128 0x26 + .4byte .LASF197 + .byte 0x38 + .uleb128 0x26 + .4byte .LASF198 + .byte 0x39 + .uleb128 0x26 + .4byte .LASF199 + .byte 0x3a + .uleb128 0x26 + .4byte .LASF200 + .byte 0x3b + .uleb128 0x26 + .4byte .LASF201 + .byte 0x3c + .uleb128 0x26 + .4byte .LASF202 + .byte 0x3d + .uleb128 0x26 + .4byte .LASF203 + .byte 0x3e + .uleb128 0x26 + .4byte .LASF204 + .byte 0x3f + .uleb128 0x26 + .4byte .LASF205 + .byte 0x40 + .uleb128 0x26 + .4byte .LASF206 + .byte 0x41 + .uleb128 0x26 + .4byte .LASF207 + .byte 0x42 + .uleb128 0x26 + .4byte .LASF208 + .byte 0x43 + .uleb128 0x26 + .4byte .LASF209 + .byte 0x44 + .uleb128 0x26 + .4byte .LASF210 + .byte 0x45 + .uleb128 0x26 + .4byte .LASF211 + .byte 0x46 + .uleb128 0x26 + .4byte .LASF212 + .byte 0x47 + .uleb128 0x26 + .4byte .LASF213 + .byte 0x48 + .uleb128 0x26 + .4byte .LASF214 + .byte 0x49 + .uleb128 0x26 + .4byte .LASF215 + .byte 0x4a + .uleb128 0x26 + .4byte .LASF216 + .byte 0x4b + .uleb128 0x26 + .4byte .LASF217 + .byte 0x4c + .uleb128 0x26 + .4byte .LASF218 + .byte 0x4d + .uleb128 0x26 + .4byte .LASF219 + .byte 0x4e + .uleb128 0x26 + .4byte .LASF220 + .byte 0x4f + .uleb128 0x26 + .4byte .LASF221 + .byte 0x50 + .uleb128 0x26 + .4byte .LASF222 + .byte 0x51 + .uleb128 0x26 + .4byte .LASF223 + .byte 0x52 + .uleb128 0x26 + .4byte .LASF224 + .byte 0x53 + .uleb128 0x26 + .4byte .LASF225 + .byte 0x54 + .uleb128 0x26 + .4byte .LASF226 + .byte 0x55 + .uleb128 0x26 + .4byte .LASF227 + .byte 0x56 + .uleb128 0x26 + .4byte .LASF228 + .byte 0x57 + .uleb128 0x26 + .4byte .LASF229 + .byte 0x58 + .uleb128 0x26 + .4byte .LASF230 + .byte 0x59 + .uleb128 0x26 + .4byte .LASF231 + .byte 0x5a + .uleb128 0x26 + .4byte .LASF232 + .byte 0x5b + .uleb128 0x26 + .4byte .LASF233 + .byte 0x5c + .uleb128 0x26 + .4byte .LASF234 + .byte 0x5d + .uleb128 0x26 + .4byte .LASF235 + .byte 0x5e + .uleb128 0x26 + .4byte .LASF236 + .byte 0x5f + .uleb128 0x26 + .4byte .LASF237 + .byte 0x60 + .uleb128 0x26 + .4byte .LASF238 + .byte 0x61 + .uleb128 0x26 + .4byte .LASF239 + .byte 0x62 + .uleb128 0x27 + .4byte .LASF240 + .sleb128 -1 + .byte 0 + .uleb128 0x28 + .byte 0x4 + .4byte 0x7f + .byte 0x1c + .byte 0xf6 + .4byte 0xb2b + .uleb128 0x26 + .4byte .LASF241 + .byte 0x5 + .byte 0 + .uleb128 0x11 + .4byte .LASF242 + .byte 0x40 + .byte 0x15 + .byte 0xc + .4byte 0xba4 + .uleb128 0x12 + .4byte .LASF243 + .byte 0x15 + .byte 0x22 + .4byte 0x3b + .byte 0 + .uleb128 0x1a + .string "tbu" + .byte 0x15 + .byte 0x23 + .4byte 0x7f + .byte 0x8 + .uleb128 0x1a + .string "tbl" + .byte 0x15 + .byte 0x24 + .4byte 0x7f + .byte 0xc + .uleb128 0x12 + .4byte .LASF244 + .byte 0x15 + .byte 0x25 + .4byte 0x3b + .byte 0x10 + .uleb128 0x12 + .4byte .LASF245 + .byte 0x15 + .byte 0x26 + .4byte 0x8d + .byte 0x18 + .uleb128 0x12 + .4byte .LASF246 + .byte 0x15 + .byte 0x29 + .4byte 0x3b + .byte 0x20 + .uleb128 0x12 + .4byte .LASF247 + .byte 0x15 + .byte 0x2a + .4byte 0x3b + .byte 0x28 + .uleb128 0x12 + .4byte .LASF248 + .byte 0x15 + .byte 0x2c + .4byte 0x3b + .byte 0x30 + .uleb128 0x12 + .4byte .LASF249 + .byte 0x15 + .byte 0x2d + .4byte 0x3b + .byte 0x38 + .byte 0 + .uleb128 0x11 + .4byte .LASF250 + .byte 0x18 + .byte 0x16 + .byte 0x22 + .4byte 0xbec + .uleb128 0x12 + .4byte .LASF251 + .byte 0x16 + .byte 0x23 + .4byte 0xa3 + .byte 0 + .uleb128 0x12 + .4byte .LASF252 + .byte 0x16 + .byte 0x24 + .4byte 0xa3 + .byte 0x4 + .uleb128 0x1a + .string "id" + .byte 0x16 + .byte 0x25 + .4byte 0xa3 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF253 + .byte 0x16 + .byte 0x26 + .4byte 0xa3 + .byte 0xc + .uleb128 0x12 + .4byte .LASF254 + .byte 0x16 + .byte 0x27 + .4byte 0x100 + .byte 0x10 + .byte 0 + .uleb128 0x19 + .4byte .LASF255 + .2byte 0x1c8 + .byte 0x16 + .byte 0x2a + .4byte 0xe22 + .uleb128 0x1a + .string "bd" + .byte 0x16 + .byte 0x2b + .4byte 0x880 + .byte 0 + .uleb128 0x12 + .4byte .LASF256 + .byte 0x16 + .byte 0x2c + .4byte 0x3b + .byte 0x8 + .uleb128 0x12 + .4byte .LASF253 + .byte 0x16 + .byte 0x2d + .4byte 0x7f + .byte 0x10 + .uleb128 0x12 + .4byte .LASF257 + .byte 0x16 + .byte 0x2e + .4byte 0x3b + .byte 0x18 + .uleb128 0x12 + .4byte .LASF258 + .byte 0x16 + .byte 0x2f + .4byte 0x3b + .byte 0x20 + .uleb128 0x12 + .4byte .LASF259 + .byte 0x16 + .byte 0x31 + .4byte 0x3b + .byte 0x28 + .uleb128 0x12 + .4byte .LASF260 + .byte 0x16 + .byte 0x32 + .4byte 0x3b + .byte 0x30 + .uleb128 0x12 + .4byte .LASF261 + .byte 0x16 + .byte 0x3e + .4byte 0x3b + .byte 0x38 + .uleb128 0x12 + .4byte .LASF262 + .byte 0x16 + .byte 0x42 + .4byte 0x3b + .byte 0x40 + .uleb128 0x12 + .4byte .LASF263 + .byte 0x16 + .byte 0x43 + .4byte 0x3b + .byte 0x48 + .uleb128 0x12 + .4byte .LASF264 + .byte 0x16 + .byte 0x45 + .4byte 0x3b + .byte 0x50 + .uleb128 0x12 + .4byte .LASF265 + .byte 0x16 + .byte 0x46 + .4byte 0x3b + .byte 0x58 + .uleb128 0x12 + .4byte .LASF266 + .byte 0x16 + .byte 0x47 + .4byte 0x3b + .byte 0x60 + .uleb128 0x12 + .4byte .LASF267 + .byte 0x16 + .byte 0x48 + .4byte 0xc4 + .byte 0x68 + .uleb128 0x12 + .4byte .LASF268 + .byte 0x16 + .byte 0x49 + .4byte 0x3b + .byte 0x70 + .uleb128 0x12 + .4byte .LASF269 + .byte 0x16 + .byte 0x4a + .4byte 0x3b + .byte 0x78 + .uleb128 0x12 + .4byte .LASF270 + .byte 0x16 + .byte 0x4b + .4byte 0x3b + .byte 0x80 + .uleb128 0x12 + .4byte .LASF271 + .byte 0x16 + .byte 0x4c + .4byte 0x3b + .byte 0x88 + .uleb128 0x12 + .4byte .LASF272 + .byte 0x16 + .byte 0x4d + .4byte 0xe22 + .byte 0x90 + .uleb128 0x12 + .4byte .LASF273 + .byte 0x16 + .byte 0x50 + .4byte 0x16e + .byte 0x98 + .uleb128 0x12 + .4byte .LASF274 + .byte 0x16 + .byte 0x51 + .4byte 0x16e + .byte 0xa0 + .uleb128 0x12 + .4byte .LASF275 + .byte 0x16 + .byte 0x52 + .4byte 0x1a1 + .byte 0xa8 + .uleb128 0x12 + .4byte .LASF276 + .byte 0x16 + .byte 0x57 + .4byte 0x174 + .byte 0xb8 + .uleb128 0x12 + .4byte .LASF277 + .byte 0x16 + .byte 0x58 + .4byte 0x126 + .byte 0xc0 + .uleb128 0x12 + .4byte .LASF278 + .byte 0x16 + .byte 0x59 + .4byte 0x3b + .byte 0xc8 + .uleb128 0x12 + .4byte .LASF279 + .byte 0x16 + .byte 0x5b + .4byte 0xe2d + .byte 0xd0 + .uleb128 0x12 + .4byte .LASF280 + .byte 0x16 + .byte 0x5c + .4byte 0xe2d + .byte 0xd8 + .uleb128 0x12 + .4byte .LASF281 + .byte 0x16 + .byte 0x5e + .4byte 0x174 + .byte 0xe0 + .uleb128 0x12 + .4byte .LASF282 + .byte 0x16 + .byte 0x5f + .4byte 0x174 + .byte 0xe8 + .uleb128 0x1a + .string "jt" + .byte 0x16 + .byte 0x60 + .4byte 0xe38 + .byte 0xf0 + .uleb128 0x12 + .4byte .LASF283 + .byte 0x16 + .byte 0x61 + .4byte 0xe3e + .byte 0xf8 + .uleb128 0x16 + .4byte .LASF284 + .byte 0x16 + .byte 0x6b + .4byte 0x7f + .2byte 0x118 + .uleb128 0x16 + .4byte .LASF285 + .byte 0x16 + .byte 0x6c + .4byte 0x7f + .2byte 0x11c + .uleb128 0x16 + .4byte .LASF286 + .byte 0x16 + .byte 0x6e + .4byte 0x3b + .2byte 0x120 + .uleb128 0x16 + .4byte .LASF287 + .byte 0x16 + .byte 0x6f + .4byte 0x3b + .2byte 0x128 + .uleb128 0x16 + .4byte .LASF288 + .byte 0x16 + .byte 0x70 + .4byte 0x3b + .2byte 0x130 + .uleb128 0x16 + .4byte .LASF289 + .byte 0x16 + .byte 0x79 + .4byte 0x16e + .2byte 0x138 + .uleb128 0x16 + .4byte .LASF110 + .byte 0x16 + .byte 0x7a + .4byte 0xb2b + .2byte 0x140 + .uleb128 0x16 + .4byte .LASF290 + .byte 0x16 + .byte 0x80 + .4byte 0x100 + .2byte 0x180 + .uleb128 0x16 + .4byte .LASF291 + .byte 0x16 + .byte 0x81 + .4byte 0x100 + .2byte 0x188 + .uleb128 0x16 + .4byte .LASF292 + .byte 0x16 + .byte 0x87 + .4byte 0xb9 + .2byte 0x190 + .uleb128 0x16 + .4byte .LASF293 + .byte 0x16 + .byte 0x8a + .4byte 0x54 + .2byte 0x198 + .uleb128 0x16 + .4byte .LASF294 + .byte 0x16 + .byte 0x8c + .4byte 0xba4 + .2byte 0x1a0 + .uleb128 0x16 + .4byte .LASF295 + .byte 0x16 + .byte 0x8d + .4byte 0x100 + .2byte 0x1b8 + .uleb128 0x16 + .4byte .LASF296 + .byte 0x16 + .byte 0x8e + .4byte 0x54 + .2byte 0x1c0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0xbec + .uleb128 0xe + .4byte .LASF297 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe28 + .uleb128 0xe + .4byte .LASF298 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe33 + .uleb128 0xb + .4byte 0xdc + .4byte 0xe4e + .uleb128 0x10 + .4byte 0xcf + .byte 0x1f + .byte 0 + .uleb128 0x2 + .4byte .LASF299 + .byte 0x16 + .byte 0x9b + .4byte 0xbec + .uleb128 0x9 + .4byte 0xe4e + .uleb128 0x4 + .4byte .LASF300 + .byte 0x4 + .byte 0xad + .4byte 0x100 + .uleb128 0xb + .4byte 0x94 + .4byte 0xe74 + .uleb128 0xc + .byte 0 + .uleb128 0x4 + .4byte .LASF301 + .byte 0x4 + .byte 0xaf + .4byte 0xe69 + .uleb128 0x4 + .4byte .LASF302 + .byte 0x4 + .byte 0xb0 + .4byte 0xe69 + .uleb128 0x4 + .4byte .LASF303 + .byte 0x4 + .byte 0xfe + .4byte 0x100 + .uleb128 0x4 + .4byte .LASF304 + .byte 0x4 + .byte 0xff + .4byte 0x100 + .uleb128 0xd + .4byte .LASF305 + .byte 0x4 + .2byte 0x100 + .4byte 0x100 + .uleb128 0x11 + .4byte .LASF306 + .byte 0x4 + .byte 0x17 + .byte 0x2e + .4byte 0xec5 + .uleb128 0x12 + .4byte .LASF307 + .byte 0x17 + .byte 0x2f + .4byte 0x11b + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x29 + .uleb128 0xb + .4byte 0x94 + .4byte 0xedb + .uleb128 0x10 + .4byte 0xcf + .byte 0x5 + .byte 0 + .uleb128 0xd + .4byte .LASF308 + .byte 0x17 + .2byte 0x1fd + .4byte 0xeac + .uleb128 0xd + .4byte .LASF309 + .byte 0x17 + .2byte 0x1fe + .4byte 0xeac + .uleb128 0xd + .4byte .LASF310 + .byte 0x17 + .2byte 0x200 + .4byte 0xeac + .uleb128 0xd + .4byte .LASF311 + .byte 0x17 + .2byte 0x205 + .4byte 0xe3e + .uleb128 0xd + .4byte .LASF312 + .byte 0x17 + .2byte 0x206 + .4byte 0xe3e + .uleb128 0xb + .4byte 0xdc + .4byte 0xf27 + .uleb128 0x10 + .4byte 0xcf + .byte 0x3f + .byte 0 + .uleb128 0xd + .4byte .LASF313 + .byte 0x17 + .2byte 0x207 + .4byte 0xf17 + .uleb128 0xd + .4byte .LASF314 + .byte 0x17 + .2byte 0x209 + .4byte 0xecb + .uleb128 0xd + .4byte .LASF315 + .byte 0x17 + .2byte 0x20a + .4byte 0xecb + .uleb128 0xd + .4byte .LASF316 + .byte 0x17 + .2byte 0x20b + .4byte 0xeac + .uleb128 0xd + .4byte .LASF317 + .byte 0x17 + .2byte 0x20c + .4byte 0xeac + .uleb128 0xd + .4byte .LASF318 + .byte 0x17 + .2byte 0x20d + .4byte 0xec5 + .uleb128 0xb + .4byte 0xec5 + .4byte 0xf7f + .uleb128 0x10 + .4byte 0xcf + .byte 0x3 + .byte 0 + .uleb128 0xd + .4byte .LASF319 + .byte 0x17 + .2byte 0x20e + .4byte 0xf6f + .uleb128 0xd + .4byte .LASF320 + .byte 0x17 + .2byte 0x20f + .4byte 0xec5 + .uleb128 0xd + .4byte .LASF321 + .byte 0x17 + .2byte 0x210 + .4byte 0x54 + .uleb128 0xb + .4byte 0x9e + .4byte 0xfb3 + .uleb128 0x10 + .4byte 0xcf + .byte 0x5 + .byte 0 + .uleb128 0x7 + .4byte 0xfa3 + .uleb128 0xd + .4byte .LASF322 + .byte 0x17 + .2byte 0x211 + .4byte 0xfb3 + .uleb128 0xd + .4byte .LASF323 + .byte 0x17 + .2byte 0x212 + .4byte 0xfb3 + .uleb128 0xd + .4byte .LASF324 + .byte 0x17 + .2byte 0x216 + .4byte 0xf5 + .uleb128 0xd + .4byte .LASF325 + .byte 0x17 + .2byte 0x217 + .4byte 0xf5 + .uleb128 0xd + .4byte .LASF326 + .byte 0x17 + .2byte 0x219 + .4byte 0x54 + .uleb128 0xd + .4byte .LASF327 + .byte 0x17 + .2byte 0x220 + .4byte 0x89e + .uleb128 0xd + .4byte .LASF328 + .byte 0x17 + .2byte 0x222 + .4byte 0xa3 + .uleb128 0xd + .4byte .LASF329 + .byte 0x17 + .2byte 0x224 + .4byte 0xa3 + .uleb128 0xd + .4byte .LASF330 + .byte 0x17 + .2byte 0x230 + .4byte 0xeac + .uleb128 0x29 + .4byte .LASF332 + .byte 0x4 + .4byte 0x7f + .byte 0x17 + .2byte 0x286 + .4byte 0x104e + .uleb128 0x26 + .4byte .LASF333 + .byte 0 + .uleb128 0x26 + .4byte .LASF334 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF335 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF336 + .byte 0x3 + .byte 0 + .uleb128 0xd + .4byte .LASF337 + .byte 0x17 + .2byte 0x28c + .4byte 0x1024 + .uleb128 0x4 + .4byte .LASF338 + .byte 0x19 + .byte 0x2b + .4byte 0x13a + .uleb128 0x4 + .4byte .LASF339 + .byte 0x19 + .byte 0x2b + .4byte 0x13a + .uleb128 0x11 + .4byte .LASF340 + .byte 0x28 + .byte 0x1a + .byte 0x39 + .4byte 0x10b9 + .uleb128 0x1a + .string "dev" + .byte 0x1a + .byte 0x3a + .4byte 0x126 + .byte 0 + .uleb128 0x12 + .4byte .LASF341 + .byte 0x1a + .byte 0x3b + .4byte 0x126 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF342 + .byte 0x1a + .byte 0x3c + .4byte 0x54 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF343 + .byte 0x1a + .byte 0x3d + .4byte 0xd6 + .byte 0x18 + .uleb128 0x12 + .4byte .LASF344 + .byte 0x1a + .byte 0x3e + .4byte 0x10dd + .byte 0x20 + .byte 0 + .uleb128 0x13 + .4byte 0x100 + .4byte 0x10d7 + .uleb128 0x14 + .4byte 0x10d7 + .uleb128 0x14 + .4byte 0x100 + .uleb128 0x14 + .4byte 0x100 + .uleb128 0x14 + .4byte 0x126 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1070 + .uleb128 0x8 + .byte 0x8 + .4byte 0x10b9 + .uleb128 0x11 + .4byte .LASF345 + .byte 0x38 + .byte 0x1b + .byte 0xc + .4byte 0x1114 + .uleb128 0x12 + .4byte .LASF346 + .byte 0x1b + .byte 0xd + .4byte 0x1070 + .byte 0 + .uleb128 0x12 + .4byte .LASF347 + .byte 0x1b + .byte 0x10 + .4byte 0x126 + .byte 0x28 + .uleb128 0x12 + .4byte .LASF348 + .byte 0x1b + .byte 0x11 + .4byte 0x100 + .byte 0x30 + .byte 0 + .uleb128 0x2a + .string "gd" + .byte 0x1 + .byte 0xf + .4byte 0x111e + .uleb128 0x8 + .byte 0x8 + .4byte 0xe59 + .uleb128 0x28 + .byte 0x4 + .4byte 0x7f + .byte 0x1 + .byte 0x40 + .4byte 0x1149 + .uleb128 0x26 + .4byte .LASF349 + .byte 0 + .uleb128 0x26 + .4byte .LASF350 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF351 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF352 + .byte 0x3 + .byte 0 + .uleb128 0x28 + .byte 0x4 + .4byte 0x7f + .byte 0x1 + .byte 0x47 + .4byte 0x1180 + .uleb128 0x26 + .4byte .LASF353 + .byte 0 + .uleb128 0x26 + .4byte .LASF354 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF355 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF356 + .byte 0x3 + .uleb128 0x26 + .4byte .LASF357 + .byte 0x4 + .uleb128 0x26 + .4byte .LASF358 + .byte 0x5 + .uleb128 0x26 + .4byte .LASF359 + .byte 0x6 + .byte 0 + .uleb128 0x28 + .byte 0x4 + .4byte 0x7f + .byte 0x1 + .byte 0x51 + .4byte 0x11c3 + .uleb128 0x26 + .4byte .LASF360 + .byte 0 + .uleb128 0x26 + .4byte .LASF361 + .byte 0x1 + .uleb128 0x26 + .4byte .LASF362 + .byte 0x2 + .uleb128 0x26 + .4byte .LASF363 + .byte 0x3 + .uleb128 0x26 + .4byte .LASF364 + .byte 0x4 + .uleb128 0x26 + .4byte .LASF365 + .byte 0x5 + .uleb128 0x26 + .4byte .LASF366 + .byte 0x6 + .uleb128 0x26 + .4byte .LASF367 + .byte 0x7 + .uleb128 0x26 + .4byte .LASF368 + .byte 0x8 + .byte 0 + .uleb128 0xb + .4byte 0xd6 + .4byte 0x11d3 + .uleb128 0x10 + .4byte 0xcf + .byte 0x7 + .byte 0 + .uleb128 0x2b + .4byte .LASF369 + .byte 0x1 + .byte 0x5d + .4byte 0x11c3 + .uleb128 0x9 + .byte 0x3 + .8byte tid_name + .uleb128 0x2 + .4byte .LASF370 + .byte 0x1 + .byte 0x68 + .4byte 0x11f3 + .uleb128 0x8 + .byte 0x8 + .4byte 0x11f9 + .uleb128 0x13 + .4byte 0x54 + .4byte 0x1208 + .uleb128 0x14 + .4byte 0x1208 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x10e3 + .uleb128 0x11 + .4byte .LASF371 + .byte 0x28 + .byte 0x1 + .byte 0x69 + .4byte 0x126d + .uleb128 0x1a + .string "fn" + .byte 0x1 + .byte 0x6a + .4byte 0x11e8 + .byte 0 + .uleb128 0x12 + .4byte .LASF138 + .byte 0x1 + .byte 0x6b + .4byte 0xa3 + .byte 0x8 + .uleb128 0x1a + .string "tid" + .byte 0x1 + .byte 0x6c + .4byte 0xa3 + .byte 0xc + .uleb128 0x12 + .4byte .LASF372 + .byte 0x1 + .byte 0x6d + .4byte 0xa3 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF373 + .byte 0x1 + .byte 0x6e + .4byte 0xa3 + .byte 0x14 + .uleb128 0x1a + .string "ret" + .byte 0x1 + .byte 0x6f + .4byte 0x54 + .byte 0x18 + .uleb128 0x1a + .string "ms" + .byte 0x1 + .byte 0x70 + .4byte 0x100 + .byte 0x20 + .byte 0 + .uleb128 0x19 + .4byte .LASF374 + .2byte 0x148 + .byte 0x1 + .byte 0x73 + .4byte 0x1294 + .uleb128 0x12 + .4byte .LASF375 + .byte 0x1 + .byte 0x74 + .4byte 0x1294 + .byte 0 + .uleb128 0x17 + .string "num" + .byte 0x1 + .byte 0x75 + .4byte 0x94 + .2byte 0x140 + .byte 0 + .uleb128 0xb + .4byte 0x120e + .4byte 0x12a4 + .uleb128 0x10 + .4byte 0xcf + .byte 0x7 + .byte 0 + .uleb128 0x19 + .4byte .LASF376 + .2byte 0x560 + .byte 0x1 + .byte 0x78 + .4byte 0x12d7 + .uleb128 0x12 + .4byte .LASF377 + .byte 0x1 + .byte 0x79 + .4byte 0xa3 + .byte 0 + .uleb128 0x1a + .string "cpu" + .byte 0x1 + .byte 0x7a + .4byte 0x12d7 + .byte 0x8 + .uleb128 0x16 + .4byte .LASF378 + .byte 0x1 + .byte 0x7b + .4byte 0x10e3 + .2byte 0x528 + .byte 0 + .uleb128 0xb + .4byte 0x126d + .4byte 0x12e7 + .uleb128 0x10 + .4byte 0xcf + .byte 0x3 + .byte 0 + .uleb128 0x2c + .string "mpb" + .byte 0x1 + .byte 0x7e + .4byte 0x12f2 + .uleb128 0x8 + .byte 0x8 + .4byte 0x12a4 + .uleb128 0x2b + .4byte .LASF379 + .byte 0x1 + .byte 0x7f + .4byte 0x100 + .uleb128 0x9 + .byte 0x3 + .8byte mpb_gd + .uleb128 0x11 + .4byte .LASF380 + .byte 0x18 + .byte 0x1 + .byte 0x95 + .4byte 0x1355 + .uleb128 0x1a + .string "cid" + .byte 0x1 + .byte 0x96 + .4byte 0xa3 + .byte 0 + .uleb128 0x1a + .string "tid" + .byte 0x1 + .byte 0x97 + .4byte 0xa3 + .byte 0x4 + .uleb128 0x1a + .string "fn" + .byte 0x1 + .byte 0x98 + .4byte 0x11e8 + .byte 0x8 + .uleb128 0x12 + .4byte .LASF372 + .byte 0x1 + .byte 0x99 + .4byte 0xa3 + .byte 0x10 + .uleb128 0x12 + .4byte .LASF373 + .byte 0x1 + .byte 0x9a + .4byte 0xa3 + .byte 0x14 + .byte 0 + .uleb128 0x2d + .4byte .LASF389 + .byte 0x1 + .2byte 0x271 + .4byte 0x100 + .8byte .LFB240 + .8byte .LFE240-.LFB240 + .uleb128 0x1 + .byte 0x9c + .4byte 0x139b + .uleb128 0x2e + .string "evt" + .byte 0x1 + .2byte 0x271 + .4byte 0x54 + .4byte .LLST61 + .uleb128 0x2f + .8byte .LVL153 + .4byte 0x19e7 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x32 + .byte 0 + .byte 0 + .uleb128 0x31 + .4byte .LASF381 + .byte 0x1 + .2byte 0x219 + .8byte .LFB239 + .8byte .LFE239-.LFB239 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1584 + .uleb128 0x2e + .string "evt" + .byte 0x1 + .2byte 0x219 + .4byte 0x54 + .4byte .LLST53 + .uleb128 0x32 + .4byte 0x1618 + .8byte .LBB120 + .4byte .Ldebug_ranges0+0x1c0 + .byte 0x1 + .2byte 0x21d + .4byte 0x14f3 + .uleb128 0x33 + .4byte .Ldebug_ranges0+0x1c0 + .uleb128 0x34 + .4byte 0x1625 + .uleb128 0x2 + .byte 0x91 + .sleb128 -48 + .uleb128 0x35 + .4byte 0x1631 + .4byte .LLST54 + .uleb128 0x32 + .4byte 0x1eb5 + .8byte .LBB122 + .4byte .Ldebug_ranges0+0x1f0 + .byte 0x1 + .2byte 0x203 + .4byte 0x143a + .uleb128 0x36 + .4byte 0x1ec5 + .4byte .LLST55 + .uleb128 0x33 + .4byte .Ldebug_ranges0+0x1f0 + .uleb128 0x35 + .4byte 0x1ed0 + .4byte .LLST56 + .uleb128 0x35 + .4byte 0x1edb + .4byte .LLST57 + .uleb128 0x35 + .4byte 0x1ee6 + .4byte .LLST58 + .byte 0 + .byte 0 + .uleb128 0x37 + .8byte .LBB127 + .8byte .LBE127-.LBB127 + .4byte 0x1455 + .uleb128 0x38 + .4byte 0x1640 + .byte 0 + .uleb128 0x37 + .8byte .LBB128 + .8byte .LBE128-.LBB128 + .4byte 0x1474 + .uleb128 0x35 + .4byte 0x164e + .4byte .LLST59 + .byte 0 + .uleb128 0x39 + .8byte .LVL128 + .4byte 0x22d5 + .4byte 0x149f + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8f + .sleb128 16 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LANCHOR2 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x8 + .byte 0x30 + .byte 0 + .uleb128 0x39 + .8byte .LVL129 + .4byte 0x22de + .4byte 0x14be + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC13 + .byte 0 + .uleb128 0x39 + .8byte .LVL130 + .4byte 0x22e9 + .4byte 0x14e4 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x4 + .byte 0x8 + .byte 0x82 + .byte 0x44 + .byte 0x24 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x3 + .byte 0xa + .2byte 0x560 + .byte 0 + .uleb128 0x3a + .8byte .LVL133 + .4byte 0x22f4 + .byte 0 + .byte 0 + .uleb128 0x3b + .4byte 0x1fd7 + .8byte .LBB132 + .8byte .LBE132-.LBB132 + .byte 0x1 + .2byte 0x226 + .4byte 0x152e + .uleb128 0x36 + .4byte 0x1fe3 + .4byte .LLST60 + .uleb128 0x3c + .8byte .LVL148 + .4byte 0x2300 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xa + .2byte 0x3e8 + .byte 0 + .byte 0 + .uleb128 0x39 + .8byte .LVL145 + .4byte 0x1d6b + .4byte 0x1554 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x33 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x6 + .byte 0x11 + .sleb128 -559087616 + .byte 0 + .uleb128 0x3a + .8byte .LVL146 + .4byte 0x22f4 + .uleb128 0x3c + .8byte .LVL150 + .4byte 0x1d6b + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x37 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x6 + .byte 0x11 + .sleb128 -559087616 + .byte 0 + .byte 0 + .uleb128 0x31 + .4byte .LASF382 + .byte 0x1 + .2byte 0x20e + .8byte .LFB238 + .8byte .LFE238-.LFB238 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1618 + .uleb128 0x3d + .4byte .LASF346 + .byte 0x1 + .2byte 0x20e + .4byte 0x1070 + .uleb128 0x2 + .byte 0x70 + .sleb128 0 + .uleb128 0x39 + .8byte .LVL122 + .4byte 0x22d5 + .4byte 0x15c9 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x8 + .byte 0x28 + .byte 0 + .uleb128 0x39 + .8byte .LVL123 + .4byte 0x184a + .4byte 0x15e5 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .byte 0 + .uleb128 0x39 + .8byte .LVL124 + .4byte 0x1d6b + .4byte 0x160a + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x30 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x33 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x5 + .byte 0xc + .4byte 0x11111111 + .byte 0 + .uleb128 0x3a + .8byte .LVL125 + .4byte 0x22f4 + .byte 0 + .uleb128 0x3e + .4byte .LASF403 + .byte 0x1 + .2byte 0x1e9 + .byte 0x1 + .4byte 0x165c + .uleb128 0x3f + .4byte .LASF383 + .byte 0x1 + .2byte 0x1ee + .4byte 0x165c + .uleb128 0x40 + .string "i" + .byte 0x1 + .2byte 0x1fb + .4byte 0x54 + .uleb128 0x41 + .4byte 0x164d + .uleb128 0x40 + .string "__v" + .byte 0x1 + .2byte 0x206 + .4byte 0xa3 + .byte 0 + .uleb128 0x42 + .uleb128 0x40 + .string "__v" + .byte 0x1 + .2byte 0x207 + .4byte 0xa3 + .byte 0 + .byte 0 + .uleb128 0xb + .4byte 0x130d + .4byte 0x166c + .uleb128 0x10 + .4byte 0xcf + .byte 0x1 + .byte 0 + .uleb128 0x31 + .4byte .LASF384 + .byte 0x1 + .2byte 0x1bf + .8byte .LFB236 + .8byte .LFE236-.LFB236 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1764 + .uleb128 0x2e + .string "cpu" + .byte 0x1 + .2byte 0x1bf + .4byte 0xa3 + .4byte .LLST51 + .uleb128 0x3b + .4byte 0x1f14 + .8byte .LBB106 + .8byte .LBE106-.LBB106 + .byte 0x1 + .2byte 0x1c2 + .4byte 0x16c0 + .uleb128 0x36 + .4byte 0x1f20 + .4byte .LLST52 + .byte 0 + .uleb128 0x43 + .4byte 0x1fcf + .8byte .LBB108 + .8byte .LBE108-.LBB108 + .byte 0x1 + .2byte 0x1d6 + .uleb128 0x43 + .4byte 0x1f0c + .8byte .LBB110 + .8byte .LBE110-.LBB110 + .byte 0x1 + .2byte 0x1da + .uleb128 0x3a + .8byte .LVL114 + .4byte 0x230b + .uleb128 0x39 + .8byte .LVL115 + .4byte 0x1764 + .4byte 0x1715 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x3a + .8byte .LVL116 + .4byte 0x22f4 + .uleb128 0x3a + .8byte .LVL117 + .4byte 0x2317 + .uleb128 0x3a + .8byte .LVL118 + .4byte 0x2323 + .uleb128 0x3a + .8byte .LVL119 + .4byte 0x232f + .uleb128 0x3a + .8byte .LVL120 + .4byte 0x233b + .uleb128 0x3a + .8byte .LVL121 + .4byte 0x2347 + .byte 0 + .uleb128 0x31 + .4byte .LASF385 + .byte 0x1 + .2byte 0x1b1 + .8byte .LFB235 + .8byte .LFE235-.LFB235 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1844 + .uleb128 0x2e + .string "cpu" + .byte 0x1 + .2byte 0x1b1 + .4byte 0xa3 + .4byte .LLST42 + .uleb128 0x44 + .4byte .LASF375 + .byte 0x1 + .2byte 0x1b3 + .4byte 0x1844 + .4byte .LLST43 + .uleb128 0x45 + .string "i" + .byte 0x1 + .2byte 0x1b4 + .4byte 0x54 + .4byte .LLST44 + .uleb128 0x46 + .4byte 0x1976 + .8byte .LBB98 + .4byte .Ldebug_ranges0+0x160 + .byte 0x1 + .2byte 0x1b8 + .uleb128 0x36 + .4byte 0x19aa + .4byte .LLST45 + .uleb128 0x36 + .4byte 0x199e + .4byte .LLST46 + .uleb128 0x36 + .4byte 0x1993 + .4byte .LLST47 + .uleb128 0x36 + .4byte 0x1987 + .4byte .LLST48 + .uleb128 0x33 + .4byte .Ldebug_ranges0+0x160 + .uleb128 0x38 + .4byte 0x19b6 + .uleb128 0x38 + .4byte 0x19c2 + .uleb128 0x35 + .4byte 0x19ce + .4byte .LLST49 + .uleb128 0x35 + .4byte 0x19da + .4byte .LLST50 + .uleb128 0x32 + .4byte 0x1ef0 + .8byte .LBB100 + .4byte .Ldebug_ranges0+0x190 + .byte 0x1 + .2byte 0x179 + .4byte 0x1827 + .uleb128 0x47 + .4byte 0x1f00 + .byte 0 + .uleb128 0x2f + .8byte .LVL108 + .4byte 0x2014 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x87 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x120e + .uleb128 0x31 + .4byte .LASF386 + .byte 0x1 + .2byte 0x1a3 + .8byte .LFB234 + .8byte .LFE234-.LFB234 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1976 + .uleb128 0x2e + .string "cid" + .byte 0x1 + .2byte 0x1a3 + .4byte 0xa3 + .4byte .LLST31 + .uleb128 0x2e + .string "tid" + .byte 0x1 + .2byte 0x1a3 + .4byte 0xa3 + .4byte .LLST32 + .uleb128 0x44 + .4byte .LASF375 + .byte 0x1 + .2byte 0x1a5 + .4byte 0x1844 + .4byte .LLST33 + .uleb128 0x45 + .string "i" + .byte 0x1 + .2byte 0x1a6 + .4byte 0x54 + .4byte .LLST34 + .uleb128 0x32 + .4byte 0x1ef0 + .8byte .LBB86 + .4byte .Ldebug_ranges0+0x130 + .byte 0x1 + .2byte 0x1a8 + .4byte 0x18c8 + .uleb128 0x36 + .4byte 0x1f00 + .4byte .LLST35 + .byte 0 + .uleb128 0x48 + .4byte 0x1976 + .8byte .LBB90 + .8byte .LBE90-.LBB90 + .byte 0x1 + .2byte 0x1ad + .uleb128 0x36 + .4byte 0x19aa + .4byte .LLST36 + .uleb128 0x36 + .4byte 0x199e + .4byte .LLST37 + .uleb128 0x36 + .4byte 0x1993 + .4byte .LLST38 + .uleb128 0x36 + .4byte 0x1987 + .4byte .LLST39 + .uleb128 0x49 + .8byte .LBB91 + .8byte .LBE91-.LBB91 + .uleb128 0x38 + .4byte 0x19b6 + .uleb128 0x38 + .4byte 0x19c2 + .uleb128 0x35 + .4byte 0x19ce + .4byte .LLST40 + .uleb128 0x35 + .4byte 0x19da + .4byte .LLST41 + .uleb128 0x3b + .4byte 0x1ef0 + .8byte .LBB92 + .8byte .LBE92-.LBB92 + .byte 0x1 + .2byte 0x179 + .4byte 0x1953 + .uleb128 0x47 + .4byte 0x1f00 + .byte 0 + .uleb128 0x2f + .8byte .LVL97 + .4byte 0x2014 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x87 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4a + .4byte .LASF391 + .byte 0x1 + .2byte 0x172 + .4byte 0x54 + .byte 0x1 + .4byte 0x19e7 + .uleb128 0x4b + .string "cid" + .byte 0x1 + .2byte 0x172 + .4byte 0xa3 + .uleb128 0x4b + .string "id" + .byte 0x1 + .2byte 0x172 + .4byte 0x94 + .uleb128 0x4b + .string "tid" + .byte 0x1 + .2byte 0x172 + .4byte 0xa3 + .uleb128 0x4c + .4byte .LASF372 + .byte 0x1 + .2byte 0x172 + .4byte 0xa3 + .uleb128 0x3f + .4byte .LASF387 + .byte 0x1 + .2byte 0x174 + .4byte 0x8d + .uleb128 0x3f + .4byte .LASF388 + .byte 0x1 + .2byte 0x175 + .4byte 0x54 + .uleb128 0x40 + .string "ret" + .byte 0x1 + .2byte 0x176 + .4byte 0x54 + .uleb128 0x40 + .string "run" + .byte 0x1 + .2byte 0x177 + .4byte 0x54 + .byte 0 + .uleb128 0x2d + .4byte .LASF390 + .byte 0x1 + .2byte 0x16d + .4byte 0x54 + .8byte .LFB232 + .8byte .LFE232-.LFB232 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1aca + .uleb128 0x2e + .string "tid" + .byte 0x1 + .2byte 0x16d + .4byte 0xa3 + .4byte .LLST28 + .uleb128 0x46 + .4byte 0x1aca + .8byte .LBB74 + .4byte .Ldebug_ranges0+0x100 + .byte 0x1 + .2byte 0x16f + .uleb128 0x4d + .4byte 0x1ae7 + .byte 0 + .uleb128 0x36 + .4byte 0x1adb + .4byte .LLST29 + .uleb128 0x33 + .4byte .Ldebug_ranges0+0x100 + .uleb128 0x38 + .4byte 0x1af3 + .uleb128 0x3b + .4byte 0x1fd7 + .8byte .LBB76 + .8byte .LBE76-.LBB76 + .byte 0x1 + .2byte 0x164 + .4byte 0x1a9a + .uleb128 0x36 + .4byte 0x1fe3 + .4byte .LLST30 + .uleb128 0x39 + .8byte .LVL84 + .4byte 0x2300 + .4byte 0x1a84 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xa + .2byte 0x3e8 + .byte 0 + .uleb128 0x2f + .8byte .LVL85 + .4byte 0x2300 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xa + .2byte 0x3e8 + .byte 0 + .byte 0 + .uleb128 0x39 + .8byte .LVL82 + .4byte 0x1ccc + .4byte 0x1ab2 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x3c + .8byte .LVL87 + .4byte 0x1ccc + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x4a + .4byte .LASF392 + .byte 0x1 + .2byte 0x15f + .4byte 0x54 + .byte 0x1 + .4byte 0x1afe + .uleb128 0x4b + .string "tid" + .byte 0x1 + .2byte 0x15f + .4byte 0xa3 + .uleb128 0x4c + .4byte .LASF393 + .byte 0x1 + .2byte 0x15f + .4byte 0xa3 + .uleb128 0x40 + .string "i" + .byte 0x1 + .2byte 0x161 + .4byte 0xa3 + .byte 0 + .uleb128 0x4a + .4byte .LASF394 + .byte 0x1 + .2byte 0x138 + .4byte 0x54 + .byte 0x1 + .4byte 0x1b6d + .uleb128 0x4b + .string "cid" + .byte 0x1 + .2byte 0x138 + .4byte 0xa3 + .uleb128 0x4b + .string "tid" + .byte 0x1 + .2byte 0x138 + .4byte 0xa3 + .uleb128 0x4c + .4byte .LASF372 + .byte 0x1 + .2byte 0x138 + .4byte 0xa3 + .uleb128 0x3f + .4byte .LASF388 + .byte 0x1 + .2byte 0x13a + .4byte 0x54 + .uleb128 0x40 + .string "us" + .byte 0x1 + .2byte 0x13b + .4byte 0x54 + .uleb128 0x40 + .string "i" + .byte 0x1 + .2byte 0x13c + .4byte 0x54 + .uleb128 0x3f + .4byte .LASF395 + .byte 0x1 + .2byte 0x13c + .4byte 0x54 + .uleb128 0x3f + .4byte .LASF396 + .byte 0x1 + .2byte 0x13d + .4byte 0x54 + .byte 0 + .uleb128 0x31 + .4byte .LASF397 + .byte 0x1 + .2byte 0x121 + .8byte .LFB229 + .8byte .LFE229-.LFB229 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1ccc + .uleb128 0x44 + .4byte .LASF375 + .byte 0x1 + .2byte 0x123 + .4byte 0x1844 + .4byte .LLST8 + .uleb128 0x45 + .string "cid" + .byte 0x1 + .2byte 0x124 + .4byte 0x54 + .4byte .LLST9 + .uleb128 0x45 + .string "i" + .byte 0x1 + .2byte 0x124 + .4byte 0x54 + .4byte .LLST10 + .uleb128 0x39 + .8byte .LVL24 + .4byte 0x22de + .4byte 0x1bd8 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC1 + .byte 0 + .uleb128 0x39 + .8byte .LVL27 + .4byte 0x22de + .4byte 0x1bf6 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .uleb128 0x39 + .8byte .LVL28 + .4byte 0x22de + .4byte 0x1c15 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC3 + .byte 0 + .uleb128 0x39 + .8byte .LVL29 + .4byte 0x22de + .4byte 0x1c34 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC4 + .byte 0 + .uleb128 0x39 + .8byte .LVL30 + .4byte 0x22de + .4byte 0x1c53 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC5 + .byte 0 + .uleb128 0x39 + .8byte .LVL31 + .4byte 0x22de + .4byte 0x1c72 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC6 + .byte 0 + .uleb128 0x39 + .8byte .LVL32 + .4byte 0x22de + .4byte 0x1c91 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC7 + .byte 0 + .uleb128 0x39 + .8byte .LVL33 + .4byte 0x22de + .4byte 0x1cb0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC8 + .byte 0 + .uleb128 0x2f + .8byte .LVL34 + .4byte 0x22de + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC9 + .byte 0 + .byte 0 + .uleb128 0x2d + .4byte .LASF398 + .byte 0x1 + .2byte 0x104 + .4byte 0x54 + .8byte .LFB228 + .8byte .LFE228-.LFB228 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1d65 + .uleb128 0x2e + .string "tid" + .byte 0x1 + .2byte 0x104 + .4byte 0xa3 + .4byte .LLST5 + .uleb128 0x40 + .string "cid" + .byte 0x1 + .2byte 0x106 + .4byte 0x54 + .uleb128 0x45 + .string "i" + .byte 0x1 + .2byte 0x106 + .4byte 0x54 + .4byte .LLST6 + .uleb128 0x45 + .string "ptr" + .byte 0x1 + .2byte 0x107 + .4byte 0x1d65 + .4byte .LLST7 + .uleb128 0x3b + .4byte 0x1ef0 + .8byte .LBB36 + .8byte .LBE36-.LBB36 + .byte 0x1 + .2byte 0x109 + .4byte 0x1d4a + .uleb128 0x47 + .4byte 0x1f00 + .byte 0 + .uleb128 0x2f + .8byte .LVL21 + .4byte 0x2353 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0xa3 + .uleb128 0x4e + .4byte .LASF431 + .byte 0x1 + .byte 0xe2 + .4byte 0x54 + .8byte .LFB227 + .8byte .LFE227-.LFB227 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1e38 + .uleb128 0x4f + .string "cid" + .byte 0x1 + .byte 0xe2 + .4byte 0xa3 + .4byte .LLST0 + .uleb128 0x4f + .string "tid" + .byte 0x1 + .byte 0xe2 + .4byte 0xa3 + .4byte .LLST1 + .uleb128 0x4f + .string "st" + .byte 0x1 + .byte 0xe2 + .4byte 0xa3 + .4byte .LLST2 + .uleb128 0x50 + .4byte .LASF31 + .byte 0x1 + .byte 0xe4 + .4byte 0xef + .uleb128 0x2c + .string "ptr" + .byte 0x1 + .byte 0xe5 + .4byte 0x1d65 + .uleb128 0x2c + .string "id" + .byte 0x1 + .byte 0xe6 + .4byte 0x54 + .uleb128 0x51 + .4byte 0x1ef0 + .8byte .LBB30 + .8byte .LBE30-.LBB30 + .byte 0x1 + .byte 0xe8 + .4byte 0x1df9 + .uleb128 0x47 + .4byte 0x1f00 + .byte 0 + .uleb128 0x52 + .4byte 0x1e85 + .8byte .LBB32 + .4byte .Ldebug_ranges0+0 + .byte 0x1 + .byte 0xeb + .4byte 0x1e2a + .uleb128 0x47 + .4byte 0x1ea0 + .uleb128 0x47 + .4byte 0x1e95 + .uleb128 0x33 + .4byte .Ldebug_ranges0+0 + .uleb128 0x35 + .4byte 0x1eab + .4byte .LLST3 + .byte 0 + .byte 0 + .uleb128 0x3a + .8byte .LVL8 + .4byte 0x235f + .byte 0 + .uleb128 0x53 + .4byte .LASF399 + .byte 0x1 + .byte 0xcf + .4byte 0x54 + .byte 0x1 + .4byte 0x1e7f + .uleb128 0x54 + .string "cid" + .byte 0x1 + .byte 0xcf + .4byte 0xa3 + .uleb128 0x54 + .string "tid" + .byte 0x1 + .byte 0xcf + .4byte 0xa3 + .uleb128 0x54 + .string "ret" + .byte 0x1 + .byte 0xcf + .4byte 0xa3 + .uleb128 0x2c + .string "ptr" + .byte 0x1 + .byte 0xd1 + .4byte 0x1e7f + .uleb128 0x2c + .string "id" + .byte 0x1 + .byte 0xd2 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x54 + .uleb128 0x53 + .4byte .LASF400 + .byte 0x1 + .byte 0xc3 + .4byte 0x54 + .byte 0x1 + .4byte 0x1eb5 + .uleb128 0x54 + .string "cid" + .byte 0x1 + .byte 0xc3 + .4byte 0xa3 + .uleb128 0x54 + .string "tid" + .byte 0x1 + .byte 0xc3 + .4byte 0xa3 + .uleb128 0x2c + .string "i" + .byte 0x1 + .byte 0xc5 + .4byte 0x54 + .byte 0 + .uleb128 0x53 + .4byte .LASF401 + .byte 0x1 + .byte 0x9d + .4byte 0x54 + .byte 0x1 + .4byte 0x1ef0 + .uleb128 0x55 + .4byte .LASF383 + .byte 0x1 + .byte 0x9d + .4byte 0x130d + .uleb128 0x2c + .string "cid" + .byte 0x1 + .byte 0x9f + .4byte 0xa3 + .uleb128 0x2c + .string "tid" + .byte 0x1 + .byte 0xa0 + .4byte 0xa3 + .uleb128 0x2c + .string "i" + .byte 0x1 + .byte 0xa1 + .4byte 0x94 + .byte 0 + .uleb128 0x53 + .4byte .LASF402 + .byte 0x1 + .byte 0x90 + .4byte 0x54 + .byte 0x3 + .4byte 0x1f0c + .uleb128 0x54 + .string "tid" + .byte 0x1 + .byte 0x90 + .4byte 0xa3 + .byte 0 + .uleb128 0x56 + .4byte .LASF411 + .byte 0x1 + .byte 0x86 + .byte 0x3 + .uleb128 0x57 + .4byte .LASF404 + .byte 0x1 + .byte 0x81 + .byte 0x3 + .4byte 0x1f2c + .uleb128 0x54 + .string "ptr" + .byte 0x1 + .byte 0x81 + .4byte 0x10b + .byte 0 + .uleb128 0x58 + .4byte .LASF432 + .byte 0x1 + .byte 0x34 + .4byte 0x54 + .byte 0x1 + .4byte 0x1f48 + .uleb128 0x55 + .4byte .LASF405 + .byte 0x1 + .byte 0x34 + .4byte 0x1208 + .byte 0 + .uleb128 0x59 + .4byte .LASF406 + .byte 0x1 + .byte 0x33 + .4byte 0x54 + .4byte 0x1f63 + .uleb128 0x55 + .4byte .LASF405 + .byte 0x1 + .byte 0x33 + .4byte 0x1208 + .byte 0 + .uleb128 0x59 + .4byte .LASF407 + .byte 0x1 + .byte 0x32 + .4byte 0x54 + .4byte 0x1f7e + .uleb128 0x55 + .4byte .LASF405 + .byte 0x1 + .byte 0x32 + .4byte 0x1208 + .byte 0 + .uleb128 0x59 + .4byte .LASF408 + .byte 0x1 + .byte 0x31 + .4byte 0x54 + .4byte 0x1f99 + .uleb128 0x55 + .4byte .LASF405 + .byte 0x1 + .byte 0x31 + .4byte 0x1208 + .byte 0 + .uleb128 0x59 + .4byte .LASF409 + .byte 0x1 + .byte 0x30 + .4byte 0x54 + .4byte 0x1fb4 + .uleb128 0x55 + .4byte .LASF405 + .byte 0x1 + .byte 0x30 + .4byte 0x1208 + .byte 0 + .uleb128 0x59 + .4byte .LASF410 + .byte 0x1 + .byte 0x2f + .4byte 0x54 + .4byte 0x1fcf + .uleb128 0x55 + .4byte .LASF405 + .byte 0x1 + .byte 0x2f + .4byte 0x1208 + .byte 0 + .uleb128 0x56 + .4byte .LASF412 + .byte 0x3 + .byte 0xbf + .byte 0x3 + .uleb128 0x57 + .4byte .LASF413 + .byte 0x2 + .byte 0xd + .byte 0x3 + .4byte 0x1fef + .uleb128 0x55 + .4byte .LASF414 + .byte 0x2 + .byte 0xd + .4byte 0x3b + .byte 0 + .uleb128 0x5a + .4byte 0x1f2c + .8byte .LFB220 + .8byte .LFE220-.LFB220 + .uleb128 0x1 + .byte 0x9c + .4byte 0x2014 + .uleb128 0x36 + .4byte 0x1f3c + .4byte .LLST4 + .byte 0 + .uleb128 0x5b + .4byte 0x1976 + .8byte .LFB242 + .8byte .LFE242-.LFB242 + .uleb128 0x1 + .byte 0x9c + .4byte 0x22d5 + .uleb128 0x36 + .4byte 0x1987 + .4byte .LLST11 + .uleb128 0x36 + .4byte 0x1993 + .4byte .LLST12 + .uleb128 0x36 + .4byte 0x199e + .4byte .LLST13 + .uleb128 0x36 + .4byte 0x19aa + .4byte .LLST14 + .uleb128 0x35 + .4byte 0x19b6 + .4byte .LLST15 + .uleb128 0x38 + .4byte 0x19c2 + .uleb128 0x35 + .4byte 0x19ce + .4byte .LLST16 + .uleb128 0x35 + .4byte 0x19da + .4byte .LLST17 + .uleb128 0x32 + .4byte 0x1afe + .8byte .LBB48 + .4byte .Ldebug_ranges0+0x30 + .byte 0x1 + .2byte 0x17f + .4byte 0x2128 + .uleb128 0x36 + .4byte 0x1b0f + .4byte .LLST18 + .uleb128 0x36 + .4byte 0x1b1b + .4byte .LLST19 + .uleb128 0x36 + .4byte 0x1b27 + .4byte .LLST20 + .uleb128 0x33 + .4byte .Ldebug_ranges0+0x30 + .uleb128 0x35 + .4byte 0x1b33 + .4byte .LLST21 + .uleb128 0x5c + .4byte 0x1b3f + .byte 0x64 + .uleb128 0x38 + .4byte 0x1b4a + .uleb128 0x35 + .4byte 0x1b54 + .4byte .LLST22 + .uleb128 0x35 + .4byte 0x1b60 + .4byte .LLST23 + .uleb128 0x39 + .8byte .LVL41 + .4byte 0x1ccc + .4byte 0x20e9 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .uleb128 0x39 + .8byte .LVL42 + .4byte 0x1ccc + .4byte 0x2101 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .uleb128 0x39 + .8byte .LVL51 + .4byte 0x2300 + .4byte 0x2119 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8 + .byte 0x64 + .byte 0 + .uleb128 0x3a + .8byte .LVL54 + .4byte 0x1b6d + .byte 0 + .byte 0 + .uleb128 0x32 + .4byte 0x1e38 + .8byte .LBB52 + .4byte .Ldebug_ranges0+0x60 + .byte 0x1 + .2byte 0x19e + .4byte 0x21cb + .uleb128 0x36 + .4byte 0x1e5e + .4byte .LLST24 + .uleb128 0x36 + .4byte 0x1e53 + .4byte .LLST25 + .uleb128 0x36 + .4byte 0x1e48 + .4byte .LLST26 + .uleb128 0x33 + .4byte .Ldebug_ranges0+0x60 + .uleb128 0x38 + .4byte 0x1e69 + .uleb128 0x38 + .4byte 0x1e74 + .uleb128 0x51 + .4byte 0x1ef0 + .8byte .LBB54 + .8byte .LBE54-.LBB54 + .byte 0x1 + .byte 0xd4 + .4byte 0x218b + .uleb128 0x47 + .4byte 0x1f00 + .byte 0 + .uleb128 0x52 + .4byte 0x1e85 + .8byte .LBB56 + .4byte .Ldebug_ranges0+0xd0 + .byte 0x1 + .byte 0xd7 + .4byte 0x21bc + .uleb128 0x47 + .4byte 0x1ea0 + .uleb128 0x47 + .4byte 0x1e95 + .uleb128 0x33 + .4byte .Ldebug_ranges0+0xd0 + .uleb128 0x35 + .4byte 0x1eab + .4byte .LLST27 + .byte 0 + .byte 0 + .uleb128 0x5d + .8byte .LVL79 + .4byte 0x235f + .byte 0 + .byte 0 + .uleb128 0x39 + .8byte .LVL48 + .4byte 0x22de + .4byte 0x21f6 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC11 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x39 + .8byte .LVL49 + .4byte 0x1d6b + .4byte 0x221d + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x5 + .byte 0xc + .4byte 0x55555555 + .byte 0 + .uleb128 0x39 + .8byte .LVL57 + .4byte 0x22de + .4byte 0x2248 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC12 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x3a + .8byte .LVL58 + .4byte 0x236b + .uleb128 0x39 + .8byte .LVL61 + .4byte 0x1d6b + .4byte 0x227c + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x5 + .byte 0xc + .4byte 0x11111111 + .byte 0 + .uleb128 0x39 + .8byte .LVL65 + .4byte 0x1d6b + .4byte 0x229a + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x3a + .8byte .LVL66 + .4byte 0x236b + .uleb128 0x2f + .8byte .LVL68 + .4byte 0x22de + .uleb128 0x30 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC10 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x30 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .byte 0 + .uleb128 0x5e + .4byte .LASF433 + .4byte .LASF433 + .uleb128 0x5f + .4byte .LASF415 + .4byte .LASF415 + .byte 0x1d + .byte 0x13 + .uleb128 0x5f + .4byte .LASF416 + .4byte .LASF416 + .byte 0x8 + .byte 0x66 + .uleb128 0x60 + .4byte .LASF417 + .4byte .LASF417 + .byte 0x4 + .2byte 0x260 + .uleb128 0x5f + .4byte .LASF418 + .4byte .LASF418 + .byte 0x2 + .byte 0xb + .uleb128 0x60 + .4byte .LASF419 + .4byte .LASF419 + .byte 0x4 + .2byte 0x1f3 + .uleb128 0x60 + .4byte .LASF420 + .4byte .LASF420 + .byte 0x4 + .2byte 0x248 + .uleb128 0x60 + .4byte .LASF421 + .4byte .LASF421 + .byte 0x4 + .2byte 0x1f1 + .uleb128 0x60 + .4byte .LASF422 + .4byte .LASF422 + .byte 0x4 + .2byte 0x264 + .uleb128 0x60 + .4byte .LASF423 + .4byte .LASF423 + .byte 0x4 + .2byte 0x1f4 + .uleb128 0x60 + .4byte .LASF424 + .4byte .LASF424 + .byte 0x4 + .2byte 0x263 + .uleb128 0x60 + .4byte .LASF425 + .4byte .LASF425 + .byte 0x4 + .2byte 0x262 + .uleb128 0x60 + .4byte .LASF426 + .4byte .LASF426 + .byte 0x4 + .2byte 0x261 + .uleb128 0x60 + .4byte .LASF427 + .4byte .LASF427 + .byte 0x4 + .2byte 0x276 + .byte 0 + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 + .uleb128 0x11 + .byte 0x1 + .uleb128 0x25 + .uleb128 0xe + .uleb128 0x13 + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1b + .uleb128 0xe + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x10 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x2 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x4 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x5 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0 + .byte 0 + .uleb128 0x6 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x7 + .uleb128 0x26 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x8 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x9 + .uleb128 0x35 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xa + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0xb + .uleb128 0x1 + .byte 0x1 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xc + .uleb128 0x21 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0xd + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0xe + .uleb128 0x13 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0xf + .uleb128 0x26 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x10 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x11 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x12 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x13 + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x14 + .uleb128 0x5 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x15 + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x16 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x17 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x18 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x19 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1a + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x1b + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x1d + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1e + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1f + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x20 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x21 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x22 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x23 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x24 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x25 + .uleb128 0x4 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x26 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x27 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x28 + .uleb128 0x4 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x29 + .uleb128 0x4 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2a + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x2b + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x2c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2d + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2e + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x2f + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x30 + .uleb128 0x410a + .byte 0 + .uleb128 0x2 + .uleb128 0x18 + .uleb128 0x2111 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x31 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x32 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x52 + .uleb128 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x33 + .uleb128 0xb + .byte 0x1 + .uleb128 0x55 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x34 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x35 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x36 + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x37 + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x38 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x39 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3a + .uleb128 0x4109 + .byte 0 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3b + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3c + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x2115 + .uleb128 0x19 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3d + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x3e + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3f + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x40 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x41 + .uleb128 0xb + .byte 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x42 + .uleb128 0xb + .byte 0x1 + .byte 0 + .byte 0 + .uleb128 0x43 + .uleb128 0x1d + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x44 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x45 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x46 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x52 + .uleb128 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x47 + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x48 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x49 + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .byte 0 + .byte 0 + .uleb128 0x4a + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4b + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4c + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4d + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x4e + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4f + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x50 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x51 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x52 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x52 + .uleb128 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x53 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x54 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x55 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x56 + .uleb128 0x2e + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x57 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x58 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x59 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5a + .uleb128 0x2e + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5b + .uleb128 0x2e + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2116 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5c + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x5d + .uleb128 0x4109 + .byte 0 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x2115 + .uleb128 0x19 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x5e + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x5f + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x60 + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LLST61: + .8byte .LVL151 + .8byte .LVL152 + .2byte 0x1 + .byte 0x50 + .8byte .LVL152 + .8byte .LVL154 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL154 + .8byte .LVL155 + .2byte 0x1 + .byte 0x50 + .8byte .LVL155 + .8byte .LFE240 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST53: + .8byte .LVL126 + .8byte .LVL127 + .2byte 0x1 + .byte 0x50 + .8byte .LVL127 + .8byte .LVL143 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL143 + .8byte .LVL144 + .2byte 0x1 + .byte 0x50 + .8byte .LVL144 + .8byte .LVL148 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL148 + .8byte .LVL149 + .2byte 0x1 + .byte 0x50 + .8byte .LVL149 + .8byte .LFE239 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST54: + .8byte .LVL131 + .8byte .LVL132 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST55: + .8byte .LVL136 + .8byte .LVL137 + .2byte 0x7 + .byte 0x93 + .uleb128 0x4 + .byte 0x53 + .byte 0x93 + .uleb128 0x4 + .byte 0x93 + .uleb128 0x10 + .8byte .LVL137 + .8byte .LVL141 + .2byte 0xe + .byte 0x93 + .uleb128 0x4 + .byte 0x53 + .byte 0x93 + .uleb128 0x4 + .byte 0x5d + .byte 0x93 + .uleb128 0x8 + .byte 0x5c + .byte 0x93 + .uleb128 0x4 + .byte 0x5b + .byte 0x93 + .uleb128 0x4 + .8byte .LVL141 + .8byte .LVL142 + .2byte 0xf + .byte 0x93 + .uleb128 0x4 + .byte 0x71 + .sleb128 20 + .byte 0x93 + .uleb128 0x4 + .byte 0x5d + .byte 0x93 + .uleb128 0x8 + .byte 0x5c + .byte 0x93 + .uleb128 0x4 + .byte 0x5b + .byte 0x93 + .uleb128 0x4 + .8byte .LVL142 + .8byte .LVL143 + .2byte 0xb + .byte 0x93 + .uleb128 0x8 + .byte 0x5d + .byte 0x93 + .uleb128 0x8 + .byte 0x5c + .byte 0x93 + .uleb128 0x4 + .byte 0x5b + .byte 0x93 + .uleb128 0x4 + .8byte 0 + .8byte 0 +.LLST56: + .8byte .LVL137 + .8byte .LVL139 + .2byte 0x1 + .byte 0x51 + .8byte .LVL139 + .8byte .LVL140 + .2byte 0x2 + .byte 0x70 + .sleb128 0 + .8byte 0 + .8byte 0 +.LLST57: + .8byte .LVL137 + .8byte .LVL141 + .2byte 0x1 + .byte 0x53 + .8byte .LVL141 + .8byte .LVL142 + .2byte 0x2 + .byte 0x71 + .sleb128 20 + .8byte 0 + .8byte 0 +.LLST58: + .8byte .LVL138 + .8byte .LVL139 + .2byte 0x11 + .byte 0x71 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200148 + .8byte .LVL139 + .8byte .LVL140 + .2byte 0x13 + .byte 0x70 + .sleb128 0 + .byte 0x94 + .byte 0x4 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200148 + .8byte 0 + .8byte 0 +.LLST59: + .8byte .LVL134 + .8byte .LVL135 + .2byte 0x6 + .byte 0x9e + .uleb128 0x4 + .4byte 0xdeadbeaf + .8byte 0 + .8byte 0 +.LLST60: + .8byte .LVL147 + .8byte .LVL148 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST51: + .8byte .LVL110 + .8byte .LVL111 + .2byte 0x1 + .byte 0x50 + .8byte .LVL111 + .8byte .LFE236 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST52: + .8byte .LVL112 + .8byte .LVL113 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST42: + .8byte .LVL99 + .8byte .LVL100 + .2byte 0x1 + .byte 0x50 + .8byte .LVL100 + .8byte .LVL102 + .2byte 0x1 + .byte 0x66 + .8byte .LVL102 + .8byte .LVL105 + .2byte 0x1 + .byte 0x67 + .8byte .LVL105 + .8byte .LFE235 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST43: + .8byte .LVL101 + .8byte .LVL102 + .2byte 0x12 + .byte 0x86 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL102 + .8byte .LVL105 + .2byte 0x12 + .byte 0x87 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL105 + .8byte .LVL106 + .2byte 0x13 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL106 + .8byte .LFE235 + .2byte 0x12 + .byte 0x87 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST44: + .8byte .LVL101 + .8byte .LVL103 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL103 + .8byte .LVL104 + .2byte 0x1 + .byte 0x65 + .8byte .LVL106 + .8byte .LFE235 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST45: + .8byte .LVL107 + .8byte .LVL108-1 + .2byte 0x2 + .byte 0x83 + .sleb128 16 + .8byte 0 + .8byte 0 +.LLST46: + .8byte .LVL107 + .8byte .LVL108-1 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST47: + .8byte .LVL107 + .8byte .LVL108 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST48: + .8byte .LVL107 + .8byte .LVL108 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST49: + .8byte .LVL107 + .8byte .LVL108 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST50: + .8byte .LVL107 + .8byte .LVL108 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST31: + .8byte .LVL88 + .8byte .LVL91 + .2byte 0x1 + .byte 0x50 + .8byte .LVL91 + .8byte .LVL92 + .2byte 0x1 + .byte 0x69 + .8byte .LVL92 + .8byte .LVL94 + .2byte 0x1 + .byte 0x66 + .8byte .LVL94 + .8byte .LFE234 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST32: + .8byte .LVL88 + .8byte .LVL93 + .2byte 0x1 + .byte 0x51 + .8byte .LVL93 + .8byte .LVL94 + .2byte 0x1 + .byte 0x65 + .8byte .LVL94 + .8byte .LVL95 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL95 + .8byte .LFE234 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST33: + .8byte .LVL88 + .8byte .LVL90 + .2byte 0x12 + .byte 0x70 + .sleb128 0 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL90 + .8byte .LVL92 + .2byte 0xc + .byte 0x89 + .sleb128 0 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL92 + .8byte .LVL94 + .2byte 0xc + .byte 0x86 + .sleb128 0 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL94 + .8byte .LVL95 + .2byte 0x13 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0xc + .4byte 0xffffffff + .byte 0x1a + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL95 + .8byte .LFE234 + .2byte 0xc + .byte 0x86 + .sleb128 0 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST34: + .8byte .LVL93 + .8byte .LVL94 + .2byte 0x1 + .byte 0x67 + .8byte .LVL95 + .8byte .LFE234 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST35: + .8byte .LVL88 + .8byte .LVL89 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST36: + .8byte .LVL96 + .8byte .LVL97-1 + .2byte 0x2 + .byte 0x83 + .sleb128 16 + .8byte 0 + .8byte 0 +.LLST37: + .8byte .LVL96 + .8byte .LVL97 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST38: + .8byte .LVL96 + .8byte .LVL97 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST39: + .8byte .LVL96 + .8byte .LVL97 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST40: + .8byte .LVL96 + .8byte .LVL97 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST41: + .8byte .LVL96 + .8byte .LVL97 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST28: + .8byte .LVL80 + .8byte .LVL81 + .2byte 0x1 + .byte 0x50 + .8byte .LVL81 + .8byte .LVL86 + .2byte 0x1 + .byte 0x63 + .8byte .LVL86 + .8byte .LVL87-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL87-1 + .8byte .LFE232 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST29: + .8byte .LVL81 + .8byte .LVL86 + .2byte 0x1 + .byte 0x63 + .8byte .LVL86 + .8byte .LVL87-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL87-1 + .8byte .LFE232 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST30: + .8byte .LVL83 + .8byte .LVL84 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte .LVL84 + .8byte .LVL85 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST8: + .8byte .LVL25 + .8byte .LVL26 + .2byte 0x1e + .byte 0x86 + .sleb128 0 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0x8 + .byte 0x28 + .byte 0x1e + .byte 0x85 + .sleb128 0 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x22 + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte .LVL26 + .8byte .LVL34 + .2byte 0x1e + .byte 0x86 + .sleb128 -1 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0x8 + .byte 0x28 + .byte 0x1e + .byte 0x85 + .sleb128 0 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0xa + .2byte 0x148 + .byte 0x1e + .byte 0x22 + .byte 0x23 + .uleb128 0x8200008 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST9: + .8byte .LVL24 + .8byte .LVL36 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST10: + .8byte .LVL25 + .8byte .LVL26 + .2byte 0x1 + .byte 0x66 + .8byte .LVL26 + .8byte .LVL34 + .2byte 0x3 + .byte 0x86 + .sleb128 -1 + .byte 0x9f + .8byte .LVL34 + .8byte .LVL36 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST5: + .8byte .LVL11 + .8byte .LVL12 + .2byte 0x1 + .byte 0x50 + .8byte .LVL12 + .8byte .LVL17 + .2byte 0x1 + .byte 0x63 + .8byte .LVL17 + .8byte .LVL19 + .2byte 0x5 + .byte 0x8b + .sleb128 65536 + .byte 0x9f + .8byte .LVL19 + .8byte .LVL20 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL20 + .8byte .LVL22 + .2byte 0x1 + .byte 0x63 + .8byte .LVL22 + .8byte .LVL23 + .2byte 0x1 + .byte 0x50 + .8byte .LVL23 + .8byte .LFE228 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST6: + .8byte .LVL13 + .8byte .LVL18 + .2byte 0x1 + .byte 0x67 + .8byte .LVL20 + .8byte .LVL22 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST7: + .8byte .LVL20 + .8byte .LVL22 + .2byte 0x3 + .byte 0x84 + .sleb128 -4 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST0: + .8byte .LVL0 + .8byte .LVL1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL1 + .8byte .LVL3 + .2byte 0x1 + .byte 0x55 + .8byte .LVL3 + .8byte .LFE227 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST1: + .8byte .LVL0 + .8byte .LVL7 + .2byte 0x1 + .byte 0x51 + .8byte .LVL7 + .8byte .LFE227 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST2: + .8byte .LVL0 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL8-1 + .8byte .LFE227 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST3: + .8byte .LVL2 + .8byte .LVL3 + .2byte 0x1 + .byte 0x53 + .8byte .LVL4 + .8byte .LVL6 + .2byte 0x1 + .byte 0x53 + .8byte 0 + .8byte 0 +.LLST4: + .8byte .LVL9 + .8byte .LVL10 + .2byte 0x1 + .byte 0x50 + .8byte .LVL10 + .8byte .LFE220 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST11: + .8byte .LVL37 + .8byte .LVL39 + .2byte 0x1 + .byte 0x50 + .8byte .LVL39 + .8byte .LVL69 + .2byte 0x1 + .byte 0x63 + .8byte .LVL69 + .8byte .LVL71 + .2byte 0x1 + .byte 0x53 + .8byte .LVL71 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST12: + .8byte .LVL37 + .8byte .LVL39 + .2byte 0x1 + .byte 0x51 + .8byte .LVL39 + .8byte .LVL67 + .2byte 0x1 + .byte 0x66 + .8byte .LVL67 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST13: + .8byte .LVL37 + .8byte .LVL39 + .2byte 0x1 + .byte 0x52 + .8byte .LVL39 + .8byte .LVL72 + .2byte 0x1 + .byte 0x64 + .8byte .LVL72 + .8byte .LVL74 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte .LVL74 + .8byte .LVL77 + .2byte 0x1 + .byte 0x64 + .8byte .LVL77 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST14: + .8byte .LVL37 + .8byte .LVL39 + .2byte 0x1 + .byte 0x53 + .8byte .LVL39 + .8byte .LVL47 + .2byte 0x1 + .byte 0x69 + .8byte .LVL47 + .8byte .LVL50 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL50 + .8byte .LVL55 + .2byte 0x1 + .byte 0x69 + .8byte .LVL55 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST15: + .8byte .LVL59 + .8byte .LVL60 + .2byte 0x1 + .byte 0x50 + .8byte .LVL60 + .8byte .LVL68 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST16: + .8byte .LVL63 + .8byte .LVL64 + .2byte 0x1 + .byte 0x50 + .8byte .LVL64 + .8byte .LVL73 + .2byte 0x1 + .byte 0x65 + .8byte .LVL74 + .8byte .LVL78 + .2byte 0x1 + .byte 0x65 + .8byte .LVL78 + .8byte .LVL79-1 + .2byte 0x2 + .byte 0x72 + .sleb128 32 + .8byte 0 + .8byte 0 +.LLST17: + .8byte .LVL46 + .8byte .LVL50 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL56 + .8byte .LVL68 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST18: + .8byte .LVL38 + .8byte .LVL39 + .2byte 0x1 + .byte 0x50 + .8byte .LVL39 + .8byte .LVL69 + .2byte 0x1 + .byte 0x63 + .8byte .LVL69 + .8byte .LVL71 + .2byte 0x1 + .byte 0x53 + .8byte .LVL71 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST19: + .8byte .LVL38 + .8byte .LVL39 + .2byte 0x1 + .byte 0x52 + .8byte .LVL39 + .8byte .LVL72 + .2byte 0x1 + .byte 0x64 + .8byte .LVL72 + .8byte .LVL74 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte .LVL74 + .8byte .LVL77 + .2byte 0x1 + .byte 0x64 + .8byte .LVL77 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST20: + .8byte .LVL38 + .8byte .LVL39 + .2byte 0x1 + .byte 0x53 + .8byte .LVL39 + .8byte .LVL45 + .2byte 0x1 + .byte 0x69 + .8byte .LVL50 + .8byte .LVL55 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST21: + .8byte .LVL38 + .8byte .LVL39 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL39 + .8byte .LVL45 + .2byte 0x1 + .byte 0x67 + .8byte .LVL50 + .8byte .LVL55 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST22: + .8byte .LVL39 + .8byte .LVL45 + .2byte 0x1 + .byte 0x65 + .8byte .LVL50 + .8byte .LVL55 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST23: + .8byte .LVL40 + .8byte .LVL43 + .2byte 0x7 + .byte 0xa + .2byte 0x4e20 + .byte 0x88 + .sleb128 0 + .byte 0x1c + .byte 0x9f + .8byte .LVL50 + .8byte .LVL51 + .2byte 0x7 + .byte 0xa + .2byte 0x4e20 + .byte 0x88 + .sleb128 0 + .byte 0x1c + .byte 0x9f + .8byte .LVL51 + .8byte .LVL52 + .2byte 0x7 + .byte 0xa + .2byte 0x4e21 + .byte 0x88 + .sleb128 0 + .byte 0x1c + .byte 0x9f + .8byte .LVL52 + .8byte .LVL53 + .2byte 0x7 + .byte 0xa + .2byte 0x4e20 + .byte 0x88 + .sleb128 0 + .byte 0x1c + .byte 0x9f + .8byte .LVL53 + .8byte .LVL55 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST24: + .8byte .LVL68 + .8byte .LVL73 + .2byte 0x1 + .byte 0x65 + .8byte .LVL74 + .8byte .LVL78 + .2byte 0x1 + .byte 0x65 + .8byte .LVL78 + .8byte .LVL79-1 + .2byte 0x2 + .byte 0x72 + .sleb128 32 + .8byte 0 + .8byte 0 +.LLST25: + .8byte .LVL68 + .8byte .LVL72 + .2byte 0x1 + .byte 0x64 + .8byte .LVL72 + .8byte .LVL74 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte .LVL74 + .8byte .LVL77 + .2byte 0x1 + .byte 0x64 + .8byte .LVL77 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST26: + .8byte .LVL68 + .8byte .LVL69 + .2byte 0x1 + .byte 0x63 + .8byte .LVL69 + .8byte .LVL71 + .2byte 0x1 + .byte 0x53 + .8byte .LVL71 + .8byte .LFE242 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST27: + .8byte .LVL70 + .8byte .LVL71 + .2byte 0x1 + .byte 0x51 + .8byte .LVL74 + .8byte .LVL76 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 + .section .debug_aranges,"",@progbits + .4byte 0xdc + .2byte 0x2 + .4byte .Ldebug_info0 + .byte 0x8 + .byte 0 + .2byte 0 + .2byte 0 + .8byte .LFB227 + .8byte .LFE227-.LFB227 + .8byte .LFB220 + .8byte .LFE220-.LFB220 + .8byte .LFB228 + .8byte .LFE228-.LFB228 + .8byte .LFB229 + .8byte .LFE229-.LFB229 + .8byte .LFB242 + .8byte .LFE242-.LFB242 + .8byte .LFB232 + .8byte .LFE232-.LFB232 + .8byte .LFB234 + .8byte .LFE234-.LFB234 + .8byte .LFB235 + .8byte .LFE235-.LFB235 + .8byte .LFB236 + .8byte .LFE236-.LFB236 + .8byte .LFB238 + .8byte .LFE238-.LFB238 + .8byte .LFB239 + .8byte .LFE239-.LFB239 + .8byte .LFB240 + .8byte .LFE240-.LFB240 + .8byte 0 + .8byte 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .8byte .LBB32 + .8byte .LBE32 + .8byte .LBB35 + .8byte .LBE35 + .8byte 0 + .8byte 0 + .8byte .LBB48 + .8byte .LBE48 + .8byte .LBB51 + .8byte .LBE51 + .8byte 0 + .8byte 0 + .8byte .LBB52 + .8byte .LBE52 + .8byte .LBB65 + .8byte .LBE65 + .8byte .LBB66 + .8byte .LBE66 + .8byte .LBB67 + .8byte .LBE67 + .8byte .LBB68 + .8byte .LBE68 + .8byte .LBB69 + .8byte .LBE69 + .8byte 0 + .8byte 0 + .8byte .LBB56 + .8byte .LBE56 + .8byte .LBB59 + .8byte .LBE59 + .8byte 0 + .8byte 0 + .8byte .LBB74 + .8byte .LBE74 + .8byte .LBB79 + .8byte .LBE79 + .8byte 0 + .8byte 0 + .8byte .LBB86 + .8byte .LBE86 + .8byte .LBB89 + .8byte .LBE89 + .8byte 0 + .8byte 0 + .8byte .LBB98 + .8byte .LBE98 + .8byte .LBB105 + .8byte .LBE105 + .8byte 0 + .8byte 0 + .8byte .LBB100 + .8byte .LBE100 + .8byte .LBB103 + .8byte .LBE103 + .8byte 0 + .8byte 0 + .8byte .LBB120 + .8byte .LBE120 + .8byte .LBB131 + .8byte .LBE131 + .8byte 0 + .8byte 0 + .8byte .LBB122 + .8byte .LBE122 + .8byte .LBB126 + .8byte .LBE126 + .8byte .LBB129 + .8byte .LBE129 + .8byte 0 + .8byte 0 + .8byte .LFB227 + .8byte .LFE227 + .8byte .LFB220 + .8byte .LFE220 + .8byte .LFB228 + .8byte .LFE228 + .8byte .LFB229 + .8byte .LFE229 + .8byte .LFB242 + .8byte .LFE242 + .8byte .LFB232 + .8byte .LFE232 + .8byte .LFB234 + .8byte .LFE234 + .8byte .LFB235 + .8byte .LFE235 + .8byte .LFB236 + .8byte .LFE236 + .8byte .LFB238 + .8byte .LFE238 + .8byte .LFB239 + .8byte .LFE239 + .8byte .LFB240 + .8byte .LFE240 + .8byte 0 + .8byte 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF83: + .string "off_mem_rsvmap" +.LASF166: + .string "UCLASS_I2C_EEPROM" +.LASF298: + .string "jt_funcs" +.LASF171: + .string "UCLASS_IRQ" +.LASF133: + .string "initrd_start" +.LASF165: + .string "UCLASS_I2C" +.LASF13: + .string "sizetype" +.LASF312: + .string "net_hostname" +.LASF36: + .string "start" +.LASF206: + .string "UCLASS_SPI" +.LASF169: + .string "UCLASS_I2S" +.LASF334: + .string "NETLOOP_RESTART" +.LASF167: + .string "UCLASS_I2C_GENERIC" +.LASF179: + .string "UCLASS_MOD_EXP" +.LASF230: + .string "UCLASS_IO_DOMAIN" +.LASF251: + .string "using_pre_serial" +.LASF200: + .string "UCLASS_RKNAND" +.LASF142: + .string "UCLASS_DEMO" +.LASF373: + .string "rip_fail" +.LASF91: + .string "ih_magic" +.LASF29: + .string "list_head" +.LASF292: + .string "pm_ctx_phys" +.LASF146: + .string "UCLASS_TEST_PROBE" +.LASF226: + .string "UCLASS_KEY" +.LASF64: + .string "bi_intfreq" +.LASF11: + .string "phys_addr_t" +.LASF221: + .string "UCLASS_VIDEO_BRIDGE" +.LASF291: + .string "video_bottom" +.LASF5: + .string "__u8" +.LASF377: + .string "task_list" +.LASF333: + .string "NETLOOP_CONTINUE" +.LASF209: + .string "UCLASS_SPI_GENERIC" +.LASF286: + .string "malloc_base" +.LASF369: + .string "tid_name" +.LASF40: + .string "flash_info_t" +.LASF184: + .string "UCLASS_PANEL" +.LASF108: + .string "comp" +.LASF103: + .string "image_header_t" +.LASF138: + .string "state" +.LASF412: + .string "disable_serror" +.LASF159: + .string "UCLASS_CROS_EC" +.LASF58: + .string "bi_dsp_freq" +.LASF105: + .string "image_start" +.LASF422: + .string "invalidate_icache_all" +.LASF420: + .string "disable_interrupts" +.LASF144: + .string "UCLASS_TEST_FDT" +.LASF49: + .string "bd_info" +.LASF331: + .string "uclass_id" +.LASF95: + .string "ih_load" +.LASF215: + .string "UCLASS_UFS" +.LASF302: + .string "__dtb_dt_spl_begin" +.LASF363: + .string "TASK_LOAD_UBOOT" +.LASF7: + .string "__u32" +.LASF149: + .string "UCLASS_PCI_EMUL" +.LASF430: + .string "/home4/cjh/uboot-nextdev-v3" +.LASF289: + .string "cur_serial_dev" +.LASF318: + .string "net_tx_packet" +.LASF225: + .string "UCLASS_FG" +.LASF317: + .string "net_server_ip" +.LASF325: + .string "net_native_vlan" +.LASF265: + .string "ram_top_ext_size" +.LASF223: + .string "UCLASS_VIDEO_CRTC" +.LASF158: + .string "UCLASS_CODEC" +.LASF283: + .string "env_buf" +.LASF20: + .string "errno" +.LASF15: + .string "long int" +.LASF53: + .string "bi_flashsize" +.LASF339: + .string "__bss_end" +.LASF189: + .string "UCLASS_PHY" +.LASF76: + .string "IRQ_STACK_START_IN" +.LASF87: + .string "size_dt_strings" +.LASF220: + .string "UCLASS_VIDEO" +.LASF356: + .string "EVT_CRYPTO" +.LASF266: + .string "relocaddr" +.LASF389: + .string "mpb_post" +.LASF429: + .string "common/mp_boot.c" +.LASF328: + .string "net_boot_file_size" +.LASF374: + .string "cpu_core" +.LASF97: + .string "ih_dcrc" +.LASF63: + .string "bi_ethspeed" +.LASF141: + .string "UCLASS_ROOT" +.LASF26: + .string "ide_bus_offset" +.LASF361: + .string "TASK_INIT_DISPLAY" +.LASF315: + .string "net_server_ethaddr" +.LASF66: + .string "bi_arch_number" +.LASF3: + .string "signed char" +.LASF172: + .string "UCLASS_KEYBOARD" +.LASF18: + .string "uint8_t" +.LASF38: + .string "udevice" +.LASF418: + .string "udelay" +.LASF99: + .string "ih_arch" +.LASF80: + .string "totalsize" +.LASF92: + .string "ih_hcrc" +.LASF268: + .string "mon_len" +.LASF107: + .string "load" +.LASF214: + .string "UCLASS_TPM" +.LASF43: + .string "lmb_property" +.LASF85: + .string "last_comp_version" +.LASF0: + .string "unsigned char" +.LASF140: + .string "images" +.LASF341: + .string "priv" +.LASF229: + .string "UCLASS_DVFS" +.LASF59: + .string "bi_ddr_freq" +.LASF403: + .string "mpb_initial" +.LASF173: + .string "UCLASS_LED" +.LASF94: + .string "ih_size" +.LASF419: + .string "dcache_enable" +.LASF203: + .string "UCLASS_SCMI_AGENT" +.LASF233: + .string "UCLASS_MDIO" +.LASF22: + .string "_Bool" +.LASF337: + .string "net_state" +.LASF168: + .string "UCLASS_I2C_MUX" +.LASF14: + .string "char" +.LASF24: + .string "_binary_u_boot_bin_start" +.LASF219: + .string "UCLASS_USB_GADGET_GENERIC" +.LASF335: + .string "NETLOOP_SUCCESS" +.LASF415: + .string "printf" +.LASF372: + .string "ptid_mask" +.LASF332: + .string "net_loop_state" +.LASF247: + .string "tlb_size" +.LASF274: + .string "dm_root_f" +.LASF157: + .string "UCLASS_AMP" +.LASF195: + .string "UCLASS_PWRSEQ" +.LASF123: + .string "fit_hdr_fdt" +.LASF326: + .string "net_restart_wrap" +.LASF314: + .string "net_ethaddr" +.LASF256: + .string "flags" +.LASF100: + .string "ih_type" +.LASF355: + .string "EVT_BOOT_SIZE" +.LASF81: + .string "off_dt_struct" +.LASF413: + .string "mdelay" +.LASF54: + .string "bi_flashoffset" +.LASF327: + .string "net_boot_file_name" +.LASF143: + .string "UCLASS_TEST" +.LASF397: + .string "mpb_task_dump" +.LASF93: + .string "ih_time" +.LASF258: + .string "bus_clk" +.LASF196: + .string "UCLASS_RAM" +.LASF162: + .string "UCLASS_ETH" +.LASF364: + .string "TASK_LOAD_FIT" +.LASF104: + .string "image_info" +.LASF110: + .string "arch" +.LASF260: + .string "mem_clk" +.LASF257: + .string "cpu_clk" +.LASF32: + .string "select_hwpart" +.LASF319: + .string "net_rx_packets" +.LASF75: + .string "_datarelro_start_ofs" +.LASF17: + .string "ulong" +.LASF371: + .string "task_fn" +.LASF96: + .string "ih_ep" +.LASF45: + .string "lmb_region" +.LASF375: + .string "task" +.LASF392: + .string "mpb_task_wait_timeout_done" +.LASF400: + .string "tid_to_task_index" +.LASF118: + .string "fit_uname_os" +.LASF60: + .string "bi_bootflags" +.LASF316: + .string "net_ip" +.LASF278: + .string "fdt_size" +.LASF310: + .string "net_dns_server" +.LASF338: + .string "__bss_start" +.LASF330: + .string "net_ping_ip" +.LASF47: + .string "memory" +.LASF78: + .string "fdt_header" +.LASF175: + .string "UCLASS_MAILBOX" +.LASF343: + .string "filename" +.LASF130: + .string "rd_end" +.LASF269: + .string "irq_sp" +.LASF135: + .string "cmdline_start" +.LASF255: + .string "global_data" +.LASF358: + .string "EVT_SIMPLE_BOOTM" +.LASF366: + .string "TASK_HASH_ANDROID" +.LASF204: + .string "UCLASS_SCSI" +.LASF217: + .string "UCLASS_USB_DEV_GENERIC" +.LASF176: + .string "UCLASS_MASS_STORAGE" +.LASF1: + .string "long unsigned int" +.LASF151: + .string "UCLASS_SIMPLE_BUS" +.LASF299: + .string "gd_t" +.LASF311: + .string "net_nis_domain" +.LASF125: + .string "fit_noffset_fdt" +.LASF342: + .string "bl_len" +.LASF427: + .string "get_ticks" +.LASF336: + .string "NETLOOP_FAIL" +.LASF224: + .string "UCLASS_WDT" +.LASF245: + .string "timer_reset_value" +.LASF270: + .string "start_addr_sp" +.LASF55: + .string "bi_sramstart" +.LASF25: + .string "_binary_u_boot_bin_end" +.LASF271: + .string "reloc_off" +.LASF86: + .string "boot_cpuid_phys" +.LASF244: + .string "lastinc" +.LASF248: + .string "tlb_fillptr" +.LASF121: + .string "fit_uname_rd" +.LASF210: + .string "UCLASS_SYSCON" +.LASF116: + .string "fit_uname_cfg" +.LASF205: + .string "UCLASS_SERIAL" +.LASF324: + .string "net_our_vlan" +.LASF294: + .string "serial" +.LASF154: + .string "UCLASS_BLK" +.LASF111: + .string "image_info_t" +.LASF150: + .string "UCLASS_USB_EMUL" +.LASF421: + .string "icache_disable" +.LASF246: + .string "tlb_addr" +.LASF188: + .string "UCLASS_PCI_GENERIC" +.LASF370: + .string "task_t" +.LASF407: + .string "spl_load_android" +.LASF387: + .string "ticks" +.LASF106: + .string "image_len" +.LASF362: + .string "TASK_LOAD_BASEPARAMETER" +.LASF61: + .string "bi_ip_addr" +.LASF393: + .string "timeout_ms" +.LASF190: + .string "UCLASS_PINCONFIG" +.LASF384: + .string "smp_entry" +.LASF212: + .string "UCLASS_THERMAL" +.LASF114: + .string "legacy_hdr_os_copy" +.LASF354: + .string "EVT_BOOT_ADDR" +.LASF9: + .string "long long int" +.LASF277: + .string "new_fdt" +.LASF21: + .string "___strtok" +.LASF329: + .string "net_boot_file_expected_size_in_blocks" +.LASF252: + .string "enable" +.LASF395: + .string "ptid" +.LASF183: + .string "UCLASS_NVME" +.LASF249: + .string "tlb_emerg" +.LASF112: + .string "bootm_headers" +.LASF37: + .string "protect" +.LASF216: + .string "UCLASS_USB" +.LASF227: + .string "UCLASS_RC" +.LASF398: + .string "mpb_task_is_done" +.LASF284: + .string "timebase_h" +.LASF285: + .string "timebase_l" +.LASF160: + .string "UCLASS_DISPLAY" +.LASF323: + .string "net_null_ethaddr" +.LASF263: + .string "env_valid" +.LASF228: + .string "UCLASS_CHARGE_DISPLAY" +.LASF303: + .string "load_addr" +.LASF117: + .string "fit_hdr_os" +.LASF73: + .string "_datarelrolocal_start_ofs" +.LASF396: + .string "timeout" +.LASF254: + .string "addr" +.LASF344: + .string "read" +.LASF8: + .string "unsigned int" +.LASF16: + .string "ushort" +.LASF402: + .string "task_is_registered" +.LASF281: + .string "ufdt_blob" +.LASF410: + .string "spl_init_display" +.LASF287: + .string "malloc_limit" +.LASF401: + .string "mpb_task_register" +.LASF192: + .string "UCLASS_PMIC" +.LASF113: + .string "legacy_hdr_os" +.LASF82: + .string "off_dt_strings" +.LASF300: + .string "monitor_flash_len" +.LASF177: + .string "UCLASS_MISC" +.LASF51: + .string "bi_memsize" +.LASF394: + .string "mpb_task_wait_parent" +.LASF23: + .string "image_base" +.LASF382: + .string "mpb_init_1" +.LASF211: + .string "UCLASS_SYSRESET" +.LASF164: + .string "UCLASS_FIRMWARE" +.LASF425: + .string "invalidate_dcache_range" +.LASF174: + .string "UCLASS_LPC" +.LASF170: + .string "UCLASS_IDE" +.LASF290: + .string "video_top" +.LASF280: + .string "of_root_f" +.LASF139: + .string "bootm_headers_t" +.LASF57: + .string "bi_arm_freq" +.LASF198: + .string "UCLASS_REMOTEPROC" +.LASF109: + .string "type" +.LASF120: + .string "fit_hdr_rd" +.LASF388: + .string "fail" +.LASF262: + .string "env_addr" +.LASF56: + .string "bi_sramsize" +.LASF348: + .string "boot_size" +.LASF390: + .string "mpb_task_wait_done" +.LASF406: + .string "spl_hash_android" +.LASF275: + .string "uclass_root" +.LASF163: + .string "UCLASS_GPIO" +.LASF193: + .string "UCLASS_PWM" +.LASF404: + .string "set_gd" +.LASF42: + .string "long double" +.LASF264: + .string "ram_top" +.LASF296: + .string "console_evt" +.LASF381: + .string "mpb_init_x" +.LASF431: + .string "mpb_task_set_state" +.LASF129: + .string "rd_start" +.LASF194: + .string "UCLASS_POWER_DOMAIN" +.LASF197: + .string "UCLASS_REGULATOR" +.LASF305: + .string "save_size" +.LASF414: + .string "msec" +.LASF155: + .string "UCLASS_CLK" +.LASF391: + .string "core_task_run" +.LASF346: + .string "info" +.LASF72: + .string "_datarel_start_ofs" +.LASF250: + .string "pre_serial" +.LASF428: + .ascii "GNU C11 6.3.1 201" + .string "70404 -mstrict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18" +.LASF102: + .string "ih_name" +.LASF98: + .string "ih_os" +.LASF345: + .string "task_data" +.LASF136: + .string "cmdline_end" +.LASF320: + .string "net_rx_packet" +.LASF241: + .string "LOGF_MAX_CATEGORIES" +.LASF276: + .string "fdt_blob" +.LASF33: + .string "size" +.LASF10: + .string "long long unsigned int" +.LASF90: + .string "image_header" +.LASF350: + .string "CPU_1" +.LASF19: + .string "__be32" +.LASF52: + .string "bi_flashstart" +.LASF119: + .string "fit_noffset_os" +.LASF399: + .string "mpb_task_set_result" +.LASF178: + .string "UCLASS_MMC" +.LASF240: + .string "UCLASS_INVALID" +.LASF376: + .string "mpb_core" +.LASF218: + .string "UCLASS_USB_HUB" +.LASF279: + .string "of_root" +.LASF234: + .string "UCLASS_EBC" +.LASF340: + .string "spl_load_info" +.LASF293: + .string "new_line" +.LASF416: + .string "memset" +.LASF41: + .string "flash_info" +.LASF84: + .string "version" +.LASF46: + .string "region" +.LASF88: + .string "size_dt_struct" +.LASF273: + .string "dm_root" +.LASF236: + .string "UCLASS_RNG" +.LASF295: + .string "sys_start_tick" +.LASF180: + .string "UCLASS_MTD" +.LASF77: + .string "fdt32_t" +.LASF272: + .string "new_gd" +.LASF182: + .string "UCLASS_NORTHBRIDGE" +.LASF62: + .string "bi_enetaddr" +.LASF39: + .string "mtd_info" +.LASF306: + .string "in_addr" +.LASF321: + .string "net_rx_packet_len" +.LASF383: + .string "init" +.LASF301: + .string "__dtb_dt_begin" +.LASF199: + .string "UCLASS_RESET" +.LASF122: + .string "fit_noffset_rd" +.LASF153: + .string "UCLASS_AHCI" +.LASF12: + .string "phys_size_t" +.LASF156: + .string "UCLASS_CPU" +.LASF71: + .string "FIQ_STACK_START" +.LASF137: + .string "verify" +.LASF31: + .string "name" +.LASF235: + .string "UCLASS_EINK_DISPLAY" +.LASF185: + .string "UCLASS_PANEL_BACKLIGHT" +.LASF213: + .string "UCLASS_TIMER" +.LASF208: + .string "UCLASS_SPI_FLASH" +.LASF261: + .string "have_console" +.LASF65: + .string "bi_busfreq" +.LASF6: + .string "short int" +.LASF347: + .string "boot_addr" +.LASF191: + .string "UCLASS_PINCTRL" +.LASF201: + .string "UCLASS_RAMDISK" +.LASF148: + .string "UCLASS_I2C_EMUL" +.LASF365: + .string "TASK_LOAD_ANDROID" +.LASF207: + .string "UCLASS_SPMI" +.LASF378: + .string "tdata" +.LASF145: + .string "UCLASS_TEST_BUS" +.LASF417: + .string "flush_dcache_all" +.LASF304: + .string "save_addr" +.LASF426: + .string "flush_dcache_range" +.LASF288: + .string "malloc_ptr" +.LASF411: + .string "cpuectlr_disable" +.LASF386: + .string "mpb_task_run" +.LASF408: + .string "spl_load_fit" +.LASF134: + .string "initrd_end" +.LASF359: + .string "EVT_VIDEO_BP" +.LASF253: + .string "baudrate" +.LASF74: + .string "_datarellocal_start_ofs" +.LASF242: + .string "arch_global_data" +.LASF239: + .string "UCLASS_COUNT" +.LASF349: + .string "CPU_0" +.LASF259: + .string "pci_clk" +.LASF351: + .string "CPU_2" +.LASF352: + .string "CPU_3" +.LASF30: + .string "block_drvr" +.LASF433: + .string "memcpy" +.LASF35: + .string "flash_id" +.LASF231: + .string "UCLASS_CRYPTO" +.LASF297: + .string "device_node" +.LASF267: + .string "ram_size" +.LASF128: + .string "fit_noffset_setup" +.LASF89: + .string "working_fdt" +.LASF282: + .string "fdt_blob_kern" +.LASF313: + .string "net_root_path" +.LASF161: + .string "UCLASS_DMA" +.LASF69: + .string "bd_t" +.LASF237: + .string "UCLASS_DMC" +.LASF307: + .string "s_addr" +.LASF322: + .string "net_bcast_ethaddr" +.LASF379: + .string "mpb_gd" +.LASF67: + .string "bi_boot_params" +.LASF308: + .string "net_gateway" +.LASF50: + .string "bi_memstart" +.LASF222: + .string "UCLASS_VIDEO_CONSOLE" +.LASF48: + .string "reserved" +.LASF360: + .string "TASK_NONE" +.LASF238: + .string "UCLASS_PD" +.LASF423: + .string "dcache_disable" +.LASF68: + .string "bi_dram" +.LASF2: + .string "short unsigned int" +.LASF79: + .string "magic" +.LASF126: + .string "fit_hdr_setup" +.LASF115: + .string "legacy_hdr_valid" +.LASF368: + .string "TASK_MAX" +.LASF44: + .string "base" +.LASF432: + .string "spl_dummy" +.LASF202: + .string "UCLASS_RTC" +.LASF353: + .string "EVT_BOOT_DEV" +.LASF243: + .string "timer_rate_hz" +.LASF34: + .string "sector_count" +.LASF101: + .string "ih_comp" +.LASF385: + .string "core_main" +.LASF131: + .string "ft_addr" +.LASF232: + .string "UCLASS_ETH_PHY" +.LASF380: + .string "task_init" +.LASF4: + .string "uchar" +.LASF132: + .string "ft_len" +.LASF27: + .string "next" +.LASF405: + .string "data" +.LASF181: + .string "UCLASS_NOP" +.LASF367: + .string "TASK_RUN_UBOOT" +.LASF357: + .string "EVT_LINUX" +.LASF127: + .string "fit_uname_setup" +.LASF28: + .string "prev" +.LASF424: + .string "invalidate_dcache_all" +.LASF186: + .string "UCLASS_PCH" +.LASF187: + .string "UCLASS_PCI" +.LASF309: + .string "net_netmask" +.LASF70: + .string "IRQ_STACK_START" +.LASF152: + .string "UCLASS_ADC" +.LASF147: + .string "UCLASS_SPI_EMUL" +.LASF409: + .string "spl_load_baseparamter" +.LASF124: + .string "fit_uname_fdt" + .ident "GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404" + .section .note.GNU-stack,"",@progbits diff --git a/u-boot/configs/px30-tb_defconfig b/u-boot/configs/px30-tb_defconfig index 3d6037c..9a084ff 100644 --- a/u-boot/configs/px30-tb_defconfig +++ b/u-boot/configs/px30-tb_defconfig @@ -4,7 +4,7 @@ CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SYS_MALLOC_F_LEN=0x80000 CONFIG_ROCKCHIP_PX30=y -CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.py" +CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.sh" CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0 CONFIG_ROCKCHIP_FIT_IMAGE=y CONFIG_ROCKCHIP_VENDOR_PARTITION=y diff --git a/u-boot/configs/px30_defconfig b/u-boot/configs/px30_defconfig index 1882d48..0055891 100644 --- a/u-boot/configs/px30_defconfig +++ b/u-boot/configs/px30_defconfig @@ -135,6 +135,7 @@ CONFIG_LCD=y CONFIG_USE_TINY_PRINTF=y CONFIG_SPL_TINY_MEMSET=y +CONFIG_XBC=y CONFIG_LZ4=y CONFIG_LZO=y CONFIG_ERRNO_STR=y diff --git a/u-boot/configs/rk-amp.config b/u-boot/configs/rk-amp.config new file mode 100644 index 0000000..b76e182 --- /dev/null +++ b/u-boot/configs/rk-amp.config @@ -0,0 +1,3 @@ +# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set +CONFIG_AMP=y +CONFIG_ROCKCHIP_AMP=y diff --git a/u-boot/configs/rk3036_defconfig b/u-boot/configs/rk3036_defconfig index 2b91aaf..b0ea431 100644 --- a/u-boot/configs/rk3036_defconfig +++ b/u-boot/configs/rk3036_defconfig @@ -73,11 +73,13 @@ CONFIG_SYS_I2C_ROCKCHIP=y CONFIG_DM_KEY=y CONFIG_ADC_KEY=y +CONFIG_GPIO_KEY=y CONFIG_LED=y CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=y CONFIG_SPI_FLASH=y CONFIG_SF_DEFAULT_SPEED=20000000 +CONFIG_PHY_ROCKCHIP_INNO_USB2=y CONFIG_PINCTRL=y CONFIG_SPL_PINCTRL=y CONFIG_REGULATOR_PWM=y diff --git a/u-boot/configs/rk3126_defconfig b/u-boot/configs/rk3126_defconfig index a95e38d..f9bdb8e 100644 --- a/u-boot/configs/rk3126_defconfig +++ b/u-boot/configs/rk3126_defconfig @@ -15,6 +15,7 @@ # CONFIG_DISPLAY_CPUINFO is not set CONFIG_ANDROID_BOOTLOADER=y CONFIG_ANDROID_AVB=y +# CONFIG_SKIP_RELOCATE_UBOOT is not set CONFIG_FASTBOOT_BUF_ADDR=0x60800800 CONFIG_FASTBOOT_BUF_SIZE=0x04000000 CONFIG_FASTBOOT_FLASH=y diff --git a/u-boot/configs/rk3128_defconfig b/u-boot/configs/rk3128_defconfig index e24b274..c1c1ddc 100644 --- a/u-boot/configs/rk3128_defconfig +++ b/u-boot/configs/rk3128_defconfig @@ -2,7 +2,6 @@ CONFIG_ARCH_ROCKCHIP=y CONFIG_SYS_MALLOC_F_LEN=0x38000 CONFIG_ROCKCHIP_RK3128=y -CONFIG_RKIMG_BOOTLOADER=y CONFIG_ROCKCHIP_VENDOR_PARTITION=y CONFIG_DEFAULT_DEVICE_TREE="rk3126-evb" CONFIG_DEBUG_UART=y @@ -13,6 +12,7 @@ # CONFIG_DISPLAY_CPUINFO is not set CONFIG_ANDROID_BOOTLOADER=y CONFIG_ANDROID_AVB=y +# CONFIG_SKIP_RELOCATE_UBOOT is not set CONFIG_FASTBOOT_BUF_ADDR=0x60800800 CONFIG_FASTBOOT_BUF_SIZE=0x04000000 CONFIG_FASTBOOT_FLASH=y @@ -82,9 +82,6 @@ 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=0x310c CONFIG_DM_VIDEO=y CONFIG_DISPLAY=y CONFIG_VIDEO_ROCKCHIP=y diff --git a/u-boot/configs/rk3128x_defconfig b/u-boot/configs/rk3128x_defconfig index ada3b40..d0cc774 100644 --- a/u-boot/configs/rk3128x_defconfig +++ b/u-boot/configs/rk3128x_defconfig @@ -120,7 +120,7 @@ CONFIG_DRM_ROCKCHIP=y CONFIG_DRM_ROCKCHIP_DW_HDMI=y CONFIG_ROCKCHIP_INNO_HDMI_PHY=y -CONFIG_ROCKCHIP_DRM_TVE=y +CONFIG_DRM_ROCKCHIP_TVE=y CONFIG_LCD=y CONFIG_USE_TINY_PRINTF=y CONFIG_SPL_TINY_MEMSET=y diff --git a/u-boot/configs/rk312x-rkflash.config b/u-boot/configs/rk312x-rkflash.config new file mode 100644 index 0000000..92ad355 --- /dev/null +++ b/u-boot/configs/rk312x-rkflash.config @@ -0,0 +1,6 @@ +CONFIG_RKFLASH=y +# CONFIG_RKNAND is not set +CONFIG_CMD_RKSFC=y +CONFIG_RKNANDC_NAND=y +CONFIG_RKSFC_NAND=y +CONFIG_RKSFC_NOR=y diff --git a/u-boot/configs/rk322x_defconfig b/u-boot/configs/rk322x_defconfig index a2ead85..22621cd 100644 --- a/u-boot/configs/rk322x_defconfig +++ b/u-boot/configs/rk322x_defconfig @@ -115,7 +115,7 @@ CONFIG_DRM_ROCKCHIP=y CONFIG_DRM_ROCKCHIP_DW_HDMI=y CONFIG_ROCKCHIP_INNO_HDMI_PHY=y -CONFIG_ROCKCHIP_DRM_TVE=y +CONFIG_DRM_ROCKCHIP_TVE=y CONFIG_LCD=y CONFIG_USE_TINY_PRINTF=y CONFIG_SPL_TINY_MEMSET=y diff --git a/u-boot/configs/rk3308-amp.config b/u-boot/configs/rk3308-amp.config new file mode 100644 index 0000000..4e7e3ba --- /dev/null +++ b/u-boot/configs/rk3308-amp.config @@ -0,0 +1,3 @@ +CONFIG_AMP=y +CONFIG_BASE_DEFCONFIG="rk3308_defconfig" +CONFIG_ROCKCHIP_AMP=y diff --git a/u-boot/configs/rk3326_defconfig b/u-boot/configs/rk3326_defconfig index 290a283..d1f0e1f 100644 --- a/u-boot/configs/rk3326_defconfig +++ b/u-boot/configs/rk3326_defconfig @@ -69,6 +69,8 @@ CONFIG_SPL_SYSCON=y CONFIG_CLK=y CONFIG_SPL_CLK=y +CONFIG_AMP=y +CONFIG_ROCKCHIP_AMP=y CONFIG_DM_CRYPTO=y CONFIG_ROCKCHIP_CRYPTO_V2=y CONFIG_ROCKCHIP_GPIO=y @@ -128,6 +130,8 @@ CONFIG_LCD=y CONFIG_USE_TINY_PRINTF=y CONFIG_SPL_TINY_MEMSET=y +CONFIG_XBC=y +CONFIG_SHA256=y CONFIG_LZ4=y CONFIG_LZO=y CONFIG_ERRNO_STR=y diff --git a/u-boot/configs/rk3328_defconfig b/u-boot/configs/rk3328_defconfig index 2e7096b..03de227 100644 --- a/u-boot/configs/rk3328_defconfig +++ b/u-boot/configs/rk3328_defconfig @@ -129,7 +129,7 @@ CONFIG_DRM_ROCKCHIP_PANEL=y CONFIG_DRM_ROCKCHIP_DW_HDMI=y CONFIG_ROCKCHIP_INNO_HDMI_PHY=y -CONFIG_ROCKCHIP_DRM_TVE=y +CONFIG_DRM_ROCKCHIP_TVE=y CONFIG_LCD=y # CONFIG_IRQ is not set CONFIG_USE_TINY_PRINTF=y diff --git a/u-boot/configs/rk3399_defconfig b/u-boot/configs/rk3399_defconfig index cfadc7b..7c6e123 100644 --- a/u-boot/configs/rk3399_defconfig +++ b/u-boot/configs/rk3399_defconfig @@ -90,8 +90,8 @@ CONFIG_PINCTRL=y CONFIG_SPL_PINCTRL=y CONFIG_DM_FUEL_GAUGE=y -CONFIG_POWER_FG_RK817=y CONFIG_POWER_FG_RK818=y +CONFIG_POWER_FG_RK817=y CONFIG_IO_DOMAIN=y CONFIG_ROCKCHIP_IO_DOMAIN=y CONFIG_DM_PMIC=y @@ -137,6 +137,7 @@ CONFIG_USE_TINY_PRINTF=y CONFIG_LIB_RAND=y CONFIG_SPL_TINY_MEMSET=y +CONFIG_XBC=y CONFIG_ERRNO_STR=y CONFIG_AVB_LIBAVB=y CONFIG_AVB_LIBAVB_AB=y diff --git a/u-boot/configs/rk3528-aarch32.config b/u-boot/configs/rk3528-aarch32.config new file mode 100644 index 0000000..a80ed33 --- /dev/null +++ b/u-boot/configs/rk3528-aarch32.config @@ -0,0 +1,24 @@ +CONFIG_ARM64_BOOT_AARCH32=y +# CONFIG_ARM64_SUPPORT_AARCH32 is not set +# CONFIG_ARMV7_LPAE is not set +CONFIG_BASE_DEFCONFIG="rk3528_defconfig" +CONFIG_BOOTP_PXE_CLIENTARCH=0x15 +CONFIG_BOOTP_VCI_STRING="U-Boot.armv7" +CONFIG_CPU_V7=y +# CONFIG_DEBUG_LL is not set +CONFIG_HAS_THUMB2=y +CONFIG_HAS_VBAR=y +CONFIG_HAVE_PRIVATE_LIBGCC=y +# CONFIG_PHYS_64BIT is not set +# CONFIG_SPL_OF_LIBFDT is not set +CONFIG_SPL_SYS_THUMB_BUILD=y +CONFIG_SPL_USE_ARCH_MEMCPY=y +CONFIG_SPL_USE_ARCH_MEMSET=y +CONFIG_SYS_ARM_ARCH=7 +CONFIG_SYS_CPU="armv7" +CONFIG_SYS_THUMB_BUILD=y +CONFIG_TPL_USE_ARCH_MEMCPY=y +CONFIG_TPL_USE_ARCH_MEMSET=y +CONFIG_USE_ARCH_MEMCPY=y +CONFIG_USE_ARCH_MEMSET=y +CONFIG_USE_PRIVATE_LIBGCC=y diff --git a/u-boot/configs/rk3528_defconfig b/u-boot/configs/rk3528_defconfig new file mode 100644 index 0000000..cfa8bbb --- /dev/null +++ b/u-boot/configs/rk3528_defconfig @@ -0,0 +1,201 @@ +CONFIG_ARM=y +CONFIG_ARM_SMCCC=y +CONFIG_ARCH_ROCKCHIP=y +CONFIG_SPL_LIBCOMMON_SUPPORT=y +CONFIG_SPL_LIBGENERIC_SUPPORT=y +CONFIG_SYS_MALLOC_F_LEN=0x80000 +CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.sh" +CONFIG_ROCKCHIP_RK3528=y +CONFIG_ROCKCHIP_FIT_IMAGE=y +CONFIG_ROCKCHIP_VENDOR_PARTITION=y +CONFIG_USING_KERNEL_DTB_V2=y +CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y +CONFIG_ROCKCHIP_NEW_IDB=y +CONFIG_SPL_SERIAL_SUPPORT=y +CONFIG_SPL_DRIVERS_MISC_SUPPORT=y +CONFIG_TARGET_EVB_RK3528=y +CONFIG_SPL_LIBDISK_SUPPORT=y +CONFIG_SPL_SPI_FLASH_SUPPORT=y +CONFIG_SPL_SPI_SUPPORT=y +CONFIG_DEFAULT_DEVICE_TREE="rk3528-evb" +CONFIG_DEBUG_UART=y +CONFIG_FIT=y +CONFIG_FIT_IMAGE_POST_PROCESS=y +CONFIG_FIT_HW_CRYPTO=y +CONFIG_SPL_LOAD_FIT=y +CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y +CONFIG_SPL_FIT_HW_CRYPTO=y +# CONFIG_SPL_SYS_DCACHE_OFF is not set +CONFIG_BOOTDELAY=0 +# CONFIG_CONSOLE_MUX is not set +CONFIG_SYS_CONSOLE_INFO_QUIET=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_ANDROID_BOOTLOADER=y +CONFIG_ANDROID_AVB=y +CONFIG_ANDROID_BOOT_IMAGE_HASH=y +CONFIG_SPL_BOARD_INIT=y +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set +# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set +CONFIG_SPL_SEPARATE_BSS=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y +CONFIG_SPL_CRYPTO_SUPPORT=y +CONFIG_SPL_MMC_WRITE=y +CONFIG_SPL_MTD_SUPPORT=y +CONFIG_SPL_MTD_WRITE=y +CONFIG_SPL_ATF=y +CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y +CONFIG_SPL_AB=y +CONFIG_FASTBOOT_BUF_ADDR=0xc00800 +CONFIG_FASTBOOT_BUF_SIZE=0x04000000 +CONFIG_FASTBOOT_FLASH=y +CONFIG_FASTBOOT_FLASH_MMC_DEV=0 +CONFIG_CMD_BOOTZ=y +CONFIG_CMD_DTIMG=y +# CONFIG_CMD_ELF is not set +# CONFIG_CMD_IMI is not set +# CONFIG_CMD_IMLS is not set +# CONFIG_CMD_XIMG is not set +# CONFIG_CMD_LZMADEC is not set +# CONFIG_CMD_UNZIP is not set +# CONFIG_CMD_FLASH is not set +# CONFIG_CMD_FPGA is not set +CONFIG_CMD_GPT=y +# CONFIG_CMD_LOADB is not set +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_BOOT_ANDROID=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_ITEST is not set +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_TFTPPUT=y +CONFIG_CMD_TFTP_BOOTM=y +CONFIG_CMD_TFTP_FLASH=y +# CONFIG_CMD_MISC is not set +CONFIG_CMD_MTD_BLK=y +# CONFIG_SPL_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64 +CONFIG_SPL_OF_CONTROL=y +CONFIG_SPL_DTB_MINIMUM=y +CONFIG_OF_LIVE=y +CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clock-parents" +# CONFIG_NET_TFTP_VARS is not set +CONFIG_REGMAP=y +CONFIG_SPL_REGMAP=y +CONFIG_SYSCON=y +CONFIG_SPL_SYSCON=y +# CONFIG_SARADC_ROCKCHIP is not set +CONFIG_SARADC_ROCKCHIP_V2=y +CONFIG_CLK=y +CONFIG_SPL_CLK=y +CONFIG_CLK_SCMI=y +CONFIG_SPL_CLK_SCMI=y +CONFIG_DM_CRYPTO=y +CONFIG_SPL_DM_CRYPTO=y +CONFIG_ROCKCHIP_CRYPTO_V2=y +CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y +CONFIG_DM_RNG=y +CONFIG_RNG_ROCKCHIP=y +CONFIG_SCMI_FIRMWARE=y +CONFIG_SPL_SCMI_FIRMWARE=y +CONFIG_ROCKCHIP_GPIO=y +CONFIG_ROCKCHIP_GPIO_V2=y +CONFIG_SYS_I2C_ROCKCHIP=y +CONFIG_DM_KEY=y +CONFIG_ADC_KEY=y +CONFIG_MISC=y +CONFIG_SPL_MISC=y +CONFIG_ROCKCHIP_OTP=y +CONFIG_SPL_ROCKCHIP_SECURE_OTP=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_ROCKCHIP=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_ROCKCHIP=y +CONFIG_MTD=y +CONFIG_MTD_BLK=y +CONFIG_MTD_DEVICE=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH=y +CONFIG_SPI_FLASH_EON=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_ISSI=y +CONFIG_SPI_FLASH_MACRONIX=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_SPI_FLASH_XMC=y +CONFIG_SPI_FLASH_XTX=y +CONFIG_SPI_FLASH_PUYA=y +CONFIG_SPI_FLASH_FMSH=y +CONFIG_SPI_FLASH_DOSILICON=y +CONFIG_SPI_FLASH_BOYA=y +CONFIG_SPI_FLASH_MTD=y +CONFIG_SPL_SPI_FLASH_MTD=y +CONFIG_PHY_RK630=y +CONFIG_DM_ETH=y +CONFIG_DM_ETH_PHY=y +CONFIG_DWC_ETH_QOS=y +CONFIG_GMAC_ROCKCHIP=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY=y +CONFIG_PINCTRL=y +CONFIG_SPL_PINCTRL=y +CONFIG_REGULATOR_PWM=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_RAM=y +CONFIG_SPL_RAM=y +CONFIG_TPL_RAM=y +CONFIG_DM_RESET=y +CONFIG_SPL_DM_RESET=y +CONFIG_SPL_RESET_ROCKCHIP=y +CONFIG_BAUDRATE=1500000 +CONFIG_DEBUG_UART_BASE=0xff9f0000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_DEBUG_UART_SHIFT=2 +CONFIG_ROCKCHIP_SFC=y +CONFIG_SYSRESET=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_GENERIC=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_GENERIC=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_GADGET=y +CONFIG_USB_DWC3_GENERIC=y +CONFIG_USB_STORAGE=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_MANUFACTURER="Rockchip" +CONFIG_USB_GADGET_VENDOR_NUM=0x2207 +CONFIG_USB_GADGET_PRODUCT_NUM=0x350a +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_DM_VIDEO=y +CONFIG_DISPLAY=y +CONFIG_VIDEO_ROCKCHIP=y +CONFIG_DRM_ROCKCHIP=y +CONFIG_DRM_ROCKCHIP_DW_HDMI=y +CONFIG_ROCKCHIP_INNO_HDMI_PHY=y +CONFIG_DRM_ROCKCHIP_TVE=y +CONFIG_USE_TINY_PRINTF=y +CONFIG_SPL_TINY_MEMSET=y +CONFIG_RSA=y +CONFIG_SPL_RSA=y +CONFIG_RSA_N_SIZE=0x200 +CONFIG_RSA_E_SIZE=0x10 +CONFIG_RSA_C_SIZE=0x20 +CONFIG_LZ4=y +CONFIG_LZMA=y +CONFIG_SPL_GZIP=y +CONFIG_ERRNO_STR=y +# CONFIG_EFI_LOADER is not set +CONFIG_AVB_LIBAVB=y +CONFIG_AVB_LIBAVB_AB=y +CONFIG_AVB_LIBAVB_ATX=y +CONFIG_AVB_LIBAVB_USER=y +CONFIG_RK_AVB_LIBAVB_USER=y +CONFIG_OPTEE_CLIENT=y +CONFIG_OPTEE_V2=y diff --git a/u-boot/configs/rk3562_defconfig b/u-boot/configs/rk3562_defconfig new file mode 100644 index 0000000..229e37b --- /dev/null +++ b/u-boot/configs/rk3562_defconfig @@ -0,0 +1,211 @@ +CONFIG_ARM=y +CONFIG_ARCH_ROCKCHIP=y +CONFIG_SPL_LIBCOMMON_SUPPORT=y +CONFIG_SPL_LIBGENERIC_SUPPORT=y +CONFIG_SYS_MALLOC_F_LEN=0x80000 +CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.sh" +CONFIG_ROCKCHIP_RK3562=y +CONFIG_ROCKCHIP_FIT_IMAGE=y +CONFIG_ROCKCHIP_VENDOR_PARTITION=y +CONFIG_USING_KERNEL_DTB_V2=y +CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y +CONFIG_ROCKCHIP_NEW_IDB=y +CONFIG_SPL_SERIAL_SUPPORT=y +CONFIG_SPL_DRIVERS_MISC_SUPPORT=y +CONFIG_TARGET_EVB_RK3562=y +CONFIG_SPL_LIBDISK_SUPPORT=y +CONFIG_SPL_SPI_FLASH_SUPPORT=y +CONFIG_SPL_SPI_SUPPORT=y +CONFIG_DEFAULT_DEVICE_TREE="rk3562-evb" +CONFIG_DEBUG_UART=y +CONFIG_FIT=y +CONFIG_FIT_IMAGE_POST_PROCESS=y +CONFIG_FIT_HW_CRYPTO=y +CONFIG_SPL_LOAD_FIT=y +CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y +CONFIG_SPL_FIT_HW_CRYPTO=y +# CONFIG_SPL_SYS_DCACHE_OFF is not set +CONFIG_BOOTDELAY=0 +# CONFIG_CONSOLE_MUX is not set +CONFIG_SYS_CONSOLE_INFO_QUIET=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_ANDROID_BOOTLOADER=y +CONFIG_ANDROID_AVB=y +CONFIG_ANDROID_BOOT_IMAGE_HASH=y +CONFIG_SPL_BOARD_INIT=y +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set +# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set +CONFIG_SPL_SEPARATE_BSS=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y +CONFIG_SPL_MMC_WRITE=y +CONFIG_SPL_MTD_SUPPORT=y +CONFIG_SPL_MTD_WRITE=y +CONFIG_SPL_ATF=y +CONFIG_SPL_ATF_NO_PLATFORM_PARAM=y +CONFIG_SPL_AB=y +CONFIG_FASTBOOT_BUF_ADDR=0xc00800 +CONFIG_FASTBOOT_BUF_SIZE=0x04000000 +CONFIG_FASTBOOT_FLASH=y +CONFIG_FASTBOOT_FLASH_MMC_DEV=0 +# CONFIG_CMD_BDI is not set +CONFIG_CMD_BOOTZ=y +CONFIG_CMD_DTIMG=y +# CONFIG_CMD_ELF is not set +# CONFIG_CMD_IMI is not set +# CONFIG_CMD_IMLS is not set +# CONFIG_CMD_XIMG is not set +# CONFIG_CMD_LZMADEC is not set +# CONFIG_CMD_UNZIP is not set +# CONFIG_CMD_FLASH is not set +# CONFIG_CMD_FPGA is not set +CONFIG_CMD_GPT=y +# CONFIG_CMD_LOADB is not set +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_BOOT_ANDROID=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +CONFIG_CMD_SF=y +CONFIG_CMD_SPI=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_ITEST is not set +# CONFIG_CMD_SETEXPR is not set +# CONFIG_CMD_MISC is not set +CONFIG_CMD_MTD_BLK=y +# CONFIG_ISO_PARTITION is not set +CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64 +CONFIG_SPL_OF_CONTROL=y +CONFIG_SPL_DTB_MINIMUM=y +CONFIG_OF_LIVE=y +CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" +# CONFIG_NET_TFTP_VARS is not set +CONFIG_REGMAP=y +CONFIG_SPL_REGMAP=y +CONFIG_SYSCON=y +CONFIG_SPL_SYSCON=y +# CONFIG_SARADC_ROCKCHIP is not set +CONFIG_SARADC_ROCKCHIP_V2=y +CONFIG_CLK=y +CONFIG_SPL_CLK=y +CONFIG_CLK_SCMI=y +CONFIG_SPL_CLK_SCMI=y +CONFIG_DM_CRYPTO=y +CONFIG_SPL_DM_CRYPTO=y +CONFIG_ROCKCHIP_CRYPTO_V2=y +CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y +CONFIG_DM_RNG=y +CONFIG_RNG_ROCKCHIP=y +CONFIG_SCMI_FIRMWARE=y +CONFIG_SPL_SCMI_FIRMWARE=y +CONFIG_ROCKCHIP_GPIO=y +CONFIG_ROCKCHIP_GPIO_V2=y +CONFIG_SYS_I2C_ROCKCHIP=y +CONFIG_DM_KEY=y +CONFIG_RK8XX_PWRKEY=y +CONFIG_ADC_KEY=y +CONFIG_MISC=y +CONFIG_SPL_MISC=y +CONFIG_ROCKCHIP_OTP=y +CONFIG_SPL_ROCKCHIP_SECURE_OTP=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_ROCKCHIP=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_ROCKCHIP=y +CONFIG_MTD=y +CONFIG_MTD_BLK=y +CONFIG_MTD_DEVICE=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH=y +CONFIG_SF_DEFAULT_MODE=0x3 +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_MACRONIX=y +CONFIG_SPI_FLASH_SST=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_SPI_FLASH_XMC=y +CONFIG_SPI_FLASH_XTX=y +CONFIG_SPI_FLASH_PUYA=y +CONFIG_SPI_FLASH_FMSH=y +CONFIG_SPI_FLASH_DOSILICON=y +CONFIG_SPI_FLASH_BOYA=y +CONFIG_SPI_FLASH_NORMEM=y +CONFIG_SPI_FLASH_MTD=y +CONFIG_SPL_SPI_FLASH_MTD=y +CONFIG_DM_ETH=y +CONFIG_DM_ETH_PHY=y +CONFIG_DWC_ETH_QOS=y +CONFIG_GMAC_ROCKCHIP=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY=y +CONFIG_PINCTRL=y +CONFIG_SPL_PINCTRL=y +CONFIG_DM_FUEL_GAUGE=y +CONFIG_POWER_FG_RK817=y +CONFIG_DM_PMIC=y +CONFIG_PMIC_RK8XX=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_PWM=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_REGULATOR_RK8XX=y +CONFIG_DM_CHARGE_DISPLAY=y +CONFIG_CHARGE_ANIMATION=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_RAM=y +CONFIG_SPL_RAM=y +CONFIG_TPL_RAM=y +CONFIG_DM_DMC=y +CONFIG_DM_RESET=y +CONFIG_SPL_DM_RESET=y +CONFIG_SPL_RESET_ROCKCHIP=y +CONFIG_BAUDRATE=1500000 +CONFIG_DEBUG_UART_BASE=0xff210000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_DEBUG_UART_SHIFT=2 +CONFIG_ROCKCHIP_SFC=y +CONFIG_SYSRESET=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_GENERIC=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_GENERIC=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_GADGET=y +CONFIG_USB_DWC3_GENERIC=y +CONFIG_USB_STORAGE=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_MANUFACTURER="Rockchip" +CONFIG_USB_GADGET_VENDOR_NUM=0x2207 +CONFIG_USB_GADGET_PRODUCT_NUM=0x350a +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_DM_VIDEO=y +CONFIG_DISPLAY=y +CONFIG_DRM_ROCKCHIP=y +CONFIG_DRM_ROCKCHIP_INNO_VIDEO_COMBO_PHY=y +CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI=y +CONFIG_DRM_ROCKCHIP_LVDS=y +CONFIG_DRM_ROCKCHIP_RGB=y +CONFIG_USE_TINY_PRINTF=y +CONFIG_SPL_TINY_MEMSET=y +CONFIG_RSA=y +CONFIG_SPL_RSA=y +CONFIG_RSA_N_SIZE=0x200 +CONFIG_RSA_E_SIZE=0x10 +CONFIG_RSA_C_SIZE=0x20 +CONFIG_XBC=y +CONFIG_SHA1=y +CONFIG_SHA256=y +CONFIG_LZ4=y +CONFIG_SPL_GZIP=y +CONFIG_ERRNO_STR=y +# CONFIG_EFI_LOADER is not set +CONFIG_AVB_LIBAVB=y +CONFIG_AVB_LIBAVB_AB=y +CONFIG_AVB_LIBAVB_ATX=y +CONFIG_AVB_LIBAVB_USER=y +CONFIG_RK_AVB_LIBAVB_USER=y +CONFIG_OPTEE_CLIENT=y +CONFIG_OPTEE_V2=y +CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y diff --git a/u-boot/configs/rk3568-rt.config b/u-boot/configs/rk3568-rt.config new file mode 100644 index 0000000..8dc3c69 --- /dev/null +++ b/u-boot/configs/rk3568-rt.config @@ -0,0 +1,2 @@ +CONFIG_BASE_DEFCONFIG="rk3568_defconfig" +CONFIG_TRUST_INI="RK3568TRUST_RT.ini" diff --git a/u-boot/configs/rk3568-spl-spi-nand_defconfig b/u-boot/configs/rk3568-spl-spi-nand_defconfig index eabdae7..074ccc3 100755 --- a/u-boot/configs/rk3568-spl-spi-nand_defconfig +++ b/u-boot/configs/rk3568-spl-spi-nand_defconfig @@ -26,9 +26,6 @@ CONFIG_BOOTDELAY=0 CONFIG_SYS_CONSOLE_INFO_QUIET=y # CONFIG_DISPLAY_CPUINFO is not set -# CONFIG_ANDROID_WRITE_KEYBOX is not set -CONFIG_ANDROID_AVB=y -# CONFIG_ANDROID_KEYMASTER_CA is not set CONFIG_SPL_BOARD_INIT=y # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set @@ -183,12 +180,4 @@ CONFIG_RSA_E_SIZE=0x10 CONFIG_RSA_C_SIZE=0x20 CONFIG_SHA512=y -CONFIG_LZ4=y CONFIG_ERRNO_STR=y -CONFIG_AVB_LIBAVB=y -CONFIG_AVB_LIBAVB_AB=y -CONFIG_AVB_LIBAVB_ATX=y -CONFIG_AVB_LIBAVB_USER=y -CONFIG_RK_AVB_LIBAVB_USER=y -CONFIG_OPTEE_CLIENT=y -CONFIG_OPTEE_V2=y diff --git a/u-boot/configs/rk3568_defconfig b/u-boot/configs/rk3568_defconfig index fbd9820..d157307 100644 --- a/u-boot/configs/rk3568_defconfig +++ b/u-boot/configs/rk3568_defconfig @@ -83,6 +83,7 @@ # CONFIG_ISO_PARTITION is not set CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64 CONFIG_SPL_OF_CONTROL=y +CONFIG_SPL_DTB_MINIMUM=y CONFIG_OF_LIVE=y CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" # CONFIG_NET_TFTP_VARS is not set @@ -206,6 +207,7 @@ CONFIG_RSA_N_SIZE=0x200 CONFIG_RSA_E_SIZE=0x10 CONFIG_RSA_C_SIZE=0x20 +CONFIG_XBC=y CONFIG_SHA512=y CONFIG_LZ4=y CONFIG_LZMA=y diff --git a/u-boot/configs/rk3588-ab.config b/u-boot/configs/rk3588-ab.config new file mode 100644 index 0000000..a67f0d9 --- /dev/null +++ b/u-boot/configs/rk3588-ab.config @@ -0,0 +1,3 @@ +CONFIG_ANDROID_AB=y +CONFIG_BASE_DEFCONFIG="rk3588_defconfig" +# CONFIG_CMD_ANDROID_AB_SELECT is not set diff --git a/u-boot/configs/rk3588-qnx_defconfig b/u-boot/configs/rk3588-qnx_defconfig new file mode 100644 index 0000000..0c42ff1 --- /dev/null +++ b/u-boot/configs/rk3588-qnx_defconfig @@ -0,0 +1,212 @@ +CONFIG_ARM=y +CONFIG_ARCH_ROCKCHIP=y +CONFIG_SPL_GPIO_SUPPORT=y +CONFIG_SPL_LIBCOMMON_SUPPORT=y +CONFIG_SPL_LIBGENERIC_SUPPORT=y +CONFIG_SYS_MALLOC_F_LEN=0x80000 +CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_atf.sh" +CONFIG_ROCKCHIP_RK3588=y +CONFIG_ROCKCHIP_FIT_IMAGE=y +CONFIG_ROCKCHIP_HWID_DTB=y +CONFIG_ROCKCHIP_VENDOR_PARTITION=y +CONFIG_USING_KERNEL_DTB_V2=y +CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y +CONFIG_ROCKCHIP_NEW_IDB=y +CONFIG_PSTORE=y +CONFIG_SPL_SERIAL_SUPPORT=y +CONFIG_SPL_DRIVERS_MISC_SUPPORT=y +CONFIG_TARGET_EVB_RK3588=y +CONFIG_SPL_LIBDISK_SUPPORT=y +CONFIG_DEFAULT_DEVICE_TREE="rk3588-evb" +CONFIG_DEBUG_UART=y +CONFIG_FIT=y +CONFIG_FIT_IMAGE_POST_PROCESS=y +CONFIG_FIT_HW_CRYPTO=y +CONFIG_FIT_OMIT_UBOOT=y +CONFIG_SPL_LOAD_FIT=y +CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y +CONFIG_SPL_FIT_HW_CRYPTO=y +# CONFIG_SPL_SYS_DCACHE_OFF is not set +CONFIG_BOOTDELAY=0 +CONFIG_SYS_CONSOLE_INFO_QUIET=y +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_ANDROID_BOOTLOADER=y +CONFIG_ANDROID_AVB=y +CONFIG_ANDROID_BOOT_IMAGE_HASH=y +CONFIG_SPL_BOARD_INIT=y +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set +# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set +CONFIG_SPL_SEPARATE_BSS=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=0x1 +CONFIG_SPL_MMC_WRITE=y +CONFIG_SPL_ATF=y +CONFIG_SPL_KERNEL_BOOT=y +# CONFIG_SPL_KERNEL_BOOT_PREBUILT is not set +CONFIG_FASTBOOT_BUF_ADDR=0xc00800 +CONFIG_FASTBOOT_BUF_SIZE=0x07000000 +CONFIG_FASTBOOT_FLASH=y +CONFIG_FASTBOOT_FLASH_MMC_DEV=0 +CONFIG_CMD_BOOTZ=y +CONFIG_CMD_DTIMG=y +# CONFIG_CMD_ELF is not set +# CONFIG_CMD_IMI is not set +# CONFIG_CMD_IMLS is not set +# CONFIG_CMD_XIMG is not set +# CONFIG_CMD_LZMADEC is not set +# CONFIG_CMD_UNZIP is not set +# CONFIG_CMD_FLASH is not set +# CONFIG_CMD_FPGA is not set +CONFIG_CMD_GPT=y +# CONFIG_CMD_LOADB is not set +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_BOOT_ANDROID=y +CONFIG_CMD_MMC=y +CONFIG_CMD_USB=y +CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_ITEST is not set +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_TFTPPUT=y +CONFIG_CMD_TFTP_BOOTM=y +CONFIG_CMD_TFTP_FLASH=y +# CONFIG_CMD_MISC is not set +# CONFIG_SPL_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=64 +CONFIG_SPL_OF_CONTROL=y +CONFIG_SPL_DTB_MINIMUM=y +CONFIG_OF_LIVE=y +CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" +CONFIG_OF_U_BOOT_REMOVE_PROPS="pinctrl-0 pinctrl-names clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" +# CONFIG_NET_TFTP_VARS is not set +CONFIG_REGMAP=y +CONFIG_SPL_REGMAP=y +CONFIG_SYSCON=y +CONFIG_SPL_SYSCON=y +# CONFIG_SARADC_ROCKCHIP is not set +CONFIG_SARADC_ROCKCHIP_V2=y +CONFIG_CLK=y +CONFIG_SPL_CLK=y +CONFIG_CLK_SCMI=y +CONFIG_SPL_CLK_SCMI=y +CONFIG_DM_CRYPTO=y +CONFIG_SPL_DM_CRYPTO=y +CONFIG_ROCKCHIP_CRYPTO_V2=y +CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y +CONFIG_DM_RNG=y +CONFIG_RNG_ROCKCHIP=y +CONFIG_SCMI_FIRMWARE=y +CONFIG_SPL_SCMI_FIRMWARE=y +CONFIG_GPIO_HOG=y +CONFIG_ROCKCHIP_GPIO=y +CONFIG_ROCKCHIP_GPIO_V2=y +CONFIG_SYS_I2C_ROCKCHIP=y +CONFIG_I2C_MUX=y +CONFIG_DM_KEY=y +CONFIG_RK8XX_PWRKEY=y +CONFIG_ADC_KEY=y +CONFIG_MISC=y +CONFIG_SPL_MISC=y +CONFIG_MISC_DECOMPRESS=y +CONFIG_SPL_MISC_DECOMPRESS=y +CONFIG_ROCKCHIP_OTP=y +CONFIG_ROCKCHIP_HW_DECOMPRESS=y +CONFIG_SPL_ROCKCHIP_HW_DECOMPRESS=y +CONFIG_SPL_ROCKCHIP_SECURE_OTP=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_ROCKCHIP=y +CONFIG_DM_ETH=y +CONFIG_DM_ETH_PHY=y +CONFIG_DWC_ETH_QOS=y +CONFIG_GMAC_ROCKCHIP=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX=y +CONFIG_PHY_ROCKCHIP_USBDP=y +CONFIG_PINCTRL=y +CONFIG_SPL_PINCTRL=y +CONFIG_DM_FUEL_GAUGE=y +CONFIG_POWER_FG_CW201X=y +CONFIG_POWER_FG_CW221X=y +CONFIG_DM_PMIC=y +CONFIG_PMIC_SPI_RK8XX=y +CONFIG_DM_POWER_DELIVERY=y +CONFIG_TYPEC_TCPM=y +CONFIG_TYPEC_TCPCI=y +CONFIG_TYPEC_HUSB311=y +CONFIG_TYPEC_FUSB302=y +CONFIG_REGULATOR_PWM=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_REGULATOR_RK860X=y +CONFIG_REGULATOR_RK806=y +CONFIG_CHARGER_BQ25700=y +CONFIG_CHARGER_BQ25890=y +CONFIG_CHARGER_SC8551=y +CONFIG_CHARGER_SGM41542=y +CONFIG_DM_CHARGE_DISPLAY=y +CONFIG_CHARGE_ANIMATION=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_RAM=y +CONFIG_SPL_RAM=y +CONFIG_TPL_RAM=y +CONFIG_DM_RAMDISK=y +CONFIG_RAMDISK_RO=y +CONFIG_DM_RESET=y +CONFIG_SPL_DM_RESET=y +CONFIG_SPL_RESET_ROCKCHIP=y +CONFIG_BAUDRATE=1500000 +CONFIG_DEBUG_UART_BASE=0xFEB50000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_DEBUG_UART_SHIFT=2 +CONFIG_SYSRESET=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_DWC3=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_GENERIC=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_GENERIC=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_GADGET=y +CONFIG_USB_DWC3_GENERIC=y +CONFIG_USB_STORAGE=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_MANUFACTURER="Rockchip" +CONFIG_USB_GADGET_VENDOR_NUM=0x2207 +CONFIG_USB_GADGET_PRODUCT_NUM=0x350a +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_DM_VIDEO=y +CONFIG_DISPLAY=y +CONFIG_DRM_ROCKCHIP=y +CONFIG_DRM_MAXIM_MAX96745=y +CONFIG_DRM_MAXIM_MAX96755F=y +CONFIG_DRM_PANEL_MAXIM_DESERIALIZER=y +CONFIG_DRM_ROHM_BU18XL82=y +CONFIG_DRM_ROCKCHIP_DW_HDMI_QP=y +CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI2=y +CONFIG_DRM_ROCKCHIP_DW_DP=y +CONFIG_DRM_ROCKCHIP_ANALOGIX_DP=y +CONFIG_DRM_ROCKCHIP_SAMSUNG_MIPI_DCPHY=y +CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX_HDMI=y +CONFIG_USE_TINY_PRINTF=y +CONFIG_LIB_RAND=y +CONFIG_SPL_TINY_MEMSET=y +CONFIG_RSA=y +CONFIG_SPL_RSA=y +CONFIG_RSA_N_SIZE=0x200 +CONFIG_RSA_E_SIZE=0x10 +CONFIG_RSA_C_SIZE=0x20 +CONFIG_XBC=y +CONFIG_LZ4=y +CONFIG_LZMA=y +CONFIG_ERRNO_STR=y +# CONFIG_EFI_LOADER is not set +CONFIG_AVB_LIBAVB=y +CONFIG_AVB_LIBAVB_AB=y +CONFIG_AVB_LIBAVB_ATX=y +CONFIG_AVB_LIBAVB_USER=y +CONFIG_RK_AVB_LIBAVB_USER=y +CONFIG_OPTEE_CLIENT=y +CONFIG_OPTEE_V2=y +CONFIG_OPTEE_ALWAYS_USE_SECURITY_PARTITION=y diff --git a/u-boot/configs/rk3588_defconfig b/u-boot/configs/rk3588_defconfig index 535e9fb..97a9cb8 100644 --- a/u-boot/configs/rk3588_defconfig +++ b/u-boot/configs/rk3588_defconfig @@ -12,8 +12,6 @@ CONFIG_USING_KERNEL_DTB_V2=y CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y CONFIG_ROCKCHIP_NEW_IDB=y -CONFIG_LOADER_INI="RK3588MINIALL.ini" -CONFIG_TRUST_INI="RK3588TRUST.ini" CONFIG_PSTORE=y CONFIG_SPL_SERIAL_SUPPORT=y CONFIG_SPL_DRIVERS_MISC_SUPPORT=y @@ -45,6 +43,7 @@ CONFIG_SPL_MMC_WRITE=y CONFIG_SPL_MTD_SUPPORT=y CONFIG_SPL_ATF=y +CONFIG_SPL_AB=y CONFIG_FASTBOOT_BUF_ADDR=0xc00800 CONFIG_FASTBOOT_BUF_SIZE=0x07000000 CONFIG_FASTBOOT_FLASH=y @@ -204,14 +203,14 @@ CONFIG_DISPLAY=y CONFIG_DRM_ROCKCHIP=y CONFIG_DRM_MAXIM_MAX96745=y -CONFIG_DRM_MAXIM_MAX96752F=y CONFIG_DRM_MAXIM_MAX96755F=y -CONFIG_DRM_PANEL_MAXIM_DESERIALIZER=y +CONFIG_DRM_PANEL_ROHM_BU18RL82=y +CONFIG_DRM_PANEL_MAXIM_MAX96752F=y CONFIG_DRM_ROHM_BU18XL82=y CONFIG_DRM_ROCKCHIP_DW_HDMI_QP=y CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI2=y -CONFIG_DRM_ROCKCHIP_ANALOGIX_DP=y CONFIG_DRM_ROCKCHIP_DW_DP=y +CONFIG_DRM_ROCKCHIP_ANALOGIX_DP=y CONFIG_DRM_ROCKCHIP_SAMSUNG_MIPI_DCPHY=y CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX_HDMI=y CONFIG_USE_TINY_PRINTF=y diff --git a/u-boot/configs/rv1106-display.config b/u-boot/configs/rv1106-display.config index 842cde0..a03a2bf 100644 --- a/u-boot/configs/rv1106-display.config +++ b/u-boot/configs/rv1106-display.config @@ -48,7 +48,7 @@ # CONFIG_REGULATOR_PWM is not set # CONFIG_REGULATOR_RK860X is not set CONFIG_ROCKCHIP_CUBIC_LUT_SIZE=0 -# CONFIG_ROCKCHIP_DRM_TVE is not set +# CONFIG_DRM_ROCKCHIP_TVE is not set # CONFIG_ROCKCHIP_INNO_HDMI_PHY is not set # CONFIG_SPL_DM_REGULATOR is not set # CONFIG_VIDCONSOLE_AS_LCD is not set diff --git a/u-boot/configs/rv1106-emmc-tb_defconfig b/u-boot/configs/rv1106-emmc-tb_defconfig index 6929db4..c53ddc0 100644 --- a/u-boot/configs/rv1106-emmc-tb_defconfig +++ b/u-boot/configs/rv1106-emmc-tb_defconfig @@ -3,7 +3,7 @@ CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SYS_MALLOC_F_LEN=0x100000 -CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_uboot.sh" +CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_optee.sh" CONFIG_ROCKCHIP_RV1106=y CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0 CONFIG_ROCKCHIP_FIT_IMAGE=y @@ -38,12 +38,12 @@ CONFIG_ANDROID_BOOTLOADER=y CONFIG_ANDROID_BOOT_IMAGE_HASH=y # CONFIG_SKIP_RELOCATE_UBOOT is not set +CONFIG_SPL_ADC_SUPPORT=y CONFIG_SPL_BOARD_INIT=y # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y CONFIG_SPL_MMC_WRITE=y -CONFIG_SPL_OPTEE=y CONFIG_SPL_KERNEL_BOOT=y CONFIG_HUSH_PARSER=y # CONFIG_CMD_BDI is not set @@ -78,14 +78,19 @@ CONFIG_SPL_REGMAP=y CONFIG_SYSCON=y CONFIG_SPL_SYSCON=y -# CONFIG_ADC is not set # CONFIG_SARADC_ROCKCHIP is not set +CONFIG_SARADC_ROCKCHIP_V2=y CONFIG_SPL_BLK_READ_PREPARE=y CONFIG_CLK=y CONFIG_SPL_CLK=y CONFIG_SPL_DM_CRYPTO=y +CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y CONFIG_ROCKCHIP_GPIO=y # CONFIG_DM_I2C is not set +CONFIG_SPL_INPUT=y +CONFIG_DM_KEY=y +CONFIG_ADC_KEY=y +CONFIG_SPL_ADC_KEY=y CONFIG_SPL_MISC=y CONFIG_SPL_MISC_DECOMPRESS=y CONFIG_SPL_ROCKCHIP_HW_DECOMPRESS=y diff --git a/u-boot/configs/rv1106-optee.config b/u-boot/configs/rv1106-optee.config new file mode 100644 index 0000000..dc76adc --- /dev/null +++ b/u-boot/configs/rv1106-optee.config @@ -0,0 +1,5 @@ +CONFIG_BASE_DEFCONFIG="rv1106_defconfig" +CONFIG_OPTEE_CLIENT=y +CONFIG_OPTEE_V2=y +CONFIG_SPL_FIT_IMAGE_KB=512 +CONFIG_SPL_OPTEE=y diff --git a/u-boot/configs/rv1106-spi-nor-tb_defconfig b/u-boot/configs/rv1106-spi-nor-tb_defconfig index d518921..e80759e 100644 --- a/u-boot/configs/rv1106-spi-nor-tb_defconfig +++ b/u-boot/configs/rv1106-spi-nor-tb_defconfig @@ -3,7 +3,7 @@ CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SYS_MALLOC_F_LEN=0x80000 -CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_uboot.sh" +CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_optee.sh" CONFIG_ROCKCHIP_RV1106=y CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0 CONFIG_ROCKCHIP_FIT_IMAGE=y @@ -38,13 +38,13 @@ CONFIG_ANDROID_BOOTLOADER=y CONFIG_ANDROID_BOOT_IMAGE_HASH=y # CONFIG_SKIP_RELOCATE_UBOOT is not set +CONFIG_SPL_ADC_SUPPORT=y CONFIG_SPL_BOARD_INIT=y # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y CONFIG_SPL_MTD_SUPPORT=y CONFIG_MTD_BLK_U_BOOT_OFFS=0x200 -CONFIG_SPL_OPTEE=y CONFIG_SPL_KERNEL_BOOT=y CONFIG_HUSH_PARSER=y # CONFIG_CMD_BDI is not set @@ -81,8 +81,8 @@ CONFIG_SPL_REGMAP=y CONFIG_SYSCON=y CONFIG_SPL_SYSCON=y -# CONFIG_ADC is not set # CONFIG_SARADC_ROCKCHIP is not set +CONFIG_SARADC_ROCKCHIP_V2=y CONFIG_SPL_BLK_READ_PREPARE=y CONFIG_CLK=y CONFIG_SPL_CLK=y @@ -90,6 +90,10 @@ CONFIG_SPL_ROCKCHIP_CRYPTO_V2=y CONFIG_ROCKCHIP_GPIO=y # CONFIG_DM_I2C is not set +CONFIG_SPL_INPUT=y +CONFIG_DM_KEY=y +CONFIG_ADC_KEY=y +CONFIG_SPL_ADC_KEY=y CONFIG_SPL_MISC=y CONFIG_SPL_MISC_DECOMPRESS=y CONFIG_SPL_ROCKCHIP_HW_DECOMPRESS=y @@ -104,6 +108,7 @@ CONFIG_SPI_FLASH_GIGADEVICE=y CONFIG_SPI_FLASH_MACRONIX=y CONFIG_SPI_FLASH_WINBOND=y +CONFIG_SPI_FLASH_XMC=y CONFIG_SPI_FLASH_MTD=y CONFIG_PINCTRL=y # CONFIG_DM_REGULATOR is not set diff --git a/u-boot/configs/rv1106-spi-nor_defconfig b/u-boot/configs/rv1106-spi-nor_defconfig index 47e94ac..d269443 100644 --- a/u-boot/configs/rv1106-spi-nor_defconfig +++ b/u-boot/configs/rv1106-spi-nor_defconfig @@ -3,7 +3,7 @@ CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SYS_MALLOC_F_LEN=0x80000 -CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_uboot.sh" +CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_optee.sh" CONFIG_ROCKCHIP_RV1106=y CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0 # CONFIG_ROCKCHIP_RESOURCE_IMAGE is not set @@ -30,7 +30,7 @@ CONFIG_SPL_FIT_IMAGE_POST_PROCESS=y CONFIG_SPL_FIT_HW_CRYPTO=y # CONFIG_SPL_SYS_DCACHE_OFF is not set -CONFIG_SPL_FIT_IMAGE_KB=128 +CONFIG_SPL_FIT_IMAGE_KB=192 CONFIG_SPL_FIT_IMAGE_MULTIPLE=1 CONFIG_BOOTDELAY=0 CONFIG_SYS_CONSOLE_INFO_QUIET=y @@ -40,9 +40,7 @@ # CONFIG_SPL_RAW_IMAGE_SUPPORT is not set # CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y -CONFIG_SPL_MMC_WRITE=y CONFIG_SPL_MTD_SUPPORT=y -CONFIG_SPL_OPTEE=y # CONFIG_CMD_BDI is not set # CONFIG_CMD_CONSOLE is not set CONFIG_CMD_BOOTZ=y @@ -63,12 +61,11 @@ CONFIG_RANDOM_UUID=y # CONFIG_CMD_LOADB is not set # CONFIG_CMD_LOADS is not set -CONFIG_CMD_PART=y +CONFIG_CMD_MTD=y # CONFIG_CMD_ITEST is not set CONFIG_CMD_SCRIPT_UPDATE=y # CONFIG_CMD_SOURCE is not set # CONFIG_CMD_SETEXPR is not set -CONFIG_CMD_TFTP_BOOTM=y CONFIG_CMD_TFTP_FLASH=y CONFIG_CMD_DHCP=y # CONFIG_CMD_NFS is not set @@ -154,5 +151,4 @@ CONFIG_RSA_E_SIZE=0x10 CONFIG_RSA_C_SIZE=0x20 CONFIG_SPL_LZMA=y -CONFIG_SPL_GZIP=y # CONFIG_EFI_LOADER is not set diff --git a/u-boot/configs/rv1106-usb.config b/u-boot/configs/rv1106-usb.config new file mode 100644 index 0000000..dc589f0 --- /dev/null +++ b/u-boot/configs/rv1106-usb.config @@ -0,0 +1,17 @@ +CONFIG_DM_REGULATOR=y +CONFIG_DM_REGULATOR_FIXED=y +CONFIG_DM_REGULATOR_GPIO=y +CONFIG_CMD_USB=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_GENERIC=y +CONFIG_USB_STORAGE=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +# CONFIG_FASTBOOT is not set +CONFIG_USB_DWC3_GADGET=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_USB_GADGET_MANUFACTURER="Rockchip" +CONFIG_USB_GADGET_PRODUCT_NUM=0x110c +CONFIG_USB_GADGET_VENDOR_NUM=0x2207 diff --git a/u-boot/configs/rv1106_defconfig b/u-boot/configs/rv1106_defconfig index e797553..9b20bcf 100644 --- a/u-boot/configs/rv1106_defconfig +++ b/u-boot/configs/rv1106_defconfig @@ -4,7 +4,7 @@ CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SYS_MALLOC_F_LEN=0x80000 -CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_uboot.sh" +CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-rockchip/make_fit_optee.sh" CONFIG_ROCKCHIP_RV1106=y CONFIG_ROCKCHIP_SPL_RESERVE_IRAM=0x0 CONFIG_ROCKCHIP_FIT_IMAGE=y @@ -41,7 +41,6 @@ CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_PARTITION=y CONFIG_SPL_MMC_WRITE=y CONFIG_SPL_MTD_SUPPORT=y -CONFIG_SPL_OPTEE=y CONFIG_HUSH_PARSER=y # CONFIG_CMD_BDI is not set # CONFIG_CMD_CONSOLE is not set diff --git a/u-boot/configs/rv1126-bat-spi-nor-tb.config b/u-boot/configs/rv1126-bat-spi-nor-tb.config index 699d8d0..997a6c2 100644 --- a/u-boot/configs/rv1126-bat-spi-nor-tb.config +++ b/u-boot/configs/rv1126-bat-spi-nor-tb.config @@ -2,6 +2,6 @@ # CONFIG_MMC is not set CONFIG_BASE_DEFCONFIG="rv1126-spi-nor-tb.config" CONFIG_DEFAULT_DEVICE_TREE="rv1126-bat-evb" -CONFIG_LOADER_INI="RV1126MINIALL_LP4_EMMC_TB.ini" +CONFIG_LOADER_INI="RV1126MINIALL_SPI_NOR_TB.ini" CONFIG_OF_LIST="rv1126-bat-evb" CONFIG_SPL_FIT_IMAGE_KB=320 diff --git a/u-boot/configs/rv1126-ipc.config b/u-boot/configs/rv1126-ipc.config index 4ab7a51..d4457a0 100644 --- a/u-boot/configs/rv1126-ipc.config +++ b/u-boot/configs/rv1126-ipc.config @@ -4,9 +4,11 @@ # CONFIG_EFI_PARTITION is not set CONFIG_ENVF_LIST="blkdevparts mtdparts sys_bootargs app reserved ipaddr serverip netmask gatewayip ethaddr" CONFIG_ENVF=y +CONFIG_ENV_PARTITION=y CONFIG_LOADER_INI="RV1126MINIALL_IPC.ini" # CONFIG_SPL_EFI_PARTITION is not set CONFIG_SPL_ENVF=y +CONFIG_SPL_ENV_PARTITION=y CONFIG_NETDEVICES=y CONFIG_GMAC_ROCKCHIP=y CONFIG_DWC_ETH_QOS=y diff --git a/u-boot/configs/rv1126-spi-nor-tiny_defconfig b/u-boot/configs/rv1126-spi-nor-tiny_defconfig index b34446d..eecc02a 100644 --- a/u-boot/configs/rv1126-spi-nor-tiny_defconfig +++ b/u-boot/configs/rv1126-spi-nor-tiny_defconfig @@ -126,6 +126,7 @@ CONFIG_ROCKCHIP_SFC=y CONFIG_SYSRESET=y CONFIG_USE_TINY_PRINTF=y +CONFIG_LIB_RAND=y CONFIG_SPL_TINY_MEMSET=y CONFIG_ERRNO_STR=y # CONFIG_EFI_LOADER is not set diff --git a/u-boot/disk/Kconfig b/u-boot/disk/Kconfig index cbc2514..cfc6ae8 100644 --- a/u-boot/disk/Kconfig +++ b/u-boot/disk/Kconfig @@ -137,15 +137,15 @@ config ENV_PARTITION bool "Enable ENV partition table support" - depends on PARTITIONS && ENVF - default y + depends on PARTITIONS + default y if ENVF help Say Y here if you would like to use ENV partition table. config SPL_ENV_PARTITION bool "Enable ENV partition table support in SPL" - depends on SPL && PARTITIONS && SPL_ENVF - default y + depends on SPL && PARTITIONS + default y if SPL_ENVF help Say Y here if you would like to use ENV partition table in SPL. diff --git a/u-boot/disk/part.c b/u-boot/disk/part.c index 116a1ae..182c037 100644 --- a/u-boot/disk/part.c +++ b/u-boot/disk/part.c @@ -684,8 +684,9 @@ disk_partition_t *info, bool strict) { + __maybe_unused char name_slot[32] = {0}; struct part_driver *part_drv; - char name_slot[32] = {0}; + const char *full_name = name; int none_slot_try = 1; int ret, i; @@ -695,37 +696,35 @@ if (strict) { none_slot_try = 0; - strcpy(name_slot, name); goto lookup; } + /* 1. Query partition with A/B slot suffix */ #if defined(CONFIG_ANDROID_AB) || defined(CONFIG_SPL_AB) - char *name_suffix = (char *)name + strlen(name) - 2; + char *slot = (char *)name + strlen(name) - 2; - /* Fix can not find partition with suffix "_a" & "_b". If with them, clear */ - if (!memcmp(name_suffix, "_a", strlen("_a")) || - !memcmp(name_suffix, "_b", strlen("_b"))) - memset(name_suffix, 0, 2); + if (!strcmp(slot, "_a") || !strcmp(slot, "_b")) + goto lookup; #endif #if defined(CONFIG_ANDROID_AB) && !defined(CONFIG_SPL_BUILD) - /* 1. Query partition with A/B slot suffix */ if (rk_avb_append_part_slot(name, name_slot)) return -1; + full_name = name_slot; #elif defined(CONFIG_SPL_AB) && defined(CONFIG_SPL_BUILD) if (spl_ab_append_part_slot(dev_desc, name, name_slot)) return -1; -#else - strcpy(name_slot, name); + full_name = name_slot; #endif + lookup: - debug("## Query partition(%d): %s\n", none_slot_try, name_slot); + debug("## Query partition(%d): %s\n", none_slot_try, full_name); for (i = 1; i < part_drv->max_entries; i++) { ret = part_drv->get_info(dev_desc, i, info); if (ret != 0) { /* no more entries in table */ break; } - if (strcmp(name_slot, (const char *)info->name) == 0) { + if (strcmp(full_name, (const char *)info->name) == 0) { /* matched */ return i; } @@ -734,7 +733,7 @@ /* 2. Query partition without A/B slot suffix if above failed */ if (none_slot_try) { none_slot_try = 0; - strcpy(name_slot, name); + full_name = name; goto lookup; } diff --git a/u-boot/disk/part_efi.c b/u-boot/disk/part_efi.c index 27f3e4d..d4d03de 100644 --- a/u-boot/disk/part_efi.c +++ b/u-boot/disk/part_efi.c @@ -368,7 +368,7 @@ if (gpt_pte[i - 1].ending_lba <= (dev_desc->lba - 0x22)) return; /* The last partition size need align to 4KB, here align to 32KB. */ - gpt_pte[i - 1].ending_lba = dev_desc->lba - 0x40; + gpt_pte[i - 1].ending_lba = dev_desc->lba - 0x41; calc_crc32 = efi_crc32((const unsigned char *)gpt_pte, le32_to_cpu(gpt_head->num_partition_entries) * le32_to_cpu(gpt_head->sizeof_partition_entry)); @@ -963,7 +963,8 @@ dev_desc->blksz); if ((le64_to_cpu(gpt_h->alternate_lba) + 1) - != cpu_to_le64(dev_desc->lba)) { + != cpu_to_le64(dev_desc->lba) && + le64_to_cpu(gpt_h->last_usable_lba) != FACTORY_UNKNOWN_LBA) { printf("%s: failed checking '%s'\n", __func__, "invalid GPT Disk Size"); return -1; diff --git a/u-boot/disk/part_env.c b/u-boot/disk/part_env.c index cb4a903..53c8b39 100644 --- a/u-boot/disk/part_env.c +++ b/u-boot/disk/part_env.c @@ -82,14 +82,7 @@ #if CONFIG_IS_ENABLED(ENVF) parts_list = envf_get_part_table(dev_desc); #else - const char *parts_prefix[] = { "mtdparts", "blkdevparts", }; - int i; - - for (i = 0; i < ARRAY_SIZE(parts_prefix); i++) { - parts_list = env_get(parts_prefix[i]); - if (parts_list) - break; - } + parts_list = ENV_PARTITIONS; #endif if (!parts_list) return -EINVAL; diff --git a/u-boot/drivers/Kconfig b/u-boot/drivers/Kconfig index 21ed0cf..8926208 100644 --- a/u-boot/drivers/Kconfig +++ b/u-boot/drivers/Kconfig @@ -102,6 +102,8 @@ source "drivers/usb/Kconfig" +source "drivers/ufs/Kconfig" + source "drivers/video/Kconfig" source "drivers/watchdog/Kconfig" diff --git a/u-boot/drivers/Makefile b/u-boot/drivers/Makefile index 3a9a55a..85c45f4 100644 --- a/u-boot/drivers/Makefile +++ b/u-boot/drivers/Makefile @@ -20,6 +20,7 @@ obj-$(CONFIG_$(SPL_TPL_)SPI_SUPPORT) += spi/ obj-$(CONFIG_$(SPL_TPL_)TIMER) += timer/ obj-$(CONFIG_$(SPL_TPL_)IRQ) += irq/ +obj-$(CONFIG_$(SPL_TPL_)DM_VIDEO) += video/ ifndef CONFIG_TPL_BUILD ifdef CONFIG_SPL_BUILD @@ -101,7 +102,6 @@ obj-y += spmi/ obj-y += sysreset/ obj-y += tpm/ -obj-y += video/ obj-y += watchdog/ obj-$(CONFIG_QE) += qe/ obj-$(CONFIG_U_QE) += qe/ @@ -113,6 +113,7 @@ obj-y += soc/ obj-$(CONFIG_REMOTEPROC) += remoteproc/ obj-y += thermal/ +obj-y += ufs/ obj-$(CONFIG_MACH_PIC32) += ddr/microchip/ endif diff --git a/u-boot/drivers/adc/rockchip-saradc-v2.c b/u-boot/drivers/adc/rockchip-saradc-v2.c index c97142e..52fa2e4 100644 --- a/u-boot/drivers/adc/rockchip-saradc-v2.c +++ b/u-boot/drivers/adc/rockchip-saradc-v2.c @@ -181,6 +181,9 @@ if (IS_ERR_VALUE(ret)) return ret; + /* Wait until pll stable */ + mdelay(5); + priv->active_channel = -1; return 0; @@ -220,9 +223,35 @@ .clk_rate = 1000000, }; +static const struct rockchip_saradc_data rk3562_saradc_data = { + .num_bits = 10, + .num_channels = 8, + .clk_rate = 1000000, +}; + +static const struct rockchip_saradc_data rk1106_saradc_data = { + .num_bits = 10, + .num_channels = 2, + .clk_rate = 1000000, +}; + static const struct udevice_id rockchip_saradc_ids[] = { - { .compatible = "rockchip,rk3588-saradc", - .data = (ulong)&rk3588_saradc_data }, + { + .compatible = "rockchip,rk3588-saradc", + .data = (ulong)&rk3588_saradc_data + }, + { + .compatible = "rockchip,rk3528-saradc", + .data = (ulong)&rk3588_saradc_data + }, + { + .compatible = "rockchip,rk3562-saradc", + .data = (ulong)&rk3562_saradc_data + }, + { + .compatible = "rockchip,rv1106-saradc", + .data = (ulong)&rk1106_saradc_data + }, { } }; diff --git a/u-boot/drivers/clk/clk-uclass.c b/u-boot/drivers/clk/clk-uclass.c index a4938c1..0737c3d 100644 --- a/u-boot/drivers/clk/clk-uclass.c +++ b/u-boot/drivers/clk/clk-uclass.c @@ -237,10 +237,11 @@ { int ret; +#ifndef CONFIG_SPL_BUILD /* If this is running pre-reloc state, don't take any action. */ if (!(gd->flags & GD_FLG_RELOC)) return 0; - +#endif debug("%s(%s)\n", __func__, dev_read_name(dev)); ret = clk_set_default_parents(dev); diff --git a/u-boot/drivers/clk/rockchip/Makefile b/u-boot/drivers/clk/rockchip/Makefile index 260b24e..80b20a2 100644 --- a/u-boot/drivers/clk/rockchip/Makefile +++ b/u-boot/drivers/clk/rockchip/Makefile @@ -17,6 +17,8 @@ obj-$(CONFIG_ROCKCHIP_RK3328) += clk_rk3328.o obj-$(CONFIG_ROCKCHIP_RK3368) += clk_rk3368.o obj-$(CONFIG_ROCKCHIP_RK3399) += clk_rk3399.o +obj-$(CONFIG_ROCKCHIP_RK3528) += clk_rk3528.o +obj-$(CONFIG_ROCKCHIP_RK3562) += clk_rk3562.o obj-$(CONFIG_ROCKCHIP_RK3568) += clk_rk3568.o obj-$(CONFIG_ROCKCHIP_RK3588) += clk_rk3588.o obj-$(CONFIG_ROCKCHIP_RV1106) += clk_rv1106.o diff --git a/u-boot/drivers/clk/rockchip/clk_pll.c b/u-boot/drivers/clk/rockchip/clk_pll.c index 3c1ee9d..056ffaa 100644 --- a/u-boot/drivers/clk/rockchip/clk_pll.c +++ b/u-boot/drivers/clk/rockchip/clk_pll.c @@ -267,9 +267,11 @@ * When power on or changing PLL setting, * we must force PLL into slow mode to ensure output stable clock. */ - rk_clrsetreg(base + pll->mode_offset, - pll->mode_mask << pll->mode_shift, - RKCLK_PLL_MODE_SLOW << pll->mode_shift); + if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE)) { + rk_clrsetreg(base + pll->mode_offset, + pll->mode_mask << pll->mode_shift, + RKCLK_PLL_MODE_SLOW << pll->mode_shift); + } /* Power down */ rk_setreg(base + pll->con_offset + 0x4, @@ -308,8 +310,11 @@ if (!(readl(base + pll->con_offset + 0x4) & (1 << pll->lock_shift))) printf("%s: wait pll lock timeout! pll_id=%ld\n", __func__, pll_id); - rk_clrsetreg(base + pll->mode_offset, pll->mode_mask << pll->mode_shift, - RKCLK_PLL_MODE_NORMAL << pll->mode_shift); + if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE)) { + rk_clrsetreg(base + pll->mode_offset, pll->mode_mask << pll->mode_shift, + RKCLK_PLL_MODE_NORMAL << pll->mode_shift); + } + debug("PLL at %p: con0=%x con1= %x con2= %x mode= %x\n", pll, readl(base + pll->con_offset), readl(base + pll->con_offset + 0x4), @@ -325,12 +330,18 @@ u32 refdiv, fbdiv, postdiv1, postdiv2, dsmpd, frac; u32 con = 0, shift, mask; ulong rate; + int mode; con = readl(base + pll->mode_offset); shift = pll->mode_shift; mask = pll->mode_mask << shift; - switch ((con & mask) >> shift) { + if (!(pll->pll_flags & ROCKCHIP_PLL_FIXED_MODE)) + mode = (con & mask) >> shift; + else + mode = RKCLK_PLL_MODE_NORMAL; + + switch (mode) { case RKCLK_PLL_MODE_SLOW: return OSC_HZ; case RKCLK_PLL_MODE_NORMAL: diff --git a/u-boot/drivers/clk/rockchip/clk_rk3399.c b/u-boot/drivers/clk/rockchip/clk_rk3399.c index cce0b48..7fecd68 100644 --- a/u-boot/drivers/clk/rockchip/clk_rk3399.c +++ b/u-boot/drivers/clk/rockchip/clk_rk3399.c @@ -773,6 +773,10 @@ ACLK_VOP_PLL_SEL_MASK | ACLK_VOP_DIV_CON_MASK, ACLK_VOP_PLL_SEL_GPLL << ACLK_VOP_PLL_SEL_SHIFT | (div - 1) << ACLK_VOP_DIV_CON_SHIFT); + rk_clrsetreg(&cru->clksel_con[42], + ACLK_VOP_PLL_SEL_MASK | ACLK_VOP_DIV_CON_MASK, + ACLK_VOP_PLL_SEL_GPLL << ACLK_VOP_PLL_SEL_SHIFT | + (div - 1) << ACLK_VOP_DIV_CON_SHIFT); if (readl(dclkreg_addr) & DCLK_VOP_PLL_SEL_MASK) { if (pll_para_config(hz, &cpll_config)) diff --git a/u-boot/drivers/clk/rockchip/clk_rk3528.c b/u-boot/drivers/clk/rockchip/clk_rk3528.c new file mode 100644 index 0000000..ada7dd4 --- /dev/null +++ b/u-boot/drivers/clk/rockchip/clk_rk3528.c @@ -0,0 +1,2145 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2022 Fuzhou Rockchip Electronics Co., Ltd + * Author: Joseph Chen <chenjh@rock-chips.com> + */ + +#include <common.h> +#include <clk-uclass.h> +#include <dm.h> +#include <syscon.h> +#include <asm/arch/clock.h> +#include <asm/arch/cru_rk3528.h> +#include <asm/arch/grf_rk3528.h> +#include <asm/arch/hardware.h> +#include <asm/io.h> +#include <dm/lists.h> +#include <dt-bindings/clock/rk3528-cru.h> + +DECLARE_GLOBAL_DATA_PTR; + +#define DIV_TO_RATE(input_rate, div) ((input_rate) / ((div) + 1)) + +/* + * PLL attention. + * + * [FRAC PLL]: GPLL, PPLL, DPLL + * - frac mode: refdiv can be 1 or 2 only + * - int mode: refdiv has no special limit + * - VCO range: [950, 3800] MHZ + * + * [INT PLL]: CPLL, APLL + * - int mode: refdiv can be 1 or 2 only + * - VCO range: [475, 1900] MHZ + * + * [PPLL]: normal mode only. + * + */ +static struct rockchip_pll_rate_table rk3528_pll_rates[] = { + /* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */ + RK3036_PLL_RATE(1896000000, 1, 79, 1, 1, 1, 0), + RK3036_PLL_RATE(1800000000, 1, 75, 1, 1, 1, 0), + RK3036_PLL_RATE(1704000000, 1, 71, 1, 1, 1, 0), + RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0), + RK3036_PLL_RATE(1512000000, 1, 63, 1, 1, 1, 0), + RK3036_PLL_RATE(1416000000, 1, 59, 1, 1, 1, 0), + RK3036_PLL_RATE(1296000000, 1, 54, 1, 1, 1, 0), + RK3036_PLL_RATE(1200000000, 1, 50, 1, 1, 1, 0), + RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0), /* GPLL */ + RK3036_PLL_RATE(1092000000, 2, 91, 1, 1, 1, 0), + RK3036_PLL_RATE(1008000000, 1, 42, 1, 1, 1, 0), + RK3036_PLL_RATE(1000000000, 1, 125, 3, 1, 1, 0), /* PPLL */ + RK3036_PLL_RATE(996000000, 2, 83, 1, 1, 1, 0), /* CPLL */ + RK3036_PLL_RATE(960000000, 1, 40, 1, 1, 1, 0), + RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0), + RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0), + RK3036_PLL_RATE(600000000, 1, 50, 2, 1, 1, 0), + RK3036_PLL_RATE(594000000, 2, 99, 2, 1, 1, 0), + RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0), + RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0), + RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0), + RK3036_PLL_RATE(96000000, 1, 24, 3, 2, 1, 0), + { /* sentinel */ }, +}; + +static struct rockchip_pll_clock rk3528_pll_clks[] = { + [APLL] = PLL(pll_rk3328, PLL_APLL, RK3528_PLL_CON(0), + RK3528_MODE_CON, 0, 10, 0, rk3528_pll_rates), + + [CPLL] = PLL(pll_rk3328, PLL_CPLL, RK3528_PLL_CON(8), + RK3528_MODE_CON, 2, 10, 0, rk3528_pll_rates), + + [GPLL] = PLL(pll_rk3328, PLL_GPLL, RK3528_PLL_CON(24), + RK3528_MODE_CON, 4, 10, 0, rk3528_pll_rates), + + [PPLL] = PLL(pll_rk3328, PLL_PPLL, RK3528_PCIE_PLL_CON(32), + RK3528_MODE_CON, 6, 10, ROCKCHIP_PLL_FIXED_MODE, rk3528_pll_rates), + + [DPLL] = PLL(pll_rk3328, PLL_DPLL, RK3528_DDRPHY_PLL_CON(16), + RK3528_DDRPHY_MODE_CON, 0, 10, 0, rk3528_pll_rates), +}; + +#define RK3528_CPUCLK_RATE(_rate, _aclk_m_core, _pclk_dbg) \ +{ \ + .rate = _rate##U, \ + .aclk_div = (_aclk_m_core), \ + .pclk_div = (_pclk_dbg), \ +} + +/* sign-off: _aclk_m_core: 550M, _pclk_dbg: 137.5M, */ +static struct rockchip_cpu_rate_table rk3528_cpu_rates[] = { + RK3528_CPUCLK_RATE(1896000000, 1, 13), + RK3528_CPUCLK_RATE(1800000000, 1, 12), + RK3528_CPUCLK_RATE(1704000000, 1, 11), + RK3528_CPUCLK_RATE(1608000000, 1, 11), + RK3528_CPUCLK_RATE(1512000000, 1, 11), + RK3528_CPUCLK_RATE(1416000000, 1, 9), + RK3528_CPUCLK_RATE(1296000000, 1, 8), + RK3528_CPUCLK_RATE(1200000000, 1, 8), + RK3528_CPUCLK_RATE(1188000000, 1, 8), + RK3528_CPUCLK_RATE(1092000000, 1, 7), + RK3528_CPUCLK_RATE(1008000000, 1, 6), + RK3528_CPUCLK_RATE(1000000000, 1, 6), + RK3528_CPUCLK_RATE(996000000, 1, 6), + RK3528_CPUCLK_RATE(960000000, 1, 6), + RK3528_CPUCLK_RATE(912000000, 1, 6), + RK3528_CPUCLK_RATE(816000000, 1, 5), + RK3528_CPUCLK_RATE(600000000, 1, 3), + RK3528_CPUCLK_RATE(594000000, 1, 3), + RK3528_CPUCLK_RATE(408000000, 1, 2), + RK3528_CPUCLK_RATE(312000000, 1, 2), + RK3528_CPUCLK_RATE(216000000, 1, 1), + RK3528_CPUCLK_RATE(96000000, 1, 0), +}; + +#ifndef CONFIG_SPL_BUILD +#define RK3528_CLK_DUMP(_id, _name) \ +{ \ + .id = _id, \ + .name = _name, \ +} + +static const struct rk3528_clk_info clks_dump[] = { + RK3528_CLK_DUMP(PLL_APLL, "apll"), + RK3528_CLK_DUMP(PLL_GPLL, "gpll"), + RK3528_CLK_DUMP(PLL_CPLL, "cpll"), + RK3528_CLK_DUMP(PLL_DPLL, "dpll"), + RK3528_CLK_DUMP(PLL_PPLL, "ppll"), + RK3528_CLK_DUMP(CLK_MATRIX_50M_SRC, "clk_50m"), + RK3528_CLK_DUMP(CLK_MATRIX_100M_SRC, "clk_100m"), + RK3528_CLK_DUMP(CLK_MATRIX_150M_SRC, "clk_150m"), + RK3528_CLK_DUMP(CLK_MATRIX_200M_SRC, "clk_200m"), + RK3528_CLK_DUMP(CLK_MATRIX_250M_SRC, "clk_250m"), + RK3528_CLK_DUMP(CLK_MATRIX_300M_SRC, "clk_300m"), + RK3528_CLK_DUMP(CLK_MATRIX_339M_SRC, "clk_339m"), + RK3528_CLK_DUMP(CLK_MATRIX_400M_SRC, "clk_400m"), + RK3528_CLK_DUMP(CLK_MATRIX_500M_SRC, "clk_500m"), + RK3528_CLK_DUMP(CLK_MATRIX_600M_SRC, "clk_600m"), + RK3528_CLK_DUMP(CLK_PPLL_50M_MATRIX, "clk_ppll_50m"), + RK3528_CLK_DUMP(CLK_PPLL_100M_MATRIX, "clk_ppll_100m"), + RK3528_CLK_DUMP(CLK_PPLL_125M_MATRIX, "clk_ppll_125m"), +}; +#endif + +/* + * + * rational_best_approximation(31415, 10000, + * (1 << 8) - 1, (1 << 5) - 1, &n, &d); + * + * you may look at given_numerator as a fixed point number, + * with the fractional part size described in given_denominator. + * + * for theoretical background, see: + * http://en.wikipedia.org/wiki/Continued_fraction + */ +static void rational_best_approximation(unsigned long given_numerator, + unsigned long given_denominator, + unsigned long max_numerator, + unsigned long max_denominator, + unsigned long *best_numerator, + unsigned long *best_denominator) +{ + unsigned long n, d, n0, d0, n1, d1; + + n = given_numerator; + d = given_denominator; + n0 = 0; + d1 = 0; + n1 = 1; + d0 = 1; + for (;;) { + unsigned long t, a; + + if (n1 > max_numerator || d1 > max_denominator) { + n1 = n0; + d1 = d0; + break; + } + if (d == 0) + break; + t = d; + a = n / d; + d = n % d; + n = t; + t = n0 + a * n1; + n0 = n1; + n1 = t; + t = d0 + a * d1; + d0 = d1; + d1 = t; + } + *best_numerator = n1; + *best_denominator = d1; +} + +static int rk3528_armclk_set_clk(struct rk3528_clk_priv *priv, ulong new_rate) +{ + const struct rockchip_cpu_rate_table *rate; + struct rk3528_cru *cru = priv->cru; + ulong old_rate; + + rate = rockchip_get_cpu_settings(rk3528_cpu_rates, new_rate); + if (!rate) { + printf("%s unsupported rate\n", __func__); + return -EINVAL; + } + + /* + * set up dependent divisors for DBG and ACLK clocks. + */ + old_rate = rockchip_pll_get_rate(&rk3528_pll_clks[APLL], priv->cru, APLL); + if (old_rate > new_rate) { + if (rockchip_pll_set_rate(&rk3528_pll_clks[APLL], + priv->cru, APLL, new_rate)) + return -EINVAL; + + rk_clrsetreg(&cru->clksel_con[40], RK3528_DIV_PCLK_DBG_MASK, + rate->pclk_div << RK3528_DIV_PCLK_DBG_SHIFT); + + rk_clrsetreg(&cru->clksel_con[39], RK3528_DIV_ACLK_M_CORE_MASK, + rate->aclk_div << RK3528_DIV_ACLK_M_CORE_SHIFT); + } else if (old_rate < new_rate) { + rk_clrsetreg(&cru->clksel_con[40], RK3528_DIV_PCLK_DBG_MASK, + rate->pclk_div << RK3528_DIV_PCLK_DBG_SHIFT); + + rk_clrsetreg(&cru->clksel_con[39], RK3528_DIV_ACLK_M_CORE_MASK, + rate->aclk_div << RK3528_DIV_ACLK_M_CORE_SHIFT); + + if (rockchip_pll_set_rate(&rk3528_pll_clks[APLL], + priv->cru, APLL, new_rate)) + return -EINVAL; + } + + return 0; +} + +static ulong rk3528_ppll_matrix_get_rate(struct rk3528_clk_priv *priv, + ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 div, mask, shift; + void *reg; + + switch (clk_id) { + case CLK_PPLL_50M_MATRIX: + case CLK_GMAC1_RMII_VPU: + mask = PCIE_CLK_MATRIX_50M_SRC_DIV_MASK; + shift = PCIE_CLK_MATRIX_50M_SRC_DIV_SHIFT; + reg = &cru->pcieclksel_con[1]; + break; + + case CLK_PPLL_100M_MATRIX: + mask = PCIE_CLK_MATRIX_100M_SRC_DIV_MASK; + shift = PCIE_CLK_MATRIX_100M_SRC_DIV_SHIFT; + reg = &cru->pcieclksel_con[1]; + break; + + case CLK_PPLL_125M_MATRIX: + case CLK_GMAC1_SRC_VPU: + mask = CLK_MATRIX_125M_SRC_DIV_MASK; + shift = CLK_MATRIX_125M_SRC_DIV_SHIFT; + reg = &cru->clksel_con[60]; + break; + + case CLK_GMAC1_VPU_25M: + mask = CLK_MATRIX_25M_SRC_DIV_MASK; + shift = CLK_MATRIX_25M_SRC_DIV_SHIFT; + reg = &cru->clksel_con[60]; + break; + default: + return -ENOENT; + } + + div = (readl(reg) & mask) >> shift; + + return DIV_TO_RATE(priv->ppll_hz, div); +} + +static ulong rk3528_ppll_matrix_set_rate(struct rk3528_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, div, mask, shift; + u8 is_pciecru = 0; + + switch (clk_id) { + case CLK_PPLL_50M_MATRIX: + id = 1; + mask = PCIE_CLK_MATRIX_50M_SRC_DIV_MASK; + shift = PCIE_CLK_MATRIX_50M_SRC_DIV_SHIFT; + is_pciecru = 1; + break; + + case CLK_PPLL_100M_MATRIX: + id = 1; + mask = PCIE_CLK_MATRIX_100M_SRC_DIV_MASK; + shift = PCIE_CLK_MATRIX_100M_SRC_DIV_SHIFT; + is_pciecru = 1; + break; + + case CLK_PPLL_125M_MATRIX: + id = 60; + mask = CLK_MATRIX_125M_SRC_DIV_MASK; + shift = CLK_MATRIX_125M_SRC_DIV_SHIFT; + break; + case CLK_GMAC1_VPU_25M: + id = 60; + mask = CLK_MATRIX_25M_SRC_DIV_MASK; + shift = CLK_MATRIX_25M_SRC_DIV_SHIFT; + break; + default: + return -ENOENT; + } + + div = DIV_ROUND_UP(priv->ppll_hz, rate); + if (is_pciecru) + rk_clrsetreg(&cru->pcieclksel_con[id], mask, (div - 1) << shift); + else + rk_clrsetreg(&cru->clksel_con[id], mask, (div - 1) << shift); + + return rk3528_ppll_matrix_get_rate(priv, clk_id); +} + +static ulong rk3528_cgpll_matrix_get_rate(struct rk3528_clk_priv *priv, + ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 sel, div, mask, shift, con; + u32 sel_mask = 0, sel_shift; + u8 is_gpll_parent = 1; + u8 is_halfdiv = 0; + ulong prate; + + switch (clk_id) { + case CLK_MATRIX_50M_SRC: + con = 0; + mask = CLK_MATRIX_50M_SRC_DIV_MASK; + shift = CLK_MATRIX_50M_SRC_DIV_SHIFT; + is_gpll_parent = 0; + break; + + case CLK_MATRIX_100M_SRC: + con = 0; + mask = CLK_MATRIX_100M_SRC_DIV_MASK; + shift = CLK_MATRIX_100M_SRC_DIV_SHIFT; + is_gpll_parent = 0; + break; + + case CLK_MATRIX_150M_SRC: + con = 1; + mask = CLK_MATRIX_150M_SRC_DIV_MASK; + shift = CLK_MATRIX_150M_SRC_DIV_SHIFT; + break; + + case CLK_MATRIX_200M_SRC: + con = 1; + mask = CLK_MATRIX_200M_SRC_DIV_MASK; + shift = CLK_MATRIX_200M_SRC_DIV_SHIFT; + break; + + case CLK_MATRIX_250M_SRC: + con = 1; + mask = CLK_MATRIX_250M_SRC_DIV_MASK; + shift = CLK_MATRIX_250M_SRC_DIV_SHIFT; + sel_mask = CLK_MATRIX_250M_SRC_SEL_MASK; + sel_shift = CLK_MATRIX_250M_SRC_SEL_SHIFT; + break; + + case CLK_MATRIX_300M_SRC: + con = 2; + mask = CLK_MATRIX_300M_SRC_DIV_MASK; + shift = CLK_MATRIX_300M_SRC_DIV_SHIFT; + break; + + case CLK_MATRIX_339M_SRC: + con = 2; + mask = CLK_MATRIX_339M_SRC_DIV_MASK; + shift = CLK_MATRIX_339M_SRC_DIV_SHIFT; + is_halfdiv = 1; + break; + + case CLK_MATRIX_400M_SRC: + con = 2; + mask = CLK_MATRIX_400M_SRC_DIV_MASK; + shift = CLK_MATRIX_400M_SRC_DIV_SHIFT; + break; + + case CLK_MATRIX_500M_SRC: + con = 3; + mask = CLK_MATRIX_500M_SRC_DIV_MASK; + shift = CLK_MATRIX_500M_SRC_DIV_SHIFT; + sel_mask = CLK_MATRIX_500M_SRC_SEL_MASK; + sel_shift = CLK_MATRIX_500M_SRC_SEL_SHIFT; + break; + + case CLK_MATRIX_600M_SRC: + con = 4; + mask = CLK_MATRIX_600M_SRC_DIV_MASK; + shift = CLK_MATRIX_600M_SRC_DIV_SHIFT; + break; + + case ACLK_BUS_VOPGL_ROOT: + case ACLK_BUS_VOPGL_BIU: + con = 43; + mask = ACLK_BUS_VOPGL_ROOT_DIV_MASK; + shift = ACLK_BUS_VOPGL_ROOT_DIV_SHIFT; + break; + + default: + return -ENOENT; + } + + if (sel_mask) { + sel = (readl(&cru->clksel_con[con]) & sel_mask) >> sel_shift; + if (sel == CLK_MATRIX_250M_SRC_SEL_CLK_GPLL_MUX) // TODO + prate = priv->gpll_hz; + else + prate = priv->cpll_hz; + } else { + if (is_gpll_parent) + prate = priv->gpll_hz; + else + prate = priv->cpll_hz; + } + + div = (readl(&cru->clksel_con[con]) & mask) >> shift; + + /* NOTE: '-1' to balance the DIV_TO_RATE() 'div+1' */ + return is_halfdiv ? DIV_TO_RATE(prate * 2, (3 + 2 * div) - 1) : DIV_TO_RATE(prate, div); +} + +static ulong rk3528_cgpll_matrix_set_rate(struct rk3528_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 sel, div, mask, shift, con; + u32 sel_mask = 0, sel_shift; + u8 is_gpll_parent = 1; + u8 is_halfdiv = 0; + ulong prate = 0; + + switch (clk_id) { + case CLK_MATRIX_50M_SRC: + con = 0; + mask = CLK_MATRIX_50M_SRC_DIV_MASK; + shift = CLK_MATRIX_50M_SRC_DIV_SHIFT; + is_gpll_parent = 0; + break; + + case CLK_MATRIX_100M_SRC: + con = 0; + mask = CLK_MATRIX_100M_SRC_DIV_MASK; + shift = CLK_MATRIX_100M_SRC_DIV_SHIFT; + is_gpll_parent = 0; + break; + + case CLK_MATRIX_150M_SRC: + con = 1; + mask = CLK_MATRIX_150M_SRC_DIV_MASK; + shift = CLK_MATRIX_150M_SRC_DIV_SHIFT; + break; + + case CLK_MATRIX_200M_SRC: + con = 1; + mask = CLK_MATRIX_200M_SRC_DIV_MASK; + shift = CLK_MATRIX_200M_SRC_DIV_SHIFT; + break; + + case CLK_MATRIX_250M_SRC: + con = 1; + mask = CLK_MATRIX_250M_SRC_DIV_MASK; + shift = CLK_MATRIX_250M_SRC_DIV_SHIFT; + sel_mask = CLK_MATRIX_250M_SRC_SEL_MASK; + sel_shift = CLK_MATRIX_250M_SRC_SEL_SHIFT; + break; + + case CLK_MATRIX_300M_SRC: + con = 2; + mask = CLK_MATRIX_300M_SRC_DIV_MASK; + shift = CLK_MATRIX_300M_SRC_DIV_SHIFT; + break; + + case CLK_MATRIX_339M_SRC: + con = 2; + mask = CLK_MATRIX_339M_SRC_DIV_MASK; + shift = CLK_MATRIX_339M_SRC_DIV_SHIFT; + is_halfdiv = 1; + break; + + case CLK_MATRIX_400M_SRC: + con = 2; + mask = CLK_MATRIX_400M_SRC_DIV_MASK; + shift = CLK_MATRIX_400M_SRC_DIV_SHIFT; + break; + + case CLK_MATRIX_500M_SRC: + con = 3; + mask = CLK_MATRIX_500M_SRC_DIV_MASK; + shift = CLK_MATRIX_500M_SRC_DIV_SHIFT; + sel_mask = CLK_MATRIX_500M_SRC_SEL_MASK; + sel_shift = CLK_MATRIX_500M_SRC_SEL_SHIFT; + break; + + case CLK_MATRIX_600M_SRC: + con = 4; + mask = CLK_MATRIX_600M_SRC_DIV_MASK; + shift = CLK_MATRIX_600M_SRC_DIV_SHIFT; + break; + + case ACLK_BUS_VOPGL_ROOT: + case ACLK_BUS_VOPGL_BIU: + con = 43; + mask = ACLK_BUS_VOPGL_ROOT_DIV_MASK; + shift = ACLK_BUS_VOPGL_ROOT_DIV_SHIFT; + break; + + default: + return -ENOENT; + } + + if (sel_mask) { + if (priv->gpll_hz % rate == 0) { + sel = CLK_MATRIX_250M_SRC_SEL_CLK_GPLL_MUX; // TODO + prate = priv->gpll_hz; + } else { + sel = CLK_MATRIX_250M_SRC_SEL_CLK_CPLL_MUX; + prate = priv->cpll_hz; + } + } else { + if (is_gpll_parent) + prate = priv->gpll_hz; + else + prate = priv->cpll_hz; + } + + if (is_halfdiv) + /* NOTE: '+1' to balance the following rk_clrsetreg() 'div-1' */ + div = DIV_ROUND_UP((prate * 2) - (3 * rate), 2 * rate) + 1; + else + div = DIV_ROUND_UP(prate, rate); + + rk_clrsetreg(&cru->clksel_con[con], mask, (div - 1) << shift); + if (sel_mask) + rk_clrsetreg(&cru->clksel_con[con], sel_mask, sel << sel_shift); + + return rk3528_cgpll_matrix_get_rate(priv, clk_id); +} + +static ulong rk3528_i2c_get_clk(struct rk3528_clk_priv *priv, ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, sel, con, mask, shift; + u8 is_pmucru = 0; + ulong rate; + + switch (clk_id) { + case CLK_I2C0: + id = 79; + mask = CLK_I2C0_SEL_MASK; + shift = CLK_I2C0_SEL_SHIFT; + break; + + case CLK_I2C1: + id = 79; + mask = CLK_I2C1_SEL_MASK; + shift = CLK_I2C1_SEL_SHIFT; + break; + + case CLK_I2C2: + id = 0; + mask = CLK_I2C2_SEL_MASK; + shift = CLK_I2C2_SEL_SHIFT; + is_pmucru = 1; + break; + + case CLK_I2C3: + id = 63; + mask = CLK_I2C3_SEL_MASK; + shift = CLK_I2C3_SEL_SHIFT; + break; + + case CLK_I2C4: + id = 85; + mask = CLK_I2C4_SEL_MASK; + shift = CLK_I2C4_SEL_SHIFT; + break; + + case CLK_I2C5: + id = 63; + mask = CLK_I2C5_SEL_MASK; + shift = CLK_I2C5_SEL_SHIFT; + break; + + case CLK_I2C6: + id = 64; + mask = CLK_I2C6_SEL_MASK; + shift = CLK_I2C6_SEL_SHIFT; + break; + + case CLK_I2C7: + id = 86; + mask = CLK_I2C7_SEL_MASK; + shift = CLK_I2C7_SEL_SHIFT; + break; + + default: + return -ENOENT; + } + + if (is_pmucru) + con = readl(&cru->pmuclksel_con[id]); + else + con = readl(&cru->clksel_con[id]); + sel = (con & mask) >> shift; + if (sel == CLK_I2C3_SEL_CLK_MATRIX_200M_SRC) + rate = 200 * MHz; + else if (sel == CLK_I2C3_SEL_CLK_MATRIX_100M_SRC) + rate = 100 * MHz; + else if (sel == CLK_I2C3_SEL_CLK_MATRIX_50M_SRC) + rate = 50 * MHz; + else + rate = OSC_HZ; + + return rate; +} + +static ulong rk3528_i2c_set_clk(struct rk3528_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, sel, mask, shift; + u8 is_pmucru = 0; + + if (rate == 200 * MHz) + sel = CLK_I2C3_SEL_CLK_MATRIX_200M_SRC; + else if (rate == 100 * MHz) + sel = CLK_I2C3_SEL_CLK_MATRIX_100M_SRC; + else if (rate == 50 * MHz) + sel = CLK_I2C3_SEL_CLK_MATRIX_50M_SRC; + else + sel = CLK_I2C3_SEL_XIN_OSC0_FUNC; + + switch (clk_id) { + case CLK_I2C0: + id = 79; + mask = CLK_I2C0_SEL_MASK; + shift = CLK_I2C0_SEL_SHIFT; + break; + + case CLK_I2C1: + id = 79; + mask = CLK_I2C1_SEL_MASK; + shift = CLK_I2C1_SEL_SHIFT; + break; + + case CLK_I2C2: + id = 0; + mask = CLK_I2C2_SEL_MASK; + shift = CLK_I2C2_SEL_SHIFT; + is_pmucru = 1; + break; + + case CLK_I2C3: + id = 63; + mask = CLK_I2C3_SEL_MASK; + shift = CLK_I2C3_SEL_SHIFT; + break; + + case CLK_I2C4: + id = 85; + mask = CLK_I2C4_SEL_MASK; + shift = CLK_I2C4_SEL_SHIFT; + break; + + case CLK_I2C5: + id = 63; + mask = CLK_I2C5_SEL_MASK; + shift = CLK_I2C5_SEL_SHIFT; + + case CLK_I2C6: + id = 64; + mask = CLK_I2C6_SEL_MASK; + shift = CLK_I2C6_SEL_SHIFT; + break; + + case CLK_I2C7: + id = 86; + mask = CLK_I2C7_SEL_MASK; + shift = CLK_I2C7_SEL_SHIFT; + break; + + default: + return -ENOENT; + } + + if (is_pmucru) + rk_clrsetreg(&cru->pmuclksel_con[id], mask, sel << shift); + else + rk_clrsetreg(&cru->clksel_con[id], mask, sel << shift); + + return rk3528_i2c_get_clk(priv, clk_id); +} + +static ulong rk3528_spi_get_clk(struct rk3528_clk_priv *priv, ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, sel, con, mask, shift; + ulong rate; + + switch (clk_id) { + case CLK_SPI0: + id = 79; + mask = CLK_SPI0_SEL_MASK; + shift = CLK_SPI0_SEL_SHIFT; + break; + + case CLK_SPI1: + id = 63; + mask = CLK_SPI1_SEL_MASK; + shift = CLK_SPI1_SEL_SHIFT; + break; + default: + return -ENOENT; + } + + con = readl(&cru->clksel_con[id]); + sel = (con & mask) >> shift; + if (sel == CLK_SPI1_SEL_CLK_MATRIX_200M_SRC) + rate = 200 * MHz; + else if (sel == CLK_SPI1_SEL_CLK_MATRIX_100M_SRC) + rate = 100 * MHz; + else if (sel == CLK_SPI1_SEL_CLK_MATRIX_50M_SRC) + rate = 50 * MHz; + else + rate = OSC_HZ; + + return rate; +} + +static ulong rk3528_spi_set_clk(struct rk3528_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, sel, mask, shift; + + if (rate == 200 * MHz) + sel = CLK_SPI1_SEL_CLK_MATRIX_200M_SRC; + else if (rate == 100 * MHz) + sel = CLK_SPI1_SEL_CLK_MATRIX_100M_SRC; + else if (rate == 50 * MHz) + sel = CLK_SPI1_SEL_CLK_MATRIX_50M_SRC; + else + sel = CLK_SPI1_SEL_XIN_OSC0_FUNC; + + switch (clk_id) { + case CLK_SPI0: + id = 79; + mask = CLK_SPI0_SEL_MASK; + shift = CLK_SPI0_SEL_SHIFT; + break; + + case CLK_SPI1: + id = 63; + mask = CLK_SPI1_SEL_MASK; + shift = CLK_SPI1_SEL_SHIFT; + break; + default: + return -ENOENT; + } + + rk_clrsetreg(&cru->clksel_con[id], mask, sel << shift); + + return rk3528_spi_get_clk(priv, clk_id); +} + +static ulong rk3528_pwm_get_clk(struct rk3528_clk_priv *priv, ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, sel, con, mask, shift; + ulong rate; + + switch (clk_id) { + case CLK_PWM0: + id = 44; + mask = CLK_PWM0_SEL_MASK; + shift = CLK_PWM0_SEL_SHIFT; + break; + + case CLK_PWM1: + id = 44; + mask = CLK_PWM1_SEL_MASK; + shift = CLK_PWM1_SEL_SHIFT; + break; + + default: + return -ENOENT; + } + + con = readl(&cru->clksel_con[id]); + sel = (con & mask) >> shift; + if (sel == CLK_PWM0_SEL_CLK_MATRIX_100M_SRC) + rate = 100 * MHz; + if (sel == CLK_PWM0_SEL_CLK_MATRIX_50M_SRC) + rate = 50 * MHz; + else + rate = OSC_HZ; + + return rate; +} + +static ulong rk3528_pwm_set_clk(struct rk3528_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, sel, mask, shift; + + if (rate == 100 * MHz) + sel = CLK_PWM0_SEL_CLK_MATRIX_100M_SRC; + else if (rate == 50 * MHz) + sel = CLK_PWM0_SEL_CLK_MATRIX_50M_SRC; + else + sel = CLK_PWM0_SEL_XIN_OSC0_FUNC; + + switch (clk_id) { + case CLK_PWM0: + id = 44; + mask = CLK_PWM0_SEL_MASK; + shift = CLK_PWM0_SEL_SHIFT; + break; + + case CLK_PWM1: + id = 44; + mask = CLK_PWM1_SEL_MASK; + shift = CLK_PWM1_SEL_SHIFT; + break; + + default: + return -ENOENT; + } + + rk_clrsetreg(&cru->clksel_con[id], mask, sel << shift); + + return rk3528_pwm_get_clk(priv, clk_id); +} + +static ulong rk3528_adc_get_clk(struct rk3528_clk_priv *priv, ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 div, con; + + con = readl(&cru->clksel_con[74]); + switch (clk_id) { + case CLK_SARADC: + div = (con & CLK_SARADC_DIV_MASK) >> + CLK_SARADC_DIV_SHIFT; + break; + + case CLK_TSADC_TSEN: + div = (con & CLK_TSADC_TSEN_DIV_MASK) >> + CLK_TSADC_TSEN_DIV_SHIFT; + break; + + case CLK_TSADC: + div = (con & CLK_TSADC_DIV_MASK) >> + CLK_TSADC_DIV_SHIFT; + break; + + default: + return -ENOENT; + } + + return DIV_TO_RATE(OSC_HZ, div); +} + +static ulong rk3528_adc_set_clk(struct rk3528_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 div, mask, shift; + + switch (clk_id) { + case CLK_SARADC: + mask = CLK_SARADC_DIV_MASK; + shift = CLK_SARADC_DIV_SHIFT; + break; + + case CLK_TSADC_TSEN: + mask = CLK_TSADC_TSEN_DIV_MASK; + shift = CLK_TSADC_TSEN_DIV_SHIFT; + break; + + case CLK_TSADC: + mask = CLK_TSADC_DIV_MASK; + shift = CLK_TSADC_DIV_SHIFT; + break; + + default: + return -ENOENT; + } + + div = DIV_ROUND_UP(OSC_HZ, rate); + rk_clrsetreg(&cru->clksel_con[74], mask, (div - 1) << shift); + + return rk3528_adc_get_clk(priv, clk_id); +} + +static ulong rk3528_sdmmc_get_clk(struct rk3528_clk_priv *priv, ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 div, sel, con; + ulong prate; + + con = readl(&cru->clksel_con[85]); + div = (con & CCLK_SRC_SDMMC0_DIV_MASK) >> + CCLK_SRC_SDMMC0_DIV_SHIFT; + sel = (con & CCLK_SRC_SDMMC0_SEL_MASK) >> + CCLK_SRC_SDMMC0_SEL_SHIFT; + + if (sel == CCLK_SRC_SDMMC0_SEL_CLK_GPLL_MUX) + prate = priv->gpll_hz; + else if (sel == CCLK_SRC_SDMMC0_SEL_CLK_CPLL_MUX) + prate = priv->cpll_hz; + else + prate = OSC_HZ; + + return DIV_TO_RATE(prate, div); +} + +static ulong rk3528_sdmmc_set_clk(struct rk3528_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 div, sel; + + if (OSC_HZ % rate == 0) { + div = DIV_ROUND_UP(OSC_HZ, rate); + sel = CCLK_SRC_SDMMC0_SEL_XIN_OSC0_FUNC; + } else if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = CCLK_SRC_SDMMC0_SEL_CLK_CPLL_MUX; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = CCLK_SRC_SDMMC0_SEL_CLK_GPLL_MUX; + } + + assert(div - 1 <= 31); + rk_clrsetreg(&cru->clksel_con[85], + CCLK_SRC_SDMMC0_SEL_MASK | + CCLK_SRC_SDMMC0_DIV_MASK, + sel << CCLK_SRC_SDMMC0_SEL_SHIFT | + (div - 1) << CCLK_SRC_SDMMC0_DIV_SHIFT); + + return rk3528_sdmmc_get_clk(priv, clk_id); +} + +static ulong rk3528_sfc_get_clk(struct rk3528_clk_priv *priv) +{ + struct rk3528_cru *cru = priv->cru; + u32 div, sel, con, parent; + + con = readl(&cru->clksel_con[61]); + div = (con & SCLK_SFC_DIV_MASK) >> + SCLK_SFC_DIV_SHIFT; + sel = (con & SCLK_SFC_SEL_MASK) >> + SCLK_SFC_SEL_SHIFT; + if (sel == SCLK_SFC_SEL_CLK_GPLL_MUX) + parent = priv->gpll_hz; + else if (sel == SCLK_SFC_SEL_CLK_CPLL_MUX) + parent = priv->cpll_hz; + else + parent = OSC_HZ; + + return DIV_TO_RATE(parent, div); +} + +static ulong rk3528_sfc_set_clk(struct rk3528_clk_priv *priv, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + int div, sel; + + if (OSC_HZ % rate == 0) { + div = DIV_ROUND_UP(OSC_HZ, rate); + sel = SCLK_SFC_SEL_XIN_OSC0_FUNC; + } else if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = SCLK_SFC_SEL_CLK_CPLL_MUX; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = SCLK_SFC_SEL_CLK_GPLL_MUX; + } + + assert(div - 1 <= 63); + rk_clrsetreg(&cru->clksel_con[61], + SCLK_SFC_SEL_MASK | + SCLK_SFC_DIV_MASK, + sel << SCLK_SFC_SEL_SHIFT | + (div - 1) << SCLK_SFC_DIV_SHIFT); + + return rk3528_sfc_get_clk(priv); +} + +static ulong rk3528_emmc_get_clk(struct rk3528_clk_priv *priv) +{ + struct rk3528_cru *cru = priv->cru; + u32 div, sel, con, parent; + + con = readl(&cru->clksel_con[62]); + div = (con & CCLK_SRC_EMMC_DIV_MASK) >> + CCLK_SRC_EMMC_DIV_SHIFT; + sel = (con & CCLK_SRC_EMMC_SEL_MASK) >> + CCLK_SRC_EMMC_SEL_SHIFT; + + if (sel == CCLK_SRC_EMMC_SEL_CLK_GPLL_MUX) + parent = priv->gpll_hz; + else if (sel == CCLK_SRC_EMMC_SEL_CLK_CPLL_MUX) + parent = priv->cpll_hz; + else + parent = OSC_HZ; + + return DIV_TO_RATE(parent, div); +} + +static ulong rk3528_emmc_set_clk(struct rk3528_clk_priv *priv, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 div, sel; + + if (OSC_HZ % rate == 0) { + div = DIV_ROUND_UP(OSC_HZ, rate); + sel = CCLK_SRC_EMMC_SEL_XIN_OSC0_FUNC; + } else if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = CCLK_SRC_EMMC_SEL_CLK_CPLL_MUX; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = CCLK_SRC_EMMC_SEL_CLK_GPLL_MUX; + } + + assert(div - 1 <= 31); + rk_clrsetreg(&cru->clksel_con[62], + CCLK_SRC_EMMC_SEL_MASK | + CCLK_SRC_EMMC_DIV_MASK, + sel << CCLK_SRC_EMMC_SEL_SHIFT | + (div - 1) << CCLK_SRC_EMMC_DIV_SHIFT); + + return rk3528_emmc_get_clk(priv); +} + +static ulong rk3528_dclk_vop_get_clk(struct rk3528_clk_priv *priv, ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 div_mask, div_shift; + u32 sel_mask, sel_shift; + u32 id, con, sel, div; + ulong prate; + + switch (clk_id) { + case DCLK_VOP0: + id = 32; + sel_mask = DCLK_VOP_SRC0_SEL_MASK; + sel_shift = DCLK_VOP_SRC0_SEL_SHIFT; + /* FIXME if need src: clk_hdmiphy_pixel_io */ + div_mask = DCLK_VOP_SRC0_DIV_MASK; + div_shift = DCLK_VOP_SRC0_DIV_SHIFT; + break; + + case DCLK_VOP1: + id = 33; + sel_mask = DCLK_VOP_SRC1_SEL_MASK; + sel_shift = DCLK_VOP_SRC1_SEL_SHIFT; + div_mask = DCLK_VOP_SRC1_DIV_MASK; + div_shift = DCLK_VOP_SRC1_DIV_SHIFT; + break; + + default: + return -ENOENT; + } + + con = readl(&cru->clksel_con[id]); + div = (con & div_mask) >> div_shift; + sel = (con & sel_mask) >> sel_shift; + if (sel == DCLK_VOP_SRC_SEL_CLK_GPLL_MUX) + prate = priv->gpll_hz; + else + prate = priv->cpll_hz; + + return DIV_TO_RATE(prate, div); +} + +static ulong rk3528_dclk_vop_set_clk(struct rk3528_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 div_mask, div_shift; + u32 sel_mask, sel_shift; + u32 id, sel, div; + ulong prate; + + switch (clk_id) { + case DCLK_VOP0: + id = 32; + sel_mask = DCLK_VOP_SRC0_SEL_MASK; + sel_shift = DCLK_VOP_SRC0_SEL_SHIFT; + /* FIXME if need src: clk_hdmiphy_pixel_io */ + div_mask = DCLK_VOP_SRC0_DIV_MASK; + div_shift = DCLK_VOP_SRC0_DIV_SHIFT; + break; + + case DCLK_VOP1: + id = 33; + sel_mask = DCLK_VOP_SRC1_SEL_MASK; + sel_shift = DCLK_VOP_SRC1_SEL_SHIFT; + div_mask = DCLK_VOP_SRC1_DIV_MASK; + div_shift = DCLK_VOP_SRC1_DIV_SHIFT; + break; + + default: + return -ENOENT; + } + + if ((priv->gpll_hz % rate) == 0) { + prate = priv->gpll_hz; + sel = (DCLK_VOP_SRC_SEL_CLK_GPLL_MUX << sel_shift) & sel_mask; + } else { + prate = priv->cpll_hz; + sel = (DCLK_VOP_SRC_SEL_CLK_CPLL_MUX << sel_shift) & sel_mask; + } + + div = ((DIV_ROUND_UP(prate, rate) - 1) << div_shift) & div_mask; + rk_clrsetreg(&cru->clksel_con[id], sel, div); + + return rk3528_dclk_vop_get_clk(priv, clk_id); +} + +static ulong rk3528_uart_get_rate(struct rk3528_clk_priv *priv, ulong clk_id) +{ + struct rk3528_cru *cru = priv->cru; + u32 sel_shift, sel_mask, div_shift, div_mask; + u32 sel, id, con, frac_div, div; + ulong m, n, rate; + + switch (clk_id) { + case SCLK_UART0: + id = 6; + sel_shift = SCLK_UART0_SRC_SEL_SHIFT; + sel_mask = SCLK_UART0_SRC_SEL_MASK; + div_shift = CLK_UART0_SRC_DIV_SHIFT; + div_mask = CLK_UART0_SRC_DIV_MASK; + break; + + case SCLK_UART1: + id = 8; + sel_shift = SCLK_UART1_SRC_SEL_SHIFT; + sel_mask = SCLK_UART1_SRC_SEL_MASK; + div_shift = CLK_UART1_SRC_DIV_SHIFT; + div_mask = CLK_UART1_SRC_DIV_MASK; + break; + + case SCLK_UART2: + id = 10; + sel_shift = SCLK_UART2_SRC_SEL_SHIFT; + sel_mask = SCLK_UART2_SRC_SEL_MASK; + div_shift = CLK_UART2_SRC_DIV_SHIFT; + div_mask = CLK_UART2_SRC_DIV_MASK; + break; + + case SCLK_UART3: + id = 12; + sel_shift = SCLK_UART3_SRC_SEL_SHIFT; + sel_mask = SCLK_UART3_SRC_SEL_MASK; + div_shift = CLK_UART3_SRC_DIV_SHIFT; + div_mask = CLK_UART3_SRC_DIV_MASK; + break; + + case SCLK_UART4: + id = 14; + sel_shift = SCLK_UART4_SRC_SEL_SHIFT; + sel_mask = SCLK_UART4_SRC_SEL_MASK; + div_shift = CLK_UART4_SRC_DIV_SHIFT; + div_mask = CLK_UART4_SRC_DIV_MASK; + break; + + case SCLK_UART5: + id = 16; + sel_shift = SCLK_UART5_SRC_SEL_SHIFT; + sel_mask = SCLK_UART5_SRC_SEL_MASK; + div_shift = CLK_UART5_SRC_DIV_SHIFT; + div_mask = CLK_UART5_SRC_DIV_MASK; + break; + + case SCLK_UART6: + id = 18; + sel_shift = SCLK_UART6_SRC_SEL_SHIFT; + sel_mask = SCLK_UART6_SRC_SEL_MASK; + div_shift = CLK_UART6_SRC_DIV_SHIFT; + div_mask = CLK_UART6_SRC_DIV_MASK; + break; + + case SCLK_UART7: + id = 20; + sel_shift = SCLK_UART7_SRC_SEL_SHIFT; + sel_mask = SCLK_UART7_SRC_SEL_MASK; + div_shift = CLK_UART7_SRC_DIV_SHIFT; + div_mask = CLK_UART7_SRC_DIV_MASK; + break; + + default: + return -ENOENT; + } + + con = readl(&cru->clksel_con[id - 2]); + div = (con & div_mask) >> div_shift; + + con = readl(&cru->clksel_con[id]); + sel = (con & sel_mask) >> sel_shift; + + if (sel == SCLK_UART0_SRC_SEL_CLK_UART0_SRC) { + rate = DIV_TO_RATE(priv->gpll_hz, div); + } else if (sel == SCLK_UART0_SRC_SEL_CLK_UART0_FRAC) { + frac_div = readl(&cru->clksel_con[id - 1]); + n = (frac_div & 0xffff0000) >> 16; + m = frac_div & 0x0000ffff; + rate = DIV_TO_RATE(priv->gpll_hz, div) * n / m; + } else { + rate = OSC_HZ; + } + + return rate; +} + +static ulong rk3528_uart_set_rate(struct rk3528_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 sel_shift, sel_mask, div_shift, div_mask; + u32 sel, id, div; + ulong m = 0, n = 0, val; + + if (rate == OSC_HZ) { + sel = SCLK_UART0_SRC_SEL_XIN_OSC0_FUNC; + div = DIV_ROUND_UP(OSC_HZ, rate); + } else if (priv->gpll_hz % rate == 0) { + sel = SCLK_UART0_SRC_SEL_CLK_UART0_SRC; + div = DIV_ROUND_UP(priv->gpll_hz, rate); + } else { + sel = SCLK_UART0_SRC_SEL_CLK_UART0_FRAC; + div = 2; + rational_best_approximation(rate, priv->gpll_hz / div, + GENMASK(16 - 1, 0), + GENMASK(16 - 1, 0), + &n, &m); + } + + switch (clk_id) { + case SCLK_UART0: + id = 6; + sel_shift = SCLK_UART0_SRC_SEL_SHIFT; + sel_mask = SCLK_UART0_SRC_SEL_MASK; + div_shift = CLK_UART0_SRC_DIV_SHIFT; + div_mask = CLK_UART0_SRC_DIV_MASK; + break; + + case SCLK_UART1: + id = 8; + sel_shift = SCLK_UART1_SRC_SEL_SHIFT; + sel_mask = SCLK_UART1_SRC_SEL_MASK; + div_shift = CLK_UART1_SRC_DIV_SHIFT; + div_mask = CLK_UART1_SRC_DIV_MASK; + break; + + case SCLK_UART2: + id = 10; + sel_shift = SCLK_UART2_SRC_SEL_SHIFT; + sel_mask = SCLK_UART2_SRC_SEL_MASK; + div_shift = CLK_UART2_SRC_DIV_SHIFT; + div_mask = CLK_UART2_SRC_DIV_MASK; + break; + + case SCLK_UART3: + id = 12; + sel_shift = SCLK_UART3_SRC_SEL_SHIFT; + sel_mask = SCLK_UART3_SRC_SEL_MASK; + div_shift = CLK_UART3_SRC_DIV_SHIFT; + div_mask = CLK_UART3_SRC_DIV_MASK; + break; + + case SCLK_UART4: + id = 14; + sel_shift = SCLK_UART4_SRC_SEL_SHIFT; + sel_mask = SCLK_UART4_SRC_SEL_MASK; + div_shift = CLK_UART4_SRC_DIV_SHIFT; + div_mask = CLK_UART4_SRC_DIV_MASK; + break; + + case SCLK_UART5: + id = 16; + sel_shift = SCLK_UART5_SRC_SEL_SHIFT; + sel_mask = SCLK_UART5_SRC_SEL_MASK; + div_shift = CLK_UART5_SRC_DIV_SHIFT; + div_mask = CLK_UART5_SRC_DIV_MASK; + break; + + case SCLK_UART6: + id = 18; + sel_shift = SCLK_UART6_SRC_SEL_SHIFT; + sel_mask = SCLK_UART6_SRC_SEL_MASK; + div_shift = CLK_UART6_SRC_DIV_SHIFT; + div_mask = CLK_UART6_SRC_DIV_MASK; + break; + + case SCLK_UART7: + id = 20; + sel_shift = SCLK_UART7_SRC_SEL_SHIFT; + sel_mask = SCLK_UART7_SRC_SEL_MASK; + div_shift = CLK_UART7_SRC_DIV_SHIFT; + div_mask = CLK_UART7_SRC_DIV_MASK; + break; + + default: + return -ENOENT; + } + + rk_clrsetreg(&cru->clksel_con[id - 2], div_mask, (div - 1) << div_shift); + rk_clrsetreg(&cru->clksel_con[id], sel_mask, sel << sel_shift); + if (m && n) { + val = n << 16 | m; + writel(val, &cru->clksel_con[id - 1]); + } + + return rk3528_uart_get_rate(priv, clk_id); +} + +static ulong rk3528_clk_get_rate(struct clk *clk) +{ + struct rk3528_clk_priv *priv = dev_get_priv(clk->dev); + ulong rate = 0; + + if (!priv->gpll_hz || !priv->cpll_hz) { + printf("%s: gpll=%lu, cpll=%ld\n", + __func__, priv->gpll_hz, priv->cpll_hz); + return -ENOENT; + } + + switch (clk->id) { + case PLL_APLL: + case ARMCLK: + rate = rockchip_pll_get_rate(&rk3528_pll_clks[APLL], priv->cru, + APLL); + break; + case PLL_CPLL: + rate = rockchip_pll_get_rate(&rk3528_pll_clks[CPLL], priv->cru, + CPLL); + break; + case PLL_GPLL: + rate = rockchip_pll_get_rate(&rk3528_pll_clks[GPLL], priv->cru, + GPLL); + break; + + case PLL_PPLL: + rate = rockchip_pll_get_rate(&rk3528_pll_clks[PPLL], priv->cru, + PPLL); + break; + case PLL_DPLL: + rate = rockchip_pll_get_rate(&rk3528_pll_clks[DPLL], priv->cru, + DPLL); + break; + + case TCLK_WDT_NS: + rate = OSC_HZ; + break; + case CLK_I2C0: + case CLK_I2C1: + case CLK_I2C2: + case CLK_I2C3: + case CLK_I2C4: + case CLK_I2C5: + case CLK_I2C6: + case CLK_I2C7: + rate = rk3528_i2c_get_clk(priv, clk->id); + break; + case CLK_SPI0: + case CLK_SPI1: + rate = rk3528_spi_get_clk(priv, clk->id); + break; + case CLK_PWM0: + case CLK_PWM1: + rate = rk3528_pwm_get_clk(priv, clk->id); + break; + case CLK_SARADC: + case CLK_TSADC: + case CLK_TSADC_TSEN: + rate = rk3528_adc_get_clk(priv, clk->id); + break; + case CCLK_SRC_EMMC: + rate = rk3528_emmc_get_clk(priv); + break; + case HCLK_SDMMC0: + case CCLK_SRC_SDMMC0: + rate = rk3528_sdmmc_get_clk(priv, clk->id); + break; + case SCLK_SFC: + rate = rk3528_sfc_get_clk(priv); + break; + case DCLK_VOP0: + case DCLK_VOP1: + rate = rk3528_dclk_vop_get_clk(priv, clk->id); + break; + case DCLK_CVBS: + rate = rk3528_dclk_vop_get_clk(priv, DCLK_VOP1) / 4; + break; + case DCLK_4X_CVBS: + rate = rk3528_dclk_vop_get_clk(priv, DCLK_VOP1); + break; + case SCLK_UART0: + case SCLK_UART1: + case SCLK_UART2: + case SCLK_UART3: + case SCLK_UART4: + case SCLK_UART5: + case SCLK_UART6: + case SCLK_UART7: + rate = rk3528_uart_get_rate(priv, clk->id); + break; + case CLK_MATRIX_50M_SRC: + case CLK_MATRIX_100M_SRC: + case CLK_MATRIX_150M_SRC: + case CLK_MATRIX_200M_SRC: + case CLK_MATRIX_250M_SRC: + case CLK_MATRIX_300M_SRC: + case CLK_MATRIX_339M_SRC: + case CLK_MATRIX_400M_SRC: + case CLK_MATRIX_500M_SRC: + case CLK_MATRIX_600M_SRC: + case ACLK_BUS_VOPGL_BIU: + rate = rk3528_cgpll_matrix_get_rate(priv, clk->id); + break; + case CLK_PPLL_50M_MATRIX: + case CLK_PPLL_100M_MATRIX: + case CLK_PPLL_125M_MATRIX: + case CLK_GMAC1_VPU_25M: + case CLK_GMAC1_RMII_VPU: + case CLK_GMAC1_SRC_VPU: + rate = rk3528_ppll_matrix_get_rate(priv, clk->id); + break; + default: + return -ENOENT; + } + + return rate; +}; + +static ulong rk3528_clk_set_rate(struct clk *clk, ulong rate) +{ + struct rk3528_clk_priv *priv = dev_get_priv(clk->dev); + ulong ret = 0; + + if (!priv->gpll_hz) { + printf("%s gpll=%lu\n", __func__, priv->gpll_hz); + return -ENOENT; + } + + switch (clk->id) { + case PLL_APLL: + case ARMCLK: + if (priv->armclk_hz) + rk3528_armclk_set_clk(priv, rate); + priv->armclk_hz = rate; + break; + case PLL_CPLL: + ret = rockchip_pll_set_rate(&rk3528_pll_clks[CPLL], priv->cru, + CPLL, rate); + priv->cpll_hz = rockchip_pll_get_rate(&rk3528_pll_clks[CPLL], + priv->cru, CPLL); + break; + case PLL_GPLL: + ret = rockchip_pll_set_rate(&rk3528_pll_clks[GPLL], priv->cru, + GPLL, rate); + priv->gpll_hz = rockchip_pll_get_rate(&rk3528_pll_clks[GPLL], + priv->cru, GPLL); + break; + case PLL_PPLL: + ret = rockchip_pll_set_rate(&rk3528_pll_clks[PPLL], priv->cru, + PPLL, rate); + priv->ppll_hz = rockchip_pll_get_rate(&rk3528_pll_clks[PPLL], + priv->cru, PPLL); + break; + case TCLK_WDT_NS: + return (rate == OSC_HZ) ? 0 : -EINVAL; + case CLK_I2C0: + case CLK_I2C1: + case CLK_I2C2: + case CLK_I2C3: + case CLK_I2C4: + case CLK_I2C5: + case CLK_I2C6: + case CLK_I2C7: + ret = rk3528_i2c_set_clk(priv, clk->id, rate); + break; + case CLK_SPI0: + case CLK_SPI1: + ret = rk3528_spi_set_clk(priv, clk->id, rate); + break; + case CLK_PWM0: + case CLK_PWM1: + ret = rk3528_pwm_set_clk(priv, clk->id, rate); + break; + case CLK_SARADC: + case CLK_TSADC: + case CLK_TSADC_TSEN: + ret = rk3528_adc_set_clk(priv, clk->id, rate); + break; + case HCLK_SDMMC0: + case CCLK_SRC_SDMMC0: + ret = rk3528_sdmmc_set_clk(priv, clk->id, rate); + break; + case SCLK_SFC: + ret = rk3528_sfc_set_clk(priv, rate); + break; + case CCLK_SRC_EMMC: + ret = rk3528_emmc_set_clk(priv, rate); + break; + case DCLK_VOP0: + case DCLK_VOP1: + ret = rk3528_dclk_vop_set_clk(priv, clk->id, rate); + break; + case SCLK_UART0: + case SCLK_UART1: + case SCLK_UART2: + case SCLK_UART3: + case SCLK_UART4: + case SCLK_UART5: + case SCLK_UART6: + case SCLK_UART7: + ret = rk3528_uart_set_rate(priv, clk->id, rate); + break; + case CLK_MATRIX_50M_SRC: + case CLK_MATRIX_100M_SRC: + case CLK_MATRIX_150M_SRC: + case CLK_MATRIX_200M_SRC: + case CLK_MATRIX_250M_SRC: + case CLK_MATRIX_300M_SRC: + case CLK_MATRIX_339M_SRC: + case CLK_MATRIX_400M_SRC: + case CLK_MATRIX_500M_SRC: + case CLK_MATRIX_600M_SRC: + case ACLK_BUS_VOPGL_BIU: + ret = rk3528_cgpll_matrix_set_rate(priv, clk->id, rate); + break; + case CLK_PPLL_50M_MATRIX: + case CLK_PPLL_100M_MATRIX: + case CLK_PPLL_125M_MATRIX: + case CLK_GMAC1_VPU_25M: + ret = rk3528_ppll_matrix_set_rate(priv, clk->id, rate); + break; + case CLK_GMAC1_RMII_VPU: + case CLK_GMAC1_SRC_VPU: + /* dummy set */ + ret = rk3528_ppll_matrix_get_rate(priv, clk->id); + break; + default: + return -ENOENT; + } + + return ret; +}; + +#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) +static int rk3528_clk_set_parent(struct clk *clk, struct clk *parent) +{ + struct rk3528_clk_priv *priv = dev_get_priv(clk->dev); + const char *clock_dev_name = parent->dev->name; + + switch (clk->id) { + case DCLK_VOP0: + if (!strcmp(clock_dev_name, "inno_hdmi_pll_clk")) + /* clk_hdmiphy_pixel_io */ + rk_clrsetreg(&priv->cru->clksel_con[84], 0x1, 1); + else + rk_clrsetreg(&priv->cru->clksel_con[84], 0x1, 0); + break; + + default: + return -ENOENT; + } + + return 0; +} +#endif + +static struct clk_ops rk3528_clk_ops = { + .get_rate = rk3528_clk_get_rate, + .set_rate = rk3528_clk_set_rate, +#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA) + .set_parent = rk3528_clk_set_parent, +#endif +}; + +static ulong rk3528_grfclk_get_rate(struct clk *clk) +{ + struct rk3528_clk_priv *priv; + struct udevice *cru_dev; + ulong rate = 0; + int ret; + + ret = uclass_get_device_by_driver(UCLASS_CLK, + DM_GET_DRIVER(rockchip_rk3528_cru), + &cru_dev); + if (ret) { + printf("%s: could not find cru device\n", __func__); + return ret; + } + priv = dev_get_priv(cru_dev); + + switch (clk->id) { + case SCLK_SDMMC_SAMPLE: + rate = rk3528_sdmmc_get_clk(priv, CCLK_SRC_SDMMC0) / 2; + break; + default: + return -ENOENT; + } + + return rate; +}; + +#define ROCKCHIP_MMC_DELAY_SEL BIT(11) +#define ROCKCHIP_MMC_DEGREE_MASK 0x3 +#define ROCKCHIP_MMC_DELAYNUM_OFFSET 3 +#define ROCKCHIP_MMC_DELAYNUM_MASK (0xff << ROCKCHIP_MMC_DELAYNUM_OFFSET) +#define PSECS_PER_SEC 1000000000000LL +/* + * Each fine delay is between 44ps-77ps. Assume each fine delay is 60ps to + * simplify calculations. So 45degs could be anywhere between 33deg and 57.8deg. + */ +#define ROCKCHIP_MMC_DELAY_ELEMENT_PSEC 60 + +int rk3528_mmc_get_phase(struct clk *clk) +{ + struct rk3528_grf_clk_priv *priv = dev_get_priv(clk->dev); + u32 raw_value = 0, delay_num; + u16 degrees = 0; + ulong rate; + + rate = rk3528_grfclk_get_rate(clk); + if (rate < 0) + return rate; + + if (clk->id == SCLK_SDMMC_SAMPLE) + raw_value = readl(&priv->grf->sdmmc_con1); + else + return -ENONET; + + raw_value >>= 1; + degrees = (raw_value & ROCKCHIP_MMC_DEGREE_MASK) * 90; + + if (raw_value & ROCKCHIP_MMC_DELAY_SEL) { + /* degrees/delaynum * 10000 */ + unsigned long factor = (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10) * + 36 * (rate / 1000000); + + delay_num = (raw_value & ROCKCHIP_MMC_DELAYNUM_MASK); + delay_num >>= ROCKCHIP_MMC_DELAYNUM_OFFSET; + degrees += DIV_ROUND_CLOSEST(delay_num * factor, 10000); + } + + return degrees % 360; +} + +int rk3528_mmc_set_phase(struct clk *clk, u32 degrees) +{ + struct rk3528_grf_clk_priv *priv = dev_get_priv(clk->dev); + u8 nineties, remainder, delay_num; + u32 raw_value, delay; + ulong rate; + + rate = rk3528_grfclk_get_rate(clk); + if (rate < 0) + return rate; + + nineties = degrees / 90; + remainder = (degrees % 90); + + /* + * Convert to delay; do a little extra work to make sure we + * don't overflow 32-bit / 64-bit numbers. + */ + delay = 10000000; /* PSECS_PER_SEC / 10000 / 10 */ + delay *= remainder; + delay = DIV_ROUND_CLOSEST(delay, (rate / 1000) * 36 * + (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10)); + + delay_num = (u8)min_t(u32, delay, 255); + + raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0; + raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_OFFSET; + raw_value |= nineties; + + raw_value <<= 1; + if (clk->id == SCLK_SDMMC_SAMPLE) + writel(raw_value | 0xffff0000, &priv->grf->sdmmc_con1); + else + return -ENONET; + + debug("mmc set_phase(%d) delay_nums=%u reg=%#x actual_degrees=%d\n", + degrees, delay_num, raw_value, rk3528_mmc_get_phase(clk)); + + return 0; +} + +static int rk3528_grfclk_get_phase(struct clk *clk) +{ + int ret; + + debug("%s %ld\n", __func__, clk->id); + switch (clk->id) { + case SCLK_SDMMC_SAMPLE: + ret = rk3528_mmc_get_phase(clk); + break; + default: + return -ENOENT; + } + + return ret; +} + +static int rk3528_grfclk_set_phase(struct clk *clk, int degrees) +{ + int ret; + + debug("%s %ld\n", __func__, clk->id); + switch (clk->id) { + case SCLK_SDMMC_SAMPLE: + ret = rk3528_mmc_set_phase(clk, degrees); + break; + default: + return -ENOENT; + } + + return ret; +} + +static struct clk_ops rk3528_grfclk_ops = { + .get_rate = rk3528_grfclk_get_rate, + .get_phase = rk3528_grfclk_get_phase, + .set_phase = rk3528_grfclk_set_phase, +}; + +#ifndef CONFIG_SPL_BUILD +/** + * soc_clk_dump() - Print clock frequencies + * Returns zero on success + * + * Implementation for the clk dump command. + */ +int soc_clk_dump(void) +{ + const struct rk3528_clk_info *clk_dump; + struct rk3528_clk_priv *priv; + struct udevice *cru_dev; + struct clk clk; + ulong clk_count = ARRAY_SIZE(clks_dump); + ulong rate; + int i, ret; + + ret = uclass_get_device_by_driver(UCLASS_CLK, + DM_GET_DRIVER(rockchip_rk3528_cru), + &cru_dev); + if (ret) { + printf("%s failed to get cru device\n", __func__); + return ret; + } + + priv = dev_get_priv(cru_dev); + printf("CLK: (%s. arm: enter %lu KHz, init %lu KHz, kernel %lu%s)\n", + priv->sync_kernel ? "sync kernel" : "uboot", + priv->armclk_enter_hz / 1000, + priv->armclk_init_hz / 1000, + priv->set_armclk_rate ? priv->armclk_hz / 1000 : 0, + priv->set_armclk_rate ? " KHz" : "N/A"); + for (i = 0; i < clk_count; i++) { + clk_dump = &clks_dump[i]; + if (clk_dump->name) { + clk.id = clk_dump->id; + ret = clk_request(cru_dev, &clk); + if (ret < 0) + return ret; + + rate = clk_get_rate(&clk); + clk_free(&clk); + if (i == 0) { + if (rate < 0) + printf(" %s %s\n", clk_dump->name, + "unknown"); + else + printf(" %s %lu KHz\n", clk_dump->name, + rate / 1000); + } else { + if (rate < 0) + printf(" %s %s\n", clk_dump->name, + "unknown"); + else + printf(" %s %lu KHz\n", clk_dump->name, + rate / 1000); + } + } + } + + return 0; +} +#endif + +static int rk3528_grfclk_probe(struct udevice *dev) +{ + struct rk3528_grf_clk_priv *priv = dev_get_priv(dev); + + priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + if (IS_ERR(priv->grf)) + return PTR_ERR(priv->grf); + + return 0; +} + +static const struct udevice_id rk3528_grf_cru_ids[] = { + { .compatible = "rockchip,rk3528-grf-cru" }, + { } +}; + +U_BOOT_DRIVER(rockchip_rk3528_grf_cru) = { + .name = "rockchip_rk3528_grf_cru", + .id = UCLASS_CLK, + .of_match = rk3528_grf_cru_ids, + .priv_auto_alloc_size = sizeof(struct rk3528_grf_clk_priv), + .ops = &rk3528_grfclk_ops, + .probe = rk3528_grfclk_probe, +}; + +static int rk3528_clk_init(struct rk3528_clk_priv *priv) +{ + int ret; + + priv->sync_kernel = false; + +#ifdef CONFIG_SPL_BUILD + /* + * BOOTROM: + * CPU 1902/2(postdiv1)=546M + * CPLL 996/2(postdiv1)=498M + * GPLL 1188/2(postdiv1)=594M + * |-- clk_matrix_200m_src_div=1 => rate: 300M + * |-- clk_matrix_300m_src_div=2 => rate: 200M + * + * Avoid overclocking when change GPLL rate: + * Change clk_matrix_200m_src_div to 5. + * Change clk_matrix_300m_src_div to 3. + */ + writel(0x01200120, &priv->cru->clksel_con[1]); + writel(0x00030003, &priv->cru->clksel_con[2]); + + if (!priv->armclk_enter_hz) { + priv->armclk_enter_hz = + rockchip_pll_get_rate(&rk3528_pll_clks[APLL], + priv->cru, APLL); + priv->armclk_init_hz = priv->armclk_enter_hz; + } + + if (priv->armclk_init_hz != APLL_HZ) { + ret = rk3528_armclk_set_clk(priv, APLL_HZ); + if (!ret) + priv->armclk_init_hz = APLL_HZ; + } +#else + if (!priv->armclk_enter_hz) { + struct clk clk; + + ret = rockchip_get_scmi_clk(&clk.dev); + if (ret) { + printf("Failed to get scmi clk dev\n"); + return ret; + } + + clk.id = SCMI_CLK_CPU; + ret = clk_set_rate(&clk, CPU_PVTPLL_HZ); + if (ret < 0) { + printf("Failed to set scmi cpu %dhz\n", CPU_PVTPLL_HZ); + return ret; + } else { + priv->armclk_enter_hz = + rockchip_pll_get_rate(&rk3528_pll_clks[APLL], + priv->cru, APLL); + priv->armclk_init_hz = CPU_PVTPLL_HZ; + } + } +#endif + if (priv->cpll_hz != CPLL_HZ) { + ret = rockchip_pll_set_rate(&rk3528_pll_clks[CPLL], priv->cru, + CPLL, CPLL_HZ); + if (!ret) + priv->cpll_hz = CPLL_HZ; + } + + if (priv->gpll_hz != GPLL_HZ) { + ret = rockchip_pll_set_rate(&rk3528_pll_clks[GPLL], priv->cru, + GPLL, GPLL_HZ); + if (!ret) + priv->gpll_hz = GPLL_HZ; + } + + if (priv->ppll_hz != PPLL_HZ) { + ret = rockchip_pll_set_rate(&rk3528_pll_clks[PPLL], priv->cru, + PPLL, PPLL_HZ); + if (!ret) + priv->ppll_hz = PPLL_HZ; + } + +#ifdef CONFIG_SPL_BUILD + /* Init to override bootrom config */ + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_50M_SRC, 50000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_100M_SRC, 100000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_150M_SRC, 150000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_200M_SRC, 200000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_250M_SRC, 250000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_300M_SRC, 300000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_339M_SRC, 340000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_400M_SRC, 400000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_500M_SRC, 500000000); + rk3528_cgpll_matrix_set_rate(priv, CLK_MATRIX_600M_SRC, 600000000); + rk3528_cgpll_matrix_set_rate(priv, ACLK_BUS_VOPGL_BIU, 500000000); + + /* The default rate is 100Mhz, it's not friendly for remote IR module */ + rk3528_pwm_set_clk(priv, CLK_PWM0, 24000000); + rk3528_pwm_set_clk(priv, CLK_PWM1, 24000000); +#endif + return 0; +} + +static int rk3528_clk_probe(struct udevice *dev) +{ + struct rk3528_clk_priv *priv = dev_get_priv(dev); + int ret; + + priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + if (IS_ERR(priv->grf)) + return PTR_ERR(priv->grf); + + ret = rk3528_clk_init(priv); + if (ret) + return ret; + + /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ + ret = clk_set_defaults(dev); + if (ret) + debug("%s clk_set_defaults failed %d\n", __func__, ret); + else + priv->sync_kernel = true; + + return 0; +} + +static int rk3528_clk_ofdata_to_platdata(struct udevice *dev) +{ + struct rk3528_clk_priv *priv = dev_get_priv(dev); + + priv->cru = dev_read_addr_ptr(dev); + + return 0; +} + +static int rk3528_clk_bind(struct udevice *dev) +{ + struct udevice *sys_child, *sf_child; + struct softreset_reg *sf_priv; + struct sysreset_reg *priv; + int ret; + + /* The reset driver does not have a device node, so bind it here */ + ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset", + &sys_child); + if (ret) { + debug("Warning: No sysreset driver: ret=%d\n", ret); + } else { + priv = malloc(sizeof(struct sysreset_reg)); + priv->glb_srst_fst_value = offsetof(struct rk3528_cru, + glb_srst_fst); + priv->glb_srst_snd_value = offsetof(struct rk3528_cru, + glb_srst_snd); + sys_child->priv = priv; + } + + ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset", + dev_ofnode(dev), &sf_child); + if (ret) { + debug("Warning: No rockchip reset driver: ret=%d\n", ret); + } else { + sf_priv = malloc(sizeof(struct softreset_reg)); + sf_priv->sf_reset_offset = offsetof(struct rk3528_cru, + softrst_con[0]); + sf_priv->sf_reset_num = 47; + sf_child->priv = sf_priv; + } + + return 0; +} + +static const struct udevice_id rk3528_clk_ids[] = { + { .compatible = "rockchip,rk3528-cru" }, + { } +}; + +U_BOOT_DRIVER(rockchip_rk3528_cru) = { + .name = "rockchip_rk3528_cru", + .id = UCLASS_CLK, + .of_match = rk3528_clk_ids, + .priv_auto_alloc_size = sizeof(struct rk3528_clk_priv), + .ofdata_to_platdata = rk3528_clk_ofdata_to_platdata, + .ops = &rk3528_clk_ops, + .bind = rk3528_clk_bind, + .probe = rk3528_clk_probe, +}; + +/* spl scmi clk */ +#ifdef CONFIG_SPL_BUILD + +static ulong rk3528_crypto_get_rate(struct rk3528_clk_priv *priv, struct clk *clk) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, sel, con, mask, shift; + ulong rate; + + switch (clk->id) { + case SCMI_CORE_CRYPTO: + id = 43; + mask = CLK_CORE_CRYPTO_SEL_MASK; + shift = CLK_CORE_CRYPTO_SEL_SHIFT; + break; + + case SCMI_PKA_CRYPTO: + id = 44; + mask = CLK_PKA_CRYPTO_SEL_MASK; + shift = CLK_PKA_CRYPTO_SEL_SHIFT; + break; + + default: + return -ENOENT; + } + + con = readl(&cru->clksel_con[id]); + sel = (con & mask) >> shift; + if (sel == CLK_CORE_CRYPTO_SEL_CLK_MATRIX_300M_SRC) + rate = 300 * MHz; + else if (sel == CLK_CORE_CRYPTO_SEL_CLK_MATRIX_200M_SRC) + rate = 200 * MHz; + else if (sel == CLK_CORE_CRYPTO_SEL_CLK_MATRIX_100M_SRC) + rate = 100 * MHz; + else + rate = OSC_HZ; + + return rate; +} + +static ulong rk3528_crypto_set_rate(struct rk3528_clk_priv *priv, + struct clk *clk, ulong rate) +{ + struct rk3528_cru *cru = priv->cru; + u32 id, sel, mask, shift; + + if (rate == 300 * MHz) + sel = CLK_CORE_CRYPTO_SEL_CLK_MATRIX_300M_SRC; + else if (rate == 200 * MHz) + sel = CLK_CORE_CRYPTO_SEL_CLK_MATRIX_200M_SRC; + else if (rate == 100 * MHz) + sel = CLK_CORE_CRYPTO_SEL_CLK_MATRIX_100M_SRC; + else + sel = CLK_CORE_CRYPTO_SEL_XIN_OSC0_FUNC; + + switch (clk->id) { + case SCMI_CORE_CRYPTO: + id = 43; + mask = CLK_CORE_CRYPTO_SEL_MASK; + shift = CLK_CORE_CRYPTO_SEL_SHIFT; + break; + + case SCMI_PKA_CRYPTO: + id = 44; + mask = CLK_PKA_CRYPTO_SEL_MASK; + shift = CLK_PKA_CRYPTO_SEL_SHIFT; + break; + + default: + return -ENOENT; + } + + rk_clrsetreg(&cru->clksel_con[id], mask, sel << shift); + + return rk3528_crypto_get_rate(priv, clk); +} + +static ulong rk3528_clk_scmi_get_rate(struct clk *clk) +{ + struct rk3528_clk_priv *priv = dev_get_priv(clk->dev); + + switch (clk->id) { + case SCMI_CORE_CRYPTO: + case SCMI_PKA_CRYPTO: + return rk3528_crypto_get_rate(priv, clk); + default: + return -ENOENT; + } +}; + +static ulong rk3528_clk_scmi_set_rate(struct clk *clk, ulong rate) +{ + struct rk3528_clk_priv *priv = dev_get_priv(clk->dev); + + switch (clk->id) { + case SCMI_CORE_CRYPTO: + case SCMI_PKA_CRYPTO: + return rk3528_crypto_set_rate(priv, clk, rate); + default: + return -ENOENT; + } + + return 0; +}; + +static int rk3528_scmi_clk_ofdata_to_platdata(struct udevice *dev) +{ + struct rk3528_clk_priv *priv = dev_get_priv(dev); + + priv->cru = (struct rk3528_cru *)0xff4a0000; + + return 0; +} + +/* A fake scmi driver for SPL/TPL where smccc agent is not available. */ +static const struct clk_ops scmi_clk_ops = { + .get_rate = rk3528_clk_scmi_get_rate, + .set_rate = rk3528_clk_scmi_set_rate, +}; + +U_BOOT_DRIVER(scmi_clock) = { + .name = "scmi_clk", + .id = UCLASS_CLK, + .ops = &scmi_clk_ops, + .priv_auto_alloc_size = sizeof(struct rk3528_clk_priv), + .ofdata_to_platdata = rk3528_scmi_clk_ofdata_to_platdata, +}; +#endif diff --git a/u-boot/drivers/clk/rockchip/clk_rk3562.c b/u-boot/drivers/clk/rockchip/clk_rk3562.c new file mode 100644 index 0000000..36d8c44 --- /dev/null +++ b/u-boot/drivers/clk/rockchip/clk_rk3562.c @@ -0,0 +1,2046 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd + * Author: Finley Xiao <finley.xiao@rock-chips.com> + */ + +#include <common.h> +#include <clk-uclass.h> +#include <dm.h> +#include <syscon.h> +#include <asm/arch/clock.h> +#include <asm/arch/cru_rk3562.h> +#include <asm/arch/hardware.h> +#include <asm/io.h> +#include <dm/lists.h> +#include <dt-bindings/clock/rk3562-cru.h> + +DECLARE_GLOBAL_DATA_PTR; + +#define DIV_TO_RATE(input_rate, div) ((input_rate) / ((div) + 1)) + +static struct rockchip_pll_rate_table rk3562_pll_rates[] = { + /* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */ + RK3036_PLL_RATE(1608000000, 1, 67, 1, 1, 1, 0), + RK3036_PLL_RATE(1416000000, 1, 118, 2, 1, 1, 0), + RK3036_PLL_RATE(1296000000, 1, 108, 2, 1, 1, 0), + RK3036_PLL_RATE(1200000000, 1, 100, 2, 1, 1, 0), + RK3036_PLL_RATE(1188000000, 1, 99, 2, 1, 1, 0), + RK3036_PLL_RATE(1104000000, 1, 92, 2, 1, 1, 0), + RK3036_PLL_RATE(1008000000, 1, 84, 2, 1, 1, 0), + RK3036_PLL_RATE(1000000000, 3, 250, 2, 1, 1, 0), + RK3036_PLL_RATE(912000000, 1, 76, 2, 1, 1, 0), + RK3036_PLL_RATE(816000000, 1, 68, 2, 1, 1, 0), + RK3036_PLL_RATE(600000000, 1, 100, 4, 1, 1, 0), + RK3036_PLL_RATE(594000000, 1, 99, 4, 1, 1, 0), + RK3036_PLL_RATE(500000000, 1, 125, 6, 1, 1, 0), + RK3036_PLL_RATE(408000000, 1, 68, 2, 2, 1, 0), + RK3036_PLL_RATE(312000000, 1, 78, 6, 1, 1, 0), + RK3036_PLL_RATE(216000000, 1, 72, 4, 2, 1, 0), + RK3036_PLL_RATE(96000000, 1, 96, 6, 4, 1, 0), + { /* sentinel */ }, +}; + +static struct rockchip_pll_clock rk3562_pll_clks[] = { + [APLL] = PLL(pll_rk3328, PLL_APLL, RK3562_PLL_CON(0), + RK3562_MODE_CON, 0, 10, 0, rk3562_pll_rates), + [GPLL] = PLL(pll_rk3328, PLL_GPLL, RK3562_PLL_CON(24), + RK3562_MODE_CON, 2, 10, 0, rk3562_pll_rates), + [VPLL] = PLL(pll_rk3328, PLL_VPLL, RK3562_PLL_CON(32), + RK3562_MODE_CON, 6, 10, 0, rk3562_pll_rates), + [HPLL] = PLL(pll_rk3328, PLL_HPLL, RK3562_PLL_CON(40), + RK3562_MODE_CON, 8, 10, 0, rk3562_pll_rates), + [CPLL] = PLL(pll_rk3328, PLL_CPLL, RK3562_PMU1_PLL_CON(0), + RK3562_PMU1_MODE_CON, 0, 10, 0, rk3562_pll_rates), + [DPLL] = PLL(pll_rk3328, PLL_DPLL, RK3562_SUBDDR_PLL_CON(0), + RK3562_SUBDDR_MODE_CON, 0, 10, 0, NULL), +}; + +#define RK3562_CPUCLK_RATE(_rate, _aclk_m_core, _pclk_dbg) \ +{ \ + .rate = _rate##U, \ + .aclk_div = _aclk_m_core, \ + .pclk_div = _pclk_dbg, \ +} + +static struct rockchip_cpu_rate_table rk3562_cpu_rates[] = { + RK3562_CPUCLK_RATE(1416000000, 1, 8), + RK3562_CPUCLK_RATE(1296000000, 1, 8), + RK3562_CPUCLK_RATE(1200000000, 1, 8), + RK3562_CPUCLK_RATE(1104000000, 1, 8), + RK3562_CPUCLK_RATE(1008000000, 1, 8), + RK3562_CPUCLK_RATE(912000000, 1, 6), + RK3562_CPUCLK_RATE(816000000, 1, 6), + RK3562_CPUCLK_RATE(600000000, 1, 6), + RK3562_CPUCLK_RATE(408000000, 1, 4), + { /* sentinel */ }, +}; + +#ifndef CONFIG_SPL_BUILD +#define RK3562_CLK_DUMP(_id, _name) \ +{ \ + .id = _id, \ + .name = _name, \ +} + +static const struct rk3562_clk_info clks_dump[] = { + RK3562_CLK_DUMP(PLL_APLL, "apll"), + RK3562_CLK_DUMP(PLL_GPLL, "gpll"), + RK3562_CLK_DUMP(PLL_VPLL, "vpll"), + RK3562_CLK_DUMP(PLL_HPLL, "hpll"), + RK3562_CLK_DUMP(PLL_CPLL, "cpll"), + RK3562_CLK_DUMP(PLL_DPLL, "dpll"), + RK3562_CLK_DUMP(ACLK_BUS, "aclk_bus"), + RK3562_CLK_DUMP(HCLK_BUS, "hclk_bus"), + RK3562_CLK_DUMP(PCLK_BUS, "pclk_bus"), + RK3562_CLK_DUMP(ACLK_PERI, "aclk_peri"), + RK3562_CLK_DUMP(HCLK_PERI, "hclk_peri"), + RK3562_CLK_DUMP(PCLK_PERI, "pclk_peri"), +}; +#endif + +/* + * + * rational_best_approximation(31415, 10000, + * (1 << 8) - 1, (1 << 5) - 1, &n, &d); + * + * you may look at given_numerator as a fixed point number, + * with the fractional part size described in given_denominator. + * + * for theoretical background, see: + * http://en.wikipedia.org/wiki/Continued_fraction + */ +static void rational_best_approximation(unsigned long given_numerator, + unsigned long given_denominator, + unsigned long max_numerator, + unsigned long max_denominator, + unsigned long *best_numerator, + unsigned long *best_denominator) +{ + unsigned long n, d, n0, d0, n1, d1; + + n = given_numerator; + d = given_denominator; + n0 = 0; + d1 = 0; + n1 = 1; + d0 = 1; + for (;;) { + unsigned long t, a; + + if (n1 > max_numerator || d1 > max_denominator) { + n1 = n0; + d1 = d0; + break; + } + if (d == 0) + break; + t = d; + a = n / d; + d = n % d; + n = t; + t = n0 + a * n1; + n0 = n1; + n1 = t; + t = d0 + a * d1; + d0 = d1; + d1 = t; + } + *best_numerator = n1; + *best_denominator = d1; +} + +static int rk3562_armclk_set_rate(struct rk3562_clk_priv *priv, ulong new_rate) +{ + const struct rockchip_cpu_rate_table *rate; + struct rk3562_cru *cru = priv->cru; + ulong old_rate; + + rate = rockchip_get_cpu_settings(rk3562_cpu_rates, new_rate); + if (!rate) { + printf("%s unsupported rate\n", __func__); + return -EINVAL; + } + + /* + * set up dependent divisors for DBG and ACLK clocks. + */ + old_rate = rockchip_pll_get_rate(&rk3562_pll_clks[APLL], priv->cru, + APLL); + if (old_rate == new_rate) { + rk_clrsetreg(&cru->clksel_con[11], ACLK_CORE_PRE_DIV_MASK, + rate->aclk_div << ACLK_CORE_PRE_DIV_SHIFT); + rk_clrsetreg(&cru->clksel_con[12], PCLK_DBG_PRE_DIV_MASK, + rate->pclk_div << PCLK_DBG_PRE_DIV_SHIFT); + rk_clrsetreg(&cru->clksel_con[10], CLK_CORE_PRE_DIV_MASK, 0); + } else if (old_rate > new_rate) { + if (rockchip_pll_set_rate(&rk3562_pll_clks[APLL], + priv->cru, APLL, new_rate)) + return -EINVAL; + rk_clrsetreg(&cru->clksel_con[11], ACLK_CORE_PRE_DIV_MASK, + rate->aclk_div << ACLK_CORE_PRE_DIV_SHIFT); + rk_clrsetreg(&cru->clksel_con[12], PCLK_DBG_PRE_DIV_MASK, + rate->pclk_div << PCLK_DBG_PRE_DIV_SHIFT); + rk_clrsetreg(&cru->clksel_con[10], CLK_CORE_PRE_DIV_MASK, 0); + } else if (old_rate < new_rate) { + rk_clrsetreg(&cru->clksel_con[11], ACLK_CORE_PRE_DIV_MASK, + rate->aclk_div << ACLK_CORE_PRE_DIV_SHIFT); + rk_clrsetreg(&cru->clksel_con[12], PCLK_DBG_PRE_DIV_MASK, + rate->pclk_div << PCLK_DBG_PRE_DIV_SHIFT); + rk_clrsetreg(&cru->clksel_con[10], CLK_CORE_PRE_DIV_MASK, 0); + + if (rockchip_pll_set_rate(&rk3562_pll_clks[APLL], + priv->cru, APLL, new_rate)) + return -EINVAL; + } + + return 0; +} + +static ulong rk3562_bus_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, con, div; + ulong rate; + + switch (clk_id) { + case ACLK_BUS: + con = readl(&cru->clksel_con[40]); + sel = (con & ACLK_BUS_SEL_MASK) >> ACLK_BUS_SEL_SHIFT; + div = (con & ACLK_BUS_DIV_MASK) >> ACLK_BUS_DIV_SHIFT; + break; + case HCLK_BUS: + con = readl(&cru->clksel_con[40]); + sel = (con & HCLK_BUS_SEL_MASK) >> HCLK_BUS_SEL_SHIFT; + div = (con & HCLK_BUS_DIV_MASK) >> HCLK_BUS_DIV_SHIFT; + break; + case PCLK_BUS: + con = readl(&cru->clksel_con[41]); + sel = (con & PCLK_BUS_SEL_MASK) >> PCLK_BUS_SEL_SHIFT; + div = (con & PCLK_BUS_DIV_MASK) >> PCLK_BUS_DIV_SHIFT; + break; + default: + return -ENOENT; + } + + if (sel == ACLK_BUS_SEL_CPLL) + rate = priv->cpll_hz; + else + rate = priv->gpll_hz; + + return DIV_TO_RATE(rate, div); +} + +static ulong rk3562_bus_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, div; + + if (priv->cpll_hz % rate == 0) { + sel = ACLK_BUS_SEL_CPLL; + div = DIV_ROUND_UP(priv->cpll_hz, rate); + } else { + sel= ACLK_BUS_SEL_GPLL; + div = DIV_ROUND_UP(priv->gpll_hz, rate); + } + + switch (clk_id) { + case ACLK_BUS: + rk_clrsetreg(&cru->clksel_con[40], + ACLK_BUS_SEL_MASK | ACLK_BUS_DIV_MASK, + (sel << ACLK_BUS_SEL_SHIFT) | + ((div - 1) << ACLK_BUS_DIV_SHIFT)); + break; + case HCLK_BUS: + rk_clrsetreg(&cru->clksel_con[40], + HCLK_BUS_SEL_MASK | HCLK_BUS_DIV_MASK, + (sel << HCLK_BUS_SEL_SHIFT) | + ((div - 1) << HCLK_BUS_DIV_SHIFT)); + break; + case PCLK_BUS: + rk_clrsetreg(&cru->clksel_con[41], + PCLK_BUS_SEL_MASK | PCLK_BUS_DIV_MASK, + (sel << PCLK_BUS_SEL_SHIFT) | + ((div - 1) << PCLK_BUS_DIV_SHIFT)); + break; + default: + return -ENOENT; + } + + return rk3562_bus_get_rate(priv, clk_id); +} + +static ulong rk3562_peri_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, con, div; + ulong rate; + + switch (clk_id) { + case ACLK_PERI: + con = readl(&cru->periclksel_con[0]); + sel = (con & ACLK_PERI_SEL_MASK) >> ACLK_PERI_SEL_SHIFT; + div = (con & ACLK_PERI_DIV_MASK) >> ACLK_PERI_DIV_SHIFT; + break; + case HCLK_PERI: + con = readl(&cru->periclksel_con[0]); + sel = (con & HCLK_PERI_SEL_MASK) >> HCLK_PERI_SEL_SHIFT; + div = (con & HCLK_PERI_DIV_MASK) >> HCLK_PERI_DIV_SHIFT; + break; + case PCLK_PERI: + con = readl(&cru->periclksel_con[1]); + sel = (con & PCLK_PERI_SEL_MASK) >> PCLK_PERI_SEL_SHIFT; + div = (con & PCLK_PERI_DIV_MASK) >> PCLK_PERI_DIV_SHIFT; + break; + default: + return -ENOENT; + } + + if (sel == ACLK_PERI_SEL_CPLL) + rate = priv->cpll_hz; + else + rate = priv->gpll_hz; + + return DIV_TO_RATE(rate, div); +} + +static ulong rk3562_peri_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, div; + + if (priv->cpll_hz % rate == 0) { + sel = ACLK_PERI_SEL_CPLL; + div = DIV_ROUND_UP(priv->cpll_hz, rate); + } else { + sel= ACLK_PERI_SEL_GPLL; + div = DIV_ROUND_UP(priv->gpll_hz, rate); + } + + switch (clk_id) { + case ACLK_PERI: + rk_clrsetreg(&cru->periclksel_con[0], + ACLK_PERI_SEL_MASK | ACLK_PERI_DIV_MASK, + (sel << ACLK_PERI_SEL_SHIFT) | + ((div - 1) << ACLK_PERI_DIV_SHIFT)); + break; + case HCLK_PERI: + rk_clrsetreg(&cru->periclksel_con[0], + HCLK_PERI_SEL_MASK | HCLK_PERI_DIV_MASK, + (sel << HCLK_PERI_SEL_SHIFT) | + ((div - 1) << HCLK_PERI_DIV_SHIFT)); + break; + case PCLK_PERI: + rk_clrsetreg(&cru->periclksel_con[1], + PCLK_PERI_SEL_MASK | PCLK_PERI_DIV_MASK, + (sel << PCLK_PERI_SEL_SHIFT) | + ((div - 1) << PCLK_PERI_DIV_SHIFT)); + break; + default: + return -ENOENT; + } + + return rk3562_peri_get_rate(priv, clk_id); +} + +static ulong rk3562_i2c_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, con, div; + ulong rate; + + switch (clk_id) { + case CLK_PMU0_I2C0: + con = readl(&cru->pmu0clksel_con[3]); + sel = (con & CLK_PMU0_I2C0_SEL_MASK) >> CLK_PMU0_I2C0_SEL_SHIFT; + if (sel == CLK_PMU0_I2C0_SEL_200M) + rate = 200 * MHz; + else if (sel == CLK_PMU0_I2C0_SEL_24M) + rate = OSC_HZ; + else + rate = 32768; + div = (con & CLK_PMU0_I2C0_DIV_MASK) >> CLK_PMU0_I2C0_DIV_SHIFT; + + return DIV_TO_RATE(rate, div); + case CLK_I2C: + case CLK_I2C1: + case CLK_I2C2: + case CLK_I2C3: + case CLK_I2C4: + case CLK_I2C5: + con = readl(&cru->clksel_con[41]); + sel = (con & CLK_I2C_SEL_MASK) >> CLK_I2C_SEL_SHIFT; + if (sel == CLK_I2C_SEL_200M) + rate = 200 * MHz; + else if (sel == CLK_I2C_SEL_100M) + rate = 100 * MHz; + else if (sel == CLK_I2C_SEL_50M) + rate = 50 * MHz; + else + rate = OSC_HZ; + break; + default: + return -ENOENT; + } + + return rate; +} + +static ulong rk3562_i2c_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, div; + + switch (clk_id) { + case CLK_PMU0_I2C0: + if (rate == 200 * MHz) { + sel = CLK_PMU0_I2C0_SEL_200M; + div = 1; + } else if (rate == OSC_HZ) { + sel = CLK_PMU0_I2C0_SEL_24M; + div = 1; + } else if (rate == 32768) { + sel = CLK_PMU0_I2C0_SEL_32K; + div = 1; + } else { + sel = CLK_PMU0_I2C0_SEL_200M; + div = DIV_ROUND_UP(200 * MHz, rate); + assert(div - 1 <= 31); + } + rk_clrsetreg(&cru->pmu0clksel_con[3], CLK_PMU0_I2C0_DIV_MASK, + (div - 1) << CLK_PMU0_I2C0_DIV_SHIFT); + rk_clrsetreg(&cru->pmu0clksel_con[3], CLK_PMU0_I2C0_SEL_MASK, + sel << CLK_PMU0_I2C0_SEL_SHIFT); + break; + case CLK_I2C: + case CLK_I2C2: + case CLK_I2C3: + case CLK_I2C4: + case CLK_I2C5: + if (rate == 200 * MHz) + sel = CLK_I2C_SEL_200M; + else if (rate == 100 * MHz) + sel = CLK_I2C_SEL_100M; + else if (rate == 50 * MHz) + sel = CLK_I2C_SEL_50M; + else + sel = CLK_I2C_SEL_24M; + rk_clrsetreg(&cru->clksel_con[41], CLK_I2C_SEL_MASK, + sel << CLK_I2C_SEL_SHIFT); + break; + default: + return -ENOENT; + } + + + return rk3562_i2c_get_rate(priv, clk_id); +} + +static ulong rk3562_uart_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 reg, con, fracdiv, div, src, p_src, p_rate; + unsigned long m, n; + + switch (clk_id) { + case SCLK_PMU1_UART0: + con = readl(&cru->pmu1clksel_con[2]); + src = (con & CLK_PMU1_UART0_SEL_MASK) >> + CLK_PMU1_UART0_SEL_SHIFT; + div = (con & CLK_PMU1_UART0_SRC_DIV_MASK) >> + CLK_PMU1_UART0_SRC_DIV_SHIFT; + if (src == CLK_UART_SEL_SRC) { + return DIV_TO_RATE(priv->cpll_hz, div); + } else if (src == CLK_UART_SEL_FRAC) { + fracdiv = readl(&cru->pmu1clksel_con[3]); + n = fracdiv & CLK_UART_FRAC_NUMERATOR_MASK; + n >>= CLK_UART_FRAC_NUMERATOR_SHIFT; + m = fracdiv & CLK_UART_FRAC_DENOMINATOR_MASK; + m >>= CLK_UART_FRAC_DENOMINATOR_SHIFT; + return DIV_TO_RATE(priv->cpll_hz, div) * n / m; + } else { + return OSC_HZ; + } + case SCLK_UART1: + reg = 21; + break; + case SCLK_UART2: + reg = 23; + break; + case SCLK_UART3: + reg = 25; + break; + case SCLK_UART4: + reg = 27; + break; + case SCLK_UART5: + reg = 29; + break; + case SCLK_UART6: + reg = 31; + break; + case SCLK_UART7: + reg = 33; + break; + case SCLK_UART8: + reg = 35; + break; + case SCLK_UART9: + reg = 37; + break; + default: + return -ENOENT; + } + con = readl(&cru->periclksel_con[reg]); + src = (con & CLK_UART_SEL_MASK) >> CLK_UART_SEL_SHIFT; + div = (con & CLK_UART_SRC_DIV_MASK) >> CLK_UART_SRC_DIV_SHIFT; + p_src = (con & CLK_UART_SRC_SEL_MASK) >> CLK_UART_SRC_SEL_SHIFT; + if (p_src == CLK_UART_SRC_SEL_GPLL) + p_rate = priv->gpll_hz; + else + p_rate = priv->cpll_hz; + if (src == CLK_UART_SEL_SRC) { + return DIV_TO_RATE(p_rate, div); + } else if (src == CLK_UART_SEL_FRAC) { + fracdiv = readl(&cru->periclksel_con[reg + 1]); + n = fracdiv & CLK_UART_FRAC_NUMERATOR_MASK; + n >>= CLK_UART_FRAC_NUMERATOR_SHIFT; + m = fracdiv & CLK_UART_FRAC_DENOMINATOR_MASK; + m >>= CLK_UART_FRAC_DENOMINATOR_SHIFT; + return DIV_TO_RATE(p_rate, div) * n / m; + } else { + return OSC_HZ; + } +} + +static ulong rk3562_uart_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 reg, clk_src, uart_src, div; + unsigned long m = 0, n = 0, val; + + switch (clk_id) { + case SCLK_PMU1_UART0: + if (priv->cpll_hz % rate == 0) { + uart_src = CLK_UART_SEL_SRC; + div = DIV_ROUND_UP(priv->cpll_hz, rate); + } else if (rate == OSC_HZ) { + uart_src = CLK_UART_SEL_XIN24M; + div = 2; + } else { + uart_src = CLK_UART_SEL_FRAC; + div = 2; + rational_best_approximation(rate, priv->cpll_hz / div, + GENMASK(16 - 1, 0), + GENMASK(16 - 1, 0), + &n, &m); + } + + rk_clrsetreg(&cru->pmu1clksel_con[2], + CLK_PMU1_UART0_SEL_MASK | + CLK_PMU1_UART0_SRC_DIV_MASK, + (uart_src << CLK_PMU1_UART0_SEL_SHIFT) | + ((div - 1) << CLK_PMU1_UART0_SRC_DIV_SHIFT)); + if (m && n) { + val = n << CLK_UART_FRAC_NUMERATOR_SHIFT | m; + writel(val, &cru->pmu1clksel_con[3]); + } + + return rk3562_uart_get_rate(priv, clk_id); + case SCLK_UART1: + reg = 21; + break; + case SCLK_UART2: + reg = 23; + break; + case SCLK_UART3: + reg = 25; + break; + case SCLK_UART4: + reg = 27; + break; + case SCLK_UART5: + reg = 29; + break; + case SCLK_UART6: + reg = 31; + break; + case SCLK_UART7: + reg = 33; + break; + case SCLK_UART8: + reg = 35; + break; + case SCLK_UART9: + reg = 37; + break; + default: + return -ENOENT; + } + + if (priv->gpll_hz % rate == 0) { + clk_src = CLK_UART_SRC_SEL_GPLL; + uart_src = CLK_UART_SEL_SRC; + div = DIV_ROUND_UP(priv->gpll_hz, rate); + } else if (priv->cpll_hz % rate == 0) { + clk_src = CLK_UART_SRC_SEL_CPLL; + uart_src = CLK_UART_SEL_SRC; + div = DIV_ROUND_UP(priv->cpll_hz, rate); + } else if (rate == OSC_HZ) { + clk_src = CLK_UART_SRC_SEL_GPLL; + uart_src = CLK_UART_SEL_XIN24M; + div = 2; + } else { + clk_src = CLK_UART_SRC_SEL_GPLL; + uart_src = CLK_UART_SEL_FRAC; + div = 2; + rational_best_approximation(rate, priv->gpll_hz / div, + GENMASK(16 - 1, 0), + GENMASK(16 - 1, 0), + &n, &m); + } + + rk_clrsetreg(&cru->periclksel_con[reg], + CLK_UART_SEL_MASK | CLK_UART_SRC_SEL_MASK | + CLK_UART_SRC_DIV_MASK, + (clk_src << CLK_UART_SRC_SEL_SHIFT) | + (uart_src << CLK_UART_SEL_SHIFT) | + ((div - 1) << CLK_UART_SRC_DIV_SHIFT)); + if (m && n) { + val = n << CLK_UART_FRAC_NUMERATOR_SHIFT | m; + writel(val, &cru->periclksel_con[reg + 1]); + } + + return rk3562_uart_get_rate(priv, clk_id); +} + +static ulong rk3562_pwm_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, con, div, mask, shift; + ulong rate; + + switch (clk_id) { + case CLK_PMU1_PWM0: + con = readl(&cru->pmu1clksel_con[4]); + sel = (con & CLK_PMU1_PWM0_SEL_MASK) >> CLK_PMU1_PWM0_SEL_SHIFT; + if (sel == CLK_PMU1_PWM0_SEL_200M) + rate = 200 * MHz; + else if (sel == CLK_PMU1_PWM0_SEL_24M) + rate = OSC_HZ; + else + rate = 32768; + div = (con & CLK_PMU1_PWM0_DIV_MASK) >> CLK_PMU1_PWM0_DIV_SHIFT; + + return DIV_TO_RATE(rate, div); + case CLK_PWM1_PERI: + mask = CLK_PWM1_PERI_SEL_MASK; + shift = CLK_PWM1_PERI_SEL_SHIFT; + break; + case CLK_PWM2_PERI: + mask = CLK_PWM2_PERI_SEL_MASK; + shift = CLK_PWM2_PERI_SEL_SHIFT; + break; + case CLK_PWM3_PERI: + mask = CLK_PWM3_PERI_SEL_MASK; + shift = CLK_PWM3_PERI_SEL_SHIFT; + break; + default: + return -ENOENT; + } + + con = readl(&cru->periclksel_con[40]); + sel = (con & mask) >> shift; + if (sel == CLK_PWM_SEL_100M) + rate = 100 * MHz; + else if (sel == CLK_PWM_SEL_50M) + rate = 50 * MHz; + else + rate = OSC_HZ; + + return rate; +} + +static ulong rk3562_pwm_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, div, mask, shift; + + switch (clk_id) { + case CLK_PMU1_PWM0: + if (rate == 200 * MHz) { + sel = CLK_PMU1_PWM0_SEL_200M; + div = 1; + } else if (rate == OSC_HZ) { + sel = CLK_PMU1_PWM0_SEL_24M; + div = 1; + } else if (rate == 32768) { + sel = CLK_PMU1_PWM0_SEL_32K; + div = 1; + } else { + sel = CLK_PMU1_PWM0_SEL_200M; + div = DIV_ROUND_UP(200 * MHz, rate); + assert(div - 1 <= 3); + } + rk_clrsetreg(&cru->pmu1clksel_con[4], CLK_PMU1_PWM0_DIV_MASK, + (div - 1) << CLK_PMU1_PWM0_DIV_SHIFT); + rk_clrsetreg(&cru->pmu1clksel_con[4], CLK_PMU1_PWM0_SEL_MASK, + sel << CLK_PMU1_PWM0_SEL_SHIFT); + + return rk3562_pwm_get_rate(priv, clk_id); + case CLK_PWM1_PERI: + mask = CLK_PWM1_PERI_SEL_MASK; + shift = CLK_PWM1_PERI_SEL_SHIFT; + break; + case CLK_PWM2_PERI: + mask = CLK_PWM2_PERI_SEL_MASK; + shift = CLK_PWM2_PERI_SEL_SHIFT; + break; + case CLK_PWM3_PERI: + mask = CLK_PWM3_PERI_SEL_MASK; + shift = CLK_PWM3_PERI_SEL_SHIFT; + break; + default: + return -ENOENT; + } + + if (rate == 100 * MHz) + sel = CLK_PWM_SEL_100M; + else if (rate == 50 * MHz) + sel = CLK_PWM_SEL_50M; + else + sel = CLK_PWM_SEL_24M; + rk_clrsetreg(&cru->periclksel_con[40], mask, sel << shift); + + return rk3562_pwm_get_rate(priv, clk_id); +} + +static ulong rk3562_spi_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, con, div, mask, shift; + ulong rate; + + switch (clk_id) { + case CLK_PMU1_SPI0: + con = readl(&cru->pmu1clksel_con[4]); + sel = (con & CLK_PMU1_SPI0_SEL_MASK) >> CLK_PMU1_SPI0_SEL_SHIFT; + if (sel == CLK_PMU1_SPI0_SEL_200M) + rate = 200 * MHz; + else if (sel == CLK_PMU1_SPI0_SEL_24M) + rate = OSC_HZ; + else + rate = 32768; + div = (con & CLK_PMU1_SPI0_DIV_MASK) >> CLK_PMU1_SPI0_DIV_SHIFT; + + return DIV_TO_RATE(rate, div); + case CLK_SPI1: + mask = CLK_SPI1_SEL_MASK; + shift = CLK_SPI1_SEL_SHIFT; + break; + case CLK_SPI2: + mask = CLK_SPI2_SEL_MASK; + shift = CLK_SPI2_SEL_SHIFT; + break; + default: + return -ENOENT; + } + + con = readl(&cru->periclksel_con[20]); + sel = (con & mask) >> shift; + if (sel == CLK_SPI_SEL_200M) + rate = 200 * MHz; + else if (sel == CLK_SPI_SEL_100M) + rate = 100 * MHz; + else if (sel == CLK_SPI_SEL_50M) + rate = 50 * MHz; + else + rate = OSC_HZ; + + return rate; +} + +static ulong rk3562_spi_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, div, mask, shift; + + switch (clk_id) { + case CLK_PMU1_SPI0: + if (rate == 200 * MHz) { + sel = CLK_PMU1_SPI0_SEL_200M; + div = 1; + } else if (rate == OSC_HZ) { + sel = CLK_PMU1_SPI0_SEL_24M; + div = 1; + } else if (rate == 32768) { + sel = CLK_PMU1_SPI0_SEL_32K; + div = 1; + } else { + sel = CLK_PMU1_SPI0_SEL_200M; + div = DIV_ROUND_UP(200 * MHz, rate); + assert(div - 1 <= 3); + } + rk_clrsetreg(&cru->pmu1clksel_con[4], CLK_PMU1_SPI0_DIV_MASK, + (div - 1) << CLK_PMU1_SPI0_DIV_SHIFT); + rk_clrsetreg(&cru->pmu1clksel_con[4], CLK_PMU1_SPI0_SEL_MASK, + sel << CLK_PMU1_SPI0_SEL_SHIFT); + + return rk3562_spi_get_rate(priv, clk_id); + case CLK_SPI1: + mask = CLK_SPI1_SEL_MASK; + shift = CLK_SPI1_SEL_SHIFT; + break; + case CLK_SPI2: + mask = CLK_SPI2_SEL_MASK; + shift = CLK_SPI2_SEL_SHIFT; + break; + default: + return -ENOENT; + } + + if (rate == 200 * MHz) + sel = CLK_SPI_SEL_200M; + else if (rate == 100 * MHz) + sel = CLK_SPI_SEL_100M; + else if (rate == 50 * MHz) + sel = CLK_SPI_SEL_50M; + else + sel = CLK_SPI_SEL_24M; + rk_clrsetreg(&cru->periclksel_con[20], mask, sel << shift); + + return rk3562_spi_get_rate(priv, clk_id); +} + +static ulong rk3562_tsadc_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 div, con; + + con = readl(&cru->clksel_con[43]); + switch (clk_id) { + case CLK_TSADC_TSEN: + div = (con & CLK_TSADC_TSEN_DIV_MASK) >> + CLK_TSADC_TSEN_DIV_SHIFT; + break; + case CLK_TSADC: + div = (con & CLK_TSADC_DIV_MASK) >> CLK_TSADC_DIV_SHIFT; + break; + default: + return -ENOENT; + } + + return DIV_TO_RATE(OSC_HZ, div); +} + +static ulong rk3562_tsadc_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 div, mask, shift; + + switch (clk_id) { + case CLK_TSADC_TSEN: + mask = CLK_TSADC_TSEN_DIV_MASK; + shift = CLK_TSADC_TSEN_DIV_SHIFT; + break; + case CLK_TSADC: + mask = CLK_TSADC_DIV_MASK; + shift = CLK_TSADC_DIV_SHIFT; + break; + default: + return -ENOENT; + } + + div = DIV_ROUND_UP(OSC_HZ, rate); + rk_clrsetreg(&cru->clksel_con[43], mask, (div - 1) << shift); + + return rk3562_tsadc_get_rate(priv, clk_id); +} + +static ulong rk3562_saradc_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 div, con; + + switch (clk_id) { + case CLK_SARADC_VCCIO156: + con = readl(&cru->clksel_con[44]); + div = (con & CLK_SARADC_VCCIO156_DIV_MASK) >> + CLK_SARADC_VCCIO156_DIV_SHIFT; + break; + case CLK_SARADC: + con = readl(&cru->periclksel_con[46]); + div = (con & CLK_SARADC_DIV_MASK) >> CLK_SARADC_DIV_SHIFT; + break; + default: + return -ENOENT; + } + + return DIV_TO_RATE(OSC_HZ, div); +} + +static ulong rk3562_saradc_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 div; + + switch (clk_id) { + case CLK_SARADC_VCCIO156: + div = DIV_ROUND_UP(OSC_HZ, rate); + rk_clrsetreg(&cru->clksel_con[44], CLK_SARADC_VCCIO156_DIV_MASK, + (div - 1) << CLK_SARADC_VCCIO156_DIV_SHIFT); + break; + case CLK_SARADC: + div = DIV_ROUND_UP(OSC_HZ, rate); + rk_clrsetreg(&cru->periclksel_con[46], CLK_SARADC_DIV_MASK, + (div - 1) << CLK_SARADC_DIV_SHIFT); + break; + default: + return -ENOENT; + } + + return rk3562_saradc_get_rate(priv, clk_id); +} + +static ulong rk3562_sfc_get_rate(struct rk3562_clk_priv *priv) +{ + struct rk3562_cru *cru = priv->cru; + u32 div, sel, con, parent; + + con = readl(&cru->periclksel_con[20]); + div = (con & SCLK_SFC_DIV_MASK) >> SCLK_SFC_DIV_SHIFT; + sel = (con & SCLK_SFC_SEL_MASK) >> SCLK_SFC_SEL_SHIFT; + if (sel == SCLK_SFC_SRC_SEL_GPLL) + parent = priv->gpll_hz; + else if (sel == SCLK_SFC_SRC_SEL_CPLL) + parent = priv->cpll_hz; + else + parent = OSC_HZ; + + return DIV_TO_RATE(parent, div); +} + +static ulong rk3562_sfc_set_rate(struct rk3562_clk_priv *priv, ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + int div, sel; + + if (OSC_HZ % rate == 0) { + div = DIV_ROUND_UP(OSC_HZ, rate); + sel = SCLK_SFC_SRC_SEL_24M; + } else if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = SCLK_SFC_SRC_SEL_CPLL; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = SCLK_SFC_SRC_SEL_GPLL; + } + + assert(div - 1 <= 255); + rk_clrsetreg(&cru->periclksel_con[20], + SCLK_SFC_SEL_MASK | SCLK_SFC_DIV_MASK, + sel << SCLK_SFC_SEL_SHIFT | + (div - 1) << SCLK_SFC_DIV_SHIFT); + + return rk3562_sfc_get_rate(priv); +} + +static ulong rk3562_emmc_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 div, sel, con, parent; + + switch (clk_id) { + case CCLK_EMMC: + con = readl(&cru->periclksel_con[18]); + div = (con & CCLK_EMMC_DIV_MASK) >> CCLK_EMMC_DIV_SHIFT; + sel = (con & CCLK_EMMC_SEL_MASK) >> CCLK_EMMC_SEL_SHIFT; + if (sel == CCLK_EMMC_SEL_GPLL) + parent = priv->gpll_hz; + else if (sel == CCLK_EMMC_SEL_CPLL) + parent = priv->cpll_hz; + else if (sel == CCLK_EMMC_SEL_HPLL) + parent = priv->hpll_hz; + else + parent = OSC_HZ; + break; + case BCLK_EMMC: + con = readl(&cru->periclksel_con[19]); + div = (con & BCLK_EMMC_DIV_MASK) >> BCLK_EMMC_DIV_SHIFT; + sel = (con & BCLK_EMMC_SEL_MASK) >> BCLK_EMMC_SEL_SHIFT; + if (sel == BCLK_EMMC_SEL_GPLL) + parent = priv->gpll_hz; + else + parent = priv->cpll_hz; + break; + default: + return -ENOENT; + } + + return DIV_TO_RATE(parent, div); +} + +static ulong rk3562_emmc_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + int div, sel; + + switch (clk_id) { + case CCLK_EMMC: + if (OSC_HZ % rate == 0) { + div = DIV_ROUND_UP(OSC_HZ, rate); + sel = CCLK_EMMC_SEL_24M; + } else if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = CCLK_EMMC_SEL_CPLL; + } else if ((priv->hpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->hpll_hz, rate); + sel = CCLK_EMMC_SEL_HPLL; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = CCLK_EMMC_SEL_GPLL; + } + rk_clrsetreg(&cru->periclksel_con[18], + CCLK_EMMC_SEL_MASK | CCLK_EMMC_DIV_MASK, + sel << CCLK_EMMC_SEL_SHIFT | + (div - 1) << CCLK_EMMC_DIV_SHIFT); + break; + case BCLK_EMMC: + if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = BCLK_EMMC_SEL_CPLL; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = BCLK_EMMC_SEL_GPLL; + } + rk_clrsetreg(&cru->periclksel_con[19], + BCLK_EMMC_SEL_MASK | BCLK_EMMC_DIV_MASK, + sel << BCLK_EMMC_SEL_SHIFT | + (div - 1) << BCLK_EMMC_DIV_SHIFT); + break; + default: + return -ENOENT; + } + + return rk3562_emmc_get_rate(priv, clk_id); +} + +static ulong rk3562_sdmmc_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 div, sel, con; + ulong prate; + + switch (clk_id) { + case HCLK_SDMMC0: + case CCLK_SDMMC0: + case SCLK_SDMMC0_SAMPLE: + con = readl(&cru->periclksel_con[16]); + div = (con & CCLK_SDMMC0_DIV_MASK) >> CCLK_SDMMC0_DIV_SHIFT; + sel = (con & CCLK_SDMMC0_SEL_MASK) >> CCLK_SDMMC0_SEL_SHIFT; + break; + case HCLK_SDMMC1: + case CCLK_SDMMC1: + case SCLK_SDMMC1_SAMPLE: + con = readl(&cru->periclksel_con[17]); + div = (con & CCLK_SDMMC1_DIV_MASK) >> CCLK_SDMMC1_DIV_SHIFT; + sel = (con & CCLK_SDMMC1_SEL_MASK) >> CCLK_SDMMC1_SEL_SHIFT; + break; + default: + return -ENOENT; + } + + if (sel == CCLK_SDMMC_SEL_GPLL) + prate = priv->gpll_hz; + else if (sel == CCLK_SDMMC_SEL_CPLL) + prate = priv->cpll_hz; + else if (sel == CCLK_SDMMC_SEL_HPLL) + prate = priv->hpll_hz; + else + prate = OSC_HZ; + + return DIV_TO_RATE(prate, div); +} + +static ulong rk3562_sdmmc_set_rate(struct rk3562_clk_priv *priv, + ulong clk_id, ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 div, sel; + + if (OSC_HZ % rate == 0) { + div = DIV_ROUND_UP(OSC_HZ, rate); + sel = CCLK_SDMMC_SEL_24M; + } else if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = CCLK_SDMMC_SEL_CPLL; + } else if ((priv->hpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->hpll_hz, rate); + sel = CCLK_SDMMC_SEL_HPLL; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = CCLK_SDMMC_SEL_CPLL; + } + + switch (clk_id) { + case HCLK_SDMMC0: + case CCLK_SDMMC0: + rk_clrsetreg(&cru->periclksel_con[16], + CCLK_SDMMC0_SEL_MASK | CCLK_SDMMC0_DIV_MASK, + sel << CCLK_SDMMC0_SEL_SHIFT | + (div - 1) << CCLK_SDMMC0_DIV_SHIFT); + break; + case HCLK_SDMMC1: + case CCLK_SDMMC1: + rk_clrsetreg(&cru->periclksel_con[17], + CCLK_SDMMC1_SEL_MASK | CCLK_SDMMC1_DIV_MASK, + sel << CCLK_SDMMC1_SEL_SHIFT | + (div - 1) << CCLK_SDMMC1_DIV_SHIFT); + break; + default: + return -ENOENT; + } + + return rk3562_sdmmc_get_rate(priv, clk_id); +} + +static ulong rk3562_vop_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 con, sel, div; + ulong prate; + + switch (clk_id) { + case ACLK_VOP: + con = readl(&cru->clksel_con[28]); + div = (con & ACLK_VOP_DIV_MASK) >> ACLK_VOP_DIV_SHIFT; + sel = (con & ACLK_VOP_SEL_MASK) >> ACLK_VOP_SEL_SHIFT; + if (sel == ACLK_VOP_SEL_GPLL) + prate = priv->gpll_hz; + else if (sel == ACLK_VOP_SEL_CPLL) + prate = priv->cpll_hz; + else if (sel == ACLK_VOP_SEL_HPLL) + prate = priv->hpll_hz; + else if (sel == ACLK_VOP_SEL_VPLL) + prate = priv->vpll_hz; + else + return -ENOENT; + + return DIV_TO_RATE(prate, div); + case DCLK_VOP: + con = readl(&cru->clksel_con[30]); + div = (con & DCLK_VOP_DIV_MASK) >> DCLK_VOP_DIV_SHIFT; + sel = (con & DCLK_VOP_SEL_MASK) >> DCLK_VOP_SEL_SHIFT; + if (sel == DCLK_VOP_SEL_VPLL) + priv->vpll_hz = + rockchip_pll_get_rate(&rk3562_pll_clks[VPLL], + priv->cru, VPLL); + break; + case DCLK_VOP1: + con = readl(&cru->clksel_con[31]); + div = (con & DCLK_VOP1_DIV_MASK) >> DCLK_VOP1_DIV_SHIFT; + sel = (con & DCLK_VOP1_SEL_MASK) >> DCLK_VOP1_SEL_SHIFT; + break; + default: + return -ENOENT; + } + + if (sel == DCLK_VOP_SEL_GPLL) + prate = priv->gpll_hz; + else if (sel == DCLK_VOP_SEL_HPLL) + prate = priv->hpll_hz; + else if (sel == DCLK_VOP_SEL_VPLL) + prate = priv->vpll_hz; + else + return -ENOENT; + + return DIV_TO_RATE(prate, div); +} + +#define RK3562_VOP_PLL_LIMIT_FREQ 600000000 + +static ulong rk3562_vop_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 i, div, sel, best_div = 0, best_sel = 0; + ulong pll_rate, now, best_rate = 0; + + switch (clk_id) { + case ACLK_VOP: + if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = ACLK_VOP_SEL_CPLL; + } else if ((priv->hpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->hpll_hz, rate); + sel = ACLK_VOP_SEL_HPLL; + } else if ((priv->vpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->vpll_hz, rate); + sel = ACLK_VOP_SEL_VPLL; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = ACLK_VOP_SEL_GPLL; + } + rk_clrsetreg(&cru->clksel_con[28], + ACLK_VOP_SEL_MASK | ACLK_VOP_DIV_MASK, + sel << ACLK_VOP_SEL_SHIFT | + ((div - 1) << ACLK_VOP_DIV_SHIFT)); + + return rk3562_vop_get_rate(priv, clk_id); + case DCLK_VOP: + div = DIV_ROUND_UP(RK3562_VOP_PLL_LIMIT_FREQ, rate); + rk_clrsetreg(&cru->clksel_con[30], + DCLK_VOP_SEL_MASK | DCLK_VOP_DIV_MASK, + DCLK_VOP_SEL_VPLL << DCLK_VOP_SEL_SHIFT | + ((div - 1) << DCLK_VOP_DIV_SHIFT)); + rockchip_pll_set_rate(&rk3562_pll_clks[VPLL], priv->cru, + VPLL, div * rate); + break; + case DCLK_VOP1: + for (i = 0; i <= DCLK_VOP_SEL_APLL; i++) { + switch (i) { + case DCLK_VOP_SEL_GPLL: + pll_rate = priv->gpll_hz; + break; + case DCLK_VOP_SEL_HPLL: + pll_rate = priv->hpll_hz; + break; + case DCLK_VOP_SEL_VPLL: + case DCLK_VOP_SEL_APLL: + continue; + default: + printf("do not support this vop pll sel\n"); + return -EINVAL; + } + + div = DIV_ROUND_UP(pll_rate, rate); + if (div > 255) + continue; + now = pll_rate / div; + if (abs(rate - now) < abs(rate - best_rate)) { + best_rate = now; + best_div = div; + best_sel = i; + } + debug("p_rate=%lu, best_rate=%lu, div=%u, sel=%u\n", + pll_rate, best_rate, best_div, best_sel); + } + if (best_rate) { + rk_clrsetreg(&cru->clksel_con[31], + DCLK_VOP1_SEL_MASK | DCLK_VOP1_DIV_MASK, + best_sel << DCLK_VOP1_SEL_SHIFT | + (best_div - 1) << DCLK_VOP1_DIV_SHIFT); + } else { + printf("do not support this vop freq %lu\n", rate); + return -EINVAL; + } + break; + default: + return -ENOENT; + } + + return rk3562_vop_get_rate(priv, clk_id); +} + +static ulong rk3562_gmac_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 con, sel, div; + ulong prate; + + switch (clk_id) { + case CLK_GMAC_125M_CRU_I: + con = readl(&cru->clksel_con[45]); + sel = (con & CLK_GMAC_125M_SEL_MASK) >> CLK_GMAC_125M_SEL_SHIFT; + if (sel == CLK_GMAC_125M) + return 125000000; + else + return OSC_HZ; + case CLK_GMAC_50M_CRU_I: + con = readl(&cru->clksel_con[45]); + sel = (con & CLK_GMAC_50M_SEL_MASK) >> CLK_GMAC_50M_SEL_SHIFT; + if (sel == CLK_GMAC_50M) + return 50000000; + else + return OSC_HZ; + case CLK_MAC100_50M_MATRIX: + con = readl(&cru->clksel_con[47]); + sel = (con & CLK_GMAC_50M_SEL_MASK) >> CLK_GMAC_50M_SEL_SHIFT; + if (sel == CLK_GMAC_50M) + return 50000000; + else + return OSC_HZ; + case CLK_GMAC_ETH_OUT2IO: + con = readl(&cru->clksel_con[46]); + sel = (con & CLK_GMAC_ETH_OUT2IO_SEL_MASK) >> CLK_GMAC_ETH_OUT2IO_SEL_SHIFT; + div = (con & CLK_GMAC_ETH_OUT2IO_DIV_MASK) >> CLK_GMAC_ETH_OUT2IO_DIV_SHIFT; + if (sel == CLK_GMAC_ETH_OUT2IO_GPLL) + prate = priv->gpll_hz; + else + prate = priv->cpll_hz; + break; + default: + return -ENOENT; + } + + return DIV_TO_RATE(prate, div); +} + +static ulong rk3562_gmac_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, div; + + switch (clk_id) { + case CLK_GMAC_125M_CRU_I: + if (rate == 125000000) + sel = CLK_GMAC_125M; + else + sel = CLK_GMAC_24M; + rk_clrsetreg(&cru->clksel_con[45], CLK_GMAC_125M_SEL_MASK, + sel << CLK_GMAC_125M_SEL_SHIFT); + break; + case CLK_GMAC_50M_CRU_I: + if (rate == 50000000) + sel = CLK_GMAC_50M; + else + sel = CLK_GMAC_24M; + rk_clrsetreg(&cru->clksel_con[45], CLK_GMAC_50M_SEL_MASK, + sel << CLK_GMAC_50M_SEL_SHIFT); + break; + case CLK_MAC100_50M_MATRIX: + if (rate == 50000000) + sel = CLK_GMAC_50M; + else + sel = CLK_GMAC_24M; + rk_clrsetreg(&cru->clksel_con[47], CLK_GMAC_50M_SEL_MASK, + sel << CLK_GMAC_50M_SEL_SHIFT); + break; + case CLK_GMAC_ETH_OUT2IO: + if ((priv->cpll_hz % rate) == 0) { + div = DIV_ROUND_UP(priv->cpll_hz, rate); + sel = CLK_GMAC_ETH_OUT2IO_CPLL; + } else { + div = DIV_ROUND_UP(priv->gpll_hz, rate); + sel = CLK_GMAC_ETH_OUT2IO_GPLL; + } + rk_clrsetreg(&cru->clksel_con[46], + CLK_GMAC_ETH_OUT2IO_SEL_MASK | CLK_GMAC_ETH_OUT2IO_DIV_MASK, + sel << CLK_GMAC_ETH_OUT2IO_SEL_SHIFT | + (div - 1) << CLK_GMAC_ETH_OUT2IO_DIV_SHIFT); + break; + default: + return -ENOENT; + } + + return rk3562_gmac_get_rate(priv, clk_id); +} + +static ulong rk3562_clk_get_rate(struct clk *clk) +{ + struct rk3562_clk_priv *priv = dev_get_priv(clk->dev); + ulong rate = 0; + + if (!priv->gpll_hz || !priv->cpll_hz || !priv->hpll_hz) { + printf("%s: gpll=%lu, cpll=%lu, hpll=%lu\n", + __func__, priv->gpll_hz, priv->cpll_hz, priv->hpll_hz); + return -ENOENT; + } + + switch (clk->id) { + case PLL_APLL: + case ARMCLK: + rate = rockchip_pll_get_rate(&rk3562_pll_clks[APLL], priv->cru, + APLL); + break; + case PLL_GPLL: + rate = rockchip_pll_get_rate(&rk3562_pll_clks[GPLL], priv->cru, + GPLL); + break; + + case PLL_VPLL: + rate = rockchip_pll_get_rate(&rk3562_pll_clks[VPLL], priv->cru, + VPLL); + break; + case PLL_HPLL: + rate = rockchip_pll_get_rate(&rk3562_pll_clks[HPLL], priv->cru, + HPLL); + break; + case PLL_CPLL: + rate = rockchip_pll_get_rate(&rk3562_pll_clks[CPLL], priv->cru, + CPLL); + break; + case PLL_DPLL: + rate = rockchip_pll_get_rate(&rk3562_pll_clks[DPLL], priv->cru, + DPLL); + break; + case ACLK_BUS: + case HCLK_BUS: + case PCLK_BUS: + rate = rk3562_bus_get_rate(priv, clk->id); + break; + case ACLK_PERI: + case HCLK_PERI: + case PCLK_PERI: + rate = rk3562_peri_get_rate(priv, clk->id); + break; + case CLK_PMU0_I2C0: + case CLK_I2C: + case CLK_I2C1: + case CLK_I2C2: + case CLK_I2C3: + case CLK_I2C4: + case CLK_I2C5: + rate = rk3562_i2c_get_rate(priv, clk->id); + break; + case SCLK_PMU1_UART0: + case SCLK_UART1: + case SCLK_UART2: + case SCLK_UART3: + case SCLK_UART4: + case SCLK_UART5: + case SCLK_UART6: + case SCLK_UART7: + case SCLK_UART8: + case SCLK_UART9: + rate = rk3562_uart_get_rate(priv, clk->id); + break; + case CLK_PMU1_PWM0: + case CLK_PWM1_PERI: + case CLK_PWM2_PERI: + case CLK_PWM3_PERI: + rate = rk3562_pwm_get_rate(priv, clk->id); + break; + case CLK_PMU1_SPI0: + case CLK_SPI1: + case CLK_SPI2: + rate = rk3562_spi_get_rate(priv, clk->id); + break; + case CLK_TSADC: + case CLK_TSADC_TSEN: + rate = rk3562_tsadc_get_rate(priv, clk->id); + break; + case CLK_SARADC: + case CLK_SARADC_VCCIO156: + rate = rk3562_saradc_get_rate(priv, clk->id); + break; + case SCLK_SFC: + rate = rk3562_sfc_get_rate(priv); + break; + case CCLK_EMMC: + case BCLK_EMMC: + rate = rk3562_emmc_get_rate(priv, clk->id); + break; + case HCLK_SDMMC0: + case HCLK_SDMMC1: + case CCLK_SDMMC0: + case CCLK_SDMMC1: + case SCLK_SDMMC0_SAMPLE: + case SCLK_SDMMC1_SAMPLE: + rate = rk3562_sdmmc_get_rate(priv, clk->id); + break; + case ACLK_VOP: + case DCLK_VOP: + case DCLK_VOP1: + rate = rk3562_vop_get_rate(priv, clk->id); + break; + case CLK_GMAC_125M_CRU_I: + case CLK_GMAC_50M_CRU_I: + case CLK_GMAC_ETH_OUT2IO: + case CLK_MAC100_50M_MATRIX: + rate = rk3562_gmac_get_rate(priv, clk->id); + break; + case CLK_WDTNS: + rate = OSC_HZ; + break; + default: + return -ENOENT; + } + + return rate; +}; + +static ulong rk3562_clk_set_rate(struct clk *clk, ulong rate) +{ + struct rk3562_clk_priv *priv = dev_get_priv(clk->dev); + ulong ret = 0; + + if (!priv->gpll_hz || !priv->cpll_hz || !priv->hpll_hz) { + printf("%s: gpll=%lu, cpll=%lu, hpll=%lu\n", + __func__, priv->gpll_hz, priv->cpll_hz, priv->hpll_hz); + return -ENOENT; + } + + debug("%s: id=%ld, rate=%ld\n", __func__, clk->id, rate); + + switch (clk->id) { + case PLL_APLL: + case ARMCLK: + if (priv->armclk_hz) + rk3562_armclk_set_rate(priv, rate); + priv->armclk_hz = rate; + break; + case PLL_GPLL: + ret = rockchip_pll_set_rate(&rk3562_pll_clks[GPLL], priv->cru, + GPLL, rate); + priv->gpll_hz = rockchip_pll_get_rate(&rk3562_pll_clks[GPLL], + priv->cru, GPLL); + break; + case PLL_VPLL: + ret = rockchip_pll_set_rate(&rk3562_pll_clks[VPLL], priv->cru, + VPLL, rate); + priv->vpll_hz = rockchip_pll_get_rate(&rk3562_pll_clks[VPLL], + priv->cru, VPLL); + break; + case PLL_HPLL: + ret = rockchip_pll_set_rate(&rk3562_pll_clks[HPLL], priv->cru, + HPLL, rate); + priv->hpll_hz = rockchip_pll_get_rate(&rk3562_pll_clks[HPLL], + priv->cru, HPLL); + break; + case ACLK_BUS: + case HCLK_BUS: + case PCLK_BUS: + ret = rk3562_bus_set_rate(priv, clk->id, rate); + break; + case ACLK_PERI: + case HCLK_PERI: + case PCLK_PERI: + ret = rk3562_peri_set_rate(priv, clk->id, rate); + break; + case CLK_PMU0_I2C0: + case CLK_I2C: + case CLK_I2C1: + case CLK_I2C2: + case CLK_I2C3: + case CLK_I2C4: + case CLK_I2C5: + ret = rk3562_i2c_set_rate(priv, clk->id, rate); + break; + case SCLK_PMU1_UART0: + case SCLK_UART1: + case SCLK_UART2: + case SCLK_UART3: + case SCLK_UART4: + case SCLK_UART5: + case SCLK_UART6: + case SCLK_UART7: + case SCLK_UART8: + case SCLK_UART9: + ret = rk3562_uart_set_rate(priv, clk->id, rate); + break; + case CLK_PMU1_PWM0: + case CLK_PWM1_PERI: + case CLK_PWM2_PERI: + case CLK_PWM3_PERI: + ret = rk3562_pwm_set_rate(priv, clk->id, rate); + break; + case CLK_PMU1_SPI0: + case CLK_SPI1: + case CLK_SPI2: + ret = rk3562_spi_set_rate(priv, clk->id, rate); + break; + case CLK_TSADC: + case CLK_TSADC_TSEN: + ret = rk3562_tsadc_set_rate(priv, clk->id, rate); + break; + case CLK_SARADC: + case CLK_SARADC_VCCIO156: + ret = rk3562_saradc_set_rate(priv, clk->id, rate); + break; + case SCLK_SFC: + ret = rk3562_sfc_set_rate(priv, rate); + break; + case CCLK_EMMC: + case BCLK_EMMC: + ret = rk3562_emmc_set_rate(priv, clk->id, rate); + break; + case HCLK_SDMMC0: + case HCLK_SDMMC1: + case CCLK_SDMMC0: + case CCLK_SDMMC1: + ret = rk3562_sdmmc_set_rate(priv, clk->id, rate); + break; + case ACLK_VOP: + case DCLK_VOP: + case DCLK_VOP1: + ret = rk3562_vop_set_rate(priv, clk->id, rate); + break; + case CLK_GMAC_125M_CRU_I: + case CLK_GMAC_50M_CRU_I: + case CLK_GMAC_ETH_OUT2IO: + case CLK_MAC100_50M_MATRIX: + ret = rk3562_gmac_set_rate(priv, clk->id, rate); + break; + default: + return -ENOENT; + } + + return ret; +}; + +#define ROCKCHIP_MMC_DELAY_SEL BIT(11) +#define ROCKCHIP_MMC_DEGREE_SHIFT 1 +#define ROCKCHIP_MMC_DEGREE_MASK (0x3 << ROCKCHIP_MMC_DEGREE_SHIFT) +#define ROCKCHIP_MMC_DELAYNUM_SHIFT 3 +#define ROCKCHIP_MMC_DELAYNUM_MASK (0xff << ROCKCHIP_MMC_DELAYNUM_SHIFT) +#define PSECS_PER_SEC 1000000000000LL + +/* + * Each fine delay is between 44ps-77ps. Assume each fine delay is 60ps to + * simplify calculations. So 45degs could be anywhere between 33deg and 57.8deg. + */ +#define ROCKCHIP_MMC_DELAY_ELEMENT_PSEC 60 + +int rk3562_mmc_get_phase(struct clk *clk) +{ + struct rk3562_clk_priv *priv = dev_get_priv(clk->dev); + struct rk3562_cru *cru = priv->cru; + u32 raw_value, delay_num; + u16 degrees = 0; + ulong rate; + + rate = rk3562_clk_get_rate(clk); + if (rate < 0) + return rate; + + if (clk->id == SCLK_SDMMC0_SAMPLE) + raw_value = readl(&cru->sdmmc0_con[1]); + else if (clk->id == SCLK_SDMMC0_SAMPLE) + raw_value = readl(&cru->sdmmc1_con[1]); + else + return -ENONET; + + raw_value &= ROCKCHIP_MMC_DEGREE_MASK; + degrees = (raw_value >> ROCKCHIP_MMC_DEGREE_SHIFT) * 90; + + if (raw_value & ROCKCHIP_MMC_DELAY_SEL) { + /* degrees/delaynum * 10000 */ + unsigned long factor = (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10) * + 36 * (rate / 1000000); + + delay_num = (raw_value & ROCKCHIP_MMC_DELAYNUM_MASK); + delay_num >>= ROCKCHIP_MMC_DELAYNUM_SHIFT; + degrees += DIV_ROUND_CLOSEST(delay_num * factor, 10000); + } + + return degrees % 360; +} + +int rk3562_mmc_set_phase(struct clk *clk, u32 degrees) +{ + struct rk3562_clk_priv *priv = dev_get_priv(clk->dev); + struct rk3562_cru *cru = priv->cru; + u8 nineties, remainder, delay_num; + u32 raw_value, delay; + ulong rate; + + rate = rk3562_clk_get_rate(clk); + if (rate < 0) + return rate; + + nineties = degrees / 90; + remainder = (degrees % 90); + + /* + * Convert to delay; do a little extra work to make sure we + * don't overflow 32-bit / 64-bit numbers. + */ + delay = 10000000; /* PSECS_PER_SEC / 10000 / 10 */ + delay *= remainder; + delay = DIV_ROUND_CLOSEST(delay, (rate / 1000) * 36 * + (ROCKCHIP_MMC_DELAY_ELEMENT_PSEC / 10)); + + delay_num = (u8)min_t(u32, delay, 255); + + raw_value = delay_num ? ROCKCHIP_MMC_DELAY_SEL : 0; + raw_value |= delay_num << ROCKCHIP_MMC_DELAYNUM_SHIFT; + raw_value |= nineties << ROCKCHIP_MMC_DEGREE_SHIFT; + + if (clk->id == SCLK_SDMMC0_SAMPLE) + writel(raw_value | 0xffff0000, &cru->sdmmc0_con[1]); + else + writel(raw_value | 0xffff0000, &cru->sdmmc1_con[1]); + + debug("mmc set_phase(%d) delay_nums=%u reg=%#x actual_degrees=%d\n", + degrees, delay_num, raw_value, rk3562_mmc_get_phase(clk)); + + return 0; +} + +static int rk3562_clk_get_phase(struct clk *clk) +{ + int ret; + + switch (clk->id) { + case SCLK_SDMMC0_SAMPLE: + case SCLK_SDMMC1_SAMPLE: + ret = rk3562_mmc_get_phase(clk); + break; + default: + return -ENOENT; + } + + return ret; +} + +static int rk3562_clk_set_phase(struct clk *clk, int degrees) +{ + int ret; + + switch (clk->id) { + case SCLK_SDMMC0_SAMPLE: + case SCLK_SDMMC1_SAMPLE: + ret = rk3562_mmc_set_phase(clk, degrees); + break; + default: + return -ENOENT; + } + + return ret; +} + +static struct clk_ops rk3562_clk_ops = { + .get_rate = rk3562_clk_get_rate, + .set_rate = rk3562_clk_set_rate, + .get_phase = rk3562_clk_get_phase, + .set_phase = rk3562_clk_set_phase, +}; + +#ifndef CONFIG_SPL_BUILD +/** + * soc_clk_dump() - Print clock frequencies + * Returns zero on success + * + * Implementation for the clk dump command. + */ +int soc_clk_dump(void) +{ + const struct rk3562_clk_info *clk_dump; + struct rk3562_clk_priv *priv; + struct udevice *cru_dev; + struct clk clk; + ulong clk_count = ARRAY_SIZE(clks_dump); + ulong rate; + int i, ret; + + ret = uclass_get_device_by_driver(UCLASS_CLK, + DM_GET_DRIVER(rockchip_rk3562_cru), + &cru_dev); + if (ret) { + printf("%s failed to get cru device\n", __func__); + return ret; + } + + priv = dev_get_priv(cru_dev); + printf("CLK: (%s. arm: enter %lu KHz, init %lu KHz, kernel %lu%s)\n", + priv->sync_kernel ? "sync kernel" : "uboot", + priv->armclk_enter_hz / 1000, + priv->armclk_init_hz / 1000, + priv->set_armclk_rate ? priv->armclk_hz / 1000 : 0, + priv->set_armclk_rate ? " KHz" : "N/A"); + for (i = 0; i < clk_count; i++) { + clk_dump = &clks_dump[i]; + if (clk_dump->name) { + clk.id = clk_dump->id; + ret = clk_request(cru_dev, &clk); + if (ret < 0) + return ret; + + rate = clk_get_rate(&clk); + clk_free(&clk); + if (i == 0) { + if (rate < 0) + printf(" %s %s\n", clk_dump->name, + "unknown"); + else + printf(" %s %lu KHz\n", clk_dump->name, + rate / 1000); + } else { + if (rate < 0) + printf(" %s %s\n", clk_dump->name, + "unknown"); + else + printf(" %s %lu KHz\n", clk_dump->name, + rate / 1000); + } + } + } + + return 0; +} +#endif + +static void rk3562_clk_init(struct rk3562_clk_priv *priv) +{ + int ret; + + priv->sync_kernel = false; + if (!priv->armclk_enter_hz) + priv->armclk_enter_hz = + rockchip_pll_get_rate(&rk3562_pll_clks[APLL], + priv->cru, APLL); + + if (!priv->armclk_init_hz) { +#ifdef CONFIG_SPL_BUILD + ret = rk3562_armclk_set_rate(priv, APLL_HZ); + if (!ret) + priv->armclk_init_hz = APLL_HZ; + +#else + struct clk clk; + + ret = rockchip_get_scmi_clk(&clk.dev); + if (ret) { + printf("Failed to get scmi clk dev\n"); + return; + } + + clk.id = ARMCLK; + ret = clk_set_rate(&clk, CPU_PVTPLL_HZ); + if (ret < 0) { + printf("Failed to set scmi cpu %dhz\n", CPU_PVTPLL_HZ); + return; + } else { + priv->armclk_init_hz = CPU_PVTPLL_HZ; + } +#endif + } + if (priv->cpll_hz != CPLL_HZ) { + ret = rockchip_pll_set_rate(&rk3562_pll_clks[CPLL], priv->cru, + CPLL, CPLL_HZ); + if (!ret) + priv->cpll_hz = CPLL_HZ; + } + + if (priv->gpll_hz != GPLL_HZ) { + ret = rockchip_pll_set_rate(&rk3562_pll_clks[GPLL], priv->cru, + GPLL, GPLL_HZ); + if (!ret) + priv->gpll_hz = GPLL_HZ; + } + + if (priv->hpll_hz != HPLL_HZ) { + ret = rockchip_pll_set_rate(&rk3562_pll_clks[HPLL], priv->cru, + HPLL, HPLL_HZ); + if (!ret) + priv->hpll_hz = HPLL_HZ; + } +} + +static int rk3562_clk_probe(struct udevice *dev) +{ + struct rk3562_clk_priv *priv = dev_get_priv(dev); + int ret; + + rk3562_clk_init(priv); + + /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ + ret = clk_set_defaults(dev); + if (ret) + debug("%s clk_set_defaults failed %d\n", __func__, ret); + else + priv->sync_kernel = true; + + return 0; +} + +static int rk3562_clk_ofdata_to_platdata(struct udevice *dev) +{ + struct rk3562_clk_priv *priv = dev_get_priv(dev); + + priv->cru = dev_read_addr_ptr(dev); + + return 0; +} + +static int rk3562_clk_bind(struct udevice *dev) +{ + struct udevice *sys_child, *sf_child; + struct softreset_reg *sf_priv; + struct sysreset_reg *priv; + int ret; + + /* The reset driver does not have a device node, so bind it here */ + ret = device_bind_driver(dev, "rockchip_sysreset", "sysreset", + &sys_child); + if (ret) { + debug("Warning: No sysreset driver: ret=%d\n", ret); + } else { + priv = malloc(sizeof(struct sysreset_reg)); + priv->glb_srst_fst_value = offsetof(struct rk3562_cru, + glb_srst_fst); + priv->glb_srst_snd_value = offsetof(struct rk3562_cru, + glb_srst_snd); + sys_child->priv = priv; + } + + ret = device_bind_driver_to_node(dev, "rockchip_reset", "reset", + dev_ofnode(dev), &sf_child); + if (ret) { + debug("Warning: No rockchip reset driver: ret=%d\n", ret); + } else { + sf_priv = malloc(sizeof(struct softreset_reg)); + sf_priv->sf_reset_offset = offsetof(struct rk3562_cru, + softrst_con[0]); + /* (0x30444 - 0x400) / 4 + 1 = 49170 */ + sf_priv->sf_reset_num = 49170; + sf_child->priv = sf_priv; + } + + return 0; +} + +static const struct udevice_id rk3562_clk_ids[] = { + { .compatible = "rockchip,rk3562-cru" }, + { } +}; + +U_BOOT_DRIVER(rockchip_rk3562_cru) = { + .name = "rockchip_rk3562_cru", + .id = UCLASS_CLK, + .of_match = rk3562_clk_ids, + .priv_auto_alloc_size = sizeof(struct rk3562_clk_priv), + .ofdata_to_platdata = rk3562_clk_ofdata_to_platdata, + .ops = &rk3562_clk_ops, + .bind = rk3562_clk_bind, + .probe = rk3562_clk_probe, +}; + +/* spl scmi clk */ +#ifdef CONFIG_SPL_BUILD + +static ulong rk3562_crypto_get_rate(struct rk3562_clk_priv *priv, ulong clk_id) +{ + struct rk3562_cru *cru = priv->cru; + u32 sel, con; + ulong rate; + + con = readl(&cru->periclksel_con[43]); + switch (clk_id) { + case CLK_CORE_CRYPTO: + sel = (con & CLK_CORE_CRYPTO_SEL_MASK) >> + CLK_CORE_CRYPTO_SEL_SHIFT; + if (sel == CLK_CORE_CRYPTO_SEL_200M) + rate = 200 * MHz; + else if (sel == CLK_CORE_CRYPTO_SEL_100M) + rate = 100 * MHz; + else + rate = OSC_HZ; + break; + case CLK_PKA_CRYPTO: + sel = (con & CLK_PKA_CRYPTO_SEL_MASK) >> + CLK_PKA_CRYPTO_SEL_SHIFT; + if (sel == CLK_PKA_CRYPTO_SEL_300M) + rate = 300 * MHz; + else if (sel == CLK_PKA_CRYPTO_SEL_200M) + rate = 200 * MHz; + else if (sel == CLK_PKA_CRYPTO_SEL_100M) + rate = 100 * MHz; + else + rate = OSC_HZ; + break; + default: + return -ENOENT; + } + + return rate; +} + +static ulong rk3562_crypto_set_rate(struct rk3562_clk_priv *priv, ulong clk_id, + ulong rate) +{ + struct rk3562_cru *cru = priv->cru; + u32 mask, shift, sel; + + switch (clk_id) { + case CLK_CORE_CRYPTO: + mask = CLK_CORE_CRYPTO_SEL_MASK; + shift = CLK_CORE_CRYPTO_SEL_SHIFT; + if (rate == 200 * MHz) + sel = CLK_CORE_CRYPTO_SEL_200M; + else if (rate == 100 * MHz) + sel = CLK_CORE_CRYPTO_SEL_100M; + else + sel = CLK_CORE_CRYPTO_SEL_24M; + break; + case CLK_PKA_CRYPTO: + mask = CLK_PKA_CRYPTO_SEL_MASK; + shift = CLK_PKA_CRYPTO_SEL_SHIFT; + if (rate == 300 * MHz) + sel = CLK_PKA_CRYPTO_SEL_300M; + else if (rate == 200 * MHz) + sel = CLK_PKA_CRYPTO_SEL_200M; + else if (rate == 100 * MHz) + sel = CLK_PKA_CRYPTO_SEL_100M; + else + sel = CLK_PKA_CRYPTO_SEL_24M; + break; + default: + return -ENOENT; + } + rk_clrsetreg(&cru->periclksel_con[43], mask, sel << shift); + + return rk3562_crypto_get_rate(priv, clk_id); +} + +static ulong rk3562_clk_scmi_get_rate(struct clk *clk) +{ + struct rk3562_clk_priv *priv = dev_get_priv(clk->dev); + + switch (clk->id) { + case CLK_CORE_CRYPTO: + case CLK_PKA_CRYPTO: + return rk3562_crypto_get_rate(priv, clk->id); + default: + return -ENOENT; + } +}; + +static ulong rk3562_clk_scmi_set_rate(struct clk *clk, ulong rate) +{ + struct rk3562_clk_priv *priv = dev_get_priv(clk->dev); + + switch (clk->id) { + case CLK_CORE_CRYPTO: + case CLK_PKA_CRYPTO: + return rk3562_crypto_set_rate(priv, clk->id, rate); + default: + return -ENOENT; + } + return 0; +}; + +static int rk3562_scmi_clk_ofdata_to_platdata(struct udevice *dev) +{ + struct rk3562_clk_priv *priv = dev_get_priv(dev); + + priv->cru = (struct rk3562_cru *)0xff100000; + + return 0; +} + +/* A fake scmi driver for SPL/TPL where smccc agent is not available. */ +static const struct clk_ops scmi_clk_ops = { + .get_rate = rk3562_clk_scmi_get_rate, + .set_rate = rk3562_clk_scmi_set_rate, +}; + +U_BOOT_DRIVER(scmi_clock) = { + .name = "scmi_clk", + .id = UCLASS_CLK, + .ops = &scmi_clk_ops, + .priv_auto_alloc_size = sizeof(struct rk3562_clk_priv), + .ofdata_to_platdata = rk3562_scmi_clk_ofdata_to_platdata, +}; +#endif diff --git a/u-boot/drivers/clk/rockchip/clk_rk3568.c b/u-boot/drivers/clk/rockchip/clk_rk3568.c index 18b8e9d..f6a60d5 100644 --- a/u-boot/drivers/clk/rockchip/clk_rk3568.c +++ b/u-boot/drivers/clk/rockchip/clk_rk3568.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd - * Author: Elaine Zhang <zhangqing@rock-chips.com> + * Author: Joseph Chen <chenjh@rock-chips.com> */ #include <common.h> @@ -1160,7 +1160,7 @@ switch (clk_id) { case CLK_PWM1: - sel = (con & CLK_PWM1_SEL_MASK) >> CLK_PWM3_SEL_SHIFT; + sel = (con & CLK_PWM1_SEL_MASK) >> CLK_PWM1_SEL_SHIFT; break; case CLK_PWM2: sel = (con & CLK_PWM2_SEL_MASK) >> CLK_PWM2_SEL_SHIFT; @@ -1850,7 +1850,7 @@ rockchip_pll_set_rate(&rk3568_pll_clks[VPLL], priv->cru, VPLL, div * rate); } else { - for (i = 0; i <= DCLK_VOP_SEL_CPLL; i++) { + for (i = sel; i <= DCLK_VOP_SEL_CPLL; i++) { switch (i) { case DCLK_VOP_SEL_GPLL: pll_rate = priv->gpll_hz; @@ -3107,9 +3107,15 @@ if (parent->id == PLL_VPLL) { rk_clrsetreg(&cru->clksel_con[con_id], DCLK0_VOP_SEL_MASK, DCLK_VOP_SEL_VPLL << DCLK0_VOP_SEL_SHIFT); - } else { + } else if (parent->id == PLL_HPLL) { rk_clrsetreg(&cru->clksel_con[con_id], DCLK0_VOP_SEL_MASK, DCLK_VOP_SEL_HPLL << DCLK0_VOP_SEL_SHIFT); + } else if (parent->id == PLL_CPLL) { + rk_clrsetreg(&cru->clksel_con[con_id], DCLK0_VOP_SEL_MASK, + DCLK_VOP_SEL_CPLL << DCLK0_VOP_SEL_SHIFT); + } else { + rk_clrsetreg(&cru->clksel_con[con_id], DCLK0_VOP_SEL_MASK, + DCLK_VOP_SEL_GPLL << DCLK0_VOP_SEL_SHIFT); } return 0; diff --git a/u-boot/drivers/clk/rockchip/clk_rk3588.c b/u-boot/drivers/clk/rockchip/clk_rk3588.c index 598d744..715ea04 100644 --- a/u-boot/drivers/clk/rockchip/clk_rk3588.c +++ b/u-boot/drivers/clk/rockchip/clk_rk3588.c @@ -332,12 +332,18 @@ switch (clk_id) { case ACLK_TOP_ROOT: - src_clk_div = DIV_ROUND_UP(priv->gpll_hz, rate); + if (!(priv->cpll_hz % rate)) { + src_clk = ACLK_TOP_ROOT_SRC_SEL_CPLL; + src_clk_div = DIV_ROUND_UP(priv->cpll_hz, rate); + } else { + src_clk = ACLK_TOP_ROOT_SRC_SEL_GPLL; + src_clk_div = DIV_ROUND_UP(priv->gpll_hz, rate); + } assert(src_clk_div - 1 <= 31); rk_clrsetreg(&cru->clksel_con[8], ACLK_TOP_ROOT_DIV_MASK | ACLK_TOP_ROOT_SRC_SEL_MASK, - (ACLK_TOP_ROOT_SRC_SEL_GPLL << + (src_clk << ACLK_TOP_ROOT_SRC_SEL_SHIFT) | (src_clk_div - 1) << ACLK_TOP_ROOT_DIV_SHIFT); break; @@ -1148,13 +1154,23 @@ } if (sel == DCLK_VOP_SRC_SEL_V0PLL) { - div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate); - rk_clrsetreg(&cru->clksel_con[conid], - mask, - DCLK_VOP_SRC_SEL_V0PLL << sel_shift | - ((div - 1) << div_shift)); - rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL], - priv->cru, V0PLL, div * rate); + pll_rate = rockchip_pll_get_rate(&rk3588_pll_clks[V0PLL], + priv->cru, V0PLL); + if (pll_rate >= RK3588_VOP_PLL_LIMIT_FREQ && pll_rate % rate == 0) { + div = DIV_ROUND_UP(pll_rate, rate); + rk_clrsetreg(&cru->clksel_con[conid], + mask, + DCLK_VOP_SRC_SEL_V0PLL << sel_shift | + ((div - 1) << div_shift)); + } else { + div = DIV_ROUND_UP(RK3588_VOP_PLL_LIMIT_FREQ, rate); + rk_clrsetreg(&cru->clksel_con[conid], + mask, + DCLK_VOP_SRC_SEL_V0PLL << sel_shift | + ((div - 1) << div_shift)); + rockchip_pll_set_rate(&rk3588_pll_clks[V0PLL], + priv->cru, V0PLL, div * rate); + } } else { for (i = 0; i <= DCLK_VOP_SRC_SEL_AUPLL; i++) { switch (i) { diff --git a/u-boot/drivers/core/device.c b/u-boot/drivers/core/device.c index e0e9ca1..a8803ee 100644 --- a/u-boot/drivers/core/device.c +++ b/u-boot/drivers/core/device.c @@ -97,8 +97,6 @@ debug("%s do not delete uboot dev: %s\n", __func__, dev->name); return 0; - } else if (drv->id == UCLASS_REGULATOR) { - /* stay in dm tree, in order to handle exclusion */ } else { list_del_init(&dev->uclass_node); } diff --git a/u-boot/drivers/core/fdtaddr.c b/u-boot/drivers/core/fdtaddr.c index 3847dd8..2b25c8d 100644 --- a/u-boot/drivers/core/fdtaddr.c +++ b/u-boot/drivers/core/fdtaddr.c @@ -127,6 +127,16 @@ return devfdt_get_addr_index(dev, 0); } +void *devfdt_remap_addr_index(struct udevice *dev, int index) +{ + fdt_addr_t addr = devfdt_get_addr_index(dev, index); + + if (addr == FDT_ADDR_T_NONE) + return NULL; + + return map_physmem(addr, 0, MAP_NOCACHE); +} + void *devfdt_get_addr_ptr(struct udevice *dev) { return (void *)(uintptr_t)devfdt_get_addr_index(dev, 0); diff --git a/u-boot/drivers/core/read.c b/u-boot/drivers/core/read.c index a7f77e9..a7ce6a4 100644 --- a/u-boot/drivers/core/read.c +++ b/u-boot/drivers/core/read.c @@ -8,6 +8,7 @@ #include <common.h> #include <dm.h> #include <mapmem.h> +#include <asm/io.h> #include <dm/of_access.h> int dev_read_u32_default(struct udevice *dev, const char *propname, int def) @@ -63,6 +64,16 @@ return dev_read_addr_index(dev, 0); } +void *dev_remap_addr_index(struct udevice *dev, int index) +{ + fdt_addr_t addr = dev_read_addr_index(dev, index); + + if (addr == FDT_ADDR_T_NONE) + return NULL; + + return map_physmem(addr, 0, MAP_NOCACHE); +} + void *dev_read_addr_ptr(struct udevice *dev) { fdt_addr_t addr = dev_read_addr(dev); diff --git a/u-boot/drivers/core/root.c b/u-boot/drivers/core/root.c index c928256..0eb2fa9 100644 --- a/u-boot/drivers/core/root.c +++ b/u-boot/drivers/core/root.c @@ -224,12 +224,8 @@ for (np = node_parent->child; np; np = np->sibling) { if (pre_reloc_only && -#ifdef CONFIG_USING_KERNEL_DTB - (!of_find_property(np, "u-boot,dm-pre-reloc", NULL) && - !of_find_property(np, "u-boot,dm-spl", NULL))) -#else - !of_find_property(np, "u-boot,dm-pre-reloc", NULL)) -#endif + (!of_find_property(np, "u-boot,dm-pre-reloc", NULL) && + !of_find_property(np, "u-boot,dm-spl", NULL))) continue; if (!of_device_is_available(np)) { pr_debug(" - ignoring disabled device\n"); @@ -272,7 +268,6 @@ int offset, bool pre_reloc_only) { int ret = 0, err; - const char *name; for (offset = fdt_first_subnode(blob, offset); offset > 0; @@ -291,11 +286,15 @@ ret); } +#if CONFIG_IS_ENABLED(SCMI_FIRMWARE) + const char *name; + /* There is no compatible in "/firmware", bind it by default. */ name = fdt_get_name(blob, offset, NULL); if (name && !strcmp(name, "firmware")) ret = device_bind_driver_to_node(parent, "firmware", name, offset_to_ofnode(offset), NULL); +#endif } if (ret) diff --git a/u-boot/drivers/cpu/amp.its b/u-boot/drivers/cpu/amp.its index 26ed969..e1d3ed0 100644 --- a/u-boot/drivers/cpu/amp.its +++ b/u-boot/drivers/cpu/amp.its @@ -1,20 +1,22 @@ /* * Copyright (C) 2021 Fuzhou Rockchip Electronics Co., Ltd + * * SPDX-License-Identifier: GPL-2.0 */ /dts-v1/; / { - description = "FIT source file for rockchip AMP"; + description = "Rockchip AMP FIT Image"; #address-cells = <1>; images { + /* ARM cortex-A core */ amp1 { description = "bare-mental-core1"; data = /incbin/("./amp1.bin"); - type = "firmware"; + type = "firmware"; // must be "firmware" compression = "none"; - arch = "arm"; // "arm64" or "arm" + arch = "arm"; // "arm64" or "arm", the same as U-Boot state cpu = <0x100>; // mpidr thumb = <0>; // 0: arm or thumb2; 1: thumb hyp = <0>; // 0: el1/svc; 1: el2/hyp @@ -56,6 +58,20 @@ algo = "sha256"; }; }; + + /* Other core */ + amp4 { + description = "standalone-mcu1"; + data = /incbin/("./mcu1.bin"); + type = "standalone"; // must be "standalone" + compression = "none"; + arch = "arm"; // "arm64" or "arm", the same as U-Boot state + load = <0x06800000>; + udelay = <1000000>; + hash { + algo = "sha256"; + }; + }; }; configurations { @@ -63,7 +79,7 @@ conf { description = "Rockchip AMP images"; rollback-index = <0x0>; - loadables = "amp1", "amp2", "amp3"; + loadables = "amp1", "amp2", "amp3", "amp4"; signature { algo = "sha256,rsa2048"; diff --git a/u-boot/drivers/cpu/rockchip_amp.c b/u-boot/drivers/cpu/rockchip_amp.c index 6cf9c35..f17ddf5 100644 --- a/u-boot/drivers/cpu/rockchip_amp.c +++ b/u-boot/drivers/cpu/rockchip_amp.c @@ -134,7 +134,7 @@ flush_dcache_all(); /* fixup: ramdisk/fdt/entry depend on U-Boot */ - *entry = env_get_ulong("kernel_addr_r", 16, 0); + *entry = (u32)images.ep; return 0; } @@ -206,6 +206,31 @@ return 0; } +__weak int fit_standalone_release(char *id, uintptr_t entry_point) +{ + return 0; +} + +static int standalone_handler(const char *id, u32 entry_point, int data_size) +{ + int ret; + + if (!sysmem_alloc_base_by_name(id, + (phys_addr_t)entry_point, data_size)) + return -ENXIO; + + printf("Handle standalone: '%s' at 0x%08x ...", id, entry_point); + + ret = fit_standalone_release((char *)id, entry_point); + if (ret) { + printf("failed, ret=%d\n", ret); + return ret; + } + printf("OK\n"); + + return 0; +} + static int brought_up_amp(void *fit, int noffset, boot_cpu_t *bootcpu, int is_linux) { @@ -217,27 +242,38 @@ int boot_on; int data_size; int i, ret; - u8 arch = -ENODATA; + u8 type = -ENODATA; + u8 arch = -ENODATA; desc = fdt_getprop(fit, noffset, "description", NULL); cpu = fit_get_u32_default(fit, noffset, "cpu", -ENODATA); hyp = fit_get_u32_default(fit, noffset, "hyp", 0); thumb = fit_get_u32_default(fit, noffset, "thumb", 0); - load = fit_get_u32_default(fit, noffset, "load", -ENODATA); + entry = load = fit_get_u32_default(fit, noffset, "load", -ENODATA); us = fit_get_u32_default(fit, noffset, "udelay", 0); boot_on = fit_get_u32_default(fit, noffset, "boot-on", 1); fit_image_get_arch(fit, noffset, &arch); + fit_image_get_type(fit, noffset, &type); fit_image_get_data_size(fit, noffset, &data_size); memset(&args, 0, sizeof(args)); - if (!desc || cpu == -ENODATA || arch == -ENODATA || + /* standalone is simple, just handle it and then exit. Allow failure */ + if (type == IH_TYPE_STANDALONE) { + if (!desc || load == -ENODATA) { + AMP_E("standalone: \"desc\" or \"load\" property missing!\n"); + goto exit; + } + standalone_handler(desc, load, data_size); + goto exit; + } + + if (!desc || cpu == -ENODATA || arch == -ENODATA || type == -ENODATA || (load == -ENODATA && !is_linux)) { AMP_E("Property missing!\n"); return -EINVAL; } aarch64 = (arch == IH_ARCH_ARM) ? 0 : 1; pe_state = PE_STATE(aarch64, hyp, thumb, 0); - entry = load; #ifdef DEBUG AMP_I(" desc: %s\n", desc); @@ -245,7 +281,7 @@ AMP_I(" aarch64: %d\n", aarch64); AMP_I(" hyp: %d\n", hyp); AMP_I(" thumb: %d\n", thumb); - AMP_I(" entry: 0x%08x\n", entry); + AMP_I(" load: 0x%08x\n", load); AMP_I(" pe_state: 0x%08x\n", pe_state); AMP_I(" linux-os: %d\n\n", is_linux); #endif @@ -294,7 +330,7 @@ ret = smc_cpu_on(cpu, pe_state, entry, &args, is_linux); if (ret) return ret; - +exit: if (us) udelay(us); @@ -336,7 +372,7 @@ /* === only boot cpu can reach here === */ - if (!g_bootcpu.linux_os) { + if (!g_bootcpu.linux_os && g_bootcpu.entry) { flush_dcache_all(); AMP_I("Brought up cpu[%x, self] with state 0x%x, entry 0x%08x ...", (u32)read_mpidr() & 0x0fff, g_bootcpu.state, g_bootcpu.entry); diff --git a/u-boot/drivers/crypto/rockchip/crypto_v2.c b/u-boot/drivers/crypto/rockchip/crypto_v2.c index 86226fe..e2135a7 100644 --- a/u-boot/drivers/crypto/rockchip/crypto_v2.c +++ b/u-boot/drivers/crypto/rockchip/crypto_v2.c @@ -8,6 +8,7 @@ #include <crypto.h> #include <dm.h> #include <asm/io.h> +#include <clk-uclass.h> #include <asm/arch/hardware.h> #include <asm/arch/clock.h> #include <rockchip/crypto_hash_cache.h> @@ -54,6 +55,7 @@ char *clocks; u32 *frequencies; u32 nclocks; + u32 freq_nclocks; u32 length; struct rk_hash_ctx *hw_ctx; struct rk_crypto_soc_data *soc_data; @@ -217,6 +219,43 @@ for (i = 0; i < tag_len / 4; i++, chn_base += 4) word2byte_be(crypto_read(chn_base), tag + 4 * i); +} + +static int rk_crypto_do_enable_clk(struct udevice *dev, int enable) +{ + struct rockchip_crypto_priv *priv = dev_get_priv(dev); + struct clk clk; + int i, ret; + + for (i = 0; i < priv->nclocks; i++) { + ret = clk_get_by_index(dev, i, &clk); + if (ret < 0) { + printf("Failed to get clk index %d, ret=%d\n", i, ret); + return ret; + } + + if (enable) + ret = clk_enable(&clk); + else + ret = clk_disable(&clk); + if (ret < 0 && ret != -ENOSYS) { + printf("Failed to enable(%d) clk(%ld): ret=%d\n", + enable, clk.id, ret); + return ret; + } + } + + return 0; +} + +static int rk_crypto_enable_clk(struct udevice *dev) +{ + return rk_crypto_do_enable_clk(dev, 1); +} + +static int rk_crypto_disable_clk(struct udevice *dev) +{ + return rk_crypto_do_enable_clk(dev, 0); } static u32 crypto_v3_dynamic_cap(void) @@ -397,7 +436,7 @@ if (!(*started_flag)) { lli->user_define |= - (LLI_USER_STRING_START | LLI_USER_CPIHER_START); + (LLI_USER_STRING_START | LLI_USER_CIPHER_START); crypto_write((u32)virt_to_phys(lli), CRYPTO_DMA_LLI_ADDR); crypto_write((CRYPTO_HASH_ENABLE << CRYPTO_WRITE_MASK_SHIFT) | CRYPTO_HASH_ENABLE, CRYPTO_HASH_CTL); @@ -520,6 +559,7 @@ { struct rockchip_crypto_priv *priv = dev_get_priv(dev); struct rk_hash_ctx *hash_ctx = priv->hw_ctx; + int ret = 0; if (!ctx) return -EINVAL; @@ -535,7 +575,12 @@ if (!hash_ctx->hash_cache) return -EFAULT; - return rk_hash_init(hash_ctx, ctx->algo); + rk_crypto_enable_clk(dev); + ret = rk_hash_init(hash_ctx, ctx->algo); + if (ret) + rk_crypto_disable_clk(dev); + + return ret; } static int rockchip_crypto_sha_update(struct udevice *dev, @@ -545,8 +590,10 @@ int ret, i; u8 *p; - if (!len) - return -EINVAL; + if (!len) { + ret = -EINVAL; + goto exit; + } p = (u8 *)input; @@ -560,6 +607,9 @@ ret = rk_hash_update(priv->hw_ctx, p, len % HASH_UPDATE_LIMIT); exit: + if (ret) + rk_crypto_disable_clk(dev); + return ret; } @@ -583,6 +633,8 @@ exit: hw_hash_clean_ctx(priv->hw_ctx); + rk_crypto_disable_clk(dev); + return ret; } @@ -614,6 +666,7 @@ { struct rockchip_crypto_priv *priv = dev_get_priv(dev); struct rk_hash_ctx *hash_ctx = priv->hw_ctx; + int ret = 0; if (!ctx) return -EINVAL; @@ -629,7 +682,12 @@ if (!hash_ctx->hash_cache) return -EFAULT; - return rk_hmac_init(priv->hw_ctx, ctx->algo, key, key_len); + rk_crypto_enable_clk(dev); + ret = rk_hmac_init(priv->hw_ctx, ctx->algo, key, key_len); + if (ret) + rk_crypto_disable_clk(dev); + + return ret; } static int rockchip_crypto_hmac_update(struct udevice *dev, @@ -763,6 +821,11 @@ { u32 i; + if (aad_len == 0) { + *padding_size = 0; + return; + } + i = aad_len < (0x10000 - 0x100) ? 2 : 6; if (i == 2) { @@ -779,7 +842,7 @@ *padding_size = i; } -static int ccm_compose_aad_iv(u8 *aad_iv, u32 data_len, u32 tag_size) +static int ccm_compose_aad_iv(u8 *aad_iv, u32 data_len, u32 aad_len, u32 tag_size) { aad_iv[0] |= ((u8)(((tag_size - 2) / 2) & 7) << 3); @@ -788,7 +851,8 @@ aad_iv[14] = (u8)(data_len >> 8); aad_iv[15] = (u8)data_len; - aad_iv[0] |= 0x40; //set aad flag + if (aad_len) + aad_iv[0] |= 0x40; //set aad flag return 0; } @@ -925,12 +989,14 @@ data_desc->dma_ctrl |= LLI_DMA_CTRL_DST_DONE; } + data_desc->user_define = LLI_USER_CIPHER_START | + LLI_USER_STRING_START | + LLI_USER_STRING_LAST | + (key_chn << 4); + crypto_write((u32)virt_to_phys(data_desc), CRYPTO_DMA_LLI_ADDR); + if (rk_mode == RK_MODE_CCM || rk_mode == RK_MODE_GCM) { u32 aad_tmp_len = 0; - - data_desc->user_define = LLI_USER_STRING_START | - LLI_USER_STRING_LAST | - (key_chn << 4); aad_desc = align_malloc(sizeof(*aad_desc), LLI_ADDR_ALIGN_SIZE); if (!aad_desc) @@ -938,7 +1004,7 @@ memset(aad_desc, 0x00, sizeof(*aad_desc)); aad_desc->next_addr = (u32)virt_to_phys(data_desc); - aad_desc->user_define = LLI_USER_CPIHER_START | + aad_desc->user_define = LLI_USER_CIPHER_START | LLI_USER_STRING_START | LLI_USER_STRING_LAST | LLI_USER_STRING_AAD | @@ -958,12 +1024,15 @@ if (!aad_tmp) goto exit; - /* read iv data from reg */ - get_iv_reg(key_chn, aad_tmp, AES_BLOCK_SIZE); - ccm_compose_aad_iv(aad_tmp, tmp_len, tag_len); - memcpy(aad_tmp + AES_BLOCK_SIZE, padding, padding_size); + /* clear last block */ memset(aad_tmp + aad_tmp_len - AES_BLOCK_SIZE, 0x00, AES_BLOCK_SIZE); + + /* read iv data from reg */ + get_iv_reg(key_chn, aad_tmp, AES_BLOCK_SIZE); + ccm_compose_aad_iv(aad_tmp, tmp_len, aad_len, tag_len); + memcpy(aad_tmp + AES_BLOCK_SIZE, padding, padding_size); + memcpy(aad_tmp + AES_BLOCK_SIZE + padding_size, aad, aad_len); } else { @@ -985,15 +1054,15 @@ aad_desc->src_addr = (u32)virt_to_phys(aad_tmp); aad_desc->src_len = aad_tmp_len; - crypto_write((u32)virt_to_phys(aad_desc), CRYPTO_DMA_LLI_ADDR); - cache_op_inner(DCACHE_AREA_CLEAN, aad_tmp, aad_tmp_len); - cache_op_inner(DCACHE_AREA_CLEAN, aad_desc, sizeof(*aad_desc)); - } else { - data_desc->user_define = LLI_USER_CPIHER_START | - LLI_USER_STRING_START | - LLI_USER_STRING_LAST | - (key_chn << 4); - crypto_write((u32)virt_to_phys(data_desc), CRYPTO_DMA_LLI_ADDR); + + if (aad_tmp_len) { + data_desc->user_define = LLI_USER_STRING_START | + LLI_USER_STRING_LAST | + (key_chn << 4); + crypto_write((u32)virt_to_phys(aad_desc), CRYPTO_DMA_LLI_ADDR); + cache_op_inner(DCACHE_AREA_CLEAN, aad_tmp, aad_tmp_len); + cache_op_inner(DCACHE_AREA_CLEAN, aad_desc, sizeof(*aad_desc)); + } } cache_op_inner(DCACHE_AREA_CLEAN, data_desc, sizeof(*data_desc)); @@ -1175,21 +1244,29 @@ int rockchip_crypto_cipher(struct udevice *dev, cipher_context *ctx, const u8 *in, u8 *out, u32 len, bool enc) { + int ret; + + rk_crypto_enable_clk(dev); + switch (ctx->algo) { case CRYPTO_DES: - return rk_crypto_des(dev, ctx->mode, ctx->key, ctx->key_len, - ctx->iv, in, out, len, enc); + ret = rk_crypto_des(dev, ctx->mode, ctx->key, ctx->key_len, + ctx->iv, in, out, len, enc); case CRYPTO_AES: - return rk_crypto_aes(dev, ctx->mode, - ctx->key, ctx->twk_key, ctx->key_len, - ctx->iv, ctx->iv_len, in, out, len, enc); + ret = rk_crypto_aes(dev, ctx->mode, + ctx->key, ctx->twk_key, ctx->key_len, + ctx->iv, ctx->iv_len, in, out, len, enc); case CRYPTO_SM4: - return rk_crypto_sm4(dev, ctx->mode, - ctx->key, ctx->twk_key, ctx->key_len, - ctx->iv, ctx->iv_len, in, out, len, enc); + ret = rk_crypto_sm4(dev, ctx->mode, + ctx->key, ctx->twk_key, ctx->key_len, + ctx->iv, ctx->iv_len, in, out, len, enc); default: - return -EINVAL; + ret = -EINVAL; } + + rk_crypto_disable_clk(dev); + + return ret; } int rk_crypto_mac(struct udevice *dev, u32 algo, u32 mode, @@ -1223,8 +1300,16 @@ int rockchip_crypto_mac(struct udevice *dev, cipher_context *ctx, const u8 *in, u32 len, u8 *tag) { - return rk_crypto_mac(dev, ctx->algo, ctx->mode, - ctx->key, ctx->key_len, in, len, tag); + int ret = 0; + + rk_crypto_enable_clk(dev); + + ret = rk_crypto_mac(dev, ctx->algo, ctx->mode, + ctx->key, ctx->key_len, in, len, tag); + + rk_crypto_disable_clk(dev); + + return ret; } int rk_crypto_ae(struct udevice *dev, u32 algo, u32 mode, @@ -1236,6 +1321,9 @@ int ret; if (!IS_AE_MODE(rk_mode)) + return -EINVAL; + + if (len == 0) return -EINVAL; if (algo != CRYPTO_AES && algo != CRYPTO_SM4) @@ -1261,9 +1349,17 @@ u8 *out, u8 *tag) { - return rk_crypto_ae(dev, ctx->algo, ctx->mode, ctx->key, ctx->key_len, - ctx->iv, ctx->iv_len, in, len, - aad, aad_len, out, tag); + int ret = 0; + + rk_crypto_enable_clk(dev); + + ret = rk_crypto_ae(dev, ctx->algo, ctx->mode, ctx->key, ctx->key_len, + ctx->iv, ctx->iv_len, in, len, + aad, aad_len, out, tag); + + rk_crypto_disable_clk(dev); + + return ret; } #endif @@ -1312,9 +1408,11 @@ if (ret) goto exit; + rk_crypto_enable_clk(dev); ret = rk_exptmod_np(mpa_m, mpa_e, mpa_n, mpa_c, mpa_result); if (!ret) memcpy(output, mpa_result->d, BITS2BYTE(n_bits)); + rk_crypto_disable_clk(dev); exit: rk_mpa_free(&mpa_m); @@ -1378,7 +1476,7 @@ if (!priv->clocks) return -ENOMEM; - priv->nclocks = len / sizeof(u32); + priv->nclocks = len / (2 * sizeof(u32)); if (dev_read_u32_array(dev, "clocks", (u32 *)priv->clocks, priv->nclocks)) { printf("Can't read \"clocks\" property\n"); @@ -1386,24 +1484,19 @@ goto exit; } - if (!dev_read_prop(dev, "clock-frequency", &len)) { - printf("Can't find \"clock-frequency\" property\n"); - ret = -EINVAL; - goto exit; - } - - priv->frequencies = malloc(len); - if (!priv->frequencies) { - ret = -ENOMEM; - goto exit; - } - - priv->nclocks = len / sizeof(u32); - if (dev_read_u32_array(dev, "clock-frequency", priv->frequencies, - priv->nclocks)) { - printf("Can't read \"clock-frequency\" property\n"); - ret = -EINVAL; - goto exit; + if (dev_read_prop(dev, "clock-frequency", &len)) { + priv->frequencies = malloc(len); + if (!priv->frequencies) { + ret = -ENOMEM; + goto exit; + } + priv->freq_nclocks = len / sizeof(u32); + if (dev_read_u32_array(dev, "clock-frequency", priv->frequencies, + priv->freq_nclocks)) { + printf("Can't read \"clock-frequency\" property\n"); + ret = -EINVAL; + goto exit; + } } return 0; @@ -1423,10 +1516,15 @@ struct clk clk; int i, ret; - if (!priv->clocks && priv->nclocks == 0) + /* use standard "assigned-clock-rates" props */ + if (dev_read_size(dev, "assigned-clock-rates") > 0) + return clk_set_defaults(dev); + + /* use "clock-frequency" props */ + if (priv->freq_nclocks == 0) return 0; - for (i = 0; i < priv->nclocks; i++) { + for (i = 0; i < priv->freq_nclocks; i++) { ret = clk_get_by_index(dev, i, &clk); if (ret < 0) { printf("Failed to get clk index %d, ret=%d\n", i, ret); @@ -1465,7 +1563,11 @@ if (ret) return ret; + rk_crypto_enable_clk(dev); + hw_crypto_reset(); + + rk_crypto_disable_clk(dev); return 0; } @@ -1557,6 +1659,10 @@ .compatible = "rockchip,crypto-v3", .data = (ulong)&soc_data_cryptov3 }, + { + .compatible = "rockchip,crypto-v4", + .data = (ulong)&soc_data_cryptov3 /* reuse crypto v3 config */ + }, { } }; diff --git a/u-boot/drivers/gpio/Kconfig b/u-boot/drivers/gpio/Kconfig index f059ea7..412df72 100644 --- a/u-boot/drivers/gpio/Kconfig +++ b/u-boot/drivers/gpio/Kconfig @@ -24,6 +24,15 @@ is a mechanism providing automatic GPIO request and config- uration as part of the gpio-controller's driver probe function. +config GPIO_NO_UC_FLAG_SEQ_ALIAS + bool "Disable GPIO uclass sequence themselves with aliases" + depends on USING_KERNEL_DTB + default n + help + Disable GPIO uclass sequence, this is a workaround when kernel + dtb feature is enabled. Avoid gpio device probe failed when + alloc req_seq both for gpio devices from U-Boot and kernel dtb. + config ALTERA_PIO bool "Altera PIO driver" depends on DM_GPIO @@ -211,12 +220,6 @@ Support for the GPIO controller contained in NVIDIA Tegra186. This covers both the "main" and "AON" controller instances, even though they have slightly different register layout. - -config GPIO_MAX96752F - bool "Maxim MAX96752F GPIO" - depends on DM_GPIO && I2C_MUX_MAX96752F - help - Say yes here to support Maxim MAX96752F GPIOs. config GPIO_UNIPHIER bool "UniPhier GPIO" diff --git a/u-boot/drivers/gpio/Makefile b/u-boot/drivers/gpio/Makefile index 451032a..1396467 100644 --- a/u-boot/drivers/gpio/Makefile +++ b/u-boot/drivers/gpio/Makefile @@ -8,7 +8,6 @@ ifndef CONFIG_SPL_BUILD obj-$(CONFIG_DWAPB_GPIO) += dwapb_gpio.o obj-$(CONFIG_AXP_GPIO) += axp_gpio.o -obj-$(CONFIG_GPIO_MAX96752F) += gpio-max96752f.o endif obj-$(CONFIG_DM_GPIO) += gpio-uclass.o diff --git a/u-boot/drivers/gpio/gpio-max96752f.c b/u-boot/drivers/gpio/gpio-max96752f.c deleted file mode 100644 index 426b30e..0000000 --- a/u-boot/drivers/gpio/gpio-max96752f.c +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2022 Rockchip Electronics Co., Ltd - */ - -#include <asm-generic/gpio.h> -#include <common.h> -#include <dm.h> -#include <i2c.h> -#include <max96752f.h> - -static int max96752f_gpio_direction_output(struct udevice *dev, unsigned offset, - int value) -{ - int ret; - - ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(offset), - GPIO_OUT_DIS | GPIO_OUT, - FIELD_PREP(GPIO_OUT_DIS, 0) | - FIELD_PREP(GPIO_OUT, value)); - if (ret < 0) - return ret; - - return 0; -} - -static int max96752f_gpio_get_value(struct udevice *dev, unsigned offset) -{ - int ret; - - ret = dm_i2c_reg_read(dev->parent, GPIO_A_REG(offset)); - if (ret < 0) - return ret; - - return FIELD_GET(GPIO_OUT, ret); -} - -static int max96752f_gpio_set_value(struct udevice *dev, unsigned offset, - int value) -{ - int ret; - - ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(offset), GPIO_OUT, - FIELD_PREP(GPIO_OUT, value)); - if (ret < 0) - return ret; - - return 0; -} - -static int max96752f_gpio_get_function(struct udevice *dev, unsigned offset) -{ - int ret; - - ret = dm_i2c_reg_read(dev->parent, GPIO_A_REG(offset)); - if (ret < 0) - return ret; - - return FIELD_GET(GPIO_OUT_DIS, ret) ? GPIOF_INPUT : GPIOF_OUTPUT; -} - -static const struct dm_gpio_ops max96752f_gpio_ops = { - .direction_output = max96752f_gpio_direction_output, - .get_value = max96752f_gpio_get_value, - .set_value = max96752f_gpio_set_value, - .get_function = max96752f_gpio_get_function, -}; - -static int max96752f_gpio_probe(struct udevice *dev) -{ - struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev); - - uc_priv->gpio_count = 16; - uc_priv->bank_name = of_node_full_name(dev_np(dev)); - - return 0; -} - -static const struct udevice_id max96752f_gpio_match[] = { - { .compatible = "maxim,max96752f-gpio" }, - { } -}; - -U_BOOT_DRIVER(max96752f_gpio) = { - .name = "max96752f_gpio", - .id = UCLASS_GPIO, - .of_match = max96752f_gpio_match, - .probe = max96752f_gpio_probe, - .ops = &max96752f_gpio_ops, -}; diff --git a/u-boot/drivers/gpio/gpio-uclass.c b/u-boot/drivers/gpio/gpio-uclass.c index 5868dd4..a8479b0 100644 --- a/u-boot/drivers/gpio/gpio-uclass.c +++ b/u-boot/drivers/gpio/gpio-uclass.c @@ -1058,7 +1058,9 @@ UCLASS_DRIVER(gpio) = { .id = UCLASS_GPIO, .name = "gpio", +#ifndef CONFIG_GPIO_NO_UC_FLAG_SEQ_ALIAS .flags = DM_UC_FLAG_SEQ_ALIAS, +#endif .post_probe = gpio_post_probe, .post_bind = gpio_post_bind, .pre_remove = gpio_pre_remove, diff --git a/u-boot/drivers/gpio/rk_gpio.c b/u-boot/drivers/gpio/rk_gpio.c index 593701b..d1c7889 100644 --- a/u-boot/drivers/gpio/rk_gpio.c +++ b/u-boot/drivers/gpio/rk_gpio.c @@ -130,7 +130,6 @@ struct rockchip_pinctrl_priv *pctrl_priv; struct rockchip_pin_bank *bank; char *end = NULL; - static int gpio; int id = -1, ret; priv->regs = dev_read_addr_ptr(dev); @@ -152,14 +151,12 @@ end = strrchr(dev->name, '@'); if (end) id = trailing_strtoln(dev->name, end); - else + if (id < 0) dev_read_alias_seq(dev, &id); - if (id < 0) - id = gpio++; - - if (id >= pctrl_priv->ctrl->nr_banks) { - dev_err(dev, "bank id invalid\n"); + if (id < 0 || id >= pctrl_priv->ctrl->nr_banks) { + dev_err(dev, "nr_banks=%d, bank id=%d invalid\n", + pctrl_priv->ctrl->nr_banks, id); return -EINVAL; } diff --git a/u-boot/drivers/i2c/muxes/Kconfig b/u-boot/drivers/i2c/muxes/Kconfig index d87dee7..a98c33c 100644 --- a/u-boot/drivers/i2c/muxes/Kconfig +++ b/u-boot/drivers/i2c/muxes/Kconfig @@ -51,13 +51,6 @@ If you say yes here you get support for the Maxim MAX96745 I2C multiplexer. -config I2C_MUX_MAX96752F - tristate "Maxim MAX96752F I2C multiplexer" - depends on I2C_MUX - help - If you say yes here you get support for the Maxim MAX96752F - I2C multiplexer. - config I2C_MUX_MAX96755F tristate "Maxim MAX96755F I2C multiplexer" depends on I2C_MUX diff --git a/u-boot/drivers/i2c/muxes/Makefile b/u-boot/drivers/i2c/muxes/Makefile index d41ccb2..959fd9f 100644 --- a/u-boot/drivers/i2c/muxes/Makefile +++ b/u-boot/drivers/i2c/muxes/Makefile @@ -8,6 +8,5 @@ obj-$(CONFIG_I2C_MUX_PCA954x) += pca954x.o obj-$(CONFIG_I2C_MUX_GPIO) += i2c-mux-gpio.o obj-$(CONFIG_I2C_MUX_MAX96745) += max96745.o -obj-$(CONFIG_I2C_MUX_MAX96752F) += max96752f.o obj-$(CONFIG_I2C_MUX_MAX96755F) += max96755f.o diff --git a/u-boot/drivers/i2c/muxes/max96745.c b/u-boot/drivers/i2c/muxes/max96745.c index 1a76c3f..5c85cb5 100644 --- a/u-boot/drivers/i2c/muxes/max96745.c +++ b/u-boot/drivers/i2c/muxes/max96745.c @@ -13,11 +13,18 @@ struct max96745_priv { struct udevice *dev; struct gpio_desc enable_gpio; + struct gpio_desc pwdnb_gpio; + bool idle_disc; }; static int max96745_select(struct udevice *mux, struct udevice *bus, uint channel) { + struct max96745_priv *priv = dev_get_priv(mux); + + if (!priv->idle_disc) + return 0; + if (channel == 1) dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC, FIELD_PREP(DIS_REM_CC, 0)); @@ -31,6 +38,11 @@ static int max96745_deselect(struct udevice *mux, struct udevice *bus, uint channel) { + struct max96745_priv *priv = dev_get_priv(mux); + + if (!priv->idle_disc) + return 0; + if (channel == 1) dm_i2c_reg_clrset(mux, 0x0086, DIS_REM_CC, FIELD_PREP(DIS_REM_CC, 1)); @@ -55,15 +67,27 @@ mdelay(200); } - ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC, - FIELD_PREP(DIS_REM_CC, 1)); + if (dm_gpio_is_valid(&priv->pwdnb_gpio)) { + dm_gpio_set_value(&priv->pwdnb_gpio, 0); + mdelay(30); + } + + /* Set for I2C Fast-mode speed */ + ret = dm_i2c_reg_write(priv->dev, 0x0070, 0x16); if (ret < 0) return ret; - ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC, - FIELD_PREP(DIS_REM_CC, 1)); - if (ret < 0) - return ret; + if (priv->idle_disc) { + ret = dm_i2c_reg_clrset(priv->dev, 0x0076, DIS_REM_CC, + FIELD_PREP(DIS_REM_CC, 1)); + if (ret < 0) + return ret; + + ret = dm_i2c_reg_clrset(priv->dev, 0x0086, DIS_REM_CC, + FIELD_PREP(DIS_REM_CC, 1)); + if (ret < 0) + return ret; + } return 0; } @@ -78,6 +102,7 @@ return ret; priv->dev = dev; + priv->idle_disc = dev_read_bool(dev, "i2c-mux-idle-disconnect"); ret = gpio_request_by_name(dev, "enable-gpios", 0, &priv->enable_gpio, GPIOD_IS_OUT); @@ -86,6 +111,13 @@ return ret; } + ret = gpio_request_by_name(dev, "pwdnb-gpios", 0, + &priv->pwdnb_gpio, GPIOD_IS_OUT); + if (ret && ret != -ENOENT) { + dev_err(dev, "%s: failed to get pwdnb GPIO: %d\n", __func__, ret); + return ret; + } + max96745_power_on(priv); return 0; diff --git a/u-boot/drivers/i2c/muxes/max96752f.c b/u-boot/drivers/i2c/muxes/max96752f.c deleted file mode 100644 index b979859..0000000 --- a/u-boot/drivers/i2c/muxes/max96752f.c +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2022 Rockchip Electronics Co., Ltd - */ - -#include <common.h> -#include <dm.h> -#include <errno.h> -#include <i2c.h> -#include <max96752f.h> - -#include <asm-generic/gpio.h> - -static int max96752f_select(struct udevice *mux, struct udevice *bus, - uint channel) -{ - return 0; -} - -static int max96752f_deselect(struct udevice *mux, struct udevice *bus, - uint channel) -{ - return 0; -} - -static const struct i2c_mux_ops max96752f_ops = { - .select = max96752f_select, - .deselect = max96752f_deselect, -}; - -static uint addr_list[] = { - 0x48, 0x68, 0x6a, 0x4a, 0x4c, 0x6c, 0x28, 0x2a -}; - -void max96752f_init(struct udevice *dev) -{ - struct dm_i2c_chip *chip = dev_get_parent_platdata(dev); - u32 stream_id = dev_read_u32_default(dev->parent, "reg", 0); - uint addr = chip->chip_addr; - int i, ret; - - for (i = 0; i < ARRAY_SIZE(addr_list); i++) { - chip->chip_addr = addr_list[i]; - - ret = dm_i2c_reg_read(dev, 0x000d); - if (ret < 0) - continue; - - if (ret == 0x82) { - dm_i2c_reg_write(dev, 0x0000, addr << 1); - break; - } - } - - chip->chip_addr = addr; - - dm_i2c_reg_clrset(dev, 0x0050, STR_SEL, - FIELD_PREP(STR_SEL, stream_id)); - dm_i2c_reg_clrset(dev, 0x0073, TX_SRC_ID, - FIELD_PREP(TX_SRC_ID, stream_id)); -} - -static int max96752f_probe(struct udevice *dev) -{ - struct gpio_desc enable_gpio; - int ret; - - ret = i2c_set_chip_offset_len(dev, 2); - if (ret) - return ret; - - ret = gpio_request_by_name(dev, "enable-gpios", 0, &enable_gpio, - GPIOD_IS_OUT); - if (ret && ret != -ENOENT) { - dev_err(dev, "%s: failed to get enable GPIO: %d\n", - __func__, ret); - return ret; - } - - if (dm_gpio_is_valid(&enable_gpio)) { - dm_gpio_set_value(&enable_gpio, 1); - mdelay(200); - } - - return 0; -} - -static const struct udevice_id max96752f_of_match[] = { - { .compatible = "maxim,max96752f" }, - {} -}; - -U_BOOT_DRIVER(max96752f) = { - .name = "max96752f", - .id = UCLASS_I2C_MUX, - .of_match = max96752f_of_match, - .bind = dm_scan_fdt_dev, - .probe = max96752f_probe, - .ops = &max96752f_ops, -}; diff --git a/u-boot/drivers/input/adc_key.c b/u-boot/drivers/input/adc_key.c index 391e324..32e63d0 100644 --- a/u-boot/drivers/input/adc_key.c +++ b/u-boot/drivers/input/adc_key.c @@ -11,13 +11,10 @@ static int adc_key_ofdata_to_platdata(struct udevice *dev) { struct dm_key_uclass_platdata *uc_key; - u32 chn[2], mV; - int vref, ret; -#ifdef CONFIG_SARADC_ROCKCHIP_V2 - int range = 4096; /* 12-bit adc */ -#else - int range = 1024; /* 10-bit adc */ -#endif + int t, down_threshold = -1, up_threshold; + int ret, num = 0, volt_margin = 150000; /* will be div 2 */ + u32 voltage, chn[2]; + ofnode node; uc_key = dev_get_uclass_platdata(dev); if (!uc_key) @@ -33,29 +30,50 @@ return -EINVAL; } - vref = dev_read_u32_default(dev_get_parent(dev), + up_threshold = dev_read_u32_default(dev_get_parent(dev), "keyup-threshold-microvolt", -ENODATA); - if (vref < 0) { - printf("%s: read 'keyup-threshold-microvolt' failed, ret=%d\n", - uc_key->name, vref); - return -EINVAL; - } + if (up_threshold < 0) + return -ENODATA; uc_key->code = dev_read_u32_default(dev, "linux,code", -ENODATA); - if (uc_key->code < 0) { - printf("%s: read 'linux,code' failed\n", uc_key->name); - return -EINVAL; + if (uc_key->code < 0) + return -ENODATA; + + voltage = dev_read_u32_default(dev, "press-threshold-microvolt", -ENODATA); + if (voltage < 0) + return -ENODATA; + + dev_for_each_subnode(node, dev->parent) { + ret = ofnode_read_s32(node, "press-threshold-microvolt", &t); + if (ret) + return ret; + + if (t > voltage && t < up_threshold) + up_threshold = t; + else if (t < voltage && t > down_threshold) + down_threshold = t; + num++; } - mV = dev_read_u32_default(dev, "press-threshold-microvolt", -ENODATA); - if (mV < 0) { - printf("%s: read 'press-threshold-microvolt' failed\n", - uc_key->name); - return -EINVAL; + /* although one node only, it doesn't mean only one key on hardware */ + if (num == 1) { + down_threshold = voltage - volt_margin; + up_threshold = voltage + volt_margin; } + uc_key->in_volt = 1; uc_key->channel = chn[1]; - uc_key->adcval = mV / (vref / range); + uc_key->center = voltage; + /* + * Define the voltage range such that the button is only pressed + * when the voltage is closest to its own press-threshold-microvolt + */ + if (down_threshold < 0) + uc_key->min = 0; + else + uc_key->min = down_threshold + (voltage - down_threshold) / 2; + + uc_key->max = voltage + (up_threshold - voltage) / 2; return 0; } diff --git a/u-boot/drivers/input/key-uclass.c b/u-boot/drivers/input/key-uclass.c index f28869a..c4f85da 100644 --- a/u-boot/drivers/input/key-uclass.c +++ b/u-boot/drivers/input/key-uclass.c @@ -6,6 +6,7 @@ #include <common.h> #include <adc.h> +#include <div64.h> #include <dm.h> #include <irq-generic.h> #include <key.h> @@ -37,11 +38,42 @@ return (cntpct > base) ? (cntpct - base) : 0; } -static int key_adc_event(struct dm_key_uclass_platdata *uc_key, int adcval) +#ifdef CONFIG_ADC +static int adc_raw_to_mV(struct udevice *dev, unsigned int raw, int *mV) { - return (adcval <= uc_key->max && adcval >= uc_key->min) ? + unsigned int data_mask; + int ret, vref = 1800000; + u64 raw64 = raw; + + ret = adc_data_mask(dev, &data_mask); + if (ret) + return ret; + + raw64 *= vref; + do_div(raw64, data_mask); + *mV = raw64; + + return 0; +} + +static int key_adc_event(struct udevice *dev, + struct dm_key_uclass_platdata *uc_key, int adcval) +{ + int val = adcval; + + if (uc_key->in_volt) { + if (adc_raw_to_mV(dev, adcval, &val)) + return KEY_PRESS_NONE; + } + + debug("[%s] <%d, %d, %d>: adcval=%d -> mV=%d\n", + uc_key->name, uc_key->min, uc_key->center, uc_key->max, + adcval, val); + + return (val <= uc_key->max && val >= uc_key->min) ? KEY_PRESS_DOWN : KEY_PRESS_NONE; } +#endif static int key_gpio_event(struct dm_key_uclass_platdata *uc_key) { @@ -108,16 +140,34 @@ static int key_core_read(struct dm_key_uclass_platdata *uc_key) { - unsigned int adcval; - if (uc_key->type == ADC_KEY) { - if (adc_channel_single_shot("saradc", - uc_key->channel, &adcval)) { - KEY_ERR("%s failed to read saradc\n", uc_key->name); +#ifdef CONFIG_ADC + struct udevice *dev; + unsigned int adcval; + int ret; + + ret = uclass_get_device_by_name(UCLASS_ADC, "saradc", &dev); + if (ret) { + KEY_ERR("%s: No saradc\n", uc_key->name); return KEY_NOT_EXIST; } - return key_adc_event(uc_key, adcval); + ret = adc_start_channel(dev, uc_key->channel); + if (ret) { + KEY_ERR("%s: Failed to start saradc\n", uc_key->name); + return KEY_NOT_EXIST; + } + + ret = adc_channel_data(dev, uc_key->channel, &adcval); + if (ret) { + KEY_ERR("%s: Failed to read saradc, %d\n", uc_key->name, ret); + return KEY_NOT_EXIST; + } + + return key_adc_event(dev, uc_key, adcval); +#else + return KEY_NOT_EXIST; +#endif } return (uc_key->code == KEY_POWER) ? @@ -273,11 +323,7 @@ { struct dm_key_uclass_platdata *uc_key; int ret; -#ifdef CONFIG_SARADC_ROCKCHIP_V2 - int margin = 120; -#else - int margin = 30; -#endif + uc_key = dev_get_uclass_platdata(dev); if (!uc_key) return -ENXIO; @@ -286,11 +332,7 @@ uc_key->pre_reloc = dev_read_bool(dev, "u-boot,dm-pre-reloc") || dev_read_bool(dev, "u-boot,dm-spl"); - if (uc_key->type == ADC_KEY) { - uc_key->max = uc_key->adcval + margin; - uc_key->min = uc_key->adcval > margin ? - uc_key->adcval - margin : 0; - } else { + if (uc_key->type != ADC_KEY) { if (uc_key->code == KEY_POWER) { #if CONFIG_IS_ENABLED(IRQ) int irq; @@ -337,8 +379,9 @@ dev->parent->name); if (uc_key->type == ADC_KEY) { - printf(" adcval: %d (%d, %d)\n", uc_key->adcval, - uc_key->min, uc_key->max); + printf(" %s: %d (%d, %d)\n", + uc_key->in_volt ? "volt" : " adc", + uc_key->center, uc_key->min, uc_key->max); printf(" channel: %d\n\n", uc_key->channel); } else { const char *gpio_name = diff --git a/u-boot/drivers/input/rk_key.c b/u-boot/drivers/input/rk_key.c index 2619a8e..4d275e9 100644 --- a/u-boot/drivers/input/rk_key.c +++ b/u-boot/drivers/input/rk_key.c @@ -27,9 +27,13 @@ if (dev_read_bool(dev, "rockchip,adc_value")) { uc_key->type = ADC_KEY; + uc_key->in_volt = 0; uc_key->channel = chn[1]; - uc_key->adcval = - dev_read_u32_default(dev, "rockchip,adc_value", 0); + uc_key->center = dev_read_u32_default(dev, "rockchip,adc_value", 0); + uc_key->min = uc_key->center - 30; + if (uc_key->min < 0) + uc_key->min = 0; + uc_key->max = uc_key->center + 30; } else { uc_key->type = GPIO_KEY; if (dev_read_u32_array(dev, "gpios", diff --git a/u-boot/drivers/input/spl_adc_key.c b/u-boot/drivers/input/spl_adc_key.c index 60e0394..8aceaef 100644 --- a/u-boot/drivers/input/spl_adc_key.c +++ b/u-boot/drivers/input/spl_adc_key.c @@ -6,28 +6,46 @@ #include <common.h> #include <adc.h> +#include <div64.h> #include <fdtdec.h> +#include <dm/uclass.h> DECLARE_GLOBAL_DATA_PTR; + +static int adc_raw_to_mV(struct udevice *dev, unsigned int raw, int *mV) +{ + unsigned int data_mask; + int ret, vref = 1800000; + u64 raw64 = raw; + + ret = adc_data_mask(dev, &data_mask); + if (ret) + return ret; + + raw64 *= vref; + do_div(raw64, data_mask); + *mV = raw64; + + return 0; +} int key_read(int code) { const void *fdt_blob = gd->fdt_blob; + struct udevice *dev; int adc_node, offset; - int cd, channel, adc; - int ret, vref, mv; + int t, down_threshold = -1, up_threshold; + int ret, num = 0, volt_margin = 150000; /* will be div 2 */ + int mV, cd, voltage = -1; int min, max; - int margin; - int range; - uint val; - u32 chn[2]; -#ifdef CONFIG_SARADC_ROCKCHIP_V2 - range = 4096; /* 12-bit adc */ - margin = 120; -#else - range = 1024; /* 10-bit adc */ - margin = 30; -#endif + u32 chn[2], adc; + + ret = uclass_get_device_by_name(UCLASS_ADC, "saradc", &dev); + if (ret) { + debug("No saradc device, ret=%d\n", ret); + return 0; + } + adc_node = fdt_node_offset_by_compatible(fdt_blob, 0, "adc-keys"); if (adc_node < 0) { debug("No 'adc-keys' node, ret=%d\n", adc_node); @@ -41,40 +59,87 @@ return 0; } - vref = fdtdec_get_int(fdt_blob, adc_node, - "keyup-threshold-microvolt", -1); - if (vref < 0) { + up_threshold = fdtdec_get_int(fdt_blob, adc_node, + "keyup-threshold-microvolt", -ENODATA); + if (up_threshold < 0) { debug("Can't read 'keyup-threshold-microvolt'\n"); return 0; } - channel = chn[1]; + /* find the expected key-code */ + for (offset = fdt_first_subnode(fdt_blob, adc_node); + offset >= 0; + offset = fdt_next_subnode(fdt_blob, offset)) { + cd = fdtdec_get_int(fdt_blob, offset, "linux,code", -ENODATA); + if (cd < 0) { + debug("Can't read 'linux,code', ret=%d\n", cd); + return 0; + } + + if (cd == code) { + voltage = fdtdec_get_int(fdt_blob, offset, + "press-threshold-microvolt", -ENODATA); + if (voltage < 0) { + debug("Can't read 'press-threshold-microvolt'\n"); + return 0; + } + break; + } + } + + if (voltage < 0) + return 0; for (offset = fdt_first_subnode(fdt_blob, adc_node); offset >= 0; offset = fdt_next_subnode(fdt_blob, offset)) { - cd = fdtdec_get_int(fdt_blob, offset, "linux,code", -1); - if (cd == code) { - mv = fdtdec_get_int(fdt_blob, offset, - "press-threshold-microvolt", -1); - if (mv < 0) { - debug("Can't read 'press-threshold-microvolt'\n"); - return 0; - } - - adc = mv / (vref / range); - max = adc + margin; - min = adc > margin ? adc - margin : 0; - ret = adc_channel_single_shot("saradc", channel, &val); - if (ret) { - debug("Failed to read adc%d, ret=%d\n", - channel, ret); - return 0; - } - - return (val >= min && val <= max); + t = fdtdec_get_int(fdt_blob, offset, + "press-threshold-microvolt", -ENODATA); + if (t < 0) { + debug("Can't read 'press-threshold-microvolt'\n"); + return 0; } + + if (t > voltage && t < up_threshold) + up_threshold = t; + else if (t < voltage && t > down_threshold) + down_threshold = t; + num++; } - return 0; + /* although one node only, it doesn't mean only one key on hardware */ + if (num == 1) { + down_threshold = voltage - volt_margin; + up_threshold = voltage + volt_margin; + } + + /* + * Define the voltage range such that the button is only pressed + * when the voltage is closest to its own press-threshold-microvolt + */ + if (down_threshold < 0) + min = 0; + else + min = down_threshold + (voltage - down_threshold) / 2; + + max = voltage + (up_threshold - voltage) / 2; + + /* now, read key status */ + ret = adc_channel_single_shot("saradc", chn[1], &adc); + if (ret) { + debug("Failed to read adc%d, ret=%d\n", chn[1], ret); + return 0; + } + + ret = adc_raw_to_mV(dev, adc, &mV); + if (ret) { + debug("Failed to convert adc to mV, ret=%d\n", ret); + return 0; + } + + debug("key[%d] <%d, %d, %d>: adc=%d -> mV=%d\n", + code, min, voltage, max, adc, mV); + + return (mV <= max && mV >= min); } + diff --git a/u-boot/drivers/misc/Makefile b/u-boot/drivers/misc/Makefile index b262618..65777a5 100644 --- a/u-boot/drivers/misc/Makefile +++ b/u-boot/drivers/misc/Makefile @@ -83,4 +83,12 @@ obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_SECURE_OTP) += rk3588-secure-otp.o endif +ifdef CONFIG_ROCKCHIP_RK3528 +obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_SECURE_OTP) += rk3528-secure-otp.o +endif + +ifdef CONFIG_ROCKCHIP_RK3562 +obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_SECURE_OTP) += rk3562-secure-otp.o +endif + obj-$(CONFIG_$(SPL_TPL_)ROCKCHIP_HW_DECOMPRESS) += rockchip_decompress.o diff --git a/u-boot/drivers/misc/rk3528-secure-otp.S b/u-boot/drivers/misc/rk3528-secure-otp.S new file mode 100644 index 0000000..12b91f3 --- /dev/null +++ b/u-boot/drivers/misc/rk3528-secure-otp.S @@ -0,0 +1,15901 @@ + .arch armv8-a+nosimd + .file "rk3528-secure-otp.c" + .text +.Ltext0: + .cfi_sections .debug_frame + .section .text.rk3528_spl_rockchip_otp_stop,"ax",@progbits + .align 2 + .type rk3528_spl_rockchip_otp_stop, %function +rk3528_spl_rockchip_otp_stop: +.LFB263: + .file 1 "drivers/misc/rk3528-secure-otp.c" + .loc 1 81 0 + .cfi_startproc +.LVL0: +.LBB22: + .loc 1 82 0 +#APP +// 82 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov w1, 16777216 +.LVL1: + str w1, [x0] + ret +.LBE22: + .cfi_endproc +.LFE263: + .size rk3528_spl_rockchip_otp_stop, .-rk3528_spl_rockchip_otp_stop + .section .text.secure_otp_ioctl,"ax",@progbits + .align 2 + .type secure_otp_ioctl, %function +secure_otp_ioctl: +.LFB276: + .loc 1 697 0 + .cfi_startproc +.LVL2: + .loc 1 700 0 + mov x0, 27908 +.LVL3: + cmp x1, x0 + bne .L6 +.LVL4: +.LBB23: +.LBB24: + .loc 1 689 0 + mov w0, 8 + str w0, [x2] +.LVL5: +.LBE24: +.LBE23: + .loc 1 702 0 + mov w0, 0 + .loc 1 703 0 + ret +.LVL6: +.L6: + .loc 1 698 0 + mov w0, -22 + .loc 1 709 0 + ret + .cfi_endproc +.LFE276: + .size secure_otp_ioctl, .-secure_otp_ioctl + .section .text.secure_otp_write,"ax",@progbits + .align 2 + .type secure_otp_write, %function +secure_otp_write: +.LFB274: + .loc 1 681 0 + .cfi_startproc +.LVL7: + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + mov x19, x0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -16 + .cfi_offset 22, -8 + .loc 1 681 0 + mov w20, w1 + mov x21, x2 + mov w22, w3 + .loc 1 682 0 + bl dev_get_driver_data +.LVL8: + .loc 1 684 0 + ldr x4, [x0, 8] + mov w3, w22 + mov x2, x21 + mov w1, w20 + mov x0, x19 +.LVL9: + .loc 1 685 0 + ldp x21, x22, [sp, 32] +.LVL10: + ldp x19, x20, [sp, 16] +.LVL11: + ldp x29, x30, [sp], 48 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + .loc 1 684 0 + br x4 +.LVL12: + .cfi_endproc +.LFE274: + .size secure_otp_write, .-secure_otp_write + .section .text.secure_otp_read,"ax",@progbits + .align 2 + .type secure_otp_read, %function +secure_otp_read: +.LFB273: + .loc 1 673 0 + .cfi_startproc +.LVL13: + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + mov x19, x0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -16 + .cfi_offset 22, -8 + .loc 1 673 0 + mov w20, w1 + mov x21, x2 + mov w22, w3 + .loc 1 674 0 + bl dev_get_driver_data +.LVL14: + .loc 1 676 0 + ldr x4, [x0] + mov w3, w22 + mov x2, x21 + mov w1, w20 + mov x0, x19 +.LVL15: + .loc 1 677 0 + ldp x21, x22, [sp, 32] +.LVL16: + ldp x19, x20, [sp, 16] +.LVL17: + ldp x29, x30, [sp], 48 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + .loc 1 676 0 + br x4 +.LVL18: + .cfi_endproc +.LFE273: + .size secure_otp_read, .-secure_otp_read + .section .text.rockchip_secure_otp_ofdata_to_platdata,"ax",@progbits + .align 2 + .type rockchip_secure_otp_ofdata_to_platdata, %function +rockchip_secure_otp_ofdata_to_platdata: +.LFB277: + .loc 1 718 0 + .cfi_startproc +.LVL19: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -16 + .cfi_offset 20, -8 + .loc 1 718 0 + mov x20, x0 + .loc 1 719 0 + bl dev_get_platdata +.LVL20: + mov x19, x0 +.LVL21: + .loc 1 721 0 + mov x0, x20 +.LVL22: + bl dev_read_addr_ptr +.LVL23: + .loc 1 722 0 + mov w2, 0 + adrp x1, .LC0 + .loc 1 721 0 + str x0, [x19] + .loc 1 722 0 + add x1, x1, :lo12:.LC0 + mov x0, x20 + bl dev_read_u32_default +.LVL24: + .loc 1 723 0 + uxtw x0, w0 + str x0, [x19, 8] + .loc 1 724 0 + mov w2, 0 + mov x0, x20 + adrp x1, .LC1 + add x1, x1, :lo12:.LC1 + bl dev_read_u32_default +.LVL25: + .loc 1 725 0 + uxtw x0, w0 + str x0, [x19, 16] + .loc 1 726 0 + mov w2, 0 + mov x0, x20 + adrp x1, .LC2 + add x1, x1, :lo12:.LC2 + bl dev_read_u32_default +.LVL26: + .loc 1 727 0 + uxtw x0, w0 + str x0, [x19, 24] + .loc 1 730 0 + mov w0, 0 + ldp x19, x20, [sp, 16] +.LVL27: + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE277: + .size rockchip_secure_otp_ofdata_to_platdata, .-rockchip_secure_otp_ofdata_to_platdata + .section .text.rk3528_spl_rockchip_otp_start,"ax",@progbits + .align 2 + .type rk3528_spl_rockchip_otp_start, %function +rk3528_spl_rockchip_otp_start: +.LFB262: + .loc 1 69 0 + .cfi_startproc +.LVL28: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 + .loc 1 69 0 + mov x19, x1 +.LBB25: + .loc 1 71 0 +#APP +// 71 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov w1, 16777472 +.LVL29: + str w1, [x0] +.LVL30: +.LBE25: +.LBB26: + .loc 1 72 0 +#APP +// 72 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov w0, 131074 +.LVL31: + str w0, [x19] +.LBE26: + .loc 1 73 0 + mov x0, 2 + bl udelay +.LVL32: +.LBB27: + .loc 1 74 0 +#APP +// 74 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov w0, 131072 + str w0, [x19] +.LBE27: + .loc 1 76 0 + ldr x19, [sp, 16] +.LVL33: + .loc 1 75 0 + mov x0, 1 + .loc 1 76 0 + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + .loc 1 75 0 + b udelay +.LVL34: + .cfi_endproc +.LFE262: + .size rk3528_spl_rockchip_otp_start, .-rk3528_spl_rockchip_otp_start + .section .text.rockchip_secure_otp_check_flag.isra.0,"ax",@progbits + .align 2 + .type rockchip_secure_otp_check_flag.isra.0, %function +rockchip_secure_otp_check_flag.isra.0: +.LFB278: + .loc 1 129 0 + .cfi_startproc + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -16 + .cfi_offset 20, -8 + .loc 1 129 0 + mov w19, 34465 + mov x20, x0 + movk w19, 0x1, lsl 16 +.L17: +.LVL35: +.LBB28: + .loc 1 136 0 + ldr x0, [x20] + ldr w1, [x0, 44] +.LVL36: +#APP +// 136 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +.LVL37: +#NO_APP +.LBE28: + .loc 1 137 0 + and w0, w1, 16 + tbz x1, 4, .L15 + .loc 1 140 0 + subs w19, w19, #1 +.LVL38: + beq .L18 +.LVL39: + .loc 1 146 0 + mov x0, 1 + bl udelay +.LVL40: + b .L17 +.LVL41: +.L18: + .loc 1 141 0 + mov w0, -1 +.LVL42: +.L15: + .loc 1 150 0 + ldp x19, x20, [sp, 16] + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE278: + .size rockchip_secure_otp_check_flag.isra.0, .-rockchip_secure_otp_check_flag.isra.0 + .section .text.rockchip_secure_otp_wait_flag.isra.1,"ax",@progbits + .align 2 + .type rockchip_secure_otp_wait_flag.isra.1, %function +rockchip_secure_otp_wait_flag.isra.1: +.LFB279: + .loc 1 106 0 + .cfi_startproc + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -16 + .cfi_offset 20, -8 + .loc 1 106 0 + mov x20, x0 + mov w19, 20001 +.L25: +.LVL43: +.LBB29: + .loc 1 113 0 + ldr x0, [x20] + ldr w0, [x0, 44] +.LVL44: +#APP +// 113 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +.LVL45: +#NO_APP +.LBE29: + .loc 1 114 0 + tbnz x0, 4, .L26 + .loc 1 117 0 + subs w19, w19, #1 +.LVL46: + beq .L27 + .loc 1 122 0 + mov x0, 1 +.LVL47: + bl udelay +.LVL48: + b .L25 +.LVL49: +.L26: + .loc 1 110 0 + mov w0, 0 +.LVL50: +.L23: + .loc 1 127 0 + ldp x19, x20, [sp, 16] + ldp x29, x30, [sp], 32 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL51: +.L27: + .cfi_restore_state + .loc 1 118 0 + mov w0, -1 +.LVL52: + b .L23 + .cfi_endproc +.LFE279: + .size rockchip_secure_otp_wait_flag.isra.1, .-rockchip_secure_otp_wait_flag.isra.1 + .section .text.rockchip_secure_otp_wait_status.isra.2,"ax",@progbits + .align 2 + .type rockchip_secure_otp_wait_status.isra.2, %function +rockchip_secure_otp_wait_status.isra.2: +.LFB280: + .loc 1 86 0 + .cfi_startproc +.LVL53: + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + mov w19, w1 + str x21, [sp, 32] + .cfi_offset 21, -16 + .loc 1 86 0 + mov x21, x0 + mov w20, 10000 +.LVL54: +.L30: +.LBB36: + .loc 1 91 0 + ldr x0, [x21] + ldr w0, [x0, 772] +.LVL55: +#APP +// 91 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP +.LBE36: + tst w0, w19 + beq .L32 +.LBB37: + .loc 1 101 0 + orr w19, w19, -65536 +.LVL56: +#APP +// 101 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x21] +.LVL57: + str w19, [x0, 772] +.LBE37: + .loc 1 103 0 + mov w0, 0 + b .L29 +.LVL58: +.L32: + .loc 1 92 0 + mov x0, 1 +.LVL59: + bl udelay +.LVL60: + .loc 1 94 0 + subs w20, w20, #1 +.LVL61: + bne .L30 +.LVL62: +.LBB38: +.LBB39: + .loc 1 95 0 + adrp x1, .LANCHOR0 + adrp x0, .LC3 + add x1, x1, :lo12:.LANCHOR0 + add x0, x0, :lo12:.LC3 + bl printf +.LVL63: + mov w0, -110 +.LVL64: +.L29: +.LBE39: +.LBE38: + .loc 1 104 0 + ldp x19, x20, [sp, 16] +.LVL65: + ldr x21, [sp, 32] + ldp x29, x30, [sp], 48 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE280: + .size rockchip_secure_otp_wait_status.isra.2, .-rockchip_secure_otp_wait_status.isra.2 + .section .text.rk3528_secure_otp_write_2_bytes_noecc,"ax",@progbits + .align 2 + .type rk3528_secure_otp_write_2_bytes_noecc, %function +rk3528_secure_otp_write_2_bytes_noecc: +.LFB269: + .loc 1 240 0 + .cfi_startproc +.LVL66: + stp x29, x30, [sp, -96]! + .cfi_def_cfa_offset 96 + .cfi_offset 29, -96 + .cfi_offset 30, -88 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x23, x24, [sp, 48] + .cfi_offset 23, -48 + .cfi_offset 24, -40 + mov w24, w2 + stp x19, x20, [sp, 16] + .cfi_offset 19, -80 + .cfi_offset 20, -72 + .loc 1 244 0 + asr w20, w24, 1 + .loc 1 240 0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -64 + .cfi_offset 22, -56 + and w21, w3, 65535 + stp x25, x26, [sp, 64] + .cfi_offset 25, -32 + .cfi_offset 26, -24 + mov x26, x1 + stp x27, x28, [sp, 80] + .cfi_offset 27, -16 + .cfi_offset 28, -8 + .loc 1 242 0 + bl dev_get_driver_data +.LVL67: + .loc 1 245 0 + cmp w20, 447 + bgt .L43 + mov x23, x0 + .loc 1 249 0 + sub w0, w20, #416 +.LVL68: + cmp w0, 15 + ccmp w20, 16, 4, hi + beq .L37 + .loc 1 252 0 + adrp x0, .LC4 + and w1, w24, -2 + add x0, x0, :lo12:.LC4 + bl printf +.LVL69: +.L43: + .loc 1 246 0 + mov w0, -1 +.LVL70: +.L35: + .loc 1 446 0 + ldp x19, x20, [sp, 16] +.LVL71: + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] + ldp x25, x26, [sp, 64] +.LVL72: + ldp x27, x28, [sp, 80] + ldp x29, x30, [sp], 96 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 27 + .cfi_restore 28 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL73: +.L37: + .cfi_restore_state + .loc 1 256 0 + cbz w21, .L44 + .loc 1 259 0 + ldr x6, [x23, 16] + mov w3, w20 + ldp x0, x2, [x26, 8] + ldr x1, [x26, 24] + blr x6 +.LVL74: +.LBB40: + .loc 1 262 0 +#APP +// 262 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 65536 + str w1, [x0, 256] +.LVL75: +.LBE40: +.LBB41: + .loc 1 263 0 +#APP +// 263 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 262148 + str w1, [x0, 32] +.LVL76: +.LBE41: +.LBB42: + .loc 1 264 0 +#APP +// 264 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, -65536 + str w1, [x0, 40] +.LVL77: +.LBE42: +.LBB43: + .loc 1 265 0 +#APP +// 265 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL78: +.LBE43: +.LBB44: + .loc 1 266 0 +#APP +// 266 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w22, -65534 + str w22, [x0, 36] +.LVL79: +.LBE44: +.LBB45: + .loc 1 267 0 +#APP +// 267 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 252 + str w1, [x0, 4096] +.LVL80: +.LBE45: +.LBB46: + .loc 1 268 0 +#APP +// 268 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4100] +.LVL81: +.LBE46: +.LBB47: + .loc 1 269 0 +#APP +// 269 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4104] +.LVL82: +.LBE47: +.LBB48: + .loc 1 270 0 +#APP +// 270 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w19, 65537 +.LBE48: + .loc 1 271 0 + mov w1, 2 +.LBB49: + .loc 1 270 0 + str w19, [x0, 32] +.LBE49: + .loc 1 271 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL83: + .loc 1 272 0 + tbz w0, #31, .L38 +.L40: + .loc 1 273 0 + adrp x1, .LANCHOR1 + adrp x0, .LC5 +.LVL84: + add x1, x1, :lo12:.LANCHOR1 + add x0, x0, :lo12:.LC5 +.L46: + .loc 1 406 0 + bl printf +.LVL85: +.L39: + .loc 1 442 0 + ldr x5, [x23, 24] + mov w3, w20 + ldp x0, x2, [x26, 8] + ldr x1, [x26, 24] + blr x5 +.LVL86: +.L44: + .loc 1 257 0 + mov w0, 0 + b .L35 +.LVL87: +.L38: +.LBB50: + .loc 1 277 0 +#APP +// 277 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL88: + mov w28, -65522 + str w28, [x0, 36] +.LVL89: +.LBE50: +.LBB51: + .loc 1 278 0 +#APP +// 278 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w27, 240 + str w27, [x0, 4096] +.LVL90: +.LBE51: +.LBB52: + .loc 1 279 0 +#APP +// 279 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 1 + str w1, [x0, 4100] +.LVL91: +.LBE52: +.LBB53: + .loc 1 280 0 +#APP +// 280 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w25, 122 + str w25, [x0, 4104] +.LVL92: +.LBE53: +.LBB54: + .loc 1 281 0 +#APP +// 281 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 37 + str w1, [x0, 4108] +.LVL93: +.LBE54: +.LBB55: + .loc 1 282 0 +#APP +// 282 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4112] +.LVL94: +.LBE55: +.LBB56: + .loc 1 283 0 +#APP +// 283 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4116] +.LVL95: +.LBE56: +.LBB57: + .loc 1 284 0 +#APP +// 284 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4120] +.LVL96: +.LBE57: +.LBB58: + .loc 1 285 0 +#APP +// 285 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 31 + str w1, [x0, 4124] +.LVL97: +.LBE58: +.LBB59: + .loc 1 286 0 +#APP +// 286 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 11 + str w1, [x0, 4128] +.LVL98: +.LBE59: +.LBB60: + .loc 1 287 0 +#APP +// 287 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 8 + str w1, [x0, 4132] +.LVL99: +.LBE60: +.LBB61: + .loc 1 288 0 +#APP +// 288 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4136] +.LVL100: +.LBE61: +.LBB62: + .loc 1 289 0 +#APP +// 289 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4140] +.LVL101: +.LBE62: +.LBB63: + .loc 1 290 0 +#APP +// 290 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4144] +.LBE63: +.LBB64: + .loc 1 291 0 + and w0, w20, 255 +#APP +// 291 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x1, [x26] +.LBE64: +.LBB65: + .loc 1 292 0 + ubfx x5, x24, 9, 8 +.LVL102: +.LBE65: +.LBB66: + .loc 1 291 0 + str w0, [x1, 4148] +.LBE66: +.LBB67: + .loc 1 292 0 +#APP +// 292 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w5, [x0, 4152] +.LVL103: +.LBE67: +.LBB68: + .loc 1 293 0 +#APP +// 293 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE68: + .loc 1 294 0 + mov w1, 2 +.LBB69: + .loc 1 293 0 + str w19, [x0, 32] +.LBE69: + .loc 1 294 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL104: + .loc 1 295 0 + tbnz w0, #31, .L40 +.LVL105: +.LBB70: + .loc 1 300 0 +#APP +// 300 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL106: + mov w1, -65535 + str w1, [x0, 36] +.LVL107: +.LBE70: +.LBB71: + .loc 1 301 0 +#APP +// 301 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 250 + str w1, [x0, 4096] +.LVL108: +.LBE71: +.LBB72: + .loc 1 302 0 +#APP +// 302 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 9 + str w1, [x0, 4100] +.LVL109: +.LBE72: +.LBB73: + .loc 1 303 0 +#APP +// 303 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE73: + .loc 1 304 0 + mov w1, 2 +.LBB74: + .loc 1 303 0 + str w19, [x0, 32] +.LBE74: + .loc 1 304 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL110: + .loc 1 305 0 + tbnz w0, #31, .L40 +.LVL111: +.LBB75: + .loc 1 310 0 +#APP +// 310 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL112: + mov w1, 14848 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL113: +.LBE75: +.LBB76: + .loc 1 311 0 +#APP +// 311 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w28, [x0, 36] +.LVL114: +.LBE76: +.LBB77: + .loc 1 312 0 +#APP +// 312 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w27, [x0, 4096] +.LVL115: +.LBE77: +.LBB78: + .loc 1 313 0 +#APP +// 313 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 1 + str w1, [x0, 4100] +.LVL116: +.LBE78: +.LBB79: + .loc 1 314 0 +#APP +// 314 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w25, [x0, 4104] +.LVL117: +.LBE79: +.LBB80: + .loc 1 315 0 +#APP +// 315 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 21 + str w1, [x0, 4108] +.LVL118: +.LBE80: +.LBB81: + .loc 1 316 0 +#APP +// 316 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 220 + str w1, [x0, 4112] +.LVL119: +.LBE81: +.LBB82: + .loc 1 317 0 +#APP +// 317 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 146 + str w1, [x0, 4116] +.LVL120: +.LBE82: +.LBB83: + .loc 1 318 0 +#APP +// 318 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 121 + str w1, [x0, 4120] +.LVL121: +.LBE83: +.LBB84: + .loc 1 319 0 +#APP +// 319 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 129 + str w1, [x0, 4124] +.LVL122: +.LBE84: +.LBB85: + .loc 1 320 0 +#APP +// 320 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 126 + str w1, [x0, 4128] +.LVL123: +.LBE85: +.LBB86: + .loc 1 321 0 +#APP +// 321 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 33 + str w1, [x0, 4132] +.LVL124: +.LBE86: +.LBB87: + .loc 1 322 0 +#APP +// 322 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 17 + str w1, [x0, 4136] +.LVL125: +.LBE87: +.LBB88: + .loc 1 323 0 +#APP +// 323 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 157 + str w1, [x0, 4140] +.LVL126: +.LBE88: +.LBB89: + .loc 1 324 0 +#APP +// 324 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w25, 2 + str w25, [x0, 4144] +.LVL127: +.LBE89: +.LBB90: + .loc 1 325 0 +#APP +// 325 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4148] +.LVL128: +.LBE90: +.LBB91: + .loc 1 326 0 +#APP +// 326 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 64 + str w1, [x0, 4152] +.LVL129: +.LBE91: +.LBB92: + .loc 1 327 0 +#APP +// 327 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE92: + .loc 1 328 0 + mov w1, w25 +.LBB93: + .loc 1 327 0 + str w19, [x0, 32] +.LBE93: + .loc 1 328 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL130: + .loc 1 329 0 + tbnz w0, #31, .L40 +.LVL131: +.LBB94: + .loc 1 334 0 +#APP +// 334 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL132: + str w22, [x0, 36] +.LVL133: +.LBE94: +.LBB95: + .loc 1 335 0 +#APP +// 335 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 252 + str w1, [x0, 4096] +.LVL134: +.LBE95: +.LBB96: + .loc 1 336 0 +#APP +// 336 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 10 + str w1, [x0, 4100] +.LVL135: +.LBE96: +.LBB97: + .loc 1 337 0 +#APP +// 337 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 112 + str w1, [x0, 4104] +.LVL136: +.LBE97: +.LBB98: + .loc 1 338 0 +#APP +// 338 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE98: + .loc 1 339 0 + mov w1, w25 +.LBB99: + .loc 1 338 0 + str w19, [x0, 32] +.LBE99: + .loc 1 339 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL137: + .loc 1 340 0 + tbnz w0, #31, .L40 +.LVL138: +.LBB100: + .loc 1 345 0 +#APP +// 345 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL139: + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL140: +.LBE100: +.LBB101: + .loc 1 346 0 +#APP +// 346 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w22, [x0, 36] +.LVL141: +.LBE101: +.LBB102: + .loc 1 347 0 +#APP +// 347 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 192 + str w1, [x0, 4096] +.LBE102: +.LBB103: + .loc 1 348 0 + and w1, w21, 255 +.LVL142: +#APP +// 348 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE103: +.LBB104: + .loc 1 349 0 + lsr w21, w21, 8 +.LVL143: +.LBE104: +.LBB105: + .loc 1 348 0 + str w1, [x0, 4100] +.LBE105: +.LBB106: + .loc 1 349 0 +#APP +// 349 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w21, [x0, 4104] +.LVL144: +.LBE106: +.LBB107: + .loc 1 350 0 +#APP +// 350 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE107: + .loc 1 351 0 + mov w1, w25 +.LVL145: +.LBB108: + .loc 1 350 0 + str w19, [x0, 32] +.LBE108: + .loc 1 351 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL146: + .loc 1 352 0 + tbnz w0, #31, .L40 +.LVL147: +.LBB109: + .loc 1 357 0 +#APP +// 357 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL148: + mov w1, -65535 + str w1, [x0, 36] +.LVL149: +.LBE109: +.LBB110: + .loc 1 358 0 +#APP +// 358 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 224 + str w1, [x0, 4096] +.LVL150: +.LBE110: +.LBB111: + .loc 1 359 0 +#APP +// 359 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4100] +.LVL151: +.LBE111: +.LBB112: + .loc 1 360 0 +#APP +// 360 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE112: + .loc 1 361 0 + mov w1, w25 +.LBB113: + .loc 1 360 0 + str w19, [x0, 32] +.LBE113: + .loc 1 361 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL152: + .loc 1 362 0 + tbnz w0, #31, .L40 +.LVL153: +.LBB114: + .loc 1 367 0 +#APP +// 367 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL154: + mov w22, -65535 + str w22, [x0, 36] +.LVL155: +.LBE114: +.LBB115: + .loc 1 368 0 +#APP +// 368 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 14848 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL156: +.LBE115: +.LBB116: + .loc 1 369 0 +#APP +// 369 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 255 + str w1, [x0, 4096] +.LVL157: +.LBE116: +.LBB117: + .loc 1 370 0 +#APP +// 370 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 10 + str w1, [x0, 4100] +.LVL158: +.LBE117: +.LBB118: + .loc 1 371 0 +#APP +// 371 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w21, 65537 +.LVL159: +.LBE118: + .loc 1 372 0 + mov w1, w25 +.LBB119: + .loc 1 371 0 + str w21, [x0, 32] +.LBE119: + .loc 1 372 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL160: + .loc 1 373 0 + tbnz w0, #31, .L40 +.LVL161: +.LBB120: + .loc 1 378 0 +#APP +// 378 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL162: + str w22, [x0, 36] +.LVL163: +.LBE120: +.LBB121: + .loc 1 379 0 +#APP +// 379 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 1 + str w1, [x0, 4096] +.LVL164: +.LBE121: +.LBB122: + .loc 1 380 0 +#APP +// 380 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w24, 191 +.LVL165: + str w24, [x0, 4100] +.LVL166: +.LBE122: +.LBB123: + .loc 1 381 0 +#APP +// 381 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE123: + .loc 1 382 0 + mov w1, w25 +.LBB124: + .loc 1 381 0 + str w21, [x0, 32] +.LBE124: + .loc 1 382 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL167: + .loc 1 383 0 + tbnz w0, #31, .L40 + .loc 1 388 0 + mov x0, x26 +.LVL168: + bl rockchip_secure_otp_check_flag.isra.0 +.LVL169: + .loc 1 389 0 + tbz w0, #31, .L41 + .loc 1 390 0 + adrp x1, .LANCHOR1 + adrp x0, .LC6 +.LVL170: + add x1, x1, :lo12:.LANCHOR1 + add x0, x0, :lo12:.LC6 + b .L46 +.LVL171: +.L41: +.LBB125: + .loc 1 394 0 +#APP +// 394 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL172: + str w22, [x0, 36] +.LVL173: +.LBE125: +.LBB126: + .loc 1 395 0 +#APP +// 395 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w19, 2 + str w19, [x0, 4096] +.LVL174: +.LBE126: +.LBB127: + .loc 1 396 0 +#APP +// 396 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w24, [x0, 4100] +.LVL175: +.LBE127: +.LBB128: + .loc 1 397 0 +#APP +// 397 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE128: + .loc 1 398 0 + mov w1, w19 +.LBB129: + .loc 1 397 0 + str w21, [x0, 32] +.LBE129: + .loc 1 398 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL176: + .loc 1 399 0 + tbnz w0, #31, .L40 + .loc 1 404 0 + mov x0, x26 +.LVL177: + bl rockchip_secure_otp_wait_flag.isra.1 +.LVL178: + .loc 1 405 0 + tbz w0, #31, .L42 + .loc 1 406 0 + adrp x1, .LANCHOR1 + adrp x0, .LC7 +.LVL179: + add x1, x1, :lo12:.LANCHOR1 + add x0, x0, :lo12:.LC7 + b .L46 +.LVL180: +.L42: +.LBB130: + .loc 1 410 0 +#APP +// 410 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL181: + mov w1, -65533 + str w1, [x0, 772] +.LVL182: +.LBE130: +.LBB131: + .loc 1 411 0 +#APP +// 411 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL183: +.LBE131: +.LBB132: + .loc 1 412 0 +#APP +// 412 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w22, [x0, 36] +.LVL184: +.LBE132: +.LBB133: + .loc 1 413 0 +#APP +// 413 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w19, [x0, 4096] +.LVL185: +.LBE133: +.LBB134: + .loc 1 414 0 +#APP +// 414 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 128 + str w1, [x0, 4100] +.LVL186: +.LBE134: +.LBB135: + .loc 1 415 0 +#APP +// 415 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE135: + .loc 1 416 0 + mov w1, w19 +.LBB136: + .loc 1 415 0 + str w21, [x0, 32] +.LBE136: + .loc 1 416 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL187: + .loc 1 417 0 + tbnz w0, #31, .L40 +.LVL188: +.LBB137: + .loc 1 422 0 +#APP +// 422 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL189: + str w22, [x0, 36] +.LVL190: +.LBE137: +.LBB138: + .loc 1 423 0 +#APP +// 423 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 160 + str w1, [x0, 4096] +.LVL191: +.LBE138: +.LBB139: + .loc 1 424 0 +#APP +// 424 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4100] +.LVL192: +.LBE139: +.LBB140: + .loc 1 425 0 +#APP +// 425 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE140: + .loc 1 426 0 + mov w1, w19 +.LBB141: + .loc 1 425 0 + str w21, [x0, 32] +.LBE141: + .loc 1 426 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL193: + .loc 1 427 0 + tbnz w0, #31, .L40 +.LVL194: +.LBB142: + .loc 1 432 0 +#APP +// 432 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL195: + mov w1, 250 + str w1, [x0, 4096] +.LVL196: +.LBE142: +.LBB143: + .loc 1 433 0 +#APP +// 433 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 9 + str w1, [x0, 4100] +.LVL197: +.LBE143: +.LBB144: + .loc 1 434 0 +#APP +// 434 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE144: + .loc 1 435 0 + mov w1, w19 +.LBB145: + .loc 1 434 0 + str w21, [x0, 32] +.LBE145: + .loc 1 435 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL198: + .loc 1 436 0 + tbz w0, #31, .L39 + b .L40 + .cfi_endproc +.LFE269: + .size rk3528_secure_otp_write_2_bytes_noecc, .-rk3528_secure_otp_write_2_bytes_noecc + .section .text.rockchip_secure_otp_ecc_enable,"ax",@progbits + .align 2 + .type rockchip_secure_otp_ecc_enable, %function +rockchip_secure_otp_ecc_enable: +.LFB267: + .loc 1 154 0 + .cfi_startproc +.LVL199: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + and w1, w1, 255 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 +.LBB160: + .loc 1 157 0 +#APP +// 157 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x2, [x0] + mov w3, 512 + movk w3, 0xff00, lsl 16 + str w3, [x2, 32] +.LVL200: +.LBE160: +.LBB161: + .loc 1 158 0 +#APP +// 158 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x2, [x0] + mov w3, -65535 + str w3, [x2, 36] +.LVL201: +.LBE161: +.LBB162: + .loc 1 159 0 +#APP +// 159 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x2, [x0] + mov w3, 250 + str w3, [x2, 4096] +.LBE162: + .loc 1 160 0 + cbz w1, .L48 +.LVL202: +.LBB163: + .loc 1 161 0 +#APP +// 161 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x1, [x0] +.LVL203: + str wzr, [x1, 4100] +.LVL204: +.L49: +.LBE163: +.LBB164: + .loc 1 165 0 +#APP +// 165 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x1, [x0] + mov w2, 65537 + str w2, [x1, 32] +.LBE164: + .loc 1 167 0 + mov w1, 2 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL205: + mov w19, w0 +.LVL206: + .loc 1 168 0 + tbz w0, #31, .L47 +.LVL207: +.LBB165: +.LBB166: + .loc 1 169 0 + adrp x1, .LANCHOR2 + adrp x0, .LC8 +.LVL208: + add x1, x1, :lo12:.LANCHOR2 + add x0, x0, :lo12:.LC8 + bl printf +.LVL209: +.L47: +.LBE166: +.LBE165: + .loc 1 172 0 + mov w0, w19 + ldr x19, [sp, 16] +.LVL210: + ldp x29, x30, [sp], 32 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + ret +.LVL211: +.L48: + .cfi_restore_state +.LBB167: + .loc 1 163 0 +#APP +// 163 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x1, [x0] + mov w2, 9 + str w2, [x1, 4100] + b .L49 +.LBE167: + .cfi_endproc +.LFE267: + .size rockchip_secure_otp_ecc_enable, .-rockchip_secure_otp_ecc_enable + .section .text.rk3528_secure_otp_read,"ax",@progbits + .align 2 + .type rk3528_secure_otp_read, %function +rk3528_secure_otp_read: +.LFB268: + .loc 1 176 0 + .cfi_startproc +.LVL212: + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + .loc 1 183 0 + asr w19, w1, 1 + .loc 1 176 0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -48 + .cfi_offset 22, -40 + mov x21, x2 + stp x23, x24, [sp, 48] + mov x22, x0 + .cfi_offset 23, -32 + .cfi_offset 24, -24 + mov w23, w3 + str x25, [sp, 64] + .cfi_offset 25, -16 + .loc 1 177 0 + bl dev_get_platdata +.LVL213: + mov x20, x0 +.LVL214: + .loc 1 178 0 + mov x0, x22 +.LVL215: + bl dev_get_driver_data +.LVL216: + .loc 1 184 0 + ldr x4, [x0, 16] + .loc 1 178 0 + mov x24, x0 +.LVL217: + .loc 1 184 0 + ldr x1, [x20, 24] + mov w3, w19 + ldp x0, x2, [x20, 8] +.LVL218: + blr x4 +.LVL219: + .loc 1 187 0 + sub w1, w19, #16 + sub w0, w19, #416 + cmp w1, 15 + ccmp w0, 31, 0, hi + bhi .L53 + .loc 1 188 0 + mov w1, 0 +.L65: + .loc 1 190 0 + mov x0, x20 + bl rockchip_secure_otp_ecc_enable +.LVL220: +.LBB168: + .loc 1 192 0 +#APP +// 192 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x20] + mov w25, 65537 +.LBE168: + .loc 1 181 0 + mov w22, 0 +.LVL221: +.LBB169: + .loc 1 192 0 + str w25, [x0, 256] +.LBE169: + .loc 1 193 0 + mov x0, 50 + bl udelay +.LVL222: +.L55: + .loc 1 194 0 + cbz w23, .L60 + .loc 1 196 0 + cmp w19, 447 + ble .L56 + .loc 1 197 0 + adrp x0, .LC9 + mov w1, w19 + add x0, x0, :lo12:.LC9 +.L66: + .loc 1 205 0 + mov w22, -1 +.LVL223: + .loc 1 204 0 + bl printf +.LVL224: +.L52: + .loc 1 235 0 + mov w0, w22 + ldr x25, [sp, 64] + ldp x19, x20, [sp, 16] +.LVL225: + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] +.LVL226: + ldp x29, x30, [sp], 80 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL227: +.L53: + .cfi_restore_state + .loc 1 190 0 + mov w1, 1 + b .L65 +.LVL228: +.L56: + .loc 1 201 0 + sub w0, w19, #192 + cmp w0, 31 + ccmp w19, 16, 4, hi + beq .L58 + .loc 1 201 0 is_stmt 0 discriminator 1 + sub w0, w19, #416 + cmp w0, 15 + bls .L58 + .loc 1 204 0 is_stmt 1 + adrp x0, .LC10 + lsl w1, w19, 1 + add x0, x0, :lo12:.LC10 + b .L66 +.L58: +.LBB170: + .loc 1 208 0 + orr w1, w19, -65536 +.LVL229: +#APP +// 208 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x20] +.LBE170: + .loc 1 209 0 + add w19, w19, 1 +.LVL230: +.LBB171: + .loc 1 208 0 + str w1, [x0, 260] +.LBE171: +.LBB172: + .loc 1 210 0 +#APP +// 210 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x20] +.LBE172: + .loc 1 212 0 + mov w1, 4 +.LVL231: +.LBB173: + .loc 1 210 0 + str w25, [x0, 264] +.LVL232: +.LBE173: + .loc 1 212 0 + mov x0, x20 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL233: + mov w22, w0 +.LVL234: + .loc 1 213 0 + tbz w0, #31, .L59 + .loc 1 214 0 + adrp x1, .LANCHOR3 + adrp x0, .LC11 +.LVL235: + add x1, x1, :lo12:.LANCHOR3 + add x0, x0, :lo12:.LC11 + bl printf +.LVL236: +.L60: +.LBB174: + .loc 1 228 0 +#APP +// 228 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x20] + mov w1, 65536 +.LBE174: + .loc 1 230 0 + ldr x2, [x20, 16] + mov w3, w19 + ldr x4, [x24, 24] +.LBB175: + .loc 1 228 0 + str w1, [x0, 256] +.LBE175: + .loc 1 230 0 + ldr x0, [x20, 8] + ldr x1, [x20, 24] + blr x4 +.LVL237: + .loc 1 234 0 + b .L52 +.LVL238: +.L59: +.LBB176: + .loc 1 218 0 + ldr x0, [x20] +.LVL239: + ldrh w0, [x0, 292] + and w0, w0, 65535 +.LVL240: +#APP +// 218 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +.LVL241: +#NO_APP +.LBE176: + .loc 1 220 0 + strb w0, [x21] + .loc 1 221 0 + cmp w23, 1 + beq .L60 +.LVL242: + .loc 1 222 0 + lsr w0, w0, 8 +.LVL243: + .loc 1 223 0 + sub w23, w23, #2 +.LVL244: + .loc 1 222 0 + strb w0, [x21, 1] + add x21, x21, 2 +.LVL245: + b .L55 + .cfi_endproc +.LFE268: + .size rk3528_secure_otp_read, .-rk3528_secure_otp_read + .section .text.rk3528_secure_otp_write,"ax",@progbits + .align 2 + .type rk3528_secure_otp_write, %function +rk3528_secure_otp_write: +.LFB272: + .loc 1 621 0 + .cfi_startproc +.LVL246: + stp x29, x30, [sp, -144]! + .cfi_def_cfa_offset 144 + .cfi_offset 29, -144 + .cfi_offset 30, -136 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -128 + .cfi_offset 20, -120 + mov w20, w1 + stp x21, x22, [sp, 32] + .cfi_offset 21, -112 + .cfi_offset 22, -104 + mov w21, w3 + stp x23, x24, [sp, 48] + .cfi_offset 23, -96 + .cfi_offset 24, -88 + mov x24, x0 + stp x27, x28, [sp, 80] + stp x25, x26, [sp, 64] + .cfi_offset 27, -64 + .cfi_offset 28, -56 + .cfi_offset 25, -80 + .cfi_offset 26, -72 + .loc 1 621 0 + str x2, [x29, 112] + .loc 1 622 0 + bl dev_get_platdata +.LVL247: + mov x28, x0 +.LVL248: + .loc 1 625 0 + sxtw x0, w21 +.LVL249: + bl malloc_simple +.LVL250: + .loc 1 628 0 + cbnz x0, .L68 +.LVL251: +.L115: + .loc 1 643 0 + mov w27, -1 +.LVL252: +.L67: + .loc 1 669 0 + mov w0, w27 + ldp x19, x20, [sp, 16] +.LVL253: + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] +.LVL254: + ldp x25, x26, [sp, 64] + ldp x27, x28, [sp, 80] +.LVL255: + ldp x29, x30, [sp], 144 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 27 + .cfi_restore 28 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 +.LVL256: + ret +.LVL257: +.L68: + .cfi_restore_state + mov x19, x0 + .loc 1 631 0 + sub w0, w20, #384 +.LVL258: + cmp w0, 63 + bls .L70 +.LVL259: +.L77: + .loc 1 649 0 + sub w1, w20, #832 + sub w0, w20, #32 + cmp w1, 63 + ccmp w0, 31, 0, hi + bls .L71 + .loc 1 659 0 + mov w0, 2 +.LBB244: +.LBB245: + .loc 1 607 0 + adrp x19, .LANCHOR4 +.LVL260: + add x19, x19, :lo12:.LANCHOR4 +.LBE245: +.LBE244: + .loc 1 659 0 + mov x23, 0 + sdiv w0, w21, w0 + str w0, [x29, 108] +.LVL261: +.L78: + .loc 1 659 0 is_stmt 0 discriminator 1 + ldr w0, [x29, 108] + cmp w0, w23 + ble .L97 + .loc 1 660 0 is_stmt 1 + ldr x0, [x29, 112] + add w21, w20, w23, lsl 1 +.LBB324: +.LBB320: + .loc 1 477 0 + asr w25, w21, 1 +.LBE320: +.LBE324: + .loc 1 660 0 + ldrh w26, [x0, x23, lsl 1] +.LVL262: +.LBB325: +.LBB321: + .loc 1 475 0 + mov x0, x24 + bl dev_get_driver_data +.LVL263: + str x0, [x29, 120] +.LVL264: + .loc 1 478 0 + cmp w25, 447 + bgt .L99 + .loc 1 482 0 + sub w0, w25, #192 +.LVL265: + cmp w0, 31 + bls .L85 + .loc 1 485 0 + adrp x0, .LC4 + and w1, w21, -2 + add x0, x0, :lo12:.LC4 + bl printf +.LVL266: +.L99: + .loc 1 478 0 + mov w27, -1 + b .L84 +.LVL267: +.L70: +.LBE321: +.LBE325: + .loc 1 633 0 + mov w3, w21 + mov x2, x19 + mov w1, w20 + mov x0, x24 + bl rk3528_secure_otp_read +.LVL268: + .loc 1 634 0 + cbnz w0, .L115 + mov x0, 0 +.LVL269: +.L75: + .loc 1 639 0 discriminator 1 + cmp w21, w0 + ble .L77 + add x0, x0, 1 +.LVL270: + .loc 1 640 0 + add x1, x19, x0 + ldrb w1, [x1, -1] + cbz w1, .L75 + .loc 1 641 0 + adrp x0, .LC12 + add x0, x0, :lo12:.LC12 + bl printf +.LVL271: + b .L115 +.LVL272: +.L83: +.LBB326: +.LBB327: + .loc 1 455 0 + adds w25, w20, w19 +.LBE327: +.LBE326: + .loc 1 652 0 + ldr x0, [x29, 112] +.LBB332: +.LBB328: + .loc 1 455 0 + and w26, w25, 1 + mov w3, 2 + csneg w22, w26, w26, pl + add x2, x29, 142 + sub w22, w25, w22 +.LBE328: +.LBE332: + .loc 1 652 0 + ldrb w23, [x0, x19] +.LVL273: +.LBB333: +.LBB329: + .loc 1 455 0 + mov w1, w22 + mov x0, x24 + bl rk3528_secure_otp_read +.LVL274: + .loc 1 456 0 + cbnz w0, .L79 + ldrh w3, [x29, 142] + .loc 1 459 0 + cbnz w26, .L80 +.LVL275: + .loc 1 461 0 + bic w3, w23, w3 + mov w2, w25 +.LVL276: +.L112: + .loc 1 464 0 + mov x1, x28 + mov x0, x24 +.LVL277: + add x19, x19, 1 +.LVL278: + bl rk3528_secure_otp_write_2_bytes_noecc +.LVL279: + mov w27, w0 +.LVL280: +.LBE329: +.LBE333: + .loc 1 653 0 + cbz w0, .L82 +.L98: + .loc 1 654 0 + adrp x0, .LC13 + add x0, x0, :lo12:.LC13 +.LVL281: +.L114: + .loc 1 662 0 + bl printf +.LVL282: + .loc 1 663 0 + b .L67 +.LVL283: +.L80: +.LBB334: +.LBB330: + .loc 1 463 0 + lsl w23, w23, 8 +.LVL284: + .loc 1 464 0 + mov w2, w22 + bic w3, w23, w3 + b .L112 +.LVL285: +.L71: +.LBE330: +.LBE334: + mov x19, 0 +.LVL286: +.L82: + .loc 1 651 0 discriminator 1 + cmp w21, w19 + bgt .L83 +.LVL287: +.L97: + .loc 1 629 0 + mov w27, 0 + b .L67 +.LVL288: +.L85: +.LBB335: +.LBB322: + .loc 1 489 0 + cbz w26, .L86 + .loc 1 492 0 + ldr x0, [x29, 120] + mov w3, w25 + ldp x2, x1, [x28, 16] + ldr x5, [x0, 16] + ldr x0, [x28, 8] + blr x5 +.LVL289: +.LBB246: + .loc 1 495 0 +#APP +// 495 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 65536 + str w1, [x0, 256] +.LVL290: +.LBE246: +.LBB247: + .loc 1 496 0 +#APP +// 496 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 262148 + str w1, [x0, 32] +.LVL291: +.LBE247: +.LBB248: + .loc 1 497 0 +#APP +// 497 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65536 + str w1, [x0, 40] +.LVL292: +.LBE248: +.LBB249: + .loc 1 498 0 +#APP +// 498 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL293: +.LBE249: +.LBB250: + .loc 1 499 0 +#APP +// 499 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65522 + str w1, [x0, 36] +.LVL294: +.LBE250: +.LBB251: + .loc 1 500 0 +#APP +// 500 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w3, 240 + str w3, [x29, 100] +.LVL295: + str w3, [x0, 4096] +.LBE251: +.LBB252: + .loc 1 501 0 +#APP +// 501 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 1 + str w1, [x0, 4100] +.LVL296: +.LBE252: +.LBB253: + .loc 1 502 0 +#APP +// 502 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w2, 122 + str w2, [x29, 104] +.LVL297: + str w2, [x0, 4104] +.LBE253: +.LBB254: + .loc 1 503 0 +#APP +// 503 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 37 + str w1, [x0, 4108] +.LVL298: +.LBE254: +.LBB255: + .loc 1 504 0 +#APP +// 504 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4112] +.LVL299: +.LBE255: +.LBB256: + .loc 1 505 0 +#APP +// 505 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4116] +.LVL300: +.LBE256: +.LBB257: + .loc 1 506 0 +#APP +// 506 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4120] +.LVL301: +.LBE257: +.LBB258: + .loc 1 507 0 +#APP +// 507 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 31 + str w1, [x0, 4124] +.LVL302: +.LBE258: +.LBB259: + .loc 1 508 0 +#APP +// 508 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 11 + str w1, [x0, 4128] +.LVL303: +.LBE259: +.LBB260: + .loc 1 509 0 +#APP +// 509 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 8 + str w1, [x0, 4132] +.LVL304: +.LBE260: +.LBB261: + .loc 1 510 0 +#APP +// 510 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4136] +.LVL305: +.LBE261: +.LBB262: + .loc 1 511 0 +#APP +// 511 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4140] +.LVL306: +.LBE262: +.LBB263: + .loc 1 512 0 +#APP +// 512 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4144] +.LVL307: +.LBE263: +.LBB264: + .loc 1 513 0 +#APP +// 513 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE264: +.LBB265: + .loc 1 514 0 + ubfx x21, x21, 9, 8 +.LVL308: +.LBE265: +.LBB266: + .loc 1 513 0 + str w25, [x0, 4148] +.LBE266: +.LBB267: + .loc 1 514 0 +#APP +// 514 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str w21, [x0, 4152] +.LVL309: +.LBE267: +.LBB268: + .loc 1 515 0 +#APP +// 515 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w22, 65537 +.LBE268: + .loc 1 516 0 + mov w1, 2 +.LBB269: + .loc 1 515 0 + str w22, [x0, 32] +.LBE269: + .loc 1 516 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL310: + mov w27, w0 +.LVL311: + .loc 1 517 0 + ldp w3, w2, [x29, 100] + tbz w0, #31, .L87 + .loc 1 518 0 + adrp x0, .LC5 +.LVL312: + mov x1, x19 + add x0, x0, :lo12:.LC5 +.LVL313: +.L113: + .loc 1 607 0 + bl printf +.LVL314: +.L88: +.LBB270: + .loc 1 612 0 +#APP +// 612 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65533 +.LBE270: + .loc 1 613 0 + ldr x2, [x28, 16] + mov w3, w25 +.LBB271: + .loc 1 612 0 + str w1, [x0, 772] +.LBE271: + .loc 1 613 0 + ldr x0, [x29, 120] + ldr x1, [x28, 24] + ldr x6, [x0, 24] + ldr x0, [x28, 8] + blr x6 +.LVL315: +.LBE322: +.LBE335: + .loc 1 661 0 + cbz w27, .L86 +.LVL316: +.L84: + .loc 1 662 0 + adrp x0, .LC20 + add x0, x0, :lo12:.LC20 + b .L114 +.LVL317: +.L87: +.LBB336: +.LBB323: +.LBB272: + .loc 1 522 0 +#APP +// 522 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL318: + mov w1, 14848 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL319: +.LBE272: +.LBB273: + .loc 1 523 0 +#APP +// 523 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str w3, [x0, 4096] +.LVL320: +.LBE273: +.LBB274: + .loc 1 524 0 +#APP +// 524 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 1 + str w1, [x0, 4100] +.LVL321: +.LBE274: +.LBB275: + .loc 1 525 0 +#APP +// 525 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str w2, [x0, 4104] +.LVL322: +.LBE275: +.LBB276: + .loc 1 526 0 +#APP +// 526 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 21 + str w1, [x0, 4108] +.LVL323: +.LBE276: +.LBB277: + .loc 1 527 0 +#APP +// 527 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 220 + str w1, [x0, 4112] +.LVL324: +.LBE277: +.LBB278: + .loc 1 528 0 +#APP +// 528 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 146 + str w1, [x0, 4116] +.LVL325: +.LBE278: +.LBB279: + .loc 1 529 0 +#APP +// 529 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 121 + str w1, [x0, 4120] +.LVL326: +.LBE279: +.LBB280: + .loc 1 530 0 +#APP +// 530 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 129 + str w1, [x0, 4124] +.LVL327: +.LBE280: +.LBB281: + .loc 1 531 0 +#APP +// 531 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 126 + str w1, [x0, 4128] +.LVL328: +.LBE281: +.LBB282: + .loc 1 532 0 +#APP +// 532 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 33 + str w1, [x0, 4132] +.LVL329: +.LBE282: +.LBB283: + .loc 1 533 0 +#APP +// 533 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 17 + str w1, [x0, 4136] +.LVL330: +.LBE283: +.LBB284: + .loc 1 534 0 +#APP +// 534 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 157 + str w1, [x0, 4140] +.LVL331: +.LBE284: +.LBB285: + .loc 1 535 0 +#APP +// 535 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w21, 2 +.LVL332: + str w21, [x0, 4144] +.LVL333: +.LBE285: +.LBB286: + .loc 1 536 0 +#APP +// 536 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4148] +.LVL334: +.LBE286: +.LBB287: + .loc 1 537 0 +#APP +// 537 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4152] +.LVL335: +.LBE287: +.LBB288: + .loc 1 538 0 +#APP +// 538 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE288: + .loc 1 539 0 + mov w1, w21 +.LBB289: + .loc 1 538 0 + str w22, [x0, 32] +.LBE289: + .loc 1 539 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL336: + mov w27, w0 +.LVL337: + .loc 1 540 0 + tbz w0, #31, .L89 + .loc 1 541 0 + adrp x0, .LC14 +.LVL338: + mov x1, x19 + add x0, x0, :lo12:.LC14 + b .L113 +.LVL339: +.L89: +.LBB290: + .loc 1 545 0 +#APP +// 545 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL340: + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL341: +.LBE290: +.LBB291: + .loc 1 546 0 +#APP +// 546 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65535 + str w1, [x0, 36] +.LVL342: +.LBE291: +.LBB292: + .loc 1 547 0 +#APP +// 547 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 251 + str w1, [x0, 4096] +.LVL343: +.LBE292: +.LBB293: + .loc 1 548 0 +#APP +// 548 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4100] +.LVL344: +.LBE293: +.LBB294: + .loc 1 549 0 +#APP +// 549 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE294: + .loc 1 550 0 + mov w1, w21 +.LBB295: + .loc 1 549 0 + str w22, [x0, 32] +.LBE295: + .loc 1 550 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL345: + mov w27, w0 +.LVL346: + .loc 1 551 0 + tbz w0, #31, .L90 + .loc 1 552 0 + adrp x0, .LC15 +.LVL347: + mov x1, x19 + add x0, x0, :lo12:.LC15 + b .L113 +.LVL348: +.L90: +.LBB296: + .loc 1 556 0 +#APP +// 556 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL349: + mov w1, -65534 + str w1, [x0, 36] +.LVL350: +.LBE296: +.LBB297: + .loc 1 557 0 +#APP +// 557 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 192 + str w1, [x0, 4096] +.LBE297: +.LBB298: + .loc 1 558 0 + and w1, w26, 255 +.LVL351: +#APP +// 558 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE298: +.LBB299: + .loc 1 559 0 + lsr w26, w26, 8 +.LVL352: +.LBE299: +.LBB300: + .loc 1 558 0 + str w1, [x0, 4100] +.LBE300: +.LBB301: + .loc 1 559 0 +#APP +// 559 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str w26, [x0, 4104] +.LVL353: +.LBE301: +.LBB302: + .loc 1 560 0 +#APP +// 560 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE302: + .loc 1 561 0 + mov w1, w21 +.LVL354: +.LBB303: + .loc 1 560 0 + str w22, [x0, 32] +.LBE303: + .loc 1 561 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL355: + mov w27, w0 +.LVL356: + .loc 1 562 0 + tbz w0, #31, .L91 + .loc 1 563 0 + adrp x0, .LC16 +.LVL357: + mov x1, x19 + add x0, x0, :lo12:.LC16 + b .L113 +.LVL358: +.L91: +.LBB304: + .loc 1 567 0 +#APP +// 567 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL359: + mov w1, 14848 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL360: +.LBE304: +.LBB305: + .loc 1 568 0 +#APP +// 568 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65535 + str w1, [x0, 36] +.LVL361: +.LBE305: +.LBB306: + .loc 1 569 0 +#APP +// 569 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 255 + str w1, [x0, 4096] +.LVL362: +.LBE306: +.LBB307: + .loc 1 570 0 +#APP +// 570 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 10 + str w1, [x0, 4100] +.LVL363: +.LBE307: +.LBB308: + .loc 1 571 0 +#APP +// 571 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE308: + .loc 1 572 0 + mov w1, w21 +.LBB309: + .loc 1 571 0 + str w22, [x0, 32] +.LBE309: + .loc 1 572 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL364: + mov w27, w0 +.LVL365: + .loc 1 573 0 + tbz w0, #31, .L92 + .loc 1 574 0 + adrp x0, .LC17 +.LVL366: + mov x1, x19 + add x0, x0, :lo12:.LC17 + b .L113 +.LVL367: +.L92: +.LBB310: + .loc 1 578 0 +#APP +// 578 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL368: + mov w1, -65534 + str w1, [x0, 36] +.LVL369: +.LBE310: +.LBB311: + .loc 1 579 0 +#APP +// 579 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 1 + str w1, [x0, 4096] +.LVL370: +.LBE311: +.LBB312: + .loc 1 580 0 +#APP +// 580 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 191 + str w1, [x0, 4100] +.LVL371: +.LBE312: +.LBB313: + .loc 1 581 0 +#APP +// 581 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4104] +.LVL372: +.LBE313: +.LBB314: + .loc 1 582 0 +#APP +// 582 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE314: + .loc 1 583 0 + mov w1, w21 +.LBB315: + .loc 1 582 0 + str w22, [x0, 32] +.LBE315: + .loc 1 583 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL373: + mov w27, w0 +.LVL374: + .loc 1 584 0 + tbz w0, #31, .L93 + .loc 1 585 0 + adrp x0, .LC18 +.LVL375: + mov x1, x19 + add x0, x0, :lo12:.LC18 + b .L113 +.LVL376: +.L93: + .loc 1 589 0 + mov x0, x28 +.LVL377: + bl rockchip_secure_otp_check_flag.isra.0 +.LVL378: + mov w27, w0 +.LVL379: + .loc 1 590 0 + tbz w0, #31, .L94 + .loc 1 591 0 + adrp x0, .LC6 +.LVL380: + mov x1, x19 + add x0, x0, :lo12:.LC6 + b .L113 +.LVL381: +.L94: +.LBB316: + .loc 1 595 0 +#APP +// 595 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL382: + mov w1, -65535 + str w1, [x0, 36] +.LVL383: +.LBE316: +.LBB317: + .loc 1 596 0 +#APP +// 596 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 2 + str w1, [x0, 4096] +.LVL384: +.LBE317: +.LBB318: + .loc 1 597 0 +#APP +// 597 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w2, 191 + str w2, [x0, 4100] +.LVL385: +.LBE318: +.LBB319: + .loc 1 598 0 +#APP +// 598 "drivers/misc/rk3528-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w2, 65537 + str w2, [x0, 32] +.LBE319: + .loc 1 599 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL386: + mov w27, w0 +.LVL387: + .loc 1 600 0 + tbz w0, #31, .L95 + .loc 1 601 0 + adrp x0, .LC19 +.LVL388: + mov x1, x19 + add x0, x0, :lo12:.LC19 + b .L113 +.LVL389: +.L95: + .loc 1 605 0 + mov x0, x28 +.LVL390: + bl rockchip_secure_otp_wait_flag.isra.1 +.LVL391: + mov w27, w0 +.LVL392: + .loc 1 606 0 + tbz w0, #31, .L88 + .loc 1 607 0 + adrp x0, .LC7 +.LVL393: + mov x1, x19 + add x0, x0, :lo12:.LC7 + b .L113 +.LVL394: +.L86: + add x23, x23, 1 +.LVL395: + b .L78 +.LVL396: +.L79: +.LBE323: +.LBE336: +.LBB337: +.LBB331: + .loc 1 457 0 + mov w27, -1 + b .L98 +.LBE331: +.LBE337: + .cfi_endproc +.LFE272: + .size rk3528_secure_otp_write, .-rk3528_secure_otp_write + .global _u_boot_list_2_driver_2_rockchip_secure_otp + .section .rodata.__func__.7575,"a",@progbits + .align 3 + .set .LANCHOR0,. + 0 + .type __func__.7575, %object + .size __func__.7575, 32 +__func__.7575: + .string "rockchip_secure_otp_wait_status" + .section .rodata.__func__.7618,"a",@progbits + .align 3 + .set .LANCHOR2,. + 0 + .type __func__.7618, %object + .size __func__.7618, 31 +__func__.7618: + .string "rockchip_secure_otp_ecc_enable" + .section .rodata.__func__.7636,"a",@progbits + .align 3 + .set .LANCHOR3,. + 0 + .type __func__.7636, %object + .size __func__.7636, 23 +__func__.7636: + .string "rk3528_secure_otp_read" + .section .rodata.__func__.7671,"a",@progbits + .align 3 + .set .LANCHOR1,. + 0 + .type __func__.7671, %object + .size __func__.7671, 38 +__func__.7671: + .string "rk3528_secure_otp_write_2_bytes_noecc" + .section .rodata.__func__.7892,"a",@progbits + .align 3 + .set .LANCHOR4,. + 0 + .type __func__.7892, %object + .size __func__.7892, 32 +__func__.7892: + .string "rk3528_secure_otp_write_2_bytes" + .section .rodata.rk3528_data,"a",@progbits + .align 3 + .type rk3528_data, %object + .size rk3528_data, 32 +rk3528_data: + .xword rk3528_secure_otp_read + .xword rk3528_secure_otp_write + .xword rk3528_spl_rockchip_otp_start + .xword rk3528_spl_rockchip_otp_stop + .section .rodata.rk3528_secure_otp_read.str1.1,"aMS",@progbits,1 +.LC9: + .string "do not access non secure area, half word offset = %d\n" +.LC10: + .string "Please input correct addr, offset(bytes) is 0x%x\n" +.LC11: + .string "%s timeout during read setup\n" + .section .rodata.rk3528_secure_otp_write.str1.1,"aMS",@progbits,1 +.LC12: + .string "The zone is written.\n" +.LC13: + .string "rk3528_secure_otp_write_byte_noecc error\n" +.LC14: + .string "%s timeout during write setup 2\n" +.LC15: + .string "%s timeout during write setup 3\n" +.LC16: + .string "%s timeout during write setup 4\n" +.LC17: + .string "%s timeout during write setup 5\n" +.LC18: + .string "%s timeout during write setup 6\n" +.LC19: + .string "%s timeout during write setup 8\n" +.LC20: + .string "rk3528_secure_otp_write_2_bytes error\n" + .section .rodata.rk3528_secure_otp_write_2_bytes_noecc.str1.1,"aMS",@progbits,1 +.LC4: + .string "Please input correct addr, offset is 0x%x\n" +.LC5: + .string "%s timeout during write setup 1\n" +.LC6: + .string "%s timeout during write setup 7\n" +.LC7: + .string "%s timeout during write setup 9\n" + .section .rodata.rockchip_otp_ids,"a",@progbits + .align 3 + .type rockchip_otp_ids, %object + .size rockchip_otp_ids, 32 +rockchip_otp_ids: + .xword .LC22 + .xword rk3528_data + .zero 16 + .section .rodata.rockchip_secure_otp_ecc_enable.str1.1,"aMS",@progbits,1 +.LC8: + .string "%s timeout during ecc_enable\n" + .section .rodata.rockchip_secure_otp_ofdata_to_platdata.str1.1,"aMS",@progbits,1 +.LC0: + .string "secure_conf" +.LC1: + .string "mask_addr" +.LC2: + .string "cru_rst_addr" + .section .rodata.rockchip_secure_otp_ops,"a",@progbits + .align 3 + .type rockchip_secure_otp_ops, %object + .size rockchip_secure_otp_ops, 32 +rockchip_secure_otp_ops: + .xword secure_otp_read + .xword secure_otp_write + .xword secure_otp_ioctl + .zero 8 + .section .rodata.rockchip_secure_otp_wait_status.isra.2.str1.1,"aMS",@progbits,1 +.LC3: + .string "%s: wait init status timeout\n" + .section .rodata.str1.1,"aMS",@progbits,1 +.LC21: + .string "rockchip_secure_otp" +.LC22: + .string "rockchip,rk3528-secure-otp" + .section .u_boot_list_2_driver_2_rockchip_secure_otp,"aw",@progbits + .align 2 + .type _u_boot_list_2_driver_2_rockchip_secure_otp, %object + .size _u_boot_list_2_driver_2_rockchip_secure_otp, 120 +_u_boot_list_2_driver_2_rockchip_secure_otp: + .8byte .LC21 + .word 36 + .zero 4 + .8byte rockchip_otp_ids + .zero 32 + .8byte rockchip_secure_otp_ofdata_to_platdata + .zero 28 + .word 32 + .zero 8 + .8byte rockchip_secure_otp_ops + .zero 8 + .text +.Letext0: + .file 2 "include/common.h" + .file 3 "./arch/arm/include/asm/types.h" + .file 4 "include/linux/types.h" + .file 5 "include/errno.h" + .file 6 "include/linux/string.h" + .file 7 "include/efi.h" + .file 8 "include/dm/device.h" + .file 9 "include/ide.h" + .file 10 "include/linux/list.h" + .file 11 "include/part.h" + .file 12 "include/flash.h" + .file 13 "include/lmb.h" + .file 14 "include/asm-generic/u-boot.h" + .file 15 "./arch/arm/include/asm/u-boot-arm.h" + .file 16 "include/linux/libfdt_env.h" + .file 17 "include/linux/../../scripts/dtc/libfdt/fdt.h" + .file 18 "include/linux/libfdt.h" + .file 19 "include/image.h" + .file 20 "./arch/arm/include/asm/global_data.h" + .file 21 "include/asm-generic/global_data.h" + .file 22 "include/dm/of.h" + .file 23 "include/net.h" + .file 24 "include/dm/uclass-id.h" + .file 25 "include/dm/ofnode.h" + .file 26 "include/malloc.h" + .file 27 "include/linux/compat.h" + .file 28 "include/dm/uclass.h" + .file 29 "include/asm-generic/ioctl.h" + .file 30 "include/misc.h" + .file 31 "include/rockchip-otp.h" + .file 32 "include/dm/read.h" + .file 33 "include/stdio.h" + .file 34 "include/linux/delay.h" + .file 35 "include/log.h" + .section .debug_info,"",@progbits +.Ldebug_info0: + .4byte 0x42d0 + .2byte 0x4 + .4byte .Ldebug_abbrev0 + .byte 0x8 + .uleb128 0x1 + .4byte .LASF458 + .byte 0xc + .4byte .LASF459 + .4byte .LASF460 + .4byte .Ldebug_ranges0+0x6c0 + .8byte 0 + .4byte .Ldebug_line0 + .uleb128 0x2 + .4byte .LASF4 + .byte 0x2 + .byte 0xd + .4byte 0x34 + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF0 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF1 + .uleb128 0x3 + .byte 0x2 + .byte 0x7 + .4byte .LASF2 + .uleb128 0x4 + .4byte .LASF21 + .byte 0x5 + .byte 0xc + .4byte 0x54 + .uleb128 0x5 + .byte 0x4 + .byte 0x5 + .string "int" + .uleb128 0x3 + .byte 0x1 + .byte 0x6 + .4byte .LASF3 + .uleb128 0x2 + .4byte .LASF5 + .byte 0x3 + .byte 0xc + .4byte 0x34 + .uleb128 0x3 + .byte 0x2 + .byte 0x5 + .4byte .LASF6 + .uleb128 0x2 + .4byte .LASF7 + .byte 0x3 + .byte 0x12 + .4byte 0x7f + .uleb128 0x3 + .byte 0x4 + .byte 0x7 + .4byte .LASF8 + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF9 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF10 + .uleb128 0x6 + .string "u8" + .byte 0x3 + .byte 0x1f + .4byte 0x34 + .uleb128 0x7 + .4byte 0x94 + .uleb128 0x6 + .string "u16" + .byte 0x3 + .byte 0x22 + .4byte 0x42 + .uleb128 0x6 + .string "u32" + .byte 0x3 + .byte 0x25 + .4byte 0x7f + .uleb128 0x6 + .string "u64" + .byte 0x3 + .byte 0x28 + .4byte 0x8d + .uleb128 0x2 + .4byte .LASF11 + .byte 0x3 + .byte 0x31 + .4byte 0x8d + .uleb128 0x2 + .4byte .LASF12 + .byte 0x3 + .byte 0x32 + .4byte 0x8d + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF13 + .uleb128 0x8 + .byte 0x8 + .4byte 0xee + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF14 + .uleb128 0x7 + .4byte 0xe7 + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF15 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe7 + .uleb128 0x2 + .4byte .LASF16 + .byte 0x4 + .byte 0x59 + .4byte 0x42 + .uleb128 0x2 + .4byte .LASF17 + .byte 0x4 + .byte 0x5b + .4byte 0x3b + .uleb128 0x2 + .4byte .LASF18 + .byte 0x4 + .byte 0x69 + .4byte 0x62 + .uleb128 0x2 + .4byte .LASF19 + .byte 0x4 + .byte 0x6b + .4byte 0x74 + .uleb128 0x2 + .4byte .LASF20 + .byte 0x4 + .byte 0x97 + .4byte 0x74 + .uleb128 0x9 + .byte 0x8 + .uleb128 0x4 + .4byte .LASF22 + .byte 0x6 + .byte 0xb + .4byte 0xfa + .uleb128 0x3 + .byte 0x1 + .byte 0x2 + .4byte .LASF23 + .uleb128 0xa + .4byte 0xe7 + .4byte 0x156 + .uleb128 0xb + .byte 0 + .uleb128 0xc + .4byte .LASF24 + .byte 0x7 + .2byte 0x140 + .4byte 0x14b + .uleb128 0xc + .4byte .LASF25 + .byte 0x7 + .2byte 0x143 + .4byte 0x14b + .uleb128 0xc + .4byte .LASF26 + .byte 0x7 + .2byte 0x143 + .4byte 0x14b + .uleb128 0xd + .4byte .LASF45 + .byte 0xa0 + .byte 0x8 + .byte 0x83 + .4byte 0x25f + .uleb128 0xe + .4byte .LASF27 + .byte 0x8 + .byte 0x84 + .4byte 0x1397 + .byte 0 + .uleb128 0xe + .4byte .LASF28 + .byte 0x8 + .byte 0x85 + .4byte 0xe1 + .byte 0x8 + .uleb128 0xe + .4byte .LASF29 + .byte 0x8 + .byte 0x86 + .4byte 0x137 + .byte 0x10 + .uleb128 0xe + .4byte .LASF30 + .byte 0x8 + .byte 0x87 + .4byte 0x137 + .byte 0x18 + .uleb128 0xe + .4byte .LASF31 + .byte 0x8 + .byte 0x88 + .4byte 0x137 + .byte 0x20 + .uleb128 0xe + .4byte .LASF32 + .byte 0x8 + .byte 0x89 + .4byte 0x133e + .byte 0x28 + .uleb128 0xe + .4byte .LASF33 + .byte 0x8 + .byte 0x8a + .4byte 0x10b + .byte 0x30 + .uleb128 0xe + .4byte .LASF34 + .byte 0x8 + .byte 0x8b + .4byte 0x25f + .byte 0x38 + .uleb128 0xe + .4byte .LASF35 + .byte 0x8 + .byte 0x8c + .4byte 0x137 + .byte 0x40 + .uleb128 0xe + .4byte .LASF36 + .byte 0x8 + .byte 0x8d + .4byte 0x13e6 + .byte 0x48 + .uleb128 0xe + .4byte .LASF37 + .byte 0x8 + .byte 0x8e + .4byte 0x137 + .byte 0x50 + .uleb128 0xe + .4byte .LASF38 + .byte 0x8 + .byte 0x8f + .4byte 0x137 + .byte 0x58 + .uleb128 0xe + .4byte .LASF39 + .byte 0x8 + .byte 0x90 + .4byte 0x292 + .byte 0x60 + .uleb128 0xe + .4byte .LASF40 + .byte 0x8 + .byte 0x91 + .4byte 0x292 + .byte 0x70 + .uleb128 0xe + .4byte .LASF41 + .byte 0x8 + .byte 0x92 + .4byte 0x292 + .byte 0x80 + .uleb128 0xe + .4byte .LASF42 + .byte 0x8 + .byte 0x93 + .4byte 0x121 + .byte 0x90 + .uleb128 0xe + .4byte .LASF43 + .byte 0x8 + .byte 0x94 + .4byte 0x54 + .byte 0x94 + .uleb128 0xf + .string "seq" + .byte 0x8 + .byte 0x95 + .4byte 0x54 + .byte 0x98 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x17a + .uleb128 0x8 + .byte 0x8 + .4byte 0x26b + .uleb128 0x10 + .uleb128 0xa + .4byte 0x10b + .4byte 0x277 + .uleb128 0xb + .byte 0 + .uleb128 0x4 + .4byte .LASF44 + .byte 0x9 + .byte 0x10 + .4byte 0x26c + .uleb128 0xa + .4byte 0x34 + .4byte 0x292 + .uleb128 0x11 + .4byte 0xda + .byte 0x5 + .byte 0 + .uleb128 0xd + .4byte .LASF46 + .byte 0x10 + .byte 0xa + .byte 0x16 + .4byte 0x2b7 + .uleb128 0xe + .4byte .LASF47 + .byte 0xa + .byte 0x17 + .4byte 0x2b7 + .byte 0 + .uleb128 0xe + .4byte .LASF48 + .byte 0xa + .byte 0x17 + .4byte 0x2b7 + .byte 0x8 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x292 + .uleb128 0xd + .4byte .LASF49 + .byte 0x10 + .byte 0xb + .byte 0xf + .4byte 0x2e2 + .uleb128 0xe + .4byte .LASF28 + .byte 0xb + .byte 0x10 + .4byte 0xfa + .byte 0 + .uleb128 0xe + .4byte .LASF50 + .byte 0xb + .byte 0x11 + .4byte 0x2fb + .byte 0x8 + .byte 0 + .uleb128 0x7 + .4byte 0x2bd + .uleb128 0x12 + .4byte 0x54 + .4byte 0x2fb + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x2e7 + .uleb128 0xa + .4byte 0x2e2 + .4byte 0x30c + .uleb128 0xb + .byte 0 + .uleb128 0x7 + .4byte 0x301 + .uleb128 0x4 + .4byte .LASF49 + .byte 0xb + .byte 0xe1 + .4byte 0x30c + .uleb128 0x14 + .2byte 0x1220 + .byte 0xc + .byte 0x13 + .4byte 0x370 + .uleb128 0xe + .4byte .LASF51 + .byte 0xc + .byte 0x14 + .4byte 0x10b + .byte 0 + .uleb128 0xe + .4byte .LASF52 + .byte 0xc + .byte 0x15 + .4byte 0x100 + .byte 0x8 + .uleb128 0xe + .4byte .LASF53 + .byte 0xc + .byte 0x16 + .4byte 0x10b + .byte 0x10 + .uleb128 0xe + .4byte .LASF54 + .byte 0xc + .byte 0x17 + .4byte 0x370 + .byte 0x18 + .uleb128 0x15 + .4byte .LASF55 + .byte 0xc + .byte 0x18 + .4byte 0x381 + .2byte 0x1018 + .uleb128 0x16 + .string "mtd" + .byte 0xc + .byte 0x31 + .4byte 0x397 + .2byte 0x1218 + .byte 0 + .uleb128 0xa + .4byte 0x10b + .4byte 0x381 + .uleb128 0x17 + .4byte 0xda + .2byte 0x1ff + .byte 0 + .uleb128 0xa + .4byte 0x29 + .4byte 0x392 + .uleb128 0x17 + .4byte 0xda + .2byte 0x1ff + .byte 0 + .uleb128 0x18 + .4byte .LASF317 + .uleb128 0x8 + .byte 0x8 + .4byte 0x392 + .uleb128 0x2 + .4byte .LASF56 + .byte 0xc + .byte 0x37 + .4byte 0x31c + .uleb128 0xa + .4byte 0x39d + .4byte 0x3b3 + .uleb128 0xb + .byte 0 + .uleb128 0x4 + .4byte .LASF57 + .byte 0xc + .byte 0x39 + .4byte 0x3a8 + .uleb128 0x3 + .byte 0x10 + .byte 0x4 + .4byte .LASF58 + .uleb128 0xd + .4byte .LASF59 + .byte 0x10 + .byte 0xd + .byte 0x10 + .4byte 0x3ea + .uleb128 0xe + .4byte .LASF60 + .byte 0xd + .byte 0x11 + .4byte 0xc4 + .byte 0 + .uleb128 0xe + .4byte .LASF51 + .byte 0xd + .byte 0x12 + .4byte 0xcf + .byte 0x8 + .byte 0 + .uleb128 0x19 + .4byte .LASF61 + .2byte 0x120 + .byte 0xd + .byte 0x15 + .4byte 0x41c + .uleb128 0xf + .string "cnt" + .byte 0xd + .byte 0x16 + .4byte 0x3b + .byte 0 + .uleb128 0xe + .4byte .LASF51 + .byte 0xd + .byte 0x17 + .4byte 0xcf + .byte 0x8 + .uleb128 0xe + .4byte .LASF62 + .byte 0xd + .byte 0x18 + .4byte 0x41c + .byte 0x10 + .byte 0 + .uleb128 0xa + .4byte 0x3c5 + .4byte 0x42c + .uleb128 0x11 + .4byte 0xda + .byte 0x10 + .byte 0 + .uleb128 0x1a + .string "lmb" + .2byte 0x240 + .byte 0xd + .byte 0x1b + .4byte 0x453 + .uleb128 0xe + .4byte .LASF63 + .byte 0xd + .byte 0x1c + .4byte 0x3ea + .byte 0 + .uleb128 0x15 + .4byte .LASF64 + .byte 0xd + .byte 0x1d + .4byte 0x3ea + .2byte 0x120 + .byte 0 + .uleb128 0x1b + .string "lmb" + .byte 0xd + .byte 0x20 + .4byte 0x42c + .uleb128 0x1c + .byte 0x10 + .byte 0xe + .byte 0x5d + .4byte 0x47f + .uleb128 0xe + .4byte .LASF54 + .byte 0xe + .byte 0x5e + .4byte 0xb9 + .byte 0 + .uleb128 0xe + .4byte .LASF51 + .byte 0xe + .byte 0x5f + .4byte 0xb9 + .byte 0x8 + .byte 0 + .uleb128 0xd + .4byte .LASF65 + .byte 0xb0 + .byte 0xe + .byte 0x1b + .4byte 0x57c + .uleb128 0xe + .4byte .LASF66 + .byte 0xe + .byte 0x1c + .4byte 0x3b + .byte 0 + .uleb128 0xe + .4byte .LASF67 + .byte 0xe + .byte 0x1d + .4byte 0xcf + .byte 0x8 + .uleb128 0xe + .4byte .LASF68 + .byte 0xe + .byte 0x1e + .4byte 0x3b + .byte 0x10 + .uleb128 0xe + .4byte .LASF69 + .byte 0xe + .byte 0x1f + .4byte 0x3b + .byte 0x18 + .uleb128 0xe + .4byte .LASF70 + .byte 0xe + .byte 0x20 + .4byte 0x3b + .byte 0x20 + .uleb128 0xe + .4byte .LASF71 + .byte 0xe + .byte 0x21 + .4byte 0x3b + .byte 0x28 + .uleb128 0xe + .4byte .LASF72 + .byte 0xe + .byte 0x22 + .4byte 0x3b + .byte 0x30 + .uleb128 0xe + .4byte .LASF73 + .byte 0xe + .byte 0x24 + .4byte 0x3b + .byte 0x38 + .uleb128 0xe + .4byte .LASF74 + .byte 0xe + .byte 0x25 + .4byte 0x3b + .byte 0x40 + .uleb128 0xe + .4byte .LASF75 + .byte 0xe + .byte 0x26 + .4byte 0x3b + .byte 0x48 + .uleb128 0xe + .4byte .LASF76 + .byte 0xe + .byte 0x31 + .4byte 0x3b + .byte 0x50 + .uleb128 0xe + .4byte .LASF77 + .byte 0xe + .byte 0x32 + .4byte 0x3b + .byte 0x58 + .uleb128 0xe + .4byte .LASF78 + .byte 0xe + .byte 0x33 + .4byte 0x282 + .byte 0x60 + .uleb128 0xe + .4byte .LASF79 + .byte 0xe + .byte 0x34 + .4byte 0x42 + .byte 0x66 + .uleb128 0xe + .4byte .LASF80 + .byte 0xe + .byte 0x35 + .4byte 0x3b + .byte 0x68 + .uleb128 0xe + .4byte .LASF81 + .byte 0xe + .byte 0x36 + .4byte 0x3b + .byte 0x70 + .uleb128 0xe + .4byte .LASF82 + .byte 0xe + .byte 0x57 + .4byte 0x10b + .byte 0x78 + .uleb128 0xe + .4byte .LASF83 + .byte 0xe + .byte 0x58 + .4byte 0x10b + .byte 0x80 + .uleb128 0xe + .4byte .LASF84 + .byte 0xe + .byte 0x5b + .4byte 0x7f + .byte 0x88 + .uleb128 0xe + .4byte .LASF85 + .byte 0xe + .byte 0x60 + .4byte 0x57c + .byte 0x90 + .byte 0 + .uleb128 0xa + .4byte 0x45e + .4byte 0x58c + .uleb128 0x11 + .4byte 0xda + .byte 0x1 + .byte 0 + .uleb128 0x2 + .4byte .LASF86 + .byte 0xe + .byte 0x62 + .4byte 0x47f + .uleb128 0x4 + .4byte .LASF87 + .byte 0xf + .byte 0x13 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF88 + .byte 0xf + .byte 0x14 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF89 + .byte 0xf + .byte 0x15 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF90 + .byte 0xf + .byte 0x16 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF91 + .byte 0xf + .byte 0x17 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF92 + .byte 0xf + .byte 0x18 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF93 + .byte 0xf + .byte 0x19 + .4byte 0x10b + .uleb128 0x2 + .4byte .LASF94 + .byte 0x10 + .byte 0x11 + .4byte 0x12c + .uleb128 0xd + .4byte .LASF95 + .byte 0x28 + .byte 0x11 + .byte 0x39 + .4byte 0x674 + .uleb128 0xe + .4byte .LASF96 + .byte 0x11 + .byte 0x3a + .4byte 0x5e4 + .byte 0 + .uleb128 0xe + .4byte .LASF97 + .byte 0x11 + .byte 0x3b + .4byte 0x5e4 + .byte 0x4 + .uleb128 0xe + .4byte .LASF98 + .byte 0x11 + .byte 0x3c + .4byte 0x5e4 + .byte 0x8 + .uleb128 0xe + .4byte .LASF99 + .byte 0x11 + .byte 0x3d + .4byte 0x5e4 + .byte 0xc + .uleb128 0xe + .4byte .LASF100 + .byte 0x11 + .byte 0x3e + .4byte 0x5e4 + .byte 0x10 + .uleb128 0xe + .4byte .LASF101 + .byte 0x11 + .byte 0x3f + .4byte 0x5e4 + .byte 0x14 + .uleb128 0xe + .4byte .LASF102 + .byte 0x11 + .byte 0x40 + .4byte 0x5e4 + .byte 0x18 + .uleb128 0xe + .4byte .LASF103 + .byte 0x11 + .byte 0x43 + .4byte 0x5e4 + .byte 0x1c + .uleb128 0xe + .4byte .LASF104 + .byte 0x11 + .byte 0x46 + .4byte 0x5e4 + .byte 0x20 + .uleb128 0xe + .4byte .LASF105 + .byte 0x11 + .byte 0x49 + .4byte 0x5e4 + .byte 0x24 + .byte 0 + .uleb128 0xc + .4byte .LASF106 + .byte 0x12 + .2byte 0x136 + .4byte 0x680 + .uleb128 0x8 + .byte 0x8 + .4byte 0x5ef + .uleb128 0x1d + .4byte .LASF107 + .byte 0x40 + .byte 0x13 + .2byte 0x137 + .4byte 0x730 + .uleb128 0x1e + .4byte .LASF108 + .byte 0x13 + .2byte 0x138 + .4byte 0x12c + .byte 0 + .uleb128 0x1e + .4byte .LASF109 + .byte 0x13 + .2byte 0x139 + .4byte 0x12c + .byte 0x4 + .uleb128 0x1e + .4byte .LASF110 + .byte 0x13 + .2byte 0x13a + .4byte 0x12c + .byte 0x8 + .uleb128 0x1e + .4byte .LASF111 + .byte 0x13 + .2byte 0x13b + .4byte 0x12c + .byte 0xc + .uleb128 0x1e + .4byte .LASF112 + .byte 0x13 + .2byte 0x13c + .4byte 0x12c + .byte 0x10 + .uleb128 0x1e + .4byte .LASF113 + .byte 0x13 + .2byte 0x13d + .4byte 0x12c + .byte 0x14 + .uleb128 0x1e + .4byte .LASF114 + .byte 0x13 + .2byte 0x13e + .4byte 0x12c + .byte 0x18 + .uleb128 0x1e + .4byte .LASF115 + .byte 0x13 + .2byte 0x13f + .4byte 0x116 + .byte 0x1c + .uleb128 0x1e + .4byte .LASF116 + .byte 0x13 + .2byte 0x140 + .4byte 0x116 + .byte 0x1d + .uleb128 0x1e + .4byte .LASF117 + .byte 0x13 + .2byte 0x141 + .4byte 0x116 + .byte 0x1e + .uleb128 0x1e + .4byte .LASF118 + .byte 0x13 + .2byte 0x142 + .4byte 0x116 + .byte 0x1f + .uleb128 0x1e + .4byte .LASF119 + .byte 0x13 + .2byte 0x143 + .4byte 0x730 + .byte 0x20 + .byte 0 + .uleb128 0xa + .4byte 0x116 + .4byte 0x740 + .uleb128 0x11 + .4byte 0xda + .byte 0x1f + .byte 0 + .uleb128 0x1f + .4byte .LASF120 + .byte 0x13 + .2byte 0x144 + .4byte 0x686 + .uleb128 0x1d + .4byte .LASF121 + .byte 0x30 + .byte 0x13 + .2byte 0x146 + .4byte 0x7ce + .uleb128 0x1e + .4byte .LASF54 + .byte 0x13 + .2byte 0x147 + .4byte 0x10b + .byte 0 + .uleb128 0x20 + .string "end" + .byte 0x13 + .2byte 0x147 + .4byte 0x10b + .byte 0x8 + .uleb128 0x1e + .4byte .LASF122 + .byte 0x13 + .2byte 0x148 + .4byte 0x10b + .byte 0x10 + .uleb128 0x1e + .4byte .LASF123 + .byte 0x13 + .2byte 0x148 + .4byte 0x10b + .byte 0x18 + .uleb128 0x1e + .4byte .LASF124 + .byte 0x13 + .2byte 0x149 + .4byte 0x10b + .byte 0x20 + .uleb128 0x1e + .4byte .LASF125 + .byte 0x13 + .2byte 0x14a + .4byte 0x116 + .byte 0x28 + .uleb128 0x1e + .4byte .LASF126 + .byte 0x13 + .2byte 0x14a + .4byte 0x116 + .byte 0x29 + .uleb128 0x20 + .string "os" + .byte 0x13 + .2byte 0x14a + .4byte 0x116 + .byte 0x2a + .uleb128 0x1e + .4byte .LASF127 + .byte 0x13 + .2byte 0x14b + .4byte 0x116 + .byte 0x2b + .byte 0 + .uleb128 0x1f + .4byte .LASF128 + .byte 0x13 + .2byte 0x14c + .4byte 0x74c + .uleb128 0x21 + .4byte .LASF129 + .2byte 0x380 + .byte 0x13 + .2byte 0x152 + .4byte 0x977 + .uleb128 0x1e + .4byte .LASF130 + .byte 0x13 + .2byte 0x158 + .4byte 0x977 + .byte 0 + .uleb128 0x1e + .4byte .LASF131 + .byte 0x13 + .2byte 0x159 + .4byte 0x740 + .byte 0x8 + .uleb128 0x1e + .4byte .LASF132 + .byte 0x13 + .2byte 0x15a + .4byte 0x10b + .byte 0x48 + .uleb128 0x1e + .4byte .LASF133 + .byte 0x13 + .2byte 0x15d + .4byte 0xe1 + .byte 0x50 + .uleb128 0x1e + .4byte .LASF134 + .byte 0x13 + .2byte 0x15f + .4byte 0x137 + .byte 0x58 + .uleb128 0x1e + .4byte .LASF135 + .byte 0x13 + .2byte 0x160 + .4byte 0xe1 + .byte 0x60 + .uleb128 0x1e + .4byte .LASF136 + .byte 0x13 + .2byte 0x161 + .4byte 0x54 + .byte 0x68 + .uleb128 0x1e + .4byte .LASF137 + .byte 0x13 + .2byte 0x163 + .4byte 0x137 + .byte 0x70 + .uleb128 0x1e + .4byte .LASF138 + .byte 0x13 + .2byte 0x164 + .4byte 0xe1 + .byte 0x78 + .uleb128 0x1e + .4byte .LASF139 + .byte 0x13 + .2byte 0x165 + .4byte 0x54 + .byte 0x80 + .uleb128 0x1e + .4byte .LASF140 + .byte 0x13 + .2byte 0x167 + .4byte 0x137 + .byte 0x88 + .uleb128 0x1e + .4byte .LASF141 + .byte 0x13 + .2byte 0x168 + .4byte 0xe1 + .byte 0x90 + .uleb128 0x1e + .4byte .LASF142 + .byte 0x13 + .2byte 0x169 + .4byte 0x54 + .byte 0x98 + .uleb128 0x1e + .4byte .LASF143 + .byte 0x13 + .2byte 0x16b + .4byte 0x137 + .byte 0xa0 + .uleb128 0x1e + .4byte .LASF144 + .byte 0x13 + .2byte 0x16c + .4byte 0xe1 + .byte 0xa8 + .uleb128 0x1e + .4byte .LASF145 + .byte 0x13 + .2byte 0x16d + .4byte 0x54 + .byte 0xb0 + .uleb128 0x20 + .string "os" + .byte 0x13 + .2byte 0x171 + .4byte 0x7ce + .byte 0xb8 + .uleb128 0x20 + .string "ep" + .byte 0x13 + .2byte 0x172 + .4byte 0x10b + .byte 0xe8 + .uleb128 0x1e + .4byte .LASF146 + .byte 0x13 + .2byte 0x174 + .4byte 0x10b + .byte 0xf0 + .uleb128 0x1e + .4byte .LASF147 + .byte 0x13 + .2byte 0x174 + .4byte 0x10b + .byte 0xf8 + .uleb128 0x22 + .4byte .LASF148 + .byte 0x13 + .2byte 0x176 + .4byte 0xfa + .2byte 0x100 + .uleb128 0x22 + .4byte .LASF149 + .byte 0x13 + .2byte 0x177 + .4byte 0x10b + .2byte 0x108 + .uleb128 0x22 + .4byte .LASF150 + .byte 0x13 + .2byte 0x179 + .4byte 0x10b + .2byte 0x110 + .uleb128 0x22 + .4byte .LASF151 + .byte 0x13 + .2byte 0x17a + .4byte 0x10b + .2byte 0x118 + .uleb128 0x22 + .4byte .LASF152 + .byte 0x13 + .2byte 0x17b + .4byte 0x10b + .2byte 0x120 + .uleb128 0x22 + .4byte .LASF153 + .byte 0x13 + .2byte 0x17c + .4byte 0x10b + .2byte 0x128 + .uleb128 0x23 + .string "kbd" + .byte 0x13 + .2byte 0x17d + .4byte 0x97d + .2byte 0x130 + .uleb128 0x22 + .4byte .LASF154 + .byte 0x13 + .2byte 0x180 + .4byte 0x54 + .2byte 0x138 + .uleb128 0x22 + .4byte .LASF155 + .byte 0x13 + .2byte 0x18d + .4byte 0x54 + .2byte 0x13c + .uleb128 0x23 + .string "lmb" + .byte 0x13 + .2byte 0x190 + .4byte 0x42c + .2byte 0x140 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x740 + .uleb128 0x8 + .byte 0x8 + .4byte 0x58c + .uleb128 0x1f + .4byte .LASF156 + .byte 0x13 + .2byte 0x196 + .4byte 0x7da + .uleb128 0xc + .4byte .LASF157 + .byte 0x13 + .2byte 0x198 + .4byte 0x983 + .uleb128 0xa + .4byte 0xe7 + .4byte 0x9ac + .uleb128 0x17 + .4byte 0xda + .2byte 0x3ff + .byte 0 + .uleb128 0x24 + .4byte .LASF351 + .byte 0x4 + .4byte 0x54 + .byte 0x18 + .byte 0xe + .4byte 0xc0f + .uleb128 0x25 + .4byte .LASF158 + .byte 0 + .uleb128 0x25 + .4byte .LASF159 + .byte 0x1 + .uleb128 0x25 + .4byte .LASF160 + .byte 0x2 + .uleb128 0x25 + .4byte .LASF161 + .byte 0x3 + .uleb128 0x25 + .4byte .LASF162 + .byte 0x4 + .uleb128 0x25 + .4byte .LASF163 + .byte 0x5 + .uleb128 0x25 + .4byte .LASF164 + .byte 0x6 + .uleb128 0x25 + .4byte .LASF165 + .byte 0x7 + .uleb128 0x25 + .4byte .LASF166 + .byte 0x8 + .uleb128 0x25 + .4byte .LASF167 + .byte 0x9 + .uleb128 0x25 + .4byte .LASF168 + .byte 0xa + .uleb128 0x25 + .4byte .LASF169 + .byte 0xb + .uleb128 0x25 + .4byte .LASF170 + .byte 0xc + .uleb128 0x25 + .4byte .LASF171 + .byte 0xd + .uleb128 0x25 + .4byte .LASF172 + .byte 0xe + .uleb128 0x25 + .4byte .LASF173 + .byte 0xf + .uleb128 0x25 + .4byte .LASF174 + .byte 0x10 + .uleb128 0x25 + .4byte .LASF175 + .byte 0x11 + .uleb128 0x25 + .4byte .LASF176 + .byte 0x12 + .uleb128 0x25 + .4byte .LASF177 + .byte 0x13 + .uleb128 0x25 + .4byte .LASF178 + .byte 0x14 + .uleb128 0x25 + .4byte .LASF179 + .byte 0x15 + .uleb128 0x25 + .4byte .LASF180 + .byte 0x16 + .uleb128 0x25 + .4byte .LASF181 + .byte 0x17 + .uleb128 0x25 + .4byte .LASF182 + .byte 0x18 + .uleb128 0x25 + .4byte .LASF183 + .byte 0x19 + .uleb128 0x25 + .4byte .LASF184 + .byte 0x1a + .uleb128 0x25 + .4byte .LASF185 + .byte 0x1b + .uleb128 0x25 + .4byte .LASF186 + .byte 0x1c + .uleb128 0x25 + .4byte .LASF187 + .byte 0x1d + .uleb128 0x25 + .4byte .LASF188 + .byte 0x1e + .uleb128 0x25 + .4byte .LASF189 + .byte 0x1f + .uleb128 0x25 + .4byte .LASF190 + .byte 0x20 + .uleb128 0x25 + .4byte .LASF191 + .byte 0x21 + .uleb128 0x25 + .4byte .LASF192 + .byte 0x22 + .uleb128 0x25 + .4byte .LASF193 + .byte 0x23 + .uleb128 0x25 + .4byte .LASF194 + .byte 0x24 + .uleb128 0x25 + .4byte .LASF195 + .byte 0x25 + .uleb128 0x25 + .4byte .LASF196 + .byte 0x26 + .uleb128 0x25 + .4byte .LASF197 + .byte 0x27 + .uleb128 0x25 + .4byte .LASF198 + .byte 0x28 + .uleb128 0x25 + .4byte .LASF199 + .byte 0x29 + .uleb128 0x25 + .4byte .LASF200 + .byte 0x2a + .uleb128 0x25 + .4byte .LASF201 + .byte 0x2b + .uleb128 0x25 + .4byte .LASF202 + .byte 0x2c + .uleb128 0x25 + .4byte .LASF203 + .byte 0x2d + .uleb128 0x25 + .4byte .LASF204 + .byte 0x2e + .uleb128 0x25 + .4byte .LASF205 + .byte 0x2f + .uleb128 0x25 + .4byte .LASF206 + .byte 0x30 + .uleb128 0x25 + .4byte .LASF207 + .byte 0x31 + .uleb128 0x25 + .4byte .LASF208 + .byte 0x32 + .uleb128 0x25 + .4byte .LASF209 + .byte 0x33 + .uleb128 0x25 + .4byte .LASF210 + .byte 0x34 + .uleb128 0x25 + .4byte .LASF211 + .byte 0x35 + .uleb128 0x25 + .4byte .LASF212 + .byte 0x36 + .uleb128 0x25 + .4byte .LASF213 + .byte 0x37 + .uleb128 0x25 + .4byte .LASF214 + .byte 0x38 + .uleb128 0x25 + .4byte .LASF215 + .byte 0x39 + .uleb128 0x25 + .4byte .LASF216 + .byte 0x3a + .uleb128 0x25 + .4byte .LASF217 + .byte 0x3b + .uleb128 0x25 + .4byte .LASF218 + .byte 0x3c + .uleb128 0x25 + .4byte .LASF219 + .byte 0x3d + .uleb128 0x25 + .4byte .LASF220 + .byte 0x3e + .uleb128 0x25 + .4byte .LASF221 + .byte 0x3f + .uleb128 0x25 + .4byte .LASF222 + .byte 0x40 + .uleb128 0x25 + .4byte .LASF223 + .byte 0x41 + .uleb128 0x25 + .4byte .LASF224 + .byte 0x42 + .uleb128 0x25 + .4byte .LASF225 + .byte 0x43 + .uleb128 0x25 + .4byte .LASF226 + .byte 0x44 + .uleb128 0x25 + .4byte .LASF227 + .byte 0x45 + .uleb128 0x25 + .4byte .LASF228 + .byte 0x46 + .uleb128 0x25 + .4byte .LASF229 + .byte 0x47 + .uleb128 0x25 + .4byte .LASF230 + .byte 0x48 + .uleb128 0x25 + .4byte .LASF231 + .byte 0x49 + .uleb128 0x25 + .4byte .LASF232 + .byte 0x4a + .uleb128 0x25 + .4byte .LASF233 + .byte 0x4b + .uleb128 0x25 + .4byte .LASF234 + .byte 0x4c + .uleb128 0x25 + .4byte .LASF235 + .byte 0x4d + .uleb128 0x25 + .4byte .LASF236 + .byte 0x4e + .uleb128 0x25 + .4byte .LASF237 + .byte 0x4f + .uleb128 0x25 + .4byte .LASF238 + .byte 0x50 + .uleb128 0x25 + .4byte .LASF239 + .byte 0x51 + .uleb128 0x25 + .4byte .LASF240 + .byte 0x52 + .uleb128 0x25 + .4byte .LASF241 + .byte 0x53 + .uleb128 0x25 + .4byte .LASF242 + .byte 0x54 + .uleb128 0x25 + .4byte .LASF243 + .byte 0x55 + .uleb128 0x25 + .4byte .LASF244 + .byte 0x56 + .uleb128 0x25 + .4byte .LASF245 + .byte 0x57 + .uleb128 0x25 + .4byte .LASF246 + .byte 0x58 + .uleb128 0x25 + .4byte .LASF247 + .byte 0x59 + .uleb128 0x25 + .4byte .LASF248 + .byte 0x5a + .uleb128 0x25 + .4byte .LASF249 + .byte 0x5b + .uleb128 0x25 + .4byte .LASF250 + .byte 0x5c + .uleb128 0x25 + .4byte .LASF251 + .byte 0x5d + .uleb128 0x25 + .4byte .LASF252 + .byte 0x5e + .uleb128 0x25 + .4byte .LASF253 + .byte 0x5f + .uleb128 0x25 + .4byte .LASF254 + .byte 0x60 + .uleb128 0x25 + .4byte .LASF255 + .byte 0x61 + .uleb128 0x26 + .4byte .LASF256 + .sleb128 -1 + .byte 0 + .uleb128 0x27 + .byte 0x4 + .4byte 0x7f + .byte 0x23 + .byte 0xf6 + .4byte 0xc22 + .uleb128 0x25 + .4byte .LASF257 + .byte 0x5 + .byte 0 + .uleb128 0xd + .4byte .LASF258 + .byte 0x40 + .byte 0x14 + .byte 0xc + .4byte 0xc9b + .uleb128 0xe + .4byte .LASF259 + .byte 0x14 + .byte 0x22 + .4byte 0x3b + .byte 0 + .uleb128 0xf + .string "tbu" + .byte 0x14 + .byte 0x23 + .4byte 0x7f + .byte 0x8 + .uleb128 0xf + .string "tbl" + .byte 0x14 + .byte 0x24 + .4byte 0x7f + .byte 0xc + .uleb128 0xe + .4byte .LASF260 + .byte 0x14 + .byte 0x25 + .4byte 0x3b + .byte 0x10 + .uleb128 0xe + .4byte .LASF261 + .byte 0x14 + .byte 0x26 + .4byte 0x8d + .byte 0x18 + .uleb128 0xe + .4byte .LASF262 + .byte 0x14 + .byte 0x29 + .4byte 0x3b + .byte 0x20 + .uleb128 0xe + .4byte .LASF263 + .byte 0x14 + .byte 0x2a + .4byte 0x3b + .byte 0x28 + .uleb128 0xe + .4byte .LASF264 + .byte 0x14 + .byte 0x2c + .4byte 0x3b + .byte 0x30 + .uleb128 0xe + .4byte .LASF265 + .byte 0x14 + .byte 0x2d + .4byte 0x3b + .byte 0x38 + .byte 0 + .uleb128 0xd + .4byte .LASF266 + .byte 0x18 + .byte 0x15 + .byte 0x22 + .4byte 0xce3 + .uleb128 0xe + .4byte .LASF267 + .byte 0x15 + .byte 0x23 + .4byte 0xae + .byte 0 + .uleb128 0xe + .4byte .LASF268 + .byte 0x15 + .byte 0x24 + .4byte 0xae + .byte 0x4 + .uleb128 0xf + .string "id" + .byte 0x15 + .byte 0x25 + .4byte 0xae + .byte 0x8 + .uleb128 0xe + .4byte .LASF269 + .byte 0x15 + .byte 0x26 + .4byte 0xae + .byte 0xc + .uleb128 0xe + .4byte .LASF270 + .byte 0x15 + .byte 0x27 + .4byte 0x10b + .byte 0x10 + .byte 0 + .uleb128 0x19 + .4byte .LASF271 + .2byte 0x1c0 + .byte 0x15 + .byte 0x2a + .4byte 0xf0c + .uleb128 0xf + .string "bd" + .byte 0x15 + .byte 0x2b + .4byte 0x97d + .byte 0 + .uleb128 0xe + .4byte .LASF42 + .byte 0x15 + .byte 0x2c + .4byte 0x3b + .byte 0x8 + .uleb128 0xe + .4byte .LASF269 + .byte 0x15 + .byte 0x2d + .4byte 0x7f + .byte 0x10 + .uleb128 0xe + .4byte .LASF272 + .byte 0x15 + .byte 0x2e + .4byte 0x3b + .byte 0x18 + .uleb128 0xe + .4byte .LASF273 + .byte 0x15 + .byte 0x2f + .4byte 0x3b + .byte 0x20 + .uleb128 0xe + .4byte .LASF274 + .byte 0x15 + .byte 0x31 + .4byte 0x3b + .byte 0x28 + .uleb128 0xe + .4byte .LASF275 + .byte 0x15 + .byte 0x32 + .4byte 0x3b + .byte 0x30 + .uleb128 0xe + .4byte .LASF276 + .byte 0x15 + .byte 0x3e + .4byte 0x3b + .byte 0x38 + .uleb128 0xe + .4byte .LASF277 + .byte 0x15 + .byte 0x42 + .4byte 0x3b + .byte 0x40 + .uleb128 0xe + .4byte .LASF278 + .byte 0x15 + .byte 0x43 + .4byte 0x3b + .byte 0x48 + .uleb128 0xe + .4byte .LASF279 + .byte 0x15 + .byte 0x45 + .4byte 0x3b + .byte 0x50 + .uleb128 0xe + .4byte .LASF280 + .byte 0x15 + .byte 0x46 + .4byte 0x3b + .byte 0x58 + .uleb128 0xe + .4byte .LASF281 + .byte 0x15 + .byte 0x47 + .4byte 0x3b + .byte 0x60 + .uleb128 0xe + .4byte .LASF282 + .byte 0x15 + .byte 0x48 + .4byte 0xcf + .byte 0x68 + .uleb128 0xe + .4byte .LASF283 + .byte 0x15 + .byte 0x49 + .4byte 0x3b + .byte 0x70 + .uleb128 0xe + .4byte .LASF284 + .byte 0x15 + .byte 0x4a + .4byte 0x3b + .byte 0x78 + .uleb128 0xe + .4byte .LASF285 + .byte 0x15 + .byte 0x4b + .4byte 0x3b + .byte 0x80 + .uleb128 0xe + .4byte .LASF286 + .byte 0x15 + .byte 0x4c + .4byte 0x3b + .byte 0x88 + .uleb128 0xe + .4byte .LASF287 + .byte 0x15 + .byte 0x4d + .4byte 0xf0c + .byte 0x90 + .uleb128 0xe + .4byte .LASF288 + .byte 0x15 + .byte 0x50 + .4byte 0x25f + .byte 0x98 + .uleb128 0xe + .4byte .LASF289 + .byte 0x15 + .byte 0x51 + .4byte 0x25f + .byte 0xa0 + .uleb128 0xe + .4byte .LASF290 + .byte 0x15 + .byte 0x52 + .4byte 0x292 + .byte 0xa8 + .uleb128 0xe + .4byte .LASF291 + .byte 0x15 + .byte 0x57 + .4byte 0x265 + .byte 0xb8 + .uleb128 0xe + .4byte .LASF292 + .byte 0x15 + .byte 0x58 + .4byte 0x137 + .byte 0xc0 + .uleb128 0xe + .4byte .LASF293 + .byte 0x15 + .byte 0x59 + .4byte 0x3b + .byte 0xc8 + .uleb128 0xe + .4byte .LASF294 + .byte 0x15 + .byte 0x5b + .4byte 0xf84 + .byte 0xd0 + .uleb128 0xe + .4byte .LASF295 + .byte 0x15 + .byte 0x5c + .4byte 0xf84 + .byte 0xd8 + .uleb128 0xe + .4byte .LASF296 + .byte 0x15 + .byte 0x5e + .4byte 0x265 + .byte 0xe0 + .uleb128 0xe + .4byte .LASF297 + .byte 0x15 + .byte 0x5f + .4byte 0x265 + .byte 0xe8 + .uleb128 0xf + .string "jt" + .byte 0x15 + .byte 0x60 + .4byte 0xf8f + .byte 0xf0 + .uleb128 0xe + .4byte .LASF298 + .byte 0x15 + .byte 0x61 + .4byte 0xf95 + .byte 0xf8 + .uleb128 0x15 + .4byte .LASF299 + .byte 0x15 + .byte 0x6b + .4byte 0x7f + .2byte 0x118 + .uleb128 0x15 + .4byte .LASF300 + .byte 0x15 + .byte 0x6c + .4byte 0x7f + .2byte 0x11c + .uleb128 0x15 + .4byte .LASF301 + .byte 0x15 + .byte 0x6e + .4byte 0x3b + .2byte 0x120 + .uleb128 0x15 + .4byte .LASF302 + .byte 0x15 + .byte 0x6f + .4byte 0x3b + .2byte 0x128 + .uleb128 0x15 + .4byte .LASF303 + .byte 0x15 + .byte 0x70 + .4byte 0x3b + .2byte 0x130 + .uleb128 0x15 + .4byte .LASF304 + .byte 0x15 + .byte 0x79 + .4byte 0x25f + .2byte 0x138 + .uleb128 0x15 + .4byte .LASF127 + .byte 0x15 + .byte 0x7a + .4byte 0xc22 + .2byte 0x140 + .uleb128 0x15 + .4byte .LASF305 + .byte 0x15 + .byte 0x80 + .4byte 0x10b + .2byte 0x180 + .uleb128 0x15 + .4byte .LASF306 + .byte 0x15 + .byte 0x81 + .4byte 0x10b + .2byte 0x188 + .uleb128 0x15 + .4byte .LASF307 + .byte 0x15 + .byte 0x87 + .4byte 0xc4 + .2byte 0x190 + .uleb128 0x15 + .4byte .LASF308 + .byte 0x15 + .byte 0x8c + .4byte 0xc9b + .2byte 0x198 + .uleb128 0x15 + .4byte .LASF309 + .byte 0x15 + .byte 0x8d + .4byte 0x10b + .2byte 0x1b0 + .uleb128 0x15 + .4byte .LASF310 + .byte 0x15 + .byte 0x8e + .4byte 0x54 + .2byte 0x1b8 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0xce3 + .uleb128 0xd + .4byte .LASF311 + .byte 0x40 + .byte 0x16 + .byte 0x2c + .4byte 0xf7f + .uleb128 0xe + .4byte .LASF28 + .byte 0x16 + .byte 0x2d + .4byte 0xe1 + .byte 0 + .uleb128 0xe + .4byte .LASF126 + .byte 0x16 + .byte 0x2e + .4byte 0xe1 + .byte 0x8 + .uleb128 0xe + .4byte .LASF312 + .byte 0x16 + .byte 0x2f + .4byte 0x12b8 + .byte 0x10 + .uleb128 0xe + .4byte .LASF313 + .byte 0x16 + .byte 0x30 + .4byte 0xe1 + .byte 0x18 + .uleb128 0xe + .4byte .LASF314 + .byte 0x16 + .byte 0x32 + .4byte 0x1300 + .byte 0x20 + .uleb128 0xe + .4byte .LASF34 + .byte 0x16 + .byte 0x33 + .4byte 0xf84 + .byte 0x28 + .uleb128 0xe + .4byte .LASF315 + .byte 0x16 + .byte 0x34 + .4byte 0xf84 + .byte 0x30 + .uleb128 0xe + .4byte .LASF316 + .byte 0x16 + .byte 0x35 + .4byte 0xf84 + .byte 0x38 + .byte 0 + .uleb128 0x7 + .4byte 0xf12 + .uleb128 0x8 + .byte 0x8 + .4byte 0xf12 + .uleb128 0x18 + .4byte .LASF318 + .uleb128 0x8 + .byte 0x8 + .4byte 0xf8a + .uleb128 0xa + .4byte 0xe7 + .4byte 0xfa5 + .uleb128 0x11 + .4byte 0xda + .byte 0x1f + .byte 0 + .uleb128 0x2 + .4byte .LASF319 + .byte 0x15 + .byte 0x9b + .4byte 0xce3 + .uleb128 0x28 + .4byte 0xfa5 + .uleb128 0x4 + .4byte .LASF320 + .byte 0x2 + .byte 0xad + .4byte 0x10b + .uleb128 0xa + .4byte 0x94 + .4byte 0xfcb + .uleb128 0xb + .byte 0 + .uleb128 0x4 + .4byte .LASF321 + .byte 0x2 + .byte 0xaf + .4byte 0xfc0 + .uleb128 0x4 + .4byte .LASF322 + .byte 0x2 + .byte 0xb0 + .4byte 0xfc0 + .uleb128 0x4 + .4byte .LASF323 + .byte 0x2 + .byte 0xfe + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF324 + .byte 0x2 + .byte 0xff + .4byte 0x10b + .uleb128 0xc + .4byte .LASF325 + .byte 0x2 + .2byte 0x100 + .4byte 0x10b + .uleb128 0xd + .4byte .LASF326 + .byte 0x4 + .byte 0x17 + .byte 0x2e + .4byte 0x101c + .uleb128 0xe + .4byte .LASF327 + .byte 0x17 + .byte 0x2f + .4byte 0x12c + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x29 + .uleb128 0x12 + .4byte 0x54 + .4byte 0x1031 + .uleb128 0x13 + .4byte 0x25f + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1022 + .uleb128 0xa + .4byte 0x94 + .4byte 0x1047 + .uleb128 0x11 + .4byte 0xda + .byte 0x5 + .byte 0 + .uleb128 0xc + .4byte .LASF328 + .byte 0x17 + .2byte 0x1fd + .4byte 0x1003 + .uleb128 0xc + .4byte .LASF329 + .byte 0x17 + .2byte 0x1fe + .4byte 0x1003 + .uleb128 0xc + .4byte .LASF330 + .byte 0x17 + .2byte 0x200 + .4byte 0x1003 + .uleb128 0xc + .4byte .LASF331 + .byte 0x17 + .2byte 0x205 + .4byte 0xf95 + .uleb128 0xc + .4byte .LASF332 + .byte 0x17 + .2byte 0x206 + .4byte 0xf95 + .uleb128 0xa + .4byte 0xe7 + .4byte 0x1093 + .uleb128 0x11 + .4byte 0xda + .byte 0x3f + .byte 0 + .uleb128 0xc + .4byte .LASF333 + .byte 0x17 + .2byte 0x207 + .4byte 0x1083 + .uleb128 0xc + .4byte .LASF334 + .byte 0x17 + .2byte 0x209 + .4byte 0x1037 + .uleb128 0xc + .4byte .LASF335 + .byte 0x17 + .2byte 0x20a + .4byte 0x1037 + .uleb128 0xc + .4byte .LASF336 + .byte 0x17 + .2byte 0x20b + .4byte 0x1003 + .uleb128 0xc + .4byte .LASF337 + .byte 0x17 + .2byte 0x20c + .4byte 0x1003 + .uleb128 0xc + .4byte .LASF338 + .byte 0x17 + .2byte 0x20d + .4byte 0x101c + .uleb128 0xa + .4byte 0x101c + .4byte 0x10eb + .uleb128 0x11 + .4byte 0xda + .byte 0x3 + .byte 0 + .uleb128 0xc + .4byte .LASF339 + .byte 0x17 + .2byte 0x20e + .4byte 0x10db + .uleb128 0xc + .4byte .LASF340 + .byte 0x17 + .2byte 0x20f + .4byte 0x101c + .uleb128 0xc + .4byte .LASF341 + .byte 0x17 + .2byte 0x210 + .4byte 0x54 + .uleb128 0xa + .4byte 0x9e + .4byte 0x111f + .uleb128 0x11 + .4byte 0xda + .byte 0x5 + .byte 0 + .uleb128 0x7 + .4byte 0x110f + .uleb128 0xc + .4byte .LASF342 + .byte 0x17 + .2byte 0x211 + .4byte 0x111f + .uleb128 0xc + .4byte .LASF343 + .byte 0x17 + .2byte 0x212 + .4byte 0x111f + .uleb128 0xc + .4byte .LASF344 + .byte 0x17 + .2byte 0x216 + .4byte 0x100 + .uleb128 0xc + .4byte .LASF345 + .byte 0x17 + .2byte 0x217 + .4byte 0x100 + .uleb128 0xc + .4byte .LASF346 + .byte 0x17 + .2byte 0x219 + .4byte 0x54 + .uleb128 0xc + .4byte .LASF347 + .byte 0x17 + .2byte 0x220 + .4byte 0x99b + .uleb128 0xc + .4byte .LASF348 + .byte 0x17 + .2byte 0x222 + .4byte 0xae + .uleb128 0xc + .4byte .LASF349 + .byte 0x17 + .2byte 0x224 + .4byte 0xae + .uleb128 0xc + .4byte .LASF350 + .byte 0x17 + .2byte 0x230 + .4byte 0x1003 + .uleb128 0x29 + .4byte .LASF352 + .byte 0x4 + .4byte 0x7f + .byte 0x17 + .2byte 0x286 + .4byte 0x11ba + .uleb128 0x25 + .4byte .LASF353 + .byte 0 + .uleb128 0x25 + .4byte .LASF354 + .byte 0x1 + .uleb128 0x25 + .4byte .LASF355 + .byte 0x2 + .uleb128 0x25 + .4byte .LASF356 + .byte 0x3 + .byte 0 + .uleb128 0xc + .4byte .LASF357 + .byte 0x17 + .2byte 0x28c + .4byte 0x1190 + .uleb128 0x8 + .byte 0x8 + .4byte 0x94 + .uleb128 0x8 + .byte 0x8 + .4byte 0xa3 + .uleb128 0x8 + .byte 0x8 + .4byte 0xae + .uleb128 0xd + .4byte .LASF27 + .byte 0x78 + .byte 0x8 + .byte 0xf1 + .4byte 0x12b3 + .uleb128 0xe + .4byte .LASF28 + .byte 0x8 + .byte 0xf2 + .4byte 0xfa + .byte 0 + .uleb128 0xf + .string "id" + .byte 0x8 + .byte 0xf3 + .4byte 0x9ac + .byte 0x8 + .uleb128 0xe + .4byte .LASF358 + .byte 0x8 + .byte 0xf4 + .4byte 0x1416 + .byte 0x10 + .uleb128 0xe + .4byte .LASF359 + .byte 0x8 + .byte 0xf5 + .4byte 0x1031 + .byte 0x18 + .uleb128 0xe + .4byte .LASF360 + .byte 0x8 + .byte 0xf6 + .4byte 0x1031 + .byte 0x20 + .uleb128 0xe + .4byte .LASF361 + .byte 0x8 + .byte 0xf7 + .4byte 0x1031 + .byte 0x28 + .uleb128 0xe + .4byte .LASF362 + .byte 0x8 + .byte 0xf8 + .4byte 0x1031 + .byte 0x30 + .uleb128 0xe + .4byte .LASF363 + .byte 0x8 + .byte 0xf9 + .4byte 0x1031 + .byte 0x38 + .uleb128 0xe + .4byte .LASF364 + .byte 0x8 + .byte 0xfa + .4byte 0x1031 + .byte 0x40 + .uleb128 0xe + .4byte .LASF365 + .byte 0x8 + .byte 0xfb + .4byte 0x1031 + .byte 0x48 + .uleb128 0xe + .4byte .LASF366 + .byte 0x8 + .byte 0xfc + .4byte 0x1031 + .byte 0x50 + .uleb128 0xe + .4byte .LASF367 + .byte 0x8 + .byte 0xfd + .4byte 0x54 + .byte 0x58 + .uleb128 0xe + .4byte .LASF368 + .byte 0x8 + .byte 0xfe + .4byte 0x54 + .byte 0x5c + .uleb128 0xe + .4byte .LASF369 + .byte 0x8 + .byte 0xff + .4byte 0x54 + .byte 0x60 + .uleb128 0x1e + .4byte .LASF370 + .byte 0x8 + .2byte 0x100 + .4byte 0x54 + .byte 0x64 + .uleb128 0x20 + .string "ops" + .byte 0x8 + .2byte 0x101 + .4byte 0x265 + .byte 0x68 + .uleb128 0x1e + .4byte .LASF42 + .byte 0x8 + .2byte 0x102 + .4byte 0x121 + .byte 0x70 + .byte 0 + .uleb128 0x7 + .4byte 0x11d8 + .uleb128 0x2 + .4byte .LASF312 + .byte 0x16 + .byte 0xf + .4byte 0xae + .uleb128 0xd + .4byte .LASF371 + .byte 0x20 + .byte 0x16 + .byte 0x19 + .4byte 0x1300 + .uleb128 0xe + .4byte .LASF28 + .byte 0x16 + .byte 0x1a + .4byte 0xfa + .byte 0 + .uleb128 0xe + .4byte .LASF372 + .byte 0x16 + .byte 0x1b + .4byte 0x54 + .byte 0x8 + .uleb128 0xe + .4byte .LASF373 + .byte 0x16 + .byte 0x1c + .4byte 0x137 + .byte 0x10 + .uleb128 0xe + .4byte .LASF47 + .byte 0x16 + .byte 0x1d + .4byte 0x1300 + .byte 0x18 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x12c3 + .uleb128 0x2a + .string "gd" + .byte 0x16 + .byte 0x57 + .4byte 0x1310 + .uleb128 0x8 + .byte 0x8 + .4byte 0xfb0 + .uleb128 0x2b + .4byte .LASF461 + .byte 0x8 + .byte 0x19 + .byte 0x33 + .4byte 0x1338 + .uleb128 0x2c + .string "np" + .byte 0x19 + .byte 0x34 + .4byte 0x1338 + .uleb128 0x2d + .4byte .LASF374 + .byte 0x19 + .byte 0x35 + .4byte 0xf3 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0xf7f + .uleb128 0x2 + .4byte .LASF375 + .byte 0x19 + .byte 0x36 + .4byte 0x1316 + .uleb128 0xc + .4byte .LASF376 + .byte 0x1a + .2byte 0x3ba + .4byte 0x10b + .uleb128 0xc + .4byte .LASF377 + .byte 0x1a + .2byte 0x3bb + .4byte 0x10b + .uleb128 0xc + .4byte .LASF378 + .byte 0x1a + .2byte 0x3bc + .4byte 0x10b + .uleb128 0xd + .4byte .LASF379 + .byte 0x4 + .byte 0x1b + .byte 0xd + .4byte 0x1386 + .uleb128 0xf + .string "pid" + .byte 0x1b + .byte 0xe + .4byte 0x54 + .byte 0 + .byte 0 + .uleb128 0x4 + .4byte .LASF380 + .byte 0x1b + .byte 0x11 + .4byte 0x1391 + .uleb128 0x8 + .byte 0x8 + .4byte 0x136d + .uleb128 0x8 + .byte 0x8 + .4byte 0x12b3 + .uleb128 0xd + .4byte .LASF36 + .byte 0x38 + .byte 0x1c + .byte 0x23 + .4byte 0x13e6 + .uleb128 0xe + .4byte .LASF35 + .byte 0x1c + .byte 0x24 + .4byte 0x137 + .byte 0 + .uleb128 0xe + .4byte .LASF381 + .byte 0x1c + .byte 0x25 + .4byte 0x1500 + .byte 0x8 + .uleb128 0xe + .4byte .LASF382 + .byte 0x1c + .byte 0x26 + .4byte 0x292 + .byte 0x10 + .uleb128 0xe + .4byte .LASF41 + .byte 0x1c + .byte 0x27 + .4byte 0x292 + .byte 0x20 + .uleb128 0xe + .4byte .LASF383 + .byte 0x1c + .byte 0x29 + .4byte 0x2b7 + .byte 0x30 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x139d + .uleb128 0xd + .4byte .LASF384 + .byte 0x10 + .byte 0x8 + .byte 0xb8 + .4byte 0x1411 + .uleb128 0xe + .4byte .LASF385 + .byte 0x8 + .byte 0xb9 + .4byte 0xe1 + .byte 0 + .uleb128 0xe + .4byte .LASF386 + .byte 0x8 + .byte 0xba + .4byte 0x10b + .byte 0x8 + .byte 0 + .uleb128 0x7 + .4byte 0x13ec + .uleb128 0x8 + .byte 0x8 + .4byte 0x1411 + .uleb128 0xd + .4byte .LASF387 + .byte 0x80 + .byte 0x1c + .byte 0x57 + .4byte 0x1500 + .uleb128 0xe + .4byte .LASF28 + .byte 0x1c + .byte 0x58 + .4byte 0xe1 + .byte 0 + .uleb128 0xf + .string "id" + .byte 0x1c + .byte 0x59 + .4byte 0x9ac + .byte 0x8 + .uleb128 0xe + .4byte .LASF388 + .byte 0x1c + .byte 0x5a + .4byte 0x1031 + .byte 0x10 + .uleb128 0xe + .4byte .LASF389 + .byte 0x1c + .byte 0x5b + .4byte 0x1031 + .byte 0x18 + .uleb128 0xe + .4byte .LASF390 + .byte 0x1c + .byte 0x5c + .4byte 0x1031 + .byte 0x20 + .uleb128 0xe + .4byte .LASF391 + .byte 0x1c + .byte 0x5d + .4byte 0x1031 + .byte 0x28 + .uleb128 0xe + .4byte .LASF392 + .byte 0x1c + .byte 0x5e + .4byte 0x1031 + .byte 0x30 + .uleb128 0xe + .4byte .LASF364 + .byte 0x1c + .byte 0x5f + .4byte 0x1031 + .byte 0x38 + .uleb128 0xe + .4byte .LASF365 + .byte 0x1c + .byte 0x60 + .4byte 0x1031 + .byte 0x40 + .uleb128 0xe + .4byte .LASF393 + .byte 0x1c + .byte 0x61 + .4byte 0x1515 + .byte 0x48 + .uleb128 0xe + .4byte .LASF394 + .byte 0x1c + .byte 0x62 + .4byte 0x1515 + .byte 0x50 + .uleb128 0xe + .4byte .LASF367 + .byte 0x1c + .byte 0x63 + .4byte 0x54 + .byte 0x58 + .uleb128 0xe + .4byte .LASF395 + .byte 0x1c + .byte 0x64 + .4byte 0x54 + .byte 0x5c + .uleb128 0xe + .4byte .LASF396 + .byte 0x1c + .byte 0x65 + .4byte 0x54 + .byte 0x60 + .uleb128 0xe + .4byte .LASF369 + .byte 0x1c + .byte 0x66 + .4byte 0x54 + .byte 0x64 + .uleb128 0xe + .4byte .LASF370 + .byte 0x1c + .byte 0x67 + .4byte 0x54 + .byte 0x68 + .uleb128 0xf + .string "ops" + .byte 0x1c + .byte 0x68 + .4byte 0x265 + .byte 0x70 + .uleb128 0xe + .4byte .LASF42 + .byte 0x1c + .byte 0x69 + .4byte 0x121 + .byte 0x78 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x141c + .uleb128 0x12 + .4byte 0x54 + .4byte 0x1515 + .uleb128 0x13 + .4byte 0x13e6 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1506 + .uleb128 0x4 + .4byte .LASF397 + .byte 0x1d + .byte 0x49 + .4byte 0x7f + .uleb128 0x24 + .4byte .LASF398 + .byte 0x4 + .4byte 0x7f + .byte 0x1e + .byte 0x15 + .4byte 0x1555 + .uleb128 0x25 + .4byte .LASF399 + .byte 0x1 + .uleb128 0x25 + .4byte .LASF400 + .byte 0x2 + .uleb128 0x25 + .4byte .LASF401 + .byte 0x4 + .uleb128 0x25 + .4byte .LASF402 + .byte 0x8 + .uleb128 0x25 + .4byte .LASF403 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF404 + .byte 0x20 + .byte 0x1e + .byte 0x61 + .4byte 0x1592 + .uleb128 0xe + .4byte .LASF405 + .byte 0x1e + .byte 0x6b + .4byte 0x15b5 + .byte 0 + .uleb128 0xe + .4byte .LASF406 + .byte 0x1e + .byte 0x75 + .4byte 0x15d9 + .byte 0x8 + .uleb128 0xe + .4byte .LASF407 + .byte 0x1e + .byte 0x7f + .4byte 0x15f8 + .byte 0x10 + .uleb128 0xe + .4byte .LASF408 + .byte 0x1e + .byte 0x8c + .4byte 0x1626 + .byte 0x18 + .byte 0 + .uleb128 0x7 + .4byte 0x1555 + .uleb128 0x12 + .4byte 0x54 + .4byte 0x15b5 + .uleb128 0x13 + .4byte 0x25f + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x137 + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1597 + .uleb128 0x12 + .4byte 0x54 + .4byte 0x15d9 + .uleb128 0x13 + .4byte 0x25f + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x265 + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x15bb + .uleb128 0x12 + .4byte 0x54 + .4byte 0x15f8 + .uleb128 0x13 + .4byte 0x25f + .uleb128 0x13 + .4byte 0x3b + .uleb128 0x13 + .4byte 0x137 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x15df + .uleb128 0x12 + .4byte 0x54 + .4byte 0x1626 + .uleb128 0x13 + .4byte 0x25f + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x137 + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x137 + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x15fe + .uleb128 0xd + .4byte .LASF409 + .byte 0x20 + .byte 0x1f + .byte 0x5e + .4byte 0x1669 + .uleb128 0xe + .4byte .LASF60 + .byte 0x1f + .byte 0x5f + .4byte 0x137 + .byte 0 + .uleb128 0xe + .4byte .LASF410 + .byte 0x1f + .byte 0x60 + .4byte 0x3b + .byte 0x8 + .uleb128 0xe + .4byte .LASF411 + .byte 0x1f + .byte 0x61 + .4byte 0x3b + .byte 0x10 + .uleb128 0xe + .4byte .LASF412 + .byte 0x1f + .byte 0x62 + .4byte 0x3b + .byte 0x18 + .byte 0 + .uleb128 0xd + .4byte .LASF413 + .byte 0x20 + .byte 0x1 + .byte 0xf + .4byte 0x16a6 + .uleb128 0xe + .4byte .LASF405 + .byte 0x1 + .byte 0x10 + .4byte 0x15b5 + .byte 0 + .uleb128 0xe + .4byte .LASF406 + .byte 0x1 + .byte 0x11 + .4byte 0x15d9 + .byte 0x8 + .uleb128 0xe + .4byte .LASF414 + .byte 0x1 + .byte 0x12 + .4byte 0x16c5 + .byte 0x10 + .uleb128 0xe + .4byte .LASF415 + .byte 0x1 + .byte 0x15 + .4byte 0x16c5 + .byte 0x18 + .byte 0 + .uleb128 0x7 + .4byte 0x1669 + .uleb128 0x2e + .4byte 0x16c5 + .uleb128 0x13 + .4byte 0x11d2 + .uleb128 0x13 + .4byte 0x11d2 + .uleb128 0x13 + .4byte 0x3b + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x16ab + .uleb128 0x2f + .4byte .LASF416 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x1592 + .uleb128 0x9 + .byte 0x3 + .8byte rockchip_secure_otp_ops + .uleb128 0x2f + .4byte .LASF417 + .byte 0x1 + .2byte 0x2dc + .4byte 0x16a6 + .uleb128 0x9 + .byte 0x3 + .8byte rk3528_data + .uleb128 0xa + .4byte 0x1411 + .4byte 0x1707 + .uleb128 0x11 + .4byte 0xda + .byte 0x1 + .byte 0 + .uleb128 0x7 + .4byte 0x16f7 + .uleb128 0x2f + .4byte .LASF418 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x1707 + .uleb128 0x9 + .byte 0x3 + .8byte rockchip_otp_ids + .uleb128 0x30 + .4byte .LASF419 + .byte 0x1 + .2byte 0x2eb + .4byte 0x11d8 + .uleb128 0x9 + .byte 0x3 + .8byte _u_boot_list_2_driver_2_rockchip_secure_otp + .uleb128 0x31 + .4byte .LASF420 + .byte 0x1 + .2byte 0x2cd + .4byte 0x54 + .8byte .LFB277 + .8byte .LFE277-.LFB277 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1825 + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x2cd + .4byte 0x25f + .4byte .LLST14 + .uleb128 0x33 + .string "otp" + .byte 0x1 + .2byte 0x2cf + .4byte 0x1825 + .4byte .LLST15 + .uleb128 0x34 + .8byte .LVL20 + .4byte 0x4283 + .4byte 0x1792 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL23 + .4byte 0x428f + .4byte 0x17aa + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL24 + .4byte 0x429a + .4byte 0x17d4 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LC0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x1 + .byte 0x30 + .byte 0 + .uleb128 0x34 + .8byte .LVL25 + .4byte 0x429a + .4byte 0x17fe + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LC1 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x1 + .byte 0x30 + .byte 0 + .uleb128 0x36 + .8byte .LVL26 + .4byte 0x429a + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LC2 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x1 + .byte 0x30 + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x162c + .uleb128 0x31 + .4byte .LASF421 + .byte 0x1 + .2byte 0x2b6 + .4byte 0x54 + .8byte .LFB276 + .8byte .LFE276-.LFB276 + .uleb128 0x1 + .byte 0x9c + .4byte 0x18ac + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x2b6 + .4byte 0x25f + .4byte .LLST1 + .uleb128 0x37 + .4byte .LASF422 + .byte 0x1 + .2byte 0x2b7 + .4byte 0x3b + .uleb128 0x1 + .byte 0x51 + .uleb128 0x38 + .string "buf" + .byte 0x1 + .2byte 0x2b8 + .4byte 0x137 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x33 + .string "ret" + .byte 0x1 + .2byte 0x2ba + .4byte 0x54 + .4byte .LLST2 + .uleb128 0x39 + .4byte 0x18ac + .8byte .LBB23 + .8byte .LBE23-.LBB23 + .byte 0x1 + .2byte 0x2be + .uleb128 0x3a + .4byte 0x18bd + .4byte .LLST3 + .byte 0 + .byte 0 + .uleb128 0x3b + .4byte .LASF430 + .byte 0x1 + .2byte 0x2af + .4byte 0x54 + .byte 0x1 + .4byte 0x18ca + .uleb128 0x3c + .string "buf" + .byte 0x1 + .2byte 0x2af + .4byte 0x11d2 + .byte 0 + .uleb128 0x31 + .4byte .LASF423 + .byte 0x1 + .2byte 0x2a7 + .4byte 0x54 + .8byte .LFB274 + .8byte .LFE274-.LFB274 + .uleb128 0x1 + .byte 0x9c + .4byte 0x197b + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x2a7 + .4byte 0x25f + .4byte .LLST4 + .uleb128 0x3d + .4byte .LASF424 + .byte 0x1 + .2byte 0x2a7 + .4byte 0x54 + .4byte .LLST5 + .uleb128 0x32 + .string "buf" + .byte 0x1 + .2byte 0x2a8 + .4byte 0x265 + .4byte .LLST6 + .uleb128 0x3d + .4byte .LASF51 + .byte 0x1 + .2byte 0x2a8 + .4byte 0x54 + .4byte .LLST7 + .uleb128 0x3e + .4byte .LASF425 + .byte 0x1 + .2byte 0x2aa + .4byte 0x197b + .4byte .LLST8 + .uleb128 0x34 + .8byte .LVL8 + .4byte 0x42a5 + .4byte 0x1954 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x3f + .8byte .LVL12 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1669 + .uleb128 0x31 + .4byte .LASF426 + .byte 0x1 + .2byte 0x29f + .4byte 0x54 + .8byte .LFB273 + .8byte .LFE273-.LFB273 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1a32 + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x29f + .4byte 0x25f + .4byte .LLST9 + .uleb128 0x3d + .4byte .LASF424 + .byte 0x1 + .2byte 0x29f + .4byte 0x54 + .4byte .LLST10 + .uleb128 0x32 + .string "buf" + .byte 0x1 + .2byte 0x2a0 + .4byte 0x137 + .4byte .LLST11 + .uleb128 0x3d + .4byte .LASF51 + .byte 0x1 + .2byte 0x2a0 + .4byte 0x54 + .4byte .LLST12 + .uleb128 0x3e + .4byte .LASF425 + .byte 0x1 + .2byte 0x2a2 + .4byte 0x197b + .4byte .LLST13 + .uleb128 0x34 + .8byte .LVL14 + .4byte 0x42a5 + .4byte 0x1a0b + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x3f + .8byte .LVL18 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0 + .byte 0 + .uleb128 0x31 + .4byte .LASF427 + .byte 0x1 + .2byte 0x26c + .4byte 0x54 + .8byte .LFB272 + .8byte .LFE272-.LFB272 + .uleb128 0x1 + .byte 0x9c + .4byte 0x255e + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x26c + .4byte 0x25f + .4byte .LLST69 + .uleb128 0x3d + .4byte .LASF424 + .byte 0x1 + .2byte 0x26c + .4byte 0x54 + .4byte .LLST70 + .uleb128 0x32 + .string "buf" + .byte 0x1 + .2byte 0x26c + .4byte 0x265 + .4byte .LLST71 + .uleb128 0x3d + .4byte .LASF51 + .byte 0x1 + .2byte 0x26c + .4byte 0x54 + .4byte .LLST72 + .uleb128 0x33 + .string "otp" + .byte 0x1 + .2byte 0x26e + .4byte 0x1825 + .4byte .LLST73 + .uleb128 0x3e + .4byte .LASF386 + .byte 0x1 + .2byte 0x26f + .4byte 0x11cc + .4byte .LLST74 + .uleb128 0x3e + .4byte .LASF428 + .byte 0x1 + .2byte 0x270 + .4byte 0xfa + .4byte .LLST74 + .uleb128 0x3e + .4byte .LASF429 + .byte 0x1 + .2byte 0x271 + .4byte 0xfa + .4byte .LLST76 + .uleb128 0x33 + .string "i" + .byte 0x1 + .2byte 0x272 + .4byte 0x54 + .4byte .LLST77 + .uleb128 0x33 + .string "ret" + .byte 0x1 + .2byte 0x272 + .4byte 0x54 + .4byte .LLST78 + .uleb128 0x40 + .4byte 0x255e + .8byte .LBB244 + .4byte .Ldebug_ranges0+0x3f0 + .byte 0x1 + .2byte 0x294 + .4byte 0x2430 + .uleb128 0x3a + .4byte 0x2593 + .4byte .LLST79 + .uleb128 0x3a + .4byte 0x2587 + .4byte .LLST80 + .uleb128 0x3a + .4byte 0x257b + .4byte .LLST81 + .uleb128 0x3a + .4byte 0x256f + .4byte .LLST82 + .uleb128 0x41 + .4byte .Ldebug_ranges0+0x3f0 + .uleb128 0x42 + .4byte 0x259f + .4byte .LLST83 + .uleb128 0x42 + .4byte 0x25ab + .4byte .LLST84 + .uleb128 0x43 + .4byte 0x25c4 + .8byte .L88 + .uleb128 0x44 + .4byte 0x25b7 + .uleb128 0x45 + .8byte .LBB246 + .8byte .LBE246-.LBB246 + .4byte 0x1b76 + .uleb128 0x42 + .4byte 0x25d1 + .4byte .LLST85 + .byte 0 + .uleb128 0x45 + .8byte .LBB247 + .8byte .LBE247-.LBB247 + .4byte 0x1b95 + .uleb128 0x42 + .4byte 0x25e3 + .4byte .LLST86 + .byte 0 + .uleb128 0x45 + .8byte .LBB248 + .8byte .LBE248-.LBB248 + .4byte 0x1bb4 + .uleb128 0x42 + .4byte 0x25f5 + .4byte .LLST87 + .byte 0 + .uleb128 0x45 + .8byte .LBB249 + .8byte .LBE249-.LBB249 + .4byte 0x1bd3 + .uleb128 0x42 + .4byte 0x2607 + .4byte .LLST88 + .byte 0 + .uleb128 0x45 + .8byte .LBB250 + .8byte .LBE250-.LBB250 + .4byte 0x1bf2 + .uleb128 0x42 + .4byte 0x2619 + .4byte .LLST89 + .byte 0 + .uleb128 0x45 + .8byte .LBB251 + .8byte .LBE251-.LBB251 + .4byte 0x1c11 + .uleb128 0x42 + .4byte 0x262b + .4byte .LLST90 + .byte 0 + .uleb128 0x45 + .8byte .LBB252 + .8byte .LBE252-.LBB252 + .4byte 0x1c30 + .uleb128 0x42 + .4byte 0x263d + .4byte .LLST91 + .byte 0 + .uleb128 0x45 + .8byte .LBB253 + .8byte .LBE253-.LBB253 + .4byte 0x1c4f + .uleb128 0x42 + .4byte 0x264f + .4byte .LLST92 + .byte 0 + .uleb128 0x45 + .8byte .LBB254 + .8byte .LBE254-.LBB254 + .4byte 0x1c6e + .uleb128 0x42 + .4byte 0x2661 + .4byte .LLST93 + .byte 0 + .uleb128 0x45 + .8byte .LBB255 + .8byte .LBE255-.LBB255 + .4byte 0x1c8d + .uleb128 0x42 + .4byte 0x2673 + .4byte .LLST94 + .byte 0 + .uleb128 0x45 + .8byte .LBB256 + .8byte .LBE256-.LBB256 + .4byte 0x1cac + .uleb128 0x42 + .4byte 0x2685 + .4byte .LLST95 + .byte 0 + .uleb128 0x45 + .8byte .LBB257 + .8byte .LBE257-.LBB257 + .4byte 0x1ccb + .uleb128 0x42 + .4byte 0x2697 + .4byte .LLST96 + .byte 0 + .uleb128 0x45 + .8byte .LBB258 + .8byte .LBE258-.LBB258 + .4byte 0x1cea + .uleb128 0x42 + .4byte 0x26a9 + .4byte .LLST97 + .byte 0 + .uleb128 0x45 + .8byte .LBB259 + .8byte .LBE259-.LBB259 + .4byte 0x1d09 + .uleb128 0x42 + .4byte 0x26bb + .4byte .LLST98 + .byte 0 + .uleb128 0x45 + .8byte .LBB260 + .8byte .LBE260-.LBB260 + .4byte 0x1d28 + .uleb128 0x42 + .4byte 0x26cd + .4byte .LLST99 + .byte 0 + .uleb128 0x45 + .8byte .LBB261 + .8byte .LBE261-.LBB261 + .4byte 0x1d47 + .uleb128 0x42 + .4byte 0x26df + .4byte .LLST100 + .byte 0 + .uleb128 0x45 + .8byte .LBB262 + .8byte .LBE262-.LBB262 + .4byte 0x1d66 + .uleb128 0x42 + .4byte 0x26f1 + .4byte .LLST101 + .byte 0 + .uleb128 0x45 + .8byte .LBB263 + .8byte .LBE263-.LBB263 + .4byte 0x1d85 + .uleb128 0x42 + .4byte 0x2703 + .4byte .LLST102 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x450 + .4byte 0x1d98 + .uleb128 0x42 + .4byte 0x2715 + .4byte .LLST103 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x480 + .4byte 0x1dab + .uleb128 0x42 + .4byte 0x2727 + .4byte .LLST104 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x4b0 + .4byte 0x1dbe + .uleb128 0x42 + .4byte 0x2739 + .4byte .LLST105 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x4e0 + .4byte 0x1dd1 + .uleb128 0x42 + .4byte 0x2a29 + .4byte .LLST106 + .byte 0 + .uleb128 0x45 + .8byte .LBB272 + .8byte .LBE272-.LBB272 + .4byte 0x1df0 + .uleb128 0x42 + .4byte 0x274b + .4byte .LLST107 + .byte 0 + .uleb128 0x45 + .8byte .LBB273 + .8byte .LBE273-.LBB273 + .4byte 0x1e0f + .uleb128 0x42 + .4byte 0x275d + .4byte .LLST108 + .byte 0 + .uleb128 0x45 + .8byte .LBB274 + .8byte .LBE274-.LBB274 + .4byte 0x1e2e + .uleb128 0x42 + .4byte 0x276f + .4byte .LLST109 + .byte 0 + .uleb128 0x45 + .8byte .LBB275 + .8byte .LBE275-.LBB275 + .4byte 0x1e4d + .uleb128 0x42 + .4byte 0x2781 + .4byte .LLST110 + .byte 0 + .uleb128 0x45 + .8byte .LBB276 + .8byte .LBE276-.LBB276 + .4byte 0x1e6c + .uleb128 0x42 + .4byte 0x2793 + .4byte .LLST111 + .byte 0 + .uleb128 0x45 + .8byte .LBB277 + .8byte .LBE277-.LBB277 + .4byte 0x1e8b + .uleb128 0x42 + .4byte 0x27a5 + .4byte .LLST112 + .byte 0 + .uleb128 0x45 + .8byte .LBB278 + .8byte .LBE278-.LBB278 + .4byte 0x1eaa + .uleb128 0x42 + .4byte 0x27b7 + .4byte .LLST113 + .byte 0 + .uleb128 0x45 + .8byte .LBB279 + .8byte .LBE279-.LBB279 + .4byte 0x1ec9 + .uleb128 0x42 + .4byte 0x27c9 + .4byte .LLST114 + .byte 0 + .uleb128 0x45 + .8byte .LBB280 + .8byte .LBE280-.LBB280 + .4byte 0x1ee8 + .uleb128 0x42 + .4byte 0x27db + .4byte .LLST115 + .byte 0 + .uleb128 0x45 + .8byte .LBB281 + .8byte .LBE281-.LBB281 + .4byte 0x1f07 + .uleb128 0x42 + .4byte 0x27ed + .4byte .LLST116 + .byte 0 + .uleb128 0x45 + .8byte .LBB282 + .8byte .LBE282-.LBB282 + .4byte 0x1f26 + .uleb128 0x42 + .4byte 0x27ff + .4byte .LLST117 + .byte 0 + .uleb128 0x45 + .8byte .LBB283 + .8byte .LBE283-.LBB283 + .4byte 0x1f45 + .uleb128 0x42 + .4byte 0x2811 + .4byte .LLST118 + .byte 0 + .uleb128 0x45 + .8byte .LBB284 + .8byte .LBE284-.LBB284 + .4byte 0x1f64 + .uleb128 0x42 + .4byte 0x2823 + .4byte .LLST119 + .byte 0 + .uleb128 0x45 + .8byte .LBB285 + .8byte .LBE285-.LBB285 + .4byte 0x1f83 + .uleb128 0x42 + .4byte 0x2835 + .4byte .LLST120 + .byte 0 + .uleb128 0x45 + .8byte .LBB286 + .8byte .LBE286-.LBB286 + .4byte 0x1fa2 + .uleb128 0x42 + .4byte 0x2847 + .4byte .LLST121 + .byte 0 + .uleb128 0x45 + .8byte .LBB287 + .8byte .LBE287-.LBB287 + .4byte 0x1fc1 + .uleb128 0x42 + .4byte 0x2859 + .4byte .LLST122 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x510 + .4byte 0x1fd4 + .uleb128 0x42 + .4byte 0x286b + .4byte .LLST123 + .byte 0 + .uleb128 0x45 + .8byte .LBB290 + .8byte .LBE290-.LBB290 + .4byte 0x1ff3 + .uleb128 0x42 + .4byte 0x287d + .4byte .LLST124 + .byte 0 + .uleb128 0x45 + .8byte .LBB291 + .8byte .LBE291-.LBB291 + .4byte 0x2012 + .uleb128 0x42 + .4byte 0x288f + .4byte .LLST125 + .byte 0 + .uleb128 0x45 + .8byte .LBB292 + .8byte .LBE292-.LBB292 + .4byte 0x2031 + .uleb128 0x42 + .4byte 0x28a1 + .4byte .LLST126 + .byte 0 + .uleb128 0x45 + .8byte .LBB293 + .8byte .LBE293-.LBB293 + .4byte 0x2050 + .uleb128 0x42 + .4byte 0x28b3 + .4byte .LLST127 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x540 + .4byte 0x2063 + .uleb128 0x42 + .4byte 0x28c5 + .4byte .LLST128 + .byte 0 + .uleb128 0x45 + .8byte .LBB296 + .8byte .LBE296-.LBB296 + .4byte 0x2082 + .uleb128 0x42 + .4byte 0x28d7 + .4byte .LLST129 + .byte 0 + .uleb128 0x45 + .8byte .LBB297 + .8byte .LBE297-.LBB297 + .4byte 0x20a1 + .uleb128 0x42 + .4byte 0x28e9 + .4byte .LLST130 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x570 + .4byte 0x20b4 + .uleb128 0x42 + .4byte 0x28fb + .4byte .LLST131 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x5a0 + .4byte 0x20c7 + .uleb128 0x42 + .4byte 0x290d + .4byte .LLST132 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x5d0 + .4byte 0x20da + .uleb128 0x42 + .4byte 0x291f + .4byte .LLST133 + .byte 0 + .uleb128 0x45 + .8byte .LBB304 + .8byte .LBE304-.LBB304 + .4byte 0x20f9 + .uleb128 0x42 + .4byte 0x2931 + .4byte .LLST134 + .byte 0 + .uleb128 0x45 + .8byte .LBB305 + .8byte .LBE305-.LBB305 + .4byte 0x2118 + .uleb128 0x42 + .4byte 0x2943 + .4byte .LLST135 + .byte 0 + .uleb128 0x45 + .8byte .LBB306 + .8byte .LBE306-.LBB306 + .4byte 0x2137 + .uleb128 0x42 + .4byte 0x2955 + .4byte .LLST136 + .byte 0 + .uleb128 0x45 + .8byte .LBB307 + .8byte .LBE307-.LBB307 + .4byte 0x2156 + .uleb128 0x42 + .4byte 0x2967 + .4byte .LLST137 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x600 + .4byte 0x2169 + .uleb128 0x42 + .4byte 0x2979 + .4byte .LLST138 + .byte 0 + .uleb128 0x45 + .8byte .LBB310 + .8byte .LBE310-.LBB310 + .4byte 0x2188 + .uleb128 0x42 + .4byte 0x298b + .4byte .LLST139 + .byte 0 + .uleb128 0x45 + .8byte .LBB311 + .8byte .LBE311-.LBB311 + .4byte 0x21a7 + .uleb128 0x42 + .4byte 0x299d + .4byte .LLST140 + .byte 0 + .uleb128 0x45 + .8byte .LBB312 + .8byte .LBE312-.LBB312 + .4byte 0x21c6 + .uleb128 0x42 + .4byte 0x29af + .4byte .LLST141 + .byte 0 + .uleb128 0x45 + .8byte .LBB313 + .8byte .LBE313-.LBB313 + .4byte 0x21e5 + .uleb128 0x42 + .4byte 0x29c1 + .4byte .LLST142 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x630 + .4byte 0x21f8 + .uleb128 0x42 + .4byte 0x29d3 + .4byte .LLST143 + .byte 0 + .uleb128 0x45 + .8byte .LBB316 + .8byte .LBE316-.LBB316 + .4byte 0x2217 + .uleb128 0x42 + .4byte 0x29e5 + .4byte .LLST144 + .byte 0 + .uleb128 0x45 + .8byte .LBB317 + .8byte .LBE317-.LBB317 + .4byte 0x2236 + .uleb128 0x42 + .4byte 0x29f7 + .4byte .LLST145 + .byte 0 + .uleb128 0x45 + .8byte .LBB318 + .8byte .LBE318-.LBB318 + .4byte 0x2255 + .uleb128 0x42 + .4byte 0x2a09 + .4byte .LLST146 + .byte 0 + .uleb128 0x45 + .8byte .LBB319 + .8byte .LBE319-.LBB319 + .4byte 0x2274 + .uleb128 0x42 + .4byte 0x2a1b + .4byte .LLST147 + .byte 0 + .uleb128 0x34 + .8byte .LVL263 + .4byte 0x42a5 + .4byte 0x228c + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL266 + .4byte 0x42b1 + .4byte 0x22b4 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC4 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x5 + .byte 0x85 + .sleb128 0 + .byte 0x9 + .byte 0xfe + .byte 0x1a + .byte 0 + .uleb128 0x47 + .8byte .LVL289 + .4byte 0x22c8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL310 + .4byte 0x4018 + .4byte 0x22ed + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x49 + .8byte .LVL314 + .4byte 0x42b1 + .uleb128 0x47 + .8byte .LVL315 + .4byte 0x230e + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL336 + .4byte 0x4018 + .4byte 0x2334 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL345 + .4byte 0x4018 + .4byte 0x235a + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL355 + .4byte 0x4018 + .4byte 0x2380 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL364 + .4byte 0x4018 + .4byte 0x23a6 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL373 + .4byte 0x4018 + .4byte 0x23cc + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL378 + .4byte 0x3f43 + .4byte 0x23ec + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x48 + .4byte 0x3ce0 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL386 + .4byte 0x4018 + .4byte 0x2412 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x36 + .8byte .LVL391 + .4byte 0x3fad + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d2a + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x40 + .4byte 0x2a4c + .8byte .LBB326 + .4byte .Ldebug_ranges0+0x660 + .byte 0x1 + .2byte 0x28c + .4byte 0x24d1 + .uleb128 0x3a + .4byte 0x2a81 + .4byte .LLST148 + .uleb128 0x3a + .4byte 0x2a75 + .4byte .LLST149 + .uleb128 0x3a + .4byte 0x2a69 + .4byte .LLST150 + .uleb128 0x3a + .4byte 0x2a5d + .4byte .LLST151 + .uleb128 0x41 + .4byte .Ldebug_ranges0+0x660 + .uleb128 0x42 + .4byte 0x2a8d + .4byte .LLST152 + .uleb128 0x4a + .4byte 0x2a99 + .uleb128 0x2 + .byte 0x91 + .sleb128 -2 + .uleb128 0x42 + .4byte 0x2aa5 + .4byte .LLST153 + .uleb128 0x34 + .8byte .LVL274 + .4byte 0x39cf + .4byte 0x24b5 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x3 + .byte 0x8f + .sleb128 254 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x1 + .byte 0x32 + .byte 0 + .uleb128 0x36 + .8byte .LVL279 + .4byte 0x2ab2 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL247 + .4byte 0x4283 + .4byte 0x24e9 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL250 + .4byte 0x42bc + .4byte 0x2507 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x8 + .byte 0x85 + .sleb128 0 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0 + .uleb128 0x34 + .8byte .LVL268 + .4byte 0x39cf + .4byte 0x2531 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL271 + .4byte 0x42b1 + .4byte 0x2550 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC12 + .byte 0 + .uleb128 0x49 + .8byte .LVL282 + .4byte 0x42b1 + .byte 0 + .uleb128 0x3b + .4byte .LASF431 + .byte 0x1 + .2byte 0x1d6 + .4byte 0x54 + .byte 0x1 + .4byte 0x2a37 + .uleb128 0x3c + .string "dev" + .byte 0x1 + .2byte 0x1d6 + .4byte 0x25f + .uleb128 0x3c + .string "otp" + .byte 0x1 + .2byte 0x1d7 + .4byte 0x1825 + .uleb128 0x4b + .4byte .LASF424 + .byte 0x1 + .2byte 0x1d8 + .4byte 0x54 + .uleb128 0x4b + .4byte .LASF386 + .byte 0x1 + .2byte 0x1d8 + .4byte 0xa3 + .uleb128 0x4c + .string "ret" + .byte 0x1 + .2byte 0x1da + .4byte 0x54 + .uleb128 0x4d + .4byte .LASF425 + .byte 0x1 + .2byte 0x1db + .4byte 0x197b + .uleb128 0x4e + .4byte .LASF432 + .4byte 0x2a47 + .4byte .LASF431 + .uleb128 0x4f + .4byte .LASF438 + .byte 0x1 + .2byte 0x263 + .uleb128 0x50 + .4byte 0x25de + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1ef + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x25f0 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f0 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2602 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f1 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2614 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f2 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2626 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f3 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2638 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f4 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x264a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f5 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x265c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f6 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x266e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f7 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2680 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f8 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2692 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f9 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26a4 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fa + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26b6 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fb + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26c8 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fc + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26da + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fd + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26ec + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fe + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26fe + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1ff + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2710 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x200 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2722 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x201 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2734 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x202 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2746 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x203 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2758 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20a + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x276a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20b + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x277c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20c + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x278e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20d + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27a0 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20e + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27b2 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20f + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27c4 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x210 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27d6 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x211 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27e8 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x212 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27fa + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x213 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x280c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x214 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x281e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x215 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2830 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x216 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2842 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x217 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2854 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x218 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2866 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x219 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2878 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x21a + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x288a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x221 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x289c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x222 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28ae + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x223 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28c0 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x224 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28d2 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x225 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28e4 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x22c + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28f6 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x22d + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2908 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x22e + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x291a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x22f + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x292c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x230 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x293e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x237 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2950 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x238 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2962 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x239 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2974 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x23a + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2986 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x23b + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2998 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x242 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29aa + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x243 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29bc + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x244 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29ce + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x245 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29e0 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x246 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29f2 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x253 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2a04 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x254 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2a16 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x255 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2a28 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x256 + .4byte 0xae + .byte 0 + .uleb128 0x51 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x264 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0xa + .4byte 0xee + .4byte 0x2a47 + .uleb128 0x11 + .4byte 0xda + .byte 0x1f + .byte 0 + .uleb128 0x7 + .4byte 0x2a37 + .uleb128 0x3b + .4byte .LASF433 + .byte 0x1 + .2byte 0x1c0 + .4byte 0x54 + .byte 0x1 + .4byte 0x2ab2 + .uleb128 0x3c + .string "dev" + .byte 0x1 + .2byte 0x1c0 + .4byte 0x25f + .uleb128 0x3c + .string "otp" + .byte 0x1 + .2byte 0x1c1 + .4byte 0x1825 + .uleb128 0x4b + .4byte .LASF424 + .byte 0x1 + .2byte 0x1c2 + .4byte 0x54 + .uleb128 0x4b + .4byte .LASF386 + .byte 0x1 + .2byte 0x1c2 + .4byte 0x94 + .uleb128 0x4d + .4byte .LASF434 + .byte 0x1 + .2byte 0x1c4 + .4byte 0xa3 + .uleb128 0x4d + .4byte .LASF429 + .byte 0x1 + .2byte 0x1c4 + .4byte 0xa3 + .uleb128 0x4c + .string "ret" + .byte 0x1 + .2byte 0x1c5 + .4byte 0x54 + .byte 0 + .uleb128 0x52 + .4byte .LASF435 + .byte 0x1 + .byte 0xed + .4byte 0x54 + .8byte .LFB269 + .8byte .LFE269-.LFB269 + .uleb128 0x1 + .byte 0x9c + .4byte 0x39ba + .uleb128 0x53 + .string "dev" + .byte 0x1 + .byte 0xed + .4byte 0x25f + .4byte .LLST30 + .uleb128 0x53 + .string "otp" + .byte 0x1 + .byte 0xee + .4byte 0x1825 + .4byte .LLST31 + .uleb128 0x54 + .4byte .LASF424 + .byte 0x1 + .byte 0xef + .4byte 0x54 + .4byte .LLST32 + .uleb128 0x54 + .4byte .LASF386 + .byte 0x1 + .byte 0xef + .4byte 0xa3 + .4byte .LLST33 + .uleb128 0x55 + .string "ret" + .byte 0x1 + .byte 0xf1 + .4byte 0x54 + .4byte .LLST34 + .uleb128 0x56 + .4byte .LASF425 + .byte 0x1 + .byte 0xf2 + .4byte 0x197b + .4byte .LLST35 + .uleb128 0x57 + .4byte .LASF432 + .4byte 0x39ca + .uleb128 0x9 + .byte 0x3 + .8byte __func__.7671 + .uleb128 0x58 + .4byte .LASF438 + .byte 0x1 + .2byte 0x1b9 + .8byte .L39 + .uleb128 0x45 + .8byte .LBB40 + .8byte .LBE40-.LBB40 + .4byte 0x2b76 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x106 + .4byte 0xae + .4byte .LLST36 + .byte 0 + .uleb128 0x45 + .8byte .LBB41 + .8byte .LBE41-.LBB41 + .4byte 0x2b9c + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x107 + .4byte 0xae + .4byte .LLST37 + .byte 0 + .uleb128 0x45 + .8byte .LBB42 + .8byte .LBE42-.LBB42 + .4byte 0x2bc2 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x108 + .4byte 0xae + .4byte .LLST38 + .byte 0 + .uleb128 0x45 + .8byte .LBB43 + .8byte .LBE43-.LBB43 + .4byte 0x2be8 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x109 + .4byte 0xae + .4byte .LLST39 + .byte 0 + .uleb128 0x45 + .8byte .LBB44 + .8byte .LBE44-.LBB44 + .4byte 0x2c0e + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10a + .4byte 0xae + .4byte .LLST40 + .byte 0 + .uleb128 0x45 + .8byte .LBB45 + .8byte .LBE45-.LBB45 + .4byte 0x2c34 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10b + .4byte 0xae + .4byte .LLST41 + .byte 0 + .uleb128 0x45 + .8byte .LBB46 + .8byte .LBE46-.LBB46 + .4byte 0x2c5a + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10c + .4byte 0xae + .4byte .LLST42 + .byte 0 + .uleb128 0x45 + .8byte .LBB47 + .8byte .LBE47-.LBB47 + .4byte 0x2c80 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10d + .4byte 0xae + .4byte .LLST43 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0 + .4byte 0x2c9a + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10e + .4byte 0xae + .4byte .LLST44 + .byte 0 + .uleb128 0x45 + .8byte .LBB50 + .8byte .LBE50-.LBB50 + .4byte 0x2cbf + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x115 + .4byte 0xae + .sleb128 -65522 + .byte 0 + .uleb128 0x45 + .8byte .LBB51 + .8byte .LBE51-.LBB51 + .4byte 0x2ce2 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x116 + .4byte 0xae + .byte 0xf0 + .byte 0 + .uleb128 0x45 + .8byte .LBB52 + .8byte .LBE52-.LBB52 + .4byte 0x2d05 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x117 + .4byte 0xae + .byte 0x1 + .byte 0 + .uleb128 0x45 + .8byte .LBB53 + .8byte .LBE53-.LBB53 + .4byte 0x2d28 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x118 + .4byte 0xae + .byte 0x7a + .byte 0 + .uleb128 0x45 + .8byte .LBB54 + .8byte .LBE54-.LBB54 + .4byte 0x2d4b + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x119 + .4byte 0xae + .byte 0x25 + .byte 0 + .uleb128 0x45 + .8byte .LBB55 + .8byte .LBE55-.LBB55 + .4byte 0x2d6e + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11a + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB56 + .8byte .LBE56-.LBB56 + .4byte 0x2d91 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11b + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB57 + .8byte .LBE57-.LBB57 + .4byte 0x2db4 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11c + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB58 + .8byte .LBE58-.LBB58 + .4byte 0x2dd7 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11d + .4byte 0xae + .byte 0x1f + .byte 0 + .uleb128 0x45 + .8byte .LBB59 + .8byte .LBE59-.LBB59 + .4byte 0x2dfa + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11e + .4byte 0xae + .byte 0xb + .byte 0 + .uleb128 0x45 + .8byte .LBB60 + .8byte .LBE60-.LBB60 + .4byte 0x2e1d + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11f + .4byte 0xae + .byte 0x8 + .byte 0 + .uleb128 0x45 + .8byte .LBB61 + .8byte .LBE61-.LBB61 + .4byte 0x2e40 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x120 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB62 + .8byte .LBE62-.LBB62 + .4byte 0x2e63 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x121 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB63 + .8byte .LBE63-.LBB63 + .4byte 0x2e86 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x122 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x30 + .4byte 0x2e9e + .uleb128 0x5b + .string "__v" + .byte 0x1 + .2byte 0x123 + .4byte 0xae + .uleb128 0x1 + .byte 0x50 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x60 + .4byte 0x2eb8 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x124 + .4byte 0xae + .4byte .LLST45 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x90 + .4byte 0x2ed2 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x125 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB70 + .8byte .LBE70-.LBB70 + .4byte 0x2ef7 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x12c + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB71 + .8byte .LBE71-.LBB71 + .4byte 0x2f1a + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x12d + .4byte 0xae + .byte 0xfa + .byte 0 + .uleb128 0x45 + .8byte .LBB72 + .8byte .LBE72-.LBB72 + .4byte 0x2f3d + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x12e + .4byte 0xae + .byte 0x9 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0xc0 + .4byte 0x2f57 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x12f + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB75 + .8byte .LBE75-.LBB75 + .4byte 0x2f7d + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x136 + .4byte 0xae + .sleb128 -16762368 + .byte 0 + .uleb128 0x45 + .8byte .LBB76 + .8byte .LBE76-.LBB76 + .4byte 0x2fa2 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x137 + .4byte 0xae + .sleb128 -65522 + .byte 0 + .uleb128 0x45 + .8byte .LBB77 + .8byte .LBE77-.LBB77 + .4byte 0x2fc5 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x138 + .4byte 0xae + .byte 0xf0 + .byte 0 + .uleb128 0x45 + .8byte .LBB78 + .8byte .LBE78-.LBB78 + .4byte 0x2fe8 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x139 + .4byte 0xae + .byte 0x1 + .byte 0 + .uleb128 0x45 + .8byte .LBB79 + .8byte .LBE79-.LBB79 + .4byte 0x300b + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13a + .4byte 0xae + .byte 0x7a + .byte 0 + .uleb128 0x45 + .8byte .LBB80 + .8byte .LBE80-.LBB80 + .4byte 0x302e + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13b + .4byte 0xae + .byte 0x15 + .byte 0 + .uleb128 0x45 + .8byte .LBB81 + .8byte .LBE81-.LBB81 + .4byte 0x3051 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13c + .4byte 0xae + .byte 0xdc + .byte 0 + .uleb128 0x45 + .8byte .LBB82 + .8byte .LBE82-.LBB82 + .4byte 0x3074 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13d + .4byte 0xae + .byte 0x92 + .byte 0 + .uleb128 0x45 + .8byte .LBB83 + .8byte .LBE83-.LBB83 + .4byte 0x3097 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13e + .4byte 0xae + .byte 0x79 + .byte 0 + .uleb128 0x45 + .8byte .LBB84 + .8byte .LBE84-.LBB84 + .4byte 0x30ba + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13f + .4byte 0xae + .byte 0x81 + .byte 0 + .uleb128 0x45 + .8byte .LBB85 + .8byte .LBE85-.LBB85 + .4byte 0x30dd + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x140 + .4byte 0xae + .byte 0x7e + .byte 0 + .uleb128 0x45 + .8byte .LBB86 + .8byte .LBE86-.LBB86 + .4byte 0x3100 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x141 + .4byte 0xae + .byte 0x21 + .byte 0 + .uleb128 0x45 + .8byte .LBB87 + .8byte .LBE87-.LBB87 + .4byte 0x3123 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x142 + .4byte 0xae + .byte 0x11 + .byte 0 + .uleb128 0x45 + .8byte .LBB88 + .8byte .LBE88-.LBB88 + .4byte 0x3146 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x143 + .4byte 0xae + .byte 0x9d + .byte 0 + .uleb128 0x45 + .8byte .LBB89 + .8byte .LBE89-.LBB89 + .4byte 0x3169 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x144 + .4byte 0xae + .byte 0x2 + .byte 0 + .uleb128 0x45 + .8byte .LBB90 + .8byte .LBE90-.LBB90 + .4byte 0x318c + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x145 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB91 + .8byte .LBE91-.LBB91 + .4byte 0x31af + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x146 + .4byte 0xae + .byte 0x40 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0xf0 + .4byte 0x31c9 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x147 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB94 + .8byte .LBE94-.LBB94 + .4byte 0x31ee + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x14e + .4byte 0xae + .sleb128 -65534 + .byte 0 + .uleb128 0x45 + .8byte .LBB95 + .8byte .LBE95-.LBB95 + .4byte 0x3211 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x14f + .4byte 0xae + .byte 0xfc + .byte 0 + .uleb128 0x45 + .8byte .LBB96 + .8byte .LBE96-.LBB96 + .4byte 0x3234 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x150 + .4byte 0xae + .byte 0xa + .byte 0 + .uleb128 0x45 + .8byte .LBB97 + .8byte .LBE97-.LBB97 + .4byte 0x3257 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x151 + .4byte 0xae + .byte 0x70 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x120 + .4byte 0x3271 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x152 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB100 + .8byte .LBE100-.LBB100 + .4byte 0x3297 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x159 + .4byte 0xae + .sleb128 -16776704 + .byte 0 + .uleb128 0x45 + .8byte .LBB101 + .8byte .LBE101-.LBB101 + .4byte 0x32bc + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x15a + .4byte 0xae + .sleb128 -65534 + .byte 0 + .uleb128 0x45 + .8byte .LBB102 + .8byte .LBE102-.LBB102 + .4byte 0x32df + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x15b + .4byte 0xae + .byte 0xc0 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x150 + .4byte 0x32f9 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x15c + .4byte 0xae + .4byte .LLST46 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x180 + .4byte 0x3313 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x15d + .4byte 0xae + .4byte .LLST47 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x1b0 + .4byte 0x332d + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x15e + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB109 + .8byte .LBE109-.LBB109 + .4byte 0x3352 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x165 + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB110 + .8byte .LBE110-.LBB110 + .4byte 0x3375 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x166 + .4byte 0xae + .byte 0xe0 + .byte 0 + .uleb128 0x45 + .8byte .LBB111 + .8byte .LBE111-.LBB111 + .4byte 0x3398 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x167 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x1e0 + .4byte 0x33b2 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x168 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB114 + .8byte .LBE114-.LBB114 + .4byte 0x33d7 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x16f + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB115 + .8byte .LBE115-.LBB115 + .4byte 0x33fd + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x170 + .4byte 0xae + .sleb128 -16762368 + .byte 0 + .uleb128 0x45 + .8byte .LBB116 + .8byte .LBE116-.LBB116 + .4byte 0x3420 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x171 + .4byte 0xae + .byte 0xff + .byte 0 + .uleb128 0x45 + .8byte .LBB117 + .8byte .LBE117-.LBB117 + .4byte 0x3443 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x172 + .4byte 0xae + .byte 0xa + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x210 + .4byte 0x345d + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x173 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB120 + .8byte .LBE120-.LBB120 + .4byte 0x3482 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x17a + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB121 + .8byte .LBE121-.LBB121 + .4byte 0x34a5 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x17b + .4byte 0xae + .byte 0x1 + .byte 0 + .uleb128 0x45 + .8byte .LBB122 + .8byte .LBE122-.LBB122 + .4byte 0x34c8 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x17c + .4byte 0xae + .byte 0xbf + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x240 + .4byte 0x34e2 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x17d + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB125 + .8byte .LBE125-.LBB125 + .4byte 0x3507 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x18a + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB126 + .8byte .LBE126-.LBB126 + .4byte 0x352a + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x18b + .4byte 0xae + .byte 0x2 + .byte 0 + .uleb128 0x45 + .8byte .LBB127 + .8byte .LBE127-.LBB127 + .4byte 0x354d + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x18c + .4byte 0xae + .byte 0xbf + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x270 + .4byte 0x3567 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x18d + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB130 + .8byte .LBE130-.LBB130 + .4byte 0x358c + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x19a + .4byte 0xae + .sleb128 -65533 + .byte 0 + .uleb128 0x45 + .8byte .LBB131 + .8byte .LBE131-.LBB131 + .4byte 0x35b2 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x19b + .4byte 0xae + .sleb128 -16776704 + .byte 0 + .uleb128 0x45 + .8byte .LBB132 + .8byte .LBE132-.LBB132 + .4byte 0x35d7 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x19c + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB133 + .8byte .LBE133-.LBB133 + .4byte 0x35fa + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x19d + .4byte 0xae + .byte 0x2 + .byte 0 + .uleb128 0x45 + .8byte .LBB134 + .8byte .LBE134-.LBB134 + .4byte 0x361d + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x19e + .4byte 0xae + .byte 0x80 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x2a0 + .4byte 0x3637 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x19f + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB137 + .8byte .LBE137-.LBB137 + .4byte 0x365c + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x1a6 + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB138 + .8byte .LBE138-.LBB138 + .4byte 0x367f + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x1a7 + .4byte 0xae + .byte 0xa0 + .byte 0 + .uleb128 0x45 + .8byte .LBB139 + .8byte .LBE139-.LBB139 + .4byte 0x36a2 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x1a8 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x2d0 + .4byte 0x36bc + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x1a9 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB142 + .8byte .LBE142-.LBB142 + .4byte 0x36df + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x1b0 + .4byte 0xae + .byte 0xfa + .byte 0 + .uleb128 0x45 + .8byte .LBB143 + .8byte .LBE143-.LBB143 + .4byte 0x3702 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x1b1 + .4byte 0xae + .byte 0x9 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x300 + .4byte 0x371c + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x1b2 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x34 + .8byte .LVL67 + .4byte 0x42a5 + .4byte 0x3735 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0 + .uleb128 0x34 + .8byte .LVL69 + .4byte 0x42b1 + .4byte 0x375d + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC4 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x5 + .byte 0x88 + .sleb128 0 + .byte 0x9 + .byte 0xfe + .byte 0x1a + .byte 0 + .uleb128 0x47 + .8byte .LVL74 + .4byte 0x3771 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL83 + .4byte 0x4018 + .4byte 0x3796 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x49 + .8byte .LVL85 + .4byte 0x42b1 + .uleb128 0x47 + .8byte .LVL86 + .4byte 0x37b7 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL104 + .4byte 0x4018 + .4byte 0x37dc + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL110 + .4byte 0x4018 + .4byte 0x3801 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL130 + .4byte 0x4018 + .4byte 0x3827 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL137 + .4byte 0x4018 + .4byte 0x384d + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL146 + .4byte 0x4018 + .4byte 0x3873 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL152 + .4byte 0x4018 + .4byte 0x3899 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL160 + .4byte 0x4018 + .4byte 0x38bf + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL167 + .4byte 0x4018 + .4byte 0x38e5 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL169 + .4byte 0x3f43 + .4byte 0x3905 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x48 + .4byte 0x3ce0 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL176 + .4byte 0x4018 + .4byte 0x392b + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL178 + .4byte 0x3fad + .4byte 0x394b + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d2a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL187 + .4byte 0x4018 + .4byte 0x3971 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL193 + .4byte 0x4018 + .4byte 0x3997 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x36 + .8byte .LVL198 + .4byte 0x4018 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .byte 0 + .uleb128 0xa + .4byte 0xee + .4byte 0x39ca + .uleb128 0x11 + .4byte 0xda + .byte 0x25 + .byte 0 + .uleb128 0x7 + .4byte 0x39ba + .uleb128 0x52 + .4byte .LASF436 + .byte 0x1 + .byte 0xae + .4byte 0x54 + .8byte .LFB268 + .8byte .LFE268-.LFB268 + .uleb128 0x1 + .byte 0x9c + .4byte 0x3c05 + .uleb128 0x53 + .string "dev" + .byte 0x1 + .byte 0xae + .4byte 0x25f + .4byte .LLST55 + .uleb128 0x54 + .4byte .LASF424 + .byte 0x1 + .byte 0xae + .4byte 0x54 + .4byte .LLST56 + .uleb128 0x53 + .string "buf" + .byte 0x1 + .byte 0xaf + .4byte 0x137 + .4byte .LLST57 + .uleb128 0x54 + .4byte .LASF51 + .byte 0x1 + .byte 0xaf + .4byte 0x54 + .4byte .LLST58 + .uleb128 0x55 + .string "otp" + .byte 0x1 + .byte 0xb1 + .4byte 0x1825 + .4byte .LLST59 + .uleb128 0x56 + .4byte .LASF386 + .byte 0x1 + .byte 0xb2 + .4byte 0x197b + .4byte .LLST60 + .uleb128 0x56 + .4byte .LASF437 + .byte 0x1 + .byte 0xb3 + .4byte 0x11c6 + .4byte .LLST61 + .uleb128 0x56 + .4byte .LASF429 + .byte 0x1 + .byte 0xb4 + .4byte 0xa3 + .4byte .LLST62 + .uleb128 0x55 + .string "ret" + .byte 0x1 + .byte 0xb5 + .4byte 0x54 + .4byte .LLST63 + .uleb128 0x57 + .4byte .LASF432 + .4byte 0x3c15 + .uleb128 0x9 + .byte 0x3 + .8byte __func__.7636 + .uleb128 0x5d + .4byte .LASF439 + .byte 0x1 + .byte 0xe3 + .8byte .L60 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x330 + .4byte 0x3ab2 + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xc0 + .4byte 0xae + .4byte .LLST64 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x360 + .4byte 0x3acb + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xd0 + .4byte 0xae + .4byte .LLST65 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x390 + .4byte 0x3ae4 + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xd2 + .4byte 0xae + .4byte .LLST66 + .byte 0 + .uleb128 0x45 + .8byte .LBB176 + .8byte .LBE176-.LBB176 + .4byte 0x3b09 + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xda + .4byte 0xa3 + .4byte .LLST68 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x3c0 + .4byte 0x3b22 + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xe4 + .4byte 0xae + .4byte .LLST67 + .byte 0 + .uleb128 0x34 + .8byte .LVL213 + .4byte 0x4283 + .4byte 0x3b3a + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL216 + .4byte 0x42a5 + .4byte 0x3b52 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .byte 0 + .uleb128 0x47 + .8byte .LVL219 + .4byte 0x3b66 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL220 + .4byte 0x3c1a + .4byte 0x3b7e + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL222 + .4byte 0x42c8 + .4byte 0x3b96 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8 + .byte 0x32 + .byte 0 + .uleb128 0x49 + .8byte .LVL224 + .4byte 0x42b1 + .uleb128 0x34 + .8byte .LVL233 + .4byte 0x4018 + .4byte 0x3bc8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x34 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL236 + .4byte 0x42b1 + .4byte 0x3bf4 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC11 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LANCHOR3 + .byte 0 + .uleb128 0x5e + .8byte .LVL237 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .byte 0 + .uleb128 0xa + .4byte 0xee + .4byte 0x3c15 + .uleb128 0x11 + .4byte 0xda + .byte 0x16 + .byte 0 + .uleb128 0x7 + .4byte 0x3c05 + .uleb128 0x5f + .4byte .LASF440 + .byte 0x1 + .byte 0x98 + .4byte 0x54 + .byte 0x1 + .4byte 0x3cbb + .uleb128 0x60 + .string "otp" + .byte 0x1 + .byte 0x98 + .4byte 0x1825 + .uleb128 0x61 + .4byte .LASF268 + .byte 0x1 + .byte 0x99 + .4byte 0x144 + .uleb128 0x62 + .string "ret" + .byte 0x1 + .byte 0x9b + .4byte 0x54 + .uleb128 0x4e + .4byte .LASF432 + .4byte 0x3ccb + .4byte .LASF440 + .uleb128 0x50 + .4byte 0x3c69 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x9d + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x3c7a + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x9e + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x3c8b + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x9f + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x3c9c + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0xa1 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x3cad + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0xa3 + .4byte 0xae + .byte 0 + .uleb128 0x51 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0xa5 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0xa + .4byte 0xee + .4byte 0x3ccb + .uleb128 0x11 + .4byte 0xda + .byte 0x1e + .byte 0 + .uleb128 0x7 + .4byte 0x3cbb + .uleb128 0x5f + .4byte .LASF441 + .byte 0x1 + .byte 0x81 + .4byte 0x54 + .byte 0x1 + .4byte 0x3d1a + .uleb128 0x60 + .string "otp" + .byte 0x1 + .byte 0x81 + .4byte 0x1825 + .uleb128 0x63 + .4byte .LASF442 + .byte 0x1 + .byte 0x83 + .4byte 0x54 + .uleb128 0x63 + .4byte .LASF429 + .byte 0x1 + .byte 0x84 + .4byte 0x54 + .uleb128 0x62 + .string "ret" + .byte 0x1 + .byte 0x85 + .4byte 0x54 + .uleb128 0x51 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x88 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x5f + .4byte .LASF443 + .byte 0x1 + .byte 0x6a + .4byte 0x54 + .byte 0x1 + .4byte 0x3d64 + .uleb128 0x60 + .string "otp" + .byte 0x1 + .byte 0x6a + .4byte 0x1825 + .uleb128 0x63 + .4byte .LASF442 + .byte 0x1 + .byte 0x6c + .4byte 0x54 + .uleb128 0x63 + .4byte .LASF429 + .byte 0x1 + .byte 0x6d + .4byte 0x54 + .uleb128 0x62 + .string "ret" + .byte 0x1 + .byte 0x6e + .4byte 0x54 + .uleb128 0x51 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x71 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x5f + .4byte .LASF444 + .byte 0x1 + .byte 0x56 + .4byte 0x54 + .byte 0x1 + .4byte 0x3dc1 + .uleb128 0x60 + .string "otp" + .byte 0x1 + .byte 0x56 + .4byte 0x1825 + .uleb128 0x61 + .4byte .LASF445 + .byte 0x1 + .byte 0x57 + .4byte 0xae + .uleb128 0x63 + .4byte .LASF442 + .byte 0x1 + .byte 0x59 + .4byte 0x54 + .uleb128 0x4e + .4byte .LASF432 + .4byte 0x2a47 + .4byte .LASF444 + .uleb128 0x50 + .4byte 0x3db3 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x5b + .4byte 0xae + .byte 0 + .uleb128 0x51 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x65 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x64 + .4byte .LASF449 + .byte 0x1 + .byte 0x4e + .8byte .LFB263 + .8byte .LFE263-.LFB263 + .uleb128 0x1 + .byte 0x9c + .4byte 0x3e36 + .uleb128 0x65 + .4byte .LASF446 + .byte 0x1 + .byte 0x4e + .4byte 0x11d2 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x54 + .4byte .LASF447 + .byte 0x1 + .byte 0x4f + .4byte 0x11d2 + .4byte .LLST0 + .uleb128 0x65 + .4byte .LASF448 + .byte 0x1 + .byte 0x50 + .4byte 0x3b + .uleb128 0x1 + .byte 0x52 + .uleb128 0x65 + .4byte .LASF424 + .byte 0x1 + .byte 0x50 + .4byte 0x54 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x66 + .8byte .LBB22 + .8byte .LBE22-.LBB22 + .uleb128 0x67 + .string "__v" + .byte 0x1 + .byte 0x52 + .4byte 0xae + .4byte 0x1000000 + .byte 0 + .byte 0 + .uleb128 0x64 + .4byte .LASF450 + .byte 0x1 + .byte 0x42 + .8byte .LFB262 + .8byte .LFE262-.LFB262 + .uleb128 0x1 + .byte 0x9c + .4byte 0x3f29 + .uleb128 0x54 + .4byte .LASF446 + .byte 0x1 + .byte 0x42 + .4byte 0x11d2 + .4byte .LLST16 + .uleb128 0x54 + .4byte .LASF447 + .byte 0x1 + .byte 0x43 + .4byte 0x11d2 + .4byte .LLST17 + .uleb128 0x54 + .4byte .LASF448 + .byte 0x1 + .byte 0x44 + .4byte 0x3b + .4byte .LLST18 + .uleb128 0x54 + .4byte .LASF424 + .byte 0x1 + .byte 0x44 + .4byte 0x54 + .4byte .LLST19 + .uleb128 0x45 + .8byte .LBB25 + .8byte .LBE25-.LBB25 + .4byte 0x3eb4 + .uleb128 0x67 + .string "__v" + .byte 0x1 + .byte 0x47 + .4byte 0xae + .4byte 0x1000100 + .byte 0 + .uleb128 0x45 + .8byte .LBB26 + .8byte .LBE26-.LBB26 + .4byte 0x3ed9 + .uleb128 0x67 + .string "__v" + .byte 0x1 + .byte 0x48 + .4byte 0xae + .4byte 0x20002 + .byte 0 + .uleb128 0x45 + .8byte .LBB27 + .8byte .LBE27-.LBB27 + .4byte 0x3efe + .uleb128 0x67 + .string "__v" + .byte 0x1 + .byte 0x4a + .4byte 0xae + .4byte 0x20000 + .byte 0 + .uleb128 0x34 + .8byte .LVL32 + .4byte 0x42c8 + .4byte 0x3f15 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x32 + .byte 0 + .uleb128 0x68 + .8byte .LVL34 + .4byte 0x42c8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x31 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .LASF462 + .byte 0x1a + .2byte 0x36f + .byte 0x3 + .4byte 0x3f43 + .uleb128 0x3c + .string "ptr" + .byte 0x1a + .2byte 0x36f + .4byte 0x137 + .byte 0 + .uleb128 0x6a + .4byte 0x3cd0 + .8byte .LFB278 + .8byte .LFE278-.LFB278 + .uleb128 0x1 + .byte 0x9c + .4byte 0x3fad + .uleb128 0x6b + .4byte 0x3ce0 + .uleb128 0x42 + .4byte 0x3ceb + .4byte .LLST20 + .uleb128 0x42 + .4byte 0x3cf6 + .4byte .LLST21 + .uleb128 0x44 + .4byte 0x3d01 + .uleb128 0x45 + .8byte .LBB28 + .8byte .LBE28-.LBB28 + .4byte 0x3f99 + .uleb128 0x42 + .4byte 0x3d0d + .4byte .LLST22 + .byte 0 + .uleb128 0x36 + .8byte .LVL40 + .4byte 0x42c8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x31 + .byte 0 + .byte 0 + .uleb128 0x6a + .4byte 0x3d1a + .8byte .LFB279 + .8byte .LFE279-.LFB279 + .uleb128 0x1 + .byte 0x9c + .4byte 0x4018 + .uleb128 0x6b + .4byte 0x3d2a + .uleb128 0x42 + .4byte 0x3d35 + .4byte .LLST23 + .uleb128 0x42 + .4byte 0x3d40 + .4byte .LLST24 + .uleb128 0x6c + .4byte 0x3d4b + .sleb128 -1 + .uleb128 0x45 + .8byte .LBB29 + .8byte .LBE29-.LBB29 + .4byte 0x4004 + .uleb128 0x42 + .4byte 0x3d57 + .4byte .LLST25 + .byte 0 + .uleb128 0x36 + .8byte .LVL48 + .4byte 0x42c8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x31 + .byte 0 + .byte 0 + .uleb128 0x6a + .4byte 0x3d64 + .8byte .LFB280 + .8byte .LFE280-.LFB280 + .uleb128 0x1 + .byte 0x9c + .4byte 0x4105 + .uleb128 0x3a + .4byte 0x3d7f + .4byte .LLST26 + .uleb128 0x6b + .4byte 0x3d74 + .uleb128 0x42 + .4byte 0x3d8a + .4byte .LLST27 + .uleb128 0x44 + .4byte 0x3d95 + .uleb128 0x45 + .8byte .LBB36 + .8byte .LBE36-.LBB36 + .4byte 0x406e + .uleb128 0x42 + .4byte 0x3da7 + .4byte .LLST28 + .byte 0 + .uleb128 0x45 + .8byte .LBB37 + .8byte .LBE37-.LBB37 + .4byte 0x408d + .uleb128 0x42 + .4byte 0x3db4 + .4byte .LLST29 + .byte 0 + .uleb128 0x45 + .8byte .LBB38 + .8byte .LBE38-.LBB38 + .4byte 0x40f1 + .uleb128 0x6b + .4byte 0x3d7f + .uleb128 0x6b + .4byte 0x3d74 + .uleb128 0x66 + .8byte .LBB39 + .8byte .LBE39-.LBB39 + .uleb128 0x44 + .4byte 0x3d8a + .uleb128 0x44 + .4byte 0x3d95 + .uleb128 0x36 + .8byte .LVL63 + .4byte 0x42b1 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC3 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LANCHOR0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x36 + .8byte .LVL60 + .4byte 0x42c8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x31 + .byte 0 + .byte 0 + .uleb128 0x6a + .4byte 0x3c1a + .8byte .LFB267 + .8byte .LFE267-.LFB267 + .uleb128 0x1 + .byte 0x9c + .4byte 0x4283 + .uleb128 0x3a + .4byte 0x3c2a + .4byte .LLST48 + .uleb128 0x3a + .4byte 0x3c35 + .4byte .LLST49 + .uleb128 0x42 + .4byte 0x3c40 + .4byte .LLST50 + .uleb128 0x44 + .4byte 0x3c4b + .uleb128 0x45 + .8byte .LBB160 + .8byte .LBE160-.LBB160 + .4byte 0x415f + .uleb128 0x6c + .4byte 0x3c5d + .sleb128 -16776704 + .byte 0 + .uleb128 0x45 + .8byte .LBB161 + .8byte .LBE161-.LBB161 + .4byte 0x417d + .uleb128 0x6c + .4byte 0x3c6e + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB162 + .8byte .LBE162-.LBB162 + .4byte 0x4199 + .uleb128 0x6d + .4byte 0x3c7f + .byte 0xfa + .byte 0 + .uleb128 0x45 + .8byte .LBB163 + .8byte .LBE163-.LBB163 + .4byte 0x41b8 + .uleb128 0x42 + .4byte 0x3c90 + .4byte .LLST51 + .byte 0 + .uleb128 0x45 + .8byte .LBB164 + .8byte .LBE164-.LBB164 + .4byte 0x41d7 + .uleb128 0x42 + .4byte 0x3cae + .4byte .LLST52 + .byte 0 + .uleb128 0x45 + .8byte .LBB165 + .8byte .LBE165-.LBB165 + .4byte 0x4243 + .uleb128 0x3a + .4byte 0x3c2a + .4byte .LLST53 + .uleb128 0x3a + .4byte 0x3c35 + .4byte .LLST54 + .uleb128 0x66 + .8byte .LBB166 + .8byte .LBE166-.LBB166 + .uleb128 0x44 + .4byte 0x4132 + .uleb128 0x44 + .4byte 0x413b + .uleb128 0x36 + .8byte .LVL209 + .4byte 0x42b1 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LANCHOR2 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB167 + .8byte .LBE167-.LBB167 + .4byte 0x425f + .uleb128 0x6d + .4byte 0x3ca1 + .byte 0x9 + .byte 0 + .uleb128 0x36 + .8byte .LVL205 + .4byte 0x4018 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d74 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0 + .byte 0 + .uleb128 0x6e + .4byte .LASF451 + .4byte .LASF451 + .byte 0x8 + .2byte 0x115 + .uleb128 0x6f + .4byte .LASF452 + .4byte .LASF452 + .byte 0x20 + .byte 0x85 + .uleb128 0x6f + .4byte .LASF453 + .4byte .LASF453 + .byte 0x20 + .byte 0x38 + .uleb128 0x6e + .4byte .LASF454 + .4byte .LASF454 + .byte 0x8 + .2byte 0x16e + .uleb128 0x6f + .4byte .LASF455 + .4byte .LASF455 + .byte 0x21 + .byte 0x13 + .uleb128 0x6e + .4byte .LASF456 + .4byte .LASF456 + .byte 0x1a + .2byte 0x393 + .uleb128 0x6f + .4byte .LASF457 + .4byte .LASF457 + .byte 0x22 + .byte 0xb + .byte 0 + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 + .uleb128 0x11 + .byte 0x1 + .uleb128 0x25 + .uleb128 0xe + .uleb128 0x13 + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1b + .uleb128 0xe + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x10 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x2 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x4 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x5 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0 + .byte 0 + .uleb128 0x6 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x7 + .uleb128 0x26 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x8 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x9 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0xa + .uleb128 0x1 + .byte 0x1 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xb + .uleb128 0x21 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0xc + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0xd + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xe + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0xf + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x10 + .uleb128 0x26 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x11 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x12 + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x13 + .uleb128 0x5 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x14 + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x15 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x16 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x17 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x18 + .uleb128 0x13 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x19 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1a + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1b + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x1c + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1d + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1e + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x1f + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x20 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x21 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x22 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x23 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x24 + .uleb128 0x4 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x25 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x26 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x27 + .uleb128 0x4 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x28 + .uleb128 0x35 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x29 + .uleb128 0x4 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2a + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x2b + .uleb128 0x17 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2c + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2d + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2e + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2f + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x30 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x31 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x32 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x33 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x34 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x35 + .uleb128 0x410a + .byte 0 + .uleb128 0x2 + .uleb128 0x18 + .uleb128 0x2111 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x36 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x37 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x39 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x3a + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3b + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3c + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3d + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3e + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3f + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x2115 + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x40 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x52 + .uleb128 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x41 + .uleb128 0xb + .byte 0x1 + .uleb128 0x55 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x42 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x43 + .uleb128 0xa + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x44 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x45 + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x46 + .uleb128 0xb + .byte 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x47 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x48 + .uleb128 0x410a + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2111 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x49 + .uleb128 0x4109 + .byte 0 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4a + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x4b + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4d + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4e + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x34 + .uleb128 0x19 + .uleb128 0x1c + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x4f + .uleb128 0xa + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x50 + .uleb128 0xb + .byte 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x51 + .uleb128 0xb + .byte 0x1 + .byte 0 + .byte 0 + .uleb128 0x52 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x53 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x54 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x55 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x56 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x57 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x34 + .uleb128 0x19 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x58 + .uleb128 0xa + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x11 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x59 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x5a + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x5b + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x5c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0x6 + .byte 0 + .byte 0 + .uleb128 0x5d + .uleb128 0xa + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x11 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x5e + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x5f + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x60 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x61 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x62 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x63 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x64 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x65 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x66 + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .byte 0 + .byte 0 + .uleb128 0x67 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0x6 + .byte 0 + .byte 0 + .uleb128 0x68 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x2115 + .uleb128 0x19 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x69 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x6a + .uleb128 0x2e + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x6b + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x6c + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x6d + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x6e + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x6f + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LLST14: + .8byte .LVL19 + .8byte .LVL20-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL20-1 + .8byte .LVL27 + .2byte 0x1 + .byte 0x64 + .8byte .LVL27 + .8byte .LFE277 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST15: + .8byte .LVL21 + .8byte .LVL22 + .2byte 0x1 + .byte 0x50 + .8byte .LVL22 + .8byte .LVL27 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST1: + .8byte .LVL2 + .8byte .LVL3 + .2byte 0x1 + .byte 0x50 + .8byte .LVL3 + .8byte .LFE276 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST2: + .8byte .LVL2 + .8byte .LVL5 + .2byte 0x3 + .byte 0x9 + .byte 0xea + .byte 0x9f + .8byte .LVL6 + .8byte .LFE276 + .2byte 0x3 + .byte 0x9 + .byte 0xea + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST3: + .8byte .LVL4 + .8byte .LVL5 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST4: + .8byte .LVL7 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL8-1 + .8byte .LVL11 + .2byte 0x1 + .byte 0x63 + .8byte .LVL11 + .8byte .LVL12-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL12-1 + .8byte .LFE274 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST5: + .8byte .LVL7 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL8-1 + .8byte .LVL11 + .2byte 0x1 + .byte 0x64 + .8byte .LVL11 + .8byte .LVL12-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL12-1 + .8byte .LFE274 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST6: + .8byte .LVL7 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL8-1 + .8byte .LVL10 + .2byte 0x1 + .byte 0x65 + .8byte .LVL10 + .8byte .LVL12-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL12-1 + .8byte .LFE274 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST7: + .8byte .LVL7 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL8-1 + .8byte .LVL10 + .2byte 0x1 + .byte 0x66 + .8byte .LVL10 + .8byte .LVL12-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL12-1 + .8byte .LFE274 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST8: + .8byte .LVL8 + .8byte .LVL9 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST9: + .8byte .LVL13 + .8byte .LVL14-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL14-1 + .8byte .LVL17 + .2byte 0x1 + .byte 0x63 + .8byte .LVL17 + .8byte .LVL18-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL18-1 + .8byte .LFE273 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST10: + .8byte .LVL13 + .8byte .LVL14-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL14-1 + .8byte .LVL17 + .2byte 0x1 + .byte 0x64 + .8byte .LVL17 + .8byte .LVL18-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL18-1 + .8byte .LFE273 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST11: + .8byte .LVL13 + .8byte .LVL14-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL14-1 + .8byte .LVL16 + .2byte 0x1 + .byte 0x65 + .8byte .LVL16 + .8byte .LVL18-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL18-1 + .8byte .LFE273 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST12: + .8byte .LVL13 + .8byte .LVL14-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL14-1 + .8byte .LVL16 + .2byte 0x1 + .byte 0x66 + .8byte .LVL16 + .8byte .LVL18-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL18-1 + .8byte .LFE273 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST13: + .8byte .LVL14 + .8byte .LVL15 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST69: + .8byte .LVL246 + .8byte .LVL247-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL247-1 + .8byte .LVL254 + .2byte 0x1 + .byte 0x68 + .8byte .LVL254 + .8byte .LVL257 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST70: + .8byte .LVL246 + .8byte .LVL247-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL247-1 + .8byte .LVL253 + .2byte 0x1 + .byte 0x64 + .8byte .LVL253 + .8byte .LVL257 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST71: + .8byte .LVL246 + .8byte .LVL247-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL247-1 + .8byte .LVL256 + .2byte 0x3 + .byte 0x8f + .sleb128 224 + .8byte .LVL256 + .8byte .LVL257 + .2byte 0x3 + .byte 0x8f + .sleb128 80 + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x3 + .byte 0x8f + .sleb128 224 + .8byte 0 + .8byte 0 +.LLST72: + .8byte .LVL246 + .8byte .LVL247-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL247-1 + .8byte .LVL252 + .2byte 0x1 + .byte 0x65 + .8byte .LVL252 + .8byte .LVL257 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL257 + .8byte .LVL261 + .2byte 0x1 + .byte 0x65 + .8byte .LVL261 + .8byte .LVL267 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL267 + .8byte .LVL281 + .2byte 0x1 + .byte 0x65 + .8byte .LVL281 + .8byte .LVL283 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL283 + .8byte .LVL287 + .2byte 0x1 + .byte 0x65 + .8byte .LVL287 + .8byte .LVL396 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL396 + .8byte .LFE272 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST73: + .8byte .LVL248 + .8byte .LVL249 + .2byte 0x1 + .byte 0x50 + .8byte .LVL249 + .8byte .LVL255 + .2byte 0x1 + .byte 0x6c + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST74: + .8byte .LVL248 + .8byte .LVL256 + .2byte 0x3 + .byte 0x8f + .sleb128 224 + .8byte .LVL256 + .8byte .LVL257 + .2byte 0x3 + .byte 0x8f + .sleb128 80 + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x3 + .byte 0x8f + .sleb128 224 + .8byte 0 + .8byte 0 +.LLST76: + .8byte .LVL250 + .8byte .LVL251 + .2byte 0x1 + .byte 0x50 + .8byte .LVL257 + .8byte .LVL258 + .2byte 0x1 + .byte 0x50 + .8byte .LVL258 + .8byte .LVL260 + .2byte 0x1 + .byte 0x63 + .8byte .LVL267 + .8byte .LVL272 + .2byte 0x1 + .byte 0x63 + .8byte .LVL285 + .8byte .LVL286 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST77: + .8byte .LVL261 + .8byte .LVL267 + .2byte 0x1 + .byte 0x67 + .8byte .LVL269 + .8byte .LVL270 + .2byte 0x1 + .byte 0x50 + .8byte .LVL272 + .8byte .LVL278 + .2byte 0x1 + .byte 0x63 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x63 + .8byte .LVL286 + .8byte .LVL287 + .2byte 0x1 + .byte 0x63 + .8byte .LVL288 + .8byte .LVL394 + .2byte 0x1 + .byte 0x67 + .8byte .LVL394 + .8byte .LVL395 + .2byte 0x3 + .byte 0x87 + .sleb128 1 + .byte 0x9f + .8byte .LVL396 + .8byte .LFE272 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST78: + .8byte .LVL250 + .8byte .LVL251 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL257 + .8byte .LVL268 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL268 + .8byte .LVL269 + .2byte 0x1 + .byte 0x50 + .8byte .LVL272 + .8byte .LVL280 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL283 + .8byte .LVL315 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST79: + .8byte .LVL262 + .8byte .LVL267 + .2byte 0x1 + .byte 0x6a + .8byte .LVL288 + .8byte .LVL313 + .2byte 0x1 + .byte 0x6a + .8byte .LVL317 + .8byte .LVL352 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST80: + .8byte .LVL262 + .8byte .LVL264 + .2byte 0x1 + .byte 0x65 + .8byte .LVL264 + .8byte .LVL267 + .2byte 0x1 + .byte 0x69 + .8byte .LVL288 + .8byte .LVL315 + .2byte 0x1 + .byte 0x69 + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST81: + .8byte .LVL262 + .8byte .LVL267 + .2byte 0x1 + .byte 0x6c + .8byte .LVL288 + .8byte .LVL315 + .2byte 0x1 + .byte 0x6c + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST82: + .8byte .LVL262 + .8byte .LVL267 + .2byte 0x1 + .byte 0x68 + .8byte .LVL288 + .8byte .LVL315 + .2byte 0x1 + .byte 0x68 + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST83: + .8byte .LVL262 + .8byte .LVL267 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL288 + .8byte .LVL311 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL311 + .8byte .LVL312 + .2byte 0x1 + .byte 0x50 + .8byte .LVL312 + .8byte .LVL315 + .2byte 0x1 + .byte 0x6b + .8byte .LVL317 + .8byte .LVL318 + .2byte 0x1 + .byte 0x50 + .8byte .LVL318 + .8byte .LVL337 + .2byte 0x1 + .byte 0x6b + .8byte .LVL337 + .8byte .LVL338 + .2byte 0x1 + .byte 0x50 + .8byte .LVL338 + .8byte .LVL339 + .2byte 0x1 + .byte 0x6b + .8byte .LVL339 + .8byte .LVL340 + .2byte 0x1 + .byte 0x50 + .8byte .LVL340 + .8byte .LVL346 + .2byte 0x1 + .byte 0x6b + .8byte .LVL346 + .8byte .LVL347 + .2byte 0x1 + .byte 0x50 + .8byte .LVL347 + .8byte .LVL348 + .2byte 0x1 + .byte 0x6b + .8byte .LVL348 + .8byte .LVL349 + .2byte 0x1 + .byte 0x50 + .8byte .LVL349 + .8byte .LVL356 + .2byte 0x1 + .byte 0x6b + .8byte .LVL356 + .8byte .LVL357 + .2byte 0x1 + .byte 0x50 + .8byte .LVL357 + .8byte .LVL358 + .2byte 0x1 + .byte 0x6b + .8byte .LVL358 + .8byte .LVL359 + .2byte 0x1 + .byte 0x50 + .8byte .LVL359 + .8byte .LVL365 + .2byte 0x1 + .byte 0x6b + .8byte .LVL365 + .8byte .LVL366 + .2byte 0x1 + .byte 0x50 + .8byte .LVL366 + .8byte .LVL367 + .2byte 0x1 + .byte 0x6b + .8byte .LVL367 + .8byte .LVL368 + .2byte 0x1 + .byte 0x50 + .8byte .LVL368 + .8byte .LVL374 + .2byte 0x1 + .byte 0x6b + .8byte .LVL374 + .8byte .LVL375 + .2byte 0x1 + .byte 0x50 + .8byte .LVL375 + .8byte .LVL376 + .2byte 0x1 + .byte 0x6b + .8byte .LVL376 + .8byte .LVL377 + .2byte 0x1 + .byte 0x50 + .8byte .LVL377 + .8byte .LVL379 + .2byte 0x1 + .byte 0x6b + .8byte .LVL379 + .8byte .LVL380 + .2byte 0x1 + .byte 0x50 + .8byte .LVL380 + .8byte .LVL381 + .2byte 0x1 + .byte 0x6b + .8byte .LVL381 + .8byte .LVL382 + .2byte 0x1 + .byte 0x50 + .8byte .LVL382 + .8byte .LVL387 + .2byte 0x1 + .byte 0x6b + .8byte .LVL387 + .8byte .LVL388 + .2byte 0x1 + .byte 0x50 + .8byte .LVL388 + .8byte .LVL389 + .2byte 0x1 + .byte 0x6b + .8byte .LVL389 + .8byte .LVL390 + .2byte 0x1 + .byte 0x50 + .8byte .LVL390 + .8byte .LVL392 + .2byte 0x1 + .byte 0x6b + .8byte .LVL392 + .8byte .LVL393 + .2byte 0x1 + .byte 0x50 + .8byte .LVL393 + .8byte .LVL394 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST84: + .8byte .LVL264 + .8byte .LVL265 + .2byte 0x1 + .byte 0x50 + .8byte .LVL265 + .8byte .LVL267 + .2byte 0x3 + .byte 0x8f + .sleb128 232 + .8byte .LVL288 + .8byte .LVL315 + .2byte 0x3 + .byte 0x8f + .sleb128 232 + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8f + .sleb128 232 + .8byte 0 + .8byte 0 +.LLST85: + .8byte .LVL289 + .8byte .LVL316 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST86: + .8byte .LVL290 + .8byte .LVL316 + .2byte 0x6 + .byte 0xc + .4byte 0x40004 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x40004 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST87: + .8byte .LVL291 + .8byte .LVL316 + .2byte 0x5 + .byte 0x11 + .sleb128 -65536 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65536 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST88: + .8byte .LVL292 + .8byte .LVL316 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST89: + .8byte .LVL293 + .8byte .LVL316 + .2byte 0x5 + .byte 0x11 + .sleb128 -65522 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65522 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST90: + .8byte .LVL294 + .8byte .LVL316 + .2byte 0x3 + .byte 0x8 + .byte 0xf0 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xf0 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST91: + .8byte .LVL295 + .8byte .LVL316 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST92: + .8byte .LVL296 + .8byte .LVL316 + .2byte 0x3 + .byte 0x8 + .byte 0x7a + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x7a + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST93: + .8byte .LVL297 + .8byte .LVL316 + .2byte 0x3 + .byte 0x8 + .byte 0x25 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x25 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST94: + .8byte .LVL298 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST95: + .8byte .LVL299 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST96: + .8byte .LVL300 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST97: + .8byte .LVL301 + .8byte .LVL316 + .2byte 0x2 + .byte 0x4f + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x4f + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST98: + .8byte .LVL302 + .8byte .LVL316 + .2byte 0x2 + .byte 0x3b + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x3b + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST99: + .8byte .LVL303 + .8byte .LVL316 + .2byte 0x2 + .byte 0x38 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x38 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST100: + .8byte .LVL304 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST101: + .8byte .LVL305 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST102: + .8byte .LVL306 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST103: + .8byte .LVL307 + .8byte .LVL315 + .2byte 0x1 + .byte 0x69 + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST104: + .8byte .LVL308 + .8byte .LVL313 + .2byte 0x1 + .byte 0x65 + .8byte .LVL317 + .8byte .LVL332 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST105: + .8byte .LVL309 + .8byte .LVL316 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST106: + .8byte .LVL314 + .8byte .LVL316 + .2byte 0x5 + .byte 0x11 + .sleb128 -65533 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST107: + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x6 + .byte 0x11 + .sleb128 -16762368 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST108: + .8byte .LVL319 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xf0 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST109: + .8byte .LVL320 + .8byte .LVL394 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST110: + .8byte .LVL321 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x7a + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST111: + .8byte .LVL322 + .8byte .LVL394 + .2byte 0x2 + .byte 0x45 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST112: + .8byte .LVL323 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xdc + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST113: + .8byte .LVL324 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x92 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST114: + .8byte .LVL325 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x79 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST115: + .8byte .LVL326 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x81 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST116: + .8byte .LVL327 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x7e + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST117: + .8byte .LVL328 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x21 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST118: + .8byte .LVL329 + .8byte .LVL394 + .2byte 0x2 + .byte 0x41 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST119: + .8byte .LVL330 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x9d + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST120: + .8byte .LVL331 + .8byte .LVL394 + .2byte 0x2 + .byte 0x32 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST121: + .8byte .LVL333 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST122: + .8byte .LVL334 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST123: + .8byte .LVL335 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST124: + .8byte .LVL339 + .8byte .LVL394 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST125: + .8byte .LVL341 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65535 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST126: + .8byte .LVL342 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xfb + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST127: + .8byte .LVL343 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST128: + .8byte .LVL344 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST129: + .8byte .LVL348 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65534 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST130: + .8byte .LVL350 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xc0 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST131: + .8byte .LVL351 + .8byte .LVL354 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST132: + .8byte .LVL352 + .8byte .LVL394 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST133: + .8byte .LVL353 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST134: + .8byte .LVL358 + .8byte .LVL394 + .2byte 0x6 + .byte 0x11 + .sleb128 -16762368 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST135: + .8byte .LVL360 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65535 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST136: + .8byte .LVL361 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xff + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST137: + .8byte .LVL362 + .8byte .LVL394 + .2byte 0x2 + .byte 0x3a + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST138: + .8byte .LVL363 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST139: + .8byte .LVL367 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65534 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST140: + .8byte .LVL369 + .8byte .LVL394 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST141: + .8byte .LVL370 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xbf + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST142: + .8byte .LVL371 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST143: + .8byte .LVL372 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST144: + .8byte .LVL381 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65535 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST145: + .8byte .LVL383 + .8byte .LVL394 + .2byte 0x2 + .byte 0x32 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST146: + .8byte .LVL384 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xbf + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST147: + .8byte .LVL385 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST148: + .8byte .LVL273 + .8byte .LVL276 + .2byte 0x1 + .byte 0x67 + .8byte .LVL283 + .8byte .LVL284 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST149: + .8byte .LVL273 + .8byte .LVL280 + .2byte 0x1 + .byte 0x69 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST150: + .8byte .LVL273 + .8byte .LVL280 + .2byte 0x1 + .byte 0x6c + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST151: + .8byte .LVL273 + .8byte .LVL280 + .2byte 0x1 + .byte 0x68 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST152: + .8byte .LVL275 + .8byte .LVL276 + .2byte 0xd + .byte 0x8f + .sleb128 254 + .byte 0x94 + .byte 0x2 + .byte 0x20 + .byte 0x87 + .sleb128 0 + .byte 0x8 + .byte 0xff + .byte 0x1a + .byte 0x1a + .byte 0x9f + .8byte .LVL283 + .8byte .LVL284 + .2byte 0xf + .byte 0x8f + .sleb128 254 + .byte 0x94 + .byte 0x2 + .byte 0x20 + .byte 0x87 + .sleb128 0 + .byte 0x8 + .byte 0xff + .byte 0x1a + .byte 0x38 + .byte 0x24 + .byte 0x1a + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST153: + .8byte .LVL274 + .8byte .LVL277 + .2byte 0x1 + .byte 0x50 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST30: + .8byte .LVL66 + .8byte .LVL67-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL67-1 + .8byte .LFE269 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST31: + .8byte .LVL66 + .8byte .LVL67-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL67-1 + .8byte .LVL72 + .2byte 0x1 + .byte 0x6a + .8byte .LVL72 + .8byte .LVL73 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL73 + .8byte .LFE269 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST32: + .8byte .LVL66 + .8byte .LVL67-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL67-1 + .8byte .LVL67 + .2byte 0x1 + .byte 0x68 + .8byte .LVL67 + .8byte .LVL71 + .2byte 0x1 + .byte 0x64 + .8byte .LVL71 + .8byte .LVL73 + .2byte 0x6 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x31 + .byte 0x26 + .byte 0x9f + .8byte .LVL73 + .8byte .LFE269 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST33: + .8byte .LVL66 + .8byte .LVL67-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL67-1 + .8byte .LVL70 + .2byte 0x1 + .byte 0x65 + .8byte .LVL70 + .8byte .LFE269 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST34: + .8byte .LVL66 + .8byte .LVL70 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL73 + .8byte .LVL83 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL83 + .8byte .LVL84 + .2byte 0x1 + .byte 0x50 + .8byte .LVL87 + .8byte .LVL88 + .2byte 0x1 + .byte 0x50 + .8byte .LVL104 + .8byte .LVL106 + .2byte 0x1 + .byte 0x50 + .8byte .LVL110 + .8byte .LVL112 + .2byte 0x1 + .byte 0x50 + .8byte .LVL130 + .8byte .LVL132 + .2byte 0x1 + .byte 0x50 + .8byte .LVL137 + .8byte .LVL139 + .2byte 0x1 + .byte 0x50 + .8byte .LVL146 + .8byte .LVL148 + .2byte 0x1 + .byte 0x50 + .8byte .LVL152 + .8byte .LVL154 + .2byte 0x1 + .byte 0x50 + .8byte .LVL160 + .8byte .LVL162 + .2byte 0x1 + .byte 0x50 + .8byte .LVL167 + .8byte .LVL168 + .2byte 0x1 + .byte 0x50 + .8byte .LVL169 + .8byte .LVL170 + .2byte 0x1 + .byte 0x50 + .8byte .LVL171 + .8byte .LVL172 + .2byte 0x1 + .byte 0x50 + .8byte .LVL176 + .8byte .LVL177 + .2byte 0x1 + .byte 0x50 + .8byte .LVL178 + .8byte .LVL179 + .2byte 0x1 + .byte 0x50 + .8byte .LVL180 + .8byte .LVL181 + .2byte 0x1 + .byte 0x50 + .8byte .LVL187 + .8byte .LVL189 + .2byte 0x1 + .byte 0x50 + .8byte .LVL193 + .8byte .LVL195 + .2byte 0x1 + .byte 0x50 + .8byte .LVL198 + .8byte .LFE269 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST35: + .8byte .LVL67 + .8byte .LVL68 + .2byte 0x1 + .byte 0x50 + .8byte .LVL68 + .8byte .LVL69 + .2byte 0x1 + .byte 0x67 + .8byte .LVL73 + .8byte .LFE269 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST36: + .8byte .LVL74 + .8byte .LVL86 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST37: + .8byte .LVL75 + .8byte .LVL86 + .2byte 0x6 + .byte 0xc + .4byte 0x40004 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x6 + .byte 0xc + .4byte 0x40004 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST38: + .8byte .LVL76 + .8byte .LVL86 + .2byte 0x5 + .byte 0x11 + .sleb128 -65536 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x5 + .byte 0x11 + .sleb128 -65536 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST39: + .8byte .LVL77 + .8byte .LVL86 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST40: + .8byte .LVL78 + .8byte .LVL86 + .2byte 0x5 + .byte 0x11 + .sleb128 -65534 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x5 + .byte 0x11 + .sleb128 -65534 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST41: + .8byte .LVL79 + .8byte .LVL86 + .2byte 0x3 + .byte 0x8 + .byte 0xfc + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x3 + .byte 0x8 + .byte 0xfc + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST42: + .8byte .LVL80 + .8byte .LVL86 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST43: + .8byte .LVL81 + .8byte .LVL86 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST44: + .8byte .LVL82 + .8byte .LVL86 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST45: + .8byte .LVL102 + .8byte .LVL104-1 + .2byte 0x1 + .byte 0x55 + .8byte .LVL104-1 + .8byte .LVL165 + .2byte 0x6 + .byte 0x88 + .sleb128 0 + .byte 0x9 + .byte 0xf7 + .byte 0x24 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST46: + .8byte .LVL142 + .8byte .LVL145 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST47: + .8byte .LVL143 + .8byte .LVL159 + .2byte 0x1 + .byte 0x65 + .8byte .LVL159 + .8byte .LFE269 + .2byte 0xa + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0xa + .2byte 0xffff + .byte 0x1a + .byte 0x38 + .byte 0x25 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST55: + .8byte .LVL212 + .8byte .LVL213-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL213-1 + .8byte .LVL221 + .2byte 0x1 + .byte 0x66 + .8byte .LVL221 + .8byte .LVL227 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL227 + .8byte .LVL228 + .2byte 0x1 + .byte 0x66 + .8byte .LVL228 + .8byte .LFE268 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST56: + .8byte .LVL212 + .8byte .LVL213-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL213-1 + .8byte .LVL217 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL217 + .8byte .LVL225 + .2byte 0x1 + .byte 0x63 + .8byte .LVL227 + .8byte .LFE268 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST57: + .8byte .LVL212 + .8byte .LVL213-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL213-1 + .8byte .LVL222 + .2byte 0x1 + .byte 0x65 + .8byte .LVL222 + .8byte .LVL227 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte .LVL227 + .8byte .LVL228 + .2byte 0x1 + .byte 0x65 + .8byte .LVL228 + .8byte .LFE268 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST58: + .8byte .LVL212 + .8byte .LVL213-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL213-1 + .8byte .LVL222 + .2byte 0x1 + .byte 0x67 + .8byte .LVL222 + .8byte .LVL226 + .2byte 0x3 + .byte 0x87 + .sleb128 -1 + .byte 0x9f + .8byte .LVL227 + .8byte .LVL228 + .2byte 0x1 + .byte 0x67 + .8byte .LVL228 + .8byte .LVL244 + .2byte 0x3 + .byte 0x87 + .sleb128 -1 + .byte 0x9f + .8byte .LVL244 + .8byte .LFE268 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST59: + .8byte .LVL214 + .8byte .LVL215 + .2byte 0x1 + .byte 0x50 + .8byte .LVL215 + .8byte .LVL225 + .2byte 0x1 + .byte 0x64 + .8byte .LVL227 + .8byte .LFE268 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST60: + .8byte .LVL217 + .8byte .LVL218 + .2byte 0x1 + .byte 0x50 + .8byte .LVL218 + .8byte .LVL226 + .2byte 0x1 + .byte 0x68 + .8byte .LVL227 + .8byte .LFE268 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST61: + .8byte .LVL217 + .8byte .LVL224 + .2byte 0x1 + .byte 0x65 + .8byte .LVL227 + .8byte .LVL236 + .2byte 0x1 + .byte 0x65 + .8byte .LVL238 + .8byte .LVL241 + .2byte 0x1 + .byte 0x65 + .8byte .LVL241 + .8byte .LVL242 + .2byte 0x3 + .byte 0x85 + .sleb128 1 + .byte 0x9f + .8byte .LVL242 + .8byte .LVL245 + .2byte 0x3 + .byte 0x85 + .sleb128 2 + .byte 0x9f + .8byte .LVL245 + .8byte .LFE268 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST62: + .8byte .LVL241 + .8byte .LVL243 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST63: + .8byte .LVL217 + .8byte .LVL222 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL222 + .8byte .LVL223 + .2byte 0x1 + .byte 0x66 + .8byte .LVL227 + .8byte .LVL228 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL228 + .8byte .LVL234 + .2byte 0x1 + .byte 0x66 + .8byte .LVL234 + .8byte .LVL235 + .2byte 0x1 + .byte 0x50 + .8byte .LVL235 + .8byte .LVL238 + .2byte 0x1 + .byte 0x66 + .8byte .LVL238 + .8byte .LVL239 + .2byte 0x1 + .byte 0x50 + .8byte .LVL239 + .8byte .LFE268 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST64: + .8byte .LVL220 + .8byte .LVL227 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte .LVL228 + .8byte .LFE268 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST65: + .8byte .LVL229 + .8byte .LVL231 + .2byte 0x1 + .byte 0x51 + .8byte .LVL231 + .8byte .LVL232 + .2byte 0x6 + .byte 0x84 + .sleb128 0 + .byte 0x6 + .byte 0x23 + .uleb128 0x104 + .8byte .LVL232 + .8byte .LVL236 + .2byte 0x8 + .byte 0x83 + .sleb128 -1 + .byte 0x11 + .sleb128 -65536 + .byte 0x21 + .byte 0x9f + .8byte .LVL238 + .8byte .LFE268 + .2byte 0x8 + .byte 0x83 + .sleb128 -1 + .byte 0x11 + .sleb128 -65536 + .byte 0x21 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST66: + .8byte .LVL230 + .8byte .LVL236 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte .LVL238 + .8byte .LFE268 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST68: + .8byte .LVL240 + .8byte .LVL243 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST67: + .8byte .LVL236 + .8byte .LVL238 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST0: + .8byte .LVL0 + .8byte .LVL1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1 + .8byte .LFE263 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST16: + .8byte .LVL28 + .8byte .LVL31 + .2byte 0x1 + .byte 0x50 + .8byte .LVL31 + .8byte .LFE262 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST17: + .8byte .LVL28 + .8byte .LVL29 + .2byte 0x1 + .byte 0x51 + .8byte .LVL29 + .8byte .LVL33 + .2byte 0x1 + .byte 0x63 + .8byte .LVL33 + .8byte .LFE262 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST18: + .8byte .LVL28 + .8byte .LVL32-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL32-1 + .8byte .LFE262 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST19: + .8byte .LVL28 + .8byte .LVL32-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL32-1 + .8byte .LFE262 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST20: + .8byte .LVL35 + .8byte .LVL38 + .2byte 0x3 + .byte 0x83 + .sleb128 -1 + .byte 0x9f + .8byte .LVL38 + .8byte .LVL39 + .2byte 0x1 + .byte 0x63 + .8byte .LVL39 + .8byte .LVL41 + .2byte 0x3 + .byte 0x83 + .sleb128 -1 + .byte 0x9f + .8byte .LVL41 + .8byte .LVL42 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST21: + .8byte .LVL37 + .8byte .LVL40-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL41 + .8byte .LFE278 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST22: + .8byte .LVL36 + .8byte .LVL40-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL41 + .8byte .LFE278 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST23: + .8byte .LVL43 + .8byte .LVL46 + .2byte 0x3 + .byte 0x83 + .sleb128 -1 + .byte 0x9f + .8byte .LVL46 + .8byte .LVL48 + .2byte 0x1 + .byte 0x63 + .8byte .LVL48 + .8byte .LVL50 + .2byte 0x3 + .byte 0x83 + .sleb128 -1 + .byte 0x9f + .8byte .LVL51 + .8byte .LFE279 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST24: + .8byte .LVL45 + .8byte .LVL47 + .2byte 0x1 + .byte 0x50 + .8byte .LVL49 + .8byte .LVL50 + .2byte 0x1 + .byte 0x50 + .8byte .LVL51 + .8byte .LVL52 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST25: + .8byte .LVL44 + .8byte .LVL47 + .2byte 0x1 + .byte 0x50 + .8byte .LVL49 + .8byte .LVL50 + .2byte 0x1 + .byte 0x50 + .8byte .LVL51 + .8byte .LVL52 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST26: + .8byte .LVL53 + .8byte .LVL54 + .2byte 0x1 + .byte 0x51 + .8byte .LVL54 + .8byte .LVL56 + .2byte 0x1 + .byte 0x63 + .8byte .LVL56 + .8byte .LVL58 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL58 + .8byte .LVL64 + .2byte 0x1 + .byte 0x63 + .8byte .LVL64 + .8byte .LFE280 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST27: + .8byte .LVL54 + .8byte .LVL60 + .2byte 0x1 + .byte 0x64 + .8byte .LVL60 + .8byte .LVL61 + .2byte 0x3 + .byte 0x84 + .sleb128 -1 + .byte 0x9f + .8byte .LVL61 + .8byte .LVL65 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST28: + .8byte .LVL55 + .8byte .LVL57 + .2byte 0x1 + .byte 0x50 + .8byte .LVL58 + .8byte .LVL59 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST29: + .8byte .LVL56 + .8byte .LVL58 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST48: + .8byte .LVL199 + .8byte .LVL205-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL205-1 + .8byte .LVL211 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL211 + .8byte .LFE267 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST49: + .8byte .LVL199 + .8byte .LVL203 + .2byte 0x1 + .byte 0x51 + .8byte .LVL203 + .8byte .LFE267 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST50: + .8byte .LVL199 + .8byte .LVL206 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL206 + .8byte .LVL208 + .2byte 0x1 + .byte 0x50 + .8byte .LVL208 + .8byte .LVL210 + .2byte 0x1 + .byte 0x63 + .8byte .LVL210 + .8byte .LVL211 + .2byte 0x1 + .byte 0x50 + .8byte .LVL211 + .8byte .LFE267 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST51: + .8byte .LVL202 + .8byte .LVL204 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST52: + .8byte .LVL204 + .8byte .LVL211 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST53: + .8byte .LVL207 + .8byte .LVL209 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST54: + .8byte .LVL207 + .8byte .LVL209 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 + .section .debug_aranges,"",@progbits + .4byte 0xec + .2byte 0x2 + .4byte .Ldebug_info0 + .byte 0x8 + .byte 0 + .2byte 0 + .2byte 0 + .8byte .LFB263 + .8byte .LFE263-.LFB263 + .8byte .LFB276 + .8byte .LFE276-.LFB276 + .8byte .LFB274 + .8byte .LFE274-.LFB274 + .8byte .LFB273 + .8byte .LFE273-.LFB273 + .8byte .LFB277 + .8byte .LFE277-.LFB277 + .8byte .LFB262 + .8byte .LFE262-.LFB262 + .8byte .LFB278 + .8byte .LFE278-.LFB278 + .8byte .LFB279 + .8byte .LFE279-.LFB279 + .8byte .LFB280 + .8byte .LFE280-.LFB280 + .8byte .LFB269 + .8byte .LFE269-.LFB269 + .8byte .LFB267 + .8byte .LFE267-.LFB267 + .8byte .LFB268 + .8byte .LFE268-.LFB268 + .8byte .LFB272 + .8byte .LFE272-.LFB272 + .8byte 0 + .8byte 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .8byte .LBB48 + .8byte .LBE48 + .8byte .LBB49 + .8byte .LBE49 + .8byte 0 + .8byte 0 + .8byte .LBB64 + .8byte .LBE64 + .8byte .LBB66 + .8byte .LBE66 + .8byte 0 + .8byte 0 + .8byte .LBB65 + .8byte .LBE65 + .8byte .LBB67 + .8byte .LBE67 + .8byte 0 + .8byte 0 + .8byte .LBB68 + .8byte .LBE68 + .8byte .LBB69 + .8byte .LBE69 + .8byte 0 + .8byte 0 + .8byte .LBB73 + .8byte .LBE73 + .8byte .LBB74 + .8byte .LBE74 + .8byte 0 + .8byte 0 + .8byte .LBB92 + .8byte .LBE92 + .8byte .LBB93 + .8byte .LBE93 + .8byte 0 + .8byte 0 + .8byte .LBB98 + .8byte .LBE98 + .8byte .LBB99 + .8byte .LBE99 + .8byte 0 + .8byte 0 + .8byte .LBB103 + .8byte .LBE103 + .8byte .LBB105 + .8byte .LBE105 + .8byte 0 + .8byte 0 + .8byte .LBB104 + .8byte .LBE104 + .8byte .LBB106 + .8byte .LBE106 + .8byte 0 + .8byte 0 + .8byte .LBB107 + .8byte .LBE107 + .8byte .LBB108 + .8byte .LBE108 + .8byte 0 + .8byte 0 + .8byte .LBB112 + .8byte .LBE112 + .8byte .LBB113 + .8byte .LBE113 + .8byte 0 + .8byte 0 + .8byte .LBB118 + .8byte .LBE118 + .8byte .LBB119 + .8byte .LBE119 + .8byte 0 + .8byte 0 + .8byte .LBB123 + .8byte .LBE123 + .8byte .LBB124 + .8byte .LBE124 + .8byte 0 + .8byte 0 + .8byte .LBB128 + .8byte .LBE128 + .8byte .LBB129 + .8byte .LBE129 + .8byte 0 + .8byte 0 + .8byte .LBB135 + .8byte .LBE135 + .8byte .LBB136 + .8byte .LBE136 + .8byte 0 + .8byte 0 + .8byte .LBB140 + .8byte .LBE140 + .8byte .LBB141 + .8byte .LBE141 + .8byte 0 + .8byte 0 + .8byte .LBB144 + .8byte .LBE144 + .8byte .LBB145 + .8byte .LBE145 + .8byte 0 + .8byte 0 + .8byte .LBB168 + .8byte .LBE168 + .8byte .LBB169 + .8byte .LBE169 + .8byte 0 + .8byte 0 + .8byte .LBB170 + .8byte .LBE170 + .8byte .LBB171 + .8byte .LBE171 + .8byte 0 + .8byte 0 + .8byte .LBB172 + .8byte .LBE172 + .8byte .LBB173 + .8byte .LBE173 + .8byte 0 + .8byte 0 + .8byte .LBB174 + .8byte .LBE174 + .8byte .LBB175 + .8byte .LBE175 + .8byte 0 + .8byte 0 + .8byte .LBB244 + .8byte .LBE244 + .8byte .LBB324 + .8byte .LBE324 + .8byte .LBB325 + .8byte .LBE325 + .8byte .LBB335 + .8byte .LBE335 + .8byte .LBB336 + .8byte .LBE336 + .8byte 0 + .8byte 0 + .8byte .LBB264 + .8byte .LBE264 + .8byte .LBB266 + .8byte .LBE266 + .8byte 0 + .8byte 0 + .8byte .LBB265 + .8byte .LBE265 + .8byte .LBB267 + .8byte .LBE267 + .8byte 0 + .8byte 0 + .8byte .LBB268 + .8byte .LBE268 + .8byte .LBB269 + .8byte .LBE269 + .8byte 0 + .8byte 0 + .8byte .LBB270 + .8byte .LBE270 + .8byte .LBB271 + .8byte .LBE271 + .8byte 0 + .8byte 0 + .8byte .LBB288 + .8byte .LBE288 + .8byte .LBB289 + .8byte .LBE289 + .8byte 0 + .8byte 0 + .8byte .LBB294 + .8byte .LBE294 + .8byte .LBB295 + .8byte .LBE295 + .8byte 0 + .8byte 0 + .8byte .LBB298 + .8byte .LBE298 + .8byte .LBB300 + .8byte .LBE300 + .8byte 0 + .8byte 0 + .8byte .LBB299 + .8byte .LBE299 + .8byte .LBB301 + .8byte .LBE301 + .8byte 0 + .8byte 0 + .8byte .LBB302 + .8byte .LBE302 + .8byte .LBB303 + .8byte .LBE303 + .8byte 0 + .8byte 0 + .8byte .LBB308 + .8byte .LBE308 + .8byte .LBB309 + .8byte .LBE309 + .8byte 0 + .8byte 0 + .8byte .LBB314 + .8byte .LBE314 + .8byte .LBB315 + .8byte .LBE315 + .8byte 0 + .8byte 0 + .8byte .LBB326 + .8byte .LBE326 + .8byte .LBB332 + .8byte .LBE332 + .8byte .LBB333 + .8byte .LBE333 + .8byte .LBB334 + .8byte .LBE334 + .8byte .LBB337 + .8byte .LBE337 + .8byte 0 + .8byte 0 + .8byte .LFB263 + .8byte .LFE263 + .8byte .LFB276 + .8byte .LFE276 + .8byte .LFB274 + .8byte .LFE274 + .8byte .LFB273 + .8byte .LFE273 + .8byte .LFB277 + .8byte .LFE277 + .8byte .LFB262 + .8byte .LFE262 + .8byte .LFB278 + .8byte .LFE278 + .8byte .LFB279 + .8byte .LFE279 + .8byte .LFB280 + .8byte .LFE280 + .8byte .LFB269 + .8byte .LFE269 + .8byte .LFB267 + .8byte .LFE267 + .8byte .LFB268 + .8byte .LFE268 + .8byte .LFB272 + .8byte .LFE272 + .8byte 0 + .8byte 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF222: + .string "UCLASS_SERIAL" +.LASF319: + .string "gd_t" +.LASF15: + .string "long int" +.LASF39: + .string "uclass_node" +.LASF422: + .string "request" +.LASF312: + .string "phandle" +.LASF53: + .string "flash_id" +.LASF404: + .string "misc_ops" +.LASF376: + .string "mem_malloc_start" +.LASF332: + .string "net_hostname" +.LASF28: + .string "name" +.LASF248: + .string "UCLASS_ETH_PHY" +.LASF229: + .string "UCLASS_THERMAL" +.LASF60: + .string "base" +.LASF354: + .string "NETLOOP_RESTART" +.LASF287: + .string "new_gd" +.LASF348: + .string "net_boot_file_size" +.LASF134: + .string "fit_hdr_os" +.LASF181: + .string "UCLASS_FIRMWARE" +.LASF457: + .string "udelay" +.LASF142: + .string "fit_noffset_fdt" +.LASF74: + .string "bi_dsp_freq" +.LASF303: + .string "malloc_ptr" +.LASF91: + .string "_datarellocal_start_ofs" +.LASF94: + .string "fdt32_t" +.LASF146: + .string "rd_start" +.LASF371: + .string "property" +.LASF265: + .string "tlb_emerg" +.LASF78: + .string "bi_enetaddr" +.LASF290: + .string "uclass_root" +.LASF188: + .string "UCLASS_IRQ" +.LASF420: + .string "rockchip_secure_otp_ofdata_to_platdata" +.LASF437: + .string "buffer" +.LASF234: + .string "UCLASS_USB_HUB" +.LASF230: + .string "UCLASS_TIMER" +.LASF42: + .string "flags" +.LASF139: + .string "fit_noffset_rd" +.LASF269: + .string "baudrate" +.LASF334: + .string "net_ethaddr" +.LASF300: + .string "timebase_l" +.LASF21: + .string "errno" +.LASF32: + .string "node" +.LASF359: + .string "bind" +.LASF455: + .string "printf" +.LASF401: + .string "DECOM_ZLIB" +.LASF8: + .string "unsigned int" +.LASF47: + .string "next" +.LASF101: + .string "version" +.LASF396: + .string "per_device_platdata_auto_alloc_size" +.LASF131: + .string "legacy_hdr_os_copy" +.LASF195: + .string "UCLASS_MMC" +.LASF289: + .string "dm_root_f" +.LASF340: + .string "net_rx_packet" +.LASF38: + .string "parent_priv" +.LASF176: + .string "UCLASS_CROS_EC" +.LASF310: + .string "console_evt" +.LASF191: + .string "UCLASS_LPC" +.LASF105: + .string "size_dt_struct" +.LASF379: + .string "p_current" +.LASF344: + .string "net_our_vlan" +.LASF22: + .string "___strtok" +.LASF67: + .string "bi_memsize" +.LASF121: + .string "image_info" +.LASF200: + .string "UCLASS_NVME" +.LASF156: + .string "bootm_headers_t" +.LASF252: + .string "UCLASS_RNG" +.LASF249: + .string "UCLASS_MDIO" +.LASF187: + .string "UCLASS_IDE" +.LASF273: + .string "bus_clk" +.LASF377: + .string "mem_malloc_end" +.LASF225: + .string "UCLASS_SPI_FLASH" +.LASF189: + .string "UCLASS_KEYBOARD" +.LASF72: + .string "bi_sramsize" +.LASF185: + .string "UCLASS_I2C_MUX" +.LASF297: + .string "fdt_blob_kern" +.LASF277: + .string "env_addr" +.LASF48: + .string "prev" +.LASF227: + .string "UCLASS_SYSCON" +.LASF171: + .string "UCLASS_BLK" +.LASF212: + .string "UCLASS_PWRSEQ" +.LASF132: + .string "legacy_hdr_valid" +.LASF264: + .string "tlb_fillptr" +.LASF82: + .string "bi_arch_number" +.LASF323: + .string "load_addr" +.LASF291: + .string "fdt_blob" +.LASF328: + .string "net_gateway" +.LASF166: + .string "UCLASS_PCI_EMUL" +.LASF424: + .string "offset" +.LASF426: + .string "secure_otp_read" +.LASF349: + .string "net_boot_file_expected_size_in_blocks" +.LASF403: + .string "OTP_NS" +.LASF414: + .string "spl_rockchip_otp_start" +.LASF206: + .string "UCLASS_PHY" +.LASF454: + .string "dev_get_driver_data" +.LASF3: + .string "signed char" +.LASF203: + .string "UCLASS_PCH" +.LASF100: + .string "off_mem_rsvmap" +.LASF163: + .string "UCLASS_TEST_PROBE" +.LASF149: + .string "ft_len" +.LASF19: + .string "uint32_t" +.LASF384: + .string "udevice_id" +.LASF325: + .string "save_size" +.LASF439: + .string "read_end" +.LASF378: + .string "mem_malloc_brk" +.LASF124: + .string "load" +.LASF143: + .string "fit_hdr_setup" +.LASF299: + .string "timebase_h" +.LASF160: + .string "UCLASS_TEST" +.LASF87: + .string "IRQ_STACK_START" +.LASF419: + .string "_u_boot_list_2_driver_2_rockchip_secure_otp" +.LASF125: + .string "comp" +.LASF70: + .string "bi_flashoffset" +.LASF201: + .string "UCLASS_PANEL" +.LASF266: + .string "pre_serial" +.LASF36: + .string "uclass" +.LASF162: + .string "UCLASS_TEST_BUS" +.LASF460: + .string "/home/lxh/uboot/u-boot" +.LASF238: + .string "UCLASS_VIDEO_CONSOLE" +.LASF360: + .string "probe" +.LASF10: + .string "long long unsigned int" +.LASF260: + .string "lastinc" +.LASF388: + .string "post_bind" +.LASF284: + .string "irq_sp" +.LASF449: + .string "rk3528_spl_rockchip_otp_stop" +.LASF197: + .string "UCLASS_MTD" +.LASF216: + .string "UCLASS_RESET" +.LASF117: + .string "ih_type" +.LASF80: + .string "bi_intfreq" +.LASF172: + .string "UCLASS_CLK" +.LASF350: + .string "net_ping_ip" +.LASF79: + .string "bi_ethspeed" +.LASF375: + .string "ofnode" +.LASF435: + .string "rk3528_secure_otp_write_2_bytes_noecc" +.LASF231: + .string "UCLASS_TPM" +.LASF315: + .string "child" +.LASF443: + .string "rockchip_secure_otp_wait_flag" +.LASF456: + .string "malloc_simple" +.LASF59: + .string "lmb_property" +.LASF268: + .string "enable" +.LASF262: + .string "tlb_addr" +.LASF373: + .string "value" +.LASF184: + .string "UCLASS_I2C_GENERIC" +.LASF99: + .string "off_dt_strings" +.LASF418: + .string "rockchip_otp_ids" +.LASF103: + .string "boot_cpuid_phys" +.LASF361: + .string "remove" +.LASF133: + .string "fit_uname_cfg" +.LASF106: + .string "working_fdt" +.LASF316: + .string "sibling" +.LASF118: + .string "ih_comp" +.LASF202: + .string "UCLASS_PANEL_BACKLIGHT" +.LASF81: + .string "bi_busfreq" +.LASF296: + .string "ufdt_blob" +.LASF279: + .string "ram_top" +.LASF271: + .string "global_data" +.LASF327: + .string "s_addr" +.LASF127: + .string "arch" +.LASF226: + .string "UCLASS_SPI_GENERIC" +.LASF317: + .string "mtd_info" +.LASF95: + .string "fdt_header" +.LASF177: + .string "UCLASS_DISPLAY" +.LASF390: + .string "pre_probe" +.LASF352: + .string "net_loop_state" +.LASF55: + .string "protect" +.LASF306: + .string "video_bottom" +.LASF438: + .string "write_end" +.LASF71: + .string "bi_sramstart" +.LASF224: + .string "UCLASS_SPMI" +.LASF220: + .string "UCLASS_SCMI_AGENT" +.LASF23: + .string "_Bool" +.LASF12: + .string "phys_size_t" +.LASF45: + .string "udevice" +.LASF37: + .string "uclass_priv" +.LASF123: + .string "image_len" +.LASF318: + .string "jt_funcs" +.LASF408: + .string "call" +.LASF330: + .string "net_dns_server" +.LASF427: + .string "rk3528_secure_otp_write" +.LASF397: + .string "__invalid_size_argument_for_IOC" +.LASF57: + .string "flash_info" +.LASF462: + .string "free" +.LASF288: + .string "dm_root" +.LASF108: + .string "ih_magic" +.LASF218: + .string "UCLASS_RAMDISK" +.LASF450: + .string "rk3528_spl_rockchip_otp_start" +.LASF26: + .string "_binary_u_boot_bin_end" +.LASF141: + .string "fit_uname_fdt" +.LASF190: + .string "UCLASS_LED" +.LASF292: + .string "new_fdt" +.LASF407: + .string "ioctl" +.LASF170: + .string "UCLASS_AHCI" +.LASF41: + .string "sibling_node" +.LASF333: + .string "net_root_path" +.LASF49: + .string "block_drvr" +.LASF9: + .string "long long int" +.LASF250: + .string "UCLASS_EBC" +.LASF324: + .string "save_addr" +.LASF35: + .string "priv" +.LASF209: + .string "UCLASS_PMIC" +.LASF302: + .string "malloc_limit" +.LASF14: + .string "char" +.LASF413: + .string "secure_otp_data" +.LASF180: + .string "UCLASS_GPIO" +.LASF44: + .string "ide_bus_offset" +.LASF254: + .string "UCLASS_PD" +.LASF52: + .string "sector_count" +.LASF145: + .string "fit_noffset_setup" +.LASF122: + .string "image_start" +.LASF56: + .string "flash_info_t" +.LASF228: + .string "UCLASS_SYSRESET" +.LASF115: + .string "ih_os" +.LASF31: + .string "uclass_platdata" +.LASF336: + .string "net_ip" +.LASF458: + .ascii "GNU C11 6.3.1 201" + .string "70404 -mstrict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18" +.LASF305: + .string "video_top" +.LASF257: + .string "LOGF_MAX_CATEGORIES" +.LASF357: + .string "net_state" +.LASF459: + .string "drivers/misc/rk3528-secure-otp.c" +.LASF285: + .string "start_addr_sp" +.LASF135: + .string "fit_uname_os" +.LASF18: + .string "uint8_t" +.LASF7: + .string "__u32" +.LASF362: + .string "unbind" +.LASF283: + .string "mon_len" +.LASF356: + .string "NETLOOP_FAIL" +.LASF428: + .string "data_byte" +.LASF364: + .string "child_post_bind" +.LASF313: + .string "full_name" +.LASF214: + .string "UCLASS_REGULATOR" +.LASF183: + .string "UCLASS_I2C_EEPROM" +.LASF370: + .string "per_child_platdata_auto_alloc_size" +.LASF444: + .string "rockchip_secure_otp_wait_status" +.LASF129: + .string "bootm_headers" +.LASF275: + .string "mem_clk" +.LASF358: + .string "of_match" +.LASF351: + .string "uclass_id" +.LASF320: + .string "monitor_flash_len" +.LASF366: + .string "child_post_remove" +.LASF369: + .string "per_child_auto_alloc_size" +.LASF213: + .string "UCLASS_RAM" +.LASF293: + .string "fdt_size" +.LASF363: + .string "ofdata_to_platdata" +.LASF208: + .string "UCLASS_PINCTRL" +.LASF29: + .string "platdata" +.LASF259: + .string "timer_rate_hz" +.LASF433: + .string "rk3528_secure_otp_write_byte_noecc" +.LASF434: + .string "data_2b" +.LASF90: + .string "_datarelrolocal_start_ofs" +.LASF164: + .string "UCLASS_SPI_EMUL" +.LASF196: + .string "UCLASS_MOD_EXP" +.LASF97: + .string "totalsize" +.LASF387: + .string "uclass_driver" +.LASF73: + .string "bi_arm_freq" +.LASF199: + .string "UCLASS_NORTHBRIDGE" +.LASF235: + .string "UCLASS_USB_GADGET_GENERIC" +.LASF120: + .string "image_header_t" +.LASF68: + .string "bi_flashstart" +.LASF92: + .string "_datarelro_start_ofs" +.LASF346: + .string "net_restart_wrap" +.LASF385: + .string "compatible" +.LASF165: + .string "UCLASS_I2C_EMUL" +.LASF274: + .string "pci_clk" +.LASF173: + .string "UCLASS_CPU" +.LASF343: + .string "net_null_ethaddr" +.LASF86: + .string "bd_t" +.LASF174: + .string "UCLASS_AMP" +.LASF243: + .string "UCLASS_RC" +.LASF453: + .string "dev_read_u32_default" +.LASF337: + .string "net_server_ip" +.LASF280: + .string "ram_top_ext_size" +.LASF51: + .string "size" +.LASF58: + .string "long double" +.LASF76: + .string "bi_bootflags" +.LASF83: + .string "bi_boot_params" +.LASF441: + .string "rockchip_secure_otp_check_flag" +.LASF448: + .string "mask" +.LASF246: + .string "UCLASS_IO_DOMAIN" +.LASF25: + .string "_binary_u_boot_bin_start" +.LASF159: + .string "UCLASS_DEMO" +.LASF107: + .string "image_header" +.LASF102: + .string "last_comp_version" +.LASF321: + .string "__dtb_dt_begin" +.LASF251: + .string "UCLASS_EINK_DISPLAY" +.LASF309: + .string "sys_start_tick" +.LASF168: + .string "UCLASS_SIMPLE_BUS" +.LASF179: + .string "UCLASS_ETH" +.LASF153: + .string "cmdline_end" +.LASF75: + .string "bi_ddr_freq" +.LASF98: + .string "off_dt_struct" +.LASF440: + .string "rockchip_secure_otp_ecc_enable" +.LASF301: + .string "malloc_base" +.LASF308: + .string "serial" +.LASF386: + .string "data" +.LASF329: + .string "net_netmask" +.LASF322: + .string "__dtb_dt_spl_begin" +.LASF65: + .string "bd_info" +.LASF152: + .string "cmdline_start" +.LASF157: + .string "images" +.LASF267: + .string "using_pre_serial" +.LASF130: + .string "legacy_hdr_os" +.LASF425: + .string "otp_data" +.LASF192: + .string "UCLASS_MAILBOX" +.LASF217: + .string "UCLASS_RKNAND" +.LASF138: + .string "fit_uname_rd" +.LASF77: + .string "bi_ip_addr" +.LASF307: + .string "pm_ctx_phys" +.LASF295: + .string "of_root_f" +.LASF281: + .string "relocaddr" +.LASF33: + .string "driver_data" +.LASF0: + .string "unsigned char" +.LASF11: + .string "phys_addr_t" +.LASF389: + .string "pre_unbind" +.LASF13: + .string "sizetype" +.LASF338: + .string "net_tx_packet" +.LASF395: + .string "per_device_auto_alloc_size" +.LASF150: + .string "initrd_start" +.LASF34: + .string "parent" +.LASF380: + .string "current" +.LASF6: + .string "short int" +.LASF116: + .string "ih_arch" +.LASF400: + .string "DECOM_GZIP" +.LASF314: + .string "properties" +.LASF240: + .string "UCLASS_WDT" +.LASF442: + .string "delay" +.LASF372: + .string "length" +.LASF331: + .string "net_nis_domain" +.LASF112: + .string "ih_load" +.LASF298: + .string "env_buf" +.LASF355: + .string "NETLOOP_SUCCESS" +.LASF167: + .string "UCLASS_USB_EMUL" +.LASF429: + .string "temp" +.LASF161: + .string "UCLASS_TEST_FDT" +.LASF415: + .string "spl_rockchip_otp_stop" +.LASF445: + .string "flag" +.LASF17: + .string "ulong" +.LASF110: + .string "ih_time" +.LASF111: + .string "ih_size" +.LASF178: + .string "UCLASS_DMA" +.LASF253: + .string "UCLASS_DMC" +.LASF215: + .string "UCLASS_REMOTEPROC" +.LASF353: + .string "NETLOOP_CONTINUE" +.LASF219: + .string "UCLASS_RTC" +.LASF261: + .string "timer_reset_value" +.LASF294: + .string "of_root" +.LASF339: + .string "net_rx_packets" +.LASF194: + .string "UCLASS_MISC" +.LASF62: + .string "region" +.LASF148: + .string "ft_addr" +.LASF416: + .string "rockchip_secure_otp_ops" +.LASF405: + .string "read" +.LASF54: + .string "start" +.LASF144: + .string "fit_uname_setup" +.LASF114: + .string "ih_dcrc" +.LASF24: + .string "image_base" +.LASF392: + .string "pre_remove" +.LASF158: + .string "UCLASS_ROOT" +.LASF96: + .string "magic" +.LASF241: + .string "UCLASS_FG" +.LASF137: + .string "fit_hdr_rd" +.LASF140: + .string "fit_hdr_fdt" +.LASF113: + .string "ih_ep" +.LASF286: + .string "reloc_off" +.LASF393: + .string "init" +.LASF239: + .string "UCLASS_VIDEO_CRTC" +.LASF236: + .string "UCLASS_VIDEO" +.LASF446: + .string "secure_conf" +.LASF205: + .string "UCLASS_PCI_GENERIC" +.LASF1: + .string "long unsigned int" +.LASF5: + .string "__u8" +.LASF374: + .string "of_offset" +.LASF258: + .string "arch_global_data" +.LASF89: + .string "_datarel_start_ofs" +.LASF311: + .string "device_node" +.LASF263: + .string "tlb_size" +.LASF66: + .string "bi_memstart" +.LASF109: + .string "ih_hcrc" +.LASF104: + .string "size_dt_strings" +.LASF128: + .string "image_info_t" +.LASF63: + .string "memory" +.LASF27: + .string "driver" +.LASF147: + .string "rd_end" +.LASF193: + .string "UCLASS_MASS_STORAGE" +.LASF326: + .string "in_addr" +.LASF151: + .string "initrd_end" +.LASF210: + .string "UCLASS_PWM" +.LASF93: + .string "IRQ_STACK_START_IN" +.LASF84: + .string "bi_andr_version" +.LASF126: + .string "type" +.LASF341: + .string "net_rx_packet_len" +.LASF383: + .string "u_boot_dev_head" +.LASF431: + .string "rk3528_secure_otp_write_2_bytes" +.LASF221: + .string "UCLASS_SCSI" +.LASF16: + .string "ushort" +.LASF204: + .string "UCLASS_PCI" +.LASF198: + .string "UCLASS_NOP" +.LASF394: + .string "destroy" +.LASF447: + .string "otp_cru_rst" +.LASF247: + .string "UCLASS_CRYPTO" +.LASF452: + .string "dev_read_addr_ptr" +.LASF276: + .string "have_console" +.LASF399: + .string "DECOM_LZ4" +.LASF175: + .string "UCLASS_CODEC" +.LASF381: + .string "uc_drv" +.LASF232: + .string "UCLASS_USB" +.LASF304: + .string "cur_serial_dev" +.LASF270: + .string "addr" +.LASF46: + .string "list_head" +.LASF155: + .string "state" +.LASF20: + .string "__be32" +.LASF207: + .string "UCLASS_PINCONFIG" +.LASF233: + .string "UCLASS_USB_DEV_GENERIC" +.LASF342: + .string "net_bcast_ethaddr" +.LASF136: + .string "fit_noffset_os" +.LASF223: + .string "UCLASS_SPI" +.LASF436: + .string "rk3528_secure_otp_read" +.LASF335: + .string "net_server_ethaddr" +.LASF255: + .string "UCLASS_COUNT" +.LASF278: + .string "env_valid" +.LASF245: + .string "UCLASS_DVFS" +.LASF412: + .string "otp_cru_rst_base" +.LASF40: + .string "child_head" +.LASF50: + .string "select_hwpart" +.LASF4: + .string "uchar" +.LASF69: + .string "bi_flashsize" +.LASF382: + .string "dev_head" +.LASF409: + .string "rockchip_otp_platdata" +.LASF2: + .string "short unsigned int" +.LASF391: + .string "post_probe" +.LASF365: + .string "child_pre_probe" +.LASF421: + .string "secure_otp_ioctl" +.LASF347: + .string "net_boot_file_name" +.LASF406: + .string "write" +.LASF244: + .string "UCLASS_CHARGE_DISPLAY" +.LASF256: + .string "UCLASS_INVALID" +.LASF402: + .string "OTP_S" +.LASF432: + .string "__func__" +.LASF64: + .string "reserved" +.LASF417: + .string "rk3528_data" +.LASF182: + .string "UCLASS_I2C" +.LASF119: + .string "ih_name" +.LASF461: + .string "ofnode_union" +.LASF411: + .string "otp_mask_base" +.LASF169: + .string "UCLASS_ADC" +.LASF43: + .string "req_seq" +.LASF282: + .string "ram_size" +.LASF451: + .string "dev_get_platdata" +.LASF186: + .string "UCLASS_I2S" +.LASF367: + .string "priv_auto_alloc_size" +.LASF30: + .string "parent_platdata" +.LASF410: + .string "secure_conf_base" +.LASF154: + .string "verify" +.LASF88: + .string "FIQ_STACK_START" +.LASF85: + .string "bi_dram" +.LASF430: + .string "rockchip_secure_otp_capability" +.LASF345: + .string "net_native_vlan" +.LASF423: + .string "secure_otp_write" +.LASF211: + .string "UCLASS_POWER_DOMAIN" +.LASF398: + .string "misc_mode" +.LASF272: + .string "cpu_clk" +.LASF237: + .string "UCLASS_VIDEO_BRIDGE" +.LASF368: + .string "platdata_auto_alloc_size" +.LASF61: + .string "lmb_region" +.LASF242: + .string "UCLASS_KEY" + .ident "GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404" + .section .note.GNU-stack,"",@progbits diff --git a/u-boot/drivers/misc/rk3562-secure-otp.S b/u-boot/drivers/misc/rk3562-secure-otp.S new file mode 100644 index 0000000..e3b3f34 --- /dev/null +++ b/u-boot/drivers/misc/rk3562-secure-otp.S @@ -0,0 +1,15906 @@ + .arch armv8-a+nosimd + .file "rk3562-secure-otp.c" + .text +.Ltext0: + .cfi_sections .debug_frame + .section .text.rk3562_spl_rockchip_otp_stop,"ax",@progbits + .align 2 + .type rk3562_spl_rockchip_otp_stop, %function +rk3562_spl_rockchip_otp_stop: +.LFB263: + .file 1 "drivers/misc/rk3562-secure-otp.c" + .loc 1 81 0 + .cfi_startproc +.LVL0: +.LBB22: + .loc 1 82 0 +#APP +// 82 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov w1, 524288 +.LVL1: + str w1, [x0] + ret +.LBE22: + .cfi_endproc +.LFE263: + .size rk3562_spl_rockchip_otp_stop, .-rk3562_spl_rockchip_otp_stop + .section .text.secure_otp_ioctl,"ax",@progbits + .align 2 + .type secure_otp_ioctl, %function +secure_otp_ioctl: +.LFB276: + .loc 1 697 0 + .cfi_startproc +.LVL2: + .loc 1 700 0 + mov x0, 27908 +.LVL3: + cmp x1, x0 + bne .L6 +.LVL4: +.LBB23: +.LBB24: + .loc 1 689 0 + mov w0, 8 + str w0, [x2] +.LVL5: +.LBE24: +.LBE23: + .loc 1 702 0 + mov w0, 0 + .loc 1 703 0 + ret +.LVL6: +.L6: + .loc 1 698 0 + mov w0, -22 + .loc 1 709 0 + ret + .cfi_endproc +.LFE276: + .size secure_otp_ioctl, .-secure_otp_ioctl + .section .text.secure_otp_write,"ax",@progbits + .align 2 + .type secure_otp_write, %function +secure_otp_write: +.LFB274: + .loc 1 681 0 + .cfi_startproc +.LVL7: + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + mov x19, x0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -16 + .cfi_offset 22, -8 + .loc 1 681 0 + mov w20, w1 + mov x21, x2 + mov w22, w3 + .loc 1 682 0 + bl dev_get_driver_data +.LVL8: + .loc 1 684 0 + ldr x4, [x0, 8] + mov w3, w22 + mov x2, x21 + mov w1, w20 + mov x0, x19 +.LVL9: + .loc 1 685 0 + ldp x21, x22, [sp, 32] +.LVL10: + ldp x19, x20, [sp, 16] +.LVL11: + ldp x29, x30, [sp], 48 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + .loc 1 684 0 + br x4 +.LVL12: + .cfi_endproc +.LFE274: + .size secure_otp_write, .-secure_otp_write + .section .text.secure_otp_read,"ax",@progbits + .align 2 + .type secure_otp_read, %function +secure_otp_read: +.LFB273: + .loc 1 673 0 + .cfi_startproc +.LVL13: + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + mov x19, x0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -16 + .cfi_offset 22, -8 + .loc 1 673 0 + mov w20, w1 + mov x21, x2 + mov w22, w3 + .loc 1 674 0 + bl dev_get_driver_data +.LVL14: + .loc 1 676 0 + ldr x4, [x0] + mov w3, w22 + mov x2, x21 + mov w1, w20 + mov x0, x19 +.LVL15: + .loc 1 677 0 + ldp x21, x22, [sp, 32] +.LVL16: + ldp x19, x20, [sp, 16] +.LVL17: + ldp x29, x30, [sp], 48 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + .loc 1 676 0 + br x4 +.LVL18: + .cfi_endproc +.LFE273: + .size secure_otp_read, .-secure_otp_read + .section .text.rockchip_secure_otp_ofdata_to_platdata,"ax",@progbits + .align 2 + .type rockchip_secure_otp_ofdata_to_platdata, %function +rockchip_secure_otp_ofdata_to_platdata: +.LFB277: + .loc 1 718 0 + .cfi_startproc +.LVL19: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -16 + .cfi_offset 20, -8 + .loc 1 718 0 + mov x20, x0 + .loc 1 719 0 + bl dev_get_platdata +.LVL20: + mov x19, x0 +.LVL21: + .loc 1 721 0 + mov x0, x20 +.LVL22: + bl dev_read_addr_ptr +.LVL23: + .loc 1 722 0 + mov w2, 0 + adrp x1, .LC0 + .loc 1 721 0 + str x0, [x19] + .loc 1 722 0 + add x1, x1, :lo12:.LC0 + mov x0, x20 + bl dev_read_u32_default +.LVL24: + .loc 1 723 0 + uxtw x0, w0 + str x0, [x19, 8] + .loc 1 724 0 + mov w2, 0 + mov x0, x20 + adrp x1, .LC1 + add x1, x1, :lo12:.LC1 + bl dev_read_u32_default +.LVL25: + .loc 1 725 0 + uxtw x0, w0 + str x0, [x19, 16] + .loc 1 726 0 + mov w2, 0 + mov x0, x20 + adrp x1, .LC2 + add x1, x1, :lo12:.LC2 + bl dev_read_u32_default +.LVL26: + .loc 1 727 0 + uxtw x0, w0 + str x0, [x19, 24] + .loc 1 730 0 + mov w0, 0 + ldp x19, x20, [sp, 16] +.LVL27: + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE277: + .size rockchip_secure_otp_ofdata_to_platdata, .-rockchip_secure_otp_ofdata_to_platdata + .section .text.rk3562_spl_rockchip_otp_start,"ax",@progbits + .align 2 + .type rk3562_spl_rockchip_otp_start, %function +rk3562_spl_rockchip_otp_start: +.LFB262: + .loc 1 69 0 + .cfi_startproc +.LVL28: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 + .loc 1 69 0 + mov x19, x1 +.LBB25: + .loc 1 71 0 +#APP +// 71 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov w1, 524296 +.LVL29: + str w1, [x0] +.LVL30: +.LBE25: +.LBB26: + .loc 1 72 0 +#APP +// 72 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov w0, 1048592 +.LVL31: + str w0, [x19] +.LBE26: + .loc 1 73 0 + mov x0, 2 + bl udelay +.LVL32: +.LBB27: + .loc 1 74 0 +#APP +// 74 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + mov w0, 1048576 + str w0, [x19] +.LBE27: + .loc 1 76 0 + ldr x19, [sp, 16] +.LVL33: + .loc 1 75 0 + mov x0, 1 + .loc 1 76 0 + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + .loc 1 75 0 + b udelay +.LVL34: + .cfi_endproc +.LFE262: + .size rk3562_spl_rockchip_otp_start, .-rk3562_spl_rockchip_otp_start + .section .text.rockchip_secure_otp_check_flag.isra.0,"ax",@progbits + .align 2 + .type rockchip_secure_otp_check_flag.isra.0, %function +rockchip_secure_otp_check_flag.isra.0: +.LFB278: + .loc 1 129 0 + .cfi_startproc + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -16 + .cfi_offset 20, -8 + .loc 1 129 0 + mov w19, 34465 + mov x20, x0 + movk w19, 0x1, lsl 16 +.L17: +.LVL35: +.LBB28: + .loc 1 136 0 + ldr x0, [x20] + ldr w1, [x0, 44] +.LVL36: +#APP +// 136 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +.LVL37: +#NO_APP +.LBE28: + .loc 1 137 0 + and w0, w1, 16 + tbz x1, 4, .L15 + .loc 1 140 0 + subs w19, w19, #1 +.LVL38: + beq .L18 +.LVL39: + .loc 1 146 0 + mov x0, 1 + bl udelay +.LVL40: + b .L17 +.LVL41: +.L18: + .loc 1 141 0 + mov w0, -1 +.LVL42: +.L15: + .loc 1 150 0 + ldp x19, x20, [sp, 16] + ldp x29, x30, [sp], 32 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE278: + .size rockchip_secure_otp_check_flag.isra.0, .-rockchip_secure_otp_check_flag.isra.0 + .section .text.rockchip_secure_otp_wait_flag.isra.1,"ax",@progbits + .align 2 + .type rockchip_secure_otp_wait_flag.isra.1, %function +rockchip_secure_otp_wait_flag.isra.1: +.LFB279: + .loc 1 106 0 + .cfi_startproc + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -16 + .cfi_offset 20, -8 + .loc 1 106 0 + mov x20, x0 + mov w19, 20001 +.L25: +.LVL43: +.LBB29: + .loc 1 113 0 + ldr x0, [x20] + ldr w0, [x0, 44] +.LVL44: +#APP +// 113 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +.LVL45: +#NO_APP +.LBE29: + .loc 1 114 0 + tbnz x0, 4, .L26 + .loc 1 117 0 + subs w19, w19, #1 +.LVL46: + beq .L27 + .loc 1 122 0 + mov x0, 1 +.LVL47: + bl udelay +.LVL48: + b .L25 +.LVL49: +.L26: + .loc 1 110 0 + mov w0, 0 +.LVL50: +.L23: + .loc 1 127 0 + ldp x19, x20, [sp, 16] + ldp x29, x30, [sp], 32 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL51: +.L27: + .cfi_restore_state + .loc 1 118 0 + mov w0, -1 +.LVL52: + b .L23 + .cfi_endproc +.LFE279: + .size rockchip_secure_otp_wait_flag.isra.1, .-rockchip_secure_otp_wait_flag.isra.1 + .section .text.rockchip_secure_otp_wait_status.isra.2,"ax",@progbits + .align 2 + .type rockchip_secure_otp_wait_status.isra.2, %function +rockchip_secure_otp_wait_status.isra.2: +.LFB280: + .loc 1 86 0 + .cfi_startproc +.LVL53: + stp x29, x30, [sp, -48]! + .cfi_def_cfa_offset 48 + .cfi_offset 29, -48 + .cfi_offset 30, -40 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -32 + .cfi_offset 20, -24 + mov w19, w1 + str x21, [sp, 32] + .cfi_offset 21, -16 + .loc 1 86 0 + mov x21, x0 + mov w20, 10000 +.LVL54: +.L30: +.LBB36: + .loc 1 91 0 + ldr x0, [x21] + ldr w0, [x0, 772] +.LVL55: +#APP +// 91 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP +.LBE36: + tst w0, w19 + beq .L32 +.LBB37: + .loc 1 101 0 + orr w19, w19, -65536 +.LVL56: +#APP +// 101 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x21] +.LVL57: + str w19, [x0, 772] +.LBE37: + .loc 1 103 0 + mov w0, 0 + b .L29 +.LVL58: +.L32: + .loc 1 92 0 + mov x0, 1 +.LVL59: + bl udelay +.LVL60: + .loc 1 94 0 + subs w20, w20, #1 +.LVL61: + bne .L30 +.LVL62: +.LBB38: +.LBB39: + .loc 1 95 0 + adrp x1, .LANCHOR0 + adrp x0, .LC3 + add x1, x1, :lo12:.LANCHOR0 + add x0, x0, :lo12:.LC3 + bl printf +.LVL63: + mov w0, -110 +.LVL64: +.L29: +.LBE39: +.LBE38: + .loc 1 104 0 + ldp x19, x20, [sp, 16] +.LVL65: + ldr x21, [sp, 32] + ldp x29, x30, [sp], 48 + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 21 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret + .cfi_endproc +.LFE280: + .size rockchip_secure_otp_wait_status.isra.2, .-rockchip_secure_otp_wait_status.isra.2 + .section .text.rk3562_secure_otp_write_2_bytes_noecc,"ax",@progbits + .align 2 + .type rk3562_secure_otp_write_2_bytes_noecc, %function +rk3562_secure_otp_write_2_bytes_noecc: +.LFB269: + .loc 1 240 0 + .cfi_startproc +.LVL66: + stp x29, x30, [sp, -96]! + .cfi_def_cfa_offset 96 + .cfi_offset 29, -96 + .cfi_offset 30, -88 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x23, x24, [sp, 48] + .cfi_offset 23, -48 + .cfi_offset 24, -40 + mov w24, w2 + stp x19, x20, [sp, 16] + .cfi_offset 19, -80 + .cfi_offset 20, -72 + .loc 1 244 0 + asr w20, w24, 1 + .loc 1 240 0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -64 + .cfi_offset 22, -56 + and w21, w3, 65535 + stp x25, x26, [sp, 64] + .cfi_offset 25, -32 + .cfi_offset 26, -24 + mov x26, x1 + stp x27, x28, [sp, 80] + .cfi_offset 27, -16 + .cfi_offset 28, -8 + .loc 1 242 0 + bl dev_get_driver_data +.LVL67: + .loc 1 245 0 + cmp w20, 447 + bgt .L43 + mov x23, x0 + .loc 1 249 0 + sub w0, w20, #416 +.LVL68: + cmp w0, 15 + ccmp w20, 16, 4, hi + beq .L37 + .loc 1 252 0 + adrp x0, .LC4 + and w1, w24, -2 + add x0, x0, :lo12:.LC4 + bl printf +.LVL69: +.L43: + .loc 1 246 0 + mov w0, -1 +.LVL70: +.L35: + .loc 1 446 0 + ldp x19, x20, [sp, 16] +.LVL71: + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] + ldp x25, x26, [sp, 64] +.LVL72: + ldp x27, x28, [sp, 80] + ldp x29, x30, [sp], 96 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 27 + .cfi_restore 28 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL73: +.L37: + .cfi_restore_state + .loc 1 256 0 + cbz w21, .L44 + .loc 1 259 0 + ldr x6, [x23, 16] + mov w3, w20 + ldp x0, x2, [x26, 8] + ldr x1, [x26, 24] + blr x6 +.LVL74: +.LBB40: + .loc 1 262 0 +#APP +// 262 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 65536 + str w1, [x0, 256] +.LVL75: +.LBE40: +.LBB41: + .loc 1 263 0 +#APP +// 263 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 262148 + str w1, [x0, 32] +.LVL76: +.LBE41: +.LBB42: + .loc 1 264 0 +#APP +// 264 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, -65536 + str w1, [x0, 40] +.LVL77: +.LBE42: +.LBB43: + .loc 1 265 0 +#APP +// 265 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL78: +.LBE43: +.LBB44: + .loc 1 266 0 +#APP +// 266 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w22, -65534 + str w22, [x0, 36] +.LVL79: +.LBE44: +.LBB45: + .loc 1 267 0 +#APP +// 267 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 252 + str w1, [x0, 4096] +.LVL80: +.LBE45: +.LBB46: + .loc 1 268 0 +#APP +// 268 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4100] +.LVL81: +.LBE46: +.LBB47: + .loc 1 269 0 +#APP +// 269 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4104] +.LVL82: +.LBE47: +.LBB48: + .loc 1 270 0 +#APP +// 270 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w19, 65537 +.LBE48: + .loc 1 271 0 + mov w1, 2 +.LBB49: + .loc 1 270 0 + str w19, [x0, 32] +.LBE49: + .loc 1 271 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL83: + .loc 1 272 0 + tbz w0, #31, .L38 +.L40: + .loc 1 273 0 + adrp x1, .LANCHOR1 + adrp x0, .LC5 +.LVL84: + add x1, x1, :lo12:.LANCHOR1 + add x0, x0, :lo12:.LC5 +.L46: + .loc 1 406 0 + bl printf +.LVL85: +.L39: + .loc 1 442 0 + ldr x5, [x23, 24] + mov w3, w20 + ldp x0, x2, [x26, 8] + ldr x1, [x26, 24] + blr x5 +.LVL86: +.L44: + .loc 1 257 0 + mov w0, 0 + b .L35 +.LVL87: +.L38: +.LBB50: + .loc 1 277 0 +#APP +// 277 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL88: + mov w28, -65522 + str w28, [x0, 36] +.LVL89: +.LBE50: +.LBB51: + .loc 1 278 0 +#APP +// 278 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w27, 240 + str w27, [x0, 4096] +.LVL90: +.LBE51: +.LBB52: + .loc 1 279 0 +#APP +// 279 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 1 + str w1, [x0, 4100] +.LVL91: +.LBE52: +.LBB53: + .loc 1 280 0 +#APP +// 280 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w25, 122 + str w25, [x0, 4104] +.LVL92: +.LBE53: +.LBB54: + .loc 1 281 0 +#APP +// 281 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 37 + str w1, [x0, 4108] +.LVL93: +.LBE54: +.LBB55: + .loc 1 282 0 +#APP +// 282 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4112] +.LVL94: +.LBE55: +.LBB56: + .loc 1 283 0 +#APP +// 283 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4116] +.LVL95: +.LBE56: +.LBB57: + .loc 1 284 0 +#APP +// 284 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4120] +.LVL96: +.LBE57: +.LBB58: + .loc 1 285 0 +#APP +// 285 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 31 + str w1, [x0, 4124] +.LVL97: +.LBE58: +.LBB59: + .loc 1 286 0 +#APP +// 286 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 11 + str w1, [x0, 4128] +.LVL98: +.LBE59: +.LBB60: + .loc 1 287 0 +#APP +// 287 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 8 + str w1, [x0, 4132] +.LVL99: +.LBE60: +.LBB61: + .loc 1 288 0 +#APP +// 288 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4136] +.LVL100: +.LBE61: +.LBB62: + .loc 1 289 0 +#APP +// 289 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4140] +.LVL101: +.LBE62: +.LBB63: + .loc 1 290 0 +#APP +// 290 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4144] +.LBE63: +.LBB64: + .loc 1 291 0 + and w0, w20, 255 +#APP +// 291 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x1, [x26] +.LBE64: +.LBB65: + .loc 1 292 0 + ubfx x5, x24, 9, 8 +.LVL102: +.LBE65: +.LBB66: + .loc 1 291 0 + str w0, [x1, 4148] +.LBE66: +.LBB67: + .loc 1 292 0 +#APP +// 292 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w5, [x0, 4152] +.LVL103: +.LBE67: +.LBB68: + .loc 1 293 0 +#APP +// 293 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE68: + .loc 1 294 0 + mov w1, 2 +.LBB69: + .loc 1 293 0 + str w19, [x0, 32] +.LBE69: + .loc 1 294 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL104: + .loc 1 295 0 + tbnz w0, #31, .L40 +.LVL105: +.LBB70: + .loc 1 300 0 +#APP +// 300 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL106: + mov w1, -65535 + str w1, [x0, 36] +.LVL107: +.LBE70: +.LBB71: + .loc 1 301 0 +#APP +// 301 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 250 + str w1, [x0, 4096] +.LVL108: +.LBE71: +.LBB72: + .loc 1 302 0 +#APP +// 302 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 9 + str w1, [x0, 4100] +.LVL109: +.LBE72: +.LBB73: + .loc 1 303 0 +#APP +// 303 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE73: + .loc 1 304 0 + mov w1, 2 +.LBB74: + .loc 1 303 0 + str w19, [x0, 32] +.LBE74: + .loc 1 304 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL110: + .loc 1 305 0 + tbnz w0, #31, .L40 +.LVL111: +.LBB75: + .loc 1 310 0 +#APP +// 310 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL112: + mov w1, 14848 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL113: +.LBE75: +.LBB76: + .loc 1 311 0 +#APP +// 311 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w28, [x0, 36] +.LVL114: +.LBE76: +.LBB77: + .loc 1 312 0 +#APP +// 312 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w27, [x0, 4096] +.LVL115: +.LBE77: +.LBB78: + .loc 1 313 0 +#APP +// 313 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 1 + str w1, [x0, 4100] +.LVL116: +.LBE78: +.LBB79: + .loc 1 314 0 +#APP +// 314 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w25, [x0, 4104] +.LVL117: +.LBE79: +.LBB80: + .loc 1 315 0 +#APP +// 315 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 21 + str w1, [x0, 4108] +.LVL118: +.LBE80: +.LBB81: + .loc 1 316 0 +#APP +// 316 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 220 + str w1, [x0, 4112] +.LVL119: +.LBE81: +.LBB82: + .loc 1 317 0 +#APP +// 317 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 146 + str w1, [x0, 4116] +.LVL120: +.LBE82: +.LBB83: + .loc 1 318 0 +#APP +// 318 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 121 + str w1, [x0, 4120] +.LVL121: +.LBE83: +.LBB84: + .loc 1 319 0 +#APP +// 319 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 129 + str w1, [x0, 4124] +.LVL122: +.LBE84: +.LBB85: + .loc 1 320 0 +#APP +// 320 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 126 + str w1, [x0, 4128] +.LVL123: +.LBE85: +.LBB86: + .loc 1 321 0 +#APP +// 321 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 33 + str w1, [x0, 4132] +.LVL124: +.LBE86: +.LBB87: + .loc 1 322 0 +#APP +// 322 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 17 + str w1, [x0, 4136] +.LVL125: +.LBE87: +.LBB88: + .loc 1 323 0 +#APP +// 323 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 157 + str w1, [x0, 4140] +.LVL126: +.LBE88: +.LBB89: + .loc 1 324 0 +#APP +// 324 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w25, 2 + str w25, [x0, 4144] +.LVL127: +.LBE89: +.LBB90: + .loc 1 325 0 +#APP +// 325 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4148] +.LVL128: +.LBE90: +.LBB91: + .loc 1 326 0 +#APP +// 326 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 64 + str w1, [x0, 4152] +.LVL129: +.LBE91: +.LBB92: + .loc 1 327 0 +#APP +// 327 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE92: + .loc 1 328 0 + mov w1, w25 +.LBB93: + .loc 1 327 0 + str w19, [x0, 32] +.LBE93: + .loc 1 328 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL130: + .loc 1 329 0 + tbnz w0, #31, .L40 +.LVL131: +.LBB94: + .loc 1 334 0 +#APP +// 334 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL132: + str w22, [x0, 36] +.LVL133: +.LBE94: +.LBB95: + .loc 1 335 0 +#APP +// 335 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 252 + str w1, [x0, 4096] +.LVL134: +.LBE95: +.LBB96: + .loc 1 336 0 +#APP +// 336 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 10 + str w1, [x0, 4100] +.LVL135: +.LBE96: +.LBB97: + .loc 1 337 0 +#APP +// 337 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 112 + str w1, [x0, 4104] +.LVL136: +.LBE97: +.LBB98: + .loc 1 338 0 +#APP +// 338 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE98: + .loc 1 339 0 + mov w1, w25 +.LBB99: + .loc 1 338 0 + str w19, [x0, 32] +.LBE99: + .loc 1 339 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL137: + .loc 1 340 0 + tbnz w0, #31, .L40 +.LVL138: +.LBB100: + .loc 1 345 0 +#APP +// 345 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL139: + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL140: +.LBE100: +.LBB101: + .loc 1 346 0 +#APP +// 346 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w22, [x0, 36] +.LVL141: +.LBE101: +.LBB102: + .loc 1 347 0 +#APP +// 347 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 192 + str w1, [x0, 4096] +.LBE102: +.LBB103: + .loc 1 348 0 + and w1, w21, 255 +.LVL142: +#APP +// 348 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE103: +.LBB104: + .loc 1 349 0 + lsr w21, w21, 8 +.LVL143: +.LBE104: +.LBB105: + .loc 1 348 0 + str w1, [x0, 4100] +.LBE105: +.LBB106: + .loc 1 349 0 +#APP +// 349 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w21, [x0, 4104] +.LVL144: +.LBE106: +.LBB107: + .loc 1 350 0 +#APP +// 350 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE107: + .loc 1 351 0 + mov w1, w25 +.LVL145: +.LBB108: + .loc 1 350 0 + str w19, [x0, 32] +.LBE108: + .loc 1 351 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL146: + .loc 1 352 0 + tbnz w0, #31, .L40 +.LVL147: +.LBB109: + .loc 1 357 0 +#APP +// 357 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL148: + mov w1, -65535 + str w1, [x0, 36] +.LVL149: +.LBE109: +.LBB110: + .loc 1 358 0 +#APP +// 358 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 224 + str w1, [x0, 4096] +.LVL150: +.LBE110: +.LBB111: + .loc 1 359 0 +#APP +// 359 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4100] +.LVL151: +.LBE111: +.LBB112: + .loc 1 360 0 +#APP +// 360 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE112: + .loc 1 361 0 + mov w1, w25 +.LBB113: + .loc 1 360 0 + str w19, [x0, 32] +.LBE113: + .loc 1 361 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL152: + .loc 1 362 0 + tbnz w0, #31, .L40 +.LVL153: +.LBB114: + .loc 1 367 0 +#APP +// 367 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL154: + mov w22, -65535 + str w22, [x0, 36] +.LVL155: +.LBE114: +.LBB115: + .loc 1 368 0 +#APP +// 368 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 14848 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL156: +.LBE115: +.LBB116: + .loc 1 369 0 +#APP +// 369 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 255 + str w1, [x0, 4096] +.LVL157: +.LBE116: +.LBB117: + .loc 1 370 0 +#APP +// 370 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 10 + str w1, [x0, 4100] +.LVL158: +.LBE117: +.LBB118: + .loc 1 371 0 +#APP +// 371 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w21, 65537 +.LVL159: +.LBE118: + .loc 1 372 0 + mov w1, w25 +.LBB119: + .loc 1 371 0 + str w21, [x0, 32] +.LBE119: + .loc 1 372 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL160: + .loc 1 373 0 + tbnz w0, #31, .L40 +.LVL161: +.LBB120: + .loc 1 378 0 +#APP +// 378 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL162: + str w22, [x0, 36] +.LVL163: +.LBE120: +.LBB121: + .loc 1 379 0 +#APP +// 379 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 1 + str w1, [x0, 4096] +.LVL164: +.LBE121: +.LBB122: + .loc 1 380 0 +#APP +// 380 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w24, 191 +.LVL165: + str w24, [x0, 4100] +.LVL166: +.LBE122: +.LBB123: + .loc 1 381 0 +#APP +// 381 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE123: + .loc 1 382 0 + mov w1, w25 +.LBB124: + .loc 1 381 0 + str w21, [x0, 32] +.LBE124: + .loc 1 382 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL167: + .loc 1 383 0 + tbnz w0, #31, .L40 + .loc 1 388 0 + mov x0, x26 +.LVL168: + bl rockchip_secure_otp_check_flag.isra.0 +.LVL169: + .loc 1 389 0 + tbz w0, #31, .L41 + .loc 1 390 0 + adrp x1, .LANCHOR1 + adrp x0, .LC6 +.LVL170: + add x1, x1, :lo12:.LANCHOR1 + add x0, x0, :lo12:.LC6 + b .L46 +.LVL171: +.L41: +.LBB125: + .loc 1 394 0 +#APP +// 394 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL172: + str w22, [x0, 36] +.LVL173: +.LBE125: +.LBB126: + .loc 1 395 0 +#APP +// 395 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w19, 2 + str w19, [x0, 4096] +.LVL174: +.LBE126: +.LBB127: + .loc 1 396 0 +#APP +// 396 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w24, [x0, 4100] +.LVL175: +.LBE127: +.LBB128: + .loc 1 397 0 +#APP +// 397 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE128: + .loc 1 398 0 + mov w1, w19 +.LBB129: + .loc 1 397 0 + str w21, [x0, 32] +.LBE129: + .loc 1 398 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL176: + .loc 1 399 0 + tbnz w0, #31, .L40 + .loc 1 404 0 + mov x0, x26 +.LVL177: + bl rockchip_secure_otp_wait_flag.isra.1 +.LVL178: + .loc 1 405 0 + tbz w0, #31, .L42 + .loc 1 406 0 + adrp x1, .LANCHOR1 + adrp x0, .LC7 +.LVL179: + add x1, x1, :lo12:.LANCHOR1 + add x0, x0, :lo12:.LC7 + b .L46 +.LVL180: +.L42: +.LBB130: + .loc 1 410 0 +#APP +// 410 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL181: + mov w1, -65533 + str w1, [x0, 772] +.LVL182: +.LBE130: +.LBB131: + .loc 1 411 0 +#APP +// 411 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL183: +.LBE131: +.LBB132: + .loc 1 412 0 +#APP +// 412 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w22, [x0, 36] +.LVL184: +.LBE132: +.LBB133: + .loc 1 413 0 +#APP +// 413 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str w19, [x0, 4096] +.LVL185: +.LBE133: +.LBB134: + .loc 1 414 0 +#APP +// 414 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 128 + str w1, [x0, 4100] +.LVL186: +.LBE134: +.LBB135: + .loc 1 415 0 +#APP +// 415 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE135: + .loc 1 416 0 + mov w1, w19 +.LBB136: + .loc 1 415 0 + str w21, [x0, 32] +.LBE136: + .loc 1 416 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL187: + .loc 1 417 0 + tbnz w0, #31, .L40 +.LVL188: +.LBB137: + .loc 1 422 0 +#APP +// 422 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL189: + str w22, [x0, 36] +.LVL190: +.LBE137: +.LBB138: + .loc 1 423 0 +#APP +// 423 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 160 + str w1, [x0, 4096] +.LVL191: +.LBE138: +.LBB139: + .loc 1 424 0 +#APP +// 424 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + str wzr, [x0, 4100] +.LVL192: +.LBE139: +.LBB140: + .loc 1 425 0 +#APP +// 425 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE140: + .loc 1 426 0 + mov w1, w19 +.LBB141: + .loc 1 425 0 + str w21, [x0, 32] +.LBE141: + .loc 1 426 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL193: + .loc 1 427 0 + tbnz w0, #31, .L40 +.LVL194: +.LBB142: + .loc 1 432 0 +#APP +// 432 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LVL195: + mov w1, 250 + str w1, [x0, 4096] +.LVL196: +.LBE142: +.LBB143: + .loc 1 433 0 +#APP +// 433 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] + mov w1, 9 + str w1, [x0, 4100] +.LVL197: +.LBE143: +.LBB144: + .loc 1 434 0 +#APP +// 434 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x26] +.LBE144: + .loc 1 435 0 + mov w1, w19 +.LBB145: + .loc 1 434 0 + str w21, [x0, 32] +.LBE145: + .loc 1 435 0 + mov x0, x26 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL198: + .loc 1 436 0 + tbz w0, #31, .L39 + b .L40 + .cfi_endproc +.LFE269: + .size rk3562_secure_otp_write_2_bytes_noecc, .-rk3562_secure_otp_write_2_bytes_noecc + .section .text.rockchip_secure_otp_ecc_enable,"ax",@progbits + .align 2 + .type rockchip_secure_otp_ecc_enable, %function +rockchip_secure_otp_ecc_enable: +.LFB267: + .loc 1 154 0 + .cfi_startproc +.LVL199: + stp x29, x30, [sp, -32]! + .cfi_def_cfa_offset 32 + .cfi_offset 29, -32 + .cfi_offset 30, -24 + and w1, w1, 255 + add x29, sp, 0 + .cfi_def_cfa_register 29 + str x19, [sp, 16] + .cfi_offset 19, -16 +.LBB160: + .loc 1 157 0 +#APP +// 157 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x2, [x0] + mov w3, 512 + movk w3, 0xff00, lsl 16 + str w3, [x2, 32] +.LVL200: +.LBE160: +.LBB161: + .loc 1 158 0 +#APP +// 158 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x2, [x0] + mov w3, -65535 + str w3, [x2, 36] +.LVL201: +.LBE161: +.LBB162: + .loc 1 159 0 +#APP +// 159 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x2, [x0] + mov w3, 250 + str w3, [x2, 4096] +.LBE162: + .loc 1 160 0 + cbz w1, .L48 +.LVL202: +.LBB163: + .loc 1 161 0 +#APP +// 161 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x1, [x0] +.LVL203: + str wzr, [x1, 4100] +.LVL204: +.L49: +.LBE163: +.LBB164: + .loc 1 165 0 +#APP +// 165 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x1, [x0] + mov w2, 65537 + str w2, [x1, 32] +.LBE164: + .loc 1 167 0 + mov w1, 2 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL205: + mov w19, w0 +.LVL206: + .loc 1 168 0 + tbz w0, #31, .L47 +.LVL207: +.LBB165: +.LBB166: + .loc 1 169 0 + adrp x1, .LANCHOR2 + adrp x0, .LC8 +.LVL208: + add x1, x1, :lo12:.LANCHOR2 + add x0, x0, :lo12:.LC8 + bl printf +.LVL209: +.L47: +.LBE166: +.LBE165: + .loc 1 172 0 + mov w0, w19 + ldr x19, [sp, 16] +.LVL210: + ldp x29, x30, [sp], 32 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 19 + .cfi_def_cfa 31, 0 + ret +.LVL211: +.L48: + .cfi_restore_state +.LBB167: + .loc 1 163 0 +#APP +// 163 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x1, [x0] + mov w2, 9 + str w2, [x1, 4100] + b .L49 +.LBE167: + .cfi_endproc +.LFE267: + .size rockchip_secure_otp_ecc_enable, .-rockchip_secure_otp_ecc_enable + .section .text.rk3562_secure_otp_read,"ax",@progbits + .align 2 + .type rk3562_secure_otp_read, %function +rk3562_secure_otp_read: +.LFB268: + .loc 1 176 0 + .cfi_startproc +.LVL212: + stp x29, x30, [sp, -80]! + .cfi_def_cfa_offset 80 + .cfi_offset 29, -80 + .cfi_offset 30, -72 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -64 + .cfi_offset 20, -56 + .loc 1 183 0 + asr w19, w1, 1 + .loc 1 176 0 + stp x21, x22, [sp, 32] + .cfi_offset 21, -48 + .cfi_offset 22, -40 + mov x21, x2 + stp x23, x24, [sp, 48] + mov x22, x0 + .cfi_offset 23, -32 + .cfi_offset 24, -24 + mov w23, w3 + str x25, [sp, 64] + .cfi_offset 25, -16 + .loc 1 177 0 + bl dev_get_platdata +.LVL213: + mov x20, x0 +.LVL214: + .loc 1 178 0 + mov x0, x22 +.LVL215: + bl dev_get_driver_data +.LVL216: + .loc 1 184 0 + ldr x4, [x0, 16] + .loc 1 178 0 + mov x24, x0 +.LVL217: + .loc 1 184 0 + ldr x1, [x20, 24] + mov w3, w19 + ldp x0, x2, [x20, 8] +.LVL218: + blr x4 +.LVL219: + .loc 1 187 0 + sub w1, w19, #16 + sub w0, w19, #416 + cmp w1, 15 + ccmp w0, 31, 0, hi + bhi .L53 + .loc 1 188 0 + mov w1, 0 +.L65: + .loc 1 190 0 + mov x0, x20 + bl rockchip_secure_otp_ecc_enable +.LVL220: +.LBB168: + .loc 1 192 0 +#APP +// 192 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x20] + mov w25, 65537 +.LBE168: + .loc 1 181 0 + mov w22, 0 +.LVL221: +.LBB169: + .loc 1 192 0 + str w25, [x0, 256] +.LBE169: + .loc 1 193 0 + mov x0, 50 + bl udelay +.LVL222: +.L55: + .loc 1 194 0 + cbz w23, .L60 + .loc 1 196 0 + cmp w19, 447 + ble .L56 + .loc 1 197 0 + adrp x0, .LC9 + mov w1, w19 + add x0, x0, :lo12:.LC9 +.L66: + .loc 1 205 0 + mov w22, -1 +.LVL223: + .loc 1 204 0 + bl printf +.LVL224: +.L52: + .loc 1 235 0 + mov w0, w22 + ldr x25, [sp, 64] + ldp x19, x20, [sp, 16] +.LVL225: + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] +.LVL226: + ldp x29, x30, [sp], 80 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 25 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 + ret +.LVL227: +.L53: + .cfi_restore_state + .loc 1 190 0 + mov w1, 1 + b .L65 +.LVL228: +.L56: + .loc 1 201 0 + sub w0, w19, #192 + cmp w0, 31 + ccmp w19, 16, 4, hi + beq .L58 + .loc 1 201 0 is_stmt 0 discriminator 1 + sub w0, w19, #416 + cmp w0, 15 + bls .L58 + .loc 1 204 0 is_stmt 1 + adrp x0, .LC10 + lsl w1, w19, 1 + add x0, x0, :lo12:.LC10 + b .L66 +.L58: +.LBB170: + .loc 1 208 0 + orr w1, w19, -65536 +.LVL229: +#APP +// 208 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x20] +.LBE170: + .loc 1 209 0 + add w19, w19, 1 +.LVL230: +.LBB171: + .loc 1 208 0 + str w1, [x0, 260] +.LBE171: +.LBB172: + .loc 1 210 0 +#APP +// 210 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x20] +.LBE172: + .loc 1 212 0 + mov w1, 4 +.LVL231: +.LBB173: + .loc 1 210 0 + str w25, [x0, 264] +.LVL232: +.LBE173: + .loc 1 212 0 + mov x0, x20 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL233: + mov w22, w0 +.LVL234: + .loc 1 213 0 + tbz w0, #31, .L59 + .loc 1 214 0 + adrp x1, .LANCHOR3 + adrp x0, .LC11 +.LVL235: + add x1, x1, :lo12:.LANCHOR3 + add x0, x0, :lo12:.LC11 + bl printf +.LVL236: +.L60: +.LBB174: + .loc 1 228 0 +#APP +// 228 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x20] + mov w1, 65536 +.LBE174: + .loc 1 230 0 + ldr x2, [x20, 16] + mov w3, w19 + ldr x4, [x24, 24] +.LBB175: + .loc 1 228 0 + str w1, [x0, 256] +.LBE175: + .loc 1 230 0 + ldr x0, [x20, 8] + ldr x1, [x20, 24] + blr x4 +.LVL237: + .loc 1 234 0 + b .L52 +.LVL238: +.L59: +.LBB176: + .loc 1 218 0 + ldr x0, [x20] +.LVL239: + ldrh w0, [x0, 292] + and w0, w0, 65535 +.LVL240: +#APP +// 218 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +.LVL241: +#NO_APP +.LBE176: + .loc 1 220 0 + strb w0, [x21] + .loc 1 221 0 + cmp w23, 1 + beq .L60 +.LVL242: + .loc 1 222 0 + lsr w0, w0, 8 +.LVL243: + .loc 1 223 0 + sub w23, w23, #2 +.LVL244: + .loc 1 222 0 + strb w0, [x21, 1] + add x21, x21, 2 +.LVL245: + b .L55 + .cfi_endproc +.LFE268: + .size rk3562_secure_otp_read, .-rk3562_secure_otp_read + .section .text.rk3562_secure_otp_write,"ax",@progbits + .align 2 + .type rk3562_secure_otp_write, %function +rk3562_secure_otp_write: +.LFB272: + .loc 1 621 0 + .cfi_startproc +.LVL246: + stp x29, x30, [sp, -144]! + .cfi_def_cfa_offset 144 + .cfi_offset 29, -144 + .cfi_offset 30, -136 + add x29, sp, 0 + .cfi_def_cfa_register 29 + stp x19, x20, [sp, 16] + .cfi_offset 19, -128 + .cfi_offset 20, -120 + mov w20, w1 + stp x21, x22, [sp, 32] + .cfi_offset 21, -112 + .cfi_offset 22, -104 + mov w21, w3 + stp x23, x24, [sp, 48] + .cfi_offset 23, -96 + .cfi_offset 24, -88 + mov x24, x0 + stp x27, x28, [sp, 80] + stp x25, x26, [sp, 64] + .cfi_offset 27, -64 + .cfi_offset 28, -56 + .cfi_offset 25, -80 + .cfi_offset 26, -72 + .loc 1 621 0 + str x2, [x29, 112] + .loc 1 622 0 + bl dev_get_platdata +.LVL247: + mov x28, x0 +.LVL248: + .loc 1 625 0 + sxtw x0, w21 +.LVL249: + bl malloc_simple +.LVL250: + .loc 1 628 0 + cbnz x0, .L68 +.LVL251: +.L115: + .loc 1 643 0 + mov w27, -1 +.LVL252: +.L67: + .loc 1 669 0 + mov w0, w27 + ldp x19, x20, [sp, 16] +.LVL253: + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] +.LVL254: + ldp x25, x26, [sp, 64] + ldp x27, x28, [sp, 80] +.LVL255: + ldp x29, x30, [sp], 144 + .cfi_remember_state + .cfi_restore 30 + .cfi_restore 29 + .cfi_restore 27 + .cfi_restore 28 + .cfi_restore 25 + .cfi_restore 26 + .cfi_restore 23 + .cfi_restore 24 + .cfi_restore 21 + .cfi_restore 22 + .cfi_restore 19 + .cfi_restore 20 + .cfi_def_cfa 31, 0 +.LVL256: + ret +.LVL257: +.L68: + .cfi_restore_state + mov x19, x0 + .loc 1 631 0 + sub w0, w20, #384 +.LVL258: + cmp w0, 63 + bls .L70 +.LVL259: +.L77: + .loc 1 649 0 + sub w1, w20, #832 + sub w0, w20, #32 + cmp w1, 63 + ccmp w0, 31, 0, hi + bls .L71 + .loc 1 659 0 + mov w0, 2 +.LBB244: +.LBB245: + .loc 1 607 0 + adrp x19, .LANCHOR4 +.LVL260: + add x19, x19, :lo12:.LANCHOR4 +.LBE245: +.LBE244: + .loc 1 659 0 + mov x23, 0 + sdiv w0, w21, w0 + str w0, [x29, 108] +.LVL261: +.L78: + .loc 1 659 0 is_stmt 0 discriminator 1 + ldr w0, [x29, 108] + cmp w0, w23 + ble .L97 + .loc 1 660 0 is_stmt 1 + ldr x0, [x29, 112] + add w21, w20, w23, lsl 1 +.LBB324: +.LBB320: + .loc 1 477 0 + asr w25, w21, 1 +.LBE320: +.LBE324: + .loc 1 660 0 + ldrh w26, [x0, x23, lsl 1] +.LVL262: +.LBB325: +.LBB321: + .loc 1 475 0 + mov x0, x24 + bl dev_get_driver_data +.LVL263: + str x0, [x29, 120] +.LVL264: + .loc 1 478 0 + cmp w25, 447 + bgt .L99 + .loc 1 482 0 + sub w0, w25, #192 +.LVL265: + cmp w0, 31 + bls .L85 + .loc 1 485 0 + adrp x0, .LC4 + and w1, w21, -2 + add x0, x0, :lo12:.LC4 + bl printf +.LVL266: +.L99: + .loc 1 478 0 + mov w27, -1 + b .L84 +.LVL267: +.L70: +.LBE321: +.LBE325: + .loc 1 633 0 + mov w3, w21 + mov x2, x19 + mov w1, w20 + mov x0, x24 + bl rk3562_secure_otp_read +.LVL268: + .loc 1 634 0 + cbnz w0, .L115 + mov x0, 0 +.LVL269: +.L75: + .loc 1 639 0 discriminator 1 + cmp w21, w0 + ble .L77 + add x0, x0, 1 +.LVL270: + .loc 1 640 0 + add x1, x19, x0 + ldrb w1, [x1, -1] + cbz w1, .L75 + .loc 1 641 0 + adrp x0, .LC12 + add x0, x0, :lo12:.LC12 + bl printf +.LVL271: + b .L115 +.LVL272: +.L83: +.LBB326: +.LBB327: + .loc 1 455 0 + adds w25, w20, w19 +.LBE327: +.LBE326: + .loc 1 652 0 + ldr x0, [x29, 112] +.LBB332: +.LBB328: + .loc 1 455 0 + and w26, w25, 1 + mov w3, 2 + csneg w22, w26, w26, pl + add x2, x29, 142 + sub w22, w25, w22 +.LBE328: +.LBE332: + .loc 1 652 0 + ldrb w23, [x0, x19] +.LVL273: +.LBB333: +.LBB329: + .loc 1 455 0 + mov w1, w22 + mov x0, x24 + bl rk3562_secure_otp_read +.LVL274: + .loc 1 456 0 + cbnz w0, .L79 + ldrh w3, [x29, 142] + .loc 1 459 0 + cbnz w26, .L80 +.LVL275: + .loc 1 461 0 + bic w3, w23, w3 + mov w2, w25 +.LVL276: +.L112: + .loc 1 464 0 + mov x1, x28 + mov x0, x24 +.LVL277: + add x19, x19, 1 +.LVL278: + bl rk3562_secure_otp_write_2_bytes_noecc +.LVL279: + mov w27, w0 +.LVL280: +.LBE329: +.LBE333: + .loc 1 653 0 + cbz w0, .L82 +.L98: + .loc 1 654 0 + adrp x0, .LC13 + add x0, x0, :lo12:.LC13 +.LVL281: +.L114: + .loc 1 662 0 + bl printf +.LVL282: + .loc 1 663 0 + b .L67 +.LVL283: +.L80: +.LBB334: +.LBB330: + .loc 1 463 0 + lsl w23, w23, 8 +.LVL284: + .loc 1 464 0 + mov w2, w22 + bic w3, w23, w3 + b .L112 +.LVL285: +.L71: +.LBE330: +.LBE334: + mov x19, 0 +.LVL286: +.L82: + .loc 1 651 0 discriminator 1 + cmp w21, w19 + bgt .L83 +.LVL287: +.L97: + .loc 1 629 0 + mov w27, 0 + b .L67 +.LVL288: +.L85: +.LBB335: +.LBB322: + .loc 1 489 0 + cbz w26, .L86 + .loc 1 492 0 + ldr x0, [x29, 120] + mov w3, w25 + ldp x2, x1, [x28, 16] + ldr x5, [x0, 16] + ldr x0, [x28, 8] + blr x5 +.LVL289: +.LBB246: + .loc 1 495 0 +#APP +// 495 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 65536 + str w1, [x0, 256] +.LVL290: +.LBE246: +.LBB247: + .loc 1 496 0 +#APP +// 496 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 262148 + str w1, [x0, 32] +.LVL291: +.LBE247: +.LBB248: + .loc 1 497 0 +#APP +// 497 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65536 + str w1, [x0, 40] +.LVL292: +.LBE248: +.LBB249: + .loc 1 498 0 +#APP +// 498 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL293: +.LBE249: +.LBB250: + .loc 1 499 0 +#APP +// 499 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65522 + str w1, [x0, 36] +.LVL294: +.LBE250: +.LBB251: + .loc 1 500 0 +#APP +// 500 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w3, 240 + str w3, [x29, 100] +.LVL295: + str w3, [x0, 4096] +.LBE251: +.LBB252: + .loc 1 501 0 +#APP +// 501 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 1 + str w1, [x0, 4100] +.LVL296: +.LBE252: +.LBB253: + .loc 1 502 0 +#APP +// 502 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w2, 122 + str w2, [x29, 104] +.LVL297: + str w2, [x0, 4104] +.LBE253: +.LBB254: + .loc 1 503 0 +#APP +// 503 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 37 + str w1, [x0, 4108] +.LVL298: +.LBE254: +.LBB255: + .loc 1 504 0 +#APP +// 504 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4112] +.LVL299: +.LBE255: +.LBB256: + .loc 1 505 0 +#APP +// 505 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4116] +.LVL300: +.LBE256: +.LBB257: + .loc 1 506 0 +#APP +// 506 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4120] +.LVL301: +.LBE257: +.LBB258: + .loc 1 507 0 +#APP +// 507 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 31 + str w1, [x0, 4124] +.LVL302: +.LBE258: +.LBB259: + .loc 1 508 0 +#APP +// 508 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 11 + str w1, [x0, 4128] +.LVL303: +.LBE259: +.LBB260: + .loc 1 509 0 +#APP +// 509 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 8 + str w1, [x0, 4132] +.LVL304: +.LBE260: +.LBB261: + .loc 1 510 0 +#APP +// 510 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4136] +.LVL305: +.LBE261: +.LBB262: + .loc 1 511 0 +#APP +// 511 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4140] +.LVL306: +.LBE262: +.LBB263: + .loc 1 512 0 +#APP +// 512 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4144] +.LVL307: +.LBE263: +.LBB264: + .loc 1 513 0 +#APP +// 513 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE264: +.LBB265: + .loc 1 514 0 + ubfx x21, x21, 9, 8 +.LVL308: +.LBE265: +.LBB266: + .loc 1 513 0 + str w25, [x0, 4148] +.LBE266: +.LBB267: + .loc 1 514 0 +#APP +// 514 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str w21, [x0, 4152] +.LVL309: +.LBE267: +.LBB268: + .loc 1 515 0 +#APP +// 515 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w22, 65537 +.LBE268: + .loc 1 516 0 + mov w1, 2 +.LBB269: + .loc 1 515 0 + str w22, [x0, 32] +.LBE269: + .loc 1 516 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL310: + mov w27, w0 +.LVL311: + .loc 1 517 0 + ldp w3, w2, [x29, 100] + tbz w0, #31, .L87 + .loc 1 518 0 + adrp x0, .LC5 +.LVL312: + mov x1, x19 + add x0, x0, :lo12:.LC5 +.LVL313: +.L113: + .loc 1 607 0 + bl printf +.LVL314: +.L88: +.LBB270: + .loc 1 612 0 +#APP +// 612 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65533 +.LBE270: + .loc 1 613 0 + ldr x2, [x28, 16] + mov w3, w25 +.LBB271: + .loc 1 612 0 + str w1, [x0, 772] +.LBE271: + .loc 1 613 0 + ldr x0, [x29, 120] + ldr x1, [x28, 24] + ldr x6, [x0, 24] + ldr x0, [x28, 8] + blr x6 +.LVL315: +.LBE322: +.LBE335: + .loc 1 661 0 + cbz w27, .L86 +.LVL316: +.L84: + .loc 1 662 0 + adrp x0, .LC20 + add x0, x0, :lo12:.LC20 + b .L114 +.LVL317: +.L87: +.LBB336: +.LBB323: +.LBB272: + .loc 1 522 0 +#APP +// 522 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL318: + mov w1, 14848 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL319: +.LBE272: +.LBB273: + .loc 1 523 0 +#APP +// 523 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str w3, [x0, 4096] +.LVL320: +.LBE273: +.LBB274: + .loc 1 524 0 +#APP +// 524 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 1 + str w1, [x0, 4100] +.LVL321: +.LBE274: +.LBB275: + .loc 1 525 0 +#APP +// 525 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str w2, [x0, 4104] +.LVL322: +.LBE275: +.LBB276: + .loc 1 526 0 +#APP +// 526 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 21 + str w1, [x0, 4108] +.LVL323: +.LBE276: +.LBB277: + .loc 1 527 0 +#APP +// 527 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 220 + str w1, [x0, 4112] +.LVL324: +.LBE277: +.LBB278: + .loc 1 528 0 +#APP +// 528 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 146 + str w1, [x0, 4116] +.LVL325: +.LBE278: +.LBB279: + .loc 1 529 0 +#APP +// 529 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 121 + str w1, [x0, 4120] +.LVL326: +.LBE279: +.LBB280: + .loc 1 530 0 +#APP +// 530 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 129 + str w1, [x0, 4124] +.LVL327: +.LBE280: +.LBB281: + .loc 1 531 0 +#APP +// 531 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 126 + str w1, [x0, 4128] +.LVL328: +.LBE281: +.LBB282: + .loc 1 532 0 +#APP +// 532 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 33 + str w1, [x0, 4132] +.LVL329: +.LBE282: +.LBB283: + .loc 1 533 0 +#APP +// 533 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 17 + str w1, [x0, 4136] +.LVL330: +.LBE283: +.LBB284: + .loc 1 534 0 +#APP +// 534 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 157 + str w1, [x0, 4140] +.LVL331: +.LBE284: +.LBB285: + .loc 1 535 0 +#APP +// 535 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w21, 2 +.LVL332: + str w21, [x0, 4144] +.LVL333: +.LBE285: +.LBB286: + .loc 1 536 0 +#APP +// 536 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4148] +.LVL334: +.LBE286: +.LBB287: + .loc 1 537 0 +#APP +// 537 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4152] +.LVL335: +.LBE287: +.LBB288: + .loc 1 538 0 +#APP +// 538 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE288: + .loc 1 539 0 + mov w1, w21 +.LBB289: + .loc 1 538 0 + str w22, [x0, 32] +.LBE289: + .loc 1 539 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL336: + mov w27, w0 +.LVL337: + .loc 1 540 0 + tbz w0, #31, .L89 + .loc 1 541 0 + adrp x0, .LC14 +.LVL338: + mov x1, x19 + add x0, x0, :lo12:.LC14 + b .L113 +.LVL339: +.L89: +.LBB290: + .loc 1 545 0 +#APP +// 545 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL340: + mov w1, 512 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL341: +.LBE290: +.LBB291: + .loc 1 546 0 +#APP +// 546 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65535 + str w1, [x0, 36] +.LVL342: +.LBE291: +.LBB292: + .loc 1 547 0 +#APP +// 547 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 251 + str w1, [x0, 4096] +.LVL343: +.LBE292: +.LBB293: + .loc 1 548 0 +#APP +// 548 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4100] +.LVL344: +.LBE293: +.LBB294: + .loc 1 549 0 +#APP +// 549 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE294: + .loc 1 550 0 + mov w1, w21 +.LBB295: + .loc 1 549 0 + str w22, [x0, 32] +.LBE295: + .loc 1 550 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL345: + mov w27, w0 +.LVL346: + .loc 1 551 0 + tbz w0, #31, .L90 + .loc 1 552 0 + adrp x0, .LC15 +.LVL347: + mov x1, x19 + add x0, x0, :lo12:.LC15 + b .L113 +.LVL348: +.L90: +.LBB296: + .loc 1 556 0 +#APP +// 556 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL349: + mov w1, -65534 + str w1, [x0, 36] +.LVL350: +.LBE296: +.LBB297: + .loc 1 557 0 +#APP +// 557 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 192 + str w1, [x0, 4096] +.LBE297: +.LBB298: + .loc 1 558 0 + and w1, w26, 255 +.LVL351: +#APP +// 558 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE298: +.LBB299: + .loc 1 559 0 + lsr w26, w26, 8 +.LVL352: +.LBE299: +.LBB300: + .loc 1 558 0 + str w1, [x0, 4100] +.LBE300: +.LBB301: + .loc 1 559 0 +#APP +// 559 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str w26, [x0, 4104] +.LVL353: +.LBE301: +.LBB302: + .loc 1 560 0 +#APP +// 560 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE302: + .loc 1 561 0 + mov w1, w21 +.LVL354: +.LBB303: + .loc 1 560 0 + str w22, [x0, 32] +.LBE303: + .loc 1 561 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL355: + mov w27, w0 +.LVL356: + .loc 1 562 0 + tbz w0, #31, .L91 + .loc 1 563 0 + adrp x0, .LC16 +.LVL357: + mov x1, x19 + add x0, x0, :lo12:.LC16 + b .L113 +.LVL358: +.L91: +.LBB304: + .loc 1 567 0 +#APP +// 567 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL359: + mov w1, 14848 + movk w1, 0xff00, lsl 16 + str w1, [x0, 32] +.LVL360: +.LBE304: +.LBB305: + .loc 1 568 0 +#APP +// 568 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, -65535 + str w1, [x0, 36] +.LVL361: +.LBE305: +.LBB306: + .loc 1 569 0 +#APP +// 569 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 255 + str w1, [x0, 4096] +.LVL362: +.LBE306: +.LBB307: + .loc 1 570 0 +#APP +// 570 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 10 + str w1, [x0, 4100] +.LVL363: +.LBE307: +.LBB308: + .loc 1 571 0 +#APP +// 571 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE308: + .loc 1 572 0 + mov w1, w21 +.LBB309: + .loc 1 571 0 + str w22, [x0, 32] +.LBE309: + .loc 1 572 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL364: + mov w27, w0 +.LVL365: + .loc 1 573 0 + tbz w0, #31, .L92 + .loc 1 574 0 + adrp x0, .LC17 +.LVL366: + mov x1, x19 + add x0, x0, :lo12:.LC17 + b .L113 +.LVL367: +.L92: +.LBB310: + .loc 1 578 0 +#APP +// 578 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL368: + mov w1, -65534 + str w1, [x0, 36] +.LVL369: +.LBE310: +.LBB311: + .loc 1 579 0 +#APP +// 579 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 1 + str w1, [x0, 4096] +.LVL370: +.LBE311: +.LBB312: + .loc 1 580 0 +#APP +// 580 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 191 + str w1, [x0, 4100] +.LVL371: +.LBE312: +.LBB313: + .loc 1 581 0 +#APP +// 581 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + str wzr, [x0, 4104] +.LVL372: +.LBE313: +.LBB314: + .loc 1 582 0 +#APP +// 582 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LBE314: + .loc 1 583 0 + mov w1, w21 +.LBB315: + .loc 1 582 0 + str w22, [x0, 32] +.LBE315: + .loc 1 583 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL373: + mov w27, w0 +.LVL374: + .loc 1 584 0 + tbz w0, #31, .L93 + .loc 1 585 0 + adrp x0, .LC18 +.LVL375: + mov x1, x19 + add x0, x0, :lo12:.LC18 + b .L113 +.LVL376: +.L93: + .loc 1 589 0 + mov x0, x28 +.LVL377: + bl rockchip_secure_otp_check_flag.isra.0 +.LVL378: + mov w27, w0 +.LVL379: + .loc 1 590 0 + tbz w0, #31, .L94 + .loc 1 591 0 + adrp x0, .LC6 +.LVL380: + mov x1, x19 + add x0, x0, :lo12:.LC6 + b .L113 +.LVL381: +.L94: +.LBB316: + .loc 1 595 0 +#APP +// 595 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] +.LVL382: + mov w1, -65535 + str w1, [x0, 36] +.LVL383: +.LBE316: +.LBB317: + .loc 1 596 0 +#APP +// 596 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w1, 2 + str w1, [x0, 4096] +.LVL384: +.LBE317: +.LBB318: + .loc 1 597 0 +#APP +// 597 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w2, 191 + str w2, [x0, 4100] +.LVL385: +.LBE318: +.LBB319: + .loc 1 598 0 +#APP +// 598 "drivers/misc/rk3562-secure-otp.c" 1 + dmb sy +// 0 "" 2 +#NO_APP + ldr x0, [x28] + mov w2, 65537 + str w2, [x0, 32] +.LBE319: + .loc 1 599 0 + mov x0, x28 + bl rockchip_secure_otp_wait_status.isra.2 +.LVL386: + mov w27, w0 +.LVL387: + .loc 1 600 0 + tbz w0, #31, .L95 + .loc 1 601 0 + adrp x0, .LC19 +.LVL388: + mov x1, x19 + add x0, x0, :lo12:.LC19 + b .L113 +.LVL389: +.L95: + .loc 1 605 0 + mov x0, x28 +.LVL390: + bl rockchip_secure_otp_wait_flag.isra.1 +.LVL391: + mov w27, w0 +.LVL392: + .loc 1 606 0 + tbz w0, #31, .L88 + .loc 1 607 0 + adrp x0, .LC7 +.LVL393: + mov x1, x19 + add x0, x0, :lo12:.LC7 + b .L113 +.LVL394: +.L86: + add x23, x23, 1 +.LVL395: + b .L78 +.LVL396: +.L79: +.LBE323: +.LBE336: +.LBB337: +.LBB331: + .loc 1 457 0 + mov w27, -1 + b .L98 +.LBE331: +.LBE337: + .cfi_endproc +.LFE272: + .size rk3562_secure_otp_write, .-rk3562_secure_otp_write + .global _u_boot_list_2_driver_2_rockchip_secure_otp + .section .rodata.__func__.7582,"a",@progbits + .align 3 + .set .LANCHOR0,. + 0 + .type __func__.7582, %object + .size __func__.7582, 32 +__func__.7582: + .string "rockchip_secure_otp_wait_status" + .section .rodata.__func__.7625,"a",@progbits + .align 3 + .set .LANCHOR2,. + 0 + .type __func__.7625, %object + .size __func__.7625, 31 +__func__.7625: + .string "rockchip_secure_otp_ecc_enable" + .section .rodata.__func__.7643,"a",@progbits + .align 3 + .set .LANCHOR3,. + 0 + .type __func__.7643, %object + .size __func__.7643, 23 +__func__.7643: + .string "rk3562_secure_otp_read" + .section .rodata.__func__.7678,"a",@progbits + .align 3 + .set .LANCHOR1,. + 0 + .type __func__.7678, %object + .size __func__.7678, 38 +__func__.7678: + .string "rk3562_secure_otp_write_2_bytes_noecc" + .section .rodata.__func__.7899,"a",@progbits + .align 3 + .set .LANCHOR4,. + 0 + .type __func__.7899, %object + .size __func__.7899, 32 +__func__.7899: + .string "rk3562_secure_otp_write_2_bytes" + .section .rodata.rk3562_data,"a",@progbits + .align 3 + .type rk3562_data, %object + .size rk3562_data, 32 +rk3562_data: + .xword rk3562_secure_otp_read + .xword rk3562_secure_otp_write + .xword rk3562_spl_rockchip_otp_start + .xword rk3562_spl_rockchip_otp_stop + .section .rodata.rk3562_secure_otp_read.str1.1,"aMS",@progbits,1 +.LC9: + .string "do not access non secure area, half word offset = %d\n" +.LC10: + .string "Please input correct addr, offset(bytes) is 0x%x\n" +.LC11: + .string "%s timeout during read setup\n" + .section .rodata.rk3562_secure_otp_write.str1.1,"aMS",@progbits,1 +.LC12: + .string "The zone is written.\n" +.LC13: + .string "rk3562_secure_otp_write_byte_noecc error\n" +.LC14: + .string "%s timeout during write setup 2\n" +.LC15: + .string "%s timeout during write setup 3\n" +.LC16: + .string "%s timeout during write setup 4\n" +.LC17: + .string "%s timeout during write setup 5\n" +.LC18: + .string "%s timeout during write setup 6\n" +.LC19: + .string "%s timeout during write setup 8\n" +.LC20: + .string "rk3562_secure_otp_write_2_bytes error\n" + .section .rodata.rk3562_secure_otp_write_2_bytes_noecc.str1.1,"aMS",@progbits,1 +.LC4: + .string "Please input correct addr, offset is 0x%x\n" +.LC5: + .string "%s timeout during write setup 1\n" +.LC6: + .string "%s timeout during write setup 7\n" +.LC7: + .string "%s timeout during write setup 9\n" + .section .rodata.rockchip_otp_ids,"a",@progbits + .align 3 + .type rockchip_otp_ids, %object + .size rockchip_otp_ids, 32 +rockchip_otp_ids: + .xword .LC22 + .xword rk3562_data + .zero 16 + .section .rodata.rockchip_secure_otp_ecc_enable.str1.1,"aMS",@progbits,1 +.LC8: + .string "%s timeout during ecc_enable\n" + .section .rodata.rockchip_secure_otp_ofdata_to_platdata.str1.1,"aMS",@progbits,1 +.LC0: + .string "secure_conf" +.LC1: + .string "mask_addr" +.LC2: + .string "cru_rst_addr" + .section .rodata.rockchip_secure_otp_ops,"a",@progbits + .align 3 + .type rockchip_secure_otp_ops, %object + .size rockchip_secure_otp_ops, 32 +rockchip_secure_otp_ops: + .xword secure_otp_read + .xword secure_otp_write + .xword secure_otp_ioctl + .zero 8 + .section .rodata.rockchip_secure_otp_wait_status.isra.2.str1.1,"aMS",@progbits,1 +.LC3: + .string "%s: wait init status timeout\n" + .section .rodata.str1.1,"aMS",@progbits,1 +.LC21: + .string "rockchip_secure_otp" +.LC22: + .string "rockchip,rk3562-secure-otp" + .section .u_boot_list_2_driver_2_rockchip_secure_otp,"aw",@progbits + .align 2 + .type _u_boot_list_2_driver_2_rockchip_secure_otp, %object + .size _u_boot_list_2_driver_2_rockchip_secure_otp, 120 +_u_boot_list_2_driver_2_rockchip_secure_otp: + .8byte .LC21 + .word 36 + .zero 4 + .8byte rockchip_otp_ids + .zero 32 + .8byte rockchip_secure_otp_ofdata_to_platdata + .zero 28 + .word 32 + .zero 8 + .8byte rockchip_secure_otp_ops + .zero 8 + .text +.Letext0: + .file 2 "include/common.h" + .file 3 "./arch/arm/include/asm/types.h" + .file 4 "include/linux/types.h" + .file 5 "include/errno.h" + .file 6 "include/linux/string.h" + .file 7 "include/efi.h" + .file 8 "include/dm/device.h" + .file 9 "include/ide.h" + .file 10 "include/linux/list.h" + .file 11 "include/part.h" + .file 12 "include/flash.h" + .file 13 "include/lmb.h" + .file 14 "include/asm-generic/u-boot.h" + .file 15 "./arch/arm/include/asm/u-boot-arm.h" + .file 16 "include/linux/libfdt_env.h" + .file 17 "include/linux/../../scripts/dtc/libfdt/fdt.h" + .file 18 "include/linux/libfdt.h" + .file 19 "include/image.h" + .file 20 "./arch/arm/include/asm/global_data.h" + .file 21 "include/asm-generic/global_data.h" + .file 22 "include/dm/of.h" + .file 23 "include/net.h" + .file 24 "include/dm/uclass-id.h" + .file 25 "include/dm/ofnode.h" + .file 26 "include/malloc.h" + .file 27 "include/linux/compat.h" + .file 28 "include/dm/uclass.h" + .file 29 "include/asm-generic/ioctl.h" + .file 30 "include/misc.h" + .file 31 "include/rockchip-otp.h" + .file 32 "include/dm/read.h" + .file 33 "include/stdio.h" + .file 34 "include/linux/delay.h" + .file 35 "include/log.h" + .section .debug_info,"",@progbits +.Ldebug_info0: + .4byte 0x42d6 + .2byte 0x4 + .4byte .Ldebug_abbrev0 + .byte 0x8 + .uleb128 0x1 + .4byte .LASF459 + .byte 0xc + .4byte .LASF460 + .4byte .LASF461 + .4byte .Ldebug_ranges0+0x6c0 + .8byte 0 + .4byte .Ldebug_line0 + .uleb128 0x2 + .4byte .LASF4 + .byte 0x2 + .byte 0xd + .4byte 0x34 + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF0 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF1 + .uleb128 0x3 + .byte 0x2 + .byte 0x7 + .4byte .LASF2 + .uleb128 0x4 + .4byte .LASF21 + .byte 0x5 + .byte 0xc + .4byte 0x54 + .uleb128 0x5 + .byte 0x4 + .byte 0x5 + .string "int" + .uleb128 0x3 + .byte 0x1 + .byte 0x6 + .4byte .LASF3 + .uleb128 0x2 + .4byte .LASF5 + .byte 0x3 + .byte 0xc + .4byte 0x34 + .uleb128 0x3 + .byte 0x2 + .byte 0x5 + .4byte .LASF6 + .uleb128 0x2 + .4byte .LASF7 + .byte 0x3 + .byte 0x12 + .4byte 0x7f + .uleb128 0x3 + .byte 0x4 + .byte 0x7 + .4byte .LASF8 + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF9 + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF10 + .uleb128 0x6 + .string "u8" + .byte 0x3 + .byte 0x1f + .4byte 0x34 + .uleb128 0x7 + .4byte 0x94 + .uleb128 0x6 + .string "u16" + .byte 0x3 + .byte 0x22 + .4byte 0x42 + .uleb128 0x6 + .string "u32" + .byte 0x3 + .byte 0x25 + .4byte 0x7f + .uleb128 0x6 + .string "u64" + .byte 0x3 + .byte 0x28 + .4byte 0x8d + .uleb128 0x2 + .4byte .LASF11 + .byte 0x3 + .byte 0x31 + .4byte 0x8d + .uleb128 0x2 + .4byte .LASF12 + .byte 0x3 + .byte 0x32 + .4byte 0x8d + .uleb128 0x3 + .byte 0x8 + .byte 0x7 + .4byte .LASF13 + .uleb128 0x8 + .byte 0x8 + .4byte 0xee + .uleb128 0x3 + .byte 0x1 + .byte 0x8 + .4byte .LASF14 + .uleb128 0x7 + .4byte 0xe7 + .uleb128 0x3 + .byte 0x8 + .byte 0x5 + .4byte .LASF15 + .uleb128 0x8 + .byte 0x8 + .4byte 0xe7 + .uleb128 0x2 + .4byte .LASF16 + .byte 0x4 + .byte 0x59 + .4byte 0x42 + .uleb128 0x2 + .4byte .LASF17 + .byte 0x4 + .byte 0x5b + .4byte 0x3b + .uleb128 0x2 + .4byte .LASF18 + .byte 0x4 + .byte 0x69 + .4byte 0x62 + .uleb128 0x2 + .4byte .LASF19 + .byte 0x4 + .byte 0x6b + .4byte 0x74 + .uleb128 0x2 + .4byte .LASF20 + .byte 0x4 + .byte 0x97 + .4byte 0x74 + .uleb128 0x9 + .byte 0x8 + .uleb128 0x4 + .4byte .LASF22 + .byte 0x6 + .byte 0xb + .4byte 0xfa + .uleb128 0x3 + .byte 0x1 + .byte 0x2 + .4byte .LASF23 + .uleb128 0xa + .4byte 0xe7 + .4byte 0x156 + .uleb128 0xb + .byte 0 + .uleb128 0xc + .4byte .LASF24 + .byte 0x7 + .2byte 0x140 + .4byte 0x14b + .uleb128 0xc + .4byte .LASF25 + .byte 0x7 + .2byte 0x143 + .4byte 0x14b + .uleb128 0xc + .4byte .LASF26 + .byte 0x7 + .2byte 0x143 + .4byte 0x14b + .uleb128 0xd + .4byte .LASF45 + .byte 0xa0 + .byte 0x8 + .byte 0x83 + .4byte 0x25f + .uleb128 0xe + .4byte .LASF27 + .byte 0x8 + .byte 0x84 + .4byte 0x139d + .byte 0 + .uleb128 0xe + .4byte .LASF28 + .byte 0x8 + .byte 0x85 + .4byte 0xe1 + .byte 0x8 + .uleb128 0xe + .4byte .LASF29 + .byte 0x8 + .byte 0x86 + .4byte 0x137 + .byte 0x10 + .uleb128 0xe + .4byte .LASF30 + .byte 0x8 + .byte 0x87 + .4byte 0x137 + .byte 0x18 + .uleb128 0xe + .4byte .LASF31 + .byte 0x8 + .byte 0x88 + .4byte 0x137 + .byte 0x20 + .uleb128 0xe + .4byte .LASF32 + .byte 0x8 + .byte 0x89 + .4byte 0x1344 + .byte 0x28 + .uleb128 0xe + .4byte .LASF33 + .byte 0x8 + .byte 0x8a + .4byte 0x10b + .byte 0x30 + .uleb128 0xe + .4byte .LASF34 + .byte 0x8 + .byte 0x8b + .4byte 0x25f + .byte 0x38 + .uleb128 0xe + .4byte .LASF35 + .byte 0x8 + .byte 0x8c + .4byte 0x137 + .byte 0x40 + .uleb128 0xe + .4byte .LASF36 + .byte 0x8 + .byte 0x8d + .4byte 0x13ec + .byte 0x48 + .uleb128 0xe + .4byte .LASF37 + .byte 0x8 + .byte 0x8e + .4byte 0x137 + .byte 0x50 + .uleb128 0xe + .4byte .LASF38 + .byte 0x8 + .byte 0x8f + .4byte 0x137 + .byte 0x58 + .uleb128 0xe + .4byte .LASF39 + .byte 0x8 + .byte 0x90 + .4byte 0x292 + .byte 0x60 + .uleb128 0xe + .4byte .LASF40 + .byte 0x8 + .byte 0x91 + .4byte 0x292 + .byte 0x70 + .uleb128 0xe + .4byte .LASF41 + .byte 0x8 + .byte 0x92 + .4byte 0x292 + .byte 0x80 + .uleb128 0xe + .4byte .LASF42 + .byte 0x8 + .byte 0x93 + .4byte 0x121 + .byte 0x90 + .uleb128 0xe + .4byte .LASF43 + .byte 0x8 + .byte 0x94 + .4byte 0x54 + .byte 0x94 + .uleb128 0xf + .string "seq" + .byte 0x8 + .byte 0x95 + .4byte 0x54 + .byte 0x98 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x17a + .uleb128 0x8 + .byte 0x8 + .4byte 0x26b + .uleb128 0x10 + .uleb128 0xa + .4byte 0x10b + .4byte 0x277 + .uleb128 0xb + .byte 0 + .uleb128 0x4 + .4byte .LASF44 + .byte 0x9 + .byte 0x10 + .4byte 0x26c + .uleb128 0xa + .4byte 0x34 + .4byte 0x292 + .uleb128 0x11 + .4byte 0xda + .byte 0x5 + .byte 0 + .uleb128 0xd + .4byte .LASF46 + .byte 0x10 + .byte 0xa + .byte 0x16 + .4byte 0x2b7 + .uleb128 0xe + .4byte .LASF47 + .byte 0xa + .byte 0x17 + .4byte 0x2b7 + .byte 0 + .uleb128 0xe + .4byte .LASF48 + .byte 0xa + .byte 0x17 + .4byte 0x2b7 + .byte 0x8 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x292 + .uleb128 0xd + .4byte .LASF49 + .byte 0x10 + .byte 0xb + .byte 0xf + .4byte 0x2e2 + .uleb128 0xe + .4byte .LASF28 + .byte 0xb + .byte 0x10 + .4byte 0xfa + .byte 0 + .uleb128 0xe + .4byte .LASF50 + .byte 0xb + .byte 0x11 + .4byte 0x2fb + .byte 0x8 + .byte 0 + .uleb128 0x7 + .4byte 0x2bd + .uleb128 0x12 + .4byte 0x54 + .4byte 0x2fb + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x2e7 + .uleb128 0xa + .4byte 0x2e2 + .4byte 0x30c + .uleb128 0xb + .byte 0 + .uleb128 0x7 + .4byte 0x301 + .uleb128 0x4 + .4byte .LASF49 + .byte 0xb + .byte 0xe1 + .4byte 0x30c + .uleb128 0x14 + .2byte 0x1220 + .byte 0xc + .byte 0x13 + .4byte 0x370 + .uleb128 0xe + .4byte .LASF51 + .byte 0xc + .byte 0x14 + .4byte 0x10b + .byte 0 + .uleb128 0xe + .4byte .LASF52 + .byte 0xc + .byte 0x15 + .4byte 0x100 + .byte 0x8 + .uleb128 0xe + .4byte .LASF53 + .byte 0xc + .byte 0x16 + .4byte 0x10b + .byte 0x10 + .uleb128 0xe + .4byte .LASF54 + .byte 0xc + .byte 0x17 + .4byte 0x370 + .byte 0x18 + .uleb128 0x15 + .4byte .LASF55 + .byte 0xc + .byte 0x18 + .4byte 0x381 + .2byte 0x1018 + .uleb128 0x16 + .string "mtd" + .byte 0xc + .byte 0x31 + .4byte 0x397 + .2byte 0x1218 + .byte 0 + .uleb128 0xa + .4byte 0x10b + .4byte 0x381 + .uleb128 0x17 + .4byte 0xda + .2byte 0x1ff + .byte 0 + .uleb128 0xa + .4byte 0x29 + .4byte 0x392 + .uleb128 0x17 + .4byte 0xda + .2byte 0x1ff + .byte 0 + .uleb128 0x18 + .4byte .LASF318 + .uleb128 0x8 + .byte 0x8 + .4byte 0x392 + .uleb128 0x2 + .4byte .LASF56 + .byte 0xc + .byte 0x37 + .4byte 0x31c + .uleb128 0xa + .4byte 0x39d + .4byte 0x3b3 + .uleb128 0xb + .byte 0 + .uleb128 0x4 + .4byte .LASF57 + .byte 0xc + .byte 0x39 + .4byte 0x3a8 + .uleb128 0x3 + .byte 0x10 + .byte 0x4 + .4byte .LASF58 + .uleb128 0xd + .4byte .LASF59 + .byte 0x10 + .byte 0xd + .byte 0x10 + .4byte 0x3ea + .uleb128 0xe + .4byte .LASF60 + .byte 0xd + .byte 0x11 + .4byte 0xc4 + .byte 0 + .uleb128 0xe + .4byte .LASF51 + .byte 0xd + .byte 0x12 + .4byte 0xcf + .byte 0x8 + .byte 0 + .uleb128 0x19 + .4byte .LASF61 + .2byte 0x120 + .byte 0xd + .byte 0x15 + .4byte 0x41c + .uleb128 0xf + .string "cnt" + .byte 0xd + .byte 0x16 + .4byte 0x3b + .byte 0 + .uleb128 0xe + .4byte .LASF51 + .byte 0xd + .byte 0x17 + .4byte 0xcf + .byte 0x8 + .uleb128 0xe + .4byte .LASF62 + .byte 0xd + .byte 0x18 + .4byte 0x41c + .byte 0x10 + .byte 0 + .uleb128 0xa + .4byte 0x3c5 + .4byte 0x42c + .uleb128 0x11 + .4byte 0xda + .byte 0x10 + .byte 0 + .uleb128 0x1a + .string "lmb" + .2byte 0x240 + .byte 0xd + .byte 0x1b + .4byte 0x453 + .uleb128 0xe + .4byte .LASF63 + .byte 0xd + .byte 0x1c + .4byte 0x3ea + .byte 0 + .uleb128 0x15 + .4byte .LASF64 + .byte 0xd + .byte 0x1d + .4byte 0x3ea + .2byte 0x120 + .byte 0 + .uleb128 0x1b + .string "lmb" + .byte 0xd + .byte 0x20 + .4byte 0x42c + .uleb128 0x1c + .byte 0x10 + .byte 0xe + .byte 0x5d + .4byte 0x47f + .uleb128 0xe + .4byte .LASF54 + .byte 0xe + .byte 0x5e + .4byte 0xb9 + .byte 0 + .uleb128 0xe + .4byte .LASF51 + .byte 0xe + .byte 0x5f + .4byte 0xb9 + .byte 0x8 + .byte 0 + .uleb128 0xd + .4byte .LASF65 + .byte 0xb0 + .byte 0xe + .byte 0x1b + .4byte 0x57c + .uleb128 0xe + .4byte .LASF66 + .byte 0xe + .byte 0x1c + .4byte 0x3b + .byte 0 + .uleb128 0xe + .4byte .LASF67 + .byte 0xe + .byte 0x1d + .4byte 0xcf + .byte 0x8 + .uleb128 0xe + .4byte .LASF68 + .byte 0xe + .byte 0x1e + .4byte 0x3b + .byte 0x10 + .uleb128 0xe + .4byte .LASF69 + .byte 0xe + .byte 0x1f + .4byte 0x3b + .byte 0x18 + .uleb128 0xe + .4byte .LASF70 + .byte 0xe + .byte 0x20 + .4byte 0x3b + .byte 0x20 + .uleb128 0xe + .4byte .LASF71 + .byte 0xe + .byte 0x21 + .4byte 0x3b + .byte 0x28 + .uleb128 0xe + .4byte .LASF72 + .byte 0xe + .byte 0x22 + .4byte 0x3b + .byte 0x30 + .uleb128 0xe + .4byte .LASF73 + .byte 0xe + .byte 0x24 + .4byte 0x3b + .byte 0x38 + .uleb128 0xe + .4byte .LASF74 + .byte 0xe + .byte 0x25 + .4byte 0x3b + .byte 0x40 + .uleb128 0xe + .4byte .LASF75 + .byte 0xe + .byte 0x26 + .4byte 0x3b + .byte 0x48 + .uleb128 0xe + .4byte .LASF76 + .byte 0xe + .byte 0x31 + .4byte 0x3b + .byte 0x50 + .uleb128 0xe + .4byte .LASF77 + .byte 0xe + .byte 0x32 + .4byte 0x3b + .byte 0x58 + .uleb128 0xe + .4byte .LASF78 + .byte 0xe + .byte 0x33 + .4byte 0x282 + .byte 0x60 + .uleb128 0xe + .4byte .LASF79 + .byte 0xe + .byte 0x34 + .4byte 0x42 + .byte 0x66 + .uleb128 0xe + .4byte .LASF80 + .byte 0xe + .byte 0x35 + .4byte 0x3b + .byte 0x68 + .uleb128 0xe + .4byte .LASF81 + .byte 0xe + .byte 0x36 + .4byte 0x3b + .byte 0x70 + .uleb128 0xe + .4byte .LASF82 + .byte 0xe + .byte 0x57 + .4byte 0x10b + .byte 0x78 + .uleb128 0xe + .4byte .LASF83 + .byte 0xe + .byte 0x58 + .4byte 0x10b + .byte 0x80 + .uleb128 0xe + .4byte .LASF84 + .byte 0xe + .byte 0x5b + .4byte 0x7f + .byte 0x88 + .uleb128 0xe + .4byte .LASF85 + .byte 0xe + .byte 0x60 + .4byte 0x57c + .byte 0x90 + .byte 0 + .uleb128 0xa + .4byte 0x45e + .4byte 0x58c + .uleb128 0x11 + .4byte 0xda + .byte 0x1 + .byte 0 + .uleb128 0x2 + .4byte .LASF86 + .byte 0xe + .byte 0x62 + .4byte 0x47f + .uleb128 0x4 + .4byte .LASF87 + .byte 0xf + .byte 0x13 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF88 + .byte 0xf + .byte 0x14 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF89 + .byte 0xf + .byte 0x15 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF90 + .byte 0xf + .byte 0x16 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF91 + .byte 0xf + .byte 0x17 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF92 + .byte 0xf + .byte 0x18 + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF93 + .byte 0xf + .byte 0x19 + .4byte 0x10b + .uleb128 0x2 + .4byte .LASF94 + .byte 0x10 + .byte 0x11 + .4byte 0x12c + .uleb128 0xd + .4byte .LASF95 + .byte 0x28 + .byte 0x11 + .byte 0x39 + .4byte 0x674 + .uleb128 0xe + .4byte .LASF96 + .byte 0x11 + .byte 0x3a + .4byte 0x5e4 + .byte 0 + .uleb128 0xe + .4byte .LASF97 + .byte 0x11 + .byte 0x3b + .4byte 0x5e4 + .byte 0x4 + .uleb128 0xe + .4byte .LASF98 + .byte 0x11 + .byte 0x3c + .4byte 0x5e4 + .byte 0x8 + .uleb128 0xe + .4byte .LASF99 + .byte 0x11 + .byte 0x3d + .4byte 0x5e4 + .byte 0xc + .uleb128 0xe + .4byte .LASF100 + .byte 0x11 + .byte 0x3e + .4byte 0x5e4 + .byte 0x10 + .uleb128 0xe + .4byte .LASF101 + .byte 0x11 + .byte 0x3f + .4byte 0x5e4 + .byte 0x14 + .uleb128 0xe + .4byte .LASF102 + .byte 0x11 + .byte 0x40 + .4byte 0x5e4 + .byte 0x18 + .uleb128 0xe + .4byte .LASF103 + .byte 0x11 + .byte 0x43 + .4byte 0x5e4 + .byte 0x1c + .uleb128 0xe + .4byte .LASF104 + .byte 0x11 + .byte 0x46 + .4byte 0x5e4 + .byte 0x20 + .uleb128 0xe + .4byte .LASF105 + .byte 0x11 + .byte 0x49 + .4byte 0x5e4 + .byte 0x24 + .byte 0 + .uleb128 0xc + .4byte .LASF106 + .byte 0x12 + .2byte 0x136 + .4byte 0x680 + .uleb128 0x8 + .byte 0x8 + .4byte 0x5ef + .uleb128 0x1d + .4byte .LASF107 + .byte 0x40 + .byte 0x13 + .2byte 0x137 + .4byte 0x730 + .uleb128 0x1e + .4byte .LASF108 + .byte 0x13 + .2byte 0x138 + .4byte 0x12c + .byte 0 + .uleb128 0x1e + .4byte .LASF109 + .byte 0x13 + .2byte 0x139 + .4byte 0x12c + .byte 0x4 + .uleb128 0x1e + .4byte .LASF110 + .byte 0x13 + .2byte 0x13a + .4byte 0x12c + .byte 0x8 + .uleb128 0x1e + .4byte .LASF111 + .byte 0x13 + .2byte 0x13b + .4byte 0x12c + .byte 0xc + .uleb128 0x1e + .4byte .LASF112 + .byte 0x13 + .2byte 0x13c + .4byte 0x12c + .byte 0x10 + .uleb128 0x1e + .4byte .LASF113 + .byte 0x13 + .2byte 0x13d + .4byte 0x12c + .byte 0x14 + .uleb128 0x1e + .4byte .LASF114 + .byte 0x13 + .2byte 0x13e + .4byte 0x12c + .byte 0x18 + .uleb128 0x1e + .4byte .LASF115 + .byte 0x13 + .2byte 0x13f + .4byte 0x116 + .byte 0x1c + .uleb128 0x1e + .4byte .LASF116 + .byte 0x13 + .2byte 0x140 + .4byte 0x116 + .byte 0x1d + .uleb128 0x1e + .4byte .LASF117 + .byte 0x13 + .2byte 0x141 + .4byte 0x116 + .byte 0x1e + .uleb128 0x1e + .4byte .LASF118 + .byte 0x13 + .2byte 0x142 + .4byte 0x116 + .byte 0x1f + .uleb128 0x1e + .4byte .LASF119 + .byte 0x13 + .2byte 0x143 + .4byte 0x730 + .byte 0x20 + .byte 0 + .uleb128 0xa + .4byte 0x116 + .4byte 0x740 + .uleb128 0x11 + .4byte 0xda + .byte 0x1f + .byte 0 + .uleb128 0x1f + .4byte .LASF120 + .byte 0x13 + .2byte 0x144 + .4byte 0x686 + .uleb128 0x1d + .4byte .LASF121 + .byte 0x30 + .byte 0x13 + .2byte 0x146 + .4byte 0x7ce + .uleb128 0x1e + .4byte .LASF54 + .byte 0x13 + .2byte 0x147 + .4byte 0x10b + .byte 0 + .uleb128 0x20 + .string "end" + .byte 0x13 + .2byte 0x147 + .4byte 0x10b + .byte 0x8 + .uleb128 0x1e + .4byte .LASF122 + .byte 0x13 + .2byte 0x148 + .4byte 0x10b + .byte 0x10 + .uleb128 0x1e + .4byte .LASF123 + .byte 0x13 + .2byte 0x148 + .4byte 0x10b + .byte 0x18 + .uleb128 0x1e + .4byte .LASF124 + .byte 0x13 + .2byte 0x149 + .4byte 0x10b + .byte 0x20 + .uleb128 0x1e + .4byte .LASF125 + .byte 0x13 + .2byte 0x14a + .4byte 0x116 + .byte 0x28 + .uleb128 0x1e + .4byte .LASF126 + .byte 0x13 + .2byte 0x14a + .4byte 0x116 + .byte 0x29 + .uleb128 0x20 + .string "os" + .byte 0x13 + .2byte 0x14a + .4byte 0x116 + .byte 0x2a + .uleb128 0x1e + .4byte .LASF127 + .byte 0x13 + .2byte 0x14b + .4byte 0x116 + .byte 0x2b + .byte 0 + .uleb128 0x1f + .4byte .LASF128 + .byte 0x13 + .2byte 0x14c + .4byte 0x74c + .uleb128 0x21 + .4byte .LASF129 + .2byte 0x380 + .byte 0x13 + .2byte 0x152 + .4byte 0x977 + .uleb128 0x1e + .4byte .LASF130 + .byte 0x13 + .2byte 0x158 + .4byte 0x977 + .byte 0 + .uleb128 0x1e + .4byte .LASF131 + .byte 0x13 + .2byte 0x159 + .4byte 0x740 + .byte 0x8 + .uleb128 0x1e + .4byte .LASF132 + .byte 0x13 + .2byte 0x15a + .4byte 0x10b + .byte 0x48 + .uleb128 0x1e + .4byte .LASF133 + .byte 0x13 + .2byte 0x15d + .4byte 0xe1 + .byte 0x50 + .uleb128 0x1e + .4byte .LASF134 + .byte 0x13 + .2byte 0x15f + .4byte 0x137 + .byte 0x58 + .uleb128 0x1e + .4byte .LASF135 + .byte 0x13 + .2byte 0x160 + .4byte 0xe1 + .byte 0x60 + .uleb128 0x1e + .4byte .LASF136 + .byte 0x13 + .2byte 0x161 + .4byte 0x54 + .byte 0x68 + .uleb128 0x1e + .4byte .LASF137 + .byte 0x13 + .2byte 0x163 + .4byte 0x137 + .byte 0x70 + .uleb128 0x1e + .4byte .LASF138 + .byte 0x13 + .2byte 0x164 + .4byte 0xe1 + .byte 0x78 + .uleb128 0x1e + .4byte .LASF139 + .byte 0x13 + .2byte 0x165 + .4byte 0x54 + .byte 0x80 + .uleb128 0x1e + .4byte .LASF140 + .byte 0x13 + .2byte 0x167 + .4byte 0x137 + .byte 0x88 + .uleb128 0x1e + .4byte .LASF141 + .byte 0x13 + .2byte 0x168 + .4byte 0xe1 + .byte 0x90 + .uleb128 0x1e + .4byte .LASF142 + .byte 0x13 + .2byte 0x169 + .4byte 0x54 + .byte 0x98 + .uleb128 0x1e + .4byte .LASF143 + .byte 0x13 + .2byte 0x16b + .4byte 0x137 + .byte 0xa0 + .uleb128 0x1e + .4byte .LASF144 + .byte 0x13 + .2byte 0x16c + .4byte 0xe1 + .byte 0xa8 + .uleb128 0x1e + .4byte .LASF145 + .byte 0x13 + .2byte 0x16d + .4byte 0x54 + .byte 0xb0 + .uleb128 0x20 + .string "os" + .byte 0x13 + .2byte 0x171 + .4byte 0x7ce + .byte 0xb8 + .uleb128 0x20 + .string "ep" + .byte 0x13 + .2byte 0x172 + .4byte 0x10b + .byte 0xe8 + .uleb128 0x1e + .4byte .LASF146 + .byte 0x13 + .2byte 0x174 + .4byte 0x10b + .byte 0xf0 + .uleb128 0x1e + .4byte .LASF147 + .byte 0x13 + .2byte 0x174 + .4byte 0x10b + .byte 0xf8 + .uleb128 0x22 + .4byte .LASF148 + .byte 0x13 + .2byte 0x176 + .4byte 0xfa + .2byte 0x100 + .uleb128 0x22 + .4byte .LASF149 + .byte 0x13 + .2byte 0x177 + .4byte 0x10b + .2byte 0x108 + .uleb128 0x22 + .4byte .LASF150 + .byte 0x13 + .2byte 0x179 + .4byte 0x10b + .2byte 0x110 + .uleb128 0x22 + .4byte .LASF151 + .byte 0x13 + .2byte 0x17a + .4byte 0x10b + .2byte 0x118 + .uleb128 0x22 + .4byte .LASF152 + .byte 0x13 + .2byte 0x17b + .4byte 0x10b + .2byte 0x120 + .uleb128 0x22 + .4byte .LASF153 + .byte 0x13 + .2byte 0x17c + .4byte 0x10b + .2byte 0x128 + .uleb128 0x23 + .string "kbd" + .byte 0x13 + .2byte 0x17d + .4byte 0x97d + .2byte 0x130 + .uleb128 0x22 + .4byte .LASF154 + .byte 0x13 + .2byte 0x180 + .4byte 0x54 + .2byte 0x138 + .uleb128 0x22 + .4byte .LASF155 + .byte 0x13 + .2byte 0x18d + .4byte 0x54 + .2byte 0x13c + .uleb128 0x23 + .string "lmb" + .byte 0x13 + .2byte 0x190 + .4byte 0x42c + .2byte 0x140 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x740 + .uleb128 0x8 + .byte 0x8 + .4byte 0x58c + .uleb128 0x1f + .4byte .LASF156 + .byte 0x13 + .2byte 0x196 + .4byte 0x7da + .uleb128 0xc + .4byte .LASF157 + .byte 0x13 + .2byte 0x198 + .4byte 0x983 + .uleb128 0xa + .4byte 0xe7 + .4byte 0x9ac + .uleb128 0x17 + .4byte 0xda + .2byte 0x3ff + .byte 0 + .uleb128 0x24 + .4byte .LASF352 + .byte 0x4 + .4byte 0x54 + .byte 0x18 + .byte 0xe + .4byte 0xc15 + .uleb128 0x25 + .4byte .LASF158 + .byte 0 + .uleb128 0x25 + .4byte .LASF159 + .byte 0x1 + .uleb128 0x25 + .4byte .LASF160 + .byte 0x2 + .uleb128 0x25 + .4byte .LASF161 + .byte 0x3 + .uleb128 0x25 + .4byte .LASF162 + .byte 0x4 + .uleb128 0x25 + .4byte .LASF163 + .byte 0x5 + .uleb128 0x25 + .4byte .LASF164 + .byte 0x6 + .uleb128 0x25 + .4byte .LASF165 + .byte 0x7 + .uleb128 0x25 + .4byte .LASF166 + .byte 0x8 + .uleb128 0x25 + .4byte .LASF167 + .byte 0x9 + .uleb128 0x25 + .4byte .LASF168 + .byte 0xa + .uleb128 0x25 + .4byte .LASF169 + .byte 0xb + .uleb128 0x25 + .4byte .LASF170 + .byte 0xc + .uleb128 0x25 + .4byte .LASF171 + .byte 0xd + .uleb128 0x25 + .4byte .LASF172 + .byte 0xe + .uleb128 0x25 + .4byte .LASF173 + .byte 0xf + .uleb128 0x25 + .4byte .LASF174 + .byte 0x10 + .uleb128 0x25 + .4byte .LASF175 + .byte 0x11 + .uleb128 0x25 + .4byte .LASF176 + .byte 0x12 + .uleb128 0x25 + .4byte .LASF177 + .byte 0x13 + .uleb128 0x25 + .4byte .LASF178 + .byte 0x14 + .uleb128 0x25 + .4byte .LASF179 + .byte 0x15 + .uleb128 0x25 + .4byte .LASF180 + .byte 0x16 + .uleb128 0x25 + .4byte .LASF181 + .byte 0x17 + .uleb128 0x25 + .4byte .LASF182 + .byte 0x18 + .uleb128 0x25 + .4byte .LASF183 + .byte 0x19 + .uleb128 0x25 + .4byte .LASF184 + .byte 0x1a + .uleb128 0x25 + .4byte .LASF185 + .byte 0x1b + .uleb128 0x25 + .4byte .LASF186 + .byte 0x1c + .uleb128 0x25 + .4byte .LASF187 + .byte 0x1d + .uleb128 0x25 + .4byte .LASF188 + .byte 0x1e + .uleb128 0x25 + .4byte .LASF189 + .byte 0x1f + .uleb128 0x25 + .4byte .LASF190 + .byte 0x20 + .uleb128 0x25 + .4byte .LASF191 + .byte 0x21 + .uleb128 0x25 + .4byte .LASF192 + .byte 0x22 + .uleb128 0x25 + .4byte .LASF193 + .byte 0x23 + .uleb128 0x25 + .4byte .LASF194 + .byte 0x24 + .uleb128 0x25 + .4byte .LASF195 + .byte 0x25 + .uleb128 0x25 + .4byte .LASF196 + .byte 0x26 + .uleb128 0x25 + .4byte .LASF197 + .byte 0x27 + .uleb128 0x25 + .4byte .LASF198 + .byte 0x28 + .uleb128 0x25 + .4byte .LASF199 + .byte 0x29 + .uleb128 0x25 + .4byte .LASF200 + .byte 0x2a + .uleb128 0x25 + .4byte .LASF201 + .byte 0x2b + .uleb128 0x25 + .4byte .LASF202 + .byte 0x2c + .uleb128 0x25 + .4byte .LASF203 + .byte 0x2d + .uleb128 0x25 + .4byte .LASF204 + .byte 0x2e + .uleb128 0x25 + .4byte .LASF205 + .byte 0x2f + .uleb128 0x25 + .4byte .LASF206 + .byte 0x30 + .uleb128 0x25 + .4byte .LASF207 + .byte 0x31 + .uleb128 0x25 + .4byte .LASF208 + .byte 0x32 + .uleb128 0x25 + .4byte .LASF209 + .byte 0x33 + .uleb128 0x25 + .4byte .LASF210 + .byte 0x34 + .uleb128 0x25 + .4byte .LASF211 + .byte 0x35 + .uleb128 0x25 + .4byte .LASF212 + .byte 0x36 + .uleb128 0x25 + .4byte .LASF213 + .byte 0x37 + .uleb128 0x25 + .4byte .LASF214 + .byte 0x38 + .uleb128 0x25 + .4byte .LASF215 + .byte 0x39 + .uleb128 0x25 + .4byte .LASF216 + .byte 0x3a + .uleb128 0x25 + .4byte .LASF217 + .byte 0x3b + .uleb128 0x25 + .4byte .LASF218 + .byte 0x3c + .uleb128 0x25 + .4byte .LASF219 + .byte 0x3d + .uleb128 0x25 + .4byte .LASF220 + .byte 0x3e + .uleb128 0x25 + .4byte .LASF221 + .byte 0x3f + .uleb128 0x25 + .4byte .LASF222 + .byte 0x40 + .uleb128 0x25 + .4byte .LASF223 + .byte 0x41 + .uleb128 0x25 + .4byte .LASF224 + .byte 0x42 + .uleb128 0x25 + .4byte .LASF225 + .byte 0x43 + .uleb128 0x25 + .4byte .LASF226 + .byte 0x44 + .uleb128 0x25 + .4byte .LASF227 + .byte 0x45 + .uleb128 0x25 + .4byte .LASF228 + .byte 0x46 + .uleb128 0x25 + .4byte .LASF229 + .byte 0x47 + .uleb128 0x25 + .4byte .LASF230 + .byte 0x48 + .uleb128 0x25 + .4byte .LASF231 + .byte 0x49 + .uleb128 0x25 + .4byte .LASF232 + .byte 0x4a + .uleb128 0x25 + .4byte .LASF233 + .byte 0x4b + .uleb128 0x25 + .4byte .LASF234 + .byte 0x4c + .uleb128 0x25 + .4byte .LASF235 + .byte 0x4d + .uleb128 0x25 + .4byte .LASF236 + .byte 0x4e + .uleb128 0x25 + .4byte .LASF237 + .byte 0x4f + .uleb128 0x25 + .4byte .LASF238 + .byte 0x50 + .uleb128 0x25 + .4byte .LASF239 + .byte 0x51 + .uleb128 0x25 + .4byte .LASF240 + .byte 0x52 + .uleb128 0x25 + .4byte .LASF241 + .byte 0x53 + .uleb128 0x25 + .4byte .LASF242 + .byte 0x54 + .uleb128 0x25 + .4byte .LASF243 + .byte 0x55 + .uleb128 0x25 + .4byte .LASF244 + .byte 0x56 + .uleb128 0x25 + .4byte .LASF245 + .byte 0x57 + .uleb128 0x25 + .4byte .LASF246 + .byte 0x58 + .uleb128 0x25 + .4byte .LASF247 + .byte 0x59 + .uleb128 0x25 + .4byte .LASF248 + .byte 0x5a + .uleb128 0x25 + .4byte .LASF249 + .byte 0x5b + .uleb128 0x25 + .4byte .LASF250 + .byte 0x5c + .uleb128 0x25 + .4byte .LASF251 + .byte 0x5d + .uleb128 0x25 + .4byte .LASF252 + .byte 0x5e + .uleb128 0x25 + .4byte .LASF253 + .byte 0x5f + .uleb128 0x25 + .4byte .LASF254 + .byte 0x60 + .uleb128 0x25 + .4byte .LASF255 + .byte 0x61 + .uleb128 0x25 + .4byte .LASF256 + .byte 0x62 + .uleb128 0x26 + .4byte .LASF257 + .sleb128 -1 + .byte 0 + .uleb128 0x27 + .byte 0x4 + .4byte 0x7f + .byte 0x23 + .byte 0xf6 + .4byte 0xc28 + .uleb128 0x25 + .4byte .LASF258 + .byte 0x5 + .byte 0 + .uleb128 0xd + .4byte .LASF259 + .byte 0x40 + .byte 0x14 + .byte 0xc + .4byte 0xca1 + .uleb128 0xe + .4byte .LASF260 + .byte 0x14 + .byte 0x22 + .4byte 0x3b + .byte 0 + .uleb128 0xf + .string "tbu" + .byte 0x14 + .byte 0x23 + .4byte 0x7f + .byte 0x8 + .uleb128 0xf + .string "tbl" + .byte 0x14 + .byte 0x24 + .4byte 0x7f + .byte 0xc + .uleb128 0xe + .4byte .LASF261 + .byte 0x14 + .byte 0x25 + .4byte 0x3b + .byte 0x10 + .uleb128 0xe + .4byte .LASF262 + .byte 0x14 + .byte 0x26 + .4byte 0x8d + .byte 0x18 + .uleb128 0xe + .4byte .LASF263 + .byte 0x14 + .byte 0x29 + .4byte 0x3b + .byte 0x20 + .uleb128 0xe + .4byte .LASF264 + .byte 0x14 + .byte 0x2a + .4byte 0x3b + .byte 0x28 + .uleb128 0xe + .4byte .LASF265 + .byte 0x14 + .byte 0x2c + .4byte 0x3b + .byte 0x30 + .uleb128 0xe + .4byte .LASF266 + .byte 0x14 + .byte 0x2d + .4byte 0x3b + .byte 0x38 + .byte 0 + .uleb128 0xd + .4byte .LASF267 + .byte 0x18 + .byte 0x15 + .byte 0x22 + .4byte 0xce9 + .uleb128 0xe + .4byte .LASF268 + .byte 0x15 + .byte 0x23 + .4byte 0xae + .byte 0 + .uleb128 0xe + .4byte .LASF269 + .byte 0x15 + .byte 0x24 + .4byte 0xae + .byte 0x4 + .uleb128 0xf + .string "id" + .byte 0x15 + .byte 0x25 + .4byte 0xae + .byte 0x8 + .uleb128 0xe + .4byte .LASF270 + .byte 0x15 + .byte 0x26 + .4byte 0xae + .byte 0xc + .uleb128 0xe + .4byte .LASF271 + .byte 0x15 + .byte 0x27 + .4byte 0x10b + .byte 0x10 + .byte 0 + .uleb128 0x19 + .4byte .LASF272 + .2byte 0x1c0 + .byte 0x15 + .byte 0x2a + .4byte 0xf12 + .uleb128 0xf + .string "bd" + .byte 0x15 + .byte 0x2b + .4byte 0x97d + .byte 0 + .uleb128 0xe + .4byte .LASF42 + .byte 0x15 + .byte 0x2c + .4byte 0x3b + .byte 0x8 + .uleb128 0xe + .4byte .LASF270 + .byte 0x15 + .byte 0x2d + .4byte 0x7f + .byte 0x10 + .uleb128 0xe + .4byte .LASF273 + .byte 0x15 + .byte 0x2e + .4byte 0x3b + .byte 0x18 + .uleb128 0xe + .4byte .LASF274 + .byte 0x15 + .byte 0x2f + .4byte 0x3b + .byte 0x20 + .uleb128 0xe + .4byte .LASF275 + .byte 0x15 + .byte 0x31 + .4byte 0x3b + .byte 0x28 + .uleb128 0xe + .4byte .LASF276 + .byte 0x15 + .byte 0x32 + .4byte 0x3b + .byte 0x30 + .uleb128 0xe + .4byte .LASF277 + .byte 0x15 + .byte 0x3e + .4byte 0x3b + .byte 0x38 + .uleb128 0xe + .4byte .LASF278 + .byte 0x15 + .byte 0x42 + .4byte 0x3b + .byte 0x40 + .uleb128 0xe + .4byte .LASF279 + .byte 0x15 + .byte 0x43 + .4byte 0x3b + .byte 0x48 + .uleb128 0xe + .4byte .LASF280 + .byte 0x15 + .byte 0x45 + .4byte 0x3b + .byte 0x50 + .uleb128 0xe + .4byte .LASF281 + .byte 0x15 + .byte 0x46 + .4byte 0x3b + .byte 0x58 + .uleb128 0xe + .4byte .LASF282 + .byte 0x15 + .byte 0x47 + .4byte 0x3b + .byte 0x60 + .uleb128 0xe + .4byte .LASF283 + .byte 0x15 + .byte 0x48 + .4byte 0xcf + .byte 0x68 + .uleb128 0xe + .4byte .LASF284 + .byte 0x15 + .byte 0x49 + .4byte 0x3b + .byte 0x70 + .uleb128 0xe + .4byte .LASF285 + .byte 0x15 + .byte 0x4a + .4byte 0x3b + .byte 0x78 + .uleb128 0xe + .4byte .LASF286 + .byte 0x15 + .byte 0x4b + .4byte 0x3b + .byte 0x80 + .uleb128 0xe + .4byte .LASF287 + .byte 0x15 + .byte 0x4c + .4byte 0x3b + .byte 0x88 + .uleb128 0xe + .4byte .LASF288 + .byte 0x15 + .byte 0x4d + .4byte 0xf12 + .byte 0x90 + .uleb128 0xe + .4byte .LASF289 + .byte 0x15 + .byte 0x50 + .4byte 0x25f + .byte 0x98 + .uleb128 0xe + .4byte .LASF290 + .byte 0x15 + .byte 0x51 + .4byte 0x25f + .byte 0xa0 + .uleb128 0xe + .4byte .LASF291 + .byte 0x15 + .byte 0x52 + .4byte 0x292 + .byte 0xa8 + .uleb128 0xe + .4byte .LASF292 + .byte 0x15 + .byte 0x57 + .4byte 0x265 + .byte 0xb8 + .uleb128 0xe + .4byte .LASF293 + .byte 0x15 + .byte 0x58 + .4byte 0x137 + .byte 0xc0 + .uleb128 0xe + .4byte .LASF294 + .byte 0x15 + .byte 0x59 + .4byte 0x3b + .byte 0xc8 + .uleb128 0xe + .4byte .LASF295 + .byte 0x15 + .byte 0x5b + .4byte 0xf8a + .byte 0xd0 + .uleb128 0xe + .4byte .LASF296 + .byte 0x15 + .byte 0x5c + .4byte 0xf8a + .byte 0xd8 + .uleb128 0xe + .4byte .LASF297 + .byte 0x15 + .byte 0x5e + .4byte 0x265 + .byte 0xe0 + .uleb128 0xe + .4byte .LASF298 + .byte 0x15 + .byte 0x5f + .4byte 0x265 + .byte 0xe8 + .uleb128 0xf + .string "jt" + .byte 0x15 + .byte 0x60 + .4byte 0xf95 + .byte 0xf0 + .uleb128 0xe + .4byte .LASF299 + .byte 0x15 + .byte 0x61 + .4byte 0xf9b + .byte 0xf8 + .uleb128 0x15 + .4byte .LASF300 + .byte 0x15 + .byte 0x6b + .4byte 0x7f + .2byte 0x118 + .uleb128 0x15 + .4byte .LASF301 + .byte 0x15 + .byte 0x6c + .4byte 0x7f + .2byte 0x11c + .uleb128 0x15 + .4byte .LASF302 + .byte 0x15 + .byte 0x6e + .4byte 0x3b + .2byte 0x120 + .uleb128 0x15 + .4byte .LASF303 + .byte 0x15 + .byte 0x6f + .4byte 0x3b + .2byte 0x128 + .uleb128 0x15 + .4byte .LASF304 + .byte 0x15 + .byte 0x70 + .4byte 0x3b + .2byte 0x130 + .uleb128 0x15 + .4byte .LASF305 + .byte 0x15 + .byte 0x79 + .4byte 0x25f + .2byte 0x138 + .uleb128 0x15 + .4byte .LASF127 + .byte 0x15 + .byte 0x7a + .4byte 0xc28 + .2byte 0x140 + .uleb128 0x15 + .4byte .LASF306 + .byte 0x15 + .byte 0x80 + .4byte 0x10b + .2byte 0x180 + .uleb128 0x15 + .4byte .LASF307 + .byte 0x15 + .byte 0x81 + .4byte 0x10b + .2byte 0x188 + .uleb128 0x15 + .4byte .LASF308 + .byte 0x15 + .byte 0x87 + .4byte 0xc4 + .2byte 0x190 + .uleb128 0x15 + .4byte .LASF309 + .byte 0x15 + .byte 0x8c + .4byte 0xca1 + .2byte 0x198 + .uleb128 0x15 + .4byte .LASF310 + .byte 0x15 + .byte 0x8d + .4byte 0x10b + .2byte 0x1b0 + .uleb128 0x15 + .4byte .LASF311 + .byte 0x15 + .byte 0x8e + .4byte 0x54 + .2byte 0x1b8 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0xce9 + .uleb128 0xd + .4byte .LASF312 + .byte 0x40 + .byte 0x16 + .byte 0x2c + .4byte 0xf85 + .uleb128 0xe + .4byte .LASF28 + .byte 0x16 + .byte 0x2d + .4byte 0xe1 + .byte 0 + .uleb128 0xe + .4byte .LASF126 + .byte 0x16 + .byte 0x2e + .4byte 0xe1 + .byte 0x8 + .uleb128 0xe + .4byte .LASF313 + .byte 0x16 + .byte 0x2f + .4byte 0x12be + .byte 0x10 + .uleb128 0xe + .4byte .LASF314 + .byte 0x16 + .byte 0x30 + .4byte 0xe1 + .byte 0x18 + .uleb128 0xe + .4byte .LASF315 + .byte 0x16 + .byte 0x32 + .4byte 0x1306 + .byte 0x20 + .uleb128 0xe + .4byte .LASF34 + .byte 0x16 + .byte 0x33 + .4byte 0xf8a + .byte 0x28 + .uleb128 0xe + .4byte .LASF316 + .byte 0x16 + .byte 0x34 + .4byte 0xf8a + .byte 0x30 + .uleb128 0xe + .4byte .LASF317 + .byte 0x16 + .byte 0x35 + .4byte 0xf8a + .byte 0x38 + .byte 0 + .uleb128 0x7 + .4byte 0xf18 + .uleb128 0x8 + .byte 0x8 + .4byte 0xf18 + .uleb128 0x18 + .4byte .LASF319 + .uleb128 0x8 + .byte 0x8 + .4byte 0xf90 + .uleb128 0xa + .4byte 0xe7 + .4byte 0xfab + .uleb128 0x11 + .4byte 0xda + .byte 0x1f + .byte 0 + .uleb128 0x2 + .4byte .LASF320 + .byte 0x15 + .byte 0x9b + .4byte 0xce9 + .uleb128 0x28 + .4byte 0xfab + .uleb128 0x4 + .4byte .LASF321 + .byte 0x2 + .byte 0xad + .4byte 0x10b + .uleb128 0xa + .4byte 0x94 + .4byte 0xfd1 + .uleb128 0xb + .byte 0 + .uleb128 0x4 + .4byte .LASF322 + .byte 0x2 + .byte 0xaf + .4byte 0xfc6 + .uleb128 0x4 + .4byte .LASF323 + .byte 0x2 + .byte 0xb0 + .4byte 0xfc6 + .uleb128 0x4 + .4byte .LASF324 + .byte 0x2 + .byte 0xfe + .4byte 0x10b + .uleb128 0x4 + .4byte .LASF325 + .byte 0x2 + .byte 0xff + .4byte 0x10b + .uleb128 0xc + .4byte .LASF326 + .byte 0x2 + .2byte 0x100 + .4byte 0x10b + .uleb128 0xd + .4byte .LASF327 + .byte 0x4 + .byte 0x17 + .byte 0x2e + .4byte 0x1022 + .uleb128 0xe + .4byte .LASF328 + .byte 0x17 + .byte 0x2f + .4byte 0x12c + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x29 + .uleb128 0x12 + .4byte 0x54 + .4byte 0x1037 + .uleb128 0x13 + .4byte 0x25f + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1028 + .uleb128 0xa + .4byte 0x94 + .4byte 0x104d + .uleb128 0x11 + .4byte 0xda + .byte 0x5 + .byte 0 + .uleb128 0xc + .4byte .LASF329 + .byte 0x17 + .2byte 0x1fd + .4byte 0x1009 + .uleb128 0xc + .4byte .LASF330 + .byte 0x17 + .2byte 0x1fe + .4byte 0x1009 + .uleb128 0xc + .4byte .LASF331 + .byte 0x17 + .2byte 0x200 + .4byte 0x1009 + .uleb128 0xc + .4byte .LASF332 + .byte 0x17 + .2byte 0x205 + .4byte 0xf9b + .uleb128 0xc + .4byte .LASF333 + .byte 0x17 + .2byte 0x206 + .4byte 0xf9b + .uleb128 0xa + .4byte 0xe7 + .4byte 0x1099 + .uleb128 0x11 + .4byte 0xda + .byte 0x3f + .byte 0 + .uleb128 0xc + .4byte .LASF334 + .byte 0x17 + .2byte 0x207 + .4byte 0x1089 + .uleb128 0xc + .4byte .LASF335 + .byte 0x17 + .2byte 0x209 + .4byte 0x103d + .uleb128 0xc + .4byte .LASF336 + .byte 0x17 + .2byte 0x20a + .4byte 0x103d + .uleb128 0xc + .4byte .LASF337 + .byte 0x17 + .2byte 0x20b + .4byte 0x1009 + .uleb128 0xc + .4byte .LASF338 + .byte 0x17 + .2byte 0x20c + .4byte 0x1009 + .uleb128 0xc + .4byte .LASF339 + .byte 0x17 + .2byte 0x20d + .4byte 0x1022 + .uleb128 0xa + .4byte 0x1022 + .4byte 0x10f1 + .uleb128 0x11 + .4byte 0xda + .byte 0x3 + .byte 0 + .uleb128 0xc + .4byte .LASF340 + .byte 0x17 + .2byte 0x20e + .4byte 0x10e1 + .uleb128 0xc + .4byte .LASF341 + .byte 0x17 + .2byte 0x20f + .4byte 0x1022 + .uleb128 0xc + .4byte .LASF342 + .byte 0x17 + .2byte 0x210 + .4byte 0x54 + .uleb128 0xa + .4byte 0x9e + .4byte 0x1125 + .uleb128 0x11 + .4byte 0xda + .byte 0x5 + .byte 0 + .uleb128 0x7 + .4byte 0x1115 + .uleb128 0xc + .4byte .LASF343 + .byte 0x17 + .2byte 0x211 + .4byte 0x1125 + .uleb128 0xc + .4byte .LASF344 + .byte 0x17 + .2byte 0x212 + .4byte 0x1125 + .uleb128 0xc + .4byte .LASF345 + .byte 0x17 + .2byte 0x216 + .4byte 0x100 + .uleb128 0xc + .4byte .LASF346 + .byte 0x17 + .2byte 0x217 + .4byte 0x100 + .uleb128 0xc + .4byte .LASF347 + .byte 0x17 + .2byte 0x219 + .4byte 0x54 + .uleb128 0xc + .4byte .LASF348 + .byte 0x17 + .2byte 0x220 + .4byte 0x99b + .uleb128 0xc + .4byte .LASF349 + .byte 0x17 + .2byte 0x222 + .4byte 0xae + .uleb128 0xc + .4byte .LASF350 + .byte 0x17 + .2byte 0x224 + .4byte 0xae + .uleb128 0xc + .4byte .LASF351 + .byte 0x17 + .2byte 0x230 + .4byte 0x1009 + .uleb128 0x29 + .4byte .LASF353 + .byte 0x4 + .4byte 0x7f + .byte 0x17 + .2byte 0x286 + .4byte 0x11c0 + .uleb128 0x25 + .4byte .LASF354 + .byte 0 + .uleb128 0x25 + .4byte .LASF355 + .byte 0x1 + .uleb128 0x25 + .4byte .LASF356 + .byte 0x2 + .uleb128 0x25 + .4byte .LASF357 + .byte 0x3 + .byte 0 + .uleb128 0xc + .4byte .LASF358 + .byte 0x17 + .2byte 0x28c + .4byte 0x1196 + .uleb128 0x8 + .byte 0x8 + .4byte 0x94 + .uleb128 0x8 + .byte 0x8 + .4byte 0xa3 + .uleb128 0x8 + .byte 0x8 + .4byte 0xae + .uleb128 0xd + .4byte .LASF27 + .byte 0x78 + .byte 0x8 + .byte 0xf1 + .4byte 0x12b9 + .uleb128 0xe + .4byte .LASF28 + .byte 0x8 + .byte 0xf2 + .4byte 0xfa + .byte 0 + .uleb128 0xf + .string "id" + .byte 0x8 + .byte 0xf3 + .4byte 0x9ac + .byte 0x8 + .uleb128 0xe + .4byte .LASF359 + .byte 0x8 + .byte 0xf4 + .4byte 0x141c + .byte 0x10 + .uleb128 0xe + .4byte .LASF360 + .byte 0x8 + .byte 0xf5 + .4byte 0x1037 + .byte 0x18 + .uleb128 0xe + .4byte .LASF361 + .byte 0x8 + .byte 0xf6 + .4byte 0x1037 + .byte 0x20 + .uleb128 0xe + .4byte .LASF362 + .byte 0x8 + .byte 0xf7 + .4byte 0x1037 + .byte 0x28 + .uleb128 0xe + .4byte .LASF363 + .byte 0x8 + .byte 0xf8 + .4byte 0x1037 + .byte 0x30 + .uleb128 0xe + .4byte .LASF364 + .byte 0x8 + .byte 0xf9 + .4byte 0x1037 + .byte 0x38 + .uleb128 0xe + .4byte .LASF365 + .byte 0x8 + .byte 0xfa + .4byte 0x1037 + .byte 0x40 + .uleb128 0xe + .4byte .LASF366 + .byte 0x8 + .byte 0xfb + .4byte 0x1037 + .byte 0x48 + .uleb128 0xe + .4byte .LASF367 + .byte 0x8 + .byte 0xfc + .4byte 0x1037 + .byte 0x50 + .uleb128 0xe + .4byte .LASF368 + .byte 0x8 + .byte 0xfd + .4byte 0x54 + .byte 0x58 + .uleb128 0xe + .4byte .LASF369 + .byte 0x8 + .byte 0xfe + .4byte 0x54 + .byte 0x5c + .uleb128 0xe + .4byte .LASF370 + .byte 0x8 + .byte 0xff + .4byte 0x54 + .byte 0x60 + .uleb128 0x1e + .4byte .LASF371 + .byte 0x8 + .2byte 0x100 + .4byte 0x54 + .byte 0x64 + .uleb128 0x20 + .string "ops" + .byte 0x8 + .2byte 0x101 + .4byte 0x265 + .byte 0x68 + .uleb128 0x1e + .4byte .LASF42 + .byte 0x8 + .2byte 0x102 + .4byte 0x121 + .byte 0x70 + .byte 0 + .uleb128 0x7 + .4byte 0x11de + .uleb128 0x2 + .4byte .LASF313 + .byte 0x16 + .byte 0xf + .4byte 0xae + .uleb128 0xd + .4byte .LASF372 + .byte 0x20 + .byte 0x16 + .byte 0x19 + .4byte 0x1306 + .uleb128 0xe + .4byte .LASF28 + .byte 0x16 + .byte 0x1a + .4byte 0xfa + .byte 0 + .uleb128 0xe + .4byte .LASF373 + .byte 0x16 + .byte 0x1b + .4byte 0x54 + .byte 0x8 + .uleb128 0xe + .4byte .LASF374 + .byte 0x16 + .byte 0x1c + .4byte 0x137 + .byte 0x10 + .uleb128 0xe + .4byte .LASF47 + .byte 0x16 + .byte 0x1d + .4byte 0x1306 + .byte 0x18 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x12c9 + .uleb128 0x2a + .string "gd" + .byte 0x16 + .byte 0x57 + .4byte 0x1316 + .uleb128 0x8 + .byte 0x8 + .4byte 0xfb6 + .uleb128 0x2b + .4byte .LASF462 + .byte 0x8 + .byte 0x19 + .byte 0x33 + .4byte 0x133e + .uleb128 0x2c + .string "np" + .byte 0x19 + .byte 0x34 + .4byte 0x133e + .uleb128 0x2d + .4byte .LASF375 + .byte 0x19 + .byte 0x35 + .4byte 0xf3 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0xf85 + .uleb128 0x2 + .4byte .LASF376 + .byte 0x19 + .byte 0x36 + .4byte 0x131c + .uleb128 0xc + .4byte .LASF377 + .byte 0x1a + .2byte 0x3ba + .4byte 0x10b + .uleb128 0xc + .4byte .LASF378 + .byte 0x1a + .2byte 0x3bb + .4byte 0x10b + .uleb128 0xc + .4byte .LASF379 + .byte 0x1a + .2byte 0x3bc + .4byte 0x10b + .uleb128 0xd + .4byte .LASF380 + .byte 0x4 + .byte 0x1b + .byte 0xd + .4byte 0x138c + .uleb128 0xf + .string "pid" + .byte 0x1b + .byte 0xe + .4byte 0x54 + .byte 0 + .byte 0 + .uleb128 0x4 + .4byte .LASF381 + .byte 0x1b + .byte 0x11 + .4byte 0x1397 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1373 + .uleb128 0x8 + .byte 0x8 + .4byte 0x12b9 + .uleb128 0xd + .4byte .LASF36 + .byte 0x38 + .byte 0x1c + .byte 0x23 + .4byte 0x13ec + .uleb128 0xe + .4byte .LASF35 + .byte 0x1c + .byte 0x24 + .4byte 0x137 + .byte 0 + .uleb128 0xe + .4byte .LASF382 + .byte 0x1c + .byte 0x25 + .4byte 0x1506 + .byte 0x8 + .uleb128 0xe + .4byte .LASF383 + .byte 0x1c + .byte 0x26 + .4byte 0x292 + .byte 0x10 + .uleb128 0xe + .4byte .LASF41 + .byte 0x1c + .byte 0x27 + .4byte 0x292 + .byte 0x20 + .uleb128 0xe + .4byte .LASF384 + .byte 0x1c + .byte 0x29 + .4byte 0x2b7 + .byte 0x30 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x13a3 + .uleb128 0xd + .4byte .LASF385 + .byte 0x10 + .byte 0x8 + .byte 0xb8 + .4byte 0x1417 + .uleb128 0xe + .4byte .LASF386 + .byte 0x8 + .byte 0xb9 + .4byte 0xe1 + .byte 0 + .uleb128 0xe + .4byte .LASF387 + .byte 0x8 + .byte 0xba + .4byte 0x10b + .byte 0x8 + .byte 0 + .uleb128 0x7 + .4byte 0x13f2 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1417 + .uleb128 0xd + .4byte .LASF388 + .byte 0x80 + .byte 0x1c + .byte 0x57 + .4byte 0x1506 + .uleb128 0xe + .4byte .LASF28 + .byte 0x1c + .byte 0x58 + .4byte 0xe1 + .byte 0 + .uleb128 0xf + .string "id" + .byte 0x1c + .byte 0x59 + .4byte 0x9ac + .byte 0x8 + .uleb128 0xe + .4byte .LASF389 + .byte 0x1c + .byte 0x5a + .4byte 0x1037 + .byte 0x10 + .uleb128 0xe + .4byte .LASF390 + .byte 0x1c + .byte 0x5b + .4byte 0x1037 + .byte 0x18 + .uleb128 0xe + .4byte .LASF391 + .byte 0x1c + .byte 0x5c + .4byte 0x1037 + .byte 0x20 + .uleb128 0xe + .4byte .LASF392 + .byte 0x1c + .byte 0x5d + .4byte 0x1037 + .byte 0x28 + .uleb128 0xe + .4byte .LASF393 + .byte 0x1c + .byte 0x5e + .4byte 0x1037 + .byte 0x30 + .uleb128 0xe + .4byte .LASF365 + .byte 0x1c + .byte 0x5f + .4byte 0x1037 + .byte 0x38 + .uleb128 0xe + .4byte .LASF366 + .byte 0x1c + .byte 0x60 + .4byte 0x1037 + .byte 0x40 + .uleb128 0xe + .4byte .LASF394 + .byte 0x1c + .byte 0x61 + .4byte 0x151b + .byte 0x48 + .uleb128 0xe + .4byte .LASF395 + .byte 0x1c + .byte 0x62 + .4byte 0x151b + .byte 0x50 + .uleb128 0xe + .4byte .LASF368 + .byte 0x1c + .byte 0x63 + .4byte 0x54 + .byte 0x58 + .uleb128 0xe + .4byte .LASF396 + .byte 0x1c + .byte 0x64 + .4byte 0x54 + .byte 0x5c + .uleb128 0xe + .4byte .LASF397 + .byte 0x1c + .byte 0x65 + .4byte 0x54 + .byte 0x60 + .uleb128 0xe + .4byte .LASF370 + .byte 0x1c + .byte 0x66 + .4byte 0x54 + .byte 0x64 + .uleb128 0xe + .4byte .LASF371 + .byte 0x1c + .byte 0x67 + .4byte 0x54 + .byte 0x68 + .uleb128 0xf + .string "ops" + .byte 0x1c + .byte 0x68 + .4byte 0x265 + .byte 0x70 + .uleb128 0xe + .4byte .LASF42 + .byte 0x1c + .byte 0x69 + .4byte 0x121 + .byte 0x78 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1422 + .uleb128 0x12 + .4byte 0x54 + .4byte 0x151b + .uleb128 0x13 + .4byte 0x13ec + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x150c + .uleb128 0x4 + .4byte .LASF398 + .byte 0x1d + .byte 0x49 + .4byte 0x7f + .uleb128 0x24 + .4byte .LASF399 + .byte 0x4 + .4byte 0x7f + .byte 0x1e + .byte 0x15 + .4byte 0x155b + .uleb128 0x25 + .4byte .LASF400 + .byte 0x1 + .uleb128 0x25 + .4byte .LASF401 + .byte 0x2 + .uleb128 0x25 + .4byte .LASF402 + .byte 0x4 + .uleb128 0x25 + .4byte .LASF403 + .byte 0x8 + .uleb128 0x25 + .4byte .LASF404 + .byte 0x10 + .byte 0 + .uleb128 0xd + .4byte .LASF405 + .byte 0x20 + .byte 0x1e + .byte 0x61 + .4byte 0x1598 + .uleb128 0xe + .4byte .LASF406 + .byte 0x1e + .byte 0x6b + .4byte 0x15bb + .byte 0 + .uleb128 0xe + .4byte .LASF407 + .byte 0x1e + .byte 0x75 + .4byte 0x15df + .byte 0x8 + .uleb128 0xe + .4byte .LASF408 + .byte 0x1e + .byte 0x7f + .4byte 0x15fe + .byte 0x10 + .uleb128 0xe + .4byte .LASF409 + .byte 0x1e + .byte 0x8c + .4byte 0x162c + .byte 0x18 + .byte 0 + .uleb128 0x7 + .4byte 0x155b + .uleb128 0x12 + .4byte 0x54 + .4byte 0x15bb + .uleb128 0x13 + .4byte 0x25f + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x137 + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x159d + .uleb128 0x12 + .4byte 0x54 + .4byte 0x15df + .uleb128 0x13 + .4byte 0x25f + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x265 + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x15c1 + .uleb128 0x12 + .4byte 0x54 + .4byte 0x15fe + .uleb128 0x13 + .4byte 0x25f + .uleb128 0x13 + .4byte 0x3b + .uleb128 0x13 + .4byte 0x137 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x15e5 + .uleb128 0x12 + .4byte 0x54 + .4byte 0x162c + .uleb128 0x13 + .4byte 0x25f + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x137 + .uleb128 0x13 + .4byte 0x54 + .uleb128 0x13 + .4byte 0x137 + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1604 + .uleb128 0xd + .4byte .LASF410 + .byte 0x20 + .byte 0x1f + .byte 0x5e + .4byte 0x166f + .uleb128 0xe + .4byte .LASF60 + .byte 0x1f + .byte 0x5f + .4byte 0x137 + .byte 0 + .uleb128 0xe + .4byte .LASF411 + .byte 0x1f + .byte 0x60 + .4byte 0x3b + .byte 0x8 + .uleb128 0xe + .4byte .LASF412 + .byte 0x1f + .byte 0x61 + .4byte 0x3b + .byte 0x10 + .uleb128 0xe + .4byte .LASF413 + .byte 0x1f + .byte 0x62 + .4byte 0x3b + .byte 0x18 + .byte 0 + .uleb128 0xd + .4byte .LASF414 + .byte 0x20 + .byte 0x1 + .byte 0xf + .4byte 0x16ac + .uleb128 0xe + .4byte .LASF406 + .byte 0x1 + .byte 0x10 + .4byte 0x15bb + .byte 0 + .uleb128 0xe + .4byte .LASF407 + .byte 0x1 + .byte 0x11 + .4byte 0x15df + .byte 0x8 + .uleb128 0xe + .4byte .LASF415 + .byte 0x1 + .byte 0x12 + .4byte 0x16cb + .byte 0x10 + .uleb128 0xe + .4byte .LASF416 + .byte 0x1 + .byte 0x15 + .4byte 0x16cb + .byte 0x18 + .byte 0 + .uleb128 0x7 + .4byte 0x166f + .uleb128 0x2e + .4byte 0x16cb + .uleb128 0x13 + .4byte 0x11d8 + .uleb128 0x13 + .4byte 0x11d8 + .uleb128 0x13 + .4byte 0x3b + .uleb128 0x13 + .4byte 0x54 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x16b1 + .uleb128 0x2f + .4byte .LASF417 + .byte 0x1 + .2byte 0x2c7 + .4byte 0x1598 + .uleb128 0x9 + .byte 0x3 + .8byte rockchip_secure_otp_ops + .uleb128 0x2f + .4byte .LASF418 + .byte 0x1 + .2byte 0x2dc + .4byte 0x16ac + .uleb128 0x9 + .byte 0x3 + .8byte rk3562_data + .uleb128 0xa + .4byte 0x1417 + .4byte 0x170d + .uleb128 0x11 + .4byte 0xda + .byte 0x1 + .byte 0 + .uleb128 0x7 + .4byte 0x16fd + .uleb128 0x2f + .4byte .LASF419 + .byte 0x1 + .2byte 0x2e3 + .4byte 0x170d + .uleb128 0x9 + .byte 0x3 + .8byte rockchip_otp_ids + .uleb128 0x30 + .4byte .LASF420 + .byte 0x1 + .2byte 0x2eb + .4byte 0x11de + .uleb128 0x9 + .byte 0x3 + .8byte _u_boot_list_2_driver_2_rockchip_secure_otp + .uleb128 0x31 + .4byte .LASF421 + .byte 0x1 + .2byte 0x2cd + .4byte 0x54 + .8byte .LFB277 + .8byte .LFE277-.LFB277 + .uleb128 0x1 + .byte 0x9c + .4byte 0x182b + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x2cd + .4byte 0x25f + .4byte .LLST14 + .uleb128 0x33 + .string "otp" + .byte 0x1 + .2byte 0x2cf + .4byte 0x182b + .4byte .LLST15 + .uleb128 0x34 + .8byte .LVL20 + .4byte 0x4289 + .4byte 0x1798 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL23 + .4byte 0x4295 + .4byte 0x17b0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL24 + .4byte 0x42a0 + .4byte 0x17da + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LC0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x1 + .byte 0x30 + .byte 0 + .uleb128 0x34 + .8byte .LVL25 + .4byte 0x42a0 + .4byte 0x1804 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LC1 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x1 + .byte 0x30 + .byte 0 + .uleb128 0x36 + .8byte .LVL26 + .4byte 0x42a0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LC2 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x1 + .byte 0x30 + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x1632 + .uleb128 0x31 + .4byte .LASF422 + .byte 0x1 + .2byte 0x2b6 + .4byte 0x54 + .8byte .LFB276 + .8byte .LFE276-.LFB276 + .uleb128 0x1 + .byte 0x9c + .4byte 0x18b2 + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x2b6 + .4byte 0x25f + .4byte .LLST1 + .uleb128 0x37 + .4byte .LASF423 + .byte 0x1 + .2byte 0x2b7 + .4byte 0x3b + .uleb128 0x1 + .byte 0x51 + .uleb128 0x38 + .string "buf" + .byte 0x1 + .2byte 0x2b8 + .4byte 0x137 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x33 + .string "ret" + .byte 0x1 + .2byte 0x2ba + .4byte 0x54 + .4byte .LLST2 + .uleb128 0x39 + .4byte 0x18b2 + .8byte .LBB23 + .8byte .LBE23-.LBB23 + .byte 0x1 + .2byte 0x2be + .uleb128 0x3a + .4byte 0x18c3 + .4byte .LLST3 + .byte 0 + .byte 0 + .uleb128 0x3b + .4byte .LASF431 + .byte 0x1 + .2byte 0x2af + .4byte 0x54 + .byte 0x1 + .4byte 0x18d0 + .uleb128 0x3c + .string "buf" + .byte 0x1 + .2byte 0x2af + .4byte 0x11d8 + .byte 0 + .uleb128 0x31 + .4byte .LASF424 + .byte 0x1 + .2byte 0x2a7 + .4byte 0x54 + .8byte .LFB274 + .8byte .LFE274-.LFB274 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1981 + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x2a7 + .4byte 0x25f + .4byte .LLST4 + .uleb128 0x3d + .4byte .LASF425 + .byte 0x1 + .2byte 0x2a7 + .4byte 0x54 + .4byte .LLST5 + .uleb128 0x32 + .string "buf" + .byte 0x1 + .2byte 0x2a8 + .4byte 0x265 + .4byte .LLST6 + .uleb128 0x3d + .4byte .LASF51 + .byte 0x1 + .2byte 0x2a8 + .4byte 0x54 + .4byte .LLST7 + .uleb128 0x3e + .4byte .LASF426 + .byte 0x1 + .2byte 0x2aa + .4byte 0x1981 + .4byte .LLST8 + .uleb128 0x34 + .8byte .LVL8 + .4byte 0x42ab + .4byte 0x195a + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x3f + .8byte .LVL12 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0 + .byte 0 + .uleb128 0x8 + .byte 0x8 + .4byte 0x166f + .uleb128 0x31 + .4byte .LASF427 + .byte 0x1 + .2byte 0x29f + .4byte 0x54 + .8byte .LFB273 + .8byte .LFE273-.LFB273 + .uleb128 0x1 + .byte 0x9c + .4byte 0x1a38 + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x29f + .4byte 0x25f + .4byte .LLST9 + .uleb128 0x3d + .4byte .LASF425 + .byte 0x1 + .2byte 0x29f + .4byte 0x54 + .4byte .LLST10 + .uleb128 0x32 + .string "buf" + .byte 0x1 + .2byte 0x2a0 + .4byte 0x137 + .4byte .LLST11 + .uleb128 0x3d + .4byte .LASF51 + .byte 0x1 + .2byte 0x2a0 + .4byte 0x54 + .4byte .LLST12 + .uleb128 0x3e + .4byte .LASF426 + .byte 0x1 + .2byte 0x2a2 + .4byte 0x1981 + .4byte .LLST13 + .uleb128 0x34 + .8byte .LVL14 + .4byte 0x42ab + .4byte 0x1a11 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x3f + .8byte .LVL18 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0 + .byte 0 + .uleb128 0x31 + .4byte .LASF428 + .byte 0x1 + .2byte 0x26c + .4byte 0x54 + .8byte .LFB272 + .8byte .LFE272-.LFB272 + .uleb128 0x1 + .byte 0x9c + .4byte 0x2564 + .uleb128 0x32 + .string "dev" + .byte 0x1 + .2byte 0x26c + .4byte 0x25f + .4byte .LLST69 + .uleb128 0x3d + .4byte .LASF425 + .byte 0x1 + .2byte 0x26c + .4byte 0x54 + .4byte .LLST70 + .uleb128 0x32 + .string "buf" + .byte 0x1 + .2byte 0x26c + .4byte 0x265 + .4byte .LLST71 + .uleb128 0x3d + .4byte .LASF51 + .byte 0x1 + .2byte 0x26c + .4byte 0x54 + .4byte .LLST72 + .uleb128 0x33 + .string "otp" + .byte 0x1 + .2byte 0x26e + .4byte 0x182b + .4byte .LLST73 + .uleb128 0x3e + .4byte .LASF387 + .byte 0x1 + .2byte 0x26f + .4byte 0x11d2 + .4byte .LLST74 + .uleb128 0x3e + .4byte .LASF429 + .byte 0x1 + .2byte 0x270 + .4byte 0xfa + .4byte .LLST74 + .uleb128 0x3e + .4byte .LASF430 + .byte 0x1 + .2byte 0x271 + .4byte 0xfa + .4byte .LLST76 + .uleb128 0x33 + .string "i" + .byte 0x1 + .2byte 0x272 + .4byte 0x54 + .4byte .LLST77 + .uleb128 0x33 + .string "ret" + .byte 0x1 + .2byte 0x272 + .4byte 0x54 + .4byte .LLST78 + .uleb128 0x40 + .4byte 0x2564 + .8byte .LBB244 + .4byte .Ldebug_ranges0+0x3f0 + .byte 0x1 + .2byte 0x294 + .4byte 0x2436 + .uleb128 0x3a + .4byte 0x2599 + .4byte .LLST79 + .uleb128 0x3a + .4byte 0x258d + .4byte .LLST80 + .uleb128 0x3a + .4byte 0x2581 + .4byte .LLST81 + .uleb128 0x3a + .4byte 0x2575 + .4byte .LLST82 + .uleb128 0x41 + .4byte .Ldebug_ranges0+0x3f0 + .uleb128 0x42 + .4byte 0x25a5 + .4byte .LLST83 + .uleb128 0x42 + .4byte 0x25b1 + .4byte .LLST84 + .uleb128 0x43 + .4byte 0x25ca + .8byte .L88 + .uleb128 0x44 + .4byte 0x25bd + .uleb128 0x45 + .8byte .LBB246 + .8byte .LBE246-.LBB246 + .4byte 0x1b7c + .uleb128 0x42 + .4byte 0x25d7 + .4byte .LLST85 + .byte 0 + .uleb128 0x45 + .8byte .LBB247 + .8byte .LBE247-.LBB247 + .4byte 0x1b9b + .uleb128 0x42 + .4byte 0x25e9 + .4byte .LLST86 + .byte 0 + .uleb128 0x45 + .8byte .LBB248 + .8byte .LBE248-.LBB248 + .4byte 0x1bba + .uleb128 0x42 + .4byte 0x25fb + .4byte .LLST87 + .byte 0 + .uleb128 0x45 + .8byte .LBB249 + .8byte .LBE249-.LBB249 + .4byte 0x1bd9 + .uleb128 0x42 + .4byte 0x260d + .4byte .LLST88 + .byte 0 + .uleb128 0x45 + .8byte .LBB250 + .8byte .LBE250-.LBB250 + .4byte 0x1bf8 + .uleb128 0x42 + .4byte 0x261f + .4byte .LLST89 + .byte 0 + .uleb128 0x45 + .8byte .LBB251 + .8byte .LBE251-.LBB251 + .4byte 0x1c17 + .uleb128 0x42 + .4byte 0x2631 + .4byte .LLST90 + .byte 0 + .uleb128 0x45 + .8byte .LBB252 + .8byte .LBE252-.LBB252 + .4byte 0x1c36 + .uleb128 0x42 + .4byte 0x2643 + .4byte .LLST91 + .byte 0 + .uleb128 0x45 + .8byte .LBB253 + .8byte .LBE253-.LBB253 + .4byte 0x1c55 + .uleb128 0x42 + .4byte 0x2655 + .4byte .LLST92 + .byte 0 + .uleb128 0x45 + .8byte .LBB254 + .8byte .LBE254-.LBB254 + .4byte 0x1c74 + .uleb128 0x42 + .4byte 0x2667 + .4byte .LLST93 + .byte 0 + .uleb128 0x45 + .8byte .LBB255 + .8byte .LBE255-.LBB255 + .4byte 0x1c93 + .uleb128 0x42 + .4byte 0x2679 + .4byte .LLST94 + .byte 0 + .uleb128 0x45 + .8byte .LBB256 + .8byte .LBE256-.LBB256 + .4byte 0x1cb2 + .uleb128 0x42 + .4byte 0x268b + .4byte .LLST95 + .byte 0 + .uleb128 0x45 + .8byte .LBB257 + .8byte .LBE257-.LBB257 + .4byte 0x1cd1 + .uleb128 0x42 + .4byte 0x269d + .4byte .LLST96 + .byte 0 + .uleb128 0x45 + .8byte .LBB258 + .8byte .LBE258-.LBB258 + .4byte 0x1cf0 + .uleb128 0x42 + .4byte 0x26af + .4byte .LLST97 + .byte 0 + .uleb128 0x45 + .8byte .LBB259 + .8byte .LBE259-.LBB259 + .4byte 0x1d0f + .uleb128 0x42 + .4byte 0x26c1 + .4byte .LLST98 + .byte 0 + .uleb128 0x45 + .8byte .LBB260 + .8byte .LBE260-.LBB260 + .4byte 0x1d2e + .uleb128 0x42 + .4byte 0x26d3 + .4byte .LLST99 + .byte 0 + .uleb128 0x45 + .8byte .LBB261 + .8byte .LBE261-.LBB261 + .4byte 0x1d4d + .uleb128 0x42 + .4byte 0x26e5 + .4byte .LLST100 + .byte 0 + .uleb128 0x45 + .8byte .LBB262 + .8byte .LBE262-.LBB262 + .4byte 0x1d6c + .uleb128 0x42 + .4byte 0x26f7 + .4byte .LLST101 + .byte 0 + .uleb128 0x45 + .8byte .LBB263 + .8byte .LBE263-.LBB263 + .4byte 0x1d8b + .uleb128 0x42 + .4byte 0x2709 + .4byte .LLST102 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x450 + .4byte 0x1d9e + .uleb128 0x42 + .4byte 0x271b + .4byte .LLST103 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x480 + .4byte 0x1db1 + .uleb128 0x42 + .4byte 0x272d + .4byte .LLST104 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x4b0 + .4byte 0x1dc4 + .uleb128 0x42 + .4byte 0x273f + .4byte .LLST105 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x4e0 + .4byte 0x1dd7 + .uleb128 0x42 + .4byte 0x2a2f + .4byte .LLST106 + .byte 0 + .uleb128 0x45 + .8byte .LBB272 + .8byte .LBE272-.LBB272 + .4byte 0x1df6 + .uleb128 0x42 + .4byte 0x2751 + .4byte .LLST107 + .byte 0 + .uleb128 0x45 + .8byte .LBB273 + .8byte .LBE273-.LBB273 + .4byte 0x1e15 + .uleb128 0x42 + .4byte 0x2763 + .4byte .LLST108 + .byte 0 + .uleb128 0x45 + .8byte .LBB274 + .8byte .LBE274-.LBB274 + .4byte 0x1e34 + .uleb128 0x42 + .4byte 0x2775 + .4byte .LLST109 + .byte 0 + .uleb128 0x45 + .8byte .LBB275 + .8byte .LBE275-.LBB275 + .4byte 0x1e53 + .uleb128 0x42 + .4byte 0x2787 + .4byte .LLST110 + .byte 0 + .uleb128 0x45 + .8byte .LBB276 + .8byte .LBE276-.LBB276 + .4byte 0x1e72 + .uleb128 0x42 + .4byte 0x2799 + .4byte .LLST111 + .byte 0 + .uleb128 0x45 + .8byte .LBB277 + .8byte .LBE277-.LBB277 + .4byte 0x1e91 + .uleb128 0x42 + .4byte 0x27ab + .4byte .LLST112 + .byte 0 + .uleb128 0x45 + .8byte .LBB278 + .8byte .LBE278-.LBB278 + .4byte 0x1eb0 + .uleb128 0x42 + .4byte 0x27bd + .4byte .LLST113 + .byte 0 + .uleb128 0x45 + .8byte .LBB279 + .8byte .LBE279-.LBB279 + .4byte 0x1ecf + .uleb128 0x42 + .4byte 0x27cf + .4byte .LLST114 + .byte 0 + .uleb128 0x45 + .8byte .LBB280 + .8byte .LBE280-.LBB280 + .4byte 0x1eee + .uleb128 0x42 + .4byte 0x27e1 + .4byte .LLST115 + .byte 0 + .uleb128 0x45 + .8byte .LBB281 + .8byte .LBE281-.LBB281 + .4byte 0x1f0d + .uleb128 0x42 + .4byte 0x27f3 + .4byte .LLST116 + .byte 0 + .uleb128 0x45 + .8byte .LBB282 + .8byte .LBE282-.LBB282 + .4byte 0x1f2c + .uleb128 0x42 + .4byte 0x2805 + .4byte .LLST117 + .byte 0 + .uleb128 0x45 + .8byte .LBB283 + .8byte .LBE283-.LBB283 + .4byte 0x1f4b + .uleb128 0x42 + .4byte 0x2817 + .4byte .LLST118 + .byte 0 + .uleb128 0x45 + .8byte .LBB284 + .8byte .LBE284-.LBB284 + .4byte 0x1f6a + .uleb128 0x42 + .4byte 0x2829 + .4byte .LLST119 + .byte 0 + .uleb128 0x45 + .8byte .LBB285 + .8byte .LBE285-.LBB285 + .4byte 0x1f89 + .uleb128 0x42 + .4byte 0x283b + .4byte .LLST120 + .byte 0 + .uleb128 0x45 + .8byte .LBB286 + .8byte .LBE286-.LBB286 + .4byte 0x1fa8 + .uleb128 0x42 + .4byte 0x284d + .4byte .LLST121 + .byte 0 + .uleb128 0x45 + .8byte .LBB287 + .8byte .LBE287-.LBB287 + .4byte 0x1fc7 + .uleb128 0x42 + .4byte 0x285f + .4byte .LLST122 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x510 + .4byte 0x1fda + .uleb128 0x42 + .4byte 0x2871 + .4byte .LLST123 + .byte 0 + .uleb128 0x45 + .8byte .LBB290 + .8byte .LBE290-.LBB290 + .4byte 0x1ff9 + .uleb128 0x42 + .4byte 0x2883 + .4byte .LLST124 + .byte 0 + .uleb128 0x45 + .8byte .LBB291 + .8byte .LBE291-.LBB291 + .4byte 0x2018 + .uleb128 0x42 + .4byte 0x2895 + .4byte .LLST125 + .byte 0 + .uleb128 0x45 + .8byte .LBB292 + .8byte .LBE292-.LBB292 + .4byte 0x2037 + .uleb128 0x42 + .4byte 0x28a7 + .4byte .LLST126 + .byte 0 + .uleb128 0x45 + .8byte .LBB293 + .8byte .LBE293-.LBB293 + .4byte 0x2056 + .uleb128 0x42 + .4byte 0x28b9 + .4byte .LLST127 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x540 + .4byte 0x2069 + .uleb128 0x42 + .4byte 0x28cb + .4byte .LLST128 + .byte 0 + .uleb128 0x45 + .8byte .LBB296 + .8byte .LBE296-.LBB296 + .4byte 0x2088 + .uleb128 0x42 + .4byte 0x28dd + .4byte .LLST129 + .byte 0 + .uleb128 0x45 + .8byte .LBB297 + .8byte .LBE297-.LBB297 + .4byte 0x20a7 + .uleb128 0x42 + .4byte 0x28ef + .4byte .LLST130 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x570 + .4byte 0x20ba + .uleb128 0x42 + .4byte 0x2901 + .4byte .LLST131 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x5a0 + .4byte 0x20cd + .uleb128 0x42 + .4byte 0x2913 + .4byte .LLST132 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x5d0 + .4byte 0x20e0 + .uleb128 0x42 + .4byte 0x2925 + .4byte .LLST133 + .byte 0 + .uleb128 0x45 + .8byte .LBB304 + .8byte .LBE304-.LBB304 + .4byte 0x20ff + .uleb128 0x42 + .4byte 0x2937 + .4byte .LLST134 + .byte 0 + .uleb128 0x45 + .8byte .LBB305 + .8byte .LBE305-.LBB305 + .4byte 0x211e + .uleb128 0x42 + .4byte 0x2949 + .4byte .LLST135 + .byte 0 + .uleb128 0x45 + .8byte .LBB306 + .8byte .LBE306-.LBB306 + .4byte 0x213d + .uleb128 0x42 + .4byte 0x295b + .4byte .LLST136 + .byte 0 + .uleb128 0x45 + .8byte .LBB307 + .8byte .LBE307-.LBB307 + .4byte 0x215c + .uleb128 0x42 + .4byte 0x296d + .4byte .LLST137 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x600 + .4byte 0x216f + .uleb128 0x42 + .4byte 0x297f + .4byte .LLST138 + .byte 0 + .uleb128 0x45 + .8byte .LBB310 + .8byte .LBE310-.LBB310 + .4byte 0x218e + .uleb128 0x42 + .4byte 0x2991 + .4byte .LLST139 + .byte 0 + .uleb128 0x45 + .8byte .LBB311 + .8byte .LBE311-.LBB311 + .4byte 0x21ad + .uleb128 0x42 + .4byte 0x29a3 + .4byte .LLST140 + .byte 0 + .uleb128 0x45 + .8byte .LBB312 + .8byte .LBE312-.LBB312 + .4byte 0x21cc + .uleb128 0x42 + .4byte 0x29b5 + .4byte .LLST141 + .byte 0 + .uleb128 0x45 + .8byte .LBB313 + .8byte .LBE313-.LBB313 + .4byte 0x21eb + .uleb128 0x42 + .4byte 0x29c7 + .4byte .LLST142 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x630 + .4byte 0x21fe + .uleb128 0x42 + .4byte 0x29d9 + .4byte .LLST143 + .byte 0 + .uleb128 0x45 + .8byte .LBB316 + .8byte .LBE316-.LBB316 + .4byte 0x221d + .uleb128 0x42 + .4byte 0x29eb + .4byte .LLST144 + .byte 0 + .uleb128 0x45 + .8byte .LBB317 + .8byte .LBE317-.LBB317 + .4byte 0x223c + .uleb128 0x42 + .4byte 0x29fd + .4byte .LLST145 + .byte 0 + .uleb128 0x45 + .8byte .LBB318 + .8byte .LBE318-.LBB318 + .4byte 0x225b + .uleb128 0x42 + .4byte 0x2a0f + .4byte .LLST146 + .byte 0 + .uleb128 0x45 + .8byte .LBB319 + .8byte .LBE319-.LBB319 + .4byte 0x227a + .uleb128 0x42 + .4byte 0x2a21 + .4byte .LLST147 + .byte 0 + .uleb128 0x34 + .8byte .LVL263 + .4byte 0x42ab + .4byte 0x2292 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL266 + .4byte 0x42b7 + .4byte 0x22ba + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC4 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x5 + .byte 0x85 + .sleb128 0 + .byte 0x9 + .byte 0xfe + .byte 0x1a + .byte 0 + .uleb128 0x47 + .8byte .LVL289 + .4byte 0x22ce + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL310 + .4byte 0x401e + .4byte 0x22f3 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x49 + .8byte .LVL314 + .4byte 0x42b7 + .uleb128 0x47 + .8byte .LVL315 + .4byte 0x2314 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL336 + .4byte 0x401e + .4byte 0x233a + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL345 + .4byte 0x401e + .4byte 0x2360 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL355 + .4byte 0x401e + .4byte 0x2386 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL364 + .4byte 0x401e + .4byte 0x23ac + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL373 + .4byte 0x401e + .4byte 0x23d2 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL378 + .4byte 0x3f49 + .4byte 0x23f2 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x48 + .4byte 0x3ce6 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL386 + .4byte 0x401e + .4byte 0x2418 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .uleb128 0x36 + .8byte .LVL391 + .4byte 0x3fb3 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d30 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x40 + .4byte 0x2a52 + .8byte .LBB326 + .4byte .Ldebug_ranges0+0x660 + .byte 0x1 + .2byte 0x28c + .4byte 0x24d7 + .uleb128 0x3a + .4byte 0x2a87 + .4byte .LLST148 + .uleb128 0x3a + .4byte 0x2a7b + .4byte .LLST149 + .uleb128 0x3a + .4byte 0x2a6f + .4byte .LLST150 + .uleb128 0x3a + .4byte 0x2a63 + .4byte .LLST151 + .uleb128 0x41 + .4byte .Ldebug_ranges0+0x660 + .uleb128 0x42 + .4byte 0x2a93 + .4byte .LLST152 + .uleb128 0x4a + .4byte 0x2a9f + .uleb128 0x2 + .byte 0x91 + .sleb128 -2 + .uleb128 0x42 + .4byte 0x2aab + .4byte .LLST153 + .uleb128 0x34 + .8byte .LVL274 + .4byte 0x39d5 + .4byte 0x24bb + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x3 + .byte 0x8f + .sleb128 254 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x1 + .byte 0x32 + .byte 0 + .uleb128 0x36 + .8byte .LVL279 + .4byte 0x2ab8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x8c + .sleb128 0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL247 + .4byte 0x4289 + .4byte 0x24ef + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL250 + .4byte 0x42c2 + .4byte 0x250d + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x8 + .byte 0x85 + .sleb128 0 + .byte 0x8 + .byte 0x20 + .byte 0x24 + .byte 0x8 + .byte 0x20 + .byte 0x26 + .byte 0 + .uleb128 0x34 + .8byte .LVL268 + .4byte 0x39d5 + .4byte 0x2537 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x88 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x52 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x85 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL271 + .4byte 0x42b7 + .4byte 0x2556 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC12 + .byte 0 + .uleb128 0x49 + .8byte .LVL282 + .4byte 0x42b7 + .byte 0 + .uleb128 0x3b + .4byte .LASF432 + .byte 0x1 + .2byte 0x1d6 + .4byte 0x54 + .byte 0x1 + .4byte 0x2a3d + .uleb128 0x3c + .string "dev" + .byte 0x1 + .2byte 0x1d6 + .4byte 0x25f + .uleb128 0x3c + .string "otp" + .byte 0x1 + .2byte 0x1d7 + .4byte 0x182b + .uleb128 0x4b + .4byte .LASF425 + .byte 0x1 + .2byte 0x1d8 + .4byte 0x54 + .uleb128 0x4b + .4byte .LASF387 + .byte 0x1 + .2byte 0x1d8 + .4byte 0xa3 + .uleb128 0x4c + .string "ret" + .byte 0x1 + .2byte 0x1da + .4byte 0x54 + .uleb128 0x4d + .4byte .LASF426 + .byte 0x1 + .2byte 0x1db + .4byte 0x1981 + .uleb128 0x4e + .4byte .LASF433 + .4byte 0x2a4d + .4byte .LASF432 + .uleb128 0x4f + .4byte .LASF439 + .byte 0x1 + .2byte 0x263 + .uleb128 0x50 + .4byte 0x25e4 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1ef + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x25f6 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f0 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2608 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f1 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x261a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f2 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x262c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f3 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x263e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f4 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2650 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f5 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2662 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f6 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2674 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f7 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2686 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f8 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2698 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1f9 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26aa + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fa + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26bc + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fb + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26ce + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fc + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26e0 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fd + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x26f2 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1fe + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2704 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x1ff + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2716 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x200 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2728 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x201 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x273a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x202 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x274c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x203 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x275e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20a + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2770 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20b + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2782 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20c + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2794 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20d + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27a6 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20e + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27b8 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x20f + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27ca + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x210 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27dc + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x211 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x27ee + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x212 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2800 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x213 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2812 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x214 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2824 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x215 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2836 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x216 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2848 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x217 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x285a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x218 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x286c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x219 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x287e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x21a + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2890 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x221 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28a2 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x222 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28b4 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x223 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28c6 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x224 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28d8 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x225 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28ea + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x22c + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x28fc + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x22d + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x290e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x22e + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2920 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x22f + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2932 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x230 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2944 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x237 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2956 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x238 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2968 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x239 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x297a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x23a + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x298c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x23b + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x299e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x242 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29b0 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x243 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29c2 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x244 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29d4 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x245 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29e6 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x246 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x29f8 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x253 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2a0a + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x254 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2a1c + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x255 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x2a2e + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x256 + .4byte 0xae + .byte 0 + .uleb128 0x51 + .uleb128 0x4c + .string "__v" + .byte 0x1 + .2byte 0x264 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0xa + .4byte 0xee + .4byte 0x2a4d + .uleb128 0x11 + .4byte 0xda + .byte 0x1f + .byte 0 + .uleb128 0x7 + .4byte 0x2a3d + .uleb128 0x3b + .4byte .LASF434 + .byte 0x1 + .2byte 0x1c0 + .4byte 0x54 + .byte 0x1 + .4byte 0x2ab8 + .uleb128 0x3c + .string "dev" + .byte 0x1 + .2byte 0x1c0 + .4byte 0x25f + .uleb128 0x3c + .string "otp" + .byte 0x1 + .2byte 0x1c1 + .4byte 0x182b + .uleb128 0x4b + .4byte .LASF425 + .byte 0x1 + .2byte 0x1c2 + .4byte 0x54 + .uleb128 0x4b + .4byte .LASF387 + .byte 0x1 + .2byte 0x1c2 + .4byte 0x94 + .uleb128 0x4d + .4byte .LASF435 + .byte 0x1 + .2byte 0x1c4 + .4byte 0xa3 + .uleb128 0x4d + .4byte .LASF430 + .byte 0x1 + .2byte 0x1c4 + .4byte 0xa3 + .uleb128 0x4c + .string "ret" + .byte 0x1 + .2byte 0x1c5 + .4byte 0x54 + .byte 0 + .uleb128 0x52 + .4byte .LASF436 + .byte 0x1 + .byte 0xed + .4byte 0x54 + .8byte .LFB269 + .8byte .LFE269-.LFB269 + .uleb128 0x1 + .byte 0x9c + .4byte 0x39c0 + .uleb128 0x53 + .string "dev" + .byte 0x1 + .byte 0xed + .4byte 0x25f + .4byte .LLST30 + .uleb128 0x53 + .string "otp" + .byte 0x1 + .byte 0xee + .4byte 0x182b + .4byte .LLST31 + .uleb128 0x54 + .4byte .LASF425 + .byte 0x1 + .byte 0xef + .4byte 0x54 + .4byte .LLST32 + .uleb128 0x54 + .4byte .LASF387 + .byte 0x1 + .byte 0xef + .4byte 0xa3 + .4byte .LLST33 + .uleb128 0x55 + .string "ret" + .byte 0x1 + .byte 0xf1 + .4byte 0x54 + .4byte .LLST34 + .uleb128 0x56 + .4byte .LASF426 + .byte 0x1 + .byte 0xf2 + .4byte 0x1981 + .4byte .LLST35 + .uleb128 0x57 + .4byte .LASF433 + .4byte 0x39d0 + .uleb128 0x9 + .byte 0x3 + .8byte __func__.7678 + .uleb128 0x58 + .4byte .LASF439 + .byte 0x1 + .2byte 0x1b9 + .8byte .L39 + .uleb128 0x45 + .8byte .LBB40 + .8byte .LBE40-.LBB40 + .4byte 0x2b7c + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x106 + .4byte 0xae + .4byte .LLST36 + .byte 0 + .uleb128 0x45 + .8byte .LBB41 + .8byte .LBE41-.LBB41 + .4byte 0x2ba2 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x107 + .4byte 0xae + .4byte .LLST37 + .byte 0 + .uleb128 0x45 + .8byte .LBB42 + .8byte .LBE42-.LBB42 + .4byte 0x2bc8 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x108 + .4byte 0xae + .4byte .LLST38 + .byte 0 + .uleb128 0x45 + .8byte .LBB43 + .8byte .LBE43-.LBB43 + .4byte 0x2bee + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x109 + .4byte 0xae + .4byte .LLST39 + .byte 0 + .uleb128 0x45 + .8byte .LBB44 + .8byte .LBE44-.LBB44 + .4byte 0x2c14 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10a + .4byte 0xae + .4byte .LLST40 + .byte 0 + .uleb128 0x45 + .8byte .LBB45 + .8byte .LBE45-.LBB45 + .4byte 0x2c3a + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10b + .4byte 0xae + .4byte .LLST41 + .byte 0 + .uleb128 0x45 + .8byte .LBB46 + .8byte .LBE46-.LBB46 + .4byte 0x2c60 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10c + .4byte 0xae + .4byte .LLST42 + .byte 0 + .uleb128 0x45 + .8byte .LBB47 + .8byte .LBE47-.LBB47 + .4byte 0x2c86 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10d + .4byte 0xae + .4byte .LLST43 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0 + .4byte 0x2ca0 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x10e + .4byte 0xae + .4byte .LLST44 + .byte 0 + .uleb128 0x45 + .8byte .LBB50 + .8byte .LBE50-.LBB50 + .4byte 0x2cc5 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x115 + .4byte 0xae + .sleb128 -65522 + .byte 0 + .uleb128 0x45 + .8byte .LBB51 + .8byte .LBE51-.LBB51 + .4byte 0x2ce8 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x116 + .4byte 0xae + .byte 0xf0 + .byte 0 + .uleb128 0x45 + .8byte .LBB52 + .8byte .LBE52-.LBB52 + .4byte 0x2d0b + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x117 + .4byte 0xae + .byte 0x1 + .byte 0 + .uleb128 0x45 + .8byte .LBB53 + .8byte .LBE53-.LBB53 + .4byte 0x2d2e + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x118 + .4byte 0xae + .byte 0x7a + .byte 0 + .uleb128 0x45 + .8byte .LBB54 + .8byte .LBE54-.LBB54 + .4byte 0x2d51 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x119 + .4byte 0xae + .byte 0x25 + .byte 0 + .uleb128 0x45 + .8byte .LBB55 + .8byte .LBE55-.LBB55 + .4byte 0x2d74 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11a + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB56 + .8byte .LBE56-.LBB56 + .4byte 0x2d97 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11b + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB57 + .8byte .LBE57-.LBB57 + .4byte 0x2dba + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11c + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB58 + .8byte .LBE58-.LBB58 + .4byte 0x2ddd + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11d + .4byte 0xae + .byte 0x1f + .byte 0 + .uleb128 0x45 + .8byte .LBB59 + .8byte .LBE59-.LBB59 + .4byte 0x2e00 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11e + .4byte 0xae + .byte 0xb + .byte 0 + .uleb128 0x45 + .8byte .LBB60 + .8byte .LBE60-.LBB60 + .4byte 0x2e23 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x11f + .4byte 0xae + .byte 0x8 + .byte 0 + .uleb128 0x45 + .8byte .LBB61 + .8byte .LBE61-.LBB61 + .4byte 0x2e46 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x120 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB62 + .8byte .LBE62-.LBB62 + .4byte 0x2e69 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x121 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB63 + .8byte .LBE63-.LBB63 + .4byte 0x2e8c + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x122 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x30 + .4byte 0x2ea4 + .uleb128 0x5b + .string "__v" + .byte 0x1 + .2byte 0x123 + .4byte 0xae + .uleb128 0x1 + .byte 0x50 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x60 + .4byte 0x2ebe + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x124 + .4byte 0xae + .4byte .LLST45 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x90 + .4byte 0x2ed8 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x125 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB70 + .8byte .LBE70-.LBB70 + .4byte 0x2efd + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x12c + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB71 + .8byte .LBE71-.LBB71 + .4byte 0x2f20 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x12d + .4byte 0xae + .byte 0xfa + .byte 0 + .uleb128 0x45 + .8byte .LBB72 + .8byte .LBE72-.LBB72 + .4byte 0x2f43 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x12e + .4byte 0xae + .byte 0x9 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0xc0 + .4byte 0x2f5d + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x12f + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB75 + .8byte .LBE75-.LBB75 + .4byte 0x2f83 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x136 + .4byte 0xae + .sleb128 -16762368 + .byte 0 + .uleb128 0x45 + .8byte .LBB76 + .8byte .LBE76-.LBB76 + .4byte 0x2fa8 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x137 + .4byte 0xae + .sleb128 -65522 + .byte 0 + .uleb128 0x45 + .8byte .LBB77 + .8byte .LBE77-.LBB77 + .4byte 0x2fcb + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x138 + .4byte 0xae + .byte 0xf0 + .byte 0 + .uleb128 0x45 + .8byte .LBB78 + .8byte .LBE78-.LBB78 + .4byte 0x2fee + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x139 + .4byte 0xae + .byte 0x1 + .byte 0 + .uleb128 0x45 + .8byte .LBB79 + .8byte .LBE79-.LBB79 + .4byte 0x3011 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13a + .4byte 0xae + .byte 0x7a + .byte 0 + .uleb128 0x45 + .8byte .LBB80 + .8byte .LBE80-.LBB80 + .4byte 0x3034 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13b + .4byte 0xae + .byte 0x15 + .byte 0 + .uleb128 0x45 + .8byte .LBB81 + .8byte .LBE81-.LBB81 + .4byte 0x3057 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13c + .4byte 0xae + .byte 0xdc + .byte 0 + .uleb128 0x45 + .8byte .LBB82 + .8byte .LBE82-.LBB82 + .4byte 0x307a + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13d + .4byte 0xae + .byte 0x92 + .byte 0 + .uleb128 0x45 + .8byte .LBB83 + .8byte .LBE83-.LBB83 + .4byte 0x309d + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13e + .4byte 0xae + .byte 0x79 + .byte 0 + .uleb128 0x45 + .8byte .LBB84 + .8byte .LBE84-.LBB84 + .4byte 0x30c0 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x13f + .4byte 0xae + .byte 0x81 + .byte 0 + .uleb128 0x45 + .8byte .LBB85 + .8byte .LBE85-.LBB85 + .4byte 0x30e3 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x140 + .4byte 0xae + .byte 0x7e + .byte 0 + .uleb128 0x45 + .8byte .LBB86 + .8byte .LBE86-.LBB86 + .4byte 0x3106 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x141 + .4byte 0xae + .byte 0x21 + .byte 0 + .uleb128 0x45 + .8byte .LBB87 + .8byte .LBE87-.LBB87 + .4byte 0x3129 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x142 + .4byte 0xae + .byte 0x11 + .byte 0 + .uleb128 0x45 + .8byte .LBB88 + .8byte .LBE88-.LBB88 + .4byte 0x314c + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x143 + .4byte 0xae + .byte 0x9d + .byte 0 + .uleb128 0x45 + .8byte .LBB89 + .8byte .LBE89-.LBB89 + .4byte 0x316f + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x144 + .4byte 0xae + .byte 0x2 + .byte 0 + .uleb128 0x45 + .8byte .LBB90 + .8byte .LBE90-.LBB90 + .4byte 0x3192 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x145 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB91 + .8byte .LBE91-.LBB91 + .4byte 0x31b5 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x146 + .4byte 0xae + .byte 0x40 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0xf0 + .4byte 0x31cf + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x147 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB94 + .8byte .LBE94-.LBB94 + .4byte 0x31f4 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x14e + .4byte 0xae + .sleb128 -65534 + .byte 0 + .uleb128 0x45 + .8byte .LBB95 + .8byte .LBE95-.LBB95 + .4byte 0x3217 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x14f + .4byte 0xae + .byte 0xfc + .byte 0 + .uleb128 0x45 + .8byte .LBB96 + .8byte .LBE96-.LBB96 + .4byte 0x323a + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x150 + .4byte 0xae + .byte 0xa + .byte 0 + .uleb128 0x45 + .8byte .LBB97 + .8byte .LBE97-.LBB97 + .4byte 0x325d + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x151 + .4byte 0xae + .byte 0x70 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x120 + .4byte 0x3277 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x152 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB100 + .8byte .LBE100-.LBB100 + .4byte 0x329d + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x159 + .4byte 0xae + .sleb128 -16776704 + .byte 0 + .uleb128 0x45 + .8byte .LBB101 + .8byte .LBE101-.LBB101 + .4byte 0x32c2 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x15a + .4byte 0xae + .sleb128 -65534 + .byte 0 + .uleb128 0x45 + .8byte .LBB102 + .8byte .LBE102-.LBB102 + .4byte 0x32e5 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x15b + .4byte 0xae + .byte 0xc0 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x150 + .4byte 0x32ff + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x15c + .4byte 0xae + .4byte .LLST46 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x180 + .4byte 0x3319 + .uleb128 0x33 + .string "__v" + .byte 0x1 + .2byte 0x15d + .4byte 0xae + .4byte .LLST47 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x1b0 + .4byte 0x3333 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x15e + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB109 + .8byte .LBE109-.LBB109 + .4byte 0x3358 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x165 + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB110 + .8byte .LBE110-.LBB110 + .4byte 0x337b + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x166 + .4byte 0xae + .byte 0xe0 + .byte 0 + .uleb128 0x45 + .8byte .LBB111 + .8byte .LBE111-.LBB111 + .4byte 0x339e + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x167 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x1e0 + .4byte 0x33b8 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x168 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB114 + .8byte .LBE114-.LBB114 + .4byte 0x33dd + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x16f + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB115 + .8byte .LBE115-.LBB115 + .4byte 0x3403 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x170 + .4byte 0xae + .sleb128 -16762368 + .byte 0 + .uleb128 0x45 + .8byte .LBB116 + .8byte .LBE116-.LBB116 + .4byte 0x3426 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x171 + .4byte 0xae + .byte 0xff + .byte 0 + .uleb128 0x45 + .8byte .LBB117 + .8byte .LBE117-.LBB117 + .4byte 0x3449 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x172 + .4byte 0xae + .byte 0xa + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x210 + .4byte 0x3463 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x173 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB120 + .8byte .LBE120-.LBB120 + .4byte 0x3488 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x17a + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB121 + .8byte .LBE121-.LBB121 + .4byte 0x34ab + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x17b + .4byte 0xae + .byte 0x1 + .byte 0 + .uleb128 0x45 + .8byte .LBB122 + .8byte .LBE122-.LBB122 + .4byte 0x34ce + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x17c + .4byte 0xae + .byte 0xbf + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x240 + .4byte 0x34e8 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x17d + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB125 + .8byte .LBE125-.LBB125 + .4byte 0x350d + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x18a + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB126 + .8byte .LBE126-.LBB126 + .4byte 0x3530 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x18b + .4byte 0xae + .byte 0x2 + .byte 0 + .uleb128 0x45 + .8byte .LBB127 + .8byte .LBE127-.LBB127 + .4byte 0x3553 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x18c + .4byte 0xae + .byte 0xbf + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x270 + .4byte 0x356d + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x18d + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB130 + .8byte .LBE130-.LBB130 + .4byte 0x3592 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x19a + .4byte 0xae + .sleb128 -65533 + .byte 0 + .uleb128 0x45 + .8byte .LBB131 + .8byte .LBE131-.LBB131 + .4byte 0x35b8 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x19b + .4byte 0xae + .sleb128 -16776704 + .byte 0 + .uleb128 0x45 + .8byte .LBB132 + .8byte .LBE132-.LBB132 + .4byte 0x35dd + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x19c + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB133 + .8byte .LBE133-.LBB133 + .4byte 0x3600 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x19d + .4byte 0xae + .byte 0x2 + .byte 0 + .uleb128 0x45 + .8byte .LBB134 + .8byte .LBE134-.LBB134 + .4byte 0x3623 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x19e + .4byte 0xae + .byte 0x80 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x2a0 + .4byte 0x363d + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x19f + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB137 + .8byte .LBE137-.LBB137 + .4byte 0x3662 + .uleb128 0x59 + .string "__v" + .byte 0x1 + .2byte 0x1a6 + .4byte 0xae + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB138 + .8byte .LBE138-.LBB138 + .4byte 0x3685 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x1a7 + .4byte 0xae + .byte 0xa0 + .byte 0 + .uleb128 0x45 + .8byte .LBB139 + .8byte .LBE139-.LBB139 + .4byte 0x36a8 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x1a8 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x2d0 + .4byte 0x36c2 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x1a9 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x45 + .8byte .LBB142 + .8byte .LBE142-.LBB142 + .4byte 0x36e5 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x1b0 + .4byte 0xae + .byte 0xfa + .byte 0 + .uleb128 0x45 + .8byte .LBB143 + .8byte .LBE143-.LBB143 + .4byte 0x3708 + .uleb128 0x5a + .string "__v" + .byte 0x1 + .2byte 0x1b1 + .4byte 0xae + .byte 0x9 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x300 + .4byte 0x3722 + .uleb128 0x5c + .string "__v" + .byte 0x1 + .2byte 0x1b2 + .4byte 0xae + .4byte 0x10001 + .byte 0 + .uleb128 0x34 + .8byte .LVL67 + .4byte 0x42ab + .4byte 0x373b + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0 + .uleb128 0x34 + .8byte .LVL69 + .4byte 0x42b7 + .4byte 0x3763 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC4 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x5 + .byte 0x88 + .sleb128 0 + .byte 0x9 + .byte 0xfe + .byte 0x1a + .byte 0 + .uleb128 0x47 + .8byte .LVL74 + .4byte 0x3777 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL83 + .4byte 0x401e + .4byte 0x379c + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x49 + .8byte .LVL85 + .4byte 0x42b7 + .uleb128 0x47 + .8byte .LVL86 + .4byte 0x37bd + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL104 + .4byte 0x401e + .4byte 0x37e2 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL110 + .4byte 0x401e + .4byte 0x3807 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL130 + .4byte 0x401e + .4byte 0x382d + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL137 + .4byte 0x401e + .4byte 0x3853 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL146 + .4byte 0x401e + .4byte 0x3879 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL152 + .4byte 0x401e + .4byte 0x389f + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL160 + .4byte 0x401e + .4byte 0x38c5 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL167 + .4byte 0x401e + .4byte 0x38eb + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL169 + .4byte 0x3f49 + .4byte 0x390b + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x48 + .4byte 0x3ce6 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL176 + .4byte 0x401e + .4byte 0x3931 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL178 + .4byte 0x3fb3 + .4byte 0x3951 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d30 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL187 + .4byte 0x401e + .4byte 0x3977 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL193 + .4byte 0x401e + .4byte 0x399d + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .uleb128 0x36 + .8byte .LVL198 + .4byte 0x401e + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x2 + .byte 0x89 + .sleb128 0 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x8a + .sleb128 0 + .byte 0 + .byte 0 + .uleb128 0xa + .4byte 0xee + .4byte 0x39d0 + .uleb128 0x11 + .4byte 0xda + .byte 0x25 + .byte 0 + .uleb128 0x7 + .4byte 0x39c0 + .uleb128 0x52 + .4byte .LASF437 + .byte 0x1 + .byte 0xae + .4byte 0x54 + .8byte .LFB268 + .8byte .LFE268-.LFB268 + .uleb128 0x1 + .byte 0x9c + .4byte 0x3c0b + .uleb128 0x53 + .string "dev" + .byte 0x1 + .byte 0xae + .4byte 0x25f + .4byte .LLST55 + .uleb128 0x54 + .4byte .LASF425 + .byte 0x1 + .byte 0xae + .4byte 0x54 + .4byte .LLST56 + .uleb128 0x53 + .string "buf" + .byte 0x1 + .byte 0xaf + .4byte 0x137 + .4byte .LLST57 + .uleb128 0x54 + .4byte .LASF51 + .byte 0x1 + .byte 0xaf + .4byte 0x54 + .4byte .LLST58 + .uleb128 0x55 + .string "otp" + .byte 0x1 + .byte 0xb1 + .4byte 0x182b + .4byte .LLST59 + .uleb128 0x56 + .4byte .LASF387 + .byte 0x1 + .byte 0xb2 + .4byte 0x1981 + .4byte .LLST60 + .uleb128 0x56 + .4byte .LASF438 + .byte 0x1 + .byte 0xb3 + .4byte 0x11cc + .4byte .LLST61 + .uleb128 0x56 + .4byte .LASF430 + .byte 0x1 + .byte 0xb4 + .4byte 0xa3 + .4byte .LLST62 + .uleb128 0x55 + .string "ret" + .byte 0x1 + .byte 0xb5 + .4byte 0x54 + .4byte .LLST63 + .uleb128 0x57 + .4byte .LASF433 + .4byte 0x3c1b + .uleb128 0x9 + .byte 0x3 + .8byte __func__.7643 + .uleb128 0x5d + .4byte .LASF440 + .byte 0x1 + .byte 0xe3 + .8byte .L60 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x330 + .4byte 0x3ab8 + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xc0 + .4byte 0xae + .4byte .LLST64 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x360 + .4byte 0x3ad1 + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xd0 + .4byte 0xae + .4byte .LLST65 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x390 + .4byte 0x3aea + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xd2 + .4byte 0xae + .4byte .LLST66 + .byte 0 + .uleb128 0x45 + .8byte .LBB176 + .8byte .LBE176-.LBB176 + .4byte 0x3b0f + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xda + .4byte 0xa3 + .4byte .LLST68 + .byte 0 + .uleb128 0x46 + .4byte .Ldebug_ranges0+0x3c0 + .4byte 0x3b28 + .uleb128 0x55 + .string "__v" + .byte 0x1 + .byte 0xe4 + .4byte 0xae + .4byte .LLST67 + .byte 0 + .uleb128 0x34 + .8byte .LVL213 + .4byte 0x4289 + .4byte 0x3b40 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL216 + .4byte 0x42ab + .4byte 0x3b58 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x86 + .sleb128 0 + .byte 0 + .uleb128 0x47 + .8byte .LVL219 + .4byte 0x3b6c + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL220 + .4byte 0x3c20 + .4byte 0x3b84 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL222 + .4byte 0x42ce + .4byte 0x3b9c + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x8 + .byte 0x32 + .byte 0 + .uleb128 0x49 + .8byte .LVL224 + .4byte 0x42b7 + .uleb128 0x34 + .8byte .LVL233 + .4byte 0x401e + .4byte 0x3bce + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x34 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x2 + .byte 0x84 + .sleb128 0 + .byte 0 + .uleb128 0x34 + .8byte .LVL236 + .4byte 0x42b7 + .4byte 0x3bfa + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC11 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LANCHOR3 + .byte 0 + .uleb128 0x5e + .8byte .LVL237 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x2 + .byte 0x83 + .sleb128 0 + .byte 0 + .byte 0 + .uleb128 0xa + .4byte 0xee + .4byte 0x3c1b + .uleb128 0x11 + .4byte 0xda + .byte 0x16 + .byte 0 + .uleb128 0x7 + .4byte 0x3c0b + .uleb128 0x5f + .4byte .LASF441 + .byte 0x1 + .byte 0x98 + .4byte 0x54 + .byte 0x1 + .4byte 0x3cc1 + .uleb128 0x60 + .string "otp" + .byte 0x1 + .byte 0x98 + .4byte 0x182b + .uleb128 0x61 + .4byte .LASF269 + .byte 0x1 + .byte 0x99 + .4byte 0x144 + .uleb128 0x62 + .string "ret" + .byte 0x1 + .byte 0x9b + .4byte 0x54 + .uleb128 0x4e + .4byte .LASF433 + .4byte 0x3cd1 + .4byte .LASF441 + .uleb128 0x50 + .4byte 0x3c6f + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x9d + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x3c80 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x9e + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x3c91 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x9f + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x3ca2 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0xa1 + .4byte 0xae + .byte 0 + .uleb128 0x50 + .4byte 0x3cb3 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0xa3 + .4byte 0xae + .byte 0 + .uleb128 0x51 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0xa5 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0xa + .4byte 0xee + .4byte 0x3cd1 + .uleb128 0x11 + .4byte 0xda + .byte 0x1e + .byte 0 + .uleb128 0x7 + .4byte 0x3cc1 + .uleb128 0x5f + .4byte .LASF442 + .byte 0x1 + .byte 0x81 + .4byte 0x54 + .byte 0x1 + .4byte 0x3d20 + .uleb128 0x60 + .string "otp" + .byte 0x1 + .byte 0x81 + .4byte 0x182b + .uleb128 0x63 + .4byte .LASF443 + .byte 0x1 + .byte 0x83 + .4byte 0x54 + .uleb128 0x63 + .4byte .LASF430 + .byte 0x1 + .byte 0x84 + .4byte 0x54 + .uleb128 0x62 + .string "ret" + .byte 0x1 + .byte 0x85 + .4byte 0x54 + .uleb128 0x51 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x88 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x5f + .4byte .LASF444 + .byte 0x1 + .byte 0x6a + .4byte 0x54 + .byte 0x1 + .4byte 0x3d6a + .uleb128 0x60 + .string "otp" + .byte 0x1 + .byte 0x6a + .4byte 0x182b + .uleb128 0x63 + .4byte .LASF443 + .byte 0x1 + .byte 0x6c + .4byte 0x54 + .uleb128 0x63 + .4byte .LASF430 + .byte 0x1 + .byte 0x6d + .4byte 0x54 + .uleb128 0x62 + .string "ret" + .byte 0x1 + .byte 0x6e + .4byte 0x54 + .uleb128 0x51 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x71 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x5f + .4byte .LASF445 + .byte 0x1 + .byte 0x56 + .4byte 0x54 + .byte 0x1 + .4byte 0x3dc7 + .uleb128 0x60 + .string "otp" + .byte 0x1 + .byte 0x56 + .4byte 0x182b + .uleb128 0x61 + .4byte .LASF446 + .byte 0x1 + .byte 0x57 + .4byte 0xae + .uleb128 0x63 + .4byte .LASF443 + .byte 0x1 + .byte 0x59 + .4byte 0x54 + .uleb128 0x4e + .4byte .LASF433 + .4byte 0x2a4d + .4byte .LASF445 + .uleb128 0x50 + .4byte 0x3db9 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x5b + .4byte 0xae + .byte 0 + .uleb128 0x51 + .uleb128 0x62 + .string "__v" + .byte 0x1 + .byte 0x65 + .4byte 0xae + .byte 0 + .byte 0 + .uleb128 0x64 + .4byte .LASF450 + .byte 0x1 + .byte 0x4e + .8byte .LFB263 + .8byte .LFE263-.LFB263 + .uleb128 0x1 + .byte 0x9c + .4byte 0x3e3c + .uleb128 0x65 + .4byte .LASF447 + .byte 0x1 + .byte 0x4e + .4byte 0x11d8 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x54 + .4byte .LASF448 + .byte 0x1 + .byte 0x4f + .4byte 0x11d8 + .4byte .LLST0 + .uleb128 0x65 + .4byte .LASF449 + .byte 0x1 + .byte 0x50 + .4byte 0x3b + .uleb128 0x1 + .byte 0x52 + .uleb128 0x65 + .4byte .LASF425 + .byte 0x1 + .byte 0x50 + .4byte 0x54 + .uleb128 0x1 + .byte 0x53 + .uleb128 0x66 + .8byte .LBB22 + .8byte .LBE22-.LBB22 + .uleb128 0x67 + .string "__v" + .byte 0x1 + .byte 0x52 + .4byte 0xae + .4byte 0x80000 + .byte 0 + .byte 0 + .uleb128 0x64 + .4byte .LASF451 + .byte 0x1 + .byte 0x42 + .8byte .LFB262 + .8byte .LFE262-.LFB262 + .uleb128 0x1 + .byte 0x9c + .4byte 0x3f2f + .uleb128 0x54 + .4byte .LASF447 + .byte 0x1 + .byte 0x42 + .4byte 0x11d8 + .4byte .LLST16 + .uleb128 0x54 + .4byte .LASF448 + .byte 0x1 + .byte 0x43 + .4byte 0x11d8 + .4byte .LLST17 + .uleb128 0x54 + .4byte .LASF449 + .byte 0x1 + .byte 0x44 + .4byte 0x3b + .4byte .LLST18 + .uleb128 0x54 + .4byte .LASF425 + .byte 0x1 + .byte 0x44 + .4byte 0x54 + .4byte .LLST19 + .uleb128 0x45 + .8byte .LBB25 + .8byte .LBE25-.LBB25 + .4byte 0x3eba + .uleb128 0x67 + .string "__v" + .byte 0x1 + .byte 0x47 + .4byte 0xae + .4byte 0x80008 + .byte 0 + .uleb128 0x45 + .8byte .LBB26 + .8byte .LBE26-.LBB26 + .4byte 0x3edf + .uleb128 0x67 + .string "__v" + .byte 0x1 + .byte 0x48 + .4byte 0xae + .4byte 0x100010 + .byte 0 + .uleb128 0x45 + .8byte .LBB27 + .8byte .LBE27-.LBB27 + .4byte 0x3f04 + .uleb128 0x67 + .string "__v" + .byte 0x1 + .byte 0x4a + .4byte 0xae + .4byte 0x100000 + .byte 0 + .uleb128 0x34 + .8byte .LVL32 + .4byte 0x42ce + .4byte 0x3f1b + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x32 + .byte 0 + .uleb128 0x68 + .8byte .LVL34 + .4byte 0x42ce + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x31 + .byte 0 + .byte 0 + .uleb128 0x69 + .4byte .LASF463 + .byte 0x1a + .2byte 0x36f + .byte 0x3 + .4byte 0x3f49 + .uleb128 0x3c + .string "ptr" + .byte 0x1a + .2byte 0x36f + .4byte 0x137 + .byte 0 + .uleb128 0x6a + .4byte 0x3cd6 + .8byte .LFB278 + .8byte .LFE278-.LFB278 + .uleb128 0x1 + .byte 0x9c + .4byte 0x3fb3 + .uleb128 0x6b + .4byte 0x3ce6 + .uleb128 0x42 + .4byte 0x3cf1 + .4byte .LLST20 + .uleb128 0x42 + .4byte 0x3cfc + .4byte .LLST21 + .uleb128 0x44 + .4byte 0x3d07 + .uleb128 0x45 + .8byte .LBB28 + .8byte .LBE28-.LBB28 + .4byte 0x3f9f + .uleb128 0x42 + .4byte 0x3d13 + .4byte .LLST22 + .byte 0 + .uleb128 0x36 + .8byte .LVL40 + .4byte 0x42ce + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x31 + .byte 0 + .byte 0 + .uleb128 0x6a + .4byte 0x3d20 + .8byte .LFB279 + .8byte .LFE279-.LFB279 + .uleb128 0x1 + .byte 0x9c + .4byte 0x401e + .uleb128 0x6b + .4byte 0x3d30 + .uleb128 0x42 + .4byte 0x3d3b + .4byte .LLST23 + .uleb128 0x42 + .4byte 0x3d46 + .4byte .LLST24 + .uleb128 0x6c + .4byte 0x3d51 + .sleb128 -1 + .uleb128 0x45 + .8byte .LBB29 + .8byte .LBE29-.LBB29 + .4byte 0x400a + .uleb128 0x42 + .4byte 0x3d5d + .4byte .LLST25 + .byte 0 + .uleb128 0x36 + .8byte .LVL48 + .4byte 0x42ce + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x31 + .byte 0 + .byte 0 + .uleb128 0x6a + .4byte 0x3d6a + .8byte .LFB280 + .8byte .LFE280-.LFB280 + .uleb128 0x1 + .byte 0x9c + .4byte 0x410b + .uleb128 0x3a + .4byte 0x3d85 + .4byte .LLST26 + .uleb128 0x6b + .4byte 0x3d7a + .uleb128 0x42 + .4byte 0x3d90 + .4byte .LLST27 + .uleb128 0x44 + .4byte 0x3d9b + .uleb128 0x45 + .8byte .LBB36 + .8byte .LBE36-.LBB36 + .4byte 0x4074 + .uleb128 0x42 + .4byte 0x3dad + .4byte .LLST28 + .byte 0 + .uleb128 0x45 + .8byte .LBB37 + .8byte .LBE37-.LBB37 + .4byte 0x4093 + .uleb128 0x42 + .4byte 0x3dba + .4byte .LLST29 + .byte 0 + .uleb128 0x45 + .8byte .LBB38 + .8byte .LBE38-.LBB38 + .4byte 0x40f7 + .uleb128 0x6b + .4byte 0x3d85 + .uleb128 0x6b + .4byte 0x3d7a + .uleb128 0x66 + .8byte .LBB39 + .8byte .LBE39-.LBB39 + .uleb128 0x44 + .4byte 0x3d90 + .uleb128 0x44 + .4byte 0x3d9b + .uleb128 0x36 + .8byte .LVL63 + .4byte 0x42b7 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC3 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LANCHOR0 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x36 + .8byte .LVL60 + .4byte 0x42ce + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x1 + .byte 0x31 + .byte 0 + .byte 0 + .uleb128 0x6a + .4byte 0x3c20 + .8byte .LFB267 + .8byte .LFE267-.LFB267 + .uleb128 0x1 + .byte 0x9c + .4byte 0x4289 + .uleb128 0x3a + .4byte 0x3c30 + .4byte .LLST48 + .uleb128 0x3a + .4byte 0x3c3b + .4byte .LLST49 + .uleb128 0x42 + .4byte 0x3c46 + .4byte .LLST50 + .uleb128 0x44 + .4byte 0x3c51 + .uleb128 0x45 + .8byte .LBB160 + .8byte .LBE160-.LBB160 + .4byte 0x4165 + .uleb128 0x6c + .4byte 0x3c63 + .sleb128 -16776704 + .byte 0 + .uleb128 0x45 + .8byte .LBB161 + .8byte .LBE161-.LBB161 + .4byte 0x4183 + .uleb128 0x6c + .4byte 0x3c74 + .sleb128 -65535 + .byte 0 + .uleb128 0x45 + .8byte .LBB162 + .8byte .LBE162-.LBB162 + .4byte 0x419f + .uleb128 0x6d + .4byte 0x3c85 + .byte 0xfa + .byte 0 + .uleb128 0x45 + .8byte .LBB163 + .8byte .LBE163-.LBB163 + .4byte 0x41be + .uleb128 0x42 + .4byte 0x3c96 + .4byte .LLST51 + .byte 0 + .uleb128 0x45 + .8byte .LBB164 + .8byte .LBE164-.LBB164 + .4byte 0x41dd + .uleb128 0x42 + .4byte 0x3cb4 + .4byte .LLST52 + .byte 0 + .uleb128 0x45 + .8byte .LBB165 + .8byte .LBE165-.LBB165 + .4byte 0x4249 + .uleb128 0x3a + .4byte 0x3c30 + .4byte .LLST53 + .uleb128 0x3a + .4byte 0x3c3b + .4byte .LLST54 + .uleb128 0x66 + .8byte .LBB166 + .8byte .LBE166-.LBB166 + .uleb128 0x44 + .4byte 0x4138 + .uleb128 0x44 + .4byte 0x4141 + .uleb128 0x36 + .8byte .LVL209 + .4byte 0x42b7 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x9 + .byte 0x3 + .8byte .LC8 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x9 + .byte 0x3 + .8byte .LANCHOR2 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x45 + .8byte .LBB167 + .8byte .LBE167-.LBB167 + .4byte 0x4265 + .uleb128 0x6d + .4byte 0x3ca7 + .byte 0x9 + .byte 0 + .uleb128 0x36 + .8byte .LVL205 + .4byte 0x401e + .uleb128 0x35 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .uleb128 0x35 + .uleb128 0x1 + .byte 0x51 + .uleb128 0x1 + .byte 0x32 + .uleb128 0x48 + .4byte 0x3d7a + .uleb128 0x3 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0 + .byte 0 + .uleb128 0x6e + .4byte .LASF452 + .4byte .LASF452 + .byte 0x8 + .2byte 0x115 + .uleb128 0x6f + .4byte .LASF453 + .4byte .LASF453 + .byte 0x20 + .byte 0x85 + .uleb128 0x6f + .4byte .LASF454 + .4byte .LASF454 + .byte 0x20 + .byte 0x38 + .uleb128 0x6e + .4byte .LASF455 + .4byte .LASF455 + .byte 0x8 + .2byte 0x16e + .uleb128 0x6f + .4byte .LASF456 + .4byte .LASF456 + .byte 0x21 + .byte 0x13 + .uleb128 0x6e + .4byte .LASF457 + .4byte .LASF457 + .byte 0x1a + .2byte 0x393 + .uleb128 0x6f + .4byte .LASF458 + .4byte .LASF458 + .byte 0x22 + .byte 0xb + .byte 0 + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 + .uleb128 0x11 + .byte 0x1 + .uleb128 0x25 + .uleb128 0xe + .uleb128 0x13 + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1b + .uleb128 0xe + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x10 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x2 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x4 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x5 + .uleb128 0x24 + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3e + .uleb128 0xb + .uleb128 0x3 + .uleb128 0x8 + .byte 0 + .byte 0 + .uleb128 0x6 + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x7 + .uleb128 0x26 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x8 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x9 + .uleb128 0xf + .byte 0 + .uleb128 0xb + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0xa + .uleb128 0x1 + .byte 0x1 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xb + .uleb128 0x21 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0xc + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0xd + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0xe + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0xf + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x10 + .uleb128 0x26 + .byte 0 + .byte 0 + .byte 0 + .uleb128 0x11 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x12 + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x13 + .uleb128 0x5 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x14 + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x15 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x16 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x17 + .uleb128 0x21 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2f + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x18 + .uleb128 0x13 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x19 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1a + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1b + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x1c + .uleb128 0x13 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1d + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x1e + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x1f + .uleb128 0x16 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x20 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x21 + .uleb128 0x13 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0x5 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x22 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x23 + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x24 + .uleb128 0x4 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x25 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x26 + .uleb128 0x28 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x27 + .uleb128 0x4 + .byte 0x1 + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x28 + .uleb128 0x35 + .byte 0 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x29 + .uleb128 0x4 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2a + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x2b + .uleb128 0x17 + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0xb + .uleb128 0xb + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2c + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2d + .uleb128 0xd + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2e + .uleb128 0x15 + .byte 0x1 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x2f + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x30 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x31 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x32 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x33 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x34 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x35 + .uleb128 0x410a + .byte 0 + .uleb128 0x2 + .uleb128 0x18 + .uleb128 0x2111 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x36 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x37 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x38 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x39 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x3a + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3b + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3c + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x3d + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3e + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x3f + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x2115 + .uleb128 0x19 + .byte 0 + .byte 0 + .uleb128 0x40 + .uleb128 0x1d + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x52 + .uleb128 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x58 + .uleb128 0xb + .uleb128 0x59 + .uleb128 0x5 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x41 + .uleb128 0xb + .byte 0x1 + .uleb128 0x55 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x42 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x43 + .uleb128 0xa + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x44 + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x45 + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x46 + .uleb128 0xb + .byte 0x1 + .uleb128 0x55 + .uleb128 0x17 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x47 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x48 + .uleb128 0x410a + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2111 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x49 + .uleb128 0x4109 + .byte 0 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4a + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x4b + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4d + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x4e + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x34 + .uleb128 0x19 + .uleb128 0x1c + .uleb128 0xe + .byte 0 + .byte 0 + .uleb128 0x4f + .uleb128 0xa + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x50 + .uleb128 0xb + .byte 0x1 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x51 + .uleb128 0xb + .byte 0x1 + .byte 0 + .byte 0 + .uleb128 0x52 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x53 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x54 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x55 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x56 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x17 + .byte 0 + .byte 0 + .uleb128 0x57 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x34 + .uleb128 0x19 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x58 + .uleb128 0xa + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x11 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x59 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x5a + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x5b + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x5c + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0x6 + .byte 0 + .byte 0 + .uleb128 0x5d + .uleb128 0xa + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x11 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x5e + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .byte 0 + .byte 0 + .uleb128 0x5f + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x60 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x61 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x62 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x63 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x64 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x65 + .uleb128 0x5 + .byte 0 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x2 + .uleb128 0x18 + .byte 0 + .byte 0 + .uleb128 0x66 + .uleb128 0xb + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .byte 0 + .byte 0 + .uleb128 0x67 + .uleb128 0x34 + .byte 0 + .uleb128 0x3 + .uleb128 0x8 + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .uleb128 0x49 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0x6 + .byte 0 + .byte 0 + .uleb128 0x68 + .uleb128 0x4109 + .byte 0x1 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x2115 + .uleb128 0x19 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x69 + .uleb128 0x2e + .byte 0x1 + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .uleb128 0x27 + .uleb128 0x19 + .uleb128 0x20 + .uleb128 0xb + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x6a + .uleb128 0x2e + .byte 0x1 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x11 + .uleb128 0x1 + .uleb128 0x12 + .uleb128 0x7 + .uleb128 0x40 + .uleb128 0x18 + .uleb128 0x2117 + .uleb128 0x19 + .uleb128 0x1 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x6b + .uleb128 0x5 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .byte 0 + .byte 0 + .uleb128 0x6c + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xd + .byte 0 + .byte 0 + .uleb128 0x6d + .uleb128 0x34 + .byte 0 + .uleb128 0x31 + .uleb128 0x13 + .uleb128 0x1c + .uleb128 0xb + .byte 0 + .byte 0 + .uleb128 0x6e + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0x5 + .byte 0 + .byte 0 + .uleb128 0x6f + .uleb128 0x2e + .byte 0 + .uleb128 0x3f + .uleb128 0x19 + .uleb128 0x3c + .uleb128 0x19 + .uleb128 0x6e + .uleb128 0xe + .uleb128 0x3 + .uleb128 0xe + .uleb128 0x3a + .uleb128 0xb + .uleb128 0x3b + .uleb128 0xb + .byte 0 + .byte 0 + .byte 0 + .section .debug_loc,"",@progbits +.Ldebug_loc0: +.LLST14: + .8byte .LVL19 + .8byte .LVL20-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL20-1 + .8byte .LVL27 + .2byte 0x1 + .byte 0x64 + .8byte .LVL27 + .8byte .LFE277 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST15: + .8byte .LVL21 + .8byte .LVL22 + .2byte 0x1 + .byte 0x50 + .8byte .LVL22 + .8byte .LVL27 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST1: + .8byte .LVL2 + .8byte .LVL3 + .2byte 0x1 + .byte 0x50 + .8byte .LVL3 + .8byte .LFE276 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST2: + .8byte .LVL2 + .8byte .LVL5 + .2byte 0x3 + .byte 0x9 + .byte 0xea + .byte 0x9f + .8byte .LVL6 + .8byte .LFE276 + .2byte 0x3 + .byte 0x9 + .byte 0xea + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST3: + .8byte .LVL4 + .8byte .LVL5 + .2byte 0x1 + .byte 0x52 + .8byte 0 + .8byte 0 +.LLST4: + .8byte .LVL7 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL8-1 + .8byte .LVL11 + .2byte 0x1 + .byte 0x63 + .8byte .LVL11 + .8byte .LVL12-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL12-1 + .8byte .LFE274 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST5: + .8byte .LVL7 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL8-1 + .8byte .LVL11 + .2byte 0x1 + .byte 0x64 + .8byte .LVL11 + .8byte .LVL12-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL12-1 + .8byte .LFE274 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST6: + .8byte .LVL7 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL8-1 + .8byte .LVL10 + .2byte 0x1 + .byte 0x65 + .8byte .LVL10 + .8byte .LVL12-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL12-1 + .8byte .LFE274 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST7: + .8byte .LVL7 + .8byte .LVL8-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL8-1 + .8byte .LVL10 + .2byte 0x1 + .byte 0x66 + .8byte .LVL10 + .8byte .LVL12-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL12-1 + .8byte .LFE274 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST8: + .8byte .LVL8 + .8byte .LVL9 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST9: + .8byte .LVL13 + .8byte .LVL14-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL14-1 + .8byte .LVL17 + .2byte 0x1 + .byte 0x63 + .8byte .LVL17 + .8byte .LVL18-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL18-1 + .8byte .LFE273 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST10: + .8byte .LVL13 + .8byte .LVL14-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL14-1 + .8byte .LVL17 + .2byte 0x1 + .byte 0x64 + .8byte .LVL17 + .8byte .LVL18-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL18-1 + .8byte .LFE273 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST11: + .8byte .LVL13 + .8byte .LVL14-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL14-1 + .8byte .LVL16 + .2byte 0x1 + .byte 0x65 + .8byte .LVL16 + .8byte .LVL18-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL18-1 + .8byte .LFE273 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST12: + .8byte .LVL13 + .8byte .LVL14-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL14-1 + .8byte .LVL16 + .2byte 0x1 + .byte 0x66 + .8byte .LVL16 + .8byte .LVL18-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL18-1 + .8byte .LFE273 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST13: + .8byte .LVL14 + .8byte .LVL15 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST69: + .8byte .LVL246 + .8byte .LVL247-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL247-1 + .8byte .LVL254 + .2byte 0x1 + .byte 0x68 + .8byte .LVL254 + .8byte .LVL257 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST70: + .8byte .LVL246 + .8byte .LVL247-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL247-1 + .8byte .LVL253 + .2byte 0x1 + .byte 0x64 + .8byte .LVL253 + .8byte .LVL257 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST71: + .8byte .LVL246 + .8byte .LVL247-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL247-1 + .8byte .LVL256 + .2byte 0x3 + .byte 0x8f + .sleb128 224 + .8byte .LVL256 + .8byte .LVL257 + .2byte 0x3 + .byte 0x8f + .sleb128 80 + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x3 + .byte 0x8f + .sleb128 224 + .8byte 0 + .8byte 0 +.LLST72: + .8byte .LVL246 + .8byte .LVL247-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL247-1 + .8byte .LVL252 + .2byte 0x1 + .byte 0x65 + .8byte .LVL252 + .8byte .LVL257 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL257 + .8byte .LVL261 + .2byte 0x1 + .byte 0x65 + .8byte .LVL261 + .8byte .LVL267 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL267 + .8byte .LVL281 + .2byte 0x1 + .byte 0x65 + .8byte .LVL281 + .8byte .LVL283 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL283 + .8byte .LVL287 + .2byte 0x1 + .byte 0x65 + .8byte .LVL287 + .8byte .LVL396 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte .LVL396 + .8byte .LFE272 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST73: + .8byte .LVL248 + .8byte .LVL249 + .2byte 0x1 + .byte 0x50 + .8byte .LVL249 + .8byte .LVL255 + .2byte 0x1 + .byte 0x6c + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST74: + .8byte .LVL248 + .8byte .LVL256 + .2byte 0x3 + .byte 0x8f + .sleb128 224 + .8byte .LVL256 + .8byte .LVL257 + .2byte 0x3 + .byte 0x8f + .sleb128 80 + .8byte .LVL257 + .8byte .LFE272 + .2byte 0x3 + .byte 0x8f + .sleb128 224 + .8byte 0 + .8byte 0 +.LLST76: + .8byte .LVL250 + .8byte .LVL251 + .2byte 0x1 + .byte 0x50 + .8byte .LVL257 + .8byte .LVL258 + .2byte 0x1 + .byte 0x50 + .8byte .LVL258 + .8byte .LVL260 + .2byte 0x1 + .byte 0x63 + .8byte .LVL267 + .8byte .LVL272 + .2byte 0x1 + .byte 0x63 + .8byte .LVL285 + .8byte .LVL286 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST77: + .8byte .LVL261 + .8byte .LVL267 + .2byte 0x1 + .byte 0x67 + .8byte .LVL269 + .8byte .LVL270 + .2byte 0x1 + .byte 0x50 + .8byte .LVL272 + .8byte .LVL278 + .2byte 0x1 + .byte 0x63 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x63 + .8byte .LVL286 + .8byte .LVL287 + .2byte 0x1 + .byte 0x63 + .8byte .LVL288 + .8byte .LVL394 + .2byte 0x1 + .byte 0x67 + .8byte .LVL394 + .8byte .LVL395 + .2byte 0x3 + .byte 0x87 + .sleb128 1 + .byte 0x9f + .8byte .LVL396 + .8byte .LFE272 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST78: + .8byte .LVL250 + .8byte .LVL251 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL257 + .8byte .LVL268 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL268 + .8byte .LVL269 + .2byte 0x1 + .byte 0x50 + .8byte .LVL272 + .8byte .LVL280 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL283 + .8byte .LVL315 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST79: + .8byte .LVL262 + .8byte .LVL267 + .2byte 0x1 + .byte 0x6a + .8byte .LVL288 + .8byte .LVL313 + .2byte 0x1 + .byte 0x6a + .8byte .LVL317 + .8byte .LVL352 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST80: + .8byte .LVL262 + .8byte .LVL264 + .2byte 0x1 + .byte 0x65 + .8byte .LVL264 + .8byte .LVL267 + .2byte 0x1 + .byte 0x69 + .8byte .LVL288 + .8byte .LVL315 + .2byte 0x1 + .byte 0x69 + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST81: + .8byte .LVL262 + .8byte .LVL267 + .2byte 0x1 + .byte 0x6c + .8byte .LVL288 + .8byte .LVL315 + .2byte 0x1 + .byte 0x6c + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST82: + .8byte .LVL262 + .8byte .LVL267 + .2byte 0x1 + .byte 0x68 + .8byte .LVL288 + .8byte .LVL315 + .2byte 0x1 + .byte 0x68 + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST83: + .8byte .LVL262 + .8byte .LVL267 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL288 + .8byte .LVL311 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL311 + .8byte .LVL312 + .2byte 0x1 + .byte 0x50 + .8byte .LVL312 + .8byte .LVL315 + .2byte 0x1 + .byte 0x6b + .8byte .LVL317 + .8byte .LVL318 + .2byte 0x1 + .byte 0x50 + .8byte .LVL318 + .8byte .LVL337 + .2byte 0x1 + .byte 0x6b + .8byte .LVL337 + .8byte .LVL338 + .2byte 0x1 + .byte 0x50 + .8byte .LVL338 + .8byte .LVL339 + .2byte 0x1 + .byte 0x6b + .8byte .LVL339 + .8byte .LVL340 + .2byte 0x1 + .byte 0x50 + .8byte .LVL340 + .8byte .LVL346 + .2byte 0x1 + .byte 0x6b + .8byte .LVL346 + .8byte .LVL347 + .2byte 0x1 + .byte 0x50 + .8byte .LVL347 + .8byte .LVL348 + .2byte 0x1 + .byte 0x6b + .8byte .LVL348 + .8byte .LVL349 + .2byte 0x1 + .byte 0x50 + .8byte .LVL349 + .8byte .LVL356 + .2byte 0x1 + .byte 0x6b + .8byte .LVL356 + .8byte .LVL357 + .2byte 0x1 + .byte 0x50 + .8byte .LVL357 + .8byte .LVL358 + .2byte 0x1 + .byte 0x6b + .8byte .LVL358 + .8byte .LVL359 + .2byte 0x1 + .byte 0x50 + .8byte .LVL359 + .8byte .LVL365 + .2byte 0x1 + .byte 0x6b + .8byte .LVL365 + .8byte .LVL366 + .2byte 0x1 + .byte 0x50 + .8byte .LVL366 + .8byte .LVL367 + .2byte 0x1 + .byte 0x6b + .8byte .LVL367 + .8byte .LVL368 + .2byte 0x1 + .byte 0x50 + .8byte .LVL368 + .8byte .LVL374 + .2byte 0x1 + .byte 0x6b + .8byte .LVL374 + .8byte .LVL375 + .2byte 0x1 + .byte 0x50 + .8byte .LVL375 + .8byte .LVL376 + .2byte 0x1 + .byte 0x6b + .8byte .LVL376 + .8byte .LVL377 + .2byte 0x1 + .byte 0x50 + .8byte .LVL377 + .8byte .LVL379 + .2byte 0x1 + .byte 0x6b + .8byte .LVL379 + .8byte .LVL380 + .2byte 0x1 + .byte 0x50 + .8byte .LVL380 + .8byte .LVL381 + .2byte 0x1 + .byte 0x6b + .8byte .LVL381 + .8byte .LVL382 + .2byte 0x1 + .byte 0x50 + .8byte .LVL382 + .8byte .LVL387 + .2byte 0x1 + .byte 0x6b + .8byte .LVL387 + .8byte .LVL388 + .2byte 0x1 + .byte 0x50 + .8byte .LVL388 + .8byte .LVL389 + .2byte 0x1 + .byte 0x6b + .8byte .LVL389 + .8byte .LVL390 + .2byte 0x1 + .byte 0x50 + .8byte .LVL390 + .8byte .LVL392 + .2byte 0x1 + .byte 0x6b + .8byte .LVL392 + .8byte .LVL393 + .2byte 0x1 + .byte 0x50 + .8byte .LVL393 + .8byte .LVL394 + .2byte 0x1 + .byte 0x6b + .8byte 0 + .8byte 0 +.LLST84: + .8byte .LVL264 + .8byte .LVL265 + .2byte 0x1 + .byte 0x50 + .8byte .LVL265 + .8byte .LVL267 + .2byte 0x3 + .byte 0x8f + .sleb128 232 + .8byte .LVL288 + .8byte .LVL315 + .2byte 0x3 + .byte 0x8f + .sleb128 232 + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8f + .sleb128 232 + .8byte 0 + .8byte 0 +.LLST85: + .8byte .LVL289 + .8byte .LVL316 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST86: + .8byte .LVL290 + .8byte .LVL316 + .2byte 0x6 + .byte 0xc + .4byte 0x40004 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x40004 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST87: + .8byte .LVL291 + .8byte .LVL316 + .2byte 0x5 + .byte 0x11 + .sleb128 -65536 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65536 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST88: + .8byte .LVL292 + .8byte .LVL316 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST89: + .8byte .LVL293 + .8byte .LVL316 + .2byte 0x5 + .byte 0x11 + .sleb128 -65522 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65522 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST90: + .8byte .LVL294 + .8byte .LVL316 + .2byte 0x3 + .byte 0x8 + .byte 0xf0 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xf0 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST91: + .8byte .LVL295 + .8byte .LVL316 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST92: + .8byte .LVL296 + .8byte .LVL316 + .2byte 0x3 + .byte 0x8 + .byte 0x7a + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x7a + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST93: + .8byte .LVL297 + .8byte .LVL316 + .2byte 0x3 + .byte 0x8 + .byte 0x25 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x25 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST94: + .8byte .LVL298 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST95: + .8byte .LVL299 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST96: + .8byte .LVL300 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST97: + .8byte .LVL301 + .8byte .LVL316 + .2byte 0x2 + .byte 0x4f + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x4f + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST98: + .8byte .LVL302 + .8byte .LVL316 + .2byte 0x2 + .byte 0x3b + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x3b + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST99: + .8byte .LVL303 + .8byte .LVL316 + .2byte 0x2 + .byte 0x38 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x38 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST100: + .8byte .LVL304 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST101: + .8byte .LVL305 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST102: + .8byte .LVL306 + .8byte .LVL316 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST103: + .8byte .LVL307 + .8byte .LVL315 + .2byte 0x1 + .byte 0x69 + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST104: + .8byte .LVL308 + .8byte .LVL313 + .2byte 0x1 + .byte 0x65 + .8byte .LVL317 + .8byte .LVL332 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST105: + .8byte .LVL309 + .8byte .LVL316 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST106: + .8byte .LVL314 + .8byte .LVL316 + .2byte 0x5 + .byte 0x11 + .sleb128 -65533 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST107: + .8byte .LVL317 + .8byte .LVL394 + .2byte 0x6 + .byte 0x11 + .sleb128 -16762368 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST108: + .8byte .LVL319 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xf0 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST109: + .8byte .LVL320 + .8byte .LVL394 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST110: + .8byte .LVL321 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x7a + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST111: + .8byte .LVL322 + .8byte .LVL394 + .2byte 0x2 + .byte 0x45 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST112: + .8byte .LVL323 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xdc + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST113: + .8byte .LVL324 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x92 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST114: + .8byte .LVL325 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x79 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST115: + .8byte .LVL326 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x81 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST116: + .8byte .LVL327 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x7e + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST117: + .8byte .LVL328 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x21 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST118: + .8byte .LVL329 + .8byte .LVL394 + .2byte 0x2 + .byte 0x41 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST119: + .8byte .LVL330 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0x9d + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST120: + .8byte .LVL331 + .8byte .LVL394 + .2byte 0x2 + .byte 0x32 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST121: + .8byte .LVL333 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST122: + .8byte .LVL334 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST123: + .8byte .LVL335 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST124: + .8byte .LVL339 + .8byte .LVL394 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST125: + .8byte .LVL341 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65535 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST126: + .8byte .LVL342 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xfb + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST127: + .8byte .LVL343 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST128: + .8byte .LVL344 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST129: + .8byte .LVL348 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65534 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST130: + .8byte .LVL350 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xc0 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST131: + .8byte .LVL351 + .8byte .LVL354 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST132: + .8byte .LVL352 + .8byte .LVL394 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST133: + .8byte .LVL353 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST134: + .8byte .LVL358 + .8byte .LVL394 + .2byte 0x6 + .byte 0x11 + .sleb128 -16762368 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST135: + .8byte .LVL360 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65535 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST136: + .8byte .LVL361 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xff + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST137: + .8byte .LVL362 + .8byte .LVL394 + .2byte 0x2 + .byte 0x3a + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST138: + .8byte .LVL363 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST139: + .8byte .LVL367 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65534 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST140: + .8byte .LVL369 + .8byte .LVL394 + .2byte 0x2 + .byte 0x31 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST141: + .8byte .LVL370 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xbf + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST142: + .8byte .LVL371 + .8byte .LVL394 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST143: + .8byte .LVL372 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST144: + .8byte .LVL381 + .8byte .LVL394 + .2byte 0x5 + .byte 0x11 + .sleb128 -65535 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST145: + .8byte .LVL383 + .8byte .LVL394 + .2byte 0x2 + .byte 0x32 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST146: + .8byte .LVL384 + .8byte .LVL394 + .2byte 0x3 + .byte 0x8 + .byte 0xbf + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST147: + .8byte .LVL385 + .8byte .LVL394 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST148: + .8byte .LVL273 + .8byte .LVL276 + .2byte 0x1 + .byte 0x67 + .8byte .LVL283 + .8byte .LVL284 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST149: + .8byte .LVL273 + .8byte .LVL280 + .2byte 0x1 + .byte 0x69 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x69 + .8byte 0 + .8byte 0 +.LLST150: + .8byte .LVL273 + .8byte .LVL280 + .2byte 0x1 + .byte 0x6c + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x6c + .8byte 0 + .8byte 0 +.LLST151: + .8byte .LVL273 + .8byte .LVL280 + .2byte 0x1 + .byte 0x68 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST152: + .8byte .LVL275 + .8byte .LVL276 + .2byte 0xd + .byte 0x8f + .sleb128 254 + .byte 0x94 + .byte 0x2 + .byte 0x20 + .byte 0x87 + .sleb128 0 + .byte 0x8 + .byte 0xff + .byte 0x1a + .byte 0x1a + .byte 0x9f + .8byte .LVL283 + .8byte .LVL284 + .2byte 0xf + .byte 0x8f + .sleb128 254 + .byte 0x94 + .byte 0x2 + .byte 0x20 + .byte 0x87 + .sleb128 0 + .byte 0x8 + .byte 0xff + .byte 0x1a + .byte 0x38 + .byte 0x24 + .byte 0x1a + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST153: + .8byte .LVL274 + .8byte .LVL277 + .2byte 0x1 + .byte 0x50 + .8byte .LVL283 + .8byte .LVL285 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST30: + .8byte .LVL66 + .8byte .LVL67-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL67-1 + .8byte .LFE269 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST31: + .8byte .LVL66 + .8byte .LVL67-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL67-1 + .8byte .LVL72 + .2byte 0x1 + .byte 0x6a + .8byte .LVL72 + .8byte .LVL73 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL73 + .8byte .LFE269 + .2byte 0x1 + .byte 0x6a + .8byte 0 + .8byte 0 +.LLST32: + .8byte .LVL66 + .8byte .LVL67-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL67-1 + .8byte .LVL67 + .2byte 0x1 + .byte 0x68 + .8byte .LVL67 + .8byte .LVL71 + .2byte 0x1 + .byte 0x64 + .8byte .LVL71 + .8byte .LVL73 + .2byte 0x6 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x31 + .byte 0x26 + .byte 0x9f + .8byte .LVL73 + .8byte .LFE269 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST33: + .8byte .LVL66 + .8byte .LVL67-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL67-1 + .8byte .LVL70 + .2byte 0x1 + .byte 0x65 + .8byte .LVL70 + .8byte .LFE269 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST34: + .8byte .LVL66 + .8byte .LVL70 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL73 + .8byte .LVL83 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL83 + .8byte .LVL84 + .2byte 0x1 + .byte 0x50 + .8byte .LVL87 + .8byte .LVL88 + .2byte 0x1 + .byte 0x50 + .8byte .LVL104 + .8byte .LVL106 + .2byte 0x1 + .byte 0x50 + .8byte .LVL110 + .8byte .LVL112 + .2byte 0x1 + .byte 0x50 + .8byte .LVL130 + .8byte .LVL132 + .2byte 0x1 + .byte 0x50 + .8byte .LVL137 + .8byte .LVL139 + .2byte 0x1 + .byte 0x50 + .8byte .LVL146 + .8byte .LVL148 + .2byte 0x1 + .byte 0x50 + .8byte .LVL152 + .8byte .LVL154 + .2byte 0x1 + .byte 0x50 + .8byte .LVL160 + .8byte .LVL162 + .2byte 0x1 + .byte 0x50 + .8byte .LVL167 + .8byte .LVL168 + .2byte 0x1 + .byte 0x50 + .8byte .LVL169 + .8byte .LVL170 + .2byte 0x1 + .byte 0x50 + .8byte .LVL171 + .8byte .LVL172 + .2byte 0x1 + .byte 0x50 + .8byte .LVL176 + .8byte .LVL177 + .2byte 0x1 + .byte 0x50 + .8byte .LVL178 + .8byte .LVL179 + .2byte 0x1 + .byte 0x50 + .8byte .LVL180 + .8byte .LVL181 + .2byte 0x1 + .byte 0x50 + .8byte .LVL187 + .8byte .LVL189 + .2byte 0x1 + .byte 0x50 + .8byte .LVL193 + .8byte .LVL195 + .2byte 0x1 + .byte 0x50 + .8byte .LVL198 + .8byte .LFE269 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST35: + .8byte .LVL67 + .8byte .LVL68 + .2byte 0x1 + .byte 0x50 + .8byte .LVL68 + .8byte .LVL69 + .2byte 0x1 + .byte 0x67 + .8byte .LVL73 + .8byte .LFE269 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST36: + .8byte .LVL74 + .8byte .LVL86 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST37: + .8byte .LVL75 + .8byte .LVL86 + .2byte 0x6 + .byte 0xc + .4byte 0x40004 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x6 + .byte 0xc + .4byte 0x40004 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST38: + .8byte .LVL76 + .8byte .LVL86 + .2byte 0x5 + .byte 0x11 + .sleb128 -65536 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x5 + .byte 0x11 + .sleb128 -65536 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST39: + .8byte .LVL77 + .8byte .LVL86 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x6 + .byte 0x11 + .sleb128 -16776704 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST40: + .8byte .LVL78 + .8byte .LVL86 + .2byte 0x5 + .byte 0x11 + .sleb128 -65534 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x5 + .byte 0x11 + .sleb128 -65534 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST41: + .8byte .LVL79 + .8byte .LVL86 + .2byte 0x3 + .byte 0x8 + .byte 0xfc + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x3 + .byte 0x8 + .byte 0xfc + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST42: + .8byte .LVL80 + .8byte .LVL86 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST43: + .8byte .LVL81 + .8byte .LVL86 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST44: + .8byte .LVL82 + .8byte .LVL86 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte .LVL87 + .8byte .LFE269 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST45: + .8byte .LVL102 + .8byte .LVL104-1 + .2byte 0x1 + .byte 0x55 + .8byte .LVL104-1 + .8byte .LVL165 + .2byte 0x6 + .byte 0x88 + .sleb128 0 + .byte 0x9 + .byte 0xf7 + .byte 0x24 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST46: + .8byte .LVL142 + .8byte .LVL145 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST47: + .8byte .LVL143 + .8byte .LVL159 + .2byte 0x1 + .byte 0x65 + .8byte .LVL159 + .8byte .LFE269 + .2byte 0xa + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0xa + .2byte 0xffff + .byte 0x1a + .byte 0x38 + .byte 0x25 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST55: + .8byte .LVL212 + .8byte .LVL213-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL213-1 + .8byte .LVL221 + .2byte 0x1 + .byte 0x66 + .8byte .LVL221 + .8byte .LVL227 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL227 + .8byte .LVL228 + .2byte 0x1 + .byte 0x66 + .8byte .LVL228 + .8byte .LFE268 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST56: + .8byte .LVL212 + .8byte .LVL213-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL213-1 + .8byte .LVL217 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL217 + .8byte .LVL225 + .2byte 0x1 + .byte 0x63 + .8byte .LVL227 + .8byte .LFE268 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST57: + .8byte .LVL212 + .8byte .LVL213-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL213-1 + .8byte .LVL222 + .2byte 0x1 + .byte 0x65 + .8byte .LVL222 + .8byte .LVL227 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte .LVL227 + .8byte .LVL228 + .2byte 0x1 + .byte 0x65 + .8byte .LVL228 + .8byte .LFE268 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST58: + .8byte .LVL212 + .8byte .LVL213-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL213-1 + .8byte .LVL222 + .2byte 0x1 + .byte 0x67 + .8byte .LVL222 + .8byte .LVL226 + .2byte 0x3 + .byte 0x87 + .sleb128 -1 + .byte 0x9f + .8byte .LVL227 + .8byte .LVL228 + .2byte 0x1 + .byte 0x67 + .8byte .LVL228 + .8byte .LVL244 + .2byte 0x3 + .byte 0x87 + .sleb128 -1 + .byte 0x9f + .8byte .LVL244 + .8byte .LFE268 + .2byte 0x1 + .byte 0x67 + .8byte 0 + .8byte 0 +.LLST59: + .8byte .LVL214 + .8byte .LVL215 + .2byte 0x1 + .byte 0x50 + .8byte .LVL215 + .8byte .LVL225 + .2byte 0x1 + .byte 0x64 + .8byte .LVL227 + .8byte .LFE268 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST60: + .8byte .LVL217 + .8byte .LVL218 + .2byte 0x1 + .byte 0x50 + .8byte .LVL218 + .8byte .LVL226 + .2byte 0x1 + .byte 0x68 + .8byte .LVL227 + .8byte .LFE268 + .2byte 0x1 + .byte 0x68 + .8byte 0 + .8byte 0 +.LLST61: + .8byte .LVL217 + .8byte .LVL224 + .2byte 0x1 + .byte 0x65 + .8byte .LVL227 + .8byte .LVL236 + .2byte 0x1 + .byte 0x65 + .8byte .LVL238 + .8byte .LVL241 + .2byte 0x1 + .byte 0x65 + .8byte .LVL241 + .8byte .LVL242 + .2byte 0x3 + .byte 0x85 + .sleb128 1 + .byte 0x9f + .8byte .LVL242 + .8byte .LVL245 + .2byte 0x3 + .byte 0x85 + .sleb128 2 + .byte 0x9f + .8byte .LVL245 + .8byte .LFE268 + .2byte 0x1 + .byte 0x65 + .8byte 0 + .8byte 0 +.LLST62: + .8byte .LVL241 + .8byte .LVL243 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST63: + .8byte .LVL217 + .8byte .LVL222 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL222 + .8byte .LVL223 + .2byte 0x1 + .byte 0x66 + .8byte .LVL227 + .8byte .LVL228 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL228 + .8byte .LVL234 + .2byte 0x1 + .byte 0x66 + .8byte .LVL234 + .8byte .LVL235 + .2byte 0x1 + .byte 0x50 + .8byte .LVL235 + .8byte .LVL238 + .2byte 0x1 + .byte 0x66 + .8byte .LVL238 + .8byte .LVL239 + .2byte 0x1 + .byte 0x50 + .8byte .LVL239 + .8byte .LFE268 + .2byte 0x1 + .byte 0x66 + .8byte 0 + .8byte 0 +.LLST64: + .8byte .LVL220 + .8byte .LVL227 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte .LVL228 + .8byte .LFE268 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST65: + .8byte .LVL229 + .8byte .LVL231 + .2byte 0x1 + .byte 0x51 + .8byte .LVL231 + .8byte .LVL232 + .2byte 0x6 + .byte 0x84 + .sleb128 0 + .byte 0x6 + .byte 0x23 + .uleb128 0x104 + .8byte .LVL232 + .8byte .LVL236 + .2byte 0x8 + .byte 0x83 + .sleb128 -1 + .byte 0x11 + .sleb128 -65536 + .byte 0x21 + .byte 0x9f + .8byte .LVL238 + .8byte .LFE268 + .2byte 0x8 + .byte 0x83 + .sleb128 -1 + .byte 0x11 + .sleb128 -65536 + .byte 0x21 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST66: + .8byte .LVL230 + .8byte .LVL236 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte .LVL238 + .8byte .LFE268 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST68: + .8byte .LVL240 + .8byte .LVL243 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST67: + .8byte .LVL236 + .8byte .LVL238 + .2byte 0x4 + .byte 0x40 + .byte 0x3c + .byte 0x24 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST0: + .8byte .LVL0 + .8byte .LVL1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL1 + .8byte .LFE263 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST16: + .8byte .LVL28 + .8byte .LVL31 + .2byte 0x1 + .byte 0x50 + .8byte .LVL31 + .8byte .LFE262 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST17: + .8byte .LVL28 + .8byte .LVL29 + .2byte 0x1 + .byte 0x51 + .8byte .LVL29 + .8byte .LVL33 + .2byte 0x1 + .byte 0x63 + .8byte .LVL33 + .8byte .LFE262 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST18: + .8byte .LVL28 + .8byte .LVL32-1 + .2byte 0x1 + .byte 0x52 + .8byte .LVL32-1 + .8byte .LFE262 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x52 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST19: + .8byte .LVL28 + .8byte .LVL32-1 + .2byte 0x1 + .byte 0x53 + .8byte .LVL32-1 + .8byte .LFE262 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x53 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST20: + .8byte .LVL35 + .8byte .LVL38 + .2byte 0x3 + .byte 0x83 + .sleb128 -1 + .byte 0x9f + .8byte .LVL38 + .8byte .LVL39 + .2byte 0x1 + .byte 0x63 + .8byte .LVL39 + .8byte .LVL41 + .2byte 0x3 + .byte 0x83 + .sleb128 -1 + .byte 0x9f + .8byte .LVL41 + .8byte .LVL42 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST21: + .8byte .LVL37 + .8byte .LVL40-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL41 + .8byte .LFE278 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST22: + .8byte .LVL36 + .8byte .LVL40-1 + .2byte 0x1 + .byte 0x51 + .8byte .LVL41 + .8byte .LFE278 + .2byte 0x1 + .byte 0x51 + .8byte 0 + .8byte 0 +.LLST23: + .8byte .LVL43 + .8byte .LVL46 + .2byte 0x3 + .byte 0x83 + .sleb128 -1 + .byte 0x9f + .8byte .LVL46 + .8byte .LVL48 + .2byte 0x1 + .byte 0x63 + .8byte .LVL48 + .8byte .LVL50 + .2byte 0x3 + .byte 0x83 + .sleb128 -1 + .byte 0x9f + .8byte .LVL51 + .8byte .LFE279 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST24: + .8byte .LVL45 + .8byte .LVL47 + .2byte 0x1 + .byte 0x50 + .8byte .LVL49 + .8byte .LVL50 + .2byte 0x1 + .byte 0x50 + .8byte .LVL51 + .8byte .LVL52 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST25: + .8byte .LVL44 + .8byte .LVL47 + .2byte 0x1 + .byte 0x50 + .8byte .LVL49 + .8byte .LVL50 + .2byte 0x1 + .byte 0x50 + .8byte .LVL51 + .8byte .LVL52 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST26: + .8byte .LVL53 + .8byte .LVL54 + .2byte 0x1 + .byte 0x51 + .8byte .LVL54 + .8byte .LVL56 + .2byte 0x1 + .byte 0x63 + .8byte .LVL56 + .8byte .LVL58 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte .LVL58 + .8byte .LVL64 + .2byte 0x1 + .byte 0x63 + .8byte .LVL64 + .8byte .LFE280 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST27: + .8byte .LVL54 + .8byte .LVL60 + .2byte 0x1 + .byte 0x64 + .8byte .LVL60 + .8byte .LVL61 + .2byte 0x3 + .byte 0x84 + .sleb128 -1 + .byte 0x9f + .8byte .LVL61 + .8byte .LVL65 + .2byte 0x1 + .byte 0x64 + .8byte 0 + .8byte 0 +.LLST28: + .8byte .LVL55 + .8byte .LVL57 + .2byte 0x1 + .byte 0x50 + .8byte .LVL58 + .8byte .LVL59 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST29: + .8byte .LVL56 + .8byte .LVL58 + .2byte 0x1 + .byte 0x63 + .8byte 0 + .8byte 0 +.LLST48: + .8byte .LVL199 + .8byte .LVL205-1 + .2byte 0x1 + .byte 0x50 + .8byte .LVL205-1 + .8byte .LVL211 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte .LVL211 + .8byte .LFE267 + .2byte 0x1 + .byte 0x50 + .8byte 0 + .8byte 0 +.LLST49: + .8byte .LVL199 + .8byte .LVL203 + .2byte 0x1 + .byte 0x51 + .8byte .LVL203 + .8byte .LFE267 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST50: + .8byte .LVL199 + .8byte .LVL206 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte .LVL206 + .8byte .LVL208 + .2byte 0x1 + .byte 0x50 + .8byte .LVL208 + .8byte .LVL210 + .2byte 0x1 + .byte 0x63 + .8byte .LVL210 + .8byte .LVL211 + .2byte 0x1 + .byte 0x50 + .8byte .LVL211 + .8byte .LFE267 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST51: + .8byte .LVL202 + .8byte .LVL204 + .2byte 0x2 + .byte 0x30 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST52: + .8byte .LVL204 + .8byte .LVL211 + .2byte 0x6 + .byte 0xc + .4byte 0x10001 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST53: + .8byte .LVL207 + .8byte .LVL209 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x50 + .byte 0x9f + .8byte 0 + .8byte 0 +.LLST54: + .8byte .LVL207 + .8byte .LVL209 + .2byte 0x4 + .byte 0xf3 + .uleb128 0x1 + .byte 0x51 + .byte 0x9f + .8byte 0 + .8byte 0 + .section .debug_aranges,"",@progbits + .4byte 0xec + .2byte 0x2 + .4byte .Ldebug_info0 + .byte 0x8 + .byte 0 + .2byte 0 + .2byte 0 + .8byte .LFB263 + .8byte .LFE263-.LFB263 + .8byte .LFB276 + .8byte .LFE276-.LFB276 + .8byte .LFB274 + .8byte .LFE274-.LFB274 + .8byte .LFB273 + .8byte .LFE273-.LFB273 + .8byte .LFB277 + .8byte .LFE277-.LFB277 + .8byte .LFB262 + .8byte .LFE262-.LFB262 + .8byte .LFB278 + .8byte .LFE278-.LFB278 + .8byte .LFB279 + .8byte .LFE279-.LFB279 + .8byte .LFB280 + .8byte .LFE280-.LFB280 + .8byte .LFB269 + .8byte .LFE269-.LFB269 + .8byte .LFB267 + .8byte .LFE267-.LFB267 + .8byte .LFB268 + .8byte .LFE268-.LFB268 + .8byte .LFB272 + .8byte .LFE272-.LFB272 + .8byte 0 + .8byte 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .8byte .LBB48 + .8byte .LBE48 + .8byte .LBB49 + .8byte .LBE49 + .8byte 0 + .8byte 0 + .8byte .LBB64 + .8byte .LBE64 + .8byte .LBB66 + .8byte .LBE66 + .8byte 0 + .8byte 0 + .8byte .LBB65 + .8byte .LBE65 + .8byte .LBB67 + .8byte .LBE67 + .8byte 0 + .8byte 0 + .8byte .LBB68 + .8byte .LBE68 + .8byte .LBB69 + .8byte .LBE69 + .8byte 0 + .8byte 0 + .8byte .LBB73 + .8byte .LBE73 + .8byte .LBB74 + .8byte .LBE74 + .8byte 0 + .8byte 0 + .8byte .LBB92 + .8byte .LBE92 + .8byte .LBB93 + .8byte .LBE93 + .8byte 0 + .8byte 0 + .8byte .LBB98 + .8byte .LBE98 + .8byte .LBB99 + .8byte .LBE99 + .8byte 0 + .8byte 0 + .8byte .LBB103 + .8byte .LBE103 + .8byte .LBB105 + .8byte .LBE105 + .8byte 0 + .8byte 0 + .8byte .LBB104 + .8byte .LBE104 + .8byte .LBB106 + .8byte .LBE106 + .8byte 0 + .8byte 0 + .8byte .LBB107 + .8byte .LBE107 + .8byte .LBB108 + .8byte .LBE108 + .8byte 0 + .8byte 0 + .8byte .LBB112 + .8byte .LBE112 + .8byte .LBB113 + .8byte .LBE113 + .8byte 0 + .8byte 0 + .8byte .LBB118 + .8byte .LBE118 + .8byte .LBB119 + .8byte .LBE119 + .8byte 0 + .8byte 0 + .8byte .LBB123 + .8byte .LBE123 + .8byte .LBB124 + .8byte .LBE124 + .8byte 0 + .8byte 0 + .8byte .LBB128 + .8byte .LBE128 + .8byte .LBB129 + .8byte .LBE129 + .8byte 0 + .8byte 0 + .8byte .LBB135 + .8byte .LBE135 + .8byte .LBB136 + .8byte .LBE136 + .8byte 0 + .8byte 0 + .8byte .LBB140 + .8byte .LBE140 + .8byte .LBB141 + .8byte .LBE141 + .8byte 0 + .8byte 0 + .8byte .LBB144 + .8byte .LBE144 + .8byte .LBB145 + .8byte .LBE145 + .8byte 0 + .8byte 0 + .8byte .LBB168 + .8byte .LBE168 + .8byte .LBB169 + .8byte .LBE169 + .8byte 0 + .8byte 0 + .8byte .LBB170 + .8byte .LBE170 + .8byte .LBB171 + .8byte .LBE171 + .8byte 0 + .8byte 0 + .8byte .LBB172 + .8byte .LBE172 + .8byte .LBB173 + .8byte .LBE173 + .8byte 0 + .8byte 0 + .8byte .LBB174 + .8byte .LBE174 + .8byte .LBB175 + .8byte .LBE175 + .8byte 0 + .8byte 0 + .8byte .LBB244 + .8byte .LBE244 + .8byte .LBB324 + .8byte .LBE324 + .8byte .LBB325 + .8byte .LBE325 + .8byte .LBB335 + .8byte .LBE335 + .8byte .LBB336 + .8byte .LBE336 + .8byte 0 + .8byte 0 + .8byte .LBB264 + .8byte .LBE264 + .8byte .LBB266 + .8byte .LBE266 + .8byte 0 + .8byte 0 + .8byte .LBB265 + .8byte .LBE265 + .8byte .LBB267 + .8byte .LBE267 + .8byte 0 + .8byte 0 + .8byte .LBB268 + .8byte .LBE268 + .8byte .LBB269 + .8byte .LBE269 + .8byte 0 + .8byte 0 + .8byte .LBB270 + .8byte .LBE270 + .8byte .LBB271 + .8byte .LBE271 + .8byte 0 + .8byte 0 + .8byte .LBB288 + .8byte .LBE288 + .8byte .LBB289 + .8byte .LBE289 + .8byte 0 + .8byte 0 + .8byte .LBB294 + .8byte .LBE294 + .8byte .LBB295 + .8byte .LBE295 + .8byte 0 + .8byte 0 + .8byte .LBB298 + .8byte .LBE298 + .8byte .LBB300 + .8byte .LBE300 + .8byte 0 + .8byte 0 + .8byte .LBB299 + .8byte .LBE299 + .8byte .LBB301 + .8byte .LBE301 + .8byte 0 + .8byte 0 + .8byte .LBB302 + .8byte .LBE302 + .8byte .LBB303 + .8byte .LBE303 + .8byte 0 + .8byte 0 + .8byte .LBB308 + .8byte .LBE308 + .8byte .LBB309 + .8byte .LBE309 + .8byte 0 + .8byte 0 + .8byte .LBB314 + .8byte .LBE314 + .8byte .LBB315 + .8byte .LBE315 + .8byte 0 + .8byte 0 + .8byte .LBB326 + .8byte .LBE326 + .8byte .LBB332 + .8byte .LBE332 + .8byte .LBB333 + .8byte .LBE333 + .8byte .LBB334 + .8byte .LBE334 + .8byte .LBB337 + .8byte .LBE337 + .8byte 0 + .8byte 0 + .8byte .LFB263 + .8byte .LFE263 + .8byte .LFB276 + .8byte .LFE276 + .8byte .LFB274 + .8byte .LFE274 + .8byte .LFB273 + .8byte .LFE273 + .8byte .LFB277 + .8byte .LFE277 + .8byte .LFB262 + .8byte .LFE262 + .8byte .LFB278 + .8byte .LFE278 + .8byte .LFB279 + .8byte .LFE279 + .8byte .LFB280 + .8byte .LFE280 + .8byte .LFB269 + .8byte .LFE269 + .8byte .LFB267 + .8byte .LFE267 + .8byte .LFB268 + .8byte .LFE268 + .8byte .LFB272 + .8byte .LFE272 + .8byte 0 + .8byte 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF222: + .string "UCLASS_SERIAL" +.LASF320: + .string "gd_t" +.LASF15: + .string "long int" +.LASF39: + .string "uclass_node" +.LASF423: + .string "request" +.LASF313: + .string "phandle" +.LASF53: + .string "flash_id" +.LASF405: + .string "misc_ops" +.LASF377: + .string "mem_malloc_start" +.LASF428: + .string "rk3562_secure_otp_write" +.LASF333: + .string "net_hostname" +.LASF28: + .string "name" +.LASF249: + .string "UCLASS_ETH_PHY" +.LASF229: + .string "UCLASS_THERMAL" +.LASF60: + .string "base" +.LASF355: + .string "NETLOOP_RESTART" +.LASF288: + .string "new_gd" +.LASF349: + .string "net_boot_file_size" +.LASF134: + .string "fit_hdr_os" +.LASF181: + .string "UCLASS_FIRMWARE" +.LASF458: + .string "udelay" +.LASF142: + .string "fit_noffset_fdt" +.LASF74: + .string "bi_dsp_freq" +.LASF304: + .string "malloc_ptr" +.LASF91: + .string "_datarellocal_start_ofs" +.LASF94: + .string "fdt32_t" +.LASF146: + .string "rd_start" +.LASF372: + .string "property" +.LASF266: + .string "tlb_emerg" +.LASF78: + .string "bi_enetaddr" +.LASF291: + .string "uclass_root" +.LASF188: + .string "UCLASS_IRQ" +.LASF421: + .string "rockchip_secure_otp_ofdata_to_platdata" +.LASF438: + .string "buffer" +.LASF235: + .string "UCLASS_USB_HUB" +.LASF230: + .string "UCLASS_TIMER" +.LASF42: + .string "flags" +.LASF139: + .string "fit_noffset_rd" +.LASF270: + .string "baudrate" +.LASF335: + .string "net_ethaddr" +.LASF301: + .string "timebase_l" +.LASF21: + .string "errno" +.LASF32: + .string "node" +.LASF360: + .string "bind" +.LASF456: + .string "printf" +.LASF402: + .string "DECOM_ZLIB" +.LASF8: + .string "unsigned int" +.LASF47: + .string "next" +.LASF101: + .string "version" +.LASF397: + .string "per_device_platdata_auto_alloc_size" +.LASF131: + .string "legacy_hdr_os_copy" +.LASF195: + .string "UCLASS_MMC" +.LASF290: + .string "dm_root_f" +.LASF341: + .string "net_rx_packet" +.LASF38: + .string "parent_priv" +.LASF176: + .string "UCLASS_CROS_EC" +.LASF311: + .string "console_evt" +.LASF191: + .string "UCLASS_LPC" +.LASF105: + .string "size_dt_struct" +.LASF380: + .string "p_current" +.LASF345: + .string "net_our_vlan" +.LASF22: + .string "___strtok" +.LASF67: + .string "bi_memsize" +.LASF121: + .string "image_info" +.LASF200: + .string "UCLASS_NVME" +.LASF156: + .string "bootm_headers_t" +.LASF253: + .string "UCLASS_RNG" +.LASF250: + .string "UCLASS_MDIO" +.LASF187: + .string "UCLASS_IDE" +.LASF274: + .string "bus_clk" +.LASF378: + .string "mem_malloc_end" +.LASF225: + .string "UCLASS_SPI_FLASH" +.LASF189: + .string "UCLASS_KEYBOARD" +.LASF72: + .string "bi_sramsize" +.LASF185: + .string "UCLASS_I2C_MUX" +.LASF298: + .string "fdt_blob_kern" +.LASF278: + .string "env_addr" +.LASF48: + .string "prev" +.LASF227: + .string "UCLASS_SYSCON" +.LASF171: + .string "UCLASS_BLK" +.LASF212: + .string "UCLASS_PWRSEQ" +.LASF132: + .string "legacy_hdr_valid" +.LASF265: + .string "tlb_fillptr" +.LASF82: + .string "bi_arch_number" +.LASF324: + .string "load_addr" +.LASF292: + .string "fdt_blob" +.LASF329: + .string "net_gateway" +.LASF166: + .string "UCLASS_PCI_EMUL" +.LASF425: + .string "offset" +.LASF350: + .string "net_boot_file_expected_size_in_blocks" +.LASF404: + .string "OTP_NS" +.LASF415: + .string "spl_rockchip_otp_start" +.LASF206: + .string "UCLASS_PHY" +.LASF455: + .string "dev_get_driver_data" +.LASF3: + .string "signed char" +.LASF203: + .string "UCLASS_PCH" +.LASF100: + .string "off_mem_rsvmap" +.LASF163: + .string "UCLASS_TEST_PROBE" +.LASF149: + .string "ft_len" +.LASF19: + .string "uint32_t" +.LASF385: + .string "udevice_id" +.LASF326: + .string "save_size" +.LASF440: + .string "read_end" +.LASF379: + .string "mem_malloc_brk" +.LASF436: + .string "rk3562_secure_otp_write_2_bytes_noecc" +.LASF143: + .string "fit_hdr_setup" +.LASF300: + .string "timebase_h" +.LASF160: + .string "UCLASS_TEST" +.LASF87: + .string "IRQ_STACK_START" +.LASF420: + .string "_u_boot_list_2_driver_2_rockchip_secure_otp" +.LASF70: + .string "bi_flashoffset" +.LASF201: + .string "UCLASS_PANEL" +.LASF267: + .string "pre_serial" +.LASF431: + .string "rockchip_secure_otp_capability" +.LASF36: + .string "uclass" +.LASF162: + .string "UCLASS_TEST_BUS" +.LASF461: + .string "/home/lxh/uboot/u-boot" +.LASF239: + .string "UCLASS_VIDEO_CONSOLE" +.LASF361: + .string "probe" +.LASF10: + .string "long long unsigned int" +.LASF261: + .string "lastinc" +.LASF389: + .string "post_bind" +.LASF285: + .string "irq_sp" +.LASF327: + .string "in_addr" +.LASF197: + .string "UCLASS_MTD" +.LASF216: + .string "UCLASS_RESET" +.LASF117: + .string "ih_type" +.LASF80: + .string "bi_intfreq" +.LASF172: + .string "UCLASS_CLK" +.LASF351: + .string "net_ping_ip" +.LASF79: + .string "bi_ethspeed" +.LASF376: + .string "ofnode" +.LASF231: + .string "UCLASS_TPM" +.LASF316: + .string "child" +.LASF444: + .string "rockchip_secure_otp_wait_flag" +.LASF457: + .string "malloc_simple" +.LASF59: + .string "lmb_property" +.LASF269: + .string "enable" +.LASF429: + .string "data_byte" +.LASF263: + .string "tlb_addr" +.LASF374: + .string "value" +.LASF184: + .string "UCLASS_I2C_GENERIC" +.LASF99: + .string "off_dt_strings" +.LASF419: + .string "rockchip_otp_ids" +.LASF103: + .string "boot_cpuid_phys" +.LASF362: + .string "remove" +.LASF133: + .string "fit_uname_cfg" +.LASF106: + .string "working_fdt" +.LASF317: + .string "sibling" +.LASF460: + .string "drivers/misc/rk3562-secure-otp.c" +.LASF118: + .string "ih_comp" +.LASF202: + .string "UCLASS_PANEL_BACKLIGHT" +.LASF81: + .string "bi_busfreq" +.LASF297: + .string "ufdt_blob" +.LASF280: + .string "ram_top" +.LASF272: + .string "global_data" +.LASF328: + .string "s_addr" +.LASF127: + .string "arch" +.LASF226: + .string "UCLASS_SPI_GENERIC" +.LASF318: + .string "mtd_info" +.LASF95: + .string "fdt_header" +.LASF177: + .string "UCLASS_DISPLAY" +.LASF391: + .string "pre_probe" +.LASF353: + .string "net_loop_state" +.LASF55: + .string "protect" +.LASF347: + .string "net_restart_wrap" +.LASF307: + .string "video_bottom" +.LASF439: + .string "write_end" +.LASF71: + .string "bi_sramstart" +.LASF224: + .string "UCLASS_SPMI" +.LASF220: + .string "UCLASS_SCMI_AGENT" +.LASF23: + .string "_Bool" +.LASF12: + .string "phys_size_t" +.LASF45: + .string "udevice" +.LASF37: + .string "uclass_priv" +.LASF123: + .string "image_len" +.LASF319: + .string "jt_funcs" +.LASF409: + .string "call" +.LASF331: + .string "net_dns_server" +.LASF398: + .string "__invalid_size_argument_for_IOC" +.LASF57: + .string "flash_info" +.LASF463: + .string "free" +.LASF289: + .string "dm_root" +.LASF108: + .string "ih_magic" +.LASF218: + .string "UCLASS_RAMDISK" +.LASF124: + .string "load" +.LASF26: + .string "_binary_u_boot_bin_end" +.LASF141: + .string "fit_uname_fdt" +.LASF190: + .string "UCLASS_LED" +.LASF293: + .string "new_fdt" +.LASF408: + .string "ioctl" +.LASF434: + .string "rk3562_secure_otp_write_byte_noecc" +.LASF170: + .string "UCLASS_AHCI" +.LASF41: + .string "sibling_node" +.LASF334: + .string "net_root_path" +.LASF49: + .string "block_drvr" +.LASF9: + .string "long long int" +.LASF251: + .string "UCLASS_EBC" +.LASF325: + .string "save_addr" +.LASF35: + .string "priv" +.LASF209: + .string "UCLASS_PMIC" +.LASF303: + .string "malloc_limit" +.LASF14: + .string "char" +.LASF414: + .string "secure_otp_data" +.LASF180: + .string "UCLASS_GPIO" +.LASF44: + .string "ide_bus_offset" +.LASF255: + .string "UCLASS_PD" +.LASF52: + .string "sector_count" +.LASF145: + .string "fit_noffset_setup" +.LASF122: + .string "image_start" +.LASF56: + .string "flash_info_t" +.LASF228: + .string "UCLASS_SYSRESET" +.LASF115: + .string "ih_os" +.LASF31: + .string "uclass_platdata" +.LASF337: + .string "net_ip" +.LASF459: + .ascii "GNU C11 6.3.1 201" + .string "70404 -mstrict-align -march=armv8-a+nosimd -mlittle-endian -mabi=lp64 -g -Os -fno-builtin -ffreestanding -fshort-wchar -fno-stack-protector -fno-delete-null-pointer-checks -fstack-usage -ffunction-sections -fdata-sections -ffixed-r9 -fno-common -ffixed-x18" +.LASF306: + .string "video_top" +.LASF258: + .string "LOGF_MAX_CATEGORIES" +.LASF358: + .string "net_state" +.LASF286: + .string "start_addr_sp" +.LASF135: + .string "fit_uname_os" +.LASF18: + .string "uint8_t" +.LASF7: + .string "__u32" +.LASF363: + .string "unbind" +.LASF284: + .string "mon_len" +.LASF357: + .string "NETLOOP_FAIL" +.LASF418: + .string "rk3562_data" +.LASF365: + .string "child_post_bind" +.LASF314: + .string "full_name" +.LASF214: + .string "UCLASS_REGULATOR" +.LASF183: + .string "UCLASS_I2C_EEPROM" +.LASF371: + .string "per_child_platdata_auto_alloc_size" +.LASF445: + .string "rockchip_secure_otp_wait_status" +.LASF129: + .string "bootm_headers" +.LASF276: + .string "mem_clk" +.LASF359: + .string "of_match" +.LASF352: + .string "uclass_id" +.LASF321: + .string "monitor_flash_len" +.LASF367: + .string "child_post_remove" +.LASF370: + .string "per_child_auto_alloc_size" +.LASF213: + .string "UCLASS_RAM" +.LASF451: + .string "rk3562_spl_rockchip_otp_start" +.LASF364: + .string "ofdata_to_platdata" +.LASF208: + .string "UCLASS_PINCTRL" +.LASF29: + .string "platdata" +.LASF260: + .string "timer_rate_hz" +.LASF435: + .string "data_2b" +.LASF90: + .string "_datarelrolocal_start_ofs" +.LASF164: + .string "UCLASS_SPI_EMUL" +.LASF196: + .string "UCLASS_MOD_EXP" +.LASF97: + .string "totalsize" +.LASF388: + .string "uclass_driver" +.LASF73: + .string "bi_arm_freq" +.LASF199: + .string "UCLASS_NORTHBRIDGE" +.LASF236: + .string "UCLASS_USB_GADGET_GENERIC" +.LASF120: + .string "image_header_t" +.LASF68: + .string "bi_flashstart" +.LASF92: + .string "_datarelro_start_ofs" +.LASF13: + .string "sizetype" +.LASF386: + .string "compatible" +.LASF165: + .string "UCLASS_I2C_EMUL" +.LASF275: + .string "pci_clk" +.LASF173: + .string "UCLASS_CPU" +.LASF344: + .string "net_null_ethaddr" +.LASF86: + .string "bd_t" +.LASF174: + .string "UCLASS_AMP" +.LASF244: + .string "UCLASS_RC" +.LASF454: + .string "dev_read_u32_default" +.LASF338: + .string "net_server_ip" +.LASF281: + .string "ram_top_ext_size" +.LASF51: + .string "size" +.LASF58: + .string "long double" +.LASF76: + .string "bi_bootflags" +.LASF83: + .string "bi_boot_params" +.LASF442: + .string "rockchip_secure_otp_check_flag" +.LASF449: + .string "mask" +.LASF247: + .string "UCLASS_IO_DOMAIN" +.LASF25: + .string "_binary_u_boot_bin_start" +.LASF159: + .string "UCLASS_DEMO" +.LASF107: + .string "image_header" +.LASF102: + .string "last_comp_version" +.LASF322: + .string "__dtb_dt_begin" +.LASF252: + .string "UCLASS_EINK_DISPLAY" +.LASF310: + .string "sys_start_tick" +.LASF168: + .string "UCLASS_SIMPLE_BUS" +.LASF179: + .string "UCLASS_ETH" +.LASF153: + .string "cmdline_end" +.LASF75: + .string "bi_ddr_freq" +.LASF98: + .string "off_dt_struct" +.LASF441: + .string "rockchip_secure_otp_ecc_enable" +.LASF232: + .string "UCLASS_UFS" +.LASF309: + .string "serial" +.LASF387: + .string "data" +.LASF330: + .string "net_netmask" +.LASF323: + .string "__dtb_dt_spl_begin" +.LASF65: + .string "bd_info" +.LASF152: + .string "cmdline_start" +.LASF157: + .string "images" +.LASF268: + .string "using_pre_serial" +.LASF130: + .string "legacy_hdr_os" +.LASF426: + .string "otp_data" +.LASF192: + .string "UCLASS_MAILBOX" +.LASF217: + .string "UCLASS_RKNAND" +.LASF138: + .string "fit_uname_rd" +.LASF437: + .string "rk3562_secure_otp_read" +.LASF77: + .string "bi_ip_addr" +.LASF308: + .string "pm_ctx_phys" +.LASF296: + .string "of_root_f" +.LASF282: + .string "relocaddr" +.LASF33: + .string "driver_data" +.LASF0: + .string "unsigned char" +.LASF11: + .string "phys_addr_t" +.LASF390: + .string "pre_unbind" +.LASF432: + .string "rk3562_secure_otp_write_2_bytes" +.LASF339: + .string "net_tx_packet" +.LASF396: + .string "per_device_auto_alloc_size" +.LASF150: + .string "initrd_start" +.LASF34: + .string "parent" +.LASF381: + .string "current" +.LASF6: + .string "short int" +.LASF302: + .string "malloc_base" +.LASF116: + .string "ih_arch" +.LASF401: + .string "DECOM_GZIP" +.LASF315: + .string "properties" +.LASF241: + .string "UCLASS_WDT" +.LASF443: + .string "delay" +.LASF373: + .string "length" +.LASF332: + .string "net_nis_domain" +.LASF112: + .string "ih_load" +.LASF299: + .string "env_buf" +.LASF356: + .string "NETLOOP_SUCCESS" +.LASF167: + .string "UCLASS_USB_EMUL" +.LASF430: + .string "temp" +.LASF161: + .string "UCLASS_TEST_FDT" +.LASF294: + .string "fdt_size" +.LASF416: + .string "spl_rockchip_otp_stop" +.LASF446: + .string "flag" +.LASF17: + .string "ulong" +.LASF110: + .string "ih_time" +.LASF111: + .string "ih_size" +.LASF178: + .string "UCLASS_DMA" +.LASF254: + .string "UCLASS_DMC" +.LASF215: + .string "UCLASS_REMOTEPROC" +.LASF354: + .string "NETLOOP_CONTINUE" +.LASF219: + .string "UCLASS_RTC" +.LASF262: + .string "timer_reset_value" +.LASF295: + .string "of_root" +.LASF340: + .string "net_rx_packets" +.LASF194: + .string "UCLASS_MISC" +.LASF62: + .string "region" +.LASF148: + .string "ft_addr" +.LASF417: + .string "rockchip_secure_otp_ops" +.LASF406: + .string "read" +.LASF54: + .string "start" +.LASF144: + .string "fit_uname_setup" +.LASF114: + .string "ih_dcrc" +.LASF24: + .string "image_base" +.LASF393: + .string "pre_remove" +.LASF158: + .string "UCLASS_ROOT" +.LASF96: + .string "magic" +.LASF242: + .string "UCLASS_FG" +.LASF137: + .string "fit_hdr_rd" +.LASF140: + .string "fit_hdr_fdt" +.LASF113: + .string "ih_ep" +.LASF287: + .string "reloc_off" +.LASF394: + .string "init" +.LASF240: + .string "UCLASS_VIDEO_CRTC" +.LASF237: + .string "UCLASS_VIDEO" +.LASF447: + .string "secure_conf" +.LASF205: + .string "UCLASS_PCI_GENERIC" +.LASF1: + .string "long unsigned int" +.LASF5: + .string "__u8" +.LASF375: + .string "of_offset" +.LASF259: + .string "arch_global_data" +.LASF89: + .string "_datarel_start_ofs" +.LASF312: + .string "device_node" +.LASF264: + .string "tlb_size" +.LASF66: + .string "bi_memstart" +.LASF109: + .string "ih_hcrc" +.LASF104: + .string "size_dt_strings" +.LASF128: + .string "image_info_t" +.LASF63: + .string "memory" +.LASF27: + .string "driver" +.LASF147: + .string "rd_end" +.LASF193: + .string "UCLASS_MASS_STORAGE" +.LASF450: + .string "rk3562_spl_rockchip_otp_stop" +.LASF151: + .string "initrd_end" +.LASF210: + .string "UCLASS_PWM" +.LASF93: + .string "IRQ_STACK_START_IN" +.LASF84: + .string "bi_andr_version" +.LASF126: + .string "type" +.LASF342: + .string "net_rx_packet_len" +.LASF384: + .string "u_boot_dev_head" +.LASF427: + .string "secure_otp_read" +.LASF221: + .string "UCLASS_SCSI" +.LASF16: + .string "ushort" +.LASF204: + .string "UCLASS_PCI" +.LASF198: + .string "UCLASS_NOP" +.LASF395: + .string "destroy" +.LASF448: + .string "otp_cru_rst" +.LASF248: + .string "UCLASS_CRYPTO" +.LASF453: + .string "dev_read_addr_ptr" +.LASF277: + .string "have_console" +.LASF400: + .string "DECOM_LZ4" +.LASF175: + .string "UCLASS_CODEC" +.LASF382: + .string "uc_drv" +.LASF233: + .string "UCLASS_USB" +.LASF305: + .string "cur_serial_dev" +.LASF271: + .string "addr" +.LASF46: + .string "list_head" +.LASF155: + .string "state" +.LASF20: + .string "__be32" +.LASF207: + .string "UCLASS_PINCONFIG" +.LASF234: + .string "UCLASS_USB_DEV_GENERIC" +.LASF343: + .string "net_bcast_ethaddr" +.LASF136: + .string "fit_noffset_os" +.LASF223: + .string "UCLASS_SPI" +.LASF336: + .string "net_server_ethaddr" +.LASF256: + .string "UCLASS_COUNT" +.LASF279: + .string "env_valid" +.LASF246: + .string "UCLASS_DVFS" +.LASF413: + .string "otp_cru_rst_base" +.LASF40: + .string "child_head" +.LASF50: + .string "select_hwpart" +.LASF4: + .string "uchar" +.LASF69: + .string "bi_flashsize" +.LASF383: + .string "dev_head" +.LASF410: + .string "rockchip_otp_platdata" +.LASF2: + .string "short unsigned int" +.LASF392: + .string "post_probe" +.LASF366: + .string "child_pre_probe" +.LASF422: + .string "secure_otp_ioctl" +.LASF348: + .string "net_boot_file_name" +.LASF407: + .string "write" +.LASF245: + .string "UCLASS_CHARGE_DISPLAY" +.LASF257: + .string "UCLASS_INVALID" +.LASF403: + .string "OTP_S" +.LASF433: + .string "__func__" +.LASF64: + .string "reserved" +.LASF182: + .string "UCLASS_I2C" +.LASF119: + .string "ih_name" +.LASF462: + .string "ofnode_union" +.LASF412: + .string "otp_mask_base" +.LASF169: + .string "UCLASS_ADC" +.LASF43: + .string "req_seq" +.LASF283: + .string "ram_size" +.LASF452: + .string "dev_get_platdata" +.LASF186: + .string "UCLASS_I2S" +.LASF368: + .string "priv_auto_alloc_size" +.LASF30: + .string "parent_platdata" +.LASF411: + .string "secure_conf_base" +.LASF154: + .string "verify" +.LASF88: + .string "FIQ_STACK_START" +.LASF85: + .string "bi_dram" +.LASF125: + .string "comp" +.LASF346: + .string "net_native_vlan" +.LASF424: + .string "secure_otp_write" +.LASF211: + .string "UCLASS_POWER_DOMAIN" +.LASF399: + .string "misc_mode" +.LASF273: + .string "cpu_clk" +.LASF238: + .string "UCLASS_VIDEO_BRIDGE" +.LASF369: + .string "platdata_auto_alloc_size" +.LASF61: + .string "lmb_region" +.LASF243: + .string "UCLASS_KEY" + .ident "GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404" + .section .note.GNU-stack,"",@progbits diff --git a/u-boot/drivers/misc/rockchip-otp.c b/u-boot/drivers/misc/rockchip-otp.c index 6782148..16d53bf 100644 --- a/u-boot/drivers/misc/rockchip-otp.c +++ b/u-boot/drivers/misc/rockchip-otp.c @@ -246,7 +246,7 @@ if (!buffer) return -ENOMEM; - ret = rockchip_otp_ecc_enable(otp, false); + ret = rockchip_otp_ecc_enable(otp, true); if (ret < 0) { printf("%s rockchip_otp_ecc_enable err\n", __func__); return ret; @@ -460,6 +460,14 @@ .data = (ulong)&rk3308bs_data, }, { + .compatible = "rockchip,rk3528-otp", + .data = (ulong)&rk3568_data, + }, + { + .compatible = "rockchip,rk3562-otp", + .data = (ulong)&rk3568_data, + }, + { .compatible = "rockchip,rk3568-otp", .data = (ulong)&rk3568_data, }, diff --git a/u-boot/drivers/mmc/dw_mmc.c b/u-boot/drivers/mmc/dw_mmc.c index ae4a04d..aa31971 100644 --- a/u-boot/drivers/mmc/dw_mmc.c +++ b/u-boot/drivers/mmc/dw_mmc.c @@ -8,6 +8,7 @@ #include <common.h> #include <bouncebuf.h> +#include <div64.h> #include <errno.h> #include <malloc.h> #include <memalign.h> @@ -19,6 +20,7 @@ #endif #define PAGE_SIZE 4096 +#define MSEC_PER_SEC 1000ULL /* * Currently it supports read/write up to 8*8*4 Bytes per @@ -159,18 +161,62 @@ dwmci_writel(host, DWMCI_BYTCNT, data->blocksize * data->blocks); } -static unsigned int dwmci_get_timeout(struct mmc *mmc, const unsigned int size) +#ifdef CONFIG_SPL_BUILD +static unsigned int dwmci_get_drto(struct dwmci_host *host, + const unsigned int size) +{ + unsigned int drto_clks; + unsigned int drto_div; + unsigned int drto_ms; + + drto_clks = dwmci_readl(host, DWMCI_TMOUT) >> 8; + drto_div = (dwmci_readl(host, DWMCI_CLKDIV) & 0xff) * 2; + if (drto_div == 0) + drto_div = 1; + + drto_ms = DIV_ROUND_UP_ULL((u64)MSEC_PER_SEC * drto_clks * drto_div, + host->mmc->clock); + + /* add a bit spare time */ + drto_ms += 10; + + return drto_ms; +} +#else +static unsigned int dwmci_get_drto(struct dwmci_host *host, + const unsigned int size) { unsigned int timeout; timeout = size * 8; /* counting in bits */ timeout *= 10; /* wait 10 times as long */ - timeout /= mmc->clock; - timeout /= mmc->bus_width; + timeout /= host->mmc->clock; + timeout /= host->mmc->bus_width; timeout *= 1000; /* counting in msec */ timeout = (timeout < 10000) ? 10000 : timeout; return timeout; +} +#endif + +static unsigned int dwmci_get_cto(struct dwmci_host *host) +{ + unsigned int cto_clks; + unsigned int cto_div; + unsigned int cto_ms; + + cto_clks = dwmci_readl(host, DWMCI_TMOUT) & 0xff; + cto_div = (dwmci_readl(host, DWMCI_CLKDIV) & 0xff) * 2; + if (cto_div == 0) + cto_div = 1; + + cto_ms = DIV_ROUND_UP_ULL((u64)MSEC_PER_SEC * cto_clks * cto_div, + host->mmc->clock); + + /* add a bit spare time */ + cto_ms += 10; + + return cto_ms; } static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data) @@ -192,7 +238,7 @@ else buf = (unsigned int *)data->src; - timeout = dwmci_get_timeout(host->mmc, size); + timeout = dwmci_get_drto(host, size); size /= 4; for (;;) { @@ -252,6 +298,7 @@ } dwmci_writel(host, DWMCI_RINTSTS, DWMCI_INTMSK_RXDR); + start = get_timer(0); } else if (data->flags == MMC_DATA_WRITE && (mask & DWMCI_INTMSK_TXDR)) { while (size) { @@ -281,6 +328,7 @@ } dwmci_writel(host, DWMCI_RINTSTS, DWMCI_INTMSK_TXDR); + start = get_timer(0); } } @@ -329,9 +377,8 @@ struct dwmci_host *host = mmc->priv; ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac, data ? DIV_ROUND_UP(data->blocks, 8) : 0); - int ret = 0, flags = 0, i; + int ret = 0, flags = 0; unsigned int timeout = 500; - u32 retry = 100000; u32 mask, ctrl; ulong start = get_timer(0); struct bounce_buffer bbstate; @@ -400,16 +447,18 @@ dwmci_writel(host, DWMCI_CMD, flags); - for (i = 0; i < retry; i++) { + timeout = dwmci_get_cto(host); + start = get_timer(0); + do { mask = dwmci_readl(host, DWMCI_RINTSTS); if (mask & DWMCI_INTMSK_CDONE) { if (!data) dwmci_writel(host, DWMCI_RINTSTS, mask); break; } - } + } while (!(get_timer(start) > timeout)); - if (i == retry) { + if (get_timer(start) > timeout) { debug("%s: Timeout.\n", __func__); return -ETIMEDOUT; } @@ -470,9 +519,8 @@ #endif struct dwmci_host *host = mmc->priv; struct dwmci_idmac *cur_idmac; - int ret = 0, flags = 0, i; + int ret = 0, flags = 0; unsigned int timeout = 500; - u32 retry = 100000; u32 mask; ulong start = get_timer(0); struct bounce_buffer bbstate; @@ -541,16 +589,18 @@ dwmci_writel(host, DWMCI_CMD, flags); - for (i = 0; i < retry; i++) { + timeout = dwmci_get_cto(host); + start = get_timer(0); + do { mask = dwmci_readl(host, DWMCI_RINTSTS); if (mask & DWMCI_INTMSK_CDONE) { if (!data) dwmci_writel(host, DWMCI_RINTSTS, mask); break; } - } + } while (!(get_timer(start) > timeout)); - if (i == retry) { + if (get_timer(start) > timeout) { debug("%s: Timeout.\n", __func__); return -ETIMEDOUT; } diff --git a/u-boot/drivers/mmc/mmc-uclass.c b/u-boot/drivers/mmc/mmc-uclass.c index 0b49d3d..eb44c38 100644 --- a/u-boot/drivers/mmc/mmc-uclass.c +++ b/u-boot/drivers/mmc/mmc-uclass.c @@ -143,6 +143,20 @@ return dm_mmc_get_cd(mmc->dev); } +static int dm_mmc_set_enhanced_strobe(struct udevice *dev) +{ + struct dm_mmc_ops *ops = mmc_get_ops(dev); + + if (ops->set_enhanced_strobe) + return ops->set_enhanced_strobe(dev); + + return -ENOTSUPP; +} + +int mmc_set_enhanced_strobe(struct mmc *mmc) +{ + return dm_mmc_set_enhanced_strobe(mmc->dev); +} struct mmc *mmc_get_mmc_dev(struct udevice *dev) { struct mmc_uclass_priv *upriv; diff --git a/u-boot/drivers/mmc/mmc.c b/u-boot/drivers/mmc/mmc.c index 679fda6..590e4ba 100644 --- a/u-boot/drivers/mmc/mmc.c +++ b/u-boot/drivers/mmc/mmc.c @@ -1007,12 +1007,22 @@ return ret; } +static int mmc_switch_to_hs400(struct mmc *mmc) +{ + u8 val, fixed_drv_type, card_drv_type, drive_strength; + + fixed_drv_type = mmc->cfg->fixed_drv_type; + card_drv_type = mmc->raw_driver_strength | mmc_driver_type_mask(0); + drive_strength = (card_drv_type & mmc_driver_type_mask(fixed_drv_type)) + ? fixed_drv_type : 0; + val = EXT_CSD_TIMING_HS400 | drive_strength << EXT_CSD_DRV_STR_SHIFT; + + return __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, val, false); +} + static int mmc_select_hs400(struct mmc *mmc) { int ret; - - /* Reduce frequency to HS frequency */ - mmc_set_clock(mmc, MMC_HIGH_52_MAX_DTR); /* Switch card to HS mode */ ret = __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, @@ -1022,6 +1032,9 @@ /* Set host controller to HS timing */ mmc_set_timing(mmc, MMC_TIMING_MMC_HS); + + /* Reduce frequency to HS frequency */ + mmc_set_clock(mmc, MMC_HIGH_52_MAX_DTR); ret = mmc_send_status(mmc, 1000); if (ret) @@ -1035,8 +1048,7 @@ return ret; /* Switch card to HS400 */ - ret = __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400, false); + ret = mmc_switch_to_hs400(mmc); if (ret) return ret; @@ -1045,9 +1057,48 @@ return ret; } + +static int mmc_select_hs400es(struct mmc *mmc) +{ + int err; + + /* Switch card to HS mode */ + err = __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, + EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, false); + if (err) + return err; + + /* Set host controller to HS timing */ + mmc_set_timing(mmc, MMC_TIMING_MMC_HS); + + err = mmc_send_status(mmc, 1000); + if (err) + return err; + + mmc_set_clock(mmc, MMC_HIGH_52_MAX_DTR); + + err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, + EXT_CSD_DDR_BUS_WIDTH_8 | + EXT_CSD_BUS_WIDTH_STROBE); + if (err) { + printf("switch to bus width for hs400 failed\n"); + return err; + } + + /* Switch card to HS400 */ + err = mmc_switch_to_hs400(mmc); + if (err) + return err; + + /* Set host controller to HS400 timing and frequency */ + mmc_set_timing(mmc, MMC_TIMING_MMC_HS400ES); + + return mmc_set_enhanced_strobe(mmc); +} #else static int mmc_select_hs200(struct mmc *mmc) { return 0; } static int mmc_select_hs400(struct mmc *mmc) { return 0; } +static int mmc_select_hs400es(struct mmc *mmc) { return 0; } #endif static u32 mmc_select_card_type(struct mmc *mmc, u8 *ext_csd) @@ -1139,6 +1190,16 @@ return err; avail_type = mmc_select_card_type(mmc, ext_csd); + + if (avail_type & EXT_CSD_CARD_TYPE_HS400ES) { + err = mmc_select_bus_width(mmc); + if (err > 0 && mmc->bus_width == MMC_BUS_WIDTH_8BIT) { + err = mmc_select_hs400es(mmc); + mmc_set_bus_speed(mmc, avail_type); + if (!err) + return err; + } + } if (avail_type & EXT_CSD_CARD_TYPE_HS200) err = mmc_select_hs200(mmc); @@ -1824,6 +1885,10 @@ mmc->erase_grp_size = 1; mmc->part_config = MMCPART_NOAVAILABLE; if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) { + /* select high speed to reduce initialization time */ + mmc_select_hs(mmc); + mmc_set_clock(mmc, MMC_HIGH_52_MAX_DTR); + /* check ext_csd version and capacity */ err = mmc_send_ext_csd(mmc, ext_csd); if (err) @@ -1973,6 +2038,8 @@ * ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET]; + + mmc->raw_driver_strength = ext_csd[EXT_CSD_DRIVER_STRENGTH]; } err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart); diff --git a/u-boot/drivers/mmc/rockchip_dw_mmc.c b/u-boot/drivers/mmc/rockchip_dw_mmc.c index 1287551..a78cb39 100644 --- a/u-boot/drivers/mmc/rockchip_dw_mmc.c +++ b/u-boot/drivers/mmc/rockchip_dw_mmc.c @@ -42,7 +42,7 @@ { struct rockchip_dwmmc_priv *priv = dev_get_priv(dev); - if (!priv || !&priv->clk) + if (!priv) return 0; if (!memcmp(dev->name, "dwmmc", strlen("dwmmc"))) diff --git a/u-boot/drivers/mmc/rockchip_sdhci.c b/u-boot/drivers/mmc/rockchip_sdhci.c index d6224da..327c0d2 100644 --- a/u-boot/drivers/mmc/rockchip_sdhci.c +++ b/u-boot/drivers/mmc/rockchip_sdhci.c @@ -39,6 +39,12 @@ ((((x) >> PHYCTRL_DLLRDY_SHIFT) & PHYCTRL_DLLRDY_MASK) ==\ PHYCTRL_DLLRDY_DONE) +#define ARASAN_VENDOR_REGISTER 0x78 +#define ARASAN_VENDOR_ENHANCED_STROBE BIT(0) + +/* DWC IP vendor area 1 pointer */ +#define DWCMSHC_P_VENDOR_AREA1 0xe8 +#define DWCMSHC_AREA1_MASK GENMASK(11, 0) /* Rockchip specific Registers */ #define DWCMSHC_CTRL_HS400 0x7 #define DWCMSHC_CARD_IS_EMMC BIT(0) @@ -46,6 +52,7 @@ #define DWCMSHC_HOST_CTRL3 0x508 #define DWCMSHC_EMMC_CONTROL 0x52c +#define DWCMSHC_EMMC_ATCTRL 0x540 #define DWCMSHC_EMMC_DLL_CTRL 0x800 #define DWCMSHC_EMMC_DLL_CTRL_RESET BIT(1) #define DWCMSHC_EMMC_DLL_RXCLK 0x804 @@ -55,25 +62,31 @@ #define DWCMSHC_EMMC_DLL_STATUS0 0x840 #define DWCMSHC_EMMC_DLL_STATUS1 0x844 #define DWCMSHC_EMMC_DLL_START BIT(0) -#define DWCMSHC_EMMC_DLL_RXCLK_SRCSEL 29 #define DWCMSHC_EMMC_DLL_START_POINT 16 #define DWCMSHC_EMMC_DLL_START_DEFAULT 5 #define DWCMSHC_EMMC_DLL_INC_VALUE 2 #define DWCMSHC_EMMC_DLL_INC 8 +#define DWCMSHC_EMMC_DLL_BYPASS BIT(24) #define DWCMSHC_EMMC_DLL_DLYENA BIT(27) #define DLL_TXCLK_TAPNUM_DEFAULT 0x10 -#define DLL_TXCLK_TAPNUM_90_DEGREES 0x8 -#define DLL_STRBIN_TAPNUM_DEFAULT 0x3 +#define DLL_TXCLK_TAPNUM_90_DEGREES 0x9 +#define DLL_STRBIN_TAPNUM_DEFAULT 0x4 +#define DLL_STRBIN_DELAY_NUM_OFFSET 16 +#define DLL_STRBIN_TAPNUM_FROM_SW BIT(24) +#define DLL_STRBIN_DELAY_NUM_SEL BIT(26) #define DLL_TXCLK_TAPNUM_FROM_SW BIT(24) #define DLL_TXCLK_NO_INVERTER BIT(29) #define DWCMSHC_EMMC_DLL_LOCKED BIT(8) #define DWCMSHC_EMMC_DLL_TIMEOUT BIT(9) -#define DLL_RXCLK_NO_INVERTER 1 -#define DLL_RXCLK_INVERTER 0 +#define DLL_TAP_VALUE_SEL BIT(25) +#define DLL_TAP_VALUE_OFFSET 8 +#define DLL_RXCLK_NO_INVERTER BIT(29) +#define DLL_RXCLK_ORI_GATE BIT(31) #define DLL_CMDOUT_TAPNUM_90_DEGREES 0x8 #define DLL_CMDOUT_TAPNUM_FROM_SW BIT(24) #define DLL_CMDOUT_SRC_CLK_NEG BIT(28) #define DLL_CMDOUT_EN_SRC_CLK_NEG BIT(29) +#define DLL_CMDOUT_BOTH_CLK_EDGE BIT(30) #define DWCMSHC_ENHANCED_STROBE BIT(8) #define DLL_LOCK_WO_TMOUT(x) \ @@ -106,10 +119,18 @@ struct sdhci_data { int (*emmc_set_clock)(struct sdhci_host *host, unsigned int clock); void (*set_ios_post)(struct sdhci_host *host); + int (*set_enhanced_strobe)(struct sdhci_host *host); int (*get_phy)(struct udevice *dev); u32 flags; #define RK_DLL_CMD_OUT BIT(1) #define RK_RXCLK_NO_INVERTER BIT(2) +#define RK_TAP_VALUE_SEL BIT(3) + + u8 hs200_tx_tap; + u8 hs400_tx_tap; + u8 hs400_cmd_tap; + u8 hs400_strbin_tap; + u8 ddr50_strbin_delay_num; }; static void rk3399_emmc_phy_power_on(struct rockchip_emmc_phy *phy, u32 clock) @@ -254,21 +275,7 @@ clk |= SDHCI_CLOCK_INT_EN; sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); - /* Wait max 20 ms */ - timeout = 20; - while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL)) - & SDHCI_CLOCK_INT_STABLE)) { - if (timeout == 0) { - printf("%s: Internal clock never stabilised.\n", - __func__); - return -EBUSY; - } - timeout--; - udelay(1000); - } - clk |= SDHCI_CLOCK_CARD_EN; - sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); - host->clock = clock; + sdhci_enable_clk(host, clk); return 0; } @@ -323,16 +330,24 @@ { struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host); struct sdhci_data *data = (struct sdhci_data *)dev_get_driver_data(priv->dev); - u32 extra; + u32 txclk_tapnum, extra, dll_lock_value; int timeout = 500, ret; ret = rockchip_emmc_set_clock(host, clock); + + /* Disable output clock while config DLL */ + sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL); if (clock >= 100 * MHz) { /* reset DLL */ sdhci_writel(host, DWCMSHC_EMMC_DLL_CTRL_RESET, DWCMSHC_EMMC_DLL_CTRL); udelay(1); sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL); + + extra = 0x1 << 16 | /* tune clock stop en */ + 0x2 << 17 | /* pre-change delay */ + 0x3 << 19; /* post-change delay */ + sdhci_writel(host, extra, DWCMSHC_EMMC_ATCTRL); /* Init DLL settings */ extra = DWCMSHC_EMMC_DLL_START_DEFAULT << DWCMSHC_EMMC_DLL_START_POINT | @@ -341,48 +356,106 @@ sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_CTRL); while (1) { - if (timeout < 0) - return -ETIMEDOUT; + if (timeout < 0) { + ret = -ETIMEDOUT; + goto exit; + } if (DLL_LOCK_WO_TMOUT((sdhci_readl(host, DWCMSHC_EMMC_DLL_STATUS0)))) break; udelay(1); timeout--; } - extra = DWCMSHC_EMMC_DLL_DLYENA; + dll_lock_value = ((sdhci_readl(host, DWCMSHC_EMMC_DLL_STATUS0) & 0xFF) * 2 ) & 0xFF; + extra = DWCMSHC_EMMC_DLL_DLYENA | DLL_RXCLK_ORI_GATE; if (data->flags & RK_RXCLK_NO_INVERTER) - extra |= DLL_RXCLK_NO_INVERTER << DWCMSHC_EMMC_DLL_RXCLK_SRCSEL; + extra |= DLL_RXCLK_NO_INVERTER; + if (data->flags & RK_TAP_VALUE_SEL) + extra |= DLL_TAP_VALUE_SEL | (dll_lock_value << DLL_TAP_VALUE_OFFSET); sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_RXCLK); + + txclk_tapnum = data->hs200_tx_tap; + if ((data->flags & RK_DLL_CMD_OUT) && + (host->mmc->timing == MMC_TIMING_MMC_HS400 || + host->mmc->timing == MMC_TIMING_MMC_HS400ES)) { + txclk_tapnum = data->hs400_tx_tap; + + extra = DLL_CMDOUT_SRC_CLK_NEG | + DLL_CMDOUT_BOTH_CLK_EDGE | + DWCMSHC_EMMC_DLL_DLYENA | + data->hs400_cmd_tap | + DLL_CMDOUT_TAPNUM_FROM_SW; + if (data->flags & RK_TAP_VALUE_SEL) + extra |= DLL_TAP_VALUE_SEL | (dll_lock_value << DLL_TAP_VALUE_OFFSET); + sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); + } extra = DWCMSHC_EMMC_DLL_DLYENA | DLL_TXCLK_TAPNUM_FROM_SW | DLL_TXCLK_NO_INVERTER| - DLL_TXCLK_TAPNUM_DEFAULT; - + txclk_tapnum; + if (data->flags & RK_TAP_VALUE_SEL) + extra |= DLL_TAP_VALUE_SEL | (dll_lock_value << DLL_TAP_VALUE_OFFSET); sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_TXCLK); extra = DWCMSHC_EMMC_DLL_DLYENA | - DLL_STRBIN_TAPNUM_DEFAULT; + data->hs400_strbin_tap | + DLL_STRBIN_TAPNUM_FROM_SW; + if (data->flags & RK_TAP_VALUE_SEL) + extra |= DLL_TAP_VALUE_SEL | (dll_lock_value << DLL_TAP_VALUE_OFFSET); sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN); } else { + /* disable dll */ + sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL); + /* Disable cmd conflict check */ extra = sdhci_readl(host, DWCMSHC_HOST_CTRL3); extra &= ~BIT(0); sdhci_writel(host, extra, DWCMSHC_HOST_CTRL3); /* reset the clock phase when the frequency is lower than 100MHz */ - sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_CTRL); - sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_RXCLK); + sdhci_writel(host, DWCMSHC_EMMC_DLL_BYPASS | DWCMSHC_EMMC_DLL_START, DWCMSHC_EMMC_DLL_CTRL); + sdhci_writel(host, DLL_RXCLK_ORI_GATE, DWCMSHC_EMMC_DLL_RXCLK); sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_TXCLK); - sdhci_writel(host, 0, DWCMSHC_EMMC_DLL_STRBIN); sdhci_writel(host, 0, DECMSHC_EMMC_DLL_CMDOUT); + /* + * Before switching to hs400es mode, the driver will enable + * enhanced strobe first. PHY needs to configure the parameters + * of enhanced strobe first. + */ + extra = DWCMSHC_EMMC_DLL_DLYENA | + DLL_STRBIN_DELAY_NUM_SEL | + data->ddr50_strbin_delay_num << DLL_STRBIN_DELAY_NUM_OFFSET; + sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_STRBIN); } + +exit: + /* enable output clock */ + sdhci_enable_clk(host, 0); + return ret; +} + +static int dwcmshc_sdhci_set_enhanced_strobe(struct sdhci_host *host) +{ + struct mmc *mmc = host->mmc; + u32 vendor; + + vendor = sdhci_readl(host, DWCMSHC_EMMC_CONTROL); + if (mmc->timing == MMC_TIMING_MMC_HS400ES) + vendor |= DWCMSHC_ENHANCED_STROBE; + else + vendor &= ~DWCMSHC_ENHANCED_STROBE; + sdhci_writel(host, vendor, DWCMSHC_EMMC_CONTROL); + + /* some emmc device need a delay before send command */ + udelay(100); + + return 0; } static void dwcmshc_sdhci_set_ios_post(struct sdhci_host *host) { u16 ctrl; - u32 extra; u32 timing = host->mmc->timing; if (timing == MMC_TIMING_MMC_HS400 || timing == MMC_TIMING_MMC_HS400ES) { @@ -395,16 +468,6 @@ ctrl = sdhci_readw(host, DWCMSHC_EMMC_CONTROL); ctrl |= DWCMSHC_CARD_IS_EMMC; sdhci_writew(host, ctrl, DWCMSHC_EMMC_CONTROL); - - extra = DLL_CMDOUT_SRC_CLK_NEG | - DLL_CMDOUT_EN_SRC_CLK_NEG; - sdhci_writel(host, extra, DECMSHC_EMMC_DLL_CMDOUT); - - extra = DWCMSHC_EMMC_DLL_DLYENA | - DLL_TXCLK_TAPNUM_FROM_SW | - DLL_TXCLK_NO_INVERTER| - DLL_TXCLK_TAPNUM_90_DEGREES; - sdhci_writel(host, extra, DWCMSHC_EMMC_DLL_TXCLK); } } @@ -434,9 +497,21 @@ data->set_ios_post(host); } +static int rockchip_sdhci_set_enhanced_strobe(struct sdhci_host *host) +{ + struct rockchip_sdhc *priv = container_of(host, struct rockchip_sdhc, host); + struct sdhci_data *data = (struct sdhci_data *)dev_get_driver_data(priv->dev); + + if (data->set_enhanced_strobe) + return data->set_enhanced_strobe(host); + + return -ENOTSUPP; +} + static struct sdhci_ops rockchip_sdhci_ops = { .set_clock = rockchip_sdhci_set_clock, .set_ios_post = rockchip_sdhci_set_ios_post, + .set_enhanced_strobe = rockchip_sdhci_set_enhanced_strobe, }; static int rockchip_sdhci_probe(struct udevice *dev) @@ -496,7 +571,13 @@ host->host_caps |= MMC_MODE_HS200; else if (dev_read_bool(dev, "mmc-hs400-1_8v")) host->host_caps |= MMC_MODE_HS400; + + if (data->set_enhanced_strobe && dev_read_bool(dev, "mmc-hs400-enhanced-strobe")) + host->host_caps |= MMC_MODE_HS400ES; + ret = sdhci_setup_cfg(&plat->cfg, host, 0, EMMC_MIN_FREQ); + + plat->cfg.fixed_drv_type = dev_read_u32_default(dev, "fixed-emmc-driver-type", 0); host->mmc = &plat->mmc; if (ret) @@ -536,13 +617,50 @@ .emmc_set_clock = dwcmshc_sdhci_emmc_set_clock, .get_phy = dwcmshc_emmc_get_phy, .flags = RK_RXCLK_NO_INVERTER, + .hs200_tx_tap = 16, + .hs400_tx_tap = 8, + .hs400_cmd_tap = 8, + .hs400_strbin_tap = 3, + .ddr50_strbin_delay_num = 16, }; static const struct sdhci_data rk3588_data = { .emmc_set_clock = dwcmshc_sdhci_emmc_set_clock, .get_phy = dwcmshc_emmc_get_phy, .set_ios_post = dwcmshc_sdhci_set_ios_post, - .flags = RK_DLL_CMD_OUT | RK_RXCLK_NO_INVERTER, + .set_enhanced_strobe = dwcmshc_sdhci_set_enhanced_strobe, + .flags = RK_DLL_CMD_OUT, + .hs200_tx_tap = 16, + .hs400_tx_tap = 9, + .hs400_cmd_tap = 8, + .hs400_strbin_tap = 3, + .ddr50_strbin_delay_num = 16, +}; + +static const struct sdhci_data rk3528_data = { + .emmc_set_clock = dwcmshc_sdhci_emmc_set_clock, + .get_phy = dwcmshc_emmc_get_phy, + .set_ios_post = dwcmshc_sdhci_set_ios_post, + .set_enhanced_strobe = dwcmshc_sdhci_set_enhanced_strobe, + .flags = RK_DLL_CMD_OUT | RK_TAP_VALUE_SEL, + .hs200_tx_tap = 12, + .hs400_tx_tap = 6, + .hs400_cmd_tap = 6, + .hs400_strbin_tap = 3, + .ddr50_strbin_delay_num = 10, +}; + +static const struct sdhci_data rk3562_data = { + .emmc_set_clock = dwcmshc_sdhci_emmc_set_clock, + .get_phy = dwcmshc_emmc_get_phy, + .set_ios_post = dwcmshc_sdhci_set_ios_post, + .set_enhanced_strobe = dwcmshc_sdhci_set_enhanced_strobe, + .flags = RK_DLL_CMD_OUT | RK_TAP_VALUE_SEL, + .hs200_tx_tap = 12, + .hs400_tx_tap = 6, + .hs400_cmd_tap = 6, + .hs400_strbin_tap = 3, + .ddr50_strbin_delay_num = 10, }; static const struct udevice_id sdhci_ids[] = { @@ -555,6 +673,14 @@ .data = (ulong)&rk3568_data, }, { + .compatible = "rockchip,rk3528-dwcmshc", + .data = (ulong)&rk3528_data, + }, + { + .compatible = "rockchip,rk3562-dwcmshc", + .data = (ulong)&rk3562_data, + }, + { .compatible = "rockchip,rk3588-dwcmshc", .data = (ulong)&rk3588_data, }, diff --git a/u-boot/drivers/mmc/sdhci.c b/u-boot/drivers/mmc/sdhci.c index 8c2a9a6..a02baa5 100644 --- a/u-boot/drivers/mmc/sdhci.c +++ b/u-boot/drivers/mmc/sdhci.c @@ -178,6 +178,7 @@ } else { puts("timeout.\n"); /* remove timeout return error and try to send command */ + break; } } time++; @@ -313,6 +314,29 @@ return -ECOMM; } +void sdhci_enable_clk(struct sdhci_host *host, u16 clk) +{ + unsigned int timeout; + + clk |= SDHCI_CLOCK_INT_EN; + sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); + + /* Wait max 20 ms */ + timeout = 20; + while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL)) + & SDHCI_CLOCK_INT_STABLE)) { + if (timeout == 0) { + printf("%s: Internal clock never stabilised.\n", + __func__); + return; + } + timeout--; + udelay(1000); + } + clk |= SDHCI_CLOCK_CARD_EN; + sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); +} + int sdhci_set_clock(struct sdhci_host *host, unsigned int clock) { unsigned int div, clk = 0, timeout; @@ -379,23 +403,8 @@ clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT; clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN) << SDHCI_DIVIDER_HI_SHIFT; - clk |= SDHCI_CLOCK_INT_EN; - sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); - /* Wait max 20 ms */ - timeout = 20; - while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL)) - & SDHCI_CLOCK_INT_STABLE)) { - if (timeout == 0) { - printf("%s: Internal clock never stabilised.\n", - __func__); - return -EBUSY; - } - timeout--; - udelay(1000); - } - clk |= SDHCI_CLOCK_CARD_EN; - sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); + sdhci_enable_clk(host, clk); host->clock = clock; return 0; @@ -681,11 +690,23 @@ return sdhci_init(mmc); } +static int sdhci_set_enhanced_strobe(struct udevice *dev) +{ + struct mmc *mmc = mmc_get_mmc_dev(dev); + struct sdhci_host *host = mmc->priv; + + if (host->ops && host->ops->set_enhanced_strobe) + return host->ops->set_enhanced_strobe(host); + + return -ENOTSUPP; +} + const struct dm_mmc_ops sdhci_ops = { .card_busy = sdhci_card_busy, .send_cmd = sdhci_send_command, .set_ios = sdhci_set_ios, .execute_tuning = sdhci_execute_tuning, + .set_enhanced_strobe = sdhci_set_enhanced_strobe, }; #else static const struct mmc_ops sdhci_ops = { diff --git a/u-boot/drivers/mtd/mtd_blk.c b/u-boot/drivers/mtd/mtd_blk.c index a8226d7..1ac6f81 100644 --- a/u-boot/drivers/mtd/mtd_blk.c +++ b/u-boot/drivers/mtd/mtd_blk.c @@ -22,9 +22,6 @@ #endif #define MTD_PART_NAND_HEAD "mtdparts=" -#define MTD_ROOT_PART_NUM "ubi.mtd=" -#define MTD_ROOT_PART_NAME_UBIFS "root=ubi0:rootfs" -#define MTD_ROOT_PART_NAME_SQUASHFS "root=/dev/ubiblock0_0" #define MTD_PART_INFO_MAX_SIZE 512 #define MTD_SINGLE_PART_INFO_MAX_SIZE 40 @@ -371,20 +368,7 @@ mtd = (struct mtd_info *)dev_desc->bdev->priv; if (!mtd) return NULL; -#ifndef CONFIG_SPL_BUILD - char mtd_root_part_info[40] = {0}; - p = part_get_info_by_name(dev_desc, PART_SYSTEM, &info); - if (p > 0) { - if (strstr(env_get("bootargs"), "rootfstype=squashfs")) - snprintf(mtd_root_part_info, ARRAY_SIZE(mtd_root_part_info), "%s%d %s", - MTD_ROOT_PART_NUM, p - 1, MTD_ROOT_PART_NAME_SQUASHFS); - else - snprintf(mtd_root_part_info, ARRAY_SIZE(mtd_root_part_info), "%s%d %s", - MTD_ROOT_PART_NUM, p - 1, MTD_ROOT_PART_NAME_UBIFS); - env_update("bootargs", mtd_root_part_info); - } -#endif mtd_part_info = (char *)calloc(MTD_PART_INFO_MAX_SIZE, sizeof(char)); if (!mtd_part_info) { printf("%s: Fail to malloc!", __func__); diff --git a/u-boot/drivers/mtd/nand/spi/Kconfig b/u-boot/drivers/mtd/nand/spi/Kconfig index e599bb2..b6a4f99 100644 --- a/u-boot/drivers/mtd/nand/spi/Kconfig +++ b/u-boot/drivers/mtd/nand/spi/Kconfig @@ -52,6 +52,12 @@ help Add support for various ESMT SPI Nand flash chips +config SPI_NAND_XINCUN + bool "XINCUN SPI flash support" + default y + help + Add support for various XINCUN SPI Nand flash chips + config SPI_NAND_XTX bool "XTX SPI flash support" default y @@ -112,4 +118,10 @@ bool "SKYHIGH SPI flash support" help Add support for various SKYHIGH SPI Nand flash chips + +config SPI_NAND_GSTO + default y + bool "GSTO SPI flash support" + help + Add support for various GSTO SPI Nand flash chips endif diff --git a/u-boot/drivers/mtd/nand/spi/Makefile b/u-boot/drivers/mtd/nand/spi/Makefile index eaa587d..d60139d 100644 --- a/u-boot/drivers/mtd/nand/spi/Makefile +++ b/u-boot/drivers/mtd/nand/spi/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_SPI_NAND_WINBOND) += winbond.o obj-$(CONFIG_SPI_NAND_DOSILICON) += dosilicon.o obj-$(CONFIG_SPI_NAND_ESMT) += esmt.o +obj-$(CONFIG_SPI_NAND_XINCUN) += xincun.o obj-$(CONFIG_SPI_NAND_XTX) += xtx.o obj-$(CONFIG_SPI_NAND_HYF) += hyf.o obj-$(CONFIG_SPI_NAND_FMSH) += fmsh.o @@ -18,4 +19,5 @@ obj-$(CONFIG_SPI_NAND_SILICONGO) += silicongo.o obj-$(CONFIG_SPI_NAND_UNIM) += unim.o obj-$(CONFIG_SPI_NAND_SKYHIGH) += skyhigh.o +obj-$(CONFIG_SPI_NAND_GSTO) += gsto.o obj-$(CONFIG_MTD_SPI_NAND) += spinand.o diff --git a/u-boot/drivers/mtd/nand/spi/core.c b/u-boot/drivers/mtd/nand/spi/core.c index f83698f..4dae186 100644 --- a/u-boot/drivers/mtd/nand/spi/core.c +++ b/u-boot/drivers/mtd/nand/spi/core.c @@ -510,7 +510,7 @@ const struct nand_page_io_req *req, bool ecc_enabled) { - u8 status; + u8 status = 0; int ret; ret = spinand_load_page_op(spinand, req); @@ -518,6 +518,12 @@ return ret; ret = spinand_wait(spinand, &status); + /* + * When there is data outside of OIP in the status, the status data is + * inaccurate and needs to be reconfirmed + */ + if (spinand->id.data[0] == 0x01 && status && !ret) + ret = spinand_wait(spinand, &status); if (ret < 0) return ret; @@ -837,6 +843,9 @@ #ifdef CONFIG_SPI_NAND_ESMT &esmt_spinand_manufacturer, #endif +#ifdef CONFIG_SPI_NAND_XINCUN + &xincun_spinand_manufacturer, +#endif #ifdef CONFIG_SPI_NAND_XTX &xtx_spinand_manufacturer, #endif @@ -867,6 +876,9 @@ #ifdef CONFIG_SPI_NAND_SKYHIGH &skyhigh_spinand_manufacturer, #endif +#ifdef CONFIG_SPI_NAND_GSTO + &gsto_spinand_manufacturer, +#endif }; static int spinand_manufacturer_match(struct spinand_device *spinand, diff --git a/u-boot/drivers/mtd/nand/spi/dosilicon.c b/u-boot/drivers/mtd/nand/spi/dosilicon.c index fc87add..8a82134 100644 --- a/u-boot/drivers/mtd/nand/spi/dosilicon.c +++ b/u-boot/drivers/mtd/nand/spi/dosilicon.c @@ -14,7 +14,7 @@ #define SPINAND_MFR_DOSILICON 0xE5 -#define DOSICON_STATUS_ECC_MASK GENMASK(7, 4) +#define DOSICON_STATUS_ECC_MASK GENMASK(6, 4) #define DOSICON_STATUS_ECC_NO_BITFLIPS (0 << 4) #define DOSICON_STATUS_ECC_1TO3_BITFLIPS (1 << 4) #define DOSICON_STATUS_ECC_4TO6_BITFLIPS (3 << 4) @@ -198,6 +198,26 @@ SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&ds35xxgb_ooblayout, ds35xxgb_ecc_get_status)), + SPINAND_INFO("DS35Q12B", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xF5), + NAND_MEMORG(1, 2048, 128, 64, 512, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&ds35xxgb_ooblayout, + ds35xxgb_ecc_get_status)), + SPINAND_INFO("DS35M12B", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA5), + NAND_MEMORG(1, 2048, 128, 64, 512, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&ds35xxgb_ooblayout, + ds35xxgb_ecc_get_status)), }; static const struct spinand_manufacturer_ops dosilicon_spinand_manuf_ops = { diff --git a/u-boot/drivers/mtd/nand/spi/fmsh.c b/u-boot/drivers/mtd/nand/spi/fmsh.c index c65ff64..340edf0 100644 --- a/u-boot/drivers/mtd/nand/spi/fmsh.c +++ b/u-boot/drivers/mtd/nand/spi/fmsh.c @@ -82,6 +82,31 @@ .rfree = fm25s01_ooblayout_free, }; +/* + * ecc bits: 0xC0[4,6] + * [0b000], No bit errors were detected; + * [0b001] and [0b011], 1~6 Bit errors were detected and corrected. Not + * reach Flipping Bits; + * [0b101], Bit error count equals the bit flip + * detection threshold + * [0b010], Multiple bit errors were detected and + * not corrected. + * others, Reserved. + */ +static int fm25s01bi3_ecc_ecc_get_status(struct spinand_device *spinand, + u8 status) +{ + struct nand_device *nand = spinand_to_nand(spinand); + u8 eccsr = (status & GENMASK(6, 4)) >> 4; + + if (eccsr <= 1 || eccsr == 3) + return eccsr; + else if (eccsr == 5) + return nand->eccreq.strength; + else + return -EBADMSG; +} + static const struct spinand_info fmsh_spinand_table[] = { SPINAND_INFO("FM25S01A", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xE4), @@ -99,11 +124,11 @@ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, &write_cache_variants, &update_cache_variants), - 1, + SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&fm25s01a_ooblayout, NULL)), SPINAND_INFO("FM25S01", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA1), - NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), + NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), NAND_ECCREQ(1, 512), SPINAND_INFO_OP_VARIANTS(&read_cache_variants, &write_cache_variants, @@ -112,13 +137,22 @@ SPINAND_ECCINFO(&fm25s01_ooblayout, NULL)), SPINAND_INFO("FM25LS01", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA5), - NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), + NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), NAND_ECCREQ(1, 512), SPINAND_INFO_OP_VARIANTS(&read_cache_variants, &write_cache_variants, &update_cache_variants), 0, SPINAND_ECCINFO(&fm25s01_ooblayout, NULL)), + SPINAND_INFO("FM25S01BI3", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xD4), + NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&fm25s01_ooblayout, fm25s01bi3_ecc_ecc_get_status)), }; static const struct spinand_manufacturer_ops fmsh_spinand_manuf_ops = { diff --git a/u-boot/drivers/mtd/nand/spi/foresee.c b/u-boot/drivers/mtd/nand/spi/foresee.c index a67931f..5b3286e 100644 --- a/u-boot/drivers/mtd/nand/spi/foresee.c +++ b/u-boot/drivers/mtd/nand/spi/foresee.c @@ -28,7 +28,7 @@ static SPINAND_OP_VARIANTS(update_cache_variants, SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), - SPINAND_PROG_LOAD(false, 0, NULL, 0)); + SPINAND_PROG_LOAD(true, 0, NULL, 0)); static int fsxxndxxg_ooblayout_ecc(struct mtd_info *mtd, int section, struct mtd_oob_region *region) @@ -117,6 +117,24 @@ &update_cache_variants), SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&fsxxndxxg_ooblayout, NULL)), + SPINAND_INFO("F35UQA002G-WWT", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x62), + NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1), + NAND_ECCREQ(1, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&fsxxndxxg_ooblayout, NULL)), + SPINAND_INFO("F35UQA001G-WWT", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x61), + NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), + NAND_ECCREQ(1, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&fsxxndxxg_ooblayout, NULL)), }; static const struct spinand_manufacturer_ops foresee_spinand_manuf_ops = { diff --git a/u-boot/drivers/mtd/nand/spi/gigadevice.c b/u-boot/drivers/mtd/nand/spi/gigadevice.c index 704ad55..ba67f1d 100644 --- a/u-boot/drivers/mtd/nand/spi/gigadevice.c +++ b/u-boot/drivers/mtd/nand/spi/gigadevice.c @@ -43,6 +43,22 @@ SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0), SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0)); +static SPINAND_OP_VARIANTS(read_cache_variants_1gq5, + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + +static SPINAND_OP_VARIANTS(read_cache_variants_2gq5, + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 2, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + static SPINAND_OP_VARIANTS(write_cache_variants, SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), SPINAND_PROG_LOAD(true, 0, NULL, 0)); @@ -353,6 +369,36 @@ SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GQ4RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc1), + NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GQ4UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd2), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GQ4RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc2), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), SPINAND_INFO("GD5F1GQ4UFxxG", SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb1, 0x48), NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), @@ -373,36 +419,116 @@ SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, gd5fxgq5xexxg_ecc_get_status)), - SPINAND_INFO("GD5F2GQ5UExxG", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x52), - NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), + SPINAND_INFO("GD5F1GQ5RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x41), + NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), NAND_ECCREQ(4, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, &write_cache_variants, &update_cache_variants), SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, gd5fxgq5xexxg_ecc_get_status)), - SPINAND_INFO("GD5F2GQ4UBxxG", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd2), + SPINAND_INFO("GD5F2GQ5UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x52), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GQ5RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x42), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GQ6UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x55), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 2, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GQ6RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x45), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 2, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq5xexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GM7UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91), + NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F1GM7RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81), + NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GM7UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92), NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), NAND_ECCREQ(8, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, &write_cache_variants, &update_cache_variants), SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, - gd5fxgq4xa_ecc_get_status)), - SPINAND_INFO("GD5F4GQ6UExxG", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x55), + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F2GM7RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x82), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GM8UExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x95), NAND_MEMORG(1, 2048, 128, 64, 4096, 1, 1, 1), - NAND_ECCREQ(4, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, &write_cache_variants, &update_cache_variants), SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, - gd5fxgq5xexxg_ecc_get_status)), + gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GM8RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x85), + NAND_MEMORG(1, 2048, 128, 64, 4096, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, + gd5fxgq4uexxg_ecc_get_status)), SPINAND_INFO("GD5F1GQ4UExxH", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd9), NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), @@ -412,56 +538,6 @@ &update_cache_variants), SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgqx_variant3_ooblayout, - gd5fxgq4xa_ecc_get_status)), - SPINAND_INFO("GD5F1GQ5RExxG", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x41), - NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), - NAND_ECCREQ(4, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, - &write_cache_variants, - &update_cache_variants), - SPINAND_HAS_QE_BIT, - SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, - gd5fxgq5xexxg_ecc_get_status)), - SPINAND_INFO("GD5F2GQ5RExxG", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x42), - NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), - NAND_ECCREQ(4, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, - &write_cache_variants, - &update_cache_variants), - SPINAND_HAS_QE_BIT, - SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, - gd5fxgq5xexxg_ecc_get_status)), - SPINAND_INFO("GD5F2GM7RxG", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x82), - NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), - NAND_ECCREQ(8, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, - &write_cache_variants, - &update_cache_variants), - SPINAND_HAS_QE_BIT, - SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, - gd5fxgq4xa_ecc_get_status)), - SPINAND_INFO("GD5F1GM7UxG", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x91), - NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), - NAND_ECCREQ(8, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, - &write_cache_variants, - &update_cache_variants), - SPINAND_HAS_QE_BIT, - SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, - gd5fxgq4xa_ecc_get_status)), - SPINAND_INFO("GD5F2GM7UxG", - SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x92), - NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), - NAND_ECCREQ(8, 512), - SPINAND_INFO_OP_VARIANTS(&read_cache_variants, - &write_cache_variants, - &update_cache_variants), - SPINAND_HAS_QE_BIT, - SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, gd5fxgq4xa_ecc_get_status)), }; diff --git a/u-boot/drivers/mtd/nand/spi/gsto.c b/u-boot/drivers/mtd/nand/spi/gsto.c new file mode 100644 index 0000000..a197c6c --- /dev/null +++ b/u-boot/drivers/mtd/nand/spi/gsto.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2023 Rockchip Electronics Co., Ltd + * + * Authors: + * Dingqiang Lin <jon.lin@rock-chips.com> + */ + +#ifndef __UBOOT__ +#include <linux/device.h> +#include <linux/kernel.h> +#endif +#include <linux/mtd/spinand.h> + +#define SPINAND_MFR_GSTO 0x52 + +static SPINAND_OP_VARIANTS(read_cache_variants, + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + +static SPINAND_OP_VARIANTS(write_cache_variants, + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), + SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, + SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), + SPINAND_PROG_LOAD(false, 0, NULL, 0)); + +static int gss0xgsak1_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + region->offset = 32; + region->length = 32; + + return 0; +} + +static int gss0xgsak1_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + region->offset = 2; + region->length = 30; + + return 0; +} + +static const struct mtd_ooblayout_ops gss0xgsak1_ooblayout = { + .ecc = gss0xgsak1_ooblayout_ecc, + .rfree = gss0xgsak1_ooblayout_free, +}; + +static const struct spinand_info gsto_spinand_table[] = { + SPINAND_INFO("GSS01GSAK1", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xBA, 0x13), + NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&gss0xgsak1_ooblayout, NULL)), + SPINAND_INFO("GSS02GSAK1", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xBA, 0x23), + NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + 0, + SPINAND_ECCINFO(&gss0xgsak1_ooblayout, NULL)), +}; + +static const struct spinand_manufacturer_ops gsto_spinand_manuf_ops = { +}; + +const struct spinand_manufacturer gsto_spinand_manufacturer = { + .id = SPINAND_MFR_GSTO, + .name = "GSTO", + .chips = gsto_spinand_table, + .nchips = ARRAY_SIZE(gsto_spinand_table), + .ops = &gsto_spinand_manuf_ops, +}; diff --git a/u-boot/drivers/mtd/nand/spi/hyf.c b/u-boot/drivers/mtd/nand/spi/hyf.c index 1c95298..3a60296 100644 --- a/u-boot/drivers/mtd/nand/spi/hyf.c +++ b/u-boot/drivers/mtd/nand/spi/hyf.c @@ -106,7 +106,7 @@ if (section > 3) return -ERANGE; - region->offset = 16 * section; + region->offset = 32 * section; region->length = 8; return 0; @@ -199,6 +199,26 @@ SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&hyf2gq4uaacae_ooblayout, hyf1gq4udacae_ecc_get_status)), + SPINAND_INFO("HYF2GQ4IAACAE", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x82), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), + NAND_ECCREQ(14, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&hyf2gq4uaacae_ooblayout, + hyf1gq4udacae_ecc_get_status)), + SPINAND_INFO("HYF1GQ4IDACAE", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x81), + NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&hyf1gq4udacae_ooblayout, + hyf1gq4udacae_ecc_get_status)), }; static const struct spinand_manufacturer_ops hyf_spinand_manuf_ops = { diff --git a/u-boot/drivers/mtd/nand/spi/jsc.c b/u-boot/drivers/mtd/nand/spi/jsc.c index d0e3b24..d3f7e56 100644 --- a/u-boot/drivers/mtd/nand/spi/jsc.c +++ b/u-boot/drivers/mtd/nand/spi/jsc.c @@ -72,12 +72,13 @@ static int js28u1gqscahg_ecc_get_status(struct spinand_device *spinand, u8 status) { - u8 eccsr = (status & GENMASK(6, 4)) >> 2; + struct nand_device *nand = spinand_to_nand(spinand); + u8 eccsr = (status & GENMASK(6, 4)) >> 4; - if (eccsr <= 7) + if (eccsr < 4) return eccsr; - else if (eccsr == 12) - return 8; + else if (eccsr == 4) + return nand->eccreq.strength; else return -EBADMSG; } diff --git a/u-boot/drivers/mtd/nand/spi/skyhigh.c b/u-boot/drivers/mtd/nand/spi/skyhigh.c index 252382e..7cf58c6 100644 --- a/u-boot/drivers/mtd/nand/spi/skyhigh.c +++ b/u-boot/drivers/mtd/nand/spi/skyhigh.c @@ -14,6 +14,10 @@ #define SPINAND_MFR_SKYHIGH 0x01 +#define SKYHIGH_STATUS_ECC_1_2_BITFLIPS (1 << 4) +#define SKYHIGH_STATUS_ECC_3_4_BITFLIPS (2 << 4) +#define SKYHIGH_STATUS_ECC_UNCOR_ERROR (3 << 4) + static SPINAND_OP_VARIANTS(read_cache_variants, SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), @@ -27,8 +31,8 @@ SPINAND_PROG_LOAD(true, 0, NULL, 0)); static SPINAND_OP_VARIANTS(update_cache_variants, - SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), - SPINAND_PROG_LOAD(false, 0, NULL, 0)); + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), + SPINAND_PROG_LOAD(true, 0, NULL, 0)); static int s35ml04g3_ooblayout_ecc(struct mtd_info *mtd, int section, struct mtd_oob_region *region) @@ -53,7 +57,48 @@ .rfree = s35ml04g3_ooblayout_free, }; + +static int s35ml0xg3_ecc_get_status(struct spinand_device *spinand, + u8 status) +{ + struct nand_device *nand = spinand_to_nand(spinand); + + switch (status & STATUS_ECC_MASK) { + case STATUS_ECC_NO_BITFLIPS: + return 0; + + case SKYHIGH_STATUS_ECC_UNCOR_ERROR: + return -EBADMSG; + + case SKYHIGH_STATUS_ECC_1_2_BITFLIPS: + return 2; + + default: + return nand->eccreq.strength; + } + + return -EINVAL; +} + static const struct spinand_info skyhigh_spinand_table[] = { + SPINAND_INFO("S35ML01G3", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x15), + NAND_MEMORG(1, 2048, 128, 64, 1024, 2, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&s35ml04g3_ooblayout, s35ml0xg3_ecc_get_status)), + SPINAND_INFO("S35ML02G3", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x25), + NAND_MEMORG(1, 2048, 128, 64, 2048, 2, 1, 1), + NAND_ECCREQ(4, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&s35ml04g3_ooblayout, s35ml0xg3_ecc_get_status)), SPINAND_INFO("S35ML04G3", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35), NAND_MEMORG(1, 2048, 128, 64, 4096, 2, 1, 1), @@ -62,7 +107,7 @@ &write_cache_variants, &update_cache_variants), SPINAND_HAS_QE_BIT, - SPINAND_ECCINFO(&s35ml04g3_ooblayout, NULL)), + SPINAND_ECCINFO(&s35ml04g3_ooblayout, s35ml0xg3_ecc_get_status)), }; static const struct spinand_manufacturer_ops skyhigh_spinand_manuf_ops = { diff --git a/u-boot/drivers/mtd/nand/spi/unim.c b/u-boot/drivers/mtd/nand/spi/unim.c index 8dd0b9b..b4e3e5b 100644 --- a/u-boot/drivers/mtd/nand/spi/unim.c +++ b/u-boot/drivers/mtd/nand/spi/unim.c @@ -71,12 +71,13 @@ static int tx25g01_ecc_get_status(struct spinand_device *spinand, u8 status) { - u8 eccsr = (status & GENMASK(6, 4)) >> 2; + struct nand_device *nand = spinand_to_nand(spinand); + u8 eccsr = (status & GENMASK(6, 4)) >> 4; - if (eccsr <= 7) + if (eccsr < 4) return eccsr; - else if (eccsr == 12) - return 8; + else if (eccsr == 4) + return nand->eccreq.strength; else return -EBADMSG; } diff --git a/u-boot/drivers/mtd/nand/spi/xincun.c b/u-boot/drivers/mtd/nand/spi/xincun.c new file mode 100644 index 0000000..dc6334d --- /dev/null +++ b/u-boot/drivers/mtd/nand/spi/xincun.c @@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 Rockchip Electronics Co., Ltd + * + * Authors: + * Dingqiang Lin <jon.lin@rock-chips.com> + */ + +#ifndef __UBOOT__ +#include <linux/device.h> +#include <linux/kernel.h> +#endif +#include <linux/mtd/spinand.h> + +#define SPINAND_MFR_XINCUN 0x8C +#define XINCUN_STATUS_ECC_HAS_BITFLIPS_T (3 << 4) + +static SPINAND_OP_VARIANTS(read_cache_variants, + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); + +static SPINAND_OP_VARIANTS(write_cache_variants, + SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), + SPINAND_PROG_LOAD(true, 0, NULL, 0)); + +static SPINAND_OP_VARIANTS(update_cache_variants, + SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), + SPINAND_PROG_LOAD(false, 0, NULL, 0)); + +static int xcsp2aapk_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + region->offset = mtd->oobsize / 2; + region->length = mtd->oobsize / 2; + + return 0; +} + +static int xcsp2aapk_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + /* Reserve 2 bytes for the BBM. */ + region->offset = 2; + region->length = mtd->oobsize / 2 - 2; + + return 0; +} + +static const struct mtd_ooblayout_ops xcsp2aapk_ooblayout = { + .ecc = xcsp2aapk_ooblayout_ecc, + .rfree = xcsp2aapk_ooblayout_free, +}; + +static int xcsp2aapk_ecc_get_status(struct spinand_device *spinand, + u8 status) +{ + struct nand_device *nand = spinand_to_nand(spinand); + + switch (status & STATUS_ECC_MASK) { + case STATUS_ECC_NO_BITFLIPS: + return 0; + + case STATUS_ECC_UNCOR_ERROR: + return -EBADMSG; + + case STATUS_ECC_HAS_BITFLIPS: + return 0; + case XINCUN_STATUS_ECC_HAS_BITFLIPS_T: + return nand->eccreq.strength; + default: + break; + } + + return -EINVAL; +} + +static const struct spinand_info xincun_spinand_table[] = { + SPINAND_INFO("XCSP2AAPK", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xA1), + NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&xcsp2aapk_ooblayout, xcsp2aapk_ecc_get_status)), +}; + +static const struct spinand_manufacturer_ops xincun_spinand_manuf_ops = { +}; + +const struct spinand_manufacturer xincun_spinand_manufacturer = { + .id = SPINAND_MFR_XINCUN, + .name = "XINCUN", + .chips = xincun_spinand_table, + .nchips = ARRAY_SIZE(xincun_spinand_table), + .ops = &xincun_spinand_manuf_ops, +}; diff --git a/u-boot/drivers/mtd/spi/sf_internal.h b/u-boot/drivers/mtd/spi/sf_internal.h index 19b5c7d..7de3035 100644 --- a/u-boot/drivers/mtd/spi/sf_internal.h +++ b/u-boot/drivers/mtd/spi/sf_internal.h @@ -68,6 +68,7 @@ #define USE_CLSR BIT(14) /* use CLSR command */ #define SPI_NOR_HAS_SST26LOCK BIT(15) /* Flash supports lock/unlock via BPR */ #define SPI_NOR_OCTAL_READ BIT(16) /* Flash supports Octal Read */ +#define SPI_NOR_OCTAL_DTR_READ BIT(17) /* Flash supports Octal DTR Read */ }; extern const struct flash_info spi_nor_ids[]; diff --git a/u-boot/drivers/mtd/spi/spi-nor-ids.c b/u-boot/drivers/mtd/spi/spi-nor-ids.c index 8d1784c..8be74f3 100644 --- a/u-boot/drivers/mtd/spi/spi-nor-ids.c +++ b/u-boot/drivers/mtd/spi/spi-nor-ids.c @@ -85,6 +85,9 @@ { INFO("en25qh64", 0x1c7017, 0, 64 * 1024, 128, SECT_4K) }, { INFO("en25qh128", 0x1c7018, 0, 64 * 1024, 256, SECT_4K) }, { INFO("en25s64", 0x1c3817, 0, 64 * 1024, 128, SECT_4K) }, + { INFO("en25qh256a", 0x1c7019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, + { INFO("en25qx256a", 0x1c7119, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, + { INFO("en25qx128a", 0x1c7118, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, #endif #ifdef CONFIG_SPI_FLASH_GIGADEVICE /* GIGADEVICE */ /* GigaDevice */ @@ -118,28 +121,18 @@ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) }, - { - INFO("gd25lq128", 0xc86018, 0, 64 * 1024, 256, - SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | - SPI_NOR_HAS_TB) - }, - { INFO("gd25q256", 0xc84019, 0, 64 * 1024, 512, - SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | - SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK | - SPI_NOR_HAS_TB) - }, { INFO("gd25q512", 0xc84020, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) }, { - INFO("gd25lq255", 0xc86019, 0, 64 * 1024, 512, + INFO("gd25lb512m", 0xc8671a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK) }, { - INFO("gd25lb512m", 0xc8671a, 0, 64 * 1024, 1024, + INFO("gd55lb01ge", 0xc8671b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK) }, @@ -148,17 +141,112 @@ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK) }, + { + INFO("gd55b01ge", 0xc8471b, 0, 64 * 1024, 2048, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_4B_OPCODES | SPI_NOR_HAS_LOCK) + }, + /* adding these 3V QSPI flash parts */ + {INFO("gd25b256", 0xc84019, 0, 64 * 1024, 512, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES) }, + {INFO("gd25b512", 0xc8471A, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55b01g", 0xc8471B, 0, 64 * 1024, 2048, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55b02g", 0xc8471C, 0, 64 * 1024, 4096, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd25f64", 0xc84317, 0, 64 * 1024, 128, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)}, + {INFO("gd25f128", 0xc84318, 0, 64 * 1024, 256, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)}, + {INFO("gd25f256", 0xc84319, 0, 64 * 1024, 512, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55f512", 0xc8431A, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd25t512", 0xc8461A, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55t01g", 0xc8461B, 0, 64 * 1024, 2048, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55t02g", 0xc8461C, 0, 64 * 1024, 4096, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + /* adding these 3V OSPI flash parts */ + {INFO("gd25x512", 0xc8481A, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)}, + {INFO("gd55x01g", 0xc8481B, 0, 64 * 1024, 2048, SECT_4K | + SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)}, + {INFO("gd55x02g", 0xc8481C, 0, 64 * 1024, 4096, SECT_4K | + SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)}, + { + INFO("gd25lq128", 0xc86018, 0, 64 * 1024, 256, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) + }, + { + INFO("gd25lq256d", 0xc86019, 0, 64 * 1024, 512, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) + }, + /* adding these 1.8V QSPI flash parts */ + {INFO("gd25lb256", 0xc86719, 0, 64 * 1024, 512, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd25lb512", 0xc8671A, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55lb01g", 0xc8671B, 0, 64 * 1024, 2048, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55lb02g", 0xc8671C, 0, 64 * 1024, 4096, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd25lf80", 0xc86314, 0, 64 * 1024, 16, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)}, + {INFO("gd25lf16", 0xc86315, 0, 64 * 1024, 32, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK)}, + {INFO("gd25lf32", 0xc86316, 0, 64 * 1024, 64, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) }, + {INFO("gd25lf64", 0xc86317, 0, 64 * 1024, 128, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) }, + {INFO("gd25lf128", 0xc86318, 0, 64 * 1024, 256, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK) }, + {INFO("gd25lf255", 0xc86319, 0, 64 * 1024, 512, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd25lf511", 0xc8631A, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd25lt256", 0xc86619, 0, 64 * 1024, 512, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd25lt512", 0xc8661A, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55lt01g", 0xc8661B, 0, 64 * 1024, 2048, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + {INFO("gd55lt02g", 0xc8661C, 0, 64 * 1024, 4096, SECT_4K | + SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_4B_OPCODES)}, + { + INFO("gd25lx256e", 0xc86819, 0, 64 * 1024, 512, + SECT_4K | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) + }, + /* adding these 1.8V OSPI flash parts */ + {INFO("gd25lx512", 0xc8681A, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)}, + {INFO("gd55lx01g", 0xc8681B, 0, 64 * 1024, 2048, SECT_4K | + SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)}, + {INFO("gd55lx02g", 0xc8681C, 0, 64 * 1024, 4096, SECT_4K | + SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES)}, #endif #ifdef CONFIG_SPI_FLASH_ISSI /* ISSI */ /* ISSI */ { INFO("is25lq040b", 0x9d4013, 0, 64 * 1024, 8, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("is25lp008", 0x9d6014, 0, 64 * 1024, 16, SPI_NOR_QUAD_READ) }, + { INFO("is25lp016", 0x9d6015, 0, 64 * 1024, 32, SPI_NOR_QUAD_READ) }, { INFO("is25lp032", 0x9d6016, 0, 64 * 1024, 64, 0) }, { INFO("is25lp064", 0x9d6017, 0, 64 * 1024, 128, 0) }, { INFO("is25lp128", 0x9d6018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ) }, { INFO("is25lp256", 0x9d6019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ) }, + { INFO("is25lp512", 0x9d601a, 0, 64 * 1024, 1024, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("is25lp01g", 0x9d601b, 0, 64 * 1024, 2048, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("is25wp008", 0x9d7014, 0, 64 * 1024, 16, SPI_NOR_QUAD_READ) }, + { INFO("is25wp016", 0x9d7015, 0, 64 * 1024, 32, SPI_NOR_QUAD_READ) }, { INFO("is25wp032", 0x9d7016, 0, 64 * 1024, 64, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("is25wp064", 0x9d7017, 0, 64 * 1024, 128, @@ -168,6 +256,12 @@ { INFO("is25wp256", 0x9d7019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, + { INFO("is25wp512", 0x9d701a, 0, 64 * 1024, 1024, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("is25wp01g", 0x9d701b, 0, 64 * 1024, 2048, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("is25wx256", 0x9d5b19, 0, 128 * 1024, 256, + SECT_4K | USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) }, #endif #ifdef CONFIG_SPI_FLASH_MACRONIX /* MACRONIX */ /* Macronix */ @@ -183,17 +277,41 @@ { INFO("mx25u6435f", 0xc22537, 0, 64 * 1024, 128, SECT_4K) }, { INFO("mx25l12805d", 0xc22018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("mx25u12835f", 0xc22538, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("mx25u51245g", 0xc2253a, 0, 64 * 1024, 1024, SECT_4K | + SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, { INFO("mx25l12855e", 0xc22618, 0, 64 * 1024, 256, 0) }, { INFO("mx25l25635e", 0xc22019, 0, 64 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("mx25u25635f", 0xc22539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25v8035f", 0xc22314, 0, 64 * 1024, 16, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("mx25r1635f", 0xc22815, 0, 64 * 1024, 32, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("mx25l25655e", 0xc22619, 0, 64 * 1024, 512, 0) }, { INFO("mx66l51235l", 0xc2201a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, { INFO("mx66u51235f", 0xc2253a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25u51245f", 0xc2953a, 0, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx66u1g45g", 0xc2253b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, { INFO("mx66u2g45g", 0xc2253c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, { INFO("mx66l1g45g", 0xc2201b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("mx66l2g45g", 0xc2201c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, { INFO("mx25l1633e", 0xc22415, 0, 64 * 1024, 32, SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | SECT_4K) }, { INFO("mx25r6435f", 0xc22817, 0, 64 * 1024, 128, SECT_4K) }, - { INFO("mx66uw2g345g", 0xc2943c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx66uw2g345gx0", 0xc2943c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx66lm1g45g", 0xc2853b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25lm51245g", 0xc2853a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25lw51245g", 0xc2863a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25lm25645g", 0xc28539, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx66uw2g345g", 0xc2843c, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx66um1g45g", 0xc2803b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx66uw1g45g", 0xc2813b, 0, 64 * 1024, 2048, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25uw51245g", 0xc2813a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25uw51345g", 0xc2843a, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25um25645g", 0xc28039, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25uw25645g", 0xc28139, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25um25345g", 0xc28339, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25uw25345g", 0xc28439, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25uw12845g", 0xc28138, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25uw12345g", 0xc28438, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25uw6445g", 0xc28137, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mx25uw6345g", 0xc28437, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_OCTAL_DTR_READ | SPI_NOR_4B_OPCODES) }, #endif #ifdef CONFIG_SPI_FLASH_STMICRO /* STMICRO */ @@ -210,7 +328,7 @@ { INFO6("mt25qu256a", 0x20bb19, 0x104400, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | USE_FSR) }, { INFO("n25q256ax1", 0x20bb19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ | USE_FSR) }, { INFO6("mt25qu512a", 0x20bb20, 0x104400, 64 * 1024, 1024, - SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | USE_FSR) }, { INFO("n25q512a", 0x20bb20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) }, { INFO6("mt25ql512a", 0x20ba20, 0x104400, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, @@ -219,7 +337,12 @@ { INFO("n25q00a", 0x20bb21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, { INFO("mt25ql01g", 0x21ba20, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, { INFO("mt25qu02g", 0x20bb22, 0, 64 * 1024, 4096, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) }, - { INFO("mt35xu512aba", 0x2c5b1a, 0, 128 * 1024, 512, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) }, + { INFO("mt25ql02g", 0x20ba22, 0, 64 * 1024, 4096, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE | SPI_NOR_4B_OPCODES) }, +#ifdef CONFIG_SPI_FLASH_MT35XU + { INFO("mt35xl512aba", 0x2c5a1a, 0, 128 * 1024, 512, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES | SPI_NOR_OCTAL_DTR_READ) }, + { INFO("mt35xu512aba", 0x2c5b1a, 0, 128 * 1024, 512, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES | SPI_NOR_OCTAL_DTR_READ) }, +#endif /* CONFIG_SPI_FLASH_MT35XU */ + { INFO6("mt35xu01g", 0x2c5b1b, 0x104100, 128 * 1024, 1024, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) }, { INFO("mt35xu02g", 0x2c5b1c, 0, 128 * 1024, 2048, USE_FSR | SPI_NOR_OCTAL_READ | SPI_NOR_4B_OPCODES) }, #endif #ifdef CONFIG_SPI_FLASH_SPANSION /* SPANSION */ @@ -235,6 +358,7 @@ { INFO("s25fl512s_256k", 0x010220, 0x4d00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) }, { INFO("s25fl512s_64k", 0x010220, 0x4d01, 64 * 1024, 1024, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) }, { INFO("s25fl512s_512k", 0x010220, 0x4f00, 256 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) }, + { INFO("s70fs01gs_256k", 0x010221, 0x4d00, 256 * 1024, 512, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("s25sl12800", 0x012018, 0x0300, 256 * 1024, 64, 0) }, { INFO("s25sl12801", 0x012018, 0x0301, 64 * 1024, 256, 0) }, { INFO6("s25fl128s", 0x012018, 0x4d0180, 64 * 1024, 256, SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_CLSR) }, @@ -347,6 +471,31 @@ SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) }, + { + INFO("w25q512jv", 0xef7119, 0, 64 * 1024, 512, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) + }, + { + INFO("w25q512nwq", 0xef6020, 0, 64 * 1024, 1024, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) + }, + { + INFO("w25q512nwm", 0xef8020, 0, 64 * 1024, 1024, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) + }, + { + INFO("w25q512jvq", 0xef4020, 0, 64 * 1024, 1024, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) + }, + { + INFO("w25q01jv", 0xef4021, 0, 64 * 1024, 2048, + SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | + SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) + }, { INFO("w25q80", 0xef5014, 0, 64 * 1024, 16, SECT_4K) }, { INFO("w25q80bl", 0xef4014, 0, 64 * 1024, 16, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("w25q16cl", 0xef4015, 0, 64 * 1024, 32, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, @@ -358,6 +507,7 @@ { INFO("w25q256", 0xef4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("w25m512jw", 0xef6119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("w25m512jv", 0xef7119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("w25h02jv", 0xef9022, 0, 64 * 1024, 4096, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, #endif #ifdef CONFIG_SPI_FLASH_XMC /* XMC (Wuhan Xinxin Semiconductor Manufacturing Corp.) */ @@ -376,17 +526,23 @@ /* XTX Technology (Shenzhen) Limited */ { INFO("xt25f64f", 0x0b4017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("xt25f128b", 0x0b4018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("xt25f256b", 0x0b4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, + { INFO("xt25q64d", 0x0b6017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("xt25q128d", 0x0b6018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, #endif #ifdef CONFIG_SPI_FLASH_PUYA /* PUYA Semiconductor (Shanghai) Co., Ltd. */ { INFO("P25Q64H", 0x856017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("P25Q128H", 0x856018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("PY25Q64HA", 0x852017, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("PY25Q128HA", 0x852018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("PY25Q256HB", 0x852019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, #endif #ifdef CONFIG_SPI_FLASH_FMSH /* FUDAN MICRO (Shanghai) Co., Ltd. */ { INFO("FM25Q128A", 0xA14018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { INFO("FM25Q64", 0xA14017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, + { INFO("FM25Q256I3", 0xA14019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) }, #endif #ifdef CONFIG_SPI_FLASH_DOSILICON /* Dosilicon Co., Ltd. */ diff --git a/u-boot/drivers/mtd/ubi/debug.h b/u-boot/drivers/mtd/ubi/debug.h index 215fca7..c4f0bc5 100644 --- a/u-boot/drivers/mtd/ubi/debug.h +++ b/u-boot/drivers/mtd/ubi/debug.h @@ -28,13 +28,8 @@ } \ } while (0) #else -#define ubi_assert(expr) do { \ - if (unlikely(!(expr))) { \ - pr_debug("UBI assert failed in %s at %u\n", \ - __func__, __LINE__); \ - dump_stack(); \ - } \ -} while (0) +#include <log.h> +#define ubi_assert(expr) assert(expr) #endif #define ubi_dbg_print_hex_dump(ps, pt, r, g, b, len, a) \ diff --git a/u-boot/drivers/net/gmac_rockchip.c b/u-boot/drivers/net/gmac_rockchip.c index bc8dcc9..dfb8342 100644 --- a/u-boot/drivers/net/gmac_rockchip.c +++ b/u-boot/drivers/net/gmac_rockchip.c @@ -18,6 +18,9 @@ #include <asm/arch/clock.h> #include <asm/arch/hardware.h> #ifdef CONFIG_DWC_ETH_QOS +#include <asm/arch/grf_rk3528.h> +#include <asm/arch/grf_rk3562.h> +#include <asm/arch/ioc_rk3562.h> #include <asm/arch/grf_rk3568.h> #include <asm/arch/grf_rk3588.h> #include <asm/arch/grf_rv1106.h> @@ -516,6 +519,147 @@ return 0; } #else +static int rk3528_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, + struct rockchip_eth_dev *dev) +{ + struct eqos_priv *priv = &dev->eqos; + struct rk3528_grf *grf; + unsigned int div; + + enum { + RK3528_GMAC0_CLK_RMII_DIV_SHIFT = 3, + RK3528_GMAC0_CLK_RMII_DIV_MASK = GENMASK(4, 3), + RK3528_GMAC0_CLK_RMII_DIV2 = BIT(3), + RK3528_GMAC0_CLK_RMII_DIV20 = 0, + }; + + enum { + RK3528_GMAC1_CLK_RGMII_DIV_SHIFT = 10, + RK3528_GMAC1_CLK_RGMII_DIV_MASK = GENMASK(11, 10), + RK3528_GMAC1_CLK_RGMII_DIV1 = 0, + RK3528_GMAC1_CLK_RGMII_DIV5 = GENMASK(11, 10), + RK3528_GMAC1_CLK_RGMII_DIV50 = BIT(11), + RK3528_GMAC1_CLK_RMII_DIV2 = BIT(11), + RK3528_GMAC1_CLK_RMII_DIV20 = 0, + }; + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + switch (priv->phy->speed) { + case 10: + if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) + div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV20 : + RK3528_GMAC0_CLK_RMII_DIV20; + else + div = RK3528_GMAC1_CLK_RGMII_DIV50; + break; + case 100: + if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) + div = pdata->bus_id ? RK3528_GMAC1_CLK_RMII_DIV2 : + RK3528_GMAC0_CLK_RMII_DIV2; + else + div = RK3528_GMAC1_CLK_RGMII_DIV5; + break; + case 1000: + if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) + div = RK3528_GMAC1_CLK_RGMII_DIV1; + else + return -EINVAL; + break; + default: + debug("Unknown phy speed: %d\n", priv->phy->speed); + return -EINVAL; + } + + if (pdata->bus_id) + rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_RGMII_DIV_MASK, div); + else + rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_DIV_MASK, div); + + return 0; +} + +static int rk3562_set_gmac_speed(struct gmac_rockchip_platdata *pdata, + struct rockchip_eth_dev *dev) +{ + struct eqos_priv *priv = &dev->eqos; + struct rk3562_grf *grf; + unsigned int div; + + enum { + RK3562_GMAC0_CLK_RGMII_DIV_SHIFT = 7, + RK3562_GMAC0_CLK_RGMII_DIV_MASK = GENMASK(8, 7), + RK3562_GMAC0_CLK_RGMII_DIV1 = 0, + RK3562_GMAC0_CLK_RGMII_DIV5 = GENMASK(8, 7), + RK3562_GMAC0_CLK_RGMII_DIV50 = BIT(8), + RK3562_GMAC0_CLK_RMII_DIV2 = BIT(7), + RK3562_GMAC0_CLK_RMII_DIV20 = 0, + }; + + enum { + RK3562_GMAC1_SPEED_SHIFT = 0x0, + RK3562_GMAC1_SPEED_MASK = BIT(0), + RK3562_GMAC1_SPEED_10M = 0, + RK3562_GMAC1_SPEED_100M = BIT(0), + }; + + enum { + RK3562_GMAC1_CLK_RMII_DIV_SHIFT = 13, + RK3562_GMAC1_CLK_RMII_DIV_MASK = BIT(13), + RK3562_GMAC1_CLK_RMII_DIV2 = BIT(13), + RK3562_GMAC1_CLK_RMII_DIV20 = 0, + }; + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + switch (priv->phy->speed) { + case 10: + if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) { + if (pdata->bus_id > 0) { + div = RK3562_GMAC1_CLK_RMII_DIV20; + rk_clrsetreg(&grf->soc_con[0], + RK3562_GMAC1_SPEED_MASK, + RK3562_GMAC1_SPEED_10M); + } else { + div = RK3562_GMAC0_CLK_RMII_DIV20; + } + } else { + div = RK3562_GMAC0_CLK_RGMII_DIV50; + } + break; + case 100: + if (pdata->phy_interface == PHY_INTERFACE_MODE_RMII) { + if (pdata->bus_id > 0) { + div = RK3562_GMAC1_CLK_RMII_DIV2; + rk_clrsetreg(&grf->soc_con[0], + RK3562_GMAC1_SPEED_MASK, + RK3562_GMAC1_SPEED_100M); + } else { + div = RK3562_GMAC0_CLK_RMII_DIV2; + } + } else { + div = RK3562_GMAC0_CLK_RGMII_DIV5; + } + break; + case 1000: + if (pdata->phy_interface != PHY_INTERFACE_MODE_RMII) + div = RK3562_GMAC0_CLK_RGMII_DIV1; + else + return -EINVAL; + break; + default: + debug("Unknown phy speed: %d\n", priv->phy->speed); + return -EINVAL; + } + + if (pdata->bus_id) + rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_RMII_DIV_MASK, div); + else + rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_RGMII_DIV_MASK, div); + + return 0; +} + static int rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata, struct rockchip_eth_dev *dev) { @@ -1064,6 +1208,251 @@ } #else +static void rk3528_gmac_integrated_phy_powerup(struct gmac_rockchip_platdata *pdata) +{ + struct rk3528_grf *grf; + unsigned char bgs[1] = {0}; + + enum { + RK3528_MACPHY_ENABLE_MASK = BIT(1), + RK3528_MACPHY_DISENABLE = BIT(1), + RK3528_MACPHY_ENABLE = 0, + RK3528_MACPHY_XMII_SEL_MASK = GENMASK(6, 5), + RK3528_MACPHY_XMII_SEL = BIT(6), + RK3528_MACPHY_24M_CLK_SEL_MASK = GENMASK(9, 7), + RK3528_MACPHY_24M_CLK_SEL_24M = (BIT(8) | BIT(9)), + RK3528_MACPHY_PHY_ID_MASK = GENMASK(14, 10), + RK3528_MACPHY_PHY_ID = BIT(11), + }; + + enum { + RK3528_MACPHY_BGS_MASK = GENMASK(3, 0), + }; + +#if defined(CONFIG_ROCKCHIP_EFUSE) || defined(CONFIG_ROCKCHIP_OTP) + struct udevice *dev; + u32 regs[2] = {0}; + ofnode node; + int ret = 0; + + /* retrieve the device */ + if (IS_ENABLED(CONFIG_ROCKCHIP_EFUSE)) + ret = uclass_get_device_by_driver(UCLASS_MISC, + DM_GET_DRIVER(rockchip_efuse), + &dev); + else + ret = uclass_get_device_by_driver(UCLASS_MISC, + DM_GET_DRIVER(rockchip_otp), + &dev); + if (!ret) { + node = dev_read_subnode(dev, "macphy-bgs"); + if (ofnode_valid(node)) { + if (!ofnode_read_u32_array(node, "reg", regs, 2)) { + /* read the bgs from the efuses */ + ret = misc_read(dev, regs[0], &bgs, 1); + if (ret) { + printf("read bgs from efuse/otp failed, ret=%d\n", + ret); + bgs[0] = 0; + } + } + } + } +#endif + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + reset_assert(&pdata->phy_reset); + udelay(20); + rk_clrsetreg(&grf->macphy_con0, + RK3528_MACPHY_ENABLE_MASK | + RK3528_MACPHY_XMII_SEL_MASK | + RK3528_MACPHY_24M_CLK_SEL_MASK | + RK3528_MACPHY_PHY_ID_MASK, + RK3528_MACPHY_ENABLE | + RK3528_MACPHY_XMII_SEL | + RK3528_MACPHY_24M_CLK_SEL_24M | + RK3528_MACPHY_PHY_ID); + + rk_clrsetreg(&grf->macphy_con1, + RK3528_MACPHY_BGS_MASK, + bgs[0]); + udelay(20); + reset_deassert(&pdata->phy_reset); + udelay(30 * 1000); +} + +static void rk3528_set_to_rmii(struct gmac_rockchip_platdata *pdata) +{ + unsigned int clk_mode; + struct rk3528_grf *grf; + + enum { + RK3528_GMAC0_CLK_RMII_MODE_SHIFT = 0x1, + RK3528_GMAC0_CLK_RMII_MODE_MASK = BIT(1), + RK3528_GMAC0_CLK_RMII_MODE = 0x1, + }; + + enum { + RK3528_GMAC1_CLK_RMII_MODE_SHIFT = 0x8, + RK3528_GMAC1_CLK_RMII_MODE_MASK = BIT(8), + RK3528_GMAC1_CLK_RMII_MODE = 0x1, + }; + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + if (pdata->bus_id == 1) { + clk_mode = RK3528_GMAC1_CLK_RMII_MODE << RK3528_GMAC1_CLK_RMII_MODE_SHIFT; + rk_clrsetreg(&grf->gmac1_con1, RK3528_GMAC1_CLK_RMII_MODE_MASK, clk_mode); + } else { + clk_mode = RK3528_GMAC0_CLK_RMII_MODE << RK3528_GMAC0_CLK_RMII_MODE_SHIFT; + rk_clrsetreg(&grf->gmac0_con, RK3528_GMAC0_CLK_RMII_MODE_MASK, clk_mode); + } +} + +static void rk3528_set_to_rgmii(struct gmac_rockchip_platdata *pdata) +{ + unsigned int rx_enable; + unsigned int rx_delay; + struct rk3528_grf *grf; + + enum { + RK3528_GMAC1_RGMII_MODE_SHIFT = 0x8, + RK3528_GMAC1_RGMII_MODE_MASK = BIT(8), + RK3528_GMAC1_RGMII_MODE = 0x0, + + RK3528_GMAC1_TXCLK_DLY_ENA_MASK = BIT(14), + RK3528_GMAC1_TXCLK_DLY_ENA_DISABLE = 0, + RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE = BIT(14), + + RK3528_GMAC1_RXCLK_DLY_ENA_MASK = BIT(15), + RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE = 0, + RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE = BIT(15), + }; + + enum { + RK3528_GMAC1_RX_DL_CFG_SHIFT = 0x8, + RK3528_GMAC1_RX_DL_CFG_MASK = GENMASK(15, 8), + + RK3528_GMAC1_TX_DL_CFG_SHIFT = 0x0, + RK3528_GMAC1_TX_DL_CFG_MASK = GENMASK(7, 0), + }; + + if (!pdata->bus_id) + return; + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + if (pdata->rx_delay < 0) { + rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_DISABLE; + rx_delay = 0; + } else { + rx_enable = RK3528_GMAC1_RXCLK_DLY_ENA_ENABLE; + rx_delay = pdata->rx_delay << RK3528_GMAC1_RX_DL_CFG_SHIFT; + } + + rk_clrsetreg(&grf->gmac1_con0, + RK3528_GMAC1_TXCLK_DLY_ENA_MASK | + RK3528_GMAC1_RXCLK_DLY_ENA_MASK | + RK3528_GMAC1_RGMII_MODE_MASK, + rx_enable | RK3528_GMAC1_TXCLK_DLY_ENA_ENABLE | + (RK3528_GMAC1_RGMII_MODE << RK3528_GMAC1_RGMII_MODE_SHIFT)); + + rk_clrsetreg(&grf->gmac1_con1, + RK3528_GMAC1_RX_DL_CFG_MASK | + RK3528_GMAC1_TX_DL_CFG_MASK, + (pdata->tx_delay << RK3528_GMAC1_TX_DL_CFG_SHIFT) | + rx_delay); +} + +static void rk3562_set_to_rmii(struct gmac_rockchip_platdata *pdata) +{ + struct rk3562_grf *grf; + unsigned int mode; + + enum { + RK3562_GMAC0_RMII_MODE_SHIFT = 0x5, + RK3562_GMAC0_RMII_MODE_MASK = BIT(5), + RK3562_GMAC0_RMII_MODE = 0x1, + }; + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + if (!pdata->bus_id) { + mode = RK3562_GMAC0_RMII_MODE << RK3562_GMAC0_RMII_MODE_SHIFT; + rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RMII_MODE_MASK, mode); + } +} + +static void rk3562_set_to_rgmii(struct gmac_rockchip_platdata *pdata) +{ + struct rk3562_grf *grf; + struct rk3562_ioc *ioc; + unsigned int rx_enable; + unsigned int rx_delay; + + enum { + RK3562_GMAC0_RGMII_MODE_SHIFT = 0x5, + RK3562_GMAC0_RGMII_MODE_MASK = BIT(5), + RK3562_GMAC0_RGMII_MODE = 0x0, + + RK3562_GMAC0_TXCLK_DLY_ENA_MASK = BIT(0), + RK3562_GMAC0_TXCLK_DLY_ENA_DISABLE = 0, + RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE = BIT(0), + + RK3562_GMAC0_RXCLK_DLY_ENA_MASK = BIT(1), + RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE = 0, + RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE = BIT(1), + }; + + enum { + RK3562_GMAC0_RX_DL_CFG_SHIFT = 0x8, + RK3562_GMAC0_RX_DL_CFG_MASK = GENMASK(15, 8), + + RK3562_GMAC0_TX_DL_CFG_SHIFT = 0x0, + RK3562_GMAC0_TX_DL_CFG_MASK = GENMASK(7, 0), + }; + + if (pdata->bus_id) + return; + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC); + + rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_RGMII_MODE_MASK, + RK3562_GMAC0_RGMII_MODE << RK3562_GMAC0_RGMII_MODE_SHIFT); + + if (pdata->rx_delay < 0) { + rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_DISABLE; + rx_delay = 0; + } else { + rx_enable = RK3562_GMAC0_RXCLK_DLY_ENA_ENABLE; + rx_delay = pdata->rx_delay << RK3562_GMAC0_RX_DL_CFG_SHIFT; + } + + rk_clrsetreg(&ioc->mac0_io_con1, + RK3562_GMAC0_TXCLK_DLY_ENA_MASK | + RK3562_GMAC0_RXCLK_DLY_ENA_MASK, + rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE); + + rk_clrsetreg(&ioc->mac0_io_con0, + RK3562_GMAC0_RX_DL_CFG_MASK | + RK3562_GMAC0_TX_DL_CFG_MASK, + (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) | + rx_delay); + + rk_clrsetreg(&ioc->mac1_io_con1, + RK3562_GMAC0_TXCLK_DLY_ENA_MASK | + RK3562_GMAC0_RXCLK_DLY_ENA_MASK, + rx_enable | RK3562_GMAC0_TXCLK_DLY_ENA_ENABLE); + + rk_clrsetreg(&ioc->mac1_io_con0, + RK3562_GMAC0_RX_DL_CFG_MASK | + RK3562_GMAC0_TX_DL_CFG_MASK, + (pdata->tx_delay << RK3562_GMAC0_TX_DL_CFG_SHIFT) | + rx_delay); +} + static void rk3568_set_to_rmii(struct gmac_rockchip_platdata *pdata) { struct rk3568_grf *grf; @@ -1438,6 +1827,86 @@ #endif #ifdef CONFIG_DWC_ETH_QOS +static void rk3528_set_clock_selection(struct gmac_rockchip_platdata *pdata) +{ + struct rk3528_grf *grf; + unsigned int val; + + enum { + RK3528_GMAC1_CLK_SELET_SHIFT = 0x12, + RK3528_GMAC1_CLK_SELET_MASK = BIT(12), + RK3528_GMAC1_CLK_SELET_CRU = 0, + RK3528_GMAC1_CLK_SELET_IO = BIT(12), + }; + + if (!pdata->bus_id) + return; + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + val = pdata->clock_input ? RK3528_GMAC1_CLK_SELET_IO : + RK3528_GMAC1_CLK_SELET_CRU; + rk_clrsetreg(&grf->gmac1_con0, RK3528_GMAC1_CLK_SELET_MASK, val); +} + +static void rk3562_set_clock_selection(struct gmac_rockchip_platdata *pdata) +{ + struct rk3562_grf *grf; + struct rk3562_ioc *ioc; + unsigned int val; + + enum { + RK3562_GMAC0_CLK_SELET_SHIFT = 0x9, + RK3562_GMAC0_CLK_SELET_MASK = BIT(9), + RK3562_GMAC0_CLK_SELET_CRU = 0, + RK3562_GMAC0_CLK_SELET_IO = BIT(9), + }; + + enum { + RK3562_GMAC1_CLK_SELET_SHIFT = 15, + RK3562_GMAC1_CLK_SELET_MASK = BIT(15), + RK3562_GMAC1_CLK_SELET_CRU = 0, + RK3562_GMAC1_CLK_SELET_IO = BIT(15), + }; + + enum { + RK3562_GMAC0_IO_EXTCLK_SELET_SHIFT = 0x2, + RK3562_GMAC0_IO_EXTCLK_SELET_MASK = BIT(2), + RK3562_GMAC0_IO_EXTCLK_SELET_CRU = 0, + RK3562_GMAC0_IO_EXTCLK_SELET_IO = BIT(2), + }; + + enum { + RK3562_GMAC1_IO_EXTCLK_SELET_SHIFT = 0x3, + RK3562_GMAC1_IO_EXTCLK_SELET_MASK = BIT(3), + RK3562_GMAC1_IO_EXTCLK_SELET_CRU = 0, + RK3562_GMAC1_IO_EXTCLK_SELET_IO = BIT(3), + }; + + grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + ioc = syscon_get_first_range(ROCKCHIP_SYSCON_IOC); + + if (!pdata->bus_id) { + val = pdata->clock_input ? RK3562_GMAC0_CLK_SELET_IO : + RK3562_GMAC0_CLK_SELET_CRU; + rk_clrsetreg(&grf->soc_con[0], RK3562_GMAC0_CLK_SELET_MASK, val); + val = pdata->clock_input ? RK3562_GMAC0_IO_EXTCLK_SELET_IO : + RK3562_GMAC0_IO_EXTCLK_SELET_CRU; + rk_clrsetreg(&ioc->mac1_io_con1, + RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val); + rk_clrsetreg(&ioc->mac0_io_con1, + RK3562_GMAC0_IO_EXTCLK_SELET_MASK, val); + + } else { + val = pdata->clock_input ? RK3562_GMAC1_CLK_SELET_IO : + RK3562_GMAC1_CLK_SELET_CRU; + rk_clrsetreg(&grf->soc_con[1], RK3562_GMAC1_CLK_SELET_MASK, val); + val = pdata->clock_input ? RK3562_GMAC1_IO_EXTCLK_SELET_IO : + RK3562_GMAC1_IO_EXTCLK_SELET_CRU; + rk_clrsetreg(&ioc->mac1_io_con1, + RK3562_GMAC1_IO_EXTCLK_SELET_MASK, val); + } +} + static void rk3588_set_clock_selection(struct gmac_rockchip_platdata *pdata) { struct rk3588_php_grf *php_grf; @@ -1701,6 +2170,21 @@ .set_to_rmii = rv1108_gmac_set_to_rmii, }; #else +const struct rk_gmac_ops rk3528_gmac_ops = { + .fix_mac_speed = rk3528_set_rgmii_speed, + .set_to_rgmii = rk3528_set_to_rgmii, + .set_to_rmii = rk3528_set_to_rmii, + .set_clock_selection = rk3528_set_clock_selection, + .integrated_phy_powerup = rk3528_gmac_integrated_phy_powerup, +}; + +const struct rk_gmac_ops rk3562_gmac_ops = { + .fix_mac_speed = rk3562_set_gmac_speed, + .set_to_rgmii = rk3562_set_to_rgmii, + .set_to_rmii = rk3562_set_to_rmii, + .set_clock_selection = rk3562_set_clock_selection, +}; + const struct rk_gmac_ops rk3568_gmac_ops = { .fix_mac_speed = rv1126_set_rgmii_speed, .set_to_rgmii = rk3568_set_to_rgmii, @@ -1774,6 +2258,16 @@ .data = (ulong)&rv1108_gmac_ops }, #endif #else +#ifdef CONFIG_ROCKCHIP_RK3528 + { .compatible = "rockchip,rk3528-gmac", + .data = (ulong)&rk3528_gmac_ops }, +#endif + +#ifdef CONFIG_ROCKCHIP_RK3562 + { .compatible = "rockchip,rk3562-gmac", + .data = (ulong)&rk3562_gmac_ops }, +#endif + #ifdef CONFIG_ROCKCHIP_RK3568 { .compatible = "rockchip,rk3568-gmac", .data = (ulong)&rk3568_gmac_ops }, diff --git a/u-boot/drivers/net/phy/rk630phy.c b/u-boot/drivers/net/phy/rk630phy.c index 9f1ec14..cc35bc4 100644 --- a/u-boot/drivers/net/phy/rk630phy.c +++ b/u-boot/drivers/net/phy/rk630phy.c @@ -50,6 +50,7 @@ #define REG_PAGE6_CP_CURRENT 0x17 #define REG_PAGE6_ADC_OP_BIAS 0x18 #define REG_PAGE6_RX_DECTOR 0x19 +#define REG_PAGE6_TX_MOS_DRV 0x1B #define REG_PAGE6_AFE_PDCW 0x1c /* PAGE 8 */ @@ -201,6 +202,8 @@ phy_write(phydev, MDIO_DEVAD_NONE, REG_PAGE6_RX_DECTOR, 0x0408); /* PHYAFE PDCW optimization */ phy_write(phydev, MDIO_DEVAD_NONE, REG_PAGE6_AFE_PDCW, 0x8880); + /* Add PHY Tx mos drive, reduce power noise/jitter */ + phy_write(phydev, MDIO_DEVAD_NONE, REG_PAGE6_TX_MOS_DRV, 0x888e); /* Switch to page 8 */ phy_write(phydev, MDIO_DEVAD_NONE, REG_PAGE_SEL, 0x0800); diff --git a/u-boot/drivers/nvme/nvme.c b/u-boot/drivers/nvme/nvme.c index 55600c8..402e992 100644 --- a/u-boot/drivers/nvme/nvme.c +++ b/u-boot/drivers/nvme/nvme.c @@ -6,6 +6,7 @@ */ #include <common.h> +#include <bouncebuf.h> #include <dm.h> #include <errno.h> #include <memalign.h> @@ -740,13 +741,25 @@ u64 prp2; u64 total_len = blkcnt << desc->log2blksz; u64 temp_len = total_len; + uintptr_t temp_buffer; u64 slba = blknr; u16 lbas = 1 << (dev->max_transfer_shift - ns->lba_shift); u64 total_lbas = blkcnt; - flush_dcache_range((unsigned long)buffer, - (unsigned long)buffer + total_len); + struct bounce_buffer bb; + unsigned int bb_flags; + int ret; + + if (read) + bb_flags = GEN_BB_WRITE; + else + bb_flags = GEN_BB_READ; + + ret = bounce_buffer_start(&bb, buffer, total_len, bb_flags); + if (ret) + return -ENOMEM; + temp_buffer = (unsigned long)bb.bounce_buffer; c.rw.opcode = read ? nvme_cmd_read : nvme_cmd_write; c.rw.flags = 0; @@ -771,24 +784,22 @@ } if (nvme_setup_prps(dev, &prp2, - lbas << ns->lba_shift, (ulong)buffer)) + lbas << ns->lba_shift, temp_buffer)) return -EIO; c.rw.slba = cpu_to_le64(slba); slba += lbas; c.rw.length = cpu_to_le16(lbas - 1); - c.rw.prp1 = cpu_to_le64((ulong)buffer); + c.rw.prp1 = cpu_to_le64(temp_buffer); c.rw.prp2 = cpu_to_le64(prp2); status = nvme_submit_sync_cmd(dev->queues[NVME_IO_Q], &c, NULL, IO_TIMEOUT); if (status) break; temp_len -= (u32)lbas << ns->lba_shift; - buffer += lbas << ns->lba_shift; + temp_buffer += lbas << ns->lba_shift; } - if (read) - invalidate_dcache_range((unsigned long)buffer, - (unsigned long)buffer + total_len); + bounce_buffer_stop(&bb); return (total_len - temp_len) >> desc->log2blksz; } diff --git a/u-boot/drivers/pci/pcie_dw_rockchip.c b/u-boot/drivers/pci/pcie_dw_rockchip.c index 27312d1..dd81acf 100644 --- a/u-boot/drivers/pci/pcie_dw_rockchip.c +++ b/u-boot/drivers/pci/pcie_dw_rockchip.c @@ -18,8 +18,41 @@ #include <asm-generic/gpio.h> #include <asm/arch-rockchip/clock.h> #include <linux/iopoll.h> +#include <linux/ioport.h> DECLARE_GLOBAL_DATA_PTR; + +#define RK_PCIE_DBG 0 + +#define __pcie_dev_print_emit(fmt, ...) \ +({ \ + printf(fmt, ##__VA_ARGS__); \ +}) + +#ifdef dev_err +#undef dev_err +#define dev_err(dev, fmt, ...) \ +({ \ + if (dev) \ + __pcie_dev_print_emit("%s: " fmt, dev->name, \ + ##__VA_ARGS__); \ +}) +#endif + +#ifdef dev_info +#undef dev_info +#define dev_info dev_err +#endif + +#ifdef DEBUG +#define dev_dbg dev_err +#else +#define dev_dbg(dev, fmt, ...) \ +({ \ + if (0) \ + __dev_printk(7, dev, fmt, ##__VA_ARGS__); \ +}) +#endif struct rk_pcie { struct udevice *dev; @@ -62,7 +95,6 @@ #define PCIE_CLIENT_DBG_FIFO_STATUS 0x350 #define PCIE_CLIENT_DBG_TRANSITION_DATA 0xffff0000 #define PCIE_CLIENT_DBF_EN 0xffff0003 -#define RK_PCIE_DBG 0 /* PCI DBICS registers */ #define PCIE_LINK_STATUS_REG 0x80 @@ -119,6 +151,8 @@ #define LINK_WAIT_MAX_IATU_RETRIES 5 #define LINK_WAIT_IATU 10000 +#define PCIE_TYPE0_HDR_DBI2_OFFSET 0x100000 + static int rk_pcie_read(void __iomem *addr, int size, u32 *val) { if ((uintptr_t)addr & (size - 1)) { @@ -165,7 +199,7 @@ ret = rk_pcie_read(base + reg, size, &val); if (ret) - dev_err(rk_pcie->pci->dev, "Read APB address failed\n"); + dev_err(rk_pcie->dev, "Read APB address failed\n"); return val; } @@ -177,7 +211,7 @@ ret = rk_pcie_write(base + reg, size, val); if (ret) - dev_err(rk_pcie->pci->dev, "Write APB address failed\n"); + dev_err(rk_pcie->dev, "Write APB address failed\n"); } static inline u32 rk_pcie_readl_apb(struct rk_pcie *rk_pcie, u32 reg) @@ -272,6 +306,10 @@ val = readl(rk_pcie->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); val |= PORT_LOGIC_SPEED_CHANGE; writel(val, rk_pcie->dbi_base + PCIE_LINK_WIDTH_SPEED_CONTROL); + + /* Disable BAR0 BAR1 */ + writel(0, rk_pcie->dbi_base + PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + 0 * 4); + writel(0, rk_pcie->dbi_base + PCIE_TYPE0_HDR_DBI2_OFFSET + 0x10 + 1 * 4); rk_pcie_dbi_write_enable(rk_pcie, false); } @@ -469,10 +507,10 @@ #if RK_PCIE_DBG u32 loop; - dev_info(rk_pcie->dev, "ltssm = 0x%x\n", + dev_err(rk_pcie->dev, "ltssm = 0x%x\n", rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_LTSSM_STATUS)); for (loop = 0; loop < 64; loop++) - dev_info(rk_pcie->dev, "fifo_status = 0x%x\n", + dev_err(rk_pcie->dev, "fifo_status = 0x%x\n", rk_pcie_readl_apb(rk_pcie, PCIE_CLIENT_DBG_FIFO_STATUS)); #endif } @@ -641,17 +679,18 @@ struct rk_pcie *priv = dev_get_priv(dev); u32 max_link_speed; int ret; + struct resource res; - priv->dbi_base = (void *)dev_read_addr_index(dev, 0); - if (!priv->dbi_base) + ret = dev_read_resource_byname(dev, "pcie-dbi", &res); + if (ret) return -ENODEV; - + priv->dbi_base = (void *)(res.start); dev_dbg(dev, "DBI address is 0x%p\n", priv->dbi_base); - priv->apb_base = (void *)dev_read_addr_index(dev, 1); - if (!priv->apb_base) + ret = dev_read_resource_byname(dev, "pcie-apb", &res); + if (ret) return -ENODEV; - + priv->apb_base = (void *)(res.start); dev_dbg(dev, "APB address is 0x%p\n", priv->apb_base); ret = gpio_request_by_name(dev, "reset-gpios", 0, @@ -771,6 +810,8 @@ }; static const struct udevice_id rockchip_pcie_ids[] = { + { .compatible = "rockchip,rk3528-pcie" }, + { .compatible = "rockchip,rk3562-pcie" }, { .compatible = "rockchip,rk3568-pcie" }, { .compatible = "rockchip,rk3588-pcie" }, { } diff --git a/u-boot/drivers/phy/Makefile b/u-boot/drivers/phy/Makefile index 27c423e..a94cb39 100644 --- a/u-boot/drivers/phy/Makefile +++ b/u-boot/drivers/phy/Makefile @@ -18,3 +18,5 @@ obj-$(CONFIG_PHY_SANDBOX) += sandbox-phy.o obj-$(CONFIG_$(SPL_)PIPE3_PHY) += ti-pipe3-phy.o obj-$(CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY) += phy-rockchip-naneng-combphy.o + +CFLAGS_phy-rockchip-inno-usb2.o := -Wno-error=unused-function -Wno-error=unused-const-variable -Wunused-const-variable=0 diff --git a/u-boot/drivers/phy/phy-rockchip-inno-usb2.c b/u-boot/drivers/phy/phy-rockchip-inno-usb2.c index 6ff06f7..92a9181 100644 --- a/u-boot/drivers/phy/phy-rockchip-inno-usb2.c +++ b/u-boot/drivers/phy/phy-rockchip-inno-usb2.c @@ -149,6 +149,7 @@ * primary stage. * @grf: General Register Files register base. * @usbgrf_base : USB General Register Files register base. + * @phy_base: the base address of USB PHY. * @phy_rst: phy reset control. * @phy_cfg: phy register configuration, assigned by driver data. */ @@ -157,6 +158,7 @@ u8 primary_retries; struct regmap *grf_base; struct regmap *usbgrf_base; + void __iomem *phy_base; struct udevice *vbus_supply[USB2PHY_NUM_PORTS]; struct reset_ctl phy_rst; const struct rockchip_usb2phy_cfg *phy_cfg; @@ -282,6 +284,11 @@ return POWER_SUPPLY_TYPE_UNKNOWN; } +#ifdef CONFIG_ROCKCHIP_RK3036 + chg_type = POWER_SUPPLY_TYPE_USB; + goto out; +#endif + /* Suspend USB-PHY and put the controller in non-driving mode */ property_enable(base, &port_cfg->phy_sus, true); property_enable(base, &rphy->phy_cfg->chg_det.opmode, false); @@ -388,36 +395,14 @@ port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG]; /* Set the USB-PHY COMMONONN to 1'b0 to ensure USB's clocks */ - property_enable(base, &rphy->phy_cfg->clkout_ctl, false); + if(rphy->phy_cfg->clkout_ctl.disable) + property_enable(base, &rphy->phy_cfg->clkout_ctl, true); /* Reset USB-PHY */ property_enable(base, &port_cfg->phy_sus, true); udelay(20); property_enable(base, &port_cfg->phy_sus, false); mdelay(2); -} - -static struct udevice *rockchip_usb2phy_check_vbus(struct phy *phy) -{ - struct udevice *parent = phy->dev->parent; - struct rockchip_usb2phy *rphy = dev_get_priv(parent); - const struct rockchip_usb2phy_port_cfg *port_cfg; - struct regmap *base = get_reg_base(rphy); - struct udevice *vbus = NULL; - bool iddig = true; - - if (phy->id == USB2PHY_PORT_HOST) { - vbus = rphy->vbus_supply[USB2PHY_PORT_HOST]; - } else if (phy->id == USB2PHY_PORT_OTG) { - port_cfg = &rphy->phy_cfg->port_cfgs[USB2PHY_PORT_OTG]; - if (port_cfg->utmi_iddig.offset) { - iddig = property_enabled(base, &port_cfg->utmi_iddig); - if (!iddig) - vbus = rphy->vbus_supply[USB2PHY_PORT_OTG]; - } - } - - return vbus; } static int rockchip_usb2phy_reset(struct rockchip_usb2phy *rphy) @@ -492,10 +477,11 @@ static int rockchip_usb2phy_power_on(struct phy *phy) { - struct udevice *vbus = NULL; + struct udevice *parent = phy->dev->parent; + struct rockchip_usb2phy *rphy = dev_get_priv(parent); + struct udevice *vbus = rphy->vbus_supply[phy->id]; int ret; - vbus = rockchip_usb2phy_check_vbus(phy); if (vbus) { ret = regulator_set_enable(vbus, true); if (ret) { @@ -509,10 +495,11 @@ static int rockchip_usb2phy_power_off(struct phy *phy) { - struct udevice *vbus = NULL; + struct udevice *parent = phy->dev->parent; + struct rockchip_usb2phy *rphy = dev_get_priv(parent); + struct udevice *vbus = rphy->vbus_supply[phy->id]; int ret; - vbus = rockchip_usb2phy_check_vbus(phy); if (vbus) { ret = regulator_set_enable(vbus, false); if (ret) { @@ -587,6 +574,11 @@ struct resource res; u32 reg, index; int ret; + + rphy->phy_base = (void __iomem *)dev_read_addr(dev); + if (IS_ERR(rphy->phy_base)) { + dev_err(dev, "get the base address of usb phy failed\n"); + } if (!strncmp(parent->name, "root_driver", 11) && dev_read_bool(dev, "rockchip,grf")) { @@ -818,6 +810,102 @@ return 0; } +static int rv1106_usb2phy_tuning(struct rockchip_usb2phy *rphy) +{ + u32 reg; + + /* Set HS disconnect detect mode to single ended detect mode */ + reg = readl(rphy->phy_base + 0x70); + writel(reg | BIT(2), rphy->phy_base + 0x70); + + return 0; +} + +static int rk3528_usb2phy_tuning(struct rockchip_usb2phy *rphy) +{ + u32 reg; + int ret = 0; + + if (IS_ERR(rphy->phy_base)) { + return PTR_ERR(rphy->phy_base); + } + + /* Turn off otg port differential receiver in suspend mode */ + reg = readl(rphy->phy_base + 0x30); + writel(reg & ~BIT(2), rphy->phy_base + 0x30); + + /* Turn off host port differential receiver in suspend mode */ + reg = readl(rphy->phy_base + 0x0430); + writel(reg & ~BIT(2), rphy->phy_base + 0x0430); + + /* Set otg port HS eye height to 400mv(default is 450mv) */ + reg = readl(rphy->phy_base + 0x30); + reg &= ~GENMASK(6, 4); + reg |= (0x00 << 4); + writel(reg, rphy->phy_base + 0x30); + + /* Set host port HS eye height to 400mv(default is 450mv) */ + reg = readl(rphy->phy_base + 0x430); + reg &= ~GENMASK(6, 4); + reg |= (0x00 << 4); + writel(reg, rphy->phy_base + 0x430); + + /* Choose the Tx fs/ls data as linestate from TX driver for otg port */ + reg = readl(rphy->phy_base + 0x94); + reg &= ~GENMASK(6, 3); + reg |= (0x03 << 3); + writel(reg, rphy->phy_base + 0x94); + + /* Turn on output clk of phy*/ + reg = readl(rphy->phy_base + 0x41c); + reg &= ~GENMASK(7, 2); + reg |= (0x27 << 2); + writel(reg, rphy->phy_base + 0x41c); + + return ret; +} + +static int rk3562_usb2phy_tuning(struct rockchip_usb2phy *rphy) +{ + u32 reg; + int ret = 0; + + if (IS_ERR(rphy->phy_base)) { + return PTR_ERR(rphy->phy_base); + } + + /* Turn off differential receiver by default to save power */ + reg = readl(rphy->phy_base + 0x30); + writel(reg & ~BIT(2), rphy->phy_base + 0x30); + + reg = readl(rphy->phy_base + 0x0430); + writel(reg & ~BIT(2), rphy->phy_base + 0x0430); + + /* Enable pre-emphasis during non-chirp phase */ + reg = readl(rphy->phy_base); + reg &= ~GENMASK(2, 0); + reg |= 0x04; + writel(reg, rphy->phy_base); + + reg = readl(rphy->phy_base + 0x0400); + reg &= ~GENMASK(2, 0); + reg |= 0x04; + writel(reg, rphy->phy_base + 0x0400); + + /* Set HS eye height to 425mv(default is 400mv) */ + reg = readl(rphy->phy_base + 0x0030); + reg &= ~GENMASK(6, 4); + reg |= (0x05 << 4); + writel(reg, rphy->phy_base + 0x0030); + + reg = readl(rphy->phy_base + 0x0430); + reg &= ~GENMASK(6, 4); + reg |= (0x05 << 4); + writel(reg, rphy->phy_base + 0x0430); + + return ret; +} + static int rk3588_usb2phy_tuning(struct rockchip_usb2phy *rphy) { struct regmap *base = get_reg_base(rphy); @@ -902,6 +990,43 @@ .rdm_pdwn_en = { 0x0108, 10, 10, 0, 1 }, .vdm_src_en = { 0x0108, 12, 12, 0, 1 }, .vdp_src_en = { 0x0108, 11, 11, 0, 1 }, + }, + }, + { /* sentinel */ } +}; + +static const struct rockchip_usb2phy_cfg rk3036_phy_cfgs[] = { + { + .reg = 0x17c, + .num_ports = 2, + .clkout_ctl = { 0x017c, 11, 11, 1, 0 }, + .port_cfgs = { + [USB2PHY_PORT_OTG] = { + .phy_sus = { 0x017c, 8, 0, 0, 0x1d1 }, + .bvalid_det_en = { 0x017c, 14, 14, 0, 1 }, + .bvalid_det_st = { 0x017c, 15, 15, 0, 1 }, + .bvalid_det_clr = { 0x017c, 15, 15, 0, 1 }, + .iddig_output = { 0x017c, 10, 10, 0, 1 }, + .iddig_en = { 0x017c, 9, 9, 0, 1 }, + .idfall_det_en = { 0x01a0, 2, 2, 0, 1 }, + .idfall_det_st = { 0x01a0, 3, 3, 0, 1 }, + .idfall_det_clr = { 0x01a0, 3, 3, 0, 1 }, + .idrise_det_en = { 0x01a0, 0, 0, 0, 1 }, + .idrise_det_st = { 0x01a0, 1, 1, 0, 1 }, + .idrise_det_clr = { 0x01a0, 1, 1, 0, 1 }, + .ls_det_en = { 0x017c, 12, 12, 0, 1 }, + .ls_det_st = { 0x017c, 13, 13, 0, 1 }, + .ls_det_clr = { 0x017c, 13, 13, 0, 1 }, + .utmi_bvalid = { 0x014c, 5, 5, 0, 1 }, + .utmi_iddig = { 0x014c, 8, 8, 0, 1 }, + .utmi_ls = { 0x014c, 7, 6, 0, 1 }, + }, + [USB2PHY_PORT_HOST] = { + .phy_sus = { 0x0194, 8, 0, 0, 0x1d1 }, + .ls_det_en = { 0x0194, 14, 14, 0, 1 }, + .ls_det_st = { 0x0194, 15, 15, 0, 1 }, + .ls_det_clr = { 0x0194, 15, 15, 0, 1 } + } }, }, { /* sentinel */ } @@ -1272,6 +1397,51 @@ { /* sentinel */ } }; +static const struct rockchip_usb2phy_cfg rv1106_phy_cfgs[] = { + { + .reg = 0xff3e0000, + .num_ports = 1, + .phy_tuning = rv1106_usb2phy_tuning, + .clkout_ctl = { 0x0058, 4, 4, 1, 0 }, + .port_cfgs = { + [USB2PHY_PORT_OTG] = { + .phy_sus = { 0x0050, 8, 0, 0, 0x1d1 }, + .bvalid_det_en = { 0x0100, 2, 2, 0, 1 }, + .bvalid_det_st = { 0x0104, 2, 2, 0, 1 }, + .bvalid_det_clr = { 0x0108, 2, 2, 0, 1 }, + .iddig_output = { 0x0050, 10, 10, 0, 1 }, + .iddig_en = { 0x0050, 9, 9, 0, 1 }, + .idfall_det_en = { 0x0100, 5, 5, 0, 1 }, + .idfall_det_st = { 0x0104, 5, 5, 0, 1 }, + .idfall_det_clr = { 0x0108, 5, 5, 0, 1 }, + .idrise_det_en = { 0x0100, 4, 4, 0, 1 }, + .idrise_det_st = { 0x0104, 4, 4, 0, 1 }, + .idrise_det_clr = { 0x0108, 4, 4, 0, 1 }, + .ls_det_en = { 0x0100, 0, 0, 0, 1 }, + .ls_det_st = { 0x0104, 0, 0, 0, 1 }, + .ls_det_clr = { 0x0108, 0, 0, 0, 1 }, + .utmi_avalid = { 0x0060, 10, 10, 0, 1 }, + .utmi_bvalid = { 0x0060, 9, 9, 0, 1 }, + .utmi_iddig = { 0x0060, 6, 6, 0, 1 }, + .utmi_ls = { 0x0060, 5, 4, 0, 1 }, + }, + }, + .chg_det = { + .opmode = { 0x0050, 3, 0, 5, 1 }, + .cp_det = { 0x0060, 13, 13, 0, 1 }, + .dcp_det = { 0x0060, 12, 12, 0, 1 }, + .dp_det = { 0x0060, 14, 14, 0, 1 }, + .idm_sink_en = { 0x0058, 8, 8, 0, 1 }, + .idp_sink_en = { 0x0058, 7, 7, 0, 1 }, + .idp_src_en = { 0x0058, 9, 9, 0, 1 }, + .rdm_pdwn_en = { 0x0058, 10, 10, 0, 1 }, + .vdm_src_en = { 0x0058, 12, 12, 0, 1 }, + .vdp_src_en = { 0x0058, 11, 11, 0, 1 }, + }, + }, + { /* sentinel */ } +}; + static const struct rockchip_usb2phy_cfg rv1108_phy_cfgs[] = { { .reg = 0x100, @@ -1309,6 +1479,110 @@ .rdm_pdwn_en = { 0x0ffa0108, 10, 10, 0, 1 }, .vdm_src_en = { 0x0ffa0108, 12, 12, 0, 1 }, .vdp_src_en = { 0x0ffa0108, 11, 11, 0, 1 }, + }, + }, + { /* sentinel */ } +}; + +static const struct rockchip_usb2phy_cfg rk3528_phy_cfgs[] = { + { + .reg = 0xffdf0000, + .num_ports = 2, + .phy_tuning = rk3528_usb2phy_tuning, + .port_cfgs = { + [USB2PHY_PORT_OTG] = { + .phy_sus = { 0x6004c, 8, 0, 0, 0x1d1 }, + .bvalid_det_en = { 0x60074, 2, 2, 0, 1 }, + .bvalid_det_st = { 0x60078, 2, 2, 0, 1 }, + .bvalid_det_clr = { 0x6007c, 2, 2, 0, 1 }, + .iddig_output = { 0x6004c, 10, 10, 0, 1 }, + .iddig_en = { 0x6004c, 9, 9, 0, 1 }, + .idfall_det_en = { 0x60074, 5, 5, 0, 1 }, + .idfall_det_st = { 0x60078, 5, 5, 0, 1 }, + .idfall_det_clr = { 0x6007c, 5, 5, 0, 1 }, + .idrise_det_en = { 0x60074, 4, 4, 0, 1 }, + .idrise_det_st = { 0x60078, 4, 4, 0, 1 }, + .idrise_det_clr = { 0x6007c, 4, 4, 0, 1 }, + .ls_det_en = { 0x60074, 0, 0, 0, 1 }, + .ls_det_st = { 0x60078, 0, 0, 0, 1 }, + .ls_det_clr = { 0x6007c, 0, 0, 0, 1 }, + .utmi_avalid = { 0x6006c, 1, 1, 0, 1 }, + .utmi_bvalid = { 0x6006c, 0, 0, 0, 1 }, + .utmi_iddig = { 0x6006c, 6, 6, 0, 1 }, + .utmi_ls = { 0x6006c, 5, 4, 0, 1 }, + }, + [USB2PHY_PORT_HOST] = { + .phy_sus = { 0x6005c, 8, 0, 0x1d2, 0x1d1 }, + .ls_det_en = { 0x60090, 0, 0, 0, 1 }, + .ls_det_st = { 0x60094, 0, 0, 0, 1 }, + .ls_det_clr = { 0x60098, 0, 0, 0, 1 }, + .utmi_ls = { 0x6006c, 13, 12, 0, 1 }, + .utmi_hstdet = { 0x6006c, 15, 15, 0, 1 } + } + }, + .chg_det = { + .opmode = { 0x6004c, 3, 0, 5, 1 }, + .cp_det = { 0x6006c, 19, 19, 0, 1 }, + .dcp_det = { 0x6006c, 18, 18, 0, 1 }, + .dp_det = { 0x6006c, 20, 20, 0, 1 }, + .idm_sink_en = { 0x60058, 1, 1, 0, 1 }, + .idp_sink_en = { 0x60058, 0, 0, 0, 1 }, + .idp_src_en = { 0x60058, 2, 2, 0, 1 }, + .rdm_pdwn_en = { 0x60058, 3, 3, 0, 1 }, + .vdm_src_en = { 0x60058, 5, 5, 0, 1 }, + .vdp_src_en = { 0x60058, 4, 4, 0, 1 }, + }, + } +}; + +static const struct rockchip_usb2phy_cfg rk3562_phy_cfgs[] = { + { + .reg = 0xff740000, + .num_ports = 2, + .phy_tuning = rk3562_usb2phy_tuning, + .clkout_ctl = { 0x0108, 4, 4, 1, 0 }, + .port_cfgs = { + [USB2PHY_PORT_OTG] = { + .phy_sus = { 0x0100, 8, 0, 0, 0x1d1 }, + .bvalid_det_en = { 0x0110, 2, 2, 0, 1 }, + .bvalid_det_st = { 0x0114, 2, 2, 0, 1 }, + .bvalid_det_clr = { 0x0118, 2, 2, 0, 1 }, + .iddig_output = { 0x0100, 10, 10, 0, 1 }, + .iddig_en = { 0x0100, 9, 9, 0, 1 }, + .idfall_det_en = { 0x0110, 5, 5, 0, 1 }, + .idfall_det_st = { 0x0114, 5, 5, 0, 1 }, + .idfall_det_clr = { 0x0118, 5, 5, 0, 1 }, + .idrise_det_en = { 0x0110, 4, 4, 0, 1 }, + .idrise_det_st = { 0x0114, 4, 4, 0, 1 }, + .idrise_det_clr = { 0x0118, 4, 4, 0, 1 }, + .ls_det_en = { 0x0110, 0, 0, 0, 1 }, + .ls_det_st = { 0x0114, 0, 0, 0, 1 }, + .ls_det_clr = { 0x0118, 0, 0, 0, 1 }, + .utmi_avalid = { 0x0120, 10, 10, 0, 1 }, + .utmi_bvalid = { 0x0120, 9, 9, 0, 1 }, + .utmi_iddig = { 0x0120, 6, 6, 0, 1 }, + .utmi_ls = { 0x0120, 5, 4, 0, 1 }, + }, + [USB2PHY_PORT_HOST] = { + .phy_sus = { 0x0104, 8, 0, 0x1d2, 0x1d1 }, + .ls_det_en = { 0x0110, 1, 1, 0, 1 }, + .ls_det_st = { 0x0114, 1, 1, 0, 1 }, + .ls_det_clr = { 0x0118, 1, 1, 0, 1 }, + .utmi_ls = { 0x0120, 17, 16, 0, 1 }, + .utmi_hstdet = { 0x0120, 19, 19, 0, 1 } + } + }, + .chg_det = { + .opmode = { 0x0100, 3, 0, 5, 1 }, + .cp_det = { 0x0120, 24, 24, 0, 1 }, + .dcp_det = { 0x0120, 23, 23, 0, 1 }, + .dp_det = { 0x0120, 25, 25, 0, 1 }, + .idm_sink_en = { 0x0108, 8, 8, 0, 1 }, + .idp_sink_en = { 0x0108, 7, 7, 0, 1 }, + .idp_src_en = { 0x0108, 9, 9, 0, 1 }, + .rdm_pdwn_en = { 0x0108, 10, 10, 0, 1 }, + .vdm_src_en = { 0x0108, 12, 12, 0, 1 }, + .vdp_src_en = { 0x0108, 11, 11, 0, 1 }, }, }, { /* sentinel */ } @@ -1401,6 +1675,8 @@ .ls_det_en = { 0x0080, 0, 0, 0, 1 }, .ls_det_st = { 0x0084, 0, 0, 0, 1 }, .ls_det_clr = { 0x0088, 0, 0, 0, 1 }, + .utmi_avalid = { 0x00c0, 7, 7, 0, 1 }, + .utmi_bvalid = { 0x00c0, 6, 6, 0, 1 }, .utmi_iddig = { 0x00c0, 5, 5, 0, 1 }, .utmi_ls = { 0x00c0, 10, 9, 0, 1 }, } @@ -1468,16 +1744,48 @@ }; static const struct udevice_id rockchip_usb2phy_ids[] = { +#ifdef CONFIG_ROCKCHIP_RK1808 { .compatible = "rockchip,rk1808-usb2phy", .data = (ulong)&rk1808_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK3036 + { .compatible = "rockchip,rk3036-usb2phy", .data = (ulong)&rk3036_phy_cfgs }, +#endif +#if defined CONFIG_ROCKCHIP_RK3128 || defined CONFIG_ROCKCHIP_RK3126 { .compatible = "rockchip,rk3128-usb2phy", .data = (ulong)&rk312x_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK322X { .compatible = "rockchip,rk322x-usb2phy", .data = (ulong)&rk322x_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK3308 { .compatible = "rockchip,rk3308-usb2phy", .data = (ulong)&rk3308_phy_cfgs }, +#endif +#if defined CONFIG_ROCKCHIP_RK3328 || defined CONFIG_ROCKCHIP_PX30 { .compatible = "rockchip,rk3328-usb2phy", .data = (ulong)&rk3328_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK3368 { .compatible = "rockchip,rk3368-usb2phy", .data = (ulong)&rk3368_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK3399 { .compatible = "rockchip,rk3399-usb2phy", .data = (ulong)&rk3399_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK3528 + { .compatible = "rockchip,rk3528-usb2phy", .data = (ulong)&rk3528_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK3562 + { .compatible = "rockchip,rk3562-usb2phy", .data = (ulong)&rk3562_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK3568 { .compatible = "rockchip,rk3568-usb2phy", .data = (ulong)&rk3568_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RK3588 { .compatible = "rockchip,rk3588-usb2phy", .data = (ulong)&rk3588_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RV1106 + { .compatible = "rockchip,rv1106-usb2phy", .data = (ulong)&rv1106_phy_cfgs }, +#endif +#ifdef CONFIG_ROCKCHIP_RV1108 { .compatible = "rockchip,rv1108-usb2phy", .data = (ulong)&rv1108_phy_cfgs }, +#endif { } }; diff --git a/u-boot/drivers/phy/phy-rockchip-naneng-combphy.c b/u-boot/drivers/phy/phy-rockchip-naneng-combphy.c index 1867865..451a90f 100644 --- a/u-boot/drivers/phy/phy-rockchip-naneng-combphy.c +++ b/u-boot/drivers/phy/phy-rockchip-naneng-combphy.c @@ -22,7 +22,7 @@ struct rockchip_combphy_priv; struct combphy_reg { - u16 offset; + u32 offset; u16 bitend; u16 bitstart; u16 disable; @@ -37,6 +37,7 @@ struct combphy_reg pipe_rxterm_set; struct combphy_reg pipe_txelec_set; struct combphy_reg pipe_txcomp_set; + struct combphy_reg pipe_clk_24m; struct combphy_reg pipe_clk_25m; struct combphy_reg pipe_clk_100m; struct combphy_reg pipe_phymode_sel; @@ -62,6 +63,7 @@ struct combphy_reg pipe_xpcs_phy_ready; struct combphy_reg u3otg0_port_en; struct combphy_reg u3otg1_port_en; + struct combphy_reg pipe_phy_grf_reset; }; struct rockchip_combphy_cfg { @@ -179,6 +181,7 @@ static int rockchip_combphy_init(struct phy *phy) { struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev); + const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; int ret; ret = clk_enable(&priv->ref_clk); @@ -191,6 +194,9 @@ reset_deassert(&priv->phy_rst); + if (cfg->pipe_phy_grf_reset.enable) + param_write(priv->phy_grf, &cfg->pipe_phy_grf_reset, false); + return 0; err_clk: @@ -202,9 +208,13 @@ static int rockchip_combphy_exit(struct phy *phy) { struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev); + const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; - clk_disable(&priv->ref_clk); + if (cfg->pipe_phy_grf_reset.enable) + param_write(priv->phy_grf, &cfg->pipe_phy_grf_reset, true); + reset_assert(&priv->phy_rst); + clk_disable(&priv->ref_clk); return 0; } @@ -291,6 +301,215 @@ return rockchip_combphy_parse_dt(udev, priv); } + +static int rk3528_combphy_cfg(struct rockchip_combphy_priv *priv) +{ + const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; + u32 val; + + switch (priv->mode) { + case PHY_TYPE_PCIE: + /* Set SSC downward spread spectrum */ + val = readl(priv->mmio + 0x18); + val &= ~GENMASK(5, 4); + val |= 0x01 << 4; + writel(val, priv->mmio + 0x18); + + param_write(priv->phy_grf, &cfg->con0_for_pcie, true); + param_write(priv->phy_grf, &cfg->con1_for_pcie, true); + param_write(priv->phy_grf, &cfg->con2_for_pcie, true); + param_write(priv->phy_grf, &cfg->con3_for_pcie, true); + break; + case PHY_TYPE_USB3: + /* Set SSC downward spread spectrum */ + val = readl(priv->mmio + 0x18); + val &= ~GENMASK(5, 4); + val |= 0x01 << 4; + writel(val, priv->mmio + 0x18); + + /* Enable adaptive CTLE for USB3.0 Rx */ + val = readl(priv->mmio + 0x200); + val &= ~GENMASK(17, 17); + val |= 0x01; + writel(val, priv->mmio + 0x200); + + param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false); + param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false); + param_write(priv->phy_grf, &cfg->usb_mode_set, true); + break; + default: + dev_err(priv->dev, "incompatible PHY type\n"); + return -EINVAL; + } + + param_write(priv->phy_grf, &cfg->pipe_clk_100m, true); + if (priv->mode == PHY_TYPE_PCIE) { + /* PLL KVCO tuning fine */ + val = readl(priv->mmio + 0x18); + val &= ~(0x7 << 10); + val |= 0x2 << 10; + writel(val, priv->mmio + 0x18); + + /* su_trim[6:4]=111, [10:7]=1001, [2:0]=000 */ + val = readl(priv->mmio + 0x108); + val &= ~(0x7f7); + val |= 0x4f0; + writel(val, priv->mmio + 0x108); + } + + return 0; +} + +static const struct rockchip_combphy_grfcfg rk3528_combphy_grfcfgs = { + /* pipe-phy-grf */ + .pcie_mode_set = { 0x48000, 5, 0, 0x00, 0x11 }, + .usb_mode_set = { 0x48000, 5, 0, 0x00, 0x04 }, + .pipe_rxterm_set = { 0x48000, 12, 12, 0x00, 0x01 }, + .pipe_txelec_set = { 0x48004, 1, 1, 0x00, 0x01 }, + .pipe_txcomp_set = { 0x48004, 4, 4, 0x00, 0x01 }, + .pipe_clk_24m = { 0x48004, 14, 13, 0x00, 0x00 }, + .pipe_clk_100m = { 0x48004, 14, 13, 0x00, 0x02 }, + .pipe_rxterm_sel = { 0x48008, 8, 8, 0x00, 0x01 }, + .pipe_txelec_sel = { 0x48008, 12, 12, 0x00, 0x01 }, + .pipe_txcomp_sel = { 0x48008, 15, 15, 0x00, 0x01 }, + .pipe_clk_ext = { 0x4800c, 9, 8, 0x02, 0x01 }, + .pipe_phy_status = { 0x48034, 6, 6, 0x01, 0x00 }, + .con0_for_pcie = { 0x48000, 15, 0, 0x00, 0x110 }, + .con1_for_pcie = { 0x48004, 15, 0, 0x00, 0x00 }, + .con2_for_pcie = { 0x48008, 15, 0, 0x00, 0x101 }, + .con3_for_pcie = { 0x4800c, 15, 0, 0x00, 0x0200 }, + /* pipe-grf */ + .u3otg0_port_en = { 0x40044, 15, 0, 0x0181, 0x1100 }, +}; + +static const struct rockchip_combphy_cfg rk3528_combphy_cfgs = { + .grfcfg = &rk3528_combphy_grfcfgs, + .combphy_cfg = rk3528_combphy_cfg, +}; + +static int rk3562_combphy_cfg(struct rockchip_combphy_priv *priv) +{ + const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; + u32 val; + + switch (priv->mode) { + case PHY_TYPE_PCIE: + /* Set SSC downward spread spectrum */ + val = readl(priv->mmio + (0x1f << 2)); + val &= ~GENMASK(5, 4); + val |= 0x01 << 4; + writel(val, priv->mmio + 0x7c); + + param_write(priv->phy_grf, &cfg->con0_for_pcie, true); + param_write(priv->phy_grf, &cfg->con1_for_pcie, true); + param_write(priv->phy_grf, &cfg->con2_for_pcie, true); + param_write(priv->phy_grf, &cfg->con3_for_pcie, true); + break; + case PHY_TYPE_USB3: + /* Set SSC downward spread spectrum */ + val = readl(priv->mmio + (0x1f << 2)); + val &= ~GENMASK(5, 4); + val |= 0x01 << 4; + writel(val, priv->mmio + 0x7c); + + /* Enable adaptive CTLE for USB3.0 Rx */ + val = readl(priv->mmio + (0x0e << 2)); + val &= ~GENMASK(0, 0); + val |= 0x01; + writel(val, priv->mmio + (0x0e << 2)); + + /* Set PLL KVCO fine tuning signals */ + val = readl(priv->mmio + (0x20 << 2)); + val &= ~(0x7 << 2); + val |= 0x2 << 2; + writel(val, priv->mmio + (0x20 << 2)); + + /* Set PLL LPF R1 to su_trim[10:7]=1001 */ + writel(0x4, priv->mmio + (0xb << 2)); + + /* Set PLL input clock divider 1/2 */ + val = readl(priv->mmio + (0x5 << 2)); + val &= ~(0x3 << 6); + val |= 0x1 << 6; + writel(val, priv->mmio + (0x5 << 2)); + + /* Set PLL loop divider */ + writel(0x32, priv->mmio + (0x11 << 2)); + + /* Set PLL KVCO to min and set PLL charge pump current to max */ + writel(0xf0, priv->mmio + (0xa << 2)); + + param_write(priv->phy_grf, &cfg->pipe_sel_usb, true); + param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false); + param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false); + param_write(priv->phy_grf, &cfg->usb_mode_set, true); + break; + default: + pr_err("%s, phy-type %d\n", __func__, priv->mode); + return -EINVAL; + } + + clk_set_rate(&priv->ref_clk, 100000000); + param_write(priv->phy_grf, &cfg->pipe_clk_100m, true); + + if (priv->mode == PHY_TYPE_PCIE) { + /* PLL KVCO tuning fine */ + val = readl(priv->mmio + (0x20 << 2)); + val &= ~(0x7 << 2); + val |= 0x2 << 2; + writel(val, priv->mmio + (0x20 << 2)); + + /* Enable controlling random jitter, aka RMJ */ + writel(0x4, priv->mmio + (0xb << 2)); + + val = readl(priv->mmio + (0x5 << 2)); + val &= ~(0x3 << 6); + val |= 0x1 << 6; + writel(val, priv->mmio + (0x5 << 2)); + + writel(0x32, priv->mmio + (0x11 << 2)); + writel(0xf0, priv->mmio + (0xa << 2)); + } + + if (dev_read_bool(priv->dev, "rockchip,enable-ssc")) { + val = readl(priv->mmio + (0x7 << 2)); + val |= BIT(4); + writel(val, priv->mmio + (0x7 << 2)); + } + + return 0; +} + +static const struct rockchip_combphy_grfcfg rk3562_combphy_grfcfgs = { + /* pipe-phy-grf */ + .pcie_mode_set = { 0x0000, 5, 0, 0x00, 0x11 }, + .usb_mode_set = { 0x0000, 5, 0, 0x00, 0x04 }, + .pipe_rxterm_set = { 0x0000, 12, 12, 0x00, 0x01 }, + .pipe_txelec_set = { 0x0004, 1, 1, 0x00, 0x01 }, + .pipe_txcomp_set = { 0x0004, 4, 4, 0x00, 0x01 }, + .pipe_clk_25m = { 0x0004, 14, 13, 0x00, 0x01 }, + .pipe_clk_100m = { 0x0004, 14, 13, 0x00, 0x02 }, + .pipe_phymode_sel = { 0x0008, 1, 1, 0x00, 0x01 }, + .pipe_rate_sel = { 0x0008, 2, 2, 0x00, 0x01 }, + .pipe_rxterm_sel = { 0x0008, 8, 8, 0x00, 0x01 }, + .pipe_txelec_sel = { 0x0008, 12, 12, 0x00, 0x01 }, + .pipe_txcomp_sel = { 0x0008, 15, 15, 0x00, 0x01 }, + .pipe_clk_ext = { 0x000c, 9, 8, 0x02, 0x01 }, + .pipe_sel_usb = { 0x000c, 14, 13, 0x00, 0x01 }, + .pipe_phy_status = { 0x0034, 6, 6, 0x01, 0x00 }, + .con0_for_pcie = { 0x0000, 15, 0, 0x00, 0x1000 }, + .con1_for_pcie = { 0x0004, 15, 0, 0x00, 0x0000 }, + .con2_for_pcie = { 0x0008, 15, 0, 0x00, 0x0101 }, + .con3_for_pcie = { 0x000c, 15, 0, 0x00, 0x0200 }, + .pipe_phy_grf_reset = { 0x0014, 1, 0, 0x3, 0x1 }, + /* pipe-grf */ + .u3otg0_port_en = { 0x0094, 15, 0, 0x0181, 0x1100 }, +}; + +static const struct rockchip_combphy_cfg rk3562_combphy_cfgs = { + .grfcfg = &rk3562_combphy_grfcfgs, + .combphy_cfg = rk3562_combphy_cfg, +}; static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv) { @@ -565,6 +784,14 @@ static const struct udevice_id rockchip_combphy_ids[] = { { + .compatible = "rockchip,rk3528-naneng-combphy", + .data = (ulong)&rk3528_combphy_cfgs + }, + { + .compatible = "rockchip,rk3562-naneng-combphy", + .data = (ulong)&rk3562_combphy_cfgs + }, + { .compatible = "rockchip,rk3568-naneng-combphy", .data = (ulong)&rk3568_combphy_cfgs }, diff --git a/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c b/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c index 4044db6..bc718d0 100644 --- a/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c +++ b/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c @@ -592,9 +592,21 @@ struct phy_configure_opts_dp *dp) { u8 lane; + u32 status; + int ret; for (lane = 0; lane < dp->lanes; lane++) rockchip_hdptx_phy_set_voltage(hdptx, dp, lane); + + reset_deassert(&hdptx->lane_reset); + + ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0, + status, FIELD_GET(PHY_RDY, status), + 50, 5000); + if (ret) { + dev_err(hdptx->dev, "timeout waiting for phy_rdy\n"); + return ret; + } return 0; } @@ -676,17 +688,6 @@ regmap_update_bits(hdptx->regmap, 0x081c, LANE_EN, FIELD_PREP(LANE_EN, GENMASK(dp->lanes - 1, 0))); - - reset_deassert(&hdptx->lane_reset); - udelay(10); - - ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0, - status, FIELD_GET(PHY_RDY, status), - 50, 1000); - if (ret) { - dev_err(hdptx->dev, "timeout waiting for phy_rdy\n"); - return ret; - } return 0; } diff --git a/u-boot/drivers/phy/phy-rockchip-usbdp.c b/u-boot/drivers/phy/phy-rockchip-usbdp.c index 7b624f8..cefceff 100644 --- a/u-boot/drivers/phy/phy-rockchip-usbdp.c +++ b/u-boot/drivers/phy/phy-rockchip-usbdp.c @@ -549,14 +549,15 @@ return 0; } -static int udphy_parse_lane_mux_data(struct rockchip_udphy *udphy, const struct device_node *np) +static int udphy_parse_lane_mux_data(struct rockchip_udphy *udphy, struct udevice *dev) { + const struct device_node *np = ofnode_to_np(dev->node); struct property *prop; int ret, i, len, num_lanes; prop = of_find_property(np, "rockchip,dp-lane-mux", &len); if (!prop) { - dev_dbg(udphy->dev, "failed to find dp lane mux, following dp alt mode\n"); + dev_dbg(dev, "failed to find dp lane mux, following dp alt mode\n"); udphy->mode = UDPHY_MODE_USB; return 0; } @@ -564,13 +565,13 @@ num_lanes = len / sizeof(u32); if (num_lanes != 2 && num_lanes != 4) { - dev_err(udphy->dev, "invalid number of lane mux\n"); + dev_err(dev, "invalid number of lane mux\n"); return -EINVAL; } ret = of_read_u32_array(np, "rockchip,dp-lane-mux", udphy->dp_lane_sel, num_lanes); if (ret) { - dev_err(udphy->dev, "get dp lane mux failed\n"); + dev_err(dev, "get dp lane mux failed\n"); return -EINVAL; } @@ -578,7 +579,7 @@ int j; if (udphy->dp_lane_sel[i] > 3) { - dev_err(udphy->dev, "lane mux between 0 and 3, exceeding the range\n"); + dev_err(dev, "lane mux between 0 and 3, exceeding the range\n"); return -EINVAL; } @@ -586,22 +587,23 @@ for (j = i + 1; j < num_lanes; j++) { if (udphy->dp_lane_sel[i] == udphy->dp_lane_sel[j]) { - dev_err(udphy->dev, "set repeat lane mux value\n"); + dev_err(dev, "set repeat lane mux value\n"); return -EINVAL; } } } udphy->mode = UDPHY_MODE_DP; - if (num_lanes == 2) + if (num_lanes == 2) { udphy->mode |= UDPHY_MODE_USB; + udphy->flip = udphy->lane_mux_sel[0] == PHY_LANE_MUX_DP ? true : false; + } return 0; } static int udphy_parse_dt(struct rockchip_udphy *udphy, struct udevice *dev) { - const struct device_node *np = ofnode_to_np(dev->node); enum usb_device_speed maximum_speed; int ret; @@ -645,7 +647,7 @@ } } - ret = udphy_parse_lane_mux_data(udphy, np); + ret = udphy_parse_lane_mux_data(udphy, dev); if (ret) return ret; @@ -947,7 +949,7 @@ dev_for_each_subnode(subnode, parent) { if (!ofnode_valid(subnode)) { - printf("%s: no subnode for %s", __func__, parent->name); + printf("%s: no subnode for %s\n", __func__, parent->name); return -ENXIO; } @@ -1014,14 +1016,14 @@ val & TRSV_LN0_MON_RX_CDR_LOCK_DONE, 200, 100); if (ret) - dev_err(udphy->dev, "trsv ln0 mon rx cdr lock timeout\n"); + dev_notice(udphy->dev, "trsv ln0 mon rx cdr lock timeout\n"); } else { ret = regmap_read_poll_timeout(udphy->pma_regmap, TRSV_LN2_MON_RX_CDR_DONE_OFFSET, val, val & TRSV_LN2_MON_RX_CDR_LOCK_DONE, 200, 100); if (ret) - dev_err(udphy->dev, "trsv ln2 mon rx cdr lock timeout\n"); + dev_notice(udphy->dev, "trsv ln2 mon rx cdr lock timeout\n"); } } diff --git a/u-boot/drivers/pinctrl/Kconfig b/u-boot/drivers/pinctrl/Kconfig index b6c741c..4899c71 100644 --- a/u-boot/drivers/pinctrl/Kconfig +++ b/u-boot/drivers/pinctrl/Kconfig @@ -145,14 +145,6 @@ This option is to enable the pinctrl driver for Maxim MAX96745. -config PINCTRL_MAX96752F - bool "Maxim MAX96752F pinctrl driver" - depends on DM && I2C_MUX_MAX96752F - select PINCONF - help - This option is to enable the pinctrl driver for Maxim - MAX96752F. - config PINCTRL_MAX96755F bool "Maxim MAX96755F pinctrl driver" depends on DM && I2C_MUX_MAX96755F diff --git a/u-boot/drivers/pinctrl/Makefile b/u-boot/drivers/pinctrl/Makefile index 6fd7798..23f26a6 100644 --- a/u-boot/drivers/pinctrl/Makefile +++ b/u-boot/drivers/pinctrl/Makefile @@ -24,6 +24,5 @@ obj-$(CONFIG_PINCTRL_STM32) += pinctrl_stm32.o ifndef CONFIG_SPL_BUILD obj-$(CONFIG_PINCTRL_MAX96745) += pinctrl-max96745.o -obj-$(CONFIG_PINCTRL_MAX96752F) += pinctrl-max96752f.o obj-$(CONFIG_PINCTRL_MAX96755F) += pinctrl-max96755f.o endif diff --git a/u-boot/drivers/pinctrl/pinctrl-max96752f.c b/u-boot/drivers/pinctrl/pinctrl-max96752f.c deleted file mode 100644 index e24df35..0000000 --- a/u-boot/drivers/pinctrl/pinctrl-max96752f.c +++ /dev/null @@ -1,491 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2022 Rockchip Electronics Co., Ltd - */ - -#include <common.h> -#include <dm.h> -#include <dm/pinctrl.h> -#include <errno.h> -#include <i2c.h> -#include <max96752f.h> - -struct config_desc { - u16 reg; - u8 mask; - u8 val; -}; - -struct function_desc { - const char *name; - const char **group_names; - int num_group_names; - - u8 gpio_out_dis:1; - u8 gpio_tx_en:1; - u8 gpio_rx_en:1; - u8 oldi:1; - u8 gpio_tx_id; - u8 gpio_rx_id; -}; - -struct group_desc { - const char *name; - int *pins; - int num_pins; - - const struct config_desc *configs; - int num_configs; -}; - -struct pin_desc { - unsigned number; - const char *name; -}; - -static const struct pin_desc max96752f_pins[] = { - {0, "oldi"}, - {1, "gpio1"}, - {2, "gpio2"}, - {3, "gpio3"}, - {4, "gpio4"}, - {5, "gpio5"}, - {6, "gpio6"}, - {7, "gpio7"}, - {8, "gpio8"}, - {9, "gpio9"}, - {10, "gpio10"}, - {11, "gpio11"}, - {12, "gpio12"}, - {13, "gpio13"}, - {14, "gpio14"}, - {15, "gpio15"}, -}; - -static int oldi_pins[] = {0}; -static int gpio1_pins[] = {1}; -static int gpio2_pins[] = {2}; -static int gpio3_pins[] = {3}; -static int gpio4_pins[] = {4}; -static int gpio5_pins[] = {5}; -static int gpio6_pins[] = {6}; -static int gpio7_pins[] = {7}; -static int gpio8_pins[] = {8}; -static int gpio9_pins[] = {9}; -static int gpio10_pins[] = {10}; -static int gpio11_pins[] = {11}; -static int gpio12_pins[] = {12}; -static int gpio13_pins[] = {13}; -static int gpio14_pins[] = {14}; -static int gpio15_pins[] = {15}; - -#define GROUP_DESC(nm) \ -{ \ - .name = #nm, \ - .pins = nm ## _pins, \ - .num_pins = ARRAY_SIZE(nm ## _pins), \ -} - -#define GROUP_DESC_CONFIG(nm) \ -{ \ - .name = #nm, \ - .pins = nm ## _pins, \ - .num_pins = ARRAY_SIZE(nm ## _pins), \ - .configs = nm ## _configs, \ - .num_configs = ARRAY_SIZE(nm ## _configs), \ -} - -static const struct config_desc gpio6_configs[] = { - { 0x0002, AUD_TX_EN, 0 }, -}; - -static const struct config_desc gpio7_configs[] = { - { 0x0002, AUD_TX_EN, 0 }, -}; - -static const struct config_desc gpio8_configs[] = { - { 0x0002, AUD_TX_EN, 0 }, -}; - -static const struct config_desc gpio11_configs[] = { - { 0x0140, AUD_RX_EN, 0 }, -}; - -static const struct config_desc gpio12_configs[] = { - { 0x0140, AUD_RX_EN, 0 }, -}; - -static const struct config_desc gpio13_configs[] = { - { 0x0140, AUD_RX_EN, 0 }, -}; - -static const struct group_desc max96752f_groups[] = { - GROUP_DESC(oldi), - GROUP_DESC(gpio1), - GROUP_DESC(gpio2), - GROUP_DESC(gpio3), - GROUP_DESC(gpio4), - GROUP_DESC(gpio5), - GROUP_DESC_CONFIG(gpio6), - GROUP_DESC_CONFIG(gpio7), - GROUP_DESC_CONFIG(gpio8), - GROUP_DESC(gpio9), - GROUP_DESC(gpio10), - GROUP_DESC_CONFIG(gpio11), - GROUP_DESC_CONFIG(gpio12), - GROUP_DESC_CONFIG(gpio13), - GROUP_DESC(gpio14), - GROUP_DESC(gpio15), -}; - -static const char *gpio_groups[] = { - "reserved", "gpio1", "gpio2", "gpio3", "gpio4", - "gpio5", "gpio6", "gpio7", "gpio8", "gpio9", - "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", - "gpio15", -}; - -static const char *oldi_groups[] = { "oldi" }; - -#define FUNCTION_DESC_GPIO_RX(id) \ -{ \ - .name = "GPIO_RX_"#id, \ - .group_names = gpio_groups, \ - .num_group_names = ARRAY_SIZE(gpio_groups), \ - .gpio_rx_en = 1, \ - .gpio_rx_id = id, \ -} \ - -#define FUNCTION_DESC_GPIO_TX(id) \ -{ \ - .name = "GPIO_TX_"#id, \ - .group_names = gpio_groups, \ - .num_group_names = ARRAY_SIZE(gpio_groups), \ - .gpio_out_dis = 1, \ - .gpio_tx_en = 1, \ - .gpio_tx_id = id \ -} \ - -#define FUNCTION_DESC_GPIO() \ -{ \ - .name = "GPIO", \ - .group_names = gpio_groups, \ - .num_group_names = ARRAY_SIZE(gpio_groups), \ -} \ - -#define FUNCTION_DESC_OLDI() \ -{ \ - .name = "OLDI", \ - .group_names = oldi_groups, \ - .num_group_names = ARRAY_SIZE(oldi_groups), \ - .oldi = 1, \ -} \ - -static const struct function_desc max96752f_functions[] = { - FUNCTION_DESC_GPIO_TX(0), - FUNCTION_DESC_GPIO_TX(1), - FUNCTION_DESC_GPIO_TX(2), - FUNCTION_DESC_GPIO_TX(3), - FUNCTION_DESC_GPIO_TX(4), - FUNCTION_DESC_GPIO_TX(5), - FUNCTION_DESC_GPIO_TX(6), - FUNCTION_DESC_GPIO_TX(7), - FUNCTION_DESC_GPIO_TX(8), - FUNCTION_DESC_GPIO_TX(9), - FUNCTION_DESC_GPIO_TX(10), - FUNCTION_DESC_GPIO_TX(11), - FUNCTION_DESC_GPIO_TX(12), - FUNCTION_DESC_GPIO_TX(13), - FUNCTION_DESC_GPIO_TX(14), - FUNCTION_DESC_GPIO_TX(15), - FUNCTION_DESC_GPIO_TX(16), - FUNCTION_DESC_GPIO_TX(17), - FUNCTION_DESC_GPIO_TX(18), - FUNCTION_DESC_GPIO_TX(19), - FUNCTION_DESC_GPIO_TX(20), - FUNCTION_DESC_GPIO_TX(21), - FUNCTION_DESC_GPIO_TX(22), - FUNCTION_DESC_GPIO_TX(23), - FUNCTION_DESC_GPIO_TX(24), - FUNCTION_DESC_GPIO_TX(25), - FUNCTION_DESC_GPIO_TX(26), - FUNCTION_DESC_GPIO_TX(27), - FUNCTION_DESC_GPIO_TX(28), - FUNCTION_DESC_GPIO_TX(29), - FUNCTION_DESC_GPIO_TX(30), - FUNCTION_DESC_GPIO_TX(31), - FUNCTION_DESC_GPIO_RX(0), - FUNCTION_DESC_GPIO_RX(1), - FUNCTION_DESC_GPIO_RX(2), - FUNCTION_DESC_GPIO_RX(3), - FUNCTION_DESC_GPIO_RX(4), - FUNCTION_DESC_GPIO_RX(5), - FUNCTION_DESC_GPIO_RX(6), - FUNCTION_DESC_GPIO_RX(7), - FUNCTION_DESC_GPIO_RX(8), - FUNCTION_DESC_GPIO_RX(9), - FUNCTION_DESC_GPIO_RX(10), - FUNCTION_DESC_GPIO_RX(11), - FUNCTION_DESC_GPIO_RX(12), - FUNCTION_DESC_GPIO_RX(13), - FUNCTION_DESC_GPIO_RX(14), - FUNCTION_DESC_GPIO_RX(15), - FUNCTION_DESC_GPIO_RX(16), - FUNCTION_DESC_GPIO_RX(17), - FUNCTION_DESC_GPIO_RX(18), - FUNCTION_DESC_GPIO_RX(19), - FUNCTION_DESC_GPIO_RX(20), - FUNCTION_DESC_GPIO_RX(21), - FUNCTION_DESC_GPIO_RX(22), - FUNCTION_DESC_GPIO_RX(23), - FUNCTION_DESC_GPIO_RX(24), - FUNCTION_DESC_GPIO_RX(25), - FUNCTION_DESC_GPIO_RX(26), - FUNCTION_DESC_GPIO_RX(27), - FUNCTION_DESC_GPIO_RX(28), - FUNCTION_DESC_GPIO_RX(29), - FUNCTION_DESC_GPIO_RX(30), - FUNCTION_DESC_GPIO_RX(31), - FUNCTION_DESC_GPIO(), - FUNCTION_DESC_OLDI(), -}; - -static int max96752f_get_pins_count(struct udevice *dev) -{ - return ARRAY_SIZE(max96752f_pins); -} - -static const char *max96752f_get_pin_name(struct udevice *dev, - unsigned selector) -{ - return max96752f_pins[selector].name; -} - -static int max96752f_pinctrl_get_groups_count(struct udevice *dev) -{ - return ARRAY_SIZE(max96752f_groups); -} - -static const char *max96752f_pinctrl_get_group_name(struct udevice *dev, - unsigned selector) -{ - return max96752f_groups[selector].name; -} - -static int max96752f_pinctrl_get_functions_count(struct udevice *dev) -{ - return ARRAY_SIZE(max96752f_functions); -} - -static const char *max96752f_pinctrl_get_function_name(struct udevice *dev, - unsigned selector) -{ - return max96752f_functions[selector].name; -} - -static int max96752f_pinmux_set(struct udevice *dev, unsigned group_selector, - unsigned func_selector) -{ - const struct group_desc *grp = &max96752f_groups[group_selector]; - const struct function_desc *func = &max96752f_functions[func_selector]; - int i, ret; - - if (func->oldi) - return 0; - - for (i = 0; i < grp->num_configs; i++) { - const struct config_desc *config = &grp->configs[i]; - - ret = dm_i2c_reg_clrset(dev->parent, config->reg, config->mask, - config->val); - if (ret < 0) - return ret; - } - - for (i = 0; i < grp->num_pins; i++) { - ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(grp->pins[i]), - GPIO_OUT_DIS | GPIO_RX_EN | GPIO_TX_EN, - FIELD_PREP(GPIO_OUT_DIS, func->gpio_out_dis) | - FIELD_PREP(GPIO_RX_EN, func->gpio_rx_en) | - FIELD_PREP(GPIO_TX_EN, func->gpio_tx_en)); - if (ret < 0) - return ret; - - if (func->gpio_tx_en) { - ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(grp->pins[i]), - GPIO_TX_ID, - FIELD_PREP(GPIO_TX_ID, func->gpio_tx_id)); - if (ret < 0) - return ret; - } - - if (func->gpio_rx_en) { - ret = dm_i2c_reg_clrset(dev->parent, - GPIO_C_REG(grp->pins[i]), - GPIO_RX_ID, - FIELD_PREP(GPIO_RX_ID, func->gpio_rx_id)); - if (ret < 0) - return ret; - } - } - - return 0; -} - -#define PIN_CONFIG_OLDI_SPL_EN (PIN_CONFIG_END + 1) -#define PIN_CONFIG_OLDI_SWAP_AB (PIN_CONFIG_END + 2) - -static const struct pinconf_param max96752f_pinconf_params[] = { - { "drive-open-drain", PIN_CONFIG_DRIVE_OPEN_DRAIN, 0 }, - { "drive-push-pull", PIN_CONFIG_DRIVE_PUSH_PULL, 0 }, - { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 }, - { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 40000 }, - { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 40000 }, - { "output-low", PIN_CONFIG_OUTPUT, 0 }, - { "output-high", PIN_CONFIG_OUTPUT, 1 }, - { "oldi-spl-en", PIN_CONFIG_OLDI_SPL_EN, 0 }, - { "oldi-swap-ab", PIN_CONFIG_OLDI_SWAP_AB, 0 }, -}; - -static int max96752f_pinconf_set(struct udevice *dev, unsigned int pin, - unsigned int param, unsigned int arg) -{ - u8 res_cfg; - int ret; - - switch (param) { - case PIN_CONFIG_DRIVE_OPEN_DRAIN: - ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(pin), OUT_TYPE, - FIELD_PREP(OUT_TYPE, 0)); - if (ret < 0) - return ret; - - break; - case PIN_CONFIG_DRIVE_PUSH_PULL: - ret = dm_i2c_reg_clrset(dev->parent, GPIO_B_REG(pin), OUT_TYPE, - FIELD_PREP(OUT_TYPE, 1)); - if (ret < 0) - return ret; - - break; - case PIN_CONFIG_BIAS_DISABLE: - ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin), - PULL_UPDN_SEL, - FIELD_PREP(PULL_UPDN_SEL, 0)); - if (ret < 0) - return ret; - - break; - case PIN_CONFIG_BIAS_PULL_UP: - switch (arg) { - case 40000: - res_cfg = 0; - break; - case 1000000: - res_cfg = 1; - break; - default: - return -EINVAL; - } - - ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin), RES_CFG, - FIELD_PREP(RES_CFG, res_cfg)); - if (ret < 0) - return ret; - - ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin), - PULL_UPDN_SEL, - FIELD_PREP(PULL_UPDN_SEL, 1)); - if (ret < 0) - return ret; - - break; - case PIN_CONFIG_BIAS_PULL_DOWN: - switch (arg) { - case 40000: - res_cfg = 0; - break; - case 1000000: - res_cfg = 1; - break; - default: - return -EINVAL; - } - - ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin), RES_CFG, - FIELD_PREP(RES_CFG, res_cfg)); - if (ret < 0) - return ret; - - ret = dm_i2c_reg_clrset(dev->parent, GPIO_C_REG(pin), - PULL_UPDN_SEL, - FIELD_PREP(PULL_UPDN_SEL, 2)); - if (ret < 0) - return ret; - - break; - case PIN_CONFIG_OUTPUT: - ret = dm_i2c_reg_clrset(dev->parent, GPIO_A_REG(pin), - GPIO_OUT_DIS | GPIO_OUT, - FIELD_PREP(GPIO_OUT_DIS, 0) | - FIELD_PREP(GPIO_OUT, arg)); - if (ret < 0) - return ret; - - break; - case PIN_CONFIG_OLDI_SPL_EN: - if (pin > 0) - return -EINVAL; - - ret = dm_i2c_reg_clrset(dev->parent, OLDI_REG(1), - OLDI_SPL_EN | OLDI_SPL_POL, - FIELD_PREP(OLDI_SPL_EN, 1) | - FIELD_PREP(OLDI_SPL_POL, 0)); - if (ret < 0) - return ret; - - break; - case PIN_CONFIG_OLDI_SWAP_AB: - if (pin > 0) - return -EINVAL; - - ret = dm_i2c_reg_clrset(dev->parent, OLDI_REG(1), OLDI_SWAP_AB, - FIELD_PREP(OLDI_SWAP_AB, 1)); - if (ret < 0) - return ret; - - break; - default: - dev_err(dev, "unsupported configuration parameter %u\n", param); - return -ENOTSUPP; - } - - return 0; -} - -static const struct pinctrl_ops max96752f_pinctrl_ops = { - .get_pins_count = max96752f_get_pins_count, - .get_pin_name = max96752f_get_pin_name, - .get_groups_count = max96752f_pinctrl_get_groups_count, - .get_group_name = max96752f_pinctrl_get_group_name, - .get_functions_count = max96752f_pinctrl_get_functions_count, - .get_function_name = max96752f_pinctrl_get_function_name, - .set_state = pinctrl_generic_set_state, - .pinmux_set = max96752f_pinmux_set, - .pinmux_group_set = max96752f_pinmux_set, - .pinconf_num_params = ARRAY_SIZE(max96752f_pinconf_params), - .pinconf_params = max96752f_pinconf_params, - .pinconf_set = max96752f_pinconf_set, -}; - -static const struct udevice_id max96752f_pinctrl_of_match[] = { - { .compatible = "maxim,max96752f-pinctrl" }, - { } -}; - -U_BOOT_DRIVER(max96752f_pinctrl) = { - .name = "pinctrl-max96752f", - .id = UCLASS_PINCTRL, - .of_match = max96752f_pinctrl_of_match, - .ops = &max96752f_pinctrl_ops, -}; diff --git a/u-boot/drivers/pinctrl/rockchip/Makefile b/u-boot/drivers/pinctrl/rockchip/Makefile index 9b3c7fc..b82e92b 100644 --- a/u-boot/drivers/pinctrl/rockchip/Makefile +++ b/u-boot/drivers/pinctrl/rockchip/Makefile @@ -12,6 +12,8 @@ #obj-$(CONFIG_ROCKCHIP_RK3328) += pinctrl-rk3328.o #obj-$(CONFIG_ROCKCHIP_RK3368) += pinctrl-rk3368.o #obj-$(CONFIG_ROCKCHIP_RK3399) += pinctrl-rk3399.o +obj-$(CONFIG_ROCKCHIP_RK3528) += pinctrl-rk3528.o +obj-$(CONFIG_ROCKCHIP_RK3562) += pinctrl-rk3562.o obj-$(CONFIG_ROCKCHIP_RK3568) += pinctrl-rk3568.o obj-$(CONFIG_ROCKCHIP_RK3588) += pinctrl-rk3588.o obj-$(CONFIG_ROCKCHIP_RV1106) += pinctrl-rv1106.o diff --git a/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3528.c b/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3528.c new file mode 100644 index 0000000..33d44c9 --- /dev/null +++ b/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3528.c @@ -0,0 +1,313 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + */ + +#include <common.h> +#include <dm.h> +#include <dm/pinctrl.h> +#include <regmap.h> +#include <syscon.h> + +#include "pinctrl-rockchip.h" + +static int rk3528_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) +{ + struct rockchip_pinctrl_priv *priv = bank->priv; + int iomux_num = (pin / 8); + struct regmap *regmap; + int reg, ret, mask; + u8 bit; + u32 data; + + debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux); + + regmap = priv->regmap_base; + reg = bank->iomux[iomux_num].offset; + if ((pin % 8) >= 4) + reg += 0x4; + bit = (pin % 4) * 4; + mask = 0xf; + + data = (mask << (bit + 16)); + data |= (mux & mask) << bit; + + debug("iomux write reg = %x data = %x\n", reg, data); + + ret = regmap_write(regmap, reg, data); + + return ret; +} + +#define RK3528_DRV_BITS_PER_PIN 8 +#define RK3528_DRV_PINS_PER_REG 2 +#define RK3528_DRV_GPIO0_OFFSET 0x100 +#define RK3528_DRV_GPIO1_OFFSET 0x20120 +#define RK3528_DRV_GPIO2_OFFSET 0x30160 +#define RK3528_DRV_GPIO3_OFFSET 0x20190 +#define RK3528_DRV_GPIO4_OFFSET 0x101C0 + +static void rk3528_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, + int pin_num, struct regmap **regmap, + int *reg, u8 *bit) +{ + struct rockchip_pinctrl_priv *priv = bank->priv; + + *regmap = priv->regmap_base; + switch (bank->bank_num) { + case 0: + *reg = RK3528_DRV_GPIO0_OFFSET; + break; + + case 1: + *reg = RK3528_DRV_GPIO1_OFFSET; + break; + + case 2: + *reg = RK3528_DRV_GPIO2_OFFSET; + break; + + case 3: + *reg = RK3528_DRV_GPIO3_OFFSET; + break; + + case 4: + *reg = RK3528_DRV_GPIO4_OFFSET; + break; + + default: + *reg = 0; + dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num); + break; + } + + *reg += ((pin_num / RK3528_DRV_PINS_PER_REG) * 4); + *bit = pin_num % RK3528_DRV_PINS_PER_REG; + *bit *= RK3528_DRV_BITS_PER_PIN; +} + +static int rk3528_set_drive(struct rockchip_pin_bank *bank, + int pin_num, int strength) +{ + struct regmap *regmap; + int reg, ret; + u32 data; + u8 bit; + int drv = (1 << (strength + 1)) - 1; + + rk3528_calc_drv_reg_and_bit(bank, pin_num, ®map, ®, &bit); + + /* enable the write to the equivalent lower bits */ + data = ((1 << RK3528_DRV_BITS_PER_PIN) - 1) << (bit + 16); + data |= (drv << bit); + ret = regmap_write(regmap, reg, data); + + return ret; +} + +#define RK3528_PULL_BITS_PER_PIN 2 +#define RK3528_PULL_PINS_PER_REG 8 +#define RK3528_PULL_GPIO0_OFFSET 0x200 +#define RK3528_PULL_GPIO1_OFFSET 0x20210 +#define RK3528_PULL_GPIO2_OFFSET 0x30220 +#define RK3528_PULL_GPIO3_OFFSET 0x20230 +#define RK3528_PULL_GPIO4_OFFSET 0x10240 + +static void rk3528_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, + int pin_num, struct regmap **regmap, + int *reg, u8 *bit) +{ + struct rockchip_pinctrl_priv *priv = bank->priv; + + *regmap = priv->regmap_base; + switch (bank->bank_num) { + case 0: + *reg = RK3528_PULL_GPIO0_OFFSET; + break; + + case 1: + *reg = RK3528_PULL_GPIO1_OFFSET; + break; + + case 2: + *reg = RK3528_PULL_GPIO2_OFFSET; + break; + + case 3: + *reg = RK3528_PULL_GPIO3_OFFSET; + break; + + case 4: + *reg = RK3528_PULL_GPIO4_OFFSET; + break; + + default: + *reg = 0; + dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num); + break; + } + + *reg += ((pin_num / RK3528_PULL_PINS_PER_REG) * 4); + *bit = pin_num % RK3528_PULL_PINS_PER_REG; + *bit *= RK3528_PULL_BITS_PER_PIN; +} + +static int rk3528_set_pull(struct rockchip_pin_bank *bank, + int pin_num, int pull) +{ + struct regmap *regmap; + int reg, ret; + u8 bit, type; + u32 data; + + if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT) + return -ENOTSUPP; + + rk3528_calc_pull_reg_and_bit(bank, pin_num, ®map, ®, &bit); + type = bank->pull_type[pin_num / 8]; + ret = rockchip_translate_pull_value(type, pull); + if (ret < 0) { + debug("unsupported pull setting %d\n", pull); + return ret; + } + + /* enable the write to the equivalent lower bits */ + data = ((1 << RK3528_PULL_BITS_PER_PIN) - 1) << (bit + 16); + + data |= (ret << bit); + ret = regmap_write(regmap, reg, data); + + return ret; +} + +#define RK3528_SMT_BITS_PER_PIN 1 +#define RK3528_SMT_PINS_PER_REG 8 +#define RK3528_SMT_GPIO0_OFFSET 0x400 +#define RK3528_SMT_GPIO1_OFFSET 0x20410 +#define RK3528_SMT_GPIO2_OFFSET 0x30420 +#define RK3528_SMT_GPIO3_OFFSET 0x20430 +#define RK3528_SMT_GPIO4_OFFSET 0x10440 + +static int rk3528_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, + int pin_num, + struct regmap **regmap, + int *reg, u8 *bit) +{ + struct rockchip_pinctrl_priv *priv = bank->priv; + + *regmap = priv->regmap_base; + switch (bank->bank_num) { + case 0: + *reg = RK3528_SMT_GPIO0_OFFSET; + break; + + case 1: + *reg = RK3528_SMT_GPIO1_OFFSET; + break; + + case 2: + *reg = RK3528_SMT_GPIO2_OFFSET; + break; + + case 3: + *reg = RK3528_SMT_GPIO3_OFFSET; + break; + + case 4: + *reg = RK3528_SMT_GPIO4_OFFSET; + break; + + default: + *reg = 0; + dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num); + break; + } + + *reg += ((pin_num / RK3528_SMT_PINS_PER_REG) * 4); + *bit = pin_num % RK3528_SMT_PINS_PER_REG; + *bit *= RK3528_SMT_BITS_PER_PIN; + return 0; +} + +static int rk3528_set_schmitt(struct rockchip_pin_bank *bank, + int pin_num, int enable) +{ + struct regmap *regmap; + int reg, ret; + u32 data; + u8 bit; + + rk3528_calc_schmitt_reg_and_bit(bank, pin_num, ®map, ®, &bit); + + /* enable the write to the equivalent lower bits */ + data = ((1 << RK3528_SMT_BITS_PER_PIN) - 1) << (bit + 16); + data |= (enable << bit); + ret = regmap_write(regmap, reg, data); + + return ret; +} + +static struct rockchip_pin_bank rk3528_pin_banks[] = { + PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0, 0, 0, 0), + PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0x20020, 0x20028, 0x20030, 0x20038), + PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0x30040, 0, 0, 0), + PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0x20060, 0x20068, 0x20070, 0), + PIN_BANK_IOMUX_FLAGS_OFFSET(4, 32, "gpio4", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0x10080, 0x10088, 0x10090, 0x10098), +}; + +static const struct rockchip_pin_ctrl rk3528_pin_ctrl = { + .pin_banks = rk3528_pin_banks, + .nr_banks = ARRAY_SIZE(rk3528_pin_banks), + .nr_pins = 160, + .grf_mux_offset = 0x0, + .set_mux = rk3528_set_mux, + .set_pull = rk3528_set_pull, + .set_drive = rk3528_set_drive, + .set_schmitt = rk3528_set_schmitt, +}; + +static const struct udevice_id rk3528_pinctrl_ids[] = { + { + .compatible = "rockchip,rk3528-pinctrl", + .data = (ulong)&rk3528_pin_ctrl + }, + { } +}; + +U_BOOT_DRIVER(pinctrl_rk3528) = { + .name = "rockchip_rk3528_pinctrl", + .id = UCLASS_PINCTRL, + .of_match = rk3528_pinctrl_ids, + .priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv), + .ops = &rockchip_pinctrl_ops, +#if !CONFIG_IS_ENABLED(OF_PLATDATA) + .bind = dm_scan_fdt_dev, +#endif + .probe = rockchip_pinctrl_probe, +}; + diff --git a/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3562.c b/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3562.c new file mode 100644 index 0000000..d81fb79 --- /dev/null +++ b/u-boot/drivers/pinctrl/rockchip/pinctrl-rk3562.c @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + */ + +#include <common.h> +#include <dm.h> +#include <dm/pinctrl.h> +#include <regmap.h> +#include <syscon.h> + +#include "pinctrl-rockchip.h" + +static int rk3562_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) +{ + struct rockchip_pinctrl_priv *priv = bank->priv; + int iomux_num = (pin / 8); + struct regmap *regmap; + int reg, ret, mask; + u8 bit; + u32 data; + + debug("setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux); + + regmap = priv->regmap_base; + reg = bank->iomux[iomux_num].offset; + if ((pin % 8) >= 4) + reg += 0x4; + bit = (pin % 4) * 4; + mask = 0xf; + + data = (mask << (bit + 16)); + data |= (mux & mask) << bit; + + /* force jtag m1 */ + if (bank->bank_num == 1) { + if ((pin == 13) || (pin == 14)) { + if (mux == 1) { + regmap_write(regmap, 0x504, 0x10001); + } else { + regmap_write(regmap, 0x504, 0x10000); + } + } + } + + debug("iomux write reg = %x data = %x\n", reg, data); + + ret = regmap_write(regmap, reg, data); + + return ret; +} + +#define RK3562_DRV_BITS_PER_PIN 8 +#define RK3562_DRV_PINS_PER_REG 2 +#define RK3562_DRV_GPIO0_OFFSET 0x20070 +#define RK3562_DRV_GPIO1_OFFSET 0x200 +#define RK3562_DRV_GPIO2_OFFSET 0x240 +#define RK3562_DRV_GPIO3_OFFSET 0x10280 +#define RK3562_DRV_GPIO4_OFFSET 0x102C0 + +static void rk3562_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, + int pin_num, struct regmap **regmap, + int *reg, u8 *bit) +{ + struct rockchip_pinctrl_priv *priv = bank->priv; + + *regmap = priv->regmap_base; + switch (bank->bank_num) { + case 0: + *reg = RK3562_DRV_GPIO0_OFFSET; + break; + + case 1: + *reg = RK3562_DRV_GPIO1_OFFSET; + break; + + case 2: + *reg = RK3562_DRV_GPIO2_OFFSET; + break; + + case 3: + *reg = RK3562_DRV_GPIO3_OFFSET; + break; + + case 4: + *reg = RK3562_DRV_GPIO4_OFFSET; + break; + + default: + *reg = 0; + dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num); + break; + } + + *reg += ((pin_num / RK3562_DRV_PINS_PER_REG) * 4); + *bit = pin_num % RK3562_DRV_PINS_PER_REG; + *bit *= RK3562_DRV_BITS_PER_PIN; +} + +static int rk3562_set_drive(struct rockchip_pin_bank *bank, + int pin_num, int strength) +{ + struct regmap *regmap; + int reg, ret; + u32 data; + u8 bit; + int drv = (1 << (strength + 1)) - 1; + + rk3562_calc_drv_reg_and_bit(bank, pin_num, ®map, ®, &bit); + + /* enable the write to the equivalent lower bits */ + data = ((1 << RK3562_DRV_BITS_PER_PIN) - 1) << (bit + 16); + data |= (drv << bit); + ret = regmap_write(regmap, reg, data); + + return ret; +} + +#define RK3562_PULL_BITS_PER_PIN 2 +#define RK3562_PULL_PINS_PER_REG 8 +#define RK3562_PULL_GPIO0_OFFSET 0x20020 +#define RK3562_PULL_GPIO1_OFFSET 0x80 +#define RK3562_PULL_GPIO2_OFFSET 0x90 +#define RK3562_PULL_GPIO3_OFFSET 0x100A0 +#define RK3562_PULL_GPIO4_OFFSET 0x100B0 + +static void rk3562_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, + int pin_num, struct regmap **regmap, + int *reg, u8 *bit) +{ + struct rockchip_pinctrl_priv *priv = bank->priv; + + *regmap = priv->regmap_base; + switch (bank->bank_num) { + case 0: + *reg = RK3562_PULL_GPIO0_OFFSET; + break; + + case 1: + *reg = RK3562_PULL_GPIO1_OFFSET; + break; + + case 2: + *reg = RK3562_PULL_GPIO2_OFFSET; + break; + + case 3: + *reg = RK3562_PULL_GPIO3_OFFSET; + break; + + case 4: + *reg = RK3562_PULL_GPIO4_OFFSET; + break; + + default: + *reg = 0; + dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num); + break; + } + + *reg += ((pin_num / RK3562_PULL_PINS_PER_REG) * 4); + *bit = pin_num % RK3562_PULL_PINS_PER_REG; + *bit *= RK3562_PULL_BITS_PER_PIN; +} + +static int rk3562_set_pull(struct rockchip_pin_bank *bank, + int pin_num, int pull) +{ + struct regmap *regmap; + int reg, ret; + u8 bit, type; + u32 data; + + if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT) + return -ENOTSUPP; + + rk3562_calc_pull_reg_and_bit(bank, pin_num, ®map, ®, &bit); + type = bank->pull_type[pin_num / 8]; + ret = rockchip_translate_pull_value(type, pull); + if (ret < 0) { + debug("unsupported pull setting %d\n", pull); + return ret; + } + + /* enable the write to the equivalent lower bits */ + data = ((1 << RK3562_PULL_BITS_PER_PIN) - 1) << (bit + 16); + + data |= (ret << bit); + ret = regmap_write(regmap, reg, data); + + return ret; +} + +#define RK3562_SMT_BITS_PER_PIN 2 +#define RK3562_SMT_PINS_PER_REG 8 +#define RK3562_SMT_GPIO0_OFFSET 0x20030 +#define RK3562_SMT_GPIO1_OFFSET 0xC0 +#define RK3562_SMT_GPIO2_OFFSET 0xD0 +#define RK3562_SMT_GPIO3_OFFSET 0x100E0 +#define RK3562_SMT_GPIO4_OFFSET 0x100F0 + +static int rk3562_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, + int pin_num, + struct regmap **regmap, + int *reg, u8 *bit) +{ + struct rockchip_pinctrl_priv *priv = bank->priv; + + *regmap = priv->regmap_base; + switch (bank->bank_num) { + case 0: + *reg = RK3562_SMT_GPIO0_OFFSET; + break; + + case 1: + *reg = RK3562_SMT_GPIO1_OFFSET; + break; + + case 2: + *reg = RK3562_SMT_GPIO2_OFFSET; + break; + + case 3: + *reg = RK3562_SMT_GPIO3_OFFSET; + break; + + case 4: + *reg = RK3562_SMT_GPIO4_OFFSET; + break; + + default: + *reg = 0; + dev_err(priv->dev, "unsupported bank_num %d\n", bank->bank_num); + break; + } + + *reg += ((pin_num / RK3562_SMT_PINS_PER_REG) * 4); + *bit = pin_num % RK3562_SMT_PINS_PER_REG; + *bit *= RK3562_SMT_BITS_PER_PIN; + + return 0; +} + +static int rk3562_set_schmitt(struct rockchip_pin_bank *bank, + int pin_num, int enable) +{ + struct regmap *regmap; + int reg, ret; + u32 data; + u8 bit; + + rk3562_calc_schmitt_reg_and_bit(bank, pin_num, ®map, ®, &bit); + + /* enable the write to the equivalent lower bits */ + data = ((1 << RK3562_SMT_BITS_PER_PIN) - 1) << (bit + 16); + data |= (enable << bit); + ret = regmap_write(regmap, reg, data); + + return ret; +} + +static struct rockchip_pin_bank rk3562_pin_banks[] = { + PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0x20000, 0x20008, 0x20010, 0x20018), + PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0, 0x08, 0x10, 0x18), + PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0x20, 0, 0, 0), + PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0x10040, 0x10048, 0x10050, 0x10058), + PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4", + IOMUX_WIDTH_4BIT, + IOMUX_WIDTH_4BIT, + 0, + 0, + 0x10060, 0x10068, 0, 0), +}; + +static const struct rockchip_pin_ctrl rk3562_pin_ctrl = { + .pin_banks = rk3562_pin_banks, + .nr_banks = ARRAY_SIZE(rk3562_pin_banks), + .nr_pins = 144, + .grf_mux_offset = 0x0, + .set_mux = rk3562_set_mux, + .set_pull = rk3562_set_pull, + .set_drive = rk3562_set_drive, + .set_schmitt = rk3562_set_schmitt, +}; + +static const struct udevice_id rk3562_pinctrl_ids[] = { + { + .compatible = "rockchip,rk3562-pinctrl", + .data = (ulong)&rk3562_pin_ctrl + }, + { } +}; + +U_BOOT_DRIVER(pinctrl_rk3562) = { + .name = "rockchip_rk3562_pinctrl", + .id = UCLASS_PINCTRL, + .of_match = rk3562_pinctrl_ids, + .priv_auto_alloc_size = sizeof(struct rockchip_pinctrl_priv), + .ops = &rockchip_pinctrl_ops, +#if !CONFIG_IS_ENABLED(OF_PLATDATA) + .bind = dm_scan_fdt_dev, +#endif + .probe = rockchip_pinctrl_probe, +}; diff --git a/u-boot/drivers/power/charge_animation.c b/u-boot/drivers/power/charge_animation.c index c16f40e..63c99a7 100644 --- a/u-boot/drivers/power/charge_animation.c +++ b/u-boot/drivers/power/charge_animation.c @@ -499,6 +499,7 @@ struct charge_animation_priv *priv = dev_get_priv(dev); struct udevice *fg = priv->fg; int voltage, soc, charging = 1; + int first_poll_fg = 1; static int timer_initialized; voltage = fuel_gauge_get_voltage(fg); @@ -506,6 +507,11 @@ return -EINVAL; while (voltage < pdata->low_power_voltage + 50) { + if (!first_poll_fg) + mdelay(FUEL_GAUGE_POLL_MS); + + first_poll_fg = 0; + /* Check charger online */ charging = fg_charger_get_chrg_online(dev); if (charging <= 0) { diff --git a/u-boot/drivers/power/pmic/rk8xx.c b/u-boot/drivers/power/pmic/rk8xx.c index e361015..19877f3 100644 --- a/u-boot/drivers/power/pmic/rk8xx.c +++ b/u-boot/drivers/power/pmic/rk8xx.c @@ -152,7 +152,8 @@ { RK817_PMIC_SYS_CFG1, 0x20, 0x70}, /* Set pmic_sleep as none function */ { RK817_PMIC_SYS_CFG3, 0x00, 0x18 }, - + /* GATE pin function: gate function */ + { RK817_GPIO_INT_CFG, 0x00, 0x20 }, #ifdef CONFIG_DM_CHARGE_DISPLAY /* Set pmic_int active low */ { RK817_GPIO_INT_CFG, 0x00, 0x02 }, @@ -408,6 +409,9 @@ val = dev_read_u32_default(dev, "not-save-power-en", 0); rk8xx->not_save_power_en = val; + val = dev_read_bool(dev, "vsys-off-shutdown"); + rk8xx->sys_can_sd = val; + return 0; } @@ -534,6 +538,16 @@ break; case RK809_ID: case RK817_ID: + if (device_is_compatible(dev, "rockchip,rk809") && (priv->variant != RK809_ID)) { + dev_err(dev, "the dts is RK809, the hardware is RK817\n"); + run_command("download", 0); + } + + if (device_is_compatible(dev, "rockchip,rk817") && (priv->variant != RK817_ID)) { + dev_err(dev, "the dts is RK817, the hardware is RK809\n"); + run_command("download", 0); + } + on_source = RK817_ON_SOURCE; off_source = RK817_OFF_SOURCE; pwron_key = RK817_PWRON_KEY; @@ -541,27 +555,46 @@ lp_act_msk = RK8XX_LP_ACTION_MSK; init_data = rk817_init_reg; init_data_num = ARRAY_SIZE(rk817_init_reg); + + /* whether the system voltage can be shutdown in PWR_off mode */ + if (priv->sys_can_sd) { + ret = rk8xx_read(dev, RK817_PMIC_CHRG_TERM, &value, 1); + if (ret) + return ret; + value |= 0x80; + ret = rk8xx_write(dev, RK817_PMIC_CHRG_TERM, &value, 1); + if (ret) + return ret; + } else { + ret = rk8xx_read(dev, RK817_PMIC_CHRG_TERM, &value, 1); + if (ret) + return ret; + value &= 0x7f; + ret = rk8xx_write(dev, RK817_PMIC_CHRG_TERM, &value, 1); + if (ret) + return ret; + } + /* judge whether save the PMIC_POWER_EN register */ - if (priv->not_save_power_en) - break; + if (!priv->not_save_power_en) { + ret = rk8xx_read(dev, RK817_POWER_EN0, &power_en0, 1); + if (ret) + return ret; + ret = rk8xx_read(dev, RK817_POWER_EN1, &power_en1, 1); + if (ret) + return ret; + ret = rk8xx_read(dev, RK817_POWER_EN2, &power_en2, 1); + if (ret) + return ret; + ret = rk8xx_read(dev, RK817_POWER_EN3, &power_en3, 1); + if (ret) + return ret; - ret = rk8xx_read(dev, RK817_POWER_EN0, &power_en0, 1); - if (ret) - return ret; - ret = rk8xx_read(dev, RK817_POWER_EN1, &power_en1, 1); - if (ret) - return ret; - ret = rk8xx_read(dev, RK817_POWER_EN2, &power_en2, 1); - if (ret) - return ret; - ret = rk8xx_read(dev, RK817_POWER_EN3, &power_en3, 1); - if (ret) - return ret; - - value = (power_en0 & 0x0f) | ((power_en1 & 0x0f) << 4); - rk8xx_write(dev, RK817_POWER_EN_SAVE0, &value, 1); - value = (power_en2 & 0x0f) | ((power_en3 & 0x0f) << 4); - rk8xx_write(dev, RK817_POWER_EN_SAVE1, &value, 1); + value = (power_en0 & 0x0f) | ((power_en1 & 0x0f) << 4); + rk8xx_write(dev, RK817_POWER_EN_SAVE0, &value, 1); + value = (power_en2 & 0x0f) | ((power_en3 & 0x0f) << 4); + rk8xx_write(dev, RK817_POWER_EN_SAVE1, &value, 1); + } break; default: printf("Unknown PMIC: RK%x!!\n", priv->variant); diff --git a/u-boot/drivers/power/regulator/fixed.c b/u-boot/drivers/power/regulator/fixed.c index c35ca2a..172eb56 100644 --- a/u-boot/drivers/power/regulator/fixed.c +++ b/u-boot/drivers/power/regulator/fixed.c @@ -45,10 +45,12 @@ gpio = &dev_pdata->gpio; ret = gpio_request_by_name(dev, "gpio", 0, gpio, flags); if (ret) { - debug("Fixed regulator optional enable GPIO - not found! Error: %d\n", - ret); - if (ret != -ENOENT) - return ret; + ret = gpio_request_by_name(dev, "gpios", 0, gpio, flags); + if (ret) { + debug("Fixed regulator optional enable GPIO - not found! Error: %d\n", ret); + if (ret != -ENOENT) + return ret; + } } /* Get optional ramp up delay */ diff --git a/u-boot/drivers/power/regulator/regulator-uclass.c b/u-boot/drivers/power/regulator/regulator-uclass.c index 4679249..0c692bb 100644 --- a/u-boot/drivers/power/regulator/regulator-uclass.c +++ b/u-boot/drivers/power/regulator/regulator-uclass.c @@ -8,7 +8,6 @@ #include <common.h> #include <errno.h> #include <dm.h> -#include <dm/device-internal.h> #include <dm/uclass-internal.h> #include <power/pmic.h> #include <power/regulator.h> @@ -413,16 +412,10 @@ if (regulator_name_is_unique(dev, uc_pdata->name)) return 0; -#ifdef CONFIG_USING_KERNEL_DTB - printf("Pre-reloc: %s\n", uc_pdata->name); - - return 0; -#else debug("'%s' of dev: '%s', has nonunique value: '%s\n", property, dev->name, uc_pdata->name); return -EINVAL; -#endif } static int regulator_pre_probe(struct udevice *dev) @@ -505,90 +498,6 @@ return ret; } -#ifdef CONFIG_USING_KERNEL_DTB -/* - * Skip probed pre-reloc regulators. - * - * Some regulator like fixed/gpio regultor applies a default output state - * when probed. It maybe reverse the state which was set by the pre-reloc - * regulator. Example: vcc3v3_pcie. - */ -int regulators_enable_boot_on(bool verbose) -{ - struct dm_regulator_uclass_platdata *uc_pdata; - struct udevice *dev; - struct uclass *uc; - char **pre_probed = NULL; - int i = 0, num = 0; - int ret; - bool skip; - - ret = uclass_get(UCLASS_REGULATOR, &uc); - if (ret) - return ret; - - /* find probed pre-reloc regulators */ - for (uclass_find_first_device(UCLASS_REGULATOR, &dev); - dev; - uclass_find_next_device(&dev)) { - if (!(dev->flags & DM_FLAG_KNRL_DTB) && - (dev->flags & DM_FLAG_ACTIVATED)) - num++; - } - if (num) { - pre_probed = calloc(num, sizeof(char *)); - if (!pre_probed) - return -ENOMEM; - - for (uclass_find_first_device(UCLASS_REGULATOR, &dev); - dev; - uclass_find_next_device(&dev)) { - if (!(dev->flags & DM_FLAG_KNRL_DTB) && - (dev->flags & DM_FLAG_ACTIVATED)) { - uc_pdata = dev_get_uclass_platdata(dev); - pre_probed[i++] = (char *)uc_pdata->name; - } - } - } - - /* Skip kernel regulators whose name matches probed pre-reloc regulators */ - for (uclass_find_first_device(UCLASS_REGULATOR, &dev); - dev; - uclass_find_next_device(&dev)) { - uc_pdata = dev_get_uclass_platdata(dev); - debug("%s: %s%s\n", __func__, uc_pdata->name, - dev->flags & DM_FLAG_KNRL_DTB ? "" : "*"); - if (dev->flags & DM_FLAG_KNRL_DTB) { - for (i = 0, skip = false; i < num; i++) { - if (!strcmp(pre_probed[i], uc_pdata->name)) { - skip = true; - break; - } - } - if (skip) - continue; - } - - /* Probe and init */ - ret = device_probe(dev); - if (ret) - continue; - ret = regulator_autoset(dev); - if (ret == -EMEDIUMTYPE) - ret = 0; - if (verbose) - regulator_show(dev, ret); - if (ret == -ENOSYS) - ret = 0; - } - - if (pre_probed) - free(pre_probed); - - return ret; -} - -#else int regulators_enable_boot_on(bool verbose) { struct udevice *dev; @@ -613,7 +522,6 @@ return ret; } -#endif UCLASS_DRIVER(regulator) = { .id = UCLASS_REGULATOR, diff --git a/u-boot/drivers/ram/rockchip/Makefile b/u-boot/drivers/ram/rockchip/Makefile index 48df397..5532a80 100644 --- a/u-boot/drivers/ram/rockchip/Makefile +++ b/u-boot/drivers/ram/rockchip/Makefile @@ -16,6 +16,8 @@ obj-$(CONFIG_ROCKCHIP_RK3308) += sdram_rv1108_pctl_phy.o sdram_rk3308.o obj-$(CONFIG_ROCKCHIP_RK3328) += sdram_rk3328.o sdram_pctl_px30.o sdram_phy_px30.o obj-$(CONFIG_ROCKCHIP_RK3399) += sdram_rk3399.o +obj-$(CONFIG_ROCKCHIP_RK3528) += sdram_rk3528.o +obj-$(CONFIG_ROCKCHIP_RK3562) += sdram_rk3562.o obj-$(CONFIG_ROCKCHIP_RK3568) += sdram_rk3568.o obj-$(CONFIG_ROCKCHIP_RK3588) += sdram_rk3588.o obj-$(CONFIG_ROCKCHIP_PX30) += sdram_px30.o sdram_pctl_px30.o sdram_phy_px30.o diff --git a/u-boot/drivers/ram/rockchip/sdram_rk3528.c b/u-boot/drivers/ram/rockchip/sdram_rk3528.c new file mode 100644 index 0000000..e8b0b36 --- /dev/null +++ b/u-boot/drivers/ram/rockchip/sdram_rk3528.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * (C) Copyright 2020 Rockchip Electronics Co., Ltd. + */ + +#include <common.h> + +#ifdef CONFIG_TPL_BUILD +#ifndef CONFIG_TPL_TINY_FRAMEWORK +#error please defined CONFIG_TPL_TINY_FRAMEWORK for RK3528 !!! +#endif +#endif + +#ifdef CONFIG_TPL_BUILD + +/* return: 0 = success, other = fail */ +int sdram_init(void) +{ + return (-1); +} +#endif /* CONFIG_TPL_BUILD */ diff --git a/u-boot/drivers/ram/rockchip/sdram_rk3562.c b/u-boot/drivers/ram/rockchip/sdram_rk3562.c new file mode 100644 index 0000000..60f2987 --- /dev/null +++ b/u-boot/drivers/ram/rockchip/sdram_rk3562.c @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd. + */ + +#include <common.h> +#include <debug_uart.h> +#include <dm.h> +#include <ram.h> +#include <syscon.h> +#include <asm/io.h> +#include <asm/arch/clock.h> +#include <asm/arch/hardware.h> +#include <asm/arch/rk_atags.h> +#include <asm/arch/cru_rk3562.h> +#include <asm/arch/grf_rk3562.h> + +#ifdef CONFIG_TPL_BUILD +#ifndef CONFIG_TPL_TINY_FRAMEWORK +#error please defined CONFIG_TPL_TINY_FRAMEWORK for RK3562 !!! +#endif +#endif + +#ifdef CONFIG_TPL_BUILD + +/* return: 0 = success, other = fail */ +int sdram_init(void) +{ + return (-1); +} +#endif /* CONFIG_TPL_BUILD */ diff --git a/u-boot/drivers/ram/rockchip/sdram_rv1126.c b/u-boot/drivers/ram/rockchip/sdram_rv1126.c index bb2ce37..65f08a2 100644 --- a/u-boot/drivers/ram/rockchip/sdram_rv1126.c +++ b/u-boot/drivers/ram/rockchip/sdram_rv1126.c @@ -374,6 +374,8 @@ break; delay--; } + if (delay <= 0) + printascii("ERROR: DPLL lock timeout!\n"); writel(DPLL_MODE(CLOCK_FROM_PLL), &dram->cru->mode); } @@ -557,11 +559,18 @@ { void __iomem *phy_base = dram->phy; u32 fbdiv, prediv, postdiv, postdiv_en; + int delay = 1000; if (wait) { clrbits_le32(PHY_REG(phy_base, 0x53), PHY_PD_DISB); - while (!(readl(PHY_REG(phy_base, 0x90)) & PHY_PLL_LOCK)) - continue; + while (!(readl(PHY_REG(phy_base, 0x90)) & PHY_PLL_LOCK)) { + udelay(1); + if (delay-- <= 0) { + printascii("ERROR: phy pll lock timeout!\n"); + while (1) + ; + } + } } else { freq /= MHz; prediv = 1; @@ -2484,13 +2493,13 @@ return 0; } -static int sdram_init_(struct dram_info *dram, - struct rv1126_sdram_params *sdram_params, u32 post_init) +int sdram_init_(struct dram_info *dram, struct rv1126_sdram_params *sdram_params, u32 post_init) { void __iomem *pctl_base = dram->pctl; void __iomem *phy_base = dram->phy; u32 ddr4_vref; u32 mr_tmp, tmp; + int delay = 1000; rkclk_configure_ddr(dram, sdram_params); @@ -2538,8 +2547,14 @@ rkclk_ddr_reset(dram, 0, 0, 0, 0); - while ((readl(pctl_base + DDR_PCTL2_STAT) & 0x7) == 0) - continue; + while ((readl(pctl_base + DDR_PCTL2_STAT) & 0x7) == 0) { + udelay(1); + if (delay-- <= 0) { + printascii("ERROR: Cannot wait dfi_init_done!\n"); + while (1) + ; + } + } if (sdram_params->base.dramtype == LPDDR3) { pctl_write_mr(dram->pctl, 3, 11, lp3_odt_value, LPDDR3); @@ -3300,6 +3315,7 @@ struct rv1126_sdram_params *sdram_params_new; void __iomem *pctl_base = dram->pctl; void __iomem *phy_base = dram->phy; + int delay = 1000; lp_stat = low_power_update(dram, 0); sdram_params_new = get_default_sdram_config(freq); @@ -3388,8 +3404,14 @@ (0x0 << ACLK_DDR_UPCTL_EN_SHIFT), BUS_SGRF_BASE_ADDR + SGRF_SOC_CON12); while ((readl(pctl_base + DDR_PCTL2_DFISTAT) & - PCTL2_DFI_INIT_COMPLETE) != PCTL2_DFI_INIT_COMPLETE) - continue; + PCTL2_DFI_INIT_COMPLETE) != PCTL2_DFI_INIT_COMPLETE) { + udelay(1); + if (delay-- <= 0) { + printascii("ERROR: Cannot wait DFI_INIT_COMPLETE\n"); + while (1) + ; + } + } sw_set_req(dram); setbits_le32(pctl_base + DDR_PCTL2_MSTR, 0x1 << 29); diff --git a/u-boot/drivers/rkflash/sfc_nand.c b/u-boot/drivers/rkflash/sfc_nand.c index 82a5f52..ae5c999 100644 --- a/u-boot/drivers/rkflash/sfc_nand.c +++ b/u-boot/drivers/rkflash/sfc_nand.c @@ -49,6 +49,12 @@ { 0xC2, 0x92, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, /* MX35UF2GE4AC */ { 0xC2, 0xA2, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, + /* MX35UF1GE4AD */ + { 0xC2, 0x96, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, + /* MX35UF2GE4AD */ + { 0xC2, 0xA6, 0x00, 4, 0x40, 1, 2048, 0x0C, 19, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, + /* MX35UF4GE4AD */ + { 0xC2, 0xB7, 0x00, 8, 0x40, 1, 2048, 0x0C, 20, 0x8, 1, { 0x04, 0x08, 0x14, 0x18 }, &sfc_nand_get_ecc_status0 }, /* GD5F1GQ4UAYIG */ { 0xC8, 0xF1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, @@ -93,6 +99,8 @@ { 0xEF, 0xBA, 0x22, 4, 0x40, 1, 2048, 0x4C, 19, 0x8, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status0 }, /* W25N512GVEIG */ { 0xEF, 0xAA, 0x20, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 0, { 0x04, 0x14, 0x24, 0xFF }, &sfc_nand_get_ecc_status1 }, + /* W25N01KV */ + { 0xEF, 0xAE, 0x21, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, /* HYF2GQ4UAACAE */ { 0xC9, 0x52, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, @@ -105,7 +113,11 @@ /* HYF2GQ4UHCCAE */ { 0xC9, 0x5A, 0x00, 4, 0x40, 1, 2048, 0x4C, 19, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, /* HYF4GQ4UAACBE */ - { 0xC9, 0xD4, 0x00, 8, 0x40, 1, 2048, 0x4C, 20, 0x4, 1, { 0x20, 0x40, 0x24, 0x44 }, &sfc_nand_get_ecc_status0 }, + { 0xC9, 0xD4, 0x00, 8, 0x40, 1, 2048, 0x4C, 20, 0xE, 1, { 0x20, 0x40, 0x24, 0x44 }, &sfc_nand_get_ecc_status0 }, + /* HYF2GQ4IAACAE */ + { 0xC9, 0x82, 0x00, 4, 0x40, 1, 2048, 0x4C, 20, 0xE, 1, { 0x04, 0x24, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, + /* HYF1GQ4IDACAE */ + { 0xC9, 0x81, 0x00, 4, 0x40, 1, 1024, 0x4C, 20, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, /* FS35ND01G-S1 */ { 0xCD, 0xB1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x10, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status5 }, @@ -124,7 +136,7 @@ /* F35SQA512M */ { 0xCD, 0x70, 0x00, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, /* F35UQA512M */ - { 0xCD, 0x70, 0x00, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, + { 0xCD, 0x60, 0x00, 4, 0x40, 1, 512, 0x4C, 17, 0x1, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, /* DS35Q1GA-IB */ { 0xE5, 0x71, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, @@ -142,6 +154,10 @@ { 0xE5, 0xF4, 0x00, 4, 0x40, 2, 2048, 0x0C, 20, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 }, /* DS35M1GB-IB */ { 0xE5, 0xA1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 }, + /* DS35Q12B-IB */ + { 0xE5, 0xF5, 0x00, 4, 0x40, 1, 512, 0x0C, 17, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 }, + /* DS35M12B-IB */ + { 0xE5, 0xA5, 0x00, 4, 0x40, 1, 512, 0x0C, 17, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status6 }, /* EM73C044VCC-H */ { 0xD5, 0x22, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x8, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status0 }, @@ -199,8 +215,16 @@ { 0xEA, 0xC1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, /* TX25G01 */ { 0xA1, 0xF1, 0x00, 4, 0x40, 1, 1024, 0x0C, 18, 0x4, 1, { 0x04, 0x14, 0xFF, 0xFF }, &sfc_nand_get_ecc_status8 }, + /* ANV1GCP0CLG, HYF1GQ4UTXCAE */ + { 0x01, 0x15, 0x00, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status9 }, + /* S35ML02G3, ANV1GCP0CLG */ + { 0x01, 0x25, 0x00, 4, 0x40, 2, 1024, 0x4C, 19, 0x4, 0, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 }, /* S35ML04G3 */ - { 0x01, 0x35, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 1, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 }, + { 0x01, 0x35, 0x00, 4, 0x40, 2, 2048, 0x4C, 20, 0x4, 0, { 0x04, 0x08, 0x0C, 0x10 }, &sfc_nand_get_ecc_status9 }, + /* GSS01GSAK1 */ + { 0x52, 0xBA, 0x13, 4, 0x40, 1, 1024, 0x4C, 18, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, + /* GSS02GSAK1 */ + { 0x52, 0xBA, 0x23, 4, 0x40, 1, 2048, 0x4C, 19, 0x4, 0, { 0x04, 0x08, 0xFF, 0xFF }, &sfc_nand_get_ecc_status1 }, }; static struct nand_info *p_nand_info; diff --git a/u-boot/drivers/rkflash/sfc_nor.c b/u-boot/drivers/rkflash/sfc_nor.c index afbcbd7..6471efa 100644 --- a/u-boot/drivers/rkflash/sfc_nor.c +++ b/u-boot/drivers/rkflash/sfc_nor.c @@ -32,10 +32,14 @@ { 0xc86016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 13, 9, 0 }, /* GD25B512MEYIG */ { 0xc8471A, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 17, 0, 0 }, + /* GD55B01GE */ + { 0xc8471B, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 18, 0, 0 }, /* GD25LQ255E and GD25LQ256C */ { 0xc86019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1D, 16, 9, 0 }, /* GD25LB512MEYIG */ { 0xc8671A, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 17, 0, 0 }, + /* GD55LB01GEFIRR */ + { 0xc8671B, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 18, 0, 0 }, /* W25Q32JV */ { 0xef4016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 13, 9, 0 }, @@ -112,6 +116,10 @@ { 0x0b4016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 13, 9, 0 }, /* XT25F16BS */ { 0x0b4015, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 12, 9, 0 }, + /* XT25Q64D */ + { 0x0b6017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 }, + /* XT25Q128D */ + { 0x0b6018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 }, /* EN25QH64A */ { 0x1c7017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 0, 0 }, @@ -124,7 +132,11 @@ /* EN25S64A */ { 0x1c3817, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 0, 0 }, /* EN25QH256A */ - { 0x1c7019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x3C, 16, 0, 0 }, + { 0x1c7019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 0, 0 }, + /* EN25QX256A */ + { 0x1c7119, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 }, + /* EN25QX128A */ + { 0x1c7118, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 }, /* P25Q64H */ { 0x856017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 }, @@ -134,8 +146,12 @@ { 0x856015, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 12, 9, 0 }, /* P25Q32SL P25Q32SH-SSH-IT */ { 0x856016, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 13, 9, 0 }, + /* PY25Q64HA */ + { 0x852017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 }, /* PY25Q128H */ { 0x852018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 }, + /* PY25Q256H */ + { 0x852019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 }, /* ZB25VQ64 */ { 0x5e4017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 }, @@ -153,6 +169,8 @@ { 0xA14018, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 9, 0 }, /* FM25Q64-SOB-T-G */ { 0xA14017, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 14, 9, 0 }, + /* FM25Q256I3 */ + { 0xA14019, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 }, /* FM25Q64A */ { 0xf83217, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0D, 14, 9, 0 }, @@ -174,6 +192,9 @@ /* BY25Q256FSEIG */ { 0x684919, 128, 8, 0x13, 0x12, 0x6C, 0x34, 0x21, 0xDC, 0x1C, 16, 9, 0 }, + + /* NM25Q128EVB */ + { 0x522118, 128, 8, 0x03, 0x02, 0x6B, 0x32, 0x20, 0xD8, 0x0C, 15, 10, 0 }, }; static int snor_write_en(void) diff --git a/u-boot/drivers/rng/rockchip_rng.c b/u-boot/drivers/rng/rockchip_rng.c index 7287afd..d85cf65 100644 --- a/u-boot/drivers/rng/rockchip_rng.c +++ b/u-boot/drivers/rng/rockchip_rng.c @@ -2,13 +2,14 @@ /* * Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd */ +#include <common.h> +#include <clk-uclass.h> +#include <dm.h> +#include <rng.h> #include <asm/arch-rockchip/hardware.h> #include <asm/io.h> -#include <common.h> -#include <dm.h> #include <linux/iopoll.h> #include <linux/string.h> -#include <rng.h> #define RK_HW_RNG_MAX 32 @@ -70,6 +71,27 @@ #define TRNG_v1_VERSION_CODE 0x46BC /* end of TRNG V1 register define */ +/* start of RKRNG register define */ +#define RKRNG_CTRL 0x0010 +#define RKRNG_CTRL_INST_REQ BIT(0) +#define RKRNG_CTRL_RESEED_REQ BIT(1) +#define RKRNG_CTRL_TEST_REQ BIT(2) +#define RKRNG_CTRL_SW_DRNG_REQ BIT(3) +#define RKRNG_CTRL_SW_TRNG_REQ BIT(4) + +#define RKRNG_STATE 0x0014 +#define RKRNG_STATE_INST_ACK BIT(0) +#define RKRNG_STATE_RESEED_ACK BIT(1) +#define RKRNG_STATE_TEST_ACK BIT(2) +#define RKRNG_STATE_SW_DRNG_ACK BIT(3) +#define RKRNG_STATE_SW_TRNG_ACK BIT(4) + +/* DRNG_DATA_0 ~ DNG_DATA_7 */ +#define RKRNG_DRNG_DATA_0 0x0070 +#define RKRNG_DRNG_DATA_7 0x008C + +/* end of RKRNG register define */ + #define RK_RNG_TIME_OUT 50000 /* max 50ms */ #define trng_write(pdata, pos, val) writel(val, (pdata)->base + (pos)) @@ -83,7 +105,36 @@ struct rk_rng_platdata { fdt_addr_t base; struct rk_rng_soc_data *soc_data; + struct clk hclk; }; + +static int rk_rng_do_enable_clk(struct udevice *dev, int enable) +{ + struct rk_rng_platdata *pdata = dev_get_priv(dev); + int ret; + + if (!pdata->hclk.dev) + return 0; + + ret = enable ? clk_enable(&pdata->hclk) : clk_disable(&pdata->hclk); + if (ret == -ENOSYS || !ret) + return 0; + + printf("rk rng: failed to %s clk, ret=%d\n", + enable ? "enable" : "disable", ret); + + return ret; +} + +static int rk_rng_enable_clk(struct udevice *dev) +{ + return rk_rng_do_enable_clk(dev, 1); +} + +static int rk_rng_disable_clk(struct udevice *dev) +{ + return rk_rng_do_enable_clk(dev, 0); +} static int rk_rng_read_regs(fdt_addr_t addr, void *buf, size_t size) { @@ -106,7 +157,7 @@ return 0; } -static int rk_cryptov1_rng_read(struct udevice *dev, void *data, size_t len) +static int cryptov1_rng_read(struct udevice *dev, void *data, size_t len) { struct rk_rng_platdata *pdata = dev_get_priv(dev); u32 reg = 0; @@ -137,7 +188,7 @@ return 0; } -static int rk_cryptov2_rng_read(struct udevice *dev, void *data, size_t len) +static int cryptov2_rng_read(struct udevice *dev, void *data, size_t len) { struct rk_rng_platdata *pdata = dev_get_priv(dev); u32 reg = 0; @@ -171,7 +222,7 @@ return retval; } -static int rk_trngv1_init(struct udevice *dev) +static int trngv1_init(struct udevice *dev) { u32 status, version; u32 auto_reseed_cnt = 1000; @@ -198,7 +249,7 @@ return 0; } -static int rk_trngv1_rng_read(struct udevice *dev, void *data, size_t len) +static int trngv1_rng_read(struct udevice *dev, void *data, size_t len) { struct rk_rng_platdata *pdata = dev_get_priv(dev); u32 reg = 0; @@ -224,6 +275,53 @@ exit: /* close TRNG */ trng_write(pdata, TRNG_V1_CTRL, TRNG_V1_CTRL_NOP); + + return retval; +} + +static int rkrng_init(struct udevice *dev) +{ + struct rk_rng_platdata *pdata = dev_get_priv(dev); + u32 reg = 0; + + rk_clrreg(pdata->base + RKRNG_CTRL, 0xffff); + + reg = trng_read(pdata, RKRNG_STATE); + trng_write(pdata, RKRNG_STATE, reg); + + return 0; +} + +static int rkrng_rng_read(struct udevice *dev, void *data, size_t len) +{ + struct rk_rng_platdata *pdata = dev_get_priv(dev); + u32 reg = 0; + int retval; + + if (len > RK_HW_RNG_MAX) + return -EINVAL; + + rk_rng_enable_clk(dev); + + reg = RKRNG_CTRL_SW_DRNG_REQ; + + rk_clrsetreg(pdata->base + RKRNG_CTRL, 0xffff, reg); + + retval = readl_poll_timeout(pdata->base + RKRNG_STATE, reg, + (reg & RKRNG_STATE_SW_DRNG_ACK), + RK_RNG_TIME_OUT); + if (retval) + goto exit; + + trng_write(pdata, RKRNG_STATE, reg); + + rk_rng_read_regs(pdata->base + RKRNG_DRNG_DATA_0, data, len); + +exit: + /* close TRNG */ + rk_clrreg(pdata->base + RKRNG_CTRL, 0xffff); + + rk_rng_disable_clk(dev); return retval; } @@ -266,6 +364,8 @@ if (!pdata->base) return -ENOMEM; + clk_get_by_index(dev, 0, &pdata->hclk); + return 0; } @@ -282,17 +382,22 @@ return ret; } -static const struct rk_rng_soc_data rk_cryptov1_soc_data = { - .rk_rng_read = rk_cryptov1_rng_read, +static const struct rk_rng_soc_data cryptov1_soc_data = { + .rk_rng_read = cryptov1_rng_read, }; -static const struct rk_rng_soc_data rk_cryptov2_soc_data = { - .rk_rng_read = rk_cryptov2_rng_read, +static const struct rk_rng_soc_data cryptov2_soc_data = { + .rk_rng_read = cryptov2_rng_read, }; -static const struct rk_rng_soc_data rk_trngv1_soc_data = { - .rk_rng_init = rk_trngv1_init, - .rk_rng_read = rk_trngv1_rng_read, +static const struct rk_rng_soc_data trngv1_soc_data = { + .rk_rng_init = trngv1_init, + .rk_rng_read = trngv1_rng_read, +}; + +static const struct rk_rng_soc_data rkrng_soc_data = { + .rk_rng_init = rkrng_init, + .rk_rng_read = rkrng_rng_read, }; static const struct dm_rng_ops rockchip_rng_ops = { @@ -302,15 +407,19 @@ static const struct udevice_id rockchip_rng_match[] = { { .compatible = "rockchip,cryptov1-rng", - .data = (ulong)&rk_cryptov1_soc_data, + .data = (ulong)&cryptov1_soc_data, }, { .compatible = "rockchip,cryptov2-rng", - .data = (ulong)&rk_cryptov2_soc_data, + .data = (ulong)&cryptov2_soc_data, }, { .compatible = "rockchip,trngv1", - .data = (ulong)&rk_trngv1_soc_data, + .data = (ulong)&trngv1_soc_data, + }, + { + .compatible = "rockchip,rkrng", + .data = (ulong)&rkrng_soc_data, }, {}, }; diff --git a/u-boot/drivers/scsi/scsi.c b/u-boot/drivers/scsi/scsi.c index 1a65a3f..9089c29 100644 --- a/u-boot/drivers/scsi/scsi.c +++ b/u-boot/drivers/scsi/scsi.c @@ -172,6 +172,7 @@ block_dev->devnum, start, blks, (unsigned long)buffer); do { pccb->pdata = (unsigned char *)buf_addr; + pccb->dma_dir = DMA_FROM_DEVICE; #ifdef CONFIG_SYS_64BIT_LBA if (start > SCSI_LBA48_READ) { unsigned long blocks; @@ -247,6 +248,7 @@ __func__, block_dev->devnum, start, blks, (unsigned long)buffer); do { pccb->pdata = (unsigned char *)buf_addr; + pccb->dma_dir = DMA_TO_DEVICE; if (blks > SCSI_MAX_WRITE_BLK) { pccb->datalen = (block_dev->blksz * SCSI_MAX_WRITE_BLK); @@ -395,6 +397,7 @@ pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */ pccb->datalen = 16; + pccb->dma_dir = DMA_FROM_DEVICE; if (scsi_exec(dev, pccb)) return 1; @@ -500,6 +503,7 @@ pccb->lun = lun; pccb->pdata = (unsigned char *)&tempbuff; pccb->datalen = 512; + pccb->dma_dir = DMA_FROM_DEVICE; scsi_setup_inquiry(pccb); if (scsi_exec(dev, pccb)) { if (pccb->contr_stat == SCSI_SEL_TIME_OUT) { diff --git a/u-boot/drivers/spi/rockchip_sfc.c b/u-boot/drivers/spi/rockchip_sfc.c index 63ca2c0..13e4ab0 100644 --- a/u-boot/drivers/spi/rockchip_sfc.c +++ b/u-boot/drivers/spi/rockchip_sfc.c @@ -108,6 +108,7 @@ #define SFC_VER_4 0x4 #define SFC_VER_5 0x5 #define SFC_VER_6 0x6 +#define SFC_VER_8 0x8 /* Delay line controller resiter */ #define SFC_DLL_CTRL0 0x3C @@ -225,6 +226,7 @@ static u32 rockchip_sfc_get_max_dll_cells(struct rockchip_sfc *sfc) { switch (rockchip_sfc_get_version(sfc)) { + case SFC_VER_8: case SFC_VER_6: case SFC_VER_5: return SFC_DLL_CTRL0_DLL_MAX_VER5; diff --git a/u-boot/drivers/spi/soft_spi.c b/u-boot/drivers/spi/soft_spi.c index 1690cd7..64a4862 100644 --- a/u-boot/drivers/spi/soft_spi.c +++ b/u-boot/drivers/spi/soft_spi.c @@ -201,10 +201,8 @@ static int soft_spi_ofdata_to_platdata(struct udevice *dev) { struct soft_spi_platdata *plat = dev->platdata; - const void *blob = gd->fdt_blob; - int node = dev_of_offset(dev); - plat->spi_delay_us = fdtdec_get_int(blob, node, "spi-delay-us", 0); + plat->spi_delay_us = dev_read_u32_default(dev, "spi-delay-us", 0); return 0; } @@ -216,24 +214,34 @@ int cs_flags, clk_flags; int ret; - cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW; - clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0; + if (slave) { + cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW; + clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0; + } else { + cs_flags = GPIOD_ACTIVE_LOW; + clk_flags = 0; + } - if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs, - GPIOD_IS_OUT | cs_flags) || - gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk, - GPIOD_IS_OUT | clk_flags)) + if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs, GPIOD_IS_OUT | cs_flags) || + (gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk, GPIOD_IS_OUT | clk_flags) && + gpio_request_by_name(dev, "sck-gpios", 0, &plat->sclk, GPIOD_IS_OUT | clk_flags))) return -EINVAL; ret = gpio_request_by_name(dev, "gpio-mosi", 0, &plat->mosi, GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE); - if (ret) - plat->flags |= SPI_MASTER_NO_TX; + if (ret) { + if (gpio_request_by_name(dev, "mosi-gpios", 0, &plat->mosi, + GPIOD_IS_OUT | GPIOD_IS_OUT_ACTIVE)) + plat->flags |= SPI_MASTER_NO_TX; + } ret = gpio_request_by_name(dev, "gpio-miso", 0, &plat->miso, GPIOD_IS_IN); - if (ret) - plat->flags |= SPI_MASTER_NO_RX; + if (ret) { + if (gpio_request_by_name(dev, "miso-gpios", 0, &plat->miso, + GPIOD_IS_IN)) + plat->flags |= SPI_MASTER_NO_RX; + } if ((plat->flags & (SPI_MASTER_NO_RX | SPI_MASTER_NO_TX)) == (SPI_MASTER_NO_RX | SPI_MASTER_NO_TX)) diff --git a/u-boot/drivers/thermal/rockchip_thermal.c b/u-boot/drivers/thermal/rockchip_thermal.c index 1bd6e31..e5551d4 100644 --- a/u-boot/drivers/thermal/rockchip_thermal.c +++ b/u-boot/drivers/thermal/rockchip_thermal.c @@ -78,6 +78,7 @@ #define TSADCV2_AUTO_PERIOD_HT 0x6c #define TSADCV3_AUTO_PERIOD 0x154 #define TSADCV3_AUTO_PERIOD_HT 0x158 +#define TSADCV3_Q_MAX 0x210 #define TSADCV2_AUTO_EN BIT(0) #define TSADCV2_AUTO_EN_MASK BIT(16) @@ -88,6 +89,7 @@ #define TSADCV2_AUTO_TSHUT_POLARITY_MASK BIT(24) #define TSADCV3_AUTO_Q_SEL_EN BIT(1) +#define TSADCV3_AUTO_Q_SEL_EN_MASK BIT(17) #define TSADCV2_INT_SRC_EN(chn) BIT(chn) #define TSADCV2_INT_SRC_EN_MASK(chn) BIT(16 + (chn)) @@ -101,6 +103,7 @@ #define TSADCV2_DATA_MASK 0xfff #define TSADCV3_DATA_MASK 0x3ff #define TSADCV4_DATA_MASK 0x1ff +#define TSADCV5_DATA_MASK 0x7ff #define TSADCV2_HIGHT_INT_DEBOUNCE_COUNT 4 #define TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT 4 @@ -112,6 +115,14 @@ #define TSADCV5_AUTO_PERIOD_HT_TIME 1622 /* 2.5ms */ #define TSADCV6_AUTO_PERIOD_TIME 5000 /* 2.5ms */ #define TSADCV6_AUTO_PERIOD_HT_TIME 5000 /* 2.5ms */ +#define TSADCV7_AUTO_PERIOD_TIME 3000 /* 2.5ms */ +#define TSADCV7_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */ +#define TSADCV3_Q_MAX_VAL 0x7ff /* 11bit 2047 */ +#define TSADCV12_AUTO_PERIOD_TIME 3000 /* 2.5ms */ +#define TSADCV12_AUTO_PERIOD_HT_TIME 3000 /* 2.5ms */ +#define TSADCV12_Q_MAX_VAL 0xfff /* 12bit 4095 */ +#define TSADCV9_Q_MAX 0x210 +#define TSADCV9_Q_MAX_VAL (0xffff0400 << 0) #define TSADCV2_USER_INTER_PD_SOC 0x340 /* 13 clocks */ #define TSADCV5_USER_INTER_PD_SOC 0xfc0 /* 97us, at least 90us */ @@ -123,7 +134,10 @@ #define PX30_GRF_SOC_CON0 0x0400 #define PX30_GRF_SOC_CON2 0x0408 +#define RK3562_GRF_TSADC_CON 0x0580 + #define RK3568_GRF_TSADC_CON 0x0600 +#define RK3528_GRF_TSADC_CON 0x40030 #define RK3568_GRF_TSADC_ANA_REG0 (0x10001 << 0) #define RK3568_GRF_TSADC_ANA_REG1 (0x10001 << 1) #define RK3568_GRF_TSADC_ANA_REG2 (0x10001 << 2) @@ -137,9 +151,10 @@ #define GRF_CON_TSADC_CH_INV (0x10001 << 1) #define PX30S_TSADC_TDC_MODE (0x10001 << 4) -#define MIN_TEMP (-40000) +/* -40 to 125 is reliable, outside the range existed unreliability */ +#define MIN_TEMP (-60000) #define LOWEST_TEMP (-273000) -#define MAX_TEMP (125000) +#define MAX_TEMP (180000) #define MAX_ENV_TEMP (85000) #define BASE (1024) @@ -208,7 +223,8 @@ }; static const struct tsadc_table rk1808_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {3423, MIN_TEMP}, {3455, -40000}, {3463, -35000}, {3471, -30000}, @@ -243,11 +259,13 @@ {3709, 115000}, {3718, 120000}, {3726, 125000}, - {TSADCV2_DATA_MASK, 125000}, + {3820, MAX_TEMP}, + {TSADCV2_DATA_MASK, MAX_TEMP}, }; static const struct tsadc_table rk3228_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {568, MIN_TEMP}, {588, -40000}, {593, -35000}, {598, -30000}, @@ -282,11 +300,13 @@ {749, 115000}, {754, 120000}, {760, 125000}, - {TSADCV2_DATA_MASK, 125000}, + {821, MAX_TEMP}, + {TSADCV2_DATA_MASK, MAX_TEMP}, }; static const struct tsadc_table rk3288_code_table[] = { - {TSADCV2_DATA_MASK, -40000}, + {TSADCV2_DATA_MASK, MIN_TEMP}, + {3833, MIN_TEMP}, {3800, -40000}, {3792, -35000}, {3783, -30000}, @@ -321,10 +341,15 @@ {3452, 115000}, {3437, 120000}, {3421, 125000}, + {3350, 145000}, + {3270, 165000}, + {3195, MAX_TEMP}, + {0, MAX_TEMP}, }; static const struct tsadc_table rk3328_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {261, MIN_TEMP}, {296, -40000}, {304, -35000}, {313, -30000}, @@ -358,11 +383,15 @@ {644, 115000}, {659, 120000}, {675, 125000}, - {TSADCV2_DATA_MASK, 125000}, + {745, 145000}, + {825, 165000}, + {900, MAX_TEMP}, + {TSADCV2_DATA_MASK, MAX_TEMP}, }; static const struct tsadc_table rk3368_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {98, MIN_TEMP}, {106, -40000}, {108, -35000}, {110, -30000}, @@ -397,11 +426,13 @@ {167, 115000}, {169, 120000}, {171, 125000}, - {TSADCV3_DATA_MASK, 125000}, + {193, MAX_TEMP}, + {TSADCV3_DATA_MASK, MAX_TEMP}, }; static const struct tsadc_table rk3399_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {368, MIN_TEMP}, {402, -40000}, {410, -35000}, {419, -30000}, @@ -436,11 +467,95 @@ {668, 115000}, {677, 120000}, {685, 125000}, - {TSADCV3_DATA_MASK, 125000}, + {782, MAX_TEMP}, + {TSADCV3_DATA_MASK, MAX_TEMP}, +}; + +static const struct tsadc_table rk3528_code_table[] = { + {0, MIN_TEMP}, + {1386, MIN_TEMP}, + {1419, -40000}, + {1427, -35000}, + {1435, -30000}, + {1443, -25000}, + {1452, -20000}, + {1460, -15000}, + {1468, -10000}, + {1477, -5000}, + {1486, 0}, + {1494, 5000}, + {1502, 10000}, + {1510, 15000}, + {1519, 20000}, + {1527, 25000}, + {1535, 30000}, + {1544, 35000}, + {1552, 40000}, + {1561, 45000}, + {1569, 50000}, + {1578, 55000}, + {1586, 60000}, + {1594, 65000}, + {1603, 70000}, + {1612, 75000}, + {1620, 80000}, + {1628, 85000}, + {1637, 90000}, + {1646, 95000}, + {1654, 100000}, + {1662, 105000}, + {1671, 110000}, + {1679, 115000}, + {1688, 120000}, + {1696, 125000}, + {1790, MAX_TEMP}, + {TSADCV5_DATA_MASK, MAX_TEMP}, +}; + +static const struct tsadc_table rk3562_code_table[] = { + {0, MIN_TEMP}, + {1385, MIN_TEMP}, + {1419, -40000}, + {1428, -35000}, + {1436, -30000}, + {1445, -25000}, + {1453, -20000}, + {1462, -15000}, + {1470, -10000}, + {1479, -5000}, + {1487, 0}, + {1496, 5000}, + {1504, 10000}, + {1512, 15000}, + {1521, 20000}, + {1529, 25000}, + {1538, 30000}, + {1546, 35000}, + {1555, 40000}, + {1563, 45000}, + {1572, 50000}, + {1580, 55000}, + {1589, 60000}, + {1598, 65000}, + {1606, 70000}, + {1615, 75000}, + {1623, 80000}, + {1632, 85000}, + {1640, 90000}, + {1648, 95000}, + {1657, 100000}, + {1666, 105000}, + {1674, 110000}, + {1682, 115000}, + {1691, 120000}, + {1699, 125000}, + {1793, MAX_TEMP}, + {TSADCV2_DATA_MASK, MAX_TEMP}, }; static const struct tsadc_table rk3568_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {1448, MIN_TEMP}, {1584, -40000}, {1620, -35000}, {1652, -30000}, @@ -475,16 +590,19 @@ {2636, 115000}, {2672, 120000}, {2704, 125000}, - {TSADCV2_DATA_MASK, 125000}, + {3076, MAX_TEMP}, + {TSADCV2_DATA_MASK, MAX_TEMP}, }; static const struct tsadc_table rk3588_code_table[] = { - {0, -40000}, + {0, MIN_TEMP}, + {194, MIN_TEMP}, {215, -40000}, {285, 25000}, {350, 85000}, {395, 125000}, - {TSADCV4_DATA_MASK, 125000}, + {455, MAX_TEMP}, + {TSADCV4_DATA_MASK, MAX_TEMP}, }; /* @@ -806,6 +924,81 @@ tsadc_init_v2(dev); if (!IS_ERR(priv->grf)) writel(PX30S_TSADC_TDC_MODE, priv->grf + PX30_GRF_SOC_CON0); +} + +static void tsadc_init_v11(struct udevice *dev) +{ + struct rockchip_thermal_priv *priv = dev_get_priv(dev); + + writel(TSADCV7_AUTO_PERIOD_TIME, priv->base + TSADCV3_AUTO_PERIOD); + writel(TSADCV7_AUTO_PERIOD_HT_TIME, + priv->base + TSADCV3_AUTO_PERIOD_HT); + writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT, + priv->base + TSADCV3_HIGHT_INT_DEBOUNCE); + writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT, + priv->base + TSADCV3_HIGHT_TSHUT_DEBOUNCE); + writel(TSADCV3_Q_MAX_VAL, priv->base + TSADCV3_Q_MAX); + writel(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK, + priv->base + TSADCV2_AUTO_CON); + + if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE) + writel(TSADCV2_AUTO_TSHUT_POLARITY_HIGH | + TSADCV2_AUTO_TSHUT_POLARITY_MASK, + priv->base + TSADCV2_AUTO_CON); + else + writel(TSADCV2_AUTO_TSHUT_POLARITY_MASK, + priv->base + TSADCV2_AUTO_CON); + + if (!IS_ERR(priv->grf)) { + writel(RK3568_GRF_TSADC_TSEN, + priv->grf + RK3528_GRF_TSADC_CON); + udelay(15); + writel(RK3568_GRF_TSADC_ANA_REG0, + priv->grf + RK3528_GRF_TSADC_CON); + writel(RK3568_GRF_TSADC_ANA_REG1, + priv->grf + RK3528_GRF_TSADC_CON); + writel(RK3568_GRF_TSADC_ANA_REG2, + priv->grf + RK3528_GRF_TSADC_CON); + udelay(200); + } +} + +static void tsadc_init_v12(struct udevice *dev) +{ + struct rockchip_thermal_priv *priv = dev_get_priv(dev); + + writel(TSADCV12_AUTO_PERIOD_TIME, + priv->base + TSADCV3_AUTO_PERIOD); + writel(TSADCV12_AUTO_PERIOD_HT_TIME, + priv->base + TSADCV3_AUTO_PERIOD_HT); + writel(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT, + priv->base + TSADCV3_HIGHT_INT_DEBOUNCE); + writel(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT, + priv->base + TSADCV3_HIGHT_TSHUT_DEBOUNCE); + writel(TSADCV12_Q_MAX_VAL, + priv->base + TSADCV9_Q_MAX); + writel(TSADCV3_AUTO_Q_SEL_EN | TSADCV3_AUTO_Q_SEL_EN_MASK, + priv->base + TSADCV2_AUTO_CON); + if (priv->tshut_polarity == TSHUT_HIGH_ACTIVE) + writel(TSADCV2_AUTO_TSHUT_POLARITY_HIGH | + TSADCV2_AUTO_TSHUT_POLARITY_MASK, + priv->base + TSADCV2_AUTO_CON); + else + writel(TSADCV2_AUTO_TSHUT_POLARITY_MASK, + priv->base + TSADCV2_AUTO_CON); + + if (!IS_ERR(priv->grf)) { + writel(RK3568_GRF_TSADC_TSEN, + priv->grf + RK3562_GRF_TSADC_CON); + udelay(15); + writel(RK3568_GRF_TSADC_ANA_REG0, + priv->grf + RK3562_GRF_TSADC_CON); + writel(RK3568_GRF_TSADC_ANA_REG1, + priv->grf + RK3562_GRF_TSADC_CON); + writel(RK3568_GRF_TSADC_ANA_REG2, + priv->grf + RK3562_GRF_TSADC_CON); + udelay(200); + } } static int tsadc_get_temp_v2(struct udevice *dev, @@ -1381,6 +1574,54 @@ }, }; +static const struct rockchip_tsadc_chip rk3528_tsadc_data = { + .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ + .chn_num = 1, /* one channels for tsadc */ + + .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via GPIO give PMIC */ + .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */ + .tshut_temp = 95000, + + .tsadc_init = tsadc_init_v11, + .tsadc_control = tsadc_control_v4, + .tsadc_get_temp = tsadc_get_temp_v4, + .irq_ack = tsadc_irq_ack_v4, + .set_alarm_temp = tsadc_alarm_temp_v3, + .set_tshut_temp = tsadc_tshut_temp_v3, + .set_tshut_mode = tsadc_tshut_mode_v4, + + .table = { + .id = rk3528_code_table, + .length = ARRAY_SIZE(rk3528_code_table), + .data_mask = TSADCV2_DATA_MASK, + .mode = ADC_INCREMENT, + }, +}; + +static const struct rockchip_tsadc_chip rk3562_tsadc_data = { + .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ + .chn_num = 1, /* one channels for tsadc */ + + .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ + .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */ + .tshut_temp = 95000, + + .tsadc_init = tsadc_init_v12, + .tsadc_control = tsadc_control_v4, + .tsadc_get_temp = tsadc_get_temp_v4, + .irq_ack = tsadc_irq_ack_v4, + .set_alarm_temp = tsadc_alarm_temp_v3, + .set_tshut_temp = tsadc_tshut_temp_v3, + .set_tshut_mode = tsadc_tshut_mode_v4, + + .table = { + .id = rk3562_code_table, + .length = ARRAY_SIZE(rk3562_code_table), + .data_mask = TSADCV2_DATA_MASK, + .mode = ADC_INCREMENT, + }, +}; + static const struct rockchip_tsadc_chip rk3568_tsadc_data = { .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ @@ -1477,6 +1718,14 @@ .data = (ulong)&rk3399_tsadc_data, }, { + .compatible = "rockchip,rk3528-tsadc", + .data = (ulong)&rk3528_tsadc_data, + }, + { + .compatible = "rockchip,rk3562-tsadc", + .data = (ulong)&rk3562_tsadc_data, + }, + { .compatible = "rockchip,rk3568-tsadc", .data = (ulong)&rk3568_tsadc_data, }, diff --git a/u-boot/drivers/ufs/Kconfig b/u-boot/drivers/ufs/Kconfig new file mode 100644 index 0000000..69ea18e --- /dev/null +++ b/u-boot/drivers/ufs/Kconfig @@ -0,0 +1,24 @@ +menu "UFS Host Controller Support" + +config UFS + bool "Support UFS controllers" + depends on DM_SCSI + select CHARSET + help + This selects support for Universal Flash Subsystem (UFS). + Say Y here if you want UFS Support. + +config CADENCE_UFS + bool "Cadence platform driver for UFS" + depends on UFS + help + This selects the platform driver for the Cadence UFS host + controller present on present TI's J721e devices. + +config TI_J721E_UFS + bool "Glue Layer driver for UFS on TI J721E devices" + help + This selects the glue layer driver for Cadence controller + present on TI's J721E devices. + +endmenu diff --git a/u-boot/drivers/ufs/Makefile b/u-boot/drivers/ufs/Makefile new file mode 100644 index 0000000..62ed016 --- /dev/null +++ b/u-boot/drivers/ufs/Makefile @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com +# + +obj-$(CONFIG_UFS) += ufs.o ufs-uclass.o +obj-$(CONFIG_CADENCE_UFS) += cdns-platform.o +obj-$(CONFIG_TI_J721E_UFS) += ti-j721e-ufs.o diff --git a/u-boot/drivers/ufs/cdns-platform.c b/u-boot/drivers/ufs/cdns-platform.c new file mode 100644 index 0000000..dc78c9d --- /dev/null +++ b/u-boot/drivers/ufs/cdns-platform.c @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: GPL-2.0+ +/** + * cdns-platform.c - Platform driver for Cadence UFSHCI device + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com + */ + +#include <clk.h> +#include <common.h> +#include <dm.h> +#include <ufs.h> +#include <asm/io.h> +#include <linux/bitops.h> +#include <linux/err.h> + +#include "ufs.h" + +#define USEC_PER_SEC 1000000L + +#define CDNS_UFS_REG_HCLKDIV 0xFC +#define CDNS_UFS_REG_PHY_XCFGD1 0x113C + +static int cdns_ufs_link_startup_notify(struct ufs_hba *hba, + enum ufs_notify_change_status status) +{ + hba->quirks |= UFSHCD_QUIRK_BROKEN_LCC; + switch (status) { + case PRE_CHANGE: + return ufshcd_dme_set(hba, + UIC_ARG_MIB(PA_LOCAL_TX_LCC_ENABLE), + 0); + case POST_CHANGE: + ; + } + + return 0; +} + +static int cdns_ufs_set_hclkdiv(struct ufs_hba *hba) +{ + struct clk clk; + unsigned long core_clk_rate = 0; + u32 core_clk_div = 0; + int ret; + + ret = clk_get_by_name(hba->dev, "core_clk", &clk); + if (ret) { + dev_err(hba->dev, "failed to get core_clk clock\n"); + return ret; + } + + core_clk_rate = clk_get_rate(&clk); + if (IS_ERR_VALUE(core_clk_rate)) { + dev_err(hba->dev, "%s: unable to find core_clk rate\n", + __func__); + return core_clk_rate; + } + + core_clk_div = core_clk_rate / USEC_PER_SEC; + ufshcd_writel(hba, core_clk_div, CDNS_UFS_REG_HCLKDIV); + + return 0; +} + +static int cdns_ufs_hce_enable_notify(struct ufs_hba *hba, + enum ufs_notify_change_status status) +{ + switch (status) { + case PRE_CHANGE: + return cdns_ufs_set_hclkdiv(hba); + case POST_CHANGE: + ; + } + + return 0; +} + +static int cdns_ufs_init(struct ufs_hba *hba) +{ + u32 data; + + /* Increase RX_Advanced_Min_ActivateTime_Capability */ + data = ufshcd_readl(hba, CDNS_UFS_REG_PHY_XCFGD1); + data |= BIT(24); + ufshcd_writel(hba, data, CDNS_UFS_REG_PHY_XCFGD1); + + return 0; +} + +static struct ufs_hba_ops cdns_pltfm_hba_ops = { + .init = cdns_ufs_init, + .hce_enable_notify = cdns_ufs_hce_enable_notify, + .link_startup_notify = cdns_ufs_link_startup_notify, +}; + +static int cdns_ufs_pltfm_probe(struct udevice *dev) +{ + int err = ufshcd_probe(dev, &cdns_pltfm_hba_ops); + if (err) + dev_err(dev, "ufshcd_probe() failed %d\n", err); + + return err; +} + +static int cdns_ufs_pltfm_bind(struct udevice *dev) +{ + struct udevice *scsi_dev; + + return ufs_scsi_bind(dev, &scsi_dev); +} + +static const struct udevice_id cdns_ufs_pltfm_ids[] = { + { + .compatible = "cdns,ufshc-m31-16nm", + }, + {}, +}; + +U_BOOT_DRIVER(cdns_ufs_pltfm) = { + .name = "cdns-ufs-pltfm", + .id = UCLASS_UFS, + .of_match = cdns_ufs_pltfm_ids, + .probe = cdns_ufs_pltfm_probe, + .bind = cdns_ufs_pltfm_bind, +}; diff --git a/u-boot/drivers/ufs/ti-j721e-ufs.c b/u-boot/drivers/ufs/ti-j721e-ufs.c new file mode 100644 index 0000000..7b157ed --- /dev/null +++ b/u-boot/drivers/ufs/ti-j721e-ufs.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include <asm/io.h> +#include <clk.h> +#include <common.h> +#include <dm.h> +//#include <dm/device_compat.h> +#include <linux/bitops.h> +#include <linux/err.h> + +#define UFS_SS_CTRL 0x4 +#define UFS_SS_RST_N_PCS BIT(0) +#define UFS_SS_CLK_26MHZ BIT(4) + +static int ti_j721e_ufs_probe(struct udevice *dev) +{ + void __iomem *base; + unsigned int clock; + struct clk clk; + u32 reg = 0; + int ret; + + ret = clk_get_by_index(dev, 0, &clk); + if (ret) { + dev_err(dev, "failed to get M-PHY clock\n"); + return ret; + } + + clock = clk_get_rate(&clk); + if (IS_ERR_VALUE(clock)) { + dev_err(dev, "failed to get rate\n"); + return ret; + } + + base = dev_remap_addr_index(dev, 0); + + if (clock == 26000000) + reg |= UFS_SS_CLK_26MHZ; + /* Take UFS slave device out of reset */ + reg |= UFS_SS_RST_N_PCS; + writel(reg, base + UFS_SS_CTRL); + + return 0; +} + +static int ti_j721e_ufs_remove(struct udevice *dev) +{ + void __iomem *base = dev_remap_addr_index(dev, 0); + u32 reg = readl(base + UFS_SS_CTRL); + + reg &= ~UFS_SS_RST_N_PCS; + writel(reg, base + UFS_SS_CTRL); + + return 0; +} + +static const struct udevice_id ti_j721e_ufs_ids[] = { + { + .compatible = "ti,j721e-ufs", + }, + {}, +}; + +U_BOOT_DRIVER(ti_j721e_ufs) = { + .name = "ti-j721e-ufs", + .id = UCLASS_MISC, + .of_match = ti_j721e_ufs_ids, + .probe = ti_j721e_ufs_probe, + .remove = ti_j721e_ufs_remove, + .flags = DM_FLAG_OS_PREPARE, +}; diff --git a/u-boot/drivers/ufs/ufs-uclass.c b/u-boot/drivers/ufs/ufs-uclass.c new file mode 100644 index 0000000..6612f44 --- /dev/null +++ b/u-boot/drivers/ufs/ufs-uclass.c @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0 +/** + * ufs-uclass.c - Universal Flash Subsystem (UFS) Uclass driver + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com + */ + +#define LOG_CATEGORY UCLASS_UFS + +#include <common.h> +#include "ufs.h" +#include <dm.h> + +UCLASS_DRIVER(ufs) = { + .id = UCLASS_UFS, + .name = "ufs", + .per_device_auto_alloc_size = sizeof(struct ufs_hba), +}; diff --git a/u-boot/drivers/ufs/ufs.c b/u-boot/drivers/ufs/ufs.c new file mode 100644 index 0000000..6273b29 --- /dev/null +++ b/u-boot/drivers/ufs/ufs.c @@ -0,0 +1,1970 @@ +// SPDX-License-Identifier: GPL-2.0+ +/** + * ufs.c - Universal Flash Subsystem (UFS) driver + * + * Taken from Linux Kernel v5.2 (drivers/scsi/ufs/ufshcd.c) and ported + * to u-boot. + * + * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com + */ +#include <charset.h> +#include <common.h> +#include <dm.h> +#include <log.h> +#include <dm/lists.h> +#include <dm/device-internal.h> +#include <malloc.h> +#include <hexdump.h> +#include <scsi.h> +#include <asm/io.h> +#include <asm/dma-mapping.h> +#include <linux/bitops.h> +#include <linux/delay.h> + +#include "ufs.h" + +#define UFSHCD_ENABLE_INTRS (UTP_TRANSFER_REQ_COMPL |\ + UTP_TASK_REQ_COMPL |\ + UFSHCD_ERROR_MASK) +/* maximum number of link-startup retries */ +#define DME_LINKSTARTUP_RETRIES 3 + +/* maximum number of retries for a general UIC command */ +#define UFS_UIC_COMMAND_RETRIES 3 + +/* Query request retries */ +#define QUERY_REQ_RETRIES 3 +/* Query request timeout */ +#define QUERY_REQ_TIMEOUT 1500 /* 1.5 seconds */ + +/* maximum timeout in ms for a general UIC command */ +#define UFS_UIC_CMD_TIMEOUT 1000 +/* NOP OUT retries waiting for NOP IN response */ +#define NOP_OUT_RETRIES 10 +/* Timeout after 30 msecs if NOP OUT hangs without response */ +#define NOP_OUT_TIMEOUT 30 /* msecs */ + +/* Only use one Task Tag for all requests */ +#define TASK_TAG 0 + +/* Expose the flag value from utp_upiu_query.value */ +#define MASK_QUERY_UPIU_FLAG_LOC 0xFF + +#define MAX_PRDT_ENTRY 262144 + +/* maximum bytes per request */ +#define UFS_MAX_BYTES (128 * 256 * 1024) + +static inline bool ufshcd_is_hba_active(struct ufs_hba *hba); +static inline void ufshcd_hba_stop(struct ufs_hba *hba); +static int ufshcd_hba_enable(struct ufs_hba *hba); + +/* + * ufshcd_wait_for_register - wait for register value to change + */ +static int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask, + u32 val, unsigned long timeout_ms) +{ + int err = 0; + unsigned long start = get_timer(0); + + /* ignore bits that we don't intend to wait on */ + val = val & mask; + + while ((ufshcd_readl(hba, reg) & mask) != val) { + if (get_timer(start) > timeout_ms) { + if ((ufshcd_readl(hba, reg) & mask) != val) + err = -ETIMEDOUT; + break; + } + } + + return err; +} + +/** + * ufshcd_init_pwr_info - setting the POR (power on reset) + * values in hba power info + */ +static void ufshcd_init_pwr_info(struct ufs_hba *hba) +{ + hba->pwr_info.gear_rx = UFS_PWM_G1; + hba->pwr_info.gear_tx = UFS_PWM_G1; + hba->pwr_info.lane_rx = 1; + hba->pwr_info.lane_tx = 1; + hba->pwr_info.pwr_rx = SLOWAUTO_MODE; + hba->pwr_info.pwr_tx = SLOWAUTO_MODE; + hba->pwr_info.hs_rate = 0; +} + +/** + * ufshcd_print_pwr_info - print power params as saved in hba + * power info + */ +static void ufshcd_print_pwr_info(struct ufs_hba *hba) +{ + static const char * const names[] = { + "INVALID MODE", + "FAST MODE", + "SLOW_MODE", + "INVALID MODE", + "FASTAUTO_MODE", + "SLOWAUTO_MODE", + "INVALID MODE", + }; + + dev_err(hba->dev, "[RX, TX]: gear=[%d, %d], lane[%d, %d], pwr[%s, %s], rate = %d\n", + hba->pwr_info.gear_rx, hba->pwr_info.gear_tx, + hba->pwr_info.lane_rx, hba->pwr_info.lane_tx, + names[hba->pwr_info.pwr_rx], + names[hba->pwr_info.pwr_tx], + hba->pwr_info.hs_rate); +} + +/** + * ufshcd_ready_for_uic_cmd - Check if controller is ready + * to accept UIC commands + */ +static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba) +{ + if (ufshcd_readl(hba, REG_CONTROLLER_STATUS) & UIC_COMMAND_READY) + return true; + else + return false; +} + +/** + * ufshcd_get_uic_cmd_result - Get the UIC command result + */ +static inline int ufshcd_get_uic_cmd_result(struct ufs_hba *hba) +{ + return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_2) & + MASK_UIC_COMMAND_RESULT; +} + +/** + * ufshcd_get_dme_attr_val - Get the value of attribute returned by UIC command + */ +static inline u32 ufshcd_get_dme_attr_val(struct ufs_hba *hba) +{ + return ufshcd_readl(hba, REG_UIC_COMMAND_ARG_3); +} + +/** + * ufshcd_is_device_present - Check if any device connected to + * the host controller + */ +static inline bool ufshcd_is_device_present(struct ufs_hba *hba) +{ + return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) & + DEVICE_PRESENT) ? true : false; +} + +/** + * ufshcd_send_uic_cmd - UFS Interconnect layer command API + * + */ +static int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) +{ + unsigned long start = 0; + u32 intr_status; + u32 enabled_intr_status; + + if (!ufshcd_ready_for_uic_cmd(hba)) { + dev_err(hba->dev, + "Controller not ready to accept UIC commands\n"); + return -EIO; + } + + debug("sending uic command:%d\n", uic_cmd->command); + + /* Write Args */ + ufshcd_writel(hba, uic_cmd->argument1, REG_UIC_COMMAND_ARG_1); + ufshcd_writel(hba, uic_cmd->argument2, REG_UIC_COMMAND_ARG_2); + ufshcd_writel(hba, uic_cmd->argument3, REG_UIC_COMMAND_ARG_3); + + /* Write UIC Cmd */ + ufshcd_writel(hba, uic_cmd->command & COMMAND_OPCODE_MASK, + REG_UIC_COMMAND); + + start = get_timer(0); + do { + intr_status = ufshcd_readl(hba, REG_INTERRUPT_STATUS); + enabled_intr_status = intr_status & hba->intr_mask; + ufshcd_writel(hba, intr_status, REG_INTERRUPT_STATUS); + + if (get_timer(start) > UFS_UIC_CMD_TIMEOUT) { + dev_err(hba->dev, + "Timedout waiting for UIC response\n"); + + return -ETIMEDOUT; + } + + if (enabled_intr_status & UFSHCD_ERROR_MASK) { + dev_err(hba->dev, "Error in status:%08x\n", + enabled_intr_status); + + return -1; + } + } while (!(enabled_intr_status & UFSHCD_UIC_MASK)); + + uic_cmd->argument2 = ufshcd_get_uic_cmd_result(hba); + uic_cmd->argument3 = ufshcd_get_dme_attr_val(hba); + + debug("Sent successfully\n"); + + return 0; +} + +/** + * ufshcd_dme_set_attr - UIC command for DME_SET, DME_PEER_SET + * + */ +int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, u8 attr_set, + u32 mib_val, u8 peer) +{ + struct uic_command uic_cmd = {0}; + static const char *const action[] = { + "dme-set", + "dme-peer-set" + }; + const char *set = action[!!peer]; + int ret; + int retries = UFS_UIC_COMMAND_RETRIES; + + uic_cmd.command = peer ? + UIC_CMD_DME_PEER_SET : UIC_CMD_DME_SET; + uic_cmd.argument1 = attr_sel; + uic_cmd.argument2 = UIC_ARG_ATTR_TYPE(attr_set); + uic_cmd.argument3 = mib_val; + + do { + /* for peer attributes we retry upon failure */ + ret = ufshcd_send_uic_cmd(hba, &uic_cmd); + if (ret) + dev_dbg(hba->dev, "%s: attr-id 0x%x val 0x%x error code %d\n", + set, UIC_GET_ATTR_ID(attr_sel), mib_val, ret); + } while (ret && peer && --retries); + + if (ret) + dev_err(hba->dev, "%s: attr-id 0x%x val 0x%x failed %d retries\n", + set, UIC_GET_ATTR_ID(attr_sel), mib_val, + UFS_UIC_COMMAND_RETRIES - retries); + + return ret; +} + +/** + * ufshcd_dme_get_attr - UIC command for DME_GET, DME_PEER_GET + * + */ +int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, + u32 *mib_val, u8 peer) +{ + struct uic_command uic_cmd = {0}; + static const char *const action[] = { + "dme-get", + "dme-peer-get" + }; + const char *get = action[!!peer]; + int ret; + int retries = UFS_UIC_COMMAND_RETRIES; + + uic_cmd.command = peer ? + UIC_CMD_DME_PEER_GET : UIC_CMD_DME_GET; + uic_cmd.argument1 = attr_sel; + + do { + /* for peer attributes we retry upon failure */ + ret = ufshcd_send_uic_cmd(hba, &uic_cmd); + if (ret) + dev_dbg(hba->dev, "%s: attr-id 0x%x error code %d\n", + get, UIC_GET_ATTR_ID(attr_sel), ret); + } while (ret && peer && --retries); + + if (ret) + dev_err(hba->dev, "%s: attr-id 0x%x failed %d retries\n", + get, UIC_GET_ATTR_ID(attr_sel), + UFS_UIC_COMMAND_RETRIES - retries); + + if (mib_val && !ret) + *mib_val = uic_cmd.argument3; + + return ret; +} + +static int ufshcd_disable_tx_lcc(struct ufs_hba *hba, bool peer) +{ + u32 tx_lanes, i, err = 0; + + if (!peer) + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES), + &tx_lanes); + else + ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES), + &tx_lanes); + for (i = 0; i < tx_lanes; i++) { + if (!peer) + err = ufshcd_dme_set(hba, + UIC_ARG_MIB_SEL(TX_LCC_ENABLE, + UIC_ARG_MPHY_TX_GEN_SEL_INDEX(i)), + 0); + else + err = ufshcd_dme_peer_set(hba, + UIC_ARG_MIB_SEL(TX_LCC_ENABLE, + UIC_ARG_MPHY_TX_GEN_SEL_INDEX(i)), + 0); + if (err) { + dev_err(hba->dev, "%s: TX LCC Disable failed, peer = %d, lane = %d, err = %d", + __func__, peer, i, err); + break; + } + } + + return err; +} + +static inline int ufshcd_disable_device_tx_lcc(struct ufs_hba *hba) +{ + return ufshcd_disable_tx_lcc(hba, true); +} + +/** + * ufshcd_dme_link_startup - Notify Unipro to perform link startup + * + */ +static int ufshcd_dme_link_startup(struct ufs_hba *hba) +{ + struct uic_command uic_cmd = {0}; + int ret; + + uic_cmd.command = UIC_CMD_DME_LINK_STARTUP; + + ret = ufshcd_send_uic_cmd(hba, &uic_cmd); + if (ret) + dev_dbg(hba->dev, + "dme-link-startup: error code %d\n", ret); + return ret; +} + +/** + * ufshcd_disable_intr_aggr - Disables interrupt aggregation. + * + */ +static inline void ufshcd_disable_intr_aggr(struct ufs_hba *hba) +{ + ufshcd_writel(hba, 0, REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL); +} + +/** + * ufshcd_get_lists_status - Check UCRDY, UTRLRDY and UTMRLRDY + */ +static inline int ufshcd_get_lists_status(u32 reg) +{ + return !((reg & UFSHCD_STATUS_READY) == UFSHCD_STATUS_READY); +} + +/** + * ufshcd_enable_run_stop_reg - Enable run-stop registers, + * When run-stop registers are set to 1, it indicates the + * host controller that it can process the requests + */ +static void ufshcd_enable_run_stop_reg(struct ufs_hba *hba) +{ + ufshcd_writel(hba, UTP_TASK_REQ_LIST_RUN_STOP_BIT, + REG_UTP_TASK_REQ_LIST_RUN_STOP); + ufshcd_writel(hba, UTP_TRANSFER_REQ_LIST_RUN_STOP_BIT, + REG_UTP_TRANSFER_REQ_LIST_RUN_STOP); +} + +/** + * ufshcd_enable_intr - enable interrupts + */ +static void ufshcd_enable_intr(struct ufs_hba *hba, u32 intrs) +{ + u32 set = ufshcd_readl(hba, REG_INTERRUPT_ENABLE); + u32 rw; + + if (hba->version == UFSHCI_VERSION_10) { + rw = set & INTERRUPT_MASK_RW_VER_10; + set = rw | ((set ^ intrs) & intrs); + } else { + set |= intrs; + } + + ufshcd_writel(hba, set, REG_INTERRUPT_ENABLE); + + hba->intr_mask = set; +} + +/** + * ufshcd_make_hba_operational - Make UFS controller operational + * + * To bring UFS host controller to operational state, + * 1. Enable required interrupts + * 2. Configure interrupt aggregation + * 3. Program UTRL and UTMRL base address + * 4. Configure run-stop-registers + * + */ +static int ufshcd_make_hba_operational(struct ufs_hba *hba) +{ + int err = 0; + u32 reg; + + /* Enable required interrupts */ + ufshcd_enable_intr(hba, UFSHCD_ENABLE_INTRS); + + /* Disable interrupt aggregation */ + ufshcd_disable_intr_aggr(hba); + + /* Configure UTRL and UTMRL base address registers */ + ufshcd_writel(hba, lower_32_bits((dma_addr_t)hba->utrdl), + REG_UTP_TRANSFER_REQ_LIST_BASE_L); + ufshcd_writel(hba, upper_32_bits((dma_addr_t)hba->utrdl), + REG_UTP_TRANSFER_REQ_LIST_BASE_H); + ufshcd_writel(hba, lower_32_bits((dma_addr_t)hba->utmrdl), + REG_UTP_TASK_REQ_LIST_BASE_L); + ufshcd_writel(hba, upper_32_bits((dma_addr_t)hba->utmrdl), + REG_UTP_TASK_REQ_LIST_BASE_H); + + /* + * UCRDY, UTMRLDY and UTRLRDY bits must be 1 + */ + reg = ufshcd_readl(hba, REG_CONTROLLER_STATUS); + if (!(ufshcd_get_lists_status(reg))) { + ufshcd_enable_run_stop_reg(hba); + } else { + dev_err(hba->dev, + "Host controller not ready to process requests"); + err = -EIO; + goto out; + } + +out: + return err; +} + +/** + * ufshcd_link_startup - Initialize unipro link startup + */ +static int ufshcd_link_startup(struct ufs_hba *hba) +{ + int ret; + int retries = DME_LINKSTARTUP_RETRIES; + bool link_startup_again = true; + +link_startup: + do { + ufshcd_ops_link_startup_notify(hba, PRE_CHANGE); + + ret = ufshcd_dme_link_startup(hba); + + /* check if device is detected by inter-connect layer */ + if (!ret && !ufshcd_is_device_present(hba)) { + dev_err(hba->dev, "%s: Device not present\n", __func__); + ret = -ENXIO; + goto out; + } + + /* + * DME link lost indication is only received when link is up, + * but we can't be sure if the link is up until link startup + * succeeds. So reset the local Uni-Pro and try again. + */ + if (ret && ufshcd_hba_enable(hba)) + goto out; + } while (ret && retries--); + + if (ret) + /* failed to get the link up... retire */ + goto out; + + if (link_startup_again) { + link_startup_again = false; + retries = DME_LINKSTARTUP_RETRIES; + goto link_startup; + } + + /* Mark that link is up in PWM-G1, 1-lane, SLOW-AUTO mode */ + ufshcd_init_pwr_info(hba); + + if (hba->quirks & UFSHCD_QUIRK_BROKEN_LCC) { + ret = ufshcd_disable_device_tx_lcc(hba); + if (ret) + goto out; + } + + /* Include any host controller configuration via UIC commands */ + ret = ufshcd_ops_link_startup_notify(hba, POST_CHANGE); + if (ret) + goto out; + + ret = ufshcd_make_hba_operational(hba); +out: + if (ret) + dev_err(hba->dev, "link startup failed %d\n", ret); + + return ret; +} + +/** + * ufshcd_hba_stop - Send controller to reset state + */ +static inline void ufshcd_hba_stop(struct ufs_hba *hba) +{ + int err; + + ufshcd_writel(hba, CONTROLLER_DISABLE, REG_CONTROLLER_ENABLE); + err = ufshcd_wait_for_register(hba, REG_CONTROLLER_ENABLE, + CONTROLLER_ENABLE, CONTROLLER_DISABLE, + 10); + if (err) + dev_err(hba->dev, "%s: Controller disable failed\n", __func__); +} + +/** + * ufshcd_is_hba_active - Get controller state + */ +static inline bool ufshcd_is_hba_active(struct ufs_hba *hba) +{ + return (ufshcd_readl(hba, REG_CONTROLLER_ENABLE) & CONTROLLER_ENABLE) + ? false : true; +} + +/** + * ufshcd_hba_start - Start controller initialization sequence + */ +static inline void ufshcd_hba_start(struct ufs_hba *hba) +{ + ufshcd_writel(hba, CONTROLLER_ENABLE, REG_CONTROLLER_ENABLE); +} + +/** + * ufshcd_hba_enable - initialize the controller + */ +static int ufshcd_hba_enable(struct ufs_hba *hba) +{ + int retry; + + if (!ufshcd_is_hba_active(hba)) + /* change controller state to "reset state" */ + ufshcd_hba_stop(hba); + + ufshcd_ops_hce_enable_notify(hba, PRE_CHANGE); + + /* start controller initialization sequence */ + ufshcd_hba_start(hba); + + /* + * To initialize a UFS host controller HCE bit must be set to 1. + * During initialization the HCE bit value changes from 1->0->1. + * When the host controller completes initialization sequence + * it sets the value of HCE bit to 1. The same HCE bit is read back + * to check if the controller has completed initialization sequence. + * So without this delay the value HCE = 1, set in the previous + * instruction might be read back. + * This delay can be changed based on the controller. + */ + mdelay(1); + + /* wait for the host controller to complete initialization */ + retry = 10; + while (ufshcd_is_hba_active(hba)) { + if (retry) { + retry--; + } else { + dev_err(hba->dev, "Controller enable failed\n"); + return -EIO; + } + mdelay(5); + } + + /* enable UIC related interrupts */ + ufshcd_enable_intr(hba, UFSHCD_UIC_MASK); + + ufshcd_ops_hce_enable_notify(hba, POST_CHANGE); + + return 0; +} + +/** + * ufshcd_host_memory_configure - configure local reference block with + * memory offsets + */ +static void ufshcd_host_memory_configure(struct ufs_hba *hba) +{ + struct utp_transfer_req_desc *utrdlp; + dma_addr_t cmd_desc_dma_addr; + u16 response_offset; + u16 prdt_offset; + + utrdlp = hba->utrdl; + cmd_desc_dma_addr = (dma_addr_t)hba->ucdl; + + utrdlp->command_desc_base_addr_lo = + cpu_to_le32(lower_32_bits(cmd_desc_dma_addr)); + utrdlp->command_desc_base_addr_hi = + cpu_to_le32(upper_32_bits(cmd_desc_dma_addr)); + + response_offset = offsetof(struct utp_transfer_cmd_desc, response_upiu); + prdt_offset = offsetof(struct utp_transfer_cmd_desc, prd_table); + + utrdlp->response_upiu_offset = cpu_to_le16(response_offset >> 2); + utrdlp->prd_table_offset = cpu_to_le16(prdt_offset >> 2); + utrdlp->response_upiu_length = cpu_to_le16(ALIGNED_UPIU_SIZE >> 2); + + hba->ucd_req_ptr = (struct utp_upiu_req *)hba->ucdl; + hba->ucd_rsp_ptr = + (struct utp_upiu_rsp *)&hba->ucdl->response_upiu; + hba->ucd_prdt_ptr = + (struct ufshcd_sg_entry *)&hba->ucdl->prd_table; +} + +/** + * ufshcd_memory_alloc - allocate memory for host memory space data structures + */ +static int ufshcd_memory_alloc(struct ufs_hba *hba) +{ + /* Allocate one Transfer Request Descriptor + * Should be aligned to 1k boundary. + */ + hba->utrdl = memalign(1024, sizeof(struct utp_transfer_req_desc)); + if (!hba->utrdl) { + dev_err(hba->dev, "Transfer Descriptor memory allocation failed\n"); + return -ENOMEM; + } + + /* Allocate one Command Descriptor + * Should be aligned to 1k boundary. + */ + hba->ucdl = memalign(1024, sizeof(struct utp_transfer_cmd_desc)); + if (!hba->ucdl) { + dev_err(hba->dev, "Command descriptor memory allocation failed\n"); + return -ENOMEM; + } + + return 0; +} + +/** + * ufshcd_get_intr_mask - Get the interrupt bit mask + */ +static inline u32 ufshcd_get_intr_mask(struct ufs_hba *hba) +{ + u32 intr_mask = 0; + + switch (hba->version) { + case UFSHCI_VERSION_10: + intr_mask = INTERRUPT_MASK_ALL_VER_10; + break; + case UFSHCI_VERSION_11: + case UFSHCI_VERSION_20: + intr_mask = INTERRUPT_MASK_ALL_VER_11; + break; + case UFSHCI_VERSION_21: + default: + intr_mask = INTERRUPT_MASK_ALL_VER_21; + break; + } + + return intr_mask; +} + +/** + * ufshcd_get_ufs_version - Get the UFS version supported by the HBA + */ +static inline u32 ufshcd_get_ufs_version(struct ufs_hba *hba) +{ + return ufshcd_readl(hba, REG_UFS_VERSION); +} + +/** + * ufshcd_get_upmcrs - Get the power mode change request status + */ +static inline u8 ufshcd_get_upmcrs(struct ufs_hba *hba) +{ + return (ufshcd_readl(hba, REG_CONTROLLER_STATUS) >> 8) & 0x7; +} + +/** + * ufshcd_prepare_req_desc_hdr() - Fills the requests header + * descriptor according to request + */ +static void ufshcd_prepare_req_desc_hdr(struct utp_transfer_req_desc *req_desc, + u32 *upiu_flags, + enum dma_data_direction cmd_dir) +{ + u32 data_direction; + u32 dword_0; + + if (cmd_dir == DMA_FROM_DEVICE) { + data_direction = UTP_DEVICE_TO_HOST; + *upiu_flags = UPIU_CMD_FLAGS_READ; + } else if (cmd_dir == DMA_TO_DEVICE) { + data_direction = UTP_HOST_TO_DEVICE; + *upiu_flags = UPIU_CMD_FLAGS_WRITE; + } else { + data_direction = UTP_NO_DATA_TRANSFER; + *upiu_flags = UPIU_CMD_FLAGS_NONE; + } + + dword_0 = data_direction | (0x1 << UPIU_COMMAND_TYPE_OFFSET); + + /* Enable Interrupt for command */ + dword_0 |= UTP_REQ_DESC_INT_CMD; + + /* Transfer request descriptor header fields */ + req_desc->header.dword_0 = cpu_to_le32(dword_0); + /* dword_1 is reserved, hence it is set to 0 */ + req_desc->header.dword_1 = 0; + /* + * assigning invalid value for command status. Controller + * updates OCS on command completion, with the command + * status + */ + req_desc->header.dword_2 = + cpu_to_le32(OCS_INVALID_COMMAND_STATUS); + /* dword_3 is reserved, hence it is set to 0 */ + req_desc->header.dword_3 = 0; + + req_desc->prd_table_length = 0; +} + +static void ufshcd_prepare_utp_query_req_upiu(struct ufs_hba *hba, + u32 upiu_flags) +{ + struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr; + struct ufs_query *query = &hba->dev_cmd.query; + u16 len = be16_to_cpu(query->request.upiu_req.length); + + /* Query request header */ + ucd_req_ptr->header.dword_0 = + UPIU_HEADER_DWORD(UPIU_TRANSACTION_QUERY_REQ, + upiu_flags, 0, TASK_TAG); + ucd_req_ptr->header.dword_1 = + UPIU_HEADER_DWORD(0, query->request.query_func, + 0, 0); + + /* Data segment length only need for WRITE_DESC */ + if (query->request.upiu_req.opcode == UPIU_QUERY_OPCODE_WRITE_DESC) + ucd_req_ptr->header.dword_2 = + UPIU_HEADER_DWORD(0, 0, (len >> 8), (u8)len); + else + ucd_req_ptr->header.dword_2 = 0; + + /* Copy the Query Request buffer as is */ + memcpy(&ucd_req_ptr->qr, &query->request.upiu_req, QUERY_OSF_SIZE); + + /* Copy the Descriptor */ + if (query->request.upiu_req.opcode == UPIU_QUERY_OPCODE_WRITE_DESC) + memcpy(ucd_req_ptr + 1, query->descriptor, len); + + memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp)); +} + +static inline void ufshcd_prepare_utp_nop_upiu(struct ufs_hba *hba) +{ + struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr; + + memset(ucd_req_ptr, 0, sizeof(struct utp_upiu_req)); + + /* command descriptor fields */ + ucd_req_ptr->header.dword_0 = + UPIU_HEADER_DWORD(UPIU_TRANSACTION_NOP_OUT, 0, 0, TASK_TAG); + /* clear rest of the fields of basic header */ + ucd_req_ptr->header.dword_1 = 0; + ucd_req_ptr->header.dword_2 = 0; + + memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp)); +} + +/** + * ufshcd_comp_devman_upiu - UFS Protocol Information Unit(UPIU) + * for Device Management Purposes + */ +static int ufshcd_comp_devman_upiu(struct ufs_hba *hba, + enum dev_cmd_type cmd_type) +{ + u32 upiu_flags; + int ret = 0; + struct utp_transfer_req_desc *req_desc = hba->utrdl; + + hba->dev_cmd.type = cmd_type; + + ufshcd_prepare_req_desc_hdr(req_desc, &upiu_flags, DMA_NONE); + switch (cmd_type) { + case DEV_CMD_TYPE_QUERY: + ufshcd_prepare_utp_query_req_upiu(hba, upiu_flags); + break; + case DEV_CMD_TYPE_NOP: + ufshcd_prepare_utp_nop_upiu(hba); + break; + default: + ret = -EINVAL; + } + + return ret; +} + +static int ufshcd_send_command(struct ufs_hba *hba, unsigned int task_tag) +{ + unsigned long start; + u32 intr_status; + u32 enabled_intr_status; + + ufshcd_writel(hba, 1 << task_tag, REG_UTP_TRANSFER_REQ_DOOR_BELL); + + start = get_timer(0); + do { + intr_status = ufshcd_readl(hba, REG_INTERRUPT_STATUS); + enabled_intr_status = intr_status & hba->intr_mask; + ufshcd_writel(hba, intr_status, REG_INTERRUPT_STATUS); + + if (get_timer(start) > QUERY_REQ_TIMEOUT) { + dev_err(hba->dev, + "Timedout waiting for UTP response\n"); + + return -ETIMEDOUT; + } + + if (enabled_intr_status & UFSHCD_ERROR_MASK) { + dev_err(hba->dev, "Error in status:%08x\n", + enabled_intr_status); + + return -1; + } + } while (!(enabled_intr_status & UTP_TRANSFER_REQ_COMPL)); + + return 0; +} + +/** + * ufshcd_get_req_rsp - returns the TR response transaction type + */ +static inline int ufshcd_get_req_rsp(struct utp_upiu_rsp *ucd_rsp_ptr) +{ + return be32_to_cpu(ucd_rsp_ptr->header.dword_0) >> 24; +} + +/** + * ufshcd_get_tr_ocs - Get the UTRD Overall Command Status + * + */ +static inline int ufshcd_get_tr_ocs(struct ufs_hba *hba) +{ + return le32_to_cpu(hba->utrdl->header.dword_2) & MASK_OCS; +} + +static inline int ufshcd_get_rsp_upiu_result(struct utp_upiu_rsp *ucd_rsp_ptr) +{ + return be32_to_cpu(ucd_rsp_ptr->header.dword_1) & MASK_RSP_UPIU_RESULT; +} + +static int ufshcd_check_query_response(struct ufs_hba *hba) +{ + struct ufs_query_res *query_res = &hba->dev_cmd.query.response; + + /* Get the UPIU response */ + query_res->response = ufshcd_get_rsp_upiu_result(hba->ucd_rsp_ptr) >> + UPIU_RSP_CODE_OFFSET; + return query_res->response; +} + +/** + * ufshcd_copy_query_response() - Copy the Query Response and the data + * descriptor + */ +static int ufshcd_copy_query_response(struct ufs_hba *hba) +{ + struct ufs_query_res *query_res = &hba->dev_cmd.query.response; + + memcpy(&query_res->upiu_res, &hba->ucd_rsp_ptr->qr, QUERY_OSF_SIZE); + + /* Get the descriptor */ + if (hba->dev_cmd.query.descriptor && + hba->ucd_rsp_ptr->qr.opcode == UPIU_QUERY_OPCODE_READ_DESC) { + u8 *descp = (u8 *)hba->ucd_rsp_ptr + + GENERAL_UPIU_REQUEST_SIZE; + u16 resp_len; + u16 buf_len; + + /* data segment length */ + resp_len = be32_to_cpu(hba->ucd_rsp_ptr->header.dword_2) & + MASK_QUERY_DATA_SEG_LEN; + buf_len = + be16_to_cpu(hba->dev_cmd.query.request.upiu_req.length); + if (likely(buf_len >= resp_len)) { + memcpy(hba->dev_cmd.query.descriptor, descp, resp_len); + } else { + dev_warn(hba->dev, + "%s: Response size is bigger than buffer", + __func__); + return -EINVAL; + } + } + + return 0; +} + +/** + * ufshcd_exec_dev_cmd - API for sending device management requests + */ +static int ufshcd_exec_dev_cmd(struct ufs_hba *hba, enum dev_cmd_type cmd_type, + int timeout) +{ + int err; + int resp; + + err = ufshcd_comp_devman_upiu(hba, cmd_type); + if (err) + return err; + + err = ufshcd_send_command(hba, TASK_TAG); + if (err) + return err; + + err = ufshcd_get_tr_ocs(hba); + if (err) { + dev_err(hba->dev, "Error in OCS:%d\n", err); + return -EINVAL; + } + + resp = ufshcd_get_req_rsp(hba->ucd_rsp_ptr); + switch (resp) { + case UPIU_TRANSACTION_NOP_IN: + break; + case UPIU_TRANSACTION_QUERY_RSP: + err = ufshcd_check_query_response(hba); + if (!err) + err = ufshcd_copy_query_response(hba); + break; + case UPIU_TRANSACTION_REJECT_UPIU: + /* TODO: handle Reject UPIU Response */ + err = -EPERM; + dev_err(hba->dev, "%s: Reject UPIU not fully implemented\n", + __func__); + break; + default: + err = -EINVAL; + dev_err(hba->dev, "%s: Invalid device management cmd response: %x\n", + __func__, resp); + } + + return err; +} + +/** + * ufshcd_init_query() - init the query response and request parameters + */ +static inline void ufshcd_init_query(struct ufs_hba *hba, + struct ufs_query_req **request, + struct ufs_query_res **response, + enum query_opcode opcode, + u8 idn, u8 index, u8 selector) +{ + *request = &hba->dev_cmd.query.request; + *response = &hba->dev_cmd.query.response; + memset(*request, 0, sizeof(struct ufs_query_req)); + memset(*response, 0, sizeof(struct ufs_query_res)); + (*request)->upiu_req.opcode = opcode; + (*request)->upiu_req.idn = idn; + (*request)->upiu_req.index = index; + (*request)->upiu_req.selector = selector; +} + +/** + * ufshcd_query_flag() - API function for sending flag query requests + */ +int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode, + enum flag_idn idn, bool *flag_res) +{ + struct ufs_query_req *request = NULL; + struct ufs_query_res *response = NULL; + int err, index = 0, selector = 0; + int timeout = QUERY_REQ_TIMEOUT; + + ufshcd_init_query(hba, &request, &response, opcode, idn, index, + selector); + + switch (opcode) { + case UPIU_QUERY_OPCODE_SET_FLAG: + case UPIU_QUERY_OPCODE_CLEAR_FLAG: + case UPIU_QUERY_OPCODE_TOGGLE_FLAG: + request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; + break; + case UPIU_QUERY_OPCODE_READ_FLAG: + request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST; + if (!flag_res) { + /* No dummy reads */ + dev_err(hba->dev, "%s: Invalid argument for read request\n", + __func__); + err = -EINVAL; + goto out; + } + break; + default: + dev_err(hba->dev, + "%s: Expected query flag opcode but got = %d\n", + __func__, opcode); + err = -EINVAL; + goto out; + } + + err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, timeout); + + if (err) { + dev_err(hba->dev, + "%s: Sending flag query for idn %d failed, err = %d\n", + __func__, idn, err); + goto out; + } + + if (flag_res) + *flag_res = (be32_to_cpu(response->upiu_res.value) & + MASK_QUERY_UPIU_FLAG_LOC) & 0x1; + +out: + return err; +} + +static int ufshcd_query_flag_retry(struct ufs_hba *hba, + enum query_opcode opcode, + enum flag_idn idn, bool *flag_res) +{ + int ret; + int retries; + + for (retries = 0; retries < QUERY_REQ_RETRIES; retries++) { + ret = ufshcd_query_flag(hba, opcode, idn, flag_res); + if (ret) + dev_dbg(hba->dev, + "%s: failed with error %d, retries %d\n", + __func__, ret, retries); + else + break; + } + + if (ret) + dev_err(hba->dev, + "%s: query attribute, opcode %d, idn %d, failed with error %d after %d retires\n", + __func__, opcode, idn, ret, retries); + return ret; +} + +static int __ufshcd_query_descriptor(struct ufs_hba *hba, + enum query_opcode opcode, + enum desc_idn idn, u8 index, u8 selector, + u8 *desc_buf, int *buf_len) +{ + struct ufs_query_req *request = NULL; + struct ufs_query_res *response = NULL; + int err; + + if (!desc_buf) { + dev_err(hba->dev, "%s: descriptor buffer required for opcode 0x%x\n", + __func__, opcode); + err = -EINVAL; + goto out; + } + + if (*buf_len < QUERY_DESC_MIN_SIZE || *buf_len > QUERY_DESC_MAX_SIZE) { + dev_err(hba->dev, "%s: descriptor buffer size (%d) is out of range\n", + __func__, *buf_len); + err = -EINVAL; + goto out; + } + + ufshcd_init_query(hba, &request, &response, opcode, idn, index, + selector); + hba->dev_cmd.query.descriptor = desc_buf; + request->upiu_req.length = cpu_to_be16(*buf_len); + + switch (opcode) { + case UPIU_QUERY_OPCODE_WRITE_DESC: + request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; + break; + case UPIU_QUERY_OPCODE_READ_DESC: + request->query_func = UPIU_QUERY_FUNC_STANDARD_READ_REQUEST; + break; + default: + dev_err(hba->dev, "%s: Expected query descriptor opcode but got = 0x%.2x\n", + __func__, opcode); + err = -EINVAL; + goto out; + } + + err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, QUERY_REQ_TIMEOUT); + + if (err) { + dev_err(hba->dev, "%s: opcode 0x%.2x for idn %d failed, index %d, err = %d\n", + __func__, opcode, idn, index, err); + goto out; + } + + hba->dev_cmd.query.descriptor = NULL; + *buf_len = be16_to_cpu(response->upiu_res.length); + +out: + return err; +} + +/** + * ufshcd_query_descriptor_retry - API function for sending descriptor requests + */ +int ufshcd_query_descriptor_retry(struct ufs_hba *hba, enum query_opcode opcode, + enum desc_idn idn, u8 index, u8 selector, + u8 *desc_buf, int *buf_len) +{ + int err; + int retries; + + for (retries = QUERY_REQ_RETRIES; retries > 0; retries--) { + err = __ufshcd_query_descriptor(hba, opcode, idn, index, + selector, desc_buf, buf_len); + if (!err || err == -EINVAL) + break; + } + + return err; +} + +/** + * ufshcd_read_desc_length - read the specified descriptor length from header + */ +static int ufshcd_read_desc_length(struct ufs_hba *hba, enum desc_idn desc_id, + int desc_index, int *desc_length) +{ + int ret; + u8 header[QUERY_DESC_HDR_SIZE]; + int header_len = QUERY_DESC_HDR_SIZE; + + if (desc_id >= QUERY_DESC_IDN_MAX) + return -EINVAL; + + ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC, + desc_id, desc_index, 0, header, + &header_len); + + if (ret) { + dev_err(hba->dev, "%s: Failed to get descriptor header id %d", + __func__, desc_id); + return ret; + } else if (desc_id != header[QUERY_DESC_DESC_TYPE_OFFSET]) { + dev_warn(hba->dev, "%s: descriptor header id %d and desc_id %d mismatch", + __func__, header[QUERY_DESC_DESC_TYPE_OFFSET], + desc_id); + ret = -EINVAL; + } + + *desc_length = header[QUERY_DESC_LENGTH_OFFSET]; + + return ret; +} + +static void ufshcd_init_desc_sizes(struct ufs_hba *hba) +{ + int err; + + err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_DEVICE, 0, + &hba->desc_size.dev_desc); + if (err) + hba->desc_size.dev_desc = QUERY_DESC_DEVICE_DEF_SIZE; + + err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_POWER, 0, + &hba->desc_size.pwr_desc); + if (err) + hba->desc_size.pwr_desc = QUERY_DESC_POWER_DEF_SIZE; + + err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_INTERCONNECT, 0, + &hba->desc_size.interc_desc); + if (err) + hba->desc_size.interc_desc = QUERY_DESC_INTERCONNECT_DEF_SIZE; + + err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_CONFIGURATION, 0, + &hba->desc_size.conf_desc); + if (err) + hba->desc_size.conf_desc = QUERY_DESC_CONFIGURATION_DEF_SIZE; + + err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_UNIT, 0, + &hba->desc_size.unit_desc); + if (err) + hba->desc_size.unit_desc = QUERY_DESC_UNIT_DEF_SIZE; + + err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_GEOMETRY, 0, + &hba->desc_size.geom_desc); + if (err) + hba->desc_size.geom_desc = QUERY_DESC_GEOMETRY_DEF_SIZE; + + err = ufshcd_read_desc_length(hba, QUERY_DESC_IDN_HEALTH, 0, + &hba->desc_size.hlth_desc); + if (err) + hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE; +} + +/** + * ufshcd_map_desc_id_to_length - map descriptor IDN to its length + * + */ +int ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id, + int *desc_len) +{ + switch (desc_id) { + case QUERY_DESC_IDN_DEVICE: + *desc_len = hba->desc_size.dev_desc; + break; + case QUERY_DESC_IDN_POWER: + *desc_len = hba->desc_size.pwr_desc; + break; + case QUERY_DESC_IDN_GEOMETRY: + *desc_len = hba->desc_size.geom_desc; + break; + case QUERY_DESC_IDN_CONFIGURATION: + *desc_len = hba->desc_size.conf_desc; + break; + case QUERY_DESC_IDN_UNIT: + *desc_len = hba->desc_size.unit_desc; + break; + case QUERY_DESC_IDN_INTERCONNECT: + *desc_len = hba->desc_size.interc_desc; + break; + case QUERY_DESC_IDN_STRING: + *desc_len = QUERY_DESC_MAX_SIZE; + break; + case QUERY_DESC_IDN_HEALTH: + *desc_len = hba->desc_size.hlth_desc; + break; + case QUERY_DESC_IDN_RFU_0: + case QUERY_DESC_IDN_RFU_1: + *desc_len = 0; + break; + default: + *desc_len = 0; + return -EINVAL; + } + return 0; +} +EXPORT_SYMBOL(ufshcd_map_desc_id_to_length); + +/** + * ufshcd_read_desc_param - read the specified descriptor parameter + * + */ +int ufshcd_read_desc_param(struct ufs_hba *hba, enum desc_idn desc_id, + int desc_index, u8 param_offset, u8 *param_read_buf, + u8 param_size) +{ + int ret; + u8 *desc_buf; + int buff_len; + bool is_kmalloc = true; + + /* Safety check */ + if (desc_id >= QUERY_DESC_IDN_MAX || !param_size) + return -EINVAL; + + /* Get the max length of descriptor from structure filled up at probe + * time. + */ + ret = ufshcd_map_desc_id_to_length(hba, desc_id, &buff_len); + + /* Sanity checks */ + if (ret || !buff_len) { + dev_err(hba->dev, "%s: Failed to get full descriptor length", + __func__); + return ret; + } + + /* Check whether we need temp memory */ + if (param_offset != 0 || param_size < buff_len) { + desc_buf = kmalloc(buff_len, GFP_KERNEL); + if (!desc_buf) + return -ENOMEM; + } else { + desc_buf = param_read_buf; + is_kmalloc = false; + } + + /* Request for full descriptor */ + ret = ufshcd_query_descriptor_retry(hba, UPIU_QUERY_OPCODE_READ_DESC, + desc_id, desc_index, 0, desc_buf, + &buff_len); + + if (ret) { + dev_err(hba->dev, "%s: Failed reading descriptor. desc_id %d, desc_index %d, param_offset %d, ret %d", + __func__, desc_id, desc_index, param_offset, ret); + goto out; + } + + /* Sanity check */ + if (desc_buf[QUERY_DESC_DESC_TYPE_OFFSET] != desc_id) { + dev_err(hba->dev, "%s: invalid desc_id %d in descriptor header", + __func__, desc_buf[QUERY_DESC_DESC_TYPE_OFFSET]); + ret = -EINVAL; + goto out; + } + + /* Check wherher we will not copy more data, than available */ + if (is_kmalloc && param_size > buff_len) + param_size = buff_len; + + if (is_kmalloc) + memcpy(param_read_buf, &desc_buf[param_offset], param_size); +out: + if (is_kmalloc) + kfree(desc_buf); + return ret; +} + +/* replace non-printable or non-ASCII characters with spaces */ +static inline void ufshcd_remove_non_printable(uint8_t *val) +{ + if (!val) + return; + + if (*val < 0x20 || *val > 0x7e) + *val = ' '; +} + +/** + * ufshcd_uic_pwr_ctrl - executes UIC commands (which affects the link power + * state) and waits for it to take effect. + * + */ +static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd) +{ + unsigned long start = 0; + u8 status; + int ret; + + ret = ufshcd_send_uic_cmd(hba, cmd); + if (ret) { + dev_err(hba->dev, + "pwr ctrl cmd 0x%x with mode 0x%x uic error %d\n", + cmd->command, cmd->argument3, ret); + + return ret; + } + + start = get_timer(0); + do { + status = ufshcd_get_upmcrs(hba); + if (get_timer(start) > UFS_UIC_CMD_TIMEOUT) { + dev_err(hba->dev, + "pwr ctrl cmd 0x%x failed, host upmcrs:0x%x\n", + cmd->command, status); + ret = (status != PWR_OK) ? status : -1; + break; + } + } while (status != PWR_LOCAL); + + return ret; +} + +/** + * ufshcd_uic_change_pwr_mode - Perform the UIC power mode change + * using DME_SET primitives. + */ +static int ufshcd_uic_change_pwr_mode(struct ufs_hba *hba, u8 mode) +{ + struct uic_command uic_cmd = {0}; + int ret; + + uic_cmd.command = UIC_CMD_DME_SET; + uic_cmd.argument1 = UIC_ARG_MIB(PA_PWRMODE); + uic_cmd.argument3 = mode; + ret = ufshcd_uic_pwr_ctrl(hba, &uic_cmd); + + return ret; +} + +static +void ufshcd_prepare_utp_scsi_cmd_upiu(struct ufs_hba *hba, + struct scsi_cmd *pccb, u32 upiu_flags) +{ + struct utp_upiu_req *ucd_req_ptr = hba->ucd_req_ptr; + unsigned int cdb_len; + + /* command descriptor fields */ + ucd_req_ptr->header.dword_0 = + UPIU_HEADER_DWORD(UPIU_TRANSACTION_COMMAND, upiu_flags, + pccb->lun, TASK_TAG); + ucd_req_ptr->header.dword_1 = + UPIU_HEADER_DWORD(UPIU_COMMAND_SET_TYPE_SCSI, 0, 0, 0); + + /* Total EHS length and Data segment length will be zero */ + ucd_req_ptr->header.dword_2 = 0; + + ucd_req_ptr->sc.exp_data_transfer_len = cpu_to_be32(pccb->datalen); + + cdb_len = min_t(unsigned short, pccb->cmdlen, UFS_CDB_SIZE); + memset(ucd_req_ptr->sc.cdb, 0, UFS_CDB_SIZE); + memcpy(ucd_req_ptr->sc.cdb, pccb->cmd, cdb_len); + + memset(hba->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp)); +} + +static inline void prepare_prdt_desc(struct ufshcd_sg_entry *entry, + unsigned char *buf, ulong len) +{ + entry->size = cpu_to_le32(len) | GENMASK(1, 0); + entry->base_addr = cpu_to_le32(lower_32_bits((unsigned long)buf)); + entry->upper_addr = cpu_to_le32(upper_32_bits((unsigned long)buf)); +} + +static void prepare_prdt_table(struct ufs_hba *hba, struct scsi_cmd *pccb) +{ + struct utp_transfer_req_desc *req_desc = hba->utrdl; + struct ufshcd_sg_entry *prd_table = hba->ucd_prdt_ptr; + ulong datalen = pccb->datalen; + int table_length; + u8 *buf; + int i; + + if (!datalen) { + req_desc->prd_table_length = 0; + return; + } + + table_length = DIV_ROUND_UP(pccb->datalen, MAX_PRDT_ENTRY); + buf = pccb->pdata; + i = table_length; + while (--i) { + prepare_prdt_desc(&prd_table[table_length - i - 1], buf, + MAX_PRDT_ENTRY - 1); + buf += MAX_PRDT_ENTRY; + datalen -= MAX_PRDT_ENTRY; + } + + prepare_prdt_desc(&prd_table[table_length - i - 1], buf, datalen - 1); + + req_desc->prd_table_length = table_length; +} + +static int ufs_scsi_exec(struct udevice *scsi_dev, struct scsi_cmd *pccb) +{ + struct ufs_hba *hba = dev_get_uclass_priv(scsi_dev->parent); + struct utp_transfer_req_desc *req_desc = hba->utrdl; + u32 upiu_flags; + int ocs, result = 0; + u8 scsi_status; + + ufshcd_prepare_req_desc_hdr(req_desc, &upiu_flags, pccb->dma_dir); + ufshcd_prepare_utp_scsi_cmd_upiu(hba, pccb, upiu_flags); + prepare_prdt_table(hba, pccb); + + ufshcd_send_command(hba, TASK_TAG); + + ocs = ufshcd_get_tr_ocs(hba); + switch (ocs) { + case OCS_SUCCESS: + result = ufshcd_get_req_rsp(hba->ucd_rsp_ptr); + switch (result) { + case UPIU_TRANSACTION_RESPONSE: + result = ufshcd_get_rsp_upiu_result(hba->ucd_rsp_ptr); + + scsi_status = result & MASK_SCSI_STATUS; + if (scsi_status) + return -EINVAL; + + break; + case UPIU_TRANSACTION_REJECT_UPIU: + /* TODO: handle Reject UPIU Response */ + dev_err(hba->dev, + "Reject UPIU not fully implemented\n"); + return -EINVAL; + default: + dev_err(hba->dev, + "Unexpected request response code = %x\n", + result); + return -EINVAL; + } + break; + default: + dev_err(hba->dev, "OCS error from controller = %x\n", ocs); + return -EINVAL; + } + + return 0; +} + +static inline int ufshcd_read_desc(struct ufs_hba *hba, enum desc_idn desc_id, + int desc_index, u8 *buf, u32 size) +{ + return ufshcd_read_desc_param(hba, desc_id, desc_index, 0, buf, size); +} + +static int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size) +{ + return ufshcd_read_desc(hba, QUERY_DESC_IDN_DEVICE, 0, buf, size); +} + +/** + * ufshcd_read_string_desc - read string descriptor + * + */ +int ufshcd_read_string_desc(struct ufs_hba *hba, int desc_index, + u8 *buf, u32 size, bool ascii) +{ + int err = 0; + + err = ufshcd_read_desc(hba, QUERY_DESC_IDN_STRING, desc_index, buf, + size); + + if (err) { + dev_err(hba->dev, "%s: reading String Desc failed after %d retries. err = %d\n", + __func__, QUERY_REQ_RETRIES, err); + goto out; + } + + if (ascii) { + int desc_len; + int ascii_len; + int i; + u8 *buff_ascii; + + desc_len = buf[0]; + /* remove header and divide by 2 to move from UTF16 to UTF8 */ + ascii_len = (desc_len - QUERY_DESC_HDR_SIZE) / 2 + 1; + if (size < ascii_len + QUERY_DESC_HDR_SIZE) { + dev_err(hba->dev, "%s: buffer allocated size is too small\n", + __func__); + err = -ENOMEM; + goto out; + } + + buff_ascii = kmalloc(ascii_len, GFP_KERNEL); + if (!buff_ascii) { + err = -ENOMEM; + goto out; + } + + /* + * the descriptor contains string in UTF16 format + * we need to convert to utf-8 so it can be displayed + */ + utf16_to_utf8(buff_ascii, + (uint16_t *)&buf[QUERY_DESC_HDR_SIZE], ascii_len); + + /* replace non-printable or non-ASCII characters with spaces */ + for (i = 0; i < ascii_len; i++) + ufshcd_remove_non_printable(&buff_ascii[i]); + + memset(buf + QUERY_DESC_HDR_SIZE, 0, + size - QUERY_DESC_HDR_SIZE); + memcpy(buf + QUERY_DESC_HDR_SIZE, buff_ascii, ascii_len); + buf[QUERY_DESC_LENGTH_OFFSET] = ascii_len + QUERY_DESC_HDR_SIZE; + kfree(buff_ascii); + } +out: + return err; +} + +static int ufs_get_device_desc(struct ufs_hba *hba, + struct ufs_dev_desc *dev_desc) +{ + int err; + size_t buff_len; + u8 model_index; + u8 *desc_buf; + + buff_len = max_t(size_t, hba->desc_size.dev_desc, + QUERY_DESC_MAX_SIZE + 1); + desc_buf = kmalloc(buff_len, GFP_KERNEL); + if (!desc_buf) { + err = -ENOMEM; + goto out; + } + + err = ufshcd_read_device_desc(hba, desc_buf, hba->desc_size.dev_desc); + if (err) { + dev_err(hba->dev, "%s: Failed reading Device Desc. err = %d\n", + __func__, err); + goto out; + } + + /* + * getting vendor (manufacturerID) and Bank Index in big endian + * format + */ + dev_desc->wmanufacturerid = desc_buf[DEVICE_DESC_PARAM_MANF_ID] << 8 | + desc_buf[DEVICE_DESC_PARAM_MANF_ID + 1]; + + model_index = desc_buf[DEVICE_DESC_PARAM_PRDCT_NAME]; + + /* Zero-pad entire buffer for string termination. */ + memset(desc_buf, 0, buff_len); + + err = ufshcd_read_string_desc(hba, model_index, desc_buf, + QUERY_DESC_MAX_SIZE, true/*ASCII*/); + if (err) { + dev_err(hba->dev, "%s: Failed reading Product Name. err = %d\n", + __func__, err); + goto out; + } + + desc_buf[QUERY_DESC_MAX_SIZE] = '\0'; + strlcpy(dev_desc->model, (char *)(desc_buf + QUERY_DESC_HDR_SIZE), + min_t(u8, desc_buf[QUERY_DESC_LENGTH_OFFSET], + MAX_MODEL_LEN)); + + /* Null terminate the model string */ + dev_desc->model[MAX_MODEL_LEN] = '\0'; + +out: + kfree(desc_buf); + return err; +} + +/** + * ufshcd_get_max_pwr_mode - reads the max power mode negotiated with device + */ +static int ufshcd_get_max_pwr_mode(struct ufs_hba *hba) +{ + struct ufs_pa_layer_attr *pwr_info = &hba->max_pwr_info.info; + + if (hba->max_pwr_info.is_valid) + return 0; + + pwr_info->pwr_tx = FAST_MODE; + pwr_info->pwr_rx = FAST_MODE; + pwr_info->hs_rate = PA_HS_MODE_B; + + /* Get the connected lane count */ + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES), + &pwr_info->lane_rx); + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES), + &pwr_info->lane_tx); + + if (!pwr_info->lane_rx || !pwr_info->lane_tx) { + dev_err(hba->dev, "%s: invalid connected lanes value. rx=%d, tx=%d\n", + __func__, pwr_info->lane_rx, pwr_info->lane_tx); + return -EINVAL; + } + + /* + * First, get the maximum gears of HS speed. + * If a zero value, it means there is no HSGEAR capability. + * Then, get the maximum gears of PWM speed. + */ + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR), &pwr_info->gear_rx); + if (!pwr_info->gear_rx) { + ufshcd_dme_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR), + &pwr_info->gear_rx); + if (!pwr_info->gear_rx) { + dev_err(hba->dev, "%s: invalid max pwm rx gear read = %d\n", + __func__, pwr_info->gear_rx); + return -EINVAL; + } + pwr_info->pwr_rx = SLOW_MODE; + } + + ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXHSGEAR), + &pwr_info->gear_tx); + if (!pwr_info->gear_tx) { + ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_MAXRXPWMGEAR), + &pwr_info->gear_tx); + if (!pwr_info->gear_tx) { + dev_err(hba->dev, "%s: invalid max pwm tx gear read = %d\n", + __func__, pwr_info->gear_tx); + return -EINVAL; + } + pwr_info->pwr_tx = SLOW_MODE; + } + + hba->max_pwr_info.is_valid = true; + return 0; +} + +static int ufshcd_change_power_mode(struct ufs_hba *hba, + struct ufs_pa_layer_attr *pwr_mode) +{ + int ret; + + /* if already configured to the requested pwr_mode */ + if (pwr_mode->gear_rx == hba->pwr_info.gear_rx && + pwr_mode->gear_tx == hba->pwr_info.gear_tx && + pwr_mode->lane_rx == hba->pwr_info.lane_rx && + pwr_mode->lane_tx == hba->pwr_info.lane_tx && + pwr_mode->pwr_rx == hba->pwr_info.pwr_rx && + pwr_mode->pwr_tx == hba->pwr_info.pwr_tx && + pwr_mode->hs_rate == hba->pwr_info.hs_rate) { + dev_dbg(hba->dev, "%s: power already configured\n", __func__); + return 0; + } + + /* + * Configure attributes for power mode change with below. + * - PA_RXGEAR, PA_ACTIVERXDATALANES, PA_RXTERMINATION, + * - PA_TXGEAR, PA_ACTIVETXDATALANES, PA_TXTERMINATION, + * - PA_HSSERIES + */ + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXGEAR), pwr_mode->gear_rx); + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVERXDATALANES), + pwr_mode->lane_rx); + if (pwr_mode->pwr_rx == FASTAUTO_MODE || pwr_mode->pwr_rx == FAST_MODE) + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXTERMINATION), TRUE); + else + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_RXTERMINATION), FALSE); + + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXGEAR), pwr_mode->gear_tx); + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_ACTIVETXDATALANES), + pwr_mode->lane_tx); + if (pwr_mode->pwr_tx == FASTAUTO_MODE || pwr_mode->pwr_tx == FAST_MODE) + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXTERMINATION), TRUE); + else + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_TXTERMINATION), FALSE); + + if (pwr_mode->pwr_rx == FASTAUTO_MODE || + pwr_mode->pwr_tx == FASTAUTO_MODE || + pwr_mode->pwr_rx == FAST_MODE || + pwr_mode->pwr_tx == FAST_MODE) + ufshcd_dme_set(hba, UIC_ARG_MIB(PA_HSSERIES), + pwr_mode->hs_rate); + + ret = ufshcd_uic_change_pwr_mode(hba, pwr_mode->pwr_rx << 4 | + pwr_mode->pwr_tx); + + if (ret) { + dev_err(hba->dev, + "%s: power mode change failed %d\n", __func__, ret); + + return ret; + } + + /* Copy new Power Mode to power info */ + memcpy(&hba->pwr_info, pwr_mode, sizeof(struct ufs_pa_layer_attr)); + + return ret; +} + +/** + * ufshcd_verify_dev_init() - Verify device initialization + * + */ +static int ufshcd_verify_dev_init(struct ufs_hba *hba) +{ + int retries; + int err; + + for (retries = NOP_OUT_RETRIES; retries > 0; retries--) { + err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_NOP, + NOP_OUT_TIMEOUT); + if (!err || err == -ETIMEDOUT) + break; + + dev_dbg(hba->dev, "%s: error %d retrying\n", __func__, err); + } + + if (err) + dev_err(hba->dev, "%s: NOP OUT failed %d\n", __func__, err); + + return err; +} + +/** + * ufshcd_complete_dev_init() - checks device readiness + */ +static int ufshcd_complete_dev_init(struct ufs_hba *hba) +{ + int i; + int err; + bool flag_res = 1; + + err = ufshcd_query_flag_retry(hba, UPIU_QUERY_OPCODE_SET_FLAG, + QUERY_FLAG_IDN_FDEVICEINIT, NULL); + if (err) { + dev_err(hba->dev, + "%s setting fDeviceInit flag failed with error %d\n", + __func__, err); + goto out; + } + + /* poll for max. 1000 iterations for fDeviceInit flag to clear */ + for (i = 0; i < 1000 && !err && flag_res; i++) + err = ufshcd_query_flag_retry(hba, UPIU_QUERY_OPCODE_READ_FLAG, + QUERY_FLAG_IDN_FDEVICEINIT, + &flag_res); + + if (err) + dev_err(hba->dev, + "%s reading fDeviceInit flag failed with error %d\n", + __func__, err); + else if (flag_res) + dev_err(hba->dev, + "%s fDeviceInit was not cleared by the device\n", + __func__); + +out: + return err; +} + +static void ufshcd_def_desc_sizes(struct ufs_hba *hba) +{ + hba->desc_size.dev_desc = QUERY_DESC_DEVICE_DEF_SIZE; + hba->desc_size.pwr_desc = QUERY_DESC_POWER_DEF_SIZE; + hba->desc_size.interc_desc = QUERY_DESC_INTERCONNECT_DEF_SIZE; + hba->desc_size.conf_desc = QUERY_DESC_CONFIGURATION_DEF_SIZE; + hba->desc_size.unit_desc = QUERY_DESC_UNIT_DEF_SIZE; + hba->desc_size.geom_desc = QUERY_DESC_GEOMETRY_DEF_SIZE; + hba->desc_size.hlth_desc = QUERY_DESC_HEALTH_DEF_SIZE; +} + +int ufs_start(struct ufs_hba *hba) +{ + struct ufs_dev_desc card = {0}; + int ret; + + ret = ufshcd_link_startup(hba); + if (ret) + return ret; + + ret = ufshcd_verify_dev_init(hba); + if (ret) + return ret; + + ret = ufshcd_complete_dev_init(hba); + if (ret) + return ret; + + /* Init check for device descriptor sizes */ + ufshcd_init_desc_sizes(hba); + + ret = ufs_get_device_desc(hba, &card); + if (ret) { + dev_err(hba->dev, "%s: Failed getting device info. err = %d\n", + __func__, ret); + + return ret; + } + + if (ufshcd_get_max_pwr_mode(hba)) { + dev_err(hba->dev, + "%s: Failed getting max supported power mode\n", + __func__); + } else { + ret = ufshcd_change_power_mode(hba, &hba->max_pwr_info.info); + if (ret) { + dev_err(hba->dev, "%s: Failed setting power mode, err = %d\n", + __func__, ret); + + return ret; + } + + printf("Device at %s up at:", hba->dev->name); + ufshcd_print_pwr_info(hba); + } + + return 0; +} + +int ufshcd_probe(struct udevice *ufs_dev, struct ufs_hba_ops *hba_ops) +{ + struct ufs_hba *hba = dev_get_uclass_priv(ufs_dev); + struct scsi_platdata *scsi_plat; + struct udevice *scsi_dev; + int err; + + device_find_first_child(ufs_dev, &scsi_dev); + if (!scsi_dev) + return -ENODEV; + + scsi_plat = dev_get_uclass_platdata(scsi_dev); + scsi_plat->max_id = UFSHCD_MAX_ID; + scsi_plat->max_lun = UFS_MAX_LUNS; + //scsi_plat->max_bytes_per_req = UFS_MAX_BYTES; + + hba->dev = ufs_dev; + hba->ops = hba_ops; + hba->mmio_base = (void *)dev_read_addr(ufs_dev); + + /* Set descriptor lengths to specification defaults */ + ufshcd_def_desc_sizes(hba); + + ufshcd_ops_init(hba); + + /* Read capabilties registers */ + hba->capabilities = ufshcd_readl(hba, REG_CONTROLLER_CAPABILITIES); + + /* Get UFS version supported by the controller */ + hba->version = ufshcd_get_ufs_version(hba); + if (hba->version != UFSHCI_VERSION_10 && + hba->version != UFSHCI_VERSION_11 && + hba->version != UFSHCI_VERSION_20 && + hba->version != UFSHCI_VERSION_21) + dev_err(hba->dev, "invalid UFS version 0x%x\n", + hba->version); + + /* Get Interrupt bit mask per version */ + hba->intr_mask = ufshcd_get_intr_mask(hba); + + /* Allocate memory for host memory space */ + err = ufshcd_memory_alloc(hba); + if (err) { + dev_err(hba->dev, "Memory allocation failed\n"); + return err; + } + + /* Configure Local data structures */ + ufshcd_host_memory_configure(hba); + + /* + * In order to avoid any spurious interrupt immediately after + * registering UFS controller interrupt handler, clear any pending UFS + * interrupt status and disable all the UFS interrupts. + */ + ufshcd_writel(hba, ufshcd_readl(hba, REG_INTERRUPT_STATUS), + REG_INTERRUPT_STATUS); + ufshcd_writel(hba, 0, REG_INTERRUPT_ENABLE); + + err = ufshcd_hba_enable(hba); + if (err) { + dev_err(hba->dev, "Host controller enable failed\n"); + return err; + } + + err = ufs_start(hba); + if (err) + return err; + + return 0; +} + +int ufs_scsi_bind(struct udevice *ufs_dev, struct udevice **scsi_devp) +{ + int ret = device_bind_driver(ufs_dev, "ufs_scsi", "ufs_scsi", + scsi_devp); + + return ret; +} + +static struct scsi_ops ufs_ops = { + .exec = ufs_scsi_exec, +}; + +int ufs_probe_dev(int index) +{ + struct udevice *dev; + + return uclass_get_device(UCLASS_UFS, index, &dev); +} + +int ufs_probe(void) +{ + struct udevice *dev; + int ret, i; + + for (i = 0;; i++) { + ret = uclass_get_device(UCLASS_UFS, i, &dev); + if (ret == -ENODEV) + break; + } + + return 0; +} + +U_BOOT_DRIVER(ufs_scsi) = { + .id = UCLASS_SCSI, + .name = "ufs_scsi", + .ops = &ufs_ops, +}; diff --git a/u-boot/drivers/ufs/ufs.h b/u-boot/drivers/ufs/ufs.h new file mode 100644 index 0000000..8a38832 --- /dev/null +++ b/u-boot/drivers/ufs/ufs.h @@ -0,0 +1,917 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +#ifndef __UFS_H +#define __UFS_H + +#include "unipro.h" + +struct udevice; + +#define UFS_CDB_SIZE 16 +#define UPIU_TRANSACTION_UIC_CMD 0x1F +#define UIC_CMD_SIZE (sizeof(u32) * 4) +#define RESPONSE_UPIU_SENSE_DATA_LENGTH 18 +#define UFS_MAX_LUNS 0x7F + +enum { + TASK_REQ_UPIU_SIZE_DWORDS = 8, + TASK_RSP_UPIU_SIZE_DWORDS = 8, + ALIGNED_UPIU_SIZE = 512, +}; + +/* UFS device power modes */ +enum ufs_dev_pwr_mode { + UFS_ACTIVE_PWR_MODE = 1, + UFS_SLEEP_PWR_MODE = 2, + UFS_POWERDOWN_PWR_MODE = 3, +}; + +enum ufs_notify_change_status { + PRE_CHANGE, + POST_CHANGE, +}; + +struct ufs_pa_layer_attr { + u32 gear_rx; + u32 gear_tx; + u32 lane_rx; + u32 lane_tx; + u32 pwr_rx; + u32 pwr_tx; + u32 hs_rate; +}; + +struct ufs_pwr_mode_info { + bool is_valid; + struct ufs_pa_layer_attr info; +}; + +enum ufs_desc_def_size { + QUERY_DESC_DEVICE_DEF_SIZE = 0x40, + QUERY_DESC_CONFIGURATION_DEF_SIZE = 0x90, + QUERY_DESC_UNIT_DEF_SIZE = 0x23, + QUERY_DESC_INTERCONNECT_DEF_SIZE = 0x06, + QUERY_DESC_GEOMETRY_DEF_SIZE = 0x48, + QUERY_DESC_POWER_DEF_SIZE = 0x62, + QUERY_DESC_HEALTH_DEF_SIZE = 0x25, +}; + +struct ufs_desc_size { + int dev_desc; + int pwr_desc; + int geom_desc; + int interc_desc; + int unit_desc; + int conf_desc; + int hlth_desc; +}; + +/* + * Request Descriptor Definitions + */ + +/* Transfer request command type */ +enum { + UTP_CMD_TYPE_SCSI = 0x0, + UTP_CMD_TYPE_UFS = 0x1, + UTP_CMD_TYPE_DEV_MANAGE = 0x2, +}; + +/* UTP Transfer Request Command Offset */ +#define UPIU_COMMAND_TYPE_OFFSET 28 + +/* Offset of the response code in the UPIU header */ +#define UPIU_RSP_CODE_OFFSET 8 + +/* To accommodate UFS2.0 required Command type */ +enum { + UTP_CMD_TYPE_UFS_STORAGE = 0x1, +}; + +enum { + UTP_SCSI_COMMAND = 0x00000000, + UTP_NATIVE_UFS_COMMAND = 0x10000000, + UTP_DEVICE_MANAGEMENT_FUNCTION = 0x20000000, + UTP_REQ_DESC_INT_CMD = 0x01000000, +}; + +/* UTP Transfer Request Data Direction (DD) */ +enum { + UTP_NO_DATA_TRANSFER = 0x00000000, + UTP_HOST_TO_DEVICE = 0x02000000, + UTP_DEVICE_TO_HOST = 0x04000000, +}; + +/* Overall command status values */ +enum { + OCS_SUCCESS = 0x0, + OCS_INVALID_CMD_TABLE_ATTR = 0x1, + OCS_INVALID_PRDT_ATTR = 0x2, + OCS_MISMATCH_DATA_BUF_SIZE = 0x3, + OCS_MISMATCH_RESP_UPIU_SIZE = 0x4, + OCS_PEER_COMM_FAILURE = 0x5, + OCS_ABORTED = 0x6, + OCS_FATAL_ERROR = 0x7, + OCS_INVALID_COMMAND_STATUS = 0x0F, + MASK_OCS = 0x0F, +}; + +/* The maximum length of the data byte count field in the PRDT is 256KB */ +#define PRDT_DATA_BYTE_COUNT_MAX (256 * 1024) +/* The granularity of the data byte count field in the PRDT is 32-bit */ +#define PRDT_DATA_BYTE_COUNT_PAD 4 + +#define GENERAL_UPIU_REQUEST_SIZE (sizeof(struct utp_upiu_req)) +#define QUERY_DESC_MAX_SIZE 255 +#define QUERY_DESC_MIN_SIZE 2 +#define QUERY_DESC_HDR_SIZE 2 +#define QUERY_OSF_SIZE (GENERAL_UPIU_REQUEST_SIZE - \ + (sizeof(struct utp_upiu_header))) +#define RESPONSE_UPIU_SENSE_DATA_LENGTH 18 +#define UPIU_HEADER_DWORD(byte3, byte2, byte1, byte0)\ + cpu_to_be32((byte3 << 24) | (byte2 << 16) |\ + (byte1 << 8) | (byte0)) +/* + * UFS Protocol Information Unit related definitions + */ + +/* Task management functions */ +enum { + UFS_ABORT_TASK = 0x01, + UFS_ABORT_TASK_SET = 0x02, + UFS_CLEAR_TASK_SET = 0x04, + UFS_LOGICAL_RESET = 0x08, + UFS_QUERY_TASK = 0x80, + UFS_QUERY_TASK_SET = 0x81, +}; + +/* UTP UPIU Transaction Codes Initiator to Target */ +enum { + UPIU_TRANSACTION_NOP_OUT = 0x00, + UPIU_TRANSACTION_COMMAND = 0x01, + UPIU_TRANSACTION_DATA_OUT = 0x02, + UPIU_TRANSACTION_TASK_REQ = 0x04, + UPIU_TRANSACTION_QUERY_REQ = 0x16, +}; + +/* UTP UPIU Transaction Codes Target to Initiator */ +enum { + UPIU_TRANSACTION_NOP_IN = 0x20, + UPIU_TRANSACTION_RESPONSE = 0x21, + UPIU_TRANSACTION_DATA_IN = 0x22, + UPIU_TRANSACTION_TASK_RSP = 0x24, + UPIU_TRANSACTION_READY_XFER = 0x31, + UPIU_TRANSACTION_QUERY_RSP = 0x36, + UPIU_TRANSACTION_REJECT_UPIU = 0x3F, +}; + +/* UPIU Read/Write flags */ +enum { + UPIU_CMD_FLAGS_NONE = 0x00, + UPIU_CMD_FLAGS_WRITE = 0x20, + UPIU_CMD_FLAGS_READ = 0x40, +}; + +/* UPIU Task Attributes */ +enum { + UPIU_TASK_ATTR_SIMPLE = 0x00, + UPIU_TASK_ATTR_ORDERED = 0x01, + UPIU_TASK_ATTR_HEADQ = 0x02, + UPIU_TASK_ATTR_ACA = 0x03, +}; + +/* UPIU Query request function */ +enum { + UPIU_QUERY_FUNC_STANDARD_READ_REQUEST = 0x01, + UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST = 0x81, +}; + +/* Offset of the response code in the UPIU header */ +#define UPIU_RSP_CODE_OFFSET 8 + +enum { + MASK_SCSI_STATUS = 0xFF, + MASK_TASK_RESPONSE = 0xFF00, + MASK_RSP_UPIU_RESULT = 0xFFFF, + MASK_QUERY_DATA_SEG_LEN = 0xFFFF, + MASK_RSP_UPIU_DATA_SEG_LEN = 0xFFFF, + MASK_RSP_EXCEPTION_EVENT = 0x10000, + MASK_TM_SERVICE_RESP = 0xFF, + MASK_TM_FUNC = 0xFF, +}; + +/* UTP QUERY Transaction Specific Fields OpCode */ +enum query_opcode { + UPIU_QUERY_OPCODE_NOP = 0x0, + UPIU_QUERY_OPCODE_READ_DESC = 0x1, + UPIU_QUERY_OPCODE_WRITE_DESC = 0x2, + UPIU_QUERY_OPCODE_READ_ATTR = 0x3, + UPIU_QUERY_OPCODE_WRITE_ATTR = 0x4, + UPIU_QUERY_OPCODE_READ_FLAG = 0x5, + UPIU_QUERY_OPCODE_SET_FLAG = 0x6, + UPIU_QUERY_OPCODE_CLEAR_FLAG = 0x7, + UPIU_QUERY_OPCODE_TOGGLE_FLAG = 0x8, +}; + +/* Query response result code */ +enum { + QUERY_RESULT_SUCCESS = 0x00, + QUERY_RESULT_NOT_READABLE = 0xF6, + QUERY_RESULT_NOT_WRITEABLE = 0xF7, + QUERY_RESULT_ALREADY_WRITTEN = 0xF8, + QUERY_RESULT_INVALID_LENGTH = 0xF9, + QUERY_RESULT_INVALID_VALUE = 0xFA, + QUERY_RESULT_INVALID_SELECTOR = 0xFB, + QUERY_RESULT_INVALID_INDEX = 0xFC, + QUERY_RESULT_INVALID_IDN = 0xFD, + QUERY_RESULT_INVALID_OPCODE = 0xFE, + QUERY_RESULT_GENERAL_FAILURE = 0xFF, +}; + +enum { + UPIU_COMMAND_SET_TYPE_SCSI = 0x0, + UPIU_COMMAND_SET_TYPE_UFS = 0x1, + UPIU_COMMAND_SET_TYPE_QUERY = 0x2, +}; + +/* Flag idn for Query Requests*/ +enum flag_idn { + QUERY_FLAG_IDN_FDEVICEINIT = 0x01, + QUERY_FLAG_IDN_PERMANENT_WPE = 0x02, + QUERY_FLAG_IDN_PWR_ON_WPE = 0x03, + QUERY_FLAG_IDN_BKOPS_EN = 0x04, + QUERY_FLAG_IDN_LIFE_SPAN_MODE_ENABLE = 0x05, + QUERY_FLAG_IDN_PURGE_ENABLE = 0x06, + QUERY_FLAG_IDN_RESERVED2 = 0x07, + QUERY_FLAG_IDN_FPHYRESOURCEREMOVAL = 0x08, + QUERY_FLAG_IDN_BUSY_RTC = 0x09, + QUERY_FLAG_IDN_RESERVED3 = 0x0A, + QUERY_FLAG_IDN_PERMANENTLY_DISABLE_FW_UPDATE = 0x0B, +}; + +/* Attribute idn for Query requests */ +enum attr_idn { + QUERY_ATTR_IDN_BOOT_LU_EN = 0x00, + QUERY_ATTR_IDN_RESERVED = 0x01, + QUERY_ATTR_IDN_POWER_MODE = 0x02, + QUERY_ATTR_IDN_ACTIVE_ICC_LVL = 0x03, + QUERY_ATTR_IDN_OOO_DATA_EN = 0x04, + QUERY_ATTR_IDN_BKOPS_STATUS = 0x05, + QUERY_ATTR_IDN_PURGE_STATUS = 0x06, + QUERY_ATTR_IDN_MAX_DATA_IN = 0x07, + QUERY_ATTR_IDN_MAX_DATA_OUT = 0x08, + QUERY_ATTR_IDN_DYN_CAP_NEEDED = 0x09, + QUERY_ATTR_IDN_REF_CLK_FREQ = 0x0A, + QUERY_ATTR_IDN_CONF_DESC_LOCK = 0x0B, + QUERY_ATTR_IDN_MAX_NUM_OF_RTT = 0x0C, + QUERY_ATTR_IDN_EE_CONTROL = 0x0D, + QUERY_ATTR_IDN_EE_STATUS = 0x0E, + QUERY_ATTR_IDN_SECONDS_PASSED = 0x0F, + QUERY_ATTR_IDN_CNTX_CONF = 0x10, + QUERY_ATTR_IDN_CORR_PRG_BLK_NUM = 0x11, + QUERY_ATTR_IDN_RESERVED2 = 0x12, + QUERY_ATTR_IDN_RESERVED3 = 0x13, + QUERY_ATTR_IDN_FFU_STATUS = 0x14, + QUERY_ATTR_IDN_PSA_STATE = 0x15, + QUERY_ATTR_IDN_PSA_DATA_SIZE = 0x16, +}; + +/* Descriptor idn for Query requests */ +enum desc_idn { + QUERY_DESC_IDN_DEVICE = 0x0, + QUERY_DESC_IDN_CONFIGURATION = 0x1, + QUERY_DESC_IDN_UNIT = 0x2, + QUERY_DESC_IDN_RFU_0 = 0x3, + QUERY_DESC_IDN_INTERCONNECT = 0x4, + QUERY_DESC_IDN_STRING = 0x5, + QUERY_DESC_IDN_RFU_1 = 0x6, + QUERY_DESC_IDN_GEOMETRY = 0x7, + QUERY_DESC_IDN_POWER = 0x8, + QUERY_DESC_IDN_HEALTH = 0x9, + QUERY_DESC_IDN_MAX, +}; + +enum desc_header_offset { + QUERY_DESC_LENGTH_OFFSET = 0x00, + QUERY_DESC_DESC_TYPE_OFFSET = 0x01, +}; + +struct ufshcd_sg_entry { + __le32 base_addr; + __le32 upper_addr; + __le32 reserved; + __le32 size; +}; + +#define MAX_BUFF 128 +/** + * struct utp_transfer_cmd_desc - UFS Command Descriptor structure + * @command_upiu: Command UPIU Frame address + * @response_upiu: Response UPIU Frame address + * @prd_table: Physical Region Descriptor + */ +struct utp_transfer_cmd_desc { + u8 command_upiu[ALIGNED_UPIU_SIZE]; + u8 response_upiu[ALIGNED_UPIU_SIZE]; + struct ufshcd_sg_entry prd_table[MAX_BUFF]; +}; + +/** + * struct request_desc_header - Descriptor Header common to both UTRD and UTMRD + * @dword0: Descriptor Header DW0 + * @dword1: Descriptor Header DW1 + * @dword2: Descriptor Header DW2 + * @dword3: Descriptor Header DW3 + */ +struct request_desc_header { + __le32 dword_0; + __le32 dword_1; + __le32 dword_2; + __le32 dword_3; +}; + +/** + * struct utp_transfer_req_desc - UTRD structure + * @header: UTRD header DW-0 to DW-3 + * @command_desc_base_addr_lo: UCD base address low DW-4 + * @command_desc_base_addr_hi: UCD base address high DW-5 + * @response_upiu_length: response UPIU length DW-6 + * @response_upiu_offset: response UPIU offset DW-6 + * @prd_table_length: Physical region descriptor length DW-7 + * @prd_table_offset: Physical region descriptor offset DW-7 + */ +struct utp_transfer_req_desc { + /* DW 0-3 */ + struct request_desc_header header; + + /* DW 4-5*/ + __le32 command_desc_base_addr_lo; + __le32 command_desc_base_addr_hi; + + /* DW 6 */ + __le16 response_upiu_length; + __le16 response_upiu_offset; + + /* DW 7 */ + __le16 prd_table_length; + __le16 prd_table_offset; +}; + +/** + * struct utp_upiu_header - UPIU header structure + * @dword_0: UPIU header DW-0 + * @dword_1: UPIU header DW-1 + * @dword_2: UPIU header DW-2 + */ +struct utp_upiu_header { + __be32 dword_0; + __be32 dword_1; + __be32 dword_2; +}; + +/** + * struct utp_upiu_query - upiu request buffer structure for + * query request. + * @opcode: command to perform B-0 + * @idn: a value that indicates the particular type of data B-1 + * @index: Index to further identify data B-2 + * @selector: Index to further identify data B-3 + * @reserved_osf: spec reserved field B-4,5 + * @length: number of descriptor bytes to read/write B-6,7 + * @value: Attribute value to be written DW-5 + * @reserved: spec reserved DW-6,7 + */ +struct utp_upiu_query { + __u8 opcode; + __u8 idn; + __u8 index; + __u8 selector; + __be16 reserved_osf; + __be16 length; + __be32 value; + __be32 reserved[2]; +}; + +/** + * struct utp_upiu_cmd - Command UPIU structure + * @data_transfer_len: Data Transfer Length DW-3 + * @cdb: Command Descriptor Block CDB DW-4 to DW-7 + */ +struct utp_upiu_cmd { + __be32 exp_data_transfer_len; + u8 cdb[UFS_CDB_SIZE]; +}; + +/* + * UTMRD structure. + */ +struct utp_task_req_desc { + /* DW 0-3 */ + struct request_desc_header header; + + /* DW 4-11 - Task request UPIU structure */ + struct utp_upiu_header req_header; + __be32 input_param1; + __be32 input_param2; + __be32 input_param3; + __be32 __reserved1[2]; + + /* DW 12-19 - Task Management Response UPIU structure */ + struct utp_upiu_header rsp_header; + __be32 output_param1; + __be32 output_param2; + __be32 __reserved2[3]; +}; + +/** + * struct utp_upiu_req - general upiu request structure + * @header:UPIU header structure DW-0 to DW-2 + * @sc: fields structure for scsi command DW-3 to DW-7 + * @qr: fields structure for query request DW-3 to DW-7 + */ +struct utp_upiu_req { + struct utp_upiu_header header; + union { + struct utp_upiu_cmd sc; + struct utp_upiu_query qr; + struct utp_upiu_query tr; + /* use utp_upiu_query to host the 4 dwords of uic command */ + struct utp_upiu_query uc; + }; +}; + +/** + * struct utp_cmd_rsp - Response UPIU structure + * @residual_transfer_count: Residual transfer count DW-3 + * @reserved: Reserved double words DW-4 to DW-7 + * @sense_data_len: Sense data length DW-8 U16 + * @sense_data: Sense data field DW-8 to DW-12 + */ +struct utp_cmd_rsp { + __be32 residual_transfer_count; + __be32 reserved[4]; + __be16 sense_data_len; + u8 sense_data[RESPONSE_UPIU_SENSE_DATA_LENGTH]; +}; + +/** + * struct utp_upiu_rsp - general upiu response structure + * @header: UPIU header structure DW-0 to DW-2 + * @sr: fields structure for scsi command DW-3 to DW-12 + * @qr: fields structure for query request DW-3 to DW-7 + */ +struct utp_upiu_rsp { + struct utp_upiu_header header; + union { + struct utp_cmd_rsp sr; + struct utp_upiu_query qr; + }; +}; + +#define MAX_MODEL_LEN 16 +/** + * ufs_dev_desc - ufs device details from the device descriptor + * + * @wmanufacturerid: card details + * @model: card model + */ +struct ufs_dev_desc { + u16 wmanufacturerid; + char model[MAX_MODEL_LEN + 1]; +}; + +/* Device descriptor parameters offsets in bytes*/ +enum device_desc_param { + DEVICE_DESC_PARAM_LEN = 0x0, + DEVICE_DESC_PARAM_TYPE = 0x1, + DEVICE_DESC_PARAM_DEVICE_TYPE = 0x2, + DEVICE_DESC_PARAM_DEVICE_CLASS = 0x3, + DEVICE_DESC_PARAM_DEVICE_SUB_CLASS = 0x4, + DEVICE_DESC_PARAM_PRTCL = 0x5, + DEVICE_DESC_PARAM_NUM_LU = 0x6, + DEVICE_DESC_PARAM_NUM_WLU = 0x7, + DEVICE_DESC_PARAM_BOOT_ENBL = 0x8, + DEVICE_DESC_PARAM_DESC_ACCSS_ENBL = 0x9, + DEVICE_DESC_PARAM_INIT_PWR_MODE = 0xA, + DEVICE_DESC_PARAM_HIGH_PR_LUN = 0xB, + DEVICE_DESC_PARAM_SEC_RMV_TYPE = 0xC, + DEVICE_DESC_PARAM_SEC_LU = 0xD, + DEVICE_DESC_PARAM_BKOP_TERM_LT = 0xE, + DEVICE_DESC_PARAM_ACTVE_ICC_LVL = 0xF, + DEVICE_DESC_PARAM_SPEC_VER = 0x10, + DEVICE_DESC_PARAM_MANF_DATE = 0x12, + DEVICE_DESC_PARAM_MANF_NAME = 0x14, + DEVICE_DESC_PARAM_PRDCT_NAME = 0x15, + DEVICE_DESC_PARAM_SN = 0x16, + DEVICE_DESC_PARAM_OEM_ID = 0x17, + DEVICE_DESC_PARAM_MANF_ID = 0x18, + DEVICE_DESC_PARAM_UD_OFFSET = 0x1A, + DEVICE_DESC_PARAM_UD_LEN = 0x1B, + DEVICE_DESC_PARAM_RTT_CAP = 0x1C, + DEVICE_DESC_PARAM_FRQ_RTC = 0x1D, + DEVICE_DESC_PARAM_UFS_FEAT = 0x1F, + DEVICE_DESC_PARAM_FFU_TMT = 0x20, + DEVICE_DESC_PARAM_Q_DPTH = 0x21, + DEVICE_DESC_PARAM_DEV_VER = 0x22, + DEVICE_DESC_PARAM_NUM_SEC_WPA = 0x24, + DEVICE_DESC_PARAM_PSA_MAX_DATA = 0x25, + DEVICE_DESC_PARAM_PSA_TMT = 0x29, + DEVICE_DESC_PARAM_PRDCT_REV = 0x2A, +}; + +struct ufs_hba; + +enum { + UFSHCD_MAX_CHANNEL = 0, + UFSHCD_MAX_ID = 1, +}; + +enum dev_cmd_type { + DEV_CMD_TYPE_NOP = 0x0, + DEV_CMD_TYPE_QUERY = 0x1, +}; + +/** + * struct uic_command - UIC command structure + * @command: UIC command + * @argument1: UIC command argument 1 + * @argument2: UIC command argument 2 + * @argument3: UIC command argument 3 + * @cmd_active: Indicate if UIC command is outstanding + * @result: UIC command result + * @done: UIC command completion + */ +struct uic_command { + u32 command; + u32 argument1; + u32 argument2; + u32 argument3; + int cmd_active; + int result; +}; + +/* GenSelectorIndex calculation macros for M-PHY attributes */ +#define UIC_ARG_MPHY_TX_GEN_SEL_INDEX(lane) (lane) +#define UIC_ARG_MPHY_RX_GEN_SEL_INDEX(lane) (PA_MAXDATALANES + (lane)) + +#define UIC_ARG_MIB_SEL(attr, sel) ((((attr) & 0xFFFF) << 16) |\ + ((sel) & 0xFFFF)) +#define UIC_ARG_MIB(attr) UIC_ARG_MIB_SEL(attr, 0) +#define UIC_ARG_ATTR_TYPE(t) (((t) & 0xFF) << 16) +#define UIC_GET_ATTR_ID(v) (((v) >> 16) & 0xFFFF) + +/* Link Status*/ +enum link_status { + UFSHCD_LINK_IS_DOWN = 1, + UFSHCD_LINK_IS_UP = 2, +}; + +#define UIC_ARG_MIB_SEL(attr, sel) ((((attr) & 0xFFFF) << 16) |\ + ((sel) & 0xFFFF)) +#define UIC_ARG_MIB(attr) UIC_ARG_MIB_SEL(attr, 0) +#define UIC_ARG_ATTR_TYPE(t) (((t) & 0xFF) << 16) +#define UIC_GET_ATTR_ID(v) (((v) >> 16) & 0xFFFF) + +/* UIC Commands */ +enum uic_cmd_dme { + UIC_CMD_DME_GET = 0x01, + UIC_CMD_DME_SET = 0x02, + UIC_CMD_DME_PEER_GET = 0x03, + UIC_CMD_DME_PEER_SET = 0x04, + UIC_CMD_DME_POWERON = 0x10, + UIC_CMD_DME_POWEROFF = 0x11, + UIC_CMD_DME_ENABLE = 0x12, + UIC_CMD_DME_RESET = 0x14, + UIC_CMD_DME_END_PT_RST = 0x15, + UIC_CMD_DME_LINK_STARTUP = 0x16, + UIC_CMD_DME_HIBER_ENTER = 0x17, + UIC_CMD_DME_HIBER_EXIT = 0x18, + UIC_CMD_DME_TEST_MODE = 0x1A, +}; + +/* UIC Config result code / Generic error code */ +enum { + UIC_CMD_RESULT_SUCCESS = 0x00, + UIC_CMD_RESULT_INVALID_ATTR = 0x01, + UIC_CMD_RESULT_FAILURE = 0x01, + UIC_CMD_RESULT_INVALID_ATTR_VALUE = 0x02, + UIC_CMD_RESULT_READ_ONLY_ATTR = 0x03, + UIC_CMD_RESULT_WRITE_ONLY_ATTR = 0x04, + UIC_CMD_RESULT_BAD_INDEX = 0x05, + UIC_CMD_RESULT_LOCKED_ATTR = 0x06, + UIC_CMD_RESULT_BAD_TEST_FEATURE_INDEX = 0x07, + UIC_CMD_RESULT_PEER_COMM_FAILURE = 0x08, + UIC_CMD_RESULT_BUSY = 0x09, + UIC_CMD_RESULT_DME_FAILURE = 0x0A, +}; + +#define MASK_UIC_COMMAND_RESULT 0xFF + +/* Host <-> Device UniPro Link state */ +enum uic_link_state { + UIC_LINK_OFF_STATE = 0, /* Link powered down or disabled */ + UIC_LINK_ACTIVE_STATE = 1, /* Link is in Fast/Slow/Sleep state */ + UIC_LINK_HIBERN8_STATE = 2, /* Link is in Hibernate state */ +}; + +/* UIC command interfaces for DME primitives */ +#define DME_LOCAL 0 +#define DME_PEER 1 +#define ATTR_SET_NOR 0 /* NORMAL */ +#define ATTR_SET_ST 1 /* STATIC */ + +int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel, + u8 attr_set, u32 mib_val, u8 peer); +int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel, + u32 *mib_val, u8 peer); + +static inline int ufshcd_dme_set(struct ufs_hba *hba, u32 attr_sel, + u32 mib_val) +{ + return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR, + mib_val, DME_LOCAL); +} + +static inline int ufshcd_dme_get(struct ufs_hba *hba, + u32 attr_sel, u32 *mib_val) +{ + return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_LOCAL); +} + +static inline int ufshcd_dme_peer_get(struct ufs_hba *hba, + u32 attr_sel, u32 *mib_val) +{ + return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_PEER); +} + +static inline int ufshcd_dme_peer_set(struct ufs_hba *hba, u32 attr_sel, + u32 mib_val) +{ + return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR, + mib_val, DME_PEER); +} + +/** + * struct ufs_query_req - parameters for building a query request + * @query_func: UPIU header query function + * @upiu_req: the query request data + */ +struct ufs_query_req { + u8 query_func; + struct utp_upiu_query upiu_req; +}; + +/** + * struct ufs_query_resp - UPIU QUERY + * @response: device response code + * @upiu_res: query response data + */ +struct ufs_query_res { + u8 response; + struct utp_upiu_query upiu_res; +}; + +/** + * struct ufs_query - holds relevant data structures for query request + * @request: request upiu and function + * @descriptor: buffer for sending/receiving descriptor + * @response: response upiu and response + */ +struct ufs_query { + struct ufs_query_req request; + u8 *descriptor; + struct ufs_query_res response; +}; + +/** + * struct ufs_dev_cmd - all assosiated fields with device management commands + * @type: device management command type - Query, NOP OUT + * @tag_wq: wait queue until free command slot is available + */ +struct ufs_dev_cmd { + enum dev_cmd_type type; + struct ufs_query query; +}; + +struct ufs_hba_ops { + int (*init)(struct ufs_hba *hba); + int (*hce_enable_notify)(struct ufs_hba *hba, + enum ufs_notify_change_status); + int (*link_startup_notify)(struct ufs_hba *hba, + enum ufs_notify_change_status); + int (*phy_initialization)(struct ufs_hba *hba); +}; + +struct ufs_hba { + struct udevice *dev; + void __iomem *mmio_base; + struct ufs_hba_ops *ops; + struct ufs_desc_size desc_size; + u32 capabilities; + u32 version; + u32 intr_mask; + u32 quirks; +/* + * If UFS host controller is having issue in processing LCC (Line + * Control Command) coming from device then enable this quirk. + * When this quirk is enabled, host controller driver should disable + * the LCC transmission on UFS device (by clearing TX_LCC_ENABLE + * attribute of device to 0). + */ +#define UFSHCD_QUIRK_BROKEN_LCC 0x1 + + /* Virtual memory reference */ + struct utp_transfer_cmd_desc *ucdl; + struct utp_transfer_req_desc *utrdl; + /* TODO: Add Task Manegement Support */ + struct utp_task_req_desc *utmrdl; + + struct utp_upiu_req *ucd_req_ptr; + struct utp_upiu_rsp *ucd_rsp_ptr; + struct ufshcd_sg_entry *ucd_prdt_ptr; + + /* Power Mode information */ + enum ufs_dev_pwr_mode curr_dev_pwr_mode; + struct ufs_pa_layer_attr pwr_info; + struct ufs_pwr_mode_info max_pwr_info; + + struct ufs_dev_cmd dev_cmd; +}; + +static inline int ufshcd_ops_init(struct ufs_hba *hba) +{ + if (hba->ops && hba->ops->init) + return hba->ops->init(hba); + + return 0; +} + +static inline int ufshcd_ops_hce_enable_notify(struct ufs_hba *hba, + bool status) +{ + if (hba->ops && hba->ops->hce_enable_notify) + return hba->ops->hce_enable_notify(hba, status); + + return 0; +} + +static inline int ufshcd_ops_link_startup_notify(struct ufs_hba *hba, + bool status) +{ + if (hba->ops && hba->ops->link_startup_notify) + return hba->ops->link_startup_notify(hba, status); + + return 0; +} + +/* Controller UFSHCI version */ +enum { + UFSHCI_VERSION_10 = 0x00010000, /* 1.0 */ + UFSHCI_VERSION_11 = 0x00010100, /* 1.1 */ + UFSHCI_VERSION_20 = 0x00000200, /* 2.0 */ + UFSHCI_VERSION_21 = 0x00000210, /* 2.1 */ +}; + +/* Interrupt disable masks */ +enum { + /* Interrupt disable mask for UFSHCI v1.0 */ + INTERRUPT_MASK_ALL_VER_10 = 0x30FFF, + INTERRUPT_MASK_RW_VER_10 = 0x30000, + + /* Interrupt disable mask for UFSHCI v1.1 */ + INTERRUPT_MASK_ALL_VER_11 = 0x31FFF, + + /* Interrupt disable mask for UFSHCI v2.1 */ + INTERRUPT_MASK_ALL_VER_21 = 0x71FFF, +}; + +/* UFSHCI Registers */ +enum { + REG_CONTROLLER_CAPABILITIES = 0x00, + REG_UFS_VERSION = 0x08, + REG_CONTROLLER_DEV_ID = 0x10, + REG_CONTROLLER_PROD_ID = 0x14, + REG_AUTO_HIBERNATE_IDLE_TIMER = 0x18, + REG_INTERRUPT_STATUS = 0x20, + REG_INTERRUPT_ENABLE = 0x24, + REG_CONTROLLER_STATUS = 0x30, + REG_CONTROLLER_ENABLE = 0x34, + REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER = 0x38, + REG_UIC_ERROR_CODE_DATA_LINK_LAYER = 0x3C, + REG_UIC_ERROR_CODE_NETWORK_LAYER = 0x40, + REG_UIC_ERROR_CODE_TRANSPORT_LAYER = 0x44, + REG_UIC_ERROR_CODE_DME = 0x48, + REG_UTP_TRANSFER_REQ_INT_AGG_CONTROL = 0x4C, + REG_UTP_TRANSFER_REQ_LIST_BASE_L = 0x50, + REG_UTP_TRANSFER_REQ_LIST_BASE_H = 0x54, + REG_UTP_TRANSFER_REQ_DOOR_BELL = 0x58, + REG_UTP_TRANSFER_REQ_LIST_CLEAR = 0x5C, + REG_UTP_TRANSFER_REQ_LIST_RUN_STOP = 0x60, + REG_UTP_TASK_REQ_LIST_BASE_L = 0x70, + REG_UTP_TASK_REQ_LIST_BASE_H = 0x74, + REG_UTP_TASK_REQ_DOOR_BELL = 0x78, + REG_UTP_TASK_REQ_LIST_CLEAR = 0x7C, + REG_UTP_TASK_REQ_LIST_RUN_STOP = 0x80, + REG_UIC_COMMAND = 0x90, + REG_UIC_COMMAND_ARG_1 = 0x94, + REG_UIC_COMMAND_ARG_2 = 0x98, + REG_UIC_COMMAND_ARG_3 = 0x9C, + + UFSHCI_REG_SPACE_SIZE = 0xA0, + + REG_UFS_CCAP = 0x100, + REG_UFS_CRYPTOCAP = 0x104, + + UFSHCI_CRYPTO_REG_SPACE_SIZE = 0x400, +}; + +/* Controller capability masks */ +enum { + MASK_TRANSFER_REQUESTS_SLOTS = 0x0000001F, + MASK_TASK_MANAGEMENT_REQUEST_SLOTS = 0x00070000, + MASK_AUTO_HIBERN8_SUPPORT = 0x00800000, + MASK_64_ADDRESSING_SUPPORT = 0x01000000, + MASK_OUT_OF_ORDER_DATA_DELIVERY_SUPPORT = 0x02000000, + MASK_UIC_DME_TEST_MODE_SUPPORT = 0x04000000, +}; + +/* Interrupt Status 20h */ +#define UTP_TRANSFER_REQ_COMPL 0x1 +#define UIC_DME_END_PT_RESET 0x2 +#define UIC_ERROR 0x4 +#define UIC_TEST_MODE 0x8 +#define UIC_POWER_MODE 0x10 +#define UIC_HIBERNATE_EXIT 0x20 +#define UIC_HIBERNATE_ENTER 0x40 +#define UIC_LINK_LOST 0x80 +#define UIC_LINK_STARTUP 0x100 +#define UTP_TASK_REQ_COMPL 0x200 +#define UIC_COMMAND_COMPL 0x400 +#define DEVICE_FATAL_ERROR 0x800 +#define CONTROLLER_FATAL_ERROR 0x10000 +#define SYSTEM_BUS_FATAL_ERROR 0x20000 + +#define UFSHCD_UIC_PWR_MASK (UIC_HIBERNATE_ENTER |\ + UIC_HIBERNATE_EXIT |\ + UIC_POWER_MODE) + +#define UFSHCD_UIC_MASK (UIC_COMMAND_COMPL | UIC_POWER_MODE) + +#define UFSHCD_ERROR_MASK (UIC_ERROR |\ + DEVICE_FATAL_ERROR |\ + CONTROLLER_FATAL_ERROR |\ + SYSTEM_BUS_FATAL_ERROR) + +#define INT_FATAL_ERRORS (DEVICE_FATAL_ERROR |\ + CONTROLLER_FATAL_ERROR |\ + SYSTEM_BUS_FATAL_ERROR) + +/* Host Controller Enable 0x34h */ +#define CONTROLLER_ENABLE 0x1 +#define CONTROLLER_DISABLE 0x0 +/* HCS - Host Controller Status 30h */ +#define DEVICE_PRESENT 0x1 +#define UTP_TRANSFER_REQ_LIST_READY 0x2 +#define UTP_TASK_REQ_LIST_READY 0x4 +#define UIC_COMMAND_READY 0x8 +#define HOST_ERROR_INDICATOR 0x10 +#define DEVICE_ERROR_INDICATOR 0x20 +#define UIC_POWER_MODE_CHANGE_REQ_STATUS_MASK UFS_MASK(0x7, 8) + +#define UFSHCD_STATUS_READY (UTP_TRANSFER_REQ_LIST_READY |\ + UTP_TASK_REQ_LIST_READY |\ + UIC_COMMAND_READY) + +enum { + PWR_OK = 0x0, + PWR_LOCAL = 0x01, + PWR_REMOTE = 0x02, + PWR_BUSY = 0x03, + PWR_ERROR_CAP = 0x04, + PWR_FATAL_ERROR = 0x05, +}; + +/* UICCMD - UIC Command */ +#define COMMAND_OPCODE_MASK 0xFF +#define GEN_SELECTOR_INDEX_MASK 0xFFFF + +#define MIB_ATTRIBUTE_MASK UFS_MASK(0xFFFF, 16) +#define RESET_LEVEL 0xFF + +#define ATTR_SET_TYPE_MASK UFS_MASK(0xFF, 16) +#define CFG_RESULT_CODE_MASK 0xFF +#define GENERIC_ERROR_CODE_MASK 0xFF + +#define ufshcd_writel(hba, val, reg) \ + writel((val), (hba)->mmio_base + (reg)) +#define ufshcd_readl(hba, reg) \ + readl((hba)->mmio_base + (reg)) + +/* UTRLRSR - UTP Transfer Request Run-Stop Register 60h */ +#define UTP_TRANSFER_REQ_LIST_RUN_STOP_BIT 0x1 + +/* UTMRLRSR - UTP Task Management Request Run-Stop Register 80h */ +#define UTP_TASK_REQ_LIST_RUN_STOP_BIT 0x1 + +int ufshcd_probe(struct udevice *dev, struct ufs_hba_ops *hba_ops); + +#endif diff --git a/u-boot/drivers/ufs/ufshcd-dwc.c b/u-boot/drivers/ufs/ufshcd-dwc.c new file mode 100644 index 0000000..c67bdb8 --- /dev/null +++ b/u-boot/drivers/ufs/ufshcd-dwc.c @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * UFS Host driver for Synopsys Designware Core + * + * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com) + * + * Authors: Joao Pinto <jpinto@synopsys.com> + */ + +#include "ufs.h" +#include "unipro.h" + +#include "ufshcd-dwc.h" +#include "ufshci-dwc.h" + +int ufshcd_dwc_dme_set_attrs(struct ufs_hba *hba, + const struct ufshcd_dme_attr_val *v, int n) +{ + int ret = 0; + int attr_node = 0; + + for (attr_node = 0; attr_node < n; attr_node++) { + ret = ufshcd_dme_set_attr(hba, v[attr_node].attr_sel, + ATTR_SET_NOR, v[attr_node].mib_val, v[attr_node].peer); + + if (ret) + return ret; + } + + return 0; +} +EXPORT_SYMBOL(ufshcd_dwc_dme_set_attrs); + +/** + * ufshcd_dwc_program_clk_div() + * This function programs the clk divider value. This value is needed to + * provide 1 microsecond tick to unipro layer. + * @hba: Private Structure pointer + * @divider_val: clock divider value to be programmed + * + */ +static void ufshcd_dwc_program_clk_div(struct ufs_hba *hba, u32 divider_val) +{ + ufshcd_writel(hba, divider_val, DWC_UFS_REG_HCLKDIV); +} + +/** + * ufshcd_dwc_link_is_up() + * Check if link is up + * @hba: private structure pointer + * + * Returns 0 on success, non-zero value on failure + */ +static int ufshcd_dwc_link_is_up(struct ufs_hba *hba) +{ + int dme_result = 0; + + ufshcd_dme_get(hba, UIC_ARG_MIB(VS_POWERSTATE), &dme_result); + + if (dme_result == UFSHCD_LINK_IS_UP) + return 0; + + return 1; +} + +/** + * ufshcd_dwc_connection_setup() + * This function configures both the local side (host) and the peer side + * (device) unipro attributes to establish the connection to application/ + * cport. + * This function is not required if the hardware is properly configured to + * have this connection setup on reset. But invoking this function does no + * harm and should be fine even working with any ufs device. + * + * @hba: pointer to drivers private data + * + * Returns 0 on success non-zero value on failure + */ +static int ufshcd_dwc_connection_setup(struct ufs_hba *hba) +{ + static const struct ufshcd_dme_attr_val setup_attrs[] = { + { UIC_ARG_MIB(T_CONNECTIONSTATE), 0, DME_LOCAL }, + { UIC_ARG_MIB(N_DEVICEID), 0, DME_LOCAL }, + { UIC_ARG_MIB(N_DEVICEID_VALID), 0, DME_LOCAL }, + { UIC_ARG_MIB(T_PEERDEVICEID), 1, DME_LOCAL }, + { UIC_ARG_MIB(T_PEERCPORTID), 0, DME_LOCAL }, + { UIC_ARG_MIB(T_TRAFFICCLASS), 0, DME_LOCAL }, + { UIC_ARG_MIB(T_CPORTFLAGS), 0x6, DME_LOCAL }, + { UIC_ARG_MIB(T_CPORTMODE), 1, DME_LOCAL }, + { UIC_ARG_MIB(T_CONNECTIONSTATE), 1, DME_LOCAL }, + { UIC_ARG_MIB(T_CONNECTIONSTATE), 0, DME_PEER }, + { UIC_ARG_MIB(N_DEVICEID), 1, DME_PEER }, + { UIC_ARG_MIB(N_DEVICEID_VALID), 1, DME_PEER }, + { UIC_ARG_MIB(T_PEERDEVICEID), 1, DME_PEER }, + { UIC_ARG_MIB(T_PEERCPORTID), 0, DME_PEER }, + { UIC_ARG_MIB(T_TRAFFICCLASS), 0, DME_PEER }, + { UIC_ARG_MIB(T_CPORTFLAGS), 0x6, DME_PEER }, + { UIC_ARG_MIB(T_CPORTMODE), 1, DME_PEER }, + { UIC_ARG_MIB(T_CONNECTIONSTATE), 1, DME_PEER } + }; + + return ufshcd_dwc_dme_set_attrs(hba, setup_attrs, ARRAY_SIZE(setup_attrs)); +} + +/** + * ufshcd_dwc_link_startup_notify() + * UFS Host DWC specific link startup sequence + * @hba: private structure pointer + * @status: Callback notify status + * + * Returns 0 on success, non-zero value on failure + */ +int ufshcd_dwc_link_startup_notify(struct ufs_hba *hba, + enum ufs_notify_change_status status) +{ + int err = 0; + + if (status == PRE_CHANGE) { + ufshcd_dwc_program_clk_div(hba, DWC_UFS_REG_HCLKDIV_DIV_125); + + if (hba->ops->phy_initialization) { + err = hba->ops->phy_initialization(hba); + if (err) { + dev_err(hba->dev, "Phy setup failed (%d)\n", + err); + goto out; + } + } + } else { /* POST_CHANGE */ + err = ufshcd_dwc_link_is_up(hba); + if (err) { + dev_err(hba->dev, "Link is not up\n"); + goto out; + } + + err = ufshcd_dwc_connection_setup(hba); + if (err) + dev_err(hba->dev, "Connection setup failed (%d)\n", + err); + } + +out: + return err; +} +EXPORT_SYMBOL(ufshcd_dwc_link_startup_notify); + +MODULE_AUTHOR("Joao Pinto <Joao.Pinto@synopsys.com>"); +MODULE_DESCRIPTION("UFS Host driver for Synopsys Designware Core"); +MODULE_LICENSE("Dual BSD/GPL"); diff --git a/u-boot/drivers/ufs/ufshcd-dwc.h b/u-boot/drivers/ufs/ufshcd-dwc.h new file mode 100644 index 0000000..4268ca2 --- /dev/null +++ b/u-boot/drivers/ufs/ufshcd-dwc.h @@ -0,0 +1,23 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * UFS Host driver for Synopsys Designware Core + * + * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com) + * + * Authors: Joao Pinto <jpinto@synopsys.com> + */ + +#ifndef _UFSHCD_DWC_H +#define _UFSHCD_DWC_H + +struct ufshcd_dme_attr_val { + u32 attr_sel; + u32 mib_val; + u8 peer; +}; + +int ufshcd_dwc_link_startup_notify(struct ufs_hba *hba, + enum ufs_notify_change_status status); +int ufshcd_dwc_dme_set_attrs(struct ufs_hba *hba, + const struct ufshcd_dme_attr_val *v, int n); +#endif /* End of Header */ diff --git a/u-boot/drivers/ufs/ufshci-dwc.h b/u-boot/drivers/ufs/ufshci-dwc.h new file mode 100644 index 0000000..6c290e2 --- /dev/null +++ b/u-boot/drivers/ufs/ufshci-dwc.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * UFS Host driver for Synopsys Designware Core + * + * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com) + * + * Authors: Joao Pinto <jpinto@synopsys.com> + */ + +#ifndef _UFSHCI_DWC_H +#define _UFSHCI_DWC_H + +/* DWC HC UFSHCI specific Registers */ +enum dwc_specific_registers { + DWC_UFS_REG_HCLKDIV = 0xFC, +}; + +/* Clock Divider Values: Hex equivalent of frequency in MHz */ +enum clk_div_values { + DWC_UFS_REG_HCLKDIV_DIV_62_5 = 0x3e, + DWC_UFS_REG_HCLKDIV_DIV_125 = 0x7d, + DWC_UFS_REG_HCLKDIV_DIV_200 = 0xc8, +}; + +/* Selector Index */ +enum selector_index { + SELIND_LN0_TX = 0x00, + SELIND_LN1_TX = 0x01, + SELIND_LN0_RX = 0x04, + SELIND_LN1_RX = 0x05, +}; + +#endif /* End of Header */ diff --git a/u-boot/drivers/ufs/unipro.h b/u-boot/drivers/ufs/unipro.h new file mode 100644 index 0000000..b30b17f --- /dev/null +++ b/u-boot/drivers/ufs/unipro.h @@ -0,0 +1,270 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +#ifndef _UNIPRO_H_ +#define _UNIPRO_H_ + +/* + * M-TX Configuration Attributes + */ +#define TX_HIBERN8TIME_CAPABILITY 0x000F +#define TX_MODE 0x0021 +#define TX_HSRATE_SERIES 0x0022 +#define TX_HSGEAR 0x0023 +#define TX_PWMGEAR 0x0024 +#define TX_AMPLITUDE 0x0025 +#define TX_HS_SLEWRATE 0x0026 +#define TX_SYNC_SOURCE 0x0027 +#define TX_HS_SYNC_LENGTH 0x0028 +#define TX_HS_PREPARE_LENGTH 0x0029 +#define TX_LS_PREPARE_LENGTH 0x002A +#define TX_HIBERN8_CONTROL 0x002B +#define TX_LCC_ENABLE 0x002C +#define TX_PWM_BURST_CLOSURE_EXTENSION 0x002D +#define TX_BYPASS_8B10B_ENABLE 0x002E +#define TX_DRIVER_POLARITY 0x002F +#define TX_HS_UNTERMINATED_LINE_DRIVE_ENABLE 0x0030 +#define TX_LS_TERMINATED_LINE_DRIVE_ENABLE 0x0031 +#define TX_LCC_SEQUENCER 0x0032 +#define TX_MIN_ACTIVATETIME 0x0033 +#define TX_PWM_G6_G7_SYNC_LENGTH 0x0034 +#define TX_REFCLKFREQ 0x00EB +#define TX_CFGCLKFREQVAL 0x00EC +#define CFGEXTRATTR 0x00F0 +#define DITHERCTRL2 0x00F1 + +/* + * M-RX Configuration Attributes + */ +#define RX_MODE 0x00A1 +#define RX_HSRATE_SERIES 0x00A2 +#define RX_HSGEAR 0x00A3 +#define RX_PWMGEAR 0x00A4 +#define RX_LS_TERMINATED_ENABLE 0x00A5 +#define RX_HS_UNTERMINATED_ENABLE 0x00A6 +#define RX_ENTER_HIBERN8 0x00A7 +#define RX_BYPASS_8B10B_ENABLE 0x00A8 +#define RX_TERMINATION_FORCE_ENABLE 0x0089 +#define RX_MIN_ACTIVATETIME_CAPABILITY 0x008F +#define RX_HIBERN8TIME_CAPABILITY 0x0092 +#define RX_REFCLKFREQ 0x00EB +#define RX_CFGCLKFREQVAL 0x00EC +#define CFGWIDEINLN 0x00F0 +#define CFGRXCDR8 0x00BA +#define ENARXDIRECTCFG4 0x00F2 +#define CFGRXOVR8 0x00BD +#define RXDIRECTCTRL2 0x00C7 +#define ENARXDIRECTCFG3 0x00F3 +#define RXCALCTRL 0x00B4 +#define ENARXDIRECTCFG2 0x00F4 +#define CFGRXOVR4 0x00E9 +#define RXSQCTRL 0x00B5 +#define CFGRXOVR6 0x00BF + +#define is_mphy_tx_attr(attr) (attr < RX_MODE) +#define RX_MIN_ACTIVATETIME_UNIT_US 100 +#define HIBERN8TIME_UNIT_US 100 + +/* + * Common Block Attributes + */ +#define TX_GLOBALHIBERNATE UNIPRO_CB_OFFSET(0x002B) +#define REFCLKMODE UNIPRO_CB_OFFSET(0x00BF) +#define DIRECTCTRL19 UNIPRO_CB_OFFSET(0x00CD) +#define DIRECTCTRL10 UNIPRO_CB_OFFSET(0x00E6) +#define CDIRECTCTRL6 UNIPRO_CB_OFFSET(0x00EA) +#define RTOBSERVESELECT UNIPRO_CB_OFFSET(0x00F0) +#define CBDIVFACTOR UNIPRO_CB_OFFSET(0x00F1) +#define CBDCOCTRL5 UNIPRO_CB_OFFSET(0x00F3) +#define CBPRGPLL2 UNIPRO_CB_OFFSET(0x00F8) +#define CBPRGTUNING UNIPRO_CB_OFFSET(0x00FB) + +#define UNIPRO_CB_OFFSET(x) (0x8000 | x) + +/* + * PHY Adpater attributes + */ +#define PA_ACTIVETXDATALANES 0x1560 +#define PA_ACTIVERXDATALANES 0x1580 +#define PA_TXTRAILINGCLOCKS 0x1564 +#define PA_PHY_TYPE 0x1500 +#define PA_AVAILTXDATALANES 0x1520 +#define PA_AVAILRXDATALANES 0x1540 +#define PA_MINRXTRAILINGCLOCKS 0x1543 +#define PA_TXPWRSTATUS 0x1567 +#define PA_RXPWRSTATUS 0x1582 +#define PA_TXFORCECLOCK 0x1562 +#define PA_TXPWRMODE 0x1563 +#define PA_LEGACYDPHYESCDL 0x1570 +#define PA_MAXTXSPEEDFAST 0x1521 +#define PA_MAXTXSPEEDSLOW 0x1522 +#define PA_MAXRXSPEEDFAST 0x1541 +#define PA_MAXRXSPEEDSLOW 0x1542 +#define PA_TXLINKSTARTUPHS 0x1544 +#define PA_LOCAL_TX_LCC_ENABLE 0x155E +#define PA_TXSPEEDFAST 0x1565 +#define PA_TXSPEEDSLOW 0x1566 +#define PA_REMOTEVERINFO 0x15A0 +#define PA_TXGEAR 0x1568 +#define PA_TXTERMINATION 0x1569 +#define PA_HSSERIES 0x156A +#define PA_PWRMODE 0x1571 +#define PA_RXGEAR 0x1583 +#define PA_RXTERMINATION 0x1584 +#define PA_MAXRXPWMGEAR 0x1586 +#define PA_MAXRXHSGEAR 0x1587 +#define PA_RXHSUNTERMCAP 0x15A5 +#define PA_RXLSTERMCAP 0x15A6 +#define PA_GRANULARITY 0x15AA +#define PA_PACPREQTIMEOUT 0x1590 +#define PA_PACPREQEOBTIMEOUT 0x1591 +#define PA_HIBERN8TIME 0x15A7 +#define PA_LOCALVERINFO 0x15A9 +#define PA_TACTIVATE 0x15A8 +#define PA_PACPFRAMECOUNT 0x15C0 +#define PA_PACPERRORCOUNT 0x15C1 +#define PA_PHYTESTCONTROL 0x15C2 +#define PA_PWRMODEUSERDATA0 0x15B0 +#define PA_PWRMODEUSERDATA1 0x15B1 +#define PA_PWRMODEUSERDATA2 0x15B2 +#define PA_PWRMODEUSERDATA3 0x15B3 +#define PA_PWRMODEUSERDATA4 0x15B4 +#define PA_PWRMODEUSERDATA5 0x15B5 +#define PA_PWRMODEUSERDATA6 0x15B6 +#define PA_PWRMODEUSERDATA7 0x15B7 +#define PA_PWRMODEUSERDATA8 0x15B8 +#define PA_PWRMODEUSERDATA9 0x15B9 +#define PA_PWRMODEUSERDATA10 0x15BA +#define PA_PWRMODEUSERDATA11 0x15BB +#define PA_CONNECTEDTXDATALANES 0x1561 +#define PA_CONNECTEDRXDATALANES 0x1581 +#define PA_LOGICALLANEMAP 0x15A1 +#define PA_SLEEPNOCONFIGTIME 0x15A2 +#define PA_STALLNOCONFIGTIME 0x15A3 +#define PA_SAVECONFIGTIME 0x15A4 + +#define PA_TACTIVATE_TIME_UNIT_US 10 +#define PA_HIBERN8_TIME_UNIT_US 100 + +/*Other attributes*/ +#define VS_MPHYCFGUPDT 0xD085 +#define VS_DEBUGOMC 0xD09E +#define VS_POWERSTATE 0xD083 + +#define PA_GRANULARITY_MIN_VAL 1 +#define PA_GRANULARITY_MAX_VAL 6 + +/* PHY Adapter Protocol Constants */ +#define PA_MAXDATALANES 4 + +/* PA power modes */ +enum { + FAST_MODE = 1, + SLOW_MODE = 2, + FASTAUTO_MODE = 4, + SLOWAUTO_MODE = 5, + UNCHANGED = 7, +}; + +/* PA TX/RX Frequency Series */ +enum { + PA_HS_MODE_A = 1, + PA_HS_MODE_B = 2, +}; + +enum ufs_pwm_gear_tag { + UFS_PWM_DONT_CHANGE, /* Don't change Gear */ + UFS_PWM_G1, /* PWM Gear 1 (default for reset) */ + UFS_PWM_G2, /* PWM Gear 2 */ + UFS_PWM_G3, /* PWM Gear 3 */ + UFS_PWM_G4, /* PWM Gear 4 */ + UFS_PWM_G5, /* PWM Gear 5 */ + UFS_PWM_G6, /* PWM Gear 6 */ + UFS_PWM_G7, /* PWM Gear 7 */ +}; + +enum ufs_hs_gear_tag { + UFS_HS_DONT_CHANGE, /* Don't change Gear */ + UFS_HS_G1, /* HS Gear 1 (default for reset) */ + UFS_HS_G2, /* HS Gear 2 */ + UFS_HS_G3, /* HS Gear 3 */ +}; + +enum ufs_unipro_ver { + UFS_UNIPRO_VER_RESERVED = 0, + UFS_UNIPRO_VER_1_40 = 1, /* UniPro version 1.40 */ + UFS_UNIPRO_VER_1_41 = 2, /* UniPro version 1.41 */ + UFS_UNIPRO_VER_1_6 = 3, /* UniPro version 1.6 */ + UFS_UNIPRO_VER_MAX = 4, /* UniPro unsupported version */ + /* UniPro version field mask in PA_LOCALVERINFO */ + UFS_UNIPRO_VER_MASK = 0xF, +}; + +/* + * Data Link Layer Attributes + */ +#define DL_TC0TXFCTHRESHOLD 0x2040 +#define DL_FC0PROTTIMEOUTVAL 0x2041 +#define DL_TC0REPLAYTIMEOUTVAL 0x2042 +#define DL_AFC0REQTIMEOUTVAL 0x2043 +#define DL_AFC0CREDITTHRESHOLD 0x2044 +#define DL_TC0OUTACKTHRESHOLD 0x2045 +#define DL_TC1TXFCTHRESHOLD 0x2060 +#define DL_FC1PROTTIMEOUTVAL 0x2061 +#define DL_TC1REPLAYTIMEOUTVAL 0x2062 +#define DL_AFC1REQTIMEOUTVAL 0x2063 +#define DL_AFC1CREDITTHRESHOLD 0x2064 +#define DL_TC1OUTACKTHRESHOLD 0x2065 +#define DL_TXPREEMPTIONCAP 0x2000 +#define DL_TC0TXMAXSDUSIZE 0x2001 +#define DL_TC0RXINITCREDITVAL 0x2002 +#define DL_TC0TXBUFFERSIZE 0x2005 +#define DL_PEERTC0PRESENT 0x2046 +#define DL_PEERTC0RXINITCREVAL 0x2047 +#define DL_TC1TXMAXSDUSIZE 0x2003 +#define DL_TC1RXINITCREDITVAL 0x2004 +#define DL_TC1TXBUFFERSIZE 0x2006 +#define DL_PEERTC1PRESENT 0x2066 +#define DL_PEERTC1RXINITCREVAL 0x2067 + +/* + * Network Layer Attributes + */ +#define N_DEVICEID 0x3000 +#define N_DEVICEID_VALID 0x3001 +#define N_TC0TXMAXSDUSIZE 0x3020 +#define N_TC1TXMAXSDUSIZE 0x3021 + +/* + * Transport Layer Attributes + */ +#define T_NUMCPORTS 0x4000 +#define T_NUMTESTFEATURES 0x4001 +#define T_CONNECTIONSTATE 0x4020 +#define T_PEERDEVICEID 0x4021 +#define T_PEERCPORTID 0x4022 +#define T_TRAFFICCLASS 0x4023 +#define T_PROTOCOLID 0x4024 +#define T_CPORTFLAGS 0x4025 +#define T_TXTOKENVALUE 0x4026 +#define T_RXTOKENVALUE 0x4027 +#define T_LOCALBUFFERSPACE 0x4028 +#define T_PEERBUFFERSPACE 0x4029 +#define T_CREDITSTOSEND 0x402A +#define T_CPORTMODE 0x402B +#define T_TC0TXMAXSDUSIZE 0x4060 +#define T_TC1TXMAXSDUSIZE 0x4061 + +#ifdef FALSE +#undef FALSE +#endif + +#ifdef TRUE +#undef TRUE +#endif + +/* Boolean attribute values */ +enum { + FALSE = 0, + TRUE, +}; + +#endif /* _UNIPRO_H_ */ diff --git a/u-boot/drivers/usb/dwc3/gadget.c b/u-boot/drivers/usb/dwc3/gadget.c index 0923409..1f8d464 100644 --- a/u-boot/drivers/usb/dwc3/gadget.c +++ b/u-boot/drivers/usb/dwc3/gadget.c @@ -2482,7 +2482,6 @@ while (left > 0) { union dwc3_event event; - invalidate_dcache_range((uintptr_t)evt->buf, evt->length); event.raw = *(u32 *) (evt->buf + evt->lpos); dwc3_process_event_entry(dwc, &event); @@ -2538,6 +2537,7 @@ u32 reg; evt = dwc->ev_buffs[buf]; + dwc3_invalidate_cache((uintptr_t)evt->buf, evt->length); count = dwc3_readl(dwc->regs, DWC3_GEVNTCOUNT(buf)); count &= DWC3_GEVNTCOUNT_MASK; diff --git a/u-boot/drivers/usb/dwc3/io.h b/u-boot/drivers/usb/dwc3/io.h index 810980f..d59f8be 100644 --- a/u-boot/drivers/usb/dwc3/io.h +++ b/u-boot/drivers/usb/dwc3/io.h @@ -48,6 +48,11 @@ writel(value, base + offs); } +static inline void dwc3_invalidate_cache(uintptr_t addr, int length) +{ + invalidate_dcache_range(addr, addr + ROUND(length, CACHELINE_SIZE)); +} + static inline void dwc3_flush_cache(uintptr_t addr, int length) { flush_dcache_range(addr, addr + ROUND(length, CACHELINE_SIZE)); diff --git a/u-boot/drivers/video/Kconfig b/u-boot/drivers/video/Kconfig index 27cb8ef..55a27e6 100644 --- a/u-boot/drivers/video/Kconfig +++ b/u-boot/drivers/video/Kconfig @@ -14,6 +14,21 @@ option compiles in the video uclass and routes all LCD/video access through this. +config SPL_DM_VIDEO + bool "Enable driver model support for LCD/video in SPL" + depends on DM_VIDEO && SPL + help + This enables driver model for LCD and video devices in SPL. These support + a bitmap display of various sizes and depths which can be drawn on + to display a command-line console or splash screen. Enabling this + option compiles in the video uclass and routes all LCD/video access + through this. + +config SPL_VIDEO_BUF + hex "SPL video memory buffer for any use" + depends on SPL_DM_VIDEO + default 0xa200000 + config BACKLIGHT_PWM bool "Generic PWM based Backlight Driver" depends on DM_VIDEO && DM_PWM @@ -390,6 +405,12 @@ help This enables library for accessing EDID data from an LCD panel. +config SPL_I2C_EDID + bool "Enable EDID library in SPL" + depends on DM_I2C && SPL_DM_VIDEO + help + This enables library in SPL for accessing EDID data from an LCD panel. + config DISPLAY bool "Enable Display support" depends on DM diff --git a/u-boot/drivers/video/Makefile b/u-boot/drivers/video/Makefile index 60ffa66..6ce2537 100644 --- a/u-boot/drivers/video/Makefile +++ b/u-boot/drivers/video/Makefile @@ -5,6 +5,7 @@ # SPDX-License-Identifier: GPL-2.0+ # +ifndef CONFIG_SPL_BUILD ifdef CONFIG_DM obj-$(CONFIG_DISPLAY) += display-uclass.o obj-$(CONFIG_DM_VIDEO) += backlight-uclass.o @@ -56,8 +57,11 @@ obj-${CONFIG_VIDEO_TEGRA124} += tegra124/ obj-${CONFIG_EXYNOS_FB} += exynos/ obj-${CONFIG_VIDEO_ROCKCHIP} += rockchip/ -obj-${CONFIG_DRM_ROCKCHIP} += drm/ obj-${CONFIG_ROCKCHIP_EINK} += rk_eink/ obj-y += bridge/ obj-y += sunxi/ +endif + +obj-${CONFIG_DRM_ROCKCHIP} += drm/ + diff --git a/u-boot/drivers/video/drm/Kconfig b/u-boot/drivers/video/drm/Kconfig index cb070f1..cc27f66 100644 --- a/u-boot/drivers/video/drm/Kconfig +++ b/u-boot/drivers/video/drm/Kconfig @@ -28,15 +28,6 @@ help Driver for Maxim MAX96745 GMSL2 Serializer with eDP1.4a/DP1.4 Input. -config DRM_MAXIM_MAX96752F - bool "Maxim max96752F GMSL2 Deserializer" - depends on DRM_ROCKCHIP - select I2C_MUX_MAX96752F - select PINCTRL_MAX96752F - select GPIO_MAX96752F - help - Driver for Maxim MAX96752F GMSL2 Deserializer with Dual LVDS Output. - config DRM_MAXIM_MAX96755F bool "Maxim max96755F GMSL2 Serializer" depends on DRM_ROCKCHIP @@ -45,11 +36,19 @@ help Driver for Maxim MAX96755F GMSL2 Serializer with MIPI-DSI Input. -config DRM_PANEL_MAXIM_DESERIALIZER - bool "Maxim deserializer panel driver" +config DRM_PANEL_ROHM_BU18RL82 + bool "Rohm BU18RL82-based panels" depends on DRM_ROCKCHIP help - Driver for Maxim deserializer panels. + Say Y if you want to enable support for panels based on the + Rohm BU18RL82. + +config DRM_PANEL_MAXIM_MAX96752F + bool "Maxim MAX96752F-based panels" + depends on DRM_ROCKCHIP + help + Say Y if you want to enable support for panels based on the + Maxim MAX96752F. config DRM_ROCKCHIP_PANEL bool "Rockchip Panel Support" @@ -216,13 +215,12 @@ Support for Rockchip HDMI/DP Combo PHY HDMI with Samsung IP block. -config ROCKCHIP_DRM_TVE +config DRM_ROCKCHIP_TVE bool "Rockchip TVE Support" depends on DRM_ROCKCHIP help Choose this option to enable support for Rockchip TVE. - Rockchip rk322x and rk322xh SoC has TVE can be used, and - say Y to enable TVE driver. + Say Y to enable TVE driver. config ROCKCHIP_CUBIC_LUT_SIZE int "Rockchip cubic lut size" diff --git a/u-boot/drivers/video/drm/Makefile b/u-boot/drivers/video/drm/Makefile index d5ceeb3..4c28ee1 100644 --- a/u-boot/drivers/video/drm/Makefile +++ b/u-boot/drivers/video/drm/Makefile @@ -6,17 +6,18 @@ obj-y += drm_modes.o -obj-y += rockchip_display.o rockchip_crtc.o rockchip_phy.o rockchip_bridge.o \ +ifndef CONFIG_SPL_BUILD +obj-y += rockchip_display.o rockchip_display_helper.o rockchip_crtc.o rockchip_phy.o rockchip_bridge.o \ rockchip_vop.o rockchip_vop_reg.o rockchip_vop2.o bmp_helper.o \ - rockchip_connector.o + rockchip_connector.o rockchip_post_csc.o obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o obj-$(CONFIG_DRM_DP_HELPER) += drm_dp_helper.o obj-$(CONFIG_DRM_DSC) += drm_dsc.o obj-$(CONFIG_DRM_MAXIM_MAX96745) += max96745.o -obj-$(CONFIG_DRM_MAXIM_MAX96752F) += max96752f.o obj-$(CONFIG_DRM_MAXIM_MAX96755F) += max96755f.o -obj-$(CONFIG_DRM_PANEL_MAXIM_DESERIALIZER) += panel-maxim-deserializer.o +obj-$(CONFIG_DRM_PANEL_ROHM_BU18RL82) += panel-rohm-bu18rl82.o +obj-$(CONFIG_DRM_PANEL_MAXIM_MAX96752F) += panel-maxim-max96752f.o obj-$(CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI) += dw_mipi_dsi.o obj-$(CONFIG_DRM_ROCKCHIP_DW_MIPI_DSI2) += dw_mipi_dsi2.o obj-$(CONFIG_DRM_ROCKCHIP_DW_HDMI) += rockchip_dw_hdmi.o dw_hdmi.o @@ -27,7 +28,7 @@ obj-$(CONFIG_DRM_ROCKCHIP_INNO_VIDEO_PHY) += inno_video_phy.o obj-$(CONFIG_DRM_ROCKCHIP_INNO_VIDEO_COMBO_PHY) += inno_video_combo_phy.o obj-$(CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX_HDMI) += phy-rockchip-samsung-hdptx-hdmi.o -obj-$(CONFIG_ROCKCHIP_DRM_TVE) += rockchip_drm_tve.o +obj-$(CONFIG_DRM_ROCKCHIP_TVE) += rockchip_tve.o obj-$(CONFIG_DRM_ROCKCHIP_ANALOGIX_DP) += analogix_dp.o analogix_dp_reg.o obj-$(CONFIG_DRM_ROCKCHIP_DW_DP) += dw-dp.o obj-$(CONFIG_DRM_ROCKCHIP_LVDS) += rockchip_lvds.o @@ -37,3 +38,7 @@ obj-$(CONFIG_DRM_ROCKCHIP_RK618) += rk618.o rk618_lvds.o rk618_dsi.o obj-$(CONFIG_DRM_ROCKCHIP_RK1000) += rk1000.o rk1000_tve.o obj-$(CONFIG_DRM_ROCKCHIP_SAMSUNG_MIPI_DCPHY) += samsung_mipi_dcphy.o +else +obj-y += rockchip_spl_display.o rockchip_display_helper.o rockchip_crtc.o rockchip_connector.o rockchip_post_csc.o rockchip_vop2.o rockchip_phy.o rockchip-inno-hdmi-phy.o rockchip_dw_hdmi.o dw_hdmi.o +endif + diff --git a/u-boot/drivers/video/drm/analogix_dp.c b/u-boot/drivers/video/drm/analogix_dp.c index 52d5bf1..70cd620 100644 --- a/u-boot/drivers/video/drm/analogix_dp.c +++ b/u-boot/drivers/video/drm/analogix_dp.c @@ -943,6 +943,37 @@ .detect = analogix_dp_connector_detect, }; +static u32 analogix_dp_parse_link_frequencies(struct analogix_dp_device *dp) +{ + struct udevice *dev = dp->dev; + const struct device_node *endpoint; + u64 frequency = 0; + + endpoint = rockchip_of_graph_get_endpoint_by_regs(dev->node, 1, 0); + if (!endpoint) + return 0; + + if (of_property_read_u64(endpoint, "link-frequencies", &frequency) < 0) + return 0; + + if (!frequency) + return 0; + + do_div(frequency, 10 * 1000); /* symbol rate kbytes */ + + switch (frequency) { + case 162000: + case 270000: + case 540000: + break; + default: + dev_err(dev, "invalid link frequency value: %llu\n", frequency); + return 0; + } + + return frequency; +} + static int analogix_dp_parse_dt(struct analogix_dp_device *dp) { struct udevice *dev = dp->dev; @@ -956,21 +987,9 @@ dp->video_info.force_stream_valid = dev_read_bool(dev, "analogix,force-stream-valid"); - max_link_rate = dev_read_u32_default(dev, "max-link-rate", 0); - if (max_link_rate) { - switch (max_link_rate) { - case 1620: - case 2700: - case 5400: - dp->video_info.max_link_rate = - min_t(u8, dp->video_info.max_link_rate, - drm_dp_link_rate_to_bw_code(max_link_rate * 100)); - break; - default: - dev_err(dev, "invalid max-link-rate %d\n", max_link_rate); - break; - } - } + max_link_rate = analogix_dp_parse_link_frequencies(dp); + if (max_link_rate && max_link_rate < drm_dp_bw_code_to_link_rate(dp->video_info.max_link_rate)) + dp->video_info.max_link_rate = drm_dp_link_rate_to_bw_code(max_link_rate); if (dev_read_prop(dev, "data-lanes", &len)) { num_lanes = len / sizeof(u32); @@ -1075,8 +1094,9 @@ .lcdsel_big = 0 | BIT(21), .lcdsel_lit = BIT(5) | BIT(21), .chip_type = RK3399_EDP, + .ssc = true, - .max_link_rate = DP_LINK_BW_2_7, + .max_link_rate = DP_LINK_BW_5_4, .max_lane_count = 4, }; diff --git a/u-boot/drivers/video/drm/drm_modes.c b/u-boot/drivers/video/drm/drm_modes.c index fabae87..2c35919 100644 --- a/u-boot/drivers/video/drm/drm_modes.c +++ b/u-boot/drivers/video/drm/drm_modes.c @@ -60,6 +60,19 @@ } /** + * drm_mode_copy - copy the mode + * @dst: mode to overwrite + * @src: mode to copy + * + * Copy an existing mode into another mode, preserving the object id and + * list head of the destination mode. + */ +void drm_mode_copy(struct drm_display_mode *dst, const struct drm_display_mode *src) +{ + *dst = *src; +} + +/** * drm_mode_destroy - remove a mode * @mode: mode to remove */ @@ -185,6 +198,45 @@ } /** + * drm_display_mode_from_videomode - fill in @dmode using @vm, + * @vm: videomode structure to use as source + * @dmode: drm_display_mode structure to use as destination + * + * Fills out @dmode using the display mode specified in @vm. + */ +void drm_display_mode_from_videomode(const struct videomode *vm, + struct drm_display_mode *dmode) +{ + dmode->hdisplay = vm->hactive; + dmode->hsync_start = dmode->hdisplay + vm->hfront_porch; + dmode->hsync_end = dmode->hsync_start + vm->hsync_len; + dmode->htotal = dmode->hsync_end + vm->hback_porch; + + dmode->vdisplay = vm->vactive; + dmode->vsync_start = dmode->vdisplay + vm->vfront_porch; + dmode->vsync_end = dmode->vsync_start + vm->vsync_len; + dmode->vtotal = dmode->vsync_end + vm->vback_porch; + + dmode->clock = vm->pixelclock / 1000; + + dmode->flags = 0; + if (vm->flags & DISPLAY_FLAGS_HSYNC_HIGH) + dmode->flags |= DRM_MODE_FLAG_PHSYNC; + else if (vm->flags & DISPLAY_FLAGS_HSYNC_LOW) + dmode->flags |= DRM_MODE_FLAG_NHSYNC; + if (vm->flags & DISPLAY_FLAGS_VSYNC_HIGH) + dmode->flags |= DRM_MODE_FLAG_PVSYNC; + else if (vm->flags & DISPLAY_FLAGS_VSYNC_LOW) + dmode->flags |= DRM_MODE_FLAG_NVSYNC; + if (vm->flags & DISPLAY_FLAGS_INTERLACED) + dmode->flags |= DRM_MODE_FLAG_INTERLACE; + if (vm->flags & DISPLAY_FLAGS_DOUBLESCAN) + dmode->flags |= DRM_MODE_FLAG_DBLSCAN; + if (vm->flags & DISPLAY_FLAGS_DOUBLECLK) + dmode->flags |= DRM_MODE_FLAG_DBLCLK; +} + +/** * drm_display_mode_to_videomode - fill in @vm using @dmode, * @dmode: drm_display_mode structure to use as source * @vm: videomode structure to use as destination diff --git a/u-boot/drivers/video/drm/dw-dp.c b/u-boot/drivers/video/drm/dw-dp.c index e6e5b0b..2af2f82 100644 --- a/u-boot/drivers/video/drm/dw-dp.c +++ b/u-boot/drivers/video/drm/dw-dp.c @@ -231,6 +231,7 @@ bool force_hpd; bool force_output; + u32 max_link_rate; }; enum { @@ -562,7 +563,7 @@ !!(dpcd & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED); link->revision = link->dpcd[DP_DPCD_REV]; - link->rate = min_t(u32, dp->phy.attrs.max_link_rate * 100, + link->rate = min_t(u32, min(dp->max_link_rate, dp->phy.attrs.max_link_rate * 100), drm_dp_max_link_rate(link->dpcd)); link->lanes = min_t(u8, dp->phy.attrs.bus_width, drm_dp_max_lane_count(link->dpcd)); @@ -1704,6 +1705,49 @@ return 0; } +static u32 dw_dp_parse_link_frequencies(struct dw_dp *dp) +{ + struct udevice *dev = dp->dev; + const struct device_node *endpoint; + u64 frequency = 0; + + endpoint = rockchip_of_graph_get_endpoint_by_regs(dev->node, 1, 0); + if (!endpoint) + return 0; + + if (of_property_read_u64(endpoint, "link-frequencies", &frequency) < 0) + return 0; + + if (!frequency) + return 0; + + do_div(frequency, 10 * 1000); /* symbol rate kbytes */ + + switch (frequency) { + case 162000: + case 270000: + case 540000: + case 810000: + break; + default: + dev_err(dev, "invalid link frequency value: %llu\n", frequency); + return 0; + } + + return frequency; +} + +static int dw_dp_parse_dt(struct dw_dp *dp) +{ + dp->force_hpd = dev_read_bool(dp->dev, "force-hpd"); + + dp->max_link_rate = dw_dp_parse_link_frequencies(dp); + if (!dp->max_link_rate) + dp->max_link_rate = 810000; + + return 0; +} + static int dw_dp_probe(struct udevice *dev) { struct dw_dp *dp = dev_get_priv(dev); @@ -1723,8 +1767,6 @@ return ret; } - dp->force_hpd = dev_read_bool(dev, "force-hpd"); - ret = gpio_request_by_name(dev, "hpd-gpios", 0, &dp->hpd_gpio, GPIOD_IS_IN); if (ret && ret != -ENOENT) { @@ -1736,6 +1778,12 @@ dp->dev = dev; + ret = dw_dp_parse_dt(dp); + if (ret) { + dev_err(dev, "failed to parse DT\n"); + return ret; + } + dw_dp_ddc_init(dp); rockchip_connector_bind(&dp->connector, dev, dp->id, &dw_dp_connector_funcs, NULL, diff --git a/u-boot/drivers/video/drm/dw_hdmi.c b/u-boot/drivers/video/drm/dw_hdmi.c index f993a21..a30e4d5 100644 --- a/u-boot/drivers/video/drm/dw_hdmi.c +++ b/u-boot/drivers/video/drm/dw_hdmi.c @@ -7,6 +7,7 @@ #include <common.h> #include <malloc.h> #include <syscon.h> +#include <asm/gpio.h> #include <asm/arch-rockchip/clock.h> #include <asm/arch/vendor.h> #include <edid.h> @@ -27,6 +28,7 @@ #define HDCP_PRIVATE_KEY_SIZE 280 #define HDCP_KEY_SHA_SIZE 20 #define HDMI_HDCP1X_ID 5 +#define HDMI_EDID_BLOCK_LEN 128 /* * Unless otherwise noted, entries in this table are 100% optimization. * Values can be obtained from hdmi_compute_n() but that function is @@ -181,6 +183,7 @@ bool sink_has_audio; void *regs; void *grf; + void *gpio_base; struct dw_hdmi_i2c *i2c; struct { @@ -203,6 +206,8 @@ bool hdcp1x_enable; bool output_bus_format_rgb; + + struct gpio_desc hpd_gpiod; }; static void dw_hdmi_writel(struct dw_hdmi *hdmi, u8 val, int offset) @@ -409,6 +414,7 @@ { struct dw_hdmi_i2c *i2c = hdmi->i2c; int interrupt = 0, i = 20; + bool read_edid = false; if (!i2c->is_regaddr) { printf("set read register address to 0\n"); @@ -416,14 +422,36 @@ i2c->is_regaddr = true; } - while (length--) { - hdmi_writeb(hdmi, i2c->slave_reg++, HDMI_I2CM_ADDRESS); - if (i2c->is_segment) - hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ_EXT, - HDMI_I2CM_OPERATION); - else - hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ, - HDMI_I2CM_OPERATION); + /* edid reads are in 128 bytes. scdc reads are in 1 byte */ + if (length == HDMI_EDID_BLOCK_LEN) + read_edid = true; + + while (length > 0) { + hdmi_writeb(hdmi, i2c->slave_reg, HDMI_I2CM_ADDRESS); + + if (read_edid) { + i2c->slave_reg += 8; + length -= 8; + } else { + i2c->slave_reg++; + length--; + } + + if (i2c->is_segment) { + if (read_edid) + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ8_EXT, + HDMI_I2CM_OPERATION); + else + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ_EXT, + HDMI_I2CM_OPERATION); + } else { + if (read_edid) + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ8, + HDMI_I2CM_OPERATION); + else + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_READ, + HDMI_I2CM_OPERATION); + } while (i--) { udelay(1000); @@ -439,6 +467,10 @@ if (!interrupt) { printf("[%s] i2c read reg[0x%02x] no interrupt\n", __func__, i2c->slave_reg); + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, + HDMI_I2CM_OPERATION); + udelay(1000); return -EAGAIN; } @@ -446,11 +478,19 @@ if (interrupt & HDMI_IH_I2CM_STAT0_ERROR) { printf("[%s] read reg[0x%02x] data error:0x%02x\n", __func__, i2c->slave_reg, interrupt); + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, + HDMI_I2CM_OPERATION); + udelay(1000); return -EIO; } i = 20; - *buf++ = hdmi_readb(hdmi, HDMI_I2CM_DATAI); + if (read_edid) + for (i = 0; i < 8; i++) + *buf++ = hdmi_readb(hdmi, HDMI_I2CM_READ_BUFF0 + i); + else + *buf++ = hdmi_readb(hdmi, HDMI_I2CM_DATAI); } i2c->is_segment = false; @@ -490,8 +530,22 @@ break; } + if (!interrupt) { + printf("[%s] i2c write reg[0x%02x] no interrupt\n", + __func__, i2c->slave_reg); + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, + HDMI_I2CM_OPERATION); + udelay(1000); + return -EAGAIN; + } + if ((interrupt & m_I2CM_ERROR) || (i == -1)) { printf("[%s] write data error\n", __func__); + hdmi_writeb(hdmi, 0, HDMI_I2CM_SOFTRSTZ); + hdmi_writeb(hdmi, HDMI_I2CM_OPERATION_BUS_CLEAR, + HDMI_I2CM_OPERATION); + udelay(1000); return -EIO; } else if (interrupt & m_I2CM_DONE) { printf("[%s] write offset %02x success\n", @@ -959,6 +1013,7 @@ * but it has a vedor phy. */ if (phy_type == DW_HDMI_PHY_VENDOR_PHY || + hdmi->dev_type == RK3528_HDMI || hdmi->dev_type == RK3328_HDMI || hdmi->dev_type == RK3228_HDMI) { /* Vendor PHYs require support from the glue layer. */ @@ -1042,14 +1097,11 @@ vmode->mpixelclock, vmode->mtmdsclock); /* Set up HDMI_FC_INVIDCONF - * fc_invidconf.HDCP_keepout must be set (1'b1) - * when activate the scrambler feature. + * Some display equipments require that the interval + * between Video Data and Data island must be at least 58 pixels, + * and fc_invidconf.HDCP_keepout set (1'b1) can meet the requirement. */ - inv_val = (vmode->mtmdsclock > 340000000 || - (hdmi_info->scdc.scrambling.low_rates && - hdmi->scramble_low_rates) ? - HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE : - HDMI_FC_INVIDCONF_HDCP_KEEPOUT_INACTIVE); + inv_val = HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE; inv_val |= mode->flags & DRM_MODE_FLAG_PVSYNC ? HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_HIGH : @@ -1418,13 +1470,8 @@ HDMI_VP_CONF_PR_EN_MASK | HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF); - if ((color_depth == 5 && hdmi->previous_mode.htotal % 4) || - (color_depth == 6 && hdmi->previous_mode.htotal % 2)) - hdmi_modb(hdmi, 0, HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, - HDMI_VP_STUFF); - else - hdmi_modb(hdmi, 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET, - HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, HDMI_VP_STUFF); + hdmi_modb(hdmi, 0, HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, + HDMI_VP_STUFF); hdmi_writeb(hdmi, remap_size, HDMI_VP_REMAP); @@ -1887,6 +1934,7 @@ hdmi->sample_rate); } +#ifndef CONFIG_SPL_BUILD static int dw_hdmi_hdcp_load_key(struct dw_hdmi *hdmi) { int i, j, ret, val; @@ -1952,6 +2000,7 @@ free(hdcp_keys); return 0; } +#endif static void hdmi_tx_hdcp_config(struct dw_hdmi *hdmi, const struct drm_display_mode *mode) @@ -1981,8 +2030,10 @@ hdmi_modb(hdmi, hdmi_dvi, HDMI_A_HDCPCFG0_HDMIDVI_MASK, HDMI_A_HDCPCFG0); +#ifndef CONFIG_SPL_BUILD if (!(hdmi_readb(hdmi, HDMI_HDCPREG_RMSTS) & 0x3f)) dw_hdmi_hdcp_load_key(hdmi); +#endif hdmi_modb(hdmi, HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE, HDMI_FC_INVIDCONF_HDCP_KEEPOUT_MASK, @@ -2269,13 +2320,18 @@ { struct connector_state *conn_state = &state->conn_state; const struct dw_hdmi_plat_data *pdata = +#ifdef CONFIG_SPL_BUILD + (const struct dw_hdmi_plat_data *)conn->data; +#else (const struct dw_hdmi_plat_data *)dev_get_driver_data(conn->dev); + ofnode hdmi_node = conn->dev->node; + struct device_node *ddc_node; + int ret; +#endif struct crtc_state *crtc_state = &state->crtc_state; struct dw_hdmi *hdmi; struct drm_display_mode *mode_buf; - ofnode hdmi_node = conn->dev->node; u32 val; - struct device_node *ddc_node; hdmi = malloc(sizeof(struct dw_hdmi)); if (!hdmi) @@ -2285,13 +2341,28 @@ mode_buf = malloc(MODE_LEN * sizeof(struct drm_display_mode)); if (!mode_buf) return -ENOMEM; + +#ifdef CONFIG_SPL_BUILD + hdmi->id = 0; + hdmi->regs = (void *)RK3528_HDMI_BASE; + hdmi->io_width = 4; + hdmi->scramble_low_rates = false; + hdmi->hdcp1x_enable = false; + hdmi->output_bus_format_rgb = false; + conn_state->type = DRM_MODE_CONNECTOR_HDMIA; +#else hdmi->id = of_alias_get_id(ofnode_to_np(hdmi_node), "hdmi"); if (hdmi->id < 0) hdmi->id = 0; - conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id); + conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id); +#endif memset(mode_buf, 0, MODE_LEN * sizeof(struct drm_display_mode)); + hdmi->dev_type = pdata->dev_type; + hdmi->plat_data = pdata; + +#ifndef CONFIG_SPL_BUILD hdmi->regs = dev_read_addr_ptr(conn->dev); hdmi->io_width = ofnode_read_s32_default(hdmi_node, "reg-io-width", -1); @@ -2309,6 +2380,24 @@ else hdmi->output_bus_format_rgb = false; + ret = dev_read_size(conn->dev, "rockchip,phy-table"); + if (ret > 0 && hdmi->plat_data->phy_config) { + u32 phy_config[ret / 4]; + int i; + + dev_read_u32_array(conn->dev, "rockchip,phy-table", phy_config, ret / 4); + + for (i = 0; i < ret / 16; i++) { + if (phy_config[i * 4] != 0) + hdmi->plat_data->phy_config[i].mpixelclock = (u64)phy_config[i * 4]; + else + hdmi->plat_data->phy_config[i].mpixelclock = ~0UL; + hdmi->plat_data->phy_config[i].sym_ctr = (u16)phy_config[i * 4 + 1]; + hdmi->plat_data->phy_config[i].term = (u16)phy_config[i * 4 + 2]; + hdmi->plat_data->phy_config[i].vlev_ctr = (u16)phy_config[i * 4 + 3]; + } + } + ddc_node = of_parse_phandle(ofnode_to_np(hdmi_node), "ddc-i2c-bus", 0); if (ddc_node) { uclass_get_device_by_ofnode(UCLASS_I2C, np_to_ofnode(ddc_node), @@ -2316,6 +2405,7 @@ if (hdmi->adap.i2c_bus) hdmi->adap.ops = i2c_get_ops(hdmi->adap.i2c_bus); } +#endif hdmi->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); if (hdmi->grf <= 0) { @@ -2323,6 +2413,20 @@ __func__, hdmi->grf); return -ENXIO; } + +#ifdef CONFIG_SPL_BUILD + hdmi->gpio_base = (void *)RK3528_GPIO_BASE; +#else + ret = gpio_request_by_name(conn->dev, "hpd-gpios", 0, + &hdmi->hpd_gpiod, GPIOD_IS_IN); + if (ret && ret != -ENOENT) { + printf("%s: Cannot get HPD GPIO: %d\n", __func__, ret); + return ret; + } + hdmi->gpio_base = (void *)dev_read_addr_index(conn->dev, 1); +#endif + if (!hdmi->gpio_base) + return -ENODEV; dw_hdmi_set_reg_wr(hdmi); @@ -2345,24 +2449,28 @@ * Read high and low time from device tree. If not available use * the default timing scl clock rate is about 99.6KHz. */ +#ifdef CONFIG_SPL_BUILD + hdmi->i2c->scl_high_ns = 9625; + hdmi->i2c->scl_low_ns = 10000; +#else hdmi->i2c->scl_high_ns = ofnode_read_s32_default(hdmi_node, "ddc-i2c-scl-high-time-ns", 4708); hdmi->i2c->scl_low_ns = ofnode_read_s32_default(hdmi_node, "ddc-i2c-scl-low-time-ns", 4916); +#endif dw_hdmi_i2c_init(hdmi); conn_state->output_if |= VOP_OUTPUT_IF_HDMI0; conn_state->output_mode = ROCKCHIP_OUT_MODE_AAAA; - hdmi->dev_type = pdata->dev_type; - hdmi->plat_data = pdata; hdmi->edid_data.mode_buf = mode_buf; hdmi->sample_rate = 48000; conn->data = hdmi; - dw_hdmi_set_iomux(hdmi->grf, hdmi->dev_type); + dw_hdmi_set_iomux(hdmi->grf, hdmi->gpio_base, + &hdmi->hpd_gpiod, hdmi->dev_type); dw_hdmi_detect_phy(hdmi); dw_hdmi_dev_init(hdmi); @@ -2413,7 +2521,7 @@ int rockchip_dw_hdmi_get_timing(struct rockchip_connector *conn, struct display_state *state) { - int ret, i; + int ret, i, vic; struct connector_state *conn_state = &state->conn_state; struct drm_display_mode *mode = &conn_state->mode; struct dw_hdmi *hdmi = conn->data; @@ -2439,9 +2547,13 @@ hdmi->sink_has_audio = true; do_cea_modes(&hdmi->edid_data, def_modes_vic, sizeof(def_modes_vic)); + hdmi->edid_data.mode_buf[0].type |= DRM_MODE_TYPE_PREFERRED; hdmi->edid_data.preferred_mode = &hdmi->edid_data.mode_buf[0]; printf("failed to get edid\n"); } +#ifdef CONFIG_SPL_BUILD + conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id); +#endif drm_rk_filter_whitelist(&hdmi->edid_data); if (hdmi->phy.ops->mode_valid) hdmi->phy.ops->mode_valid(conn, hdmi, state); @@ -2452,9 +2564,20 @@ return -EINVAL; } - for (i = 0; i < hdmi->edid_data.modes; i++) + for (i = 0; i < hdmi->edid_data.modes; i++) { hdmi->edid_data.mode_buf[i].vrefresh = drm_mode_vrefresh(&hdmi->edid_data.mode_buf[i]); + + vic = drm_match_cea_mode(&hdmi->edid_data.mode_buf[i]); + if (hdmi->edid_data.mode_buf[i].picture_aspect_ratio == HDMI_PICTURE_ASPECT_NONE) { + if (vic >= 93 && vic <= 95) + hdmi->edid_data.mode_buf[i].picture_aspect_ratio = + HDMI_PICTURE_ASPECT_16_9; + else if (vic == 98) + hdmi->edid_data.mode_buf[i].picture_aspect_ratio = + HDMI_PICTURE_ASPECT_256_135; + } + } drm_mode_sort(&hdmi->edid_data); drm_rk_selete_output(&hdmi->edid_data, conn_state, &bus_format, @@ -2463,7 +2586,6 @@ *mode = *hdmi->edid_data.preferred_mode; hdmi->vic = drm_match_cea_mode(mode); - printf("mode:%dx%d\n", mode->hdisplay, mode->vdisplay); if (state->force_output) bus_format = state->force_bus_format; conn_state->bus_format = bus_format; diff --git a/u-boot/drivers/video/drm/dw_hdmi.h b/u-boot/drivers/video/drm/dw_hdmi.h index f002dea..3872dae 100644 --- a/u-boot/drivers/video/drm/dw_hdmi.h +++ b/u-boot/drivers/video/drm/dw_hdmi.h @@ -1194,6 +1194,7 @@ HDMI_A_VIDPOLCFG_HSYNCPOL_ACTIVE_LOW = 0x0, /* I2CM_OPERATION field values */ + HDMI_I2CM_OPERATION_BUS_CLEAR = 0x20, HDMI_I2CM_OPERATION_WRITE = 0x10, HDMI_I2CM_OPERATION_READ8_EXT = 0x8, HDMI_I2CM_OPERATION_READ8 = 0x4, @@ -1411,6 +1412,7 @@ enum dw_hdmi_devtype dev_type, bool output_bus_format_rgb); void inno_dw_hdmi_set_domain(void *grf, int status); -void dw_hdmi_set_iomux(void *grf, int dev_type); +void dw_hdmi_set_iomux(void *grf, void *gpio_base, struct gpio_desc *hpd_gpiod, + int dev_type); #endif /* _ROCKCHIP_HDMI_H_ */ diff --git a/u-boot/drivers/video/drm/dw_hdmi_qp.c b/u-boot/drivers/video/drm/dw_hdmi_qp.c index 7a8b54f..0e28702 100644 --- a/u-boot/drivers/video/drm/dw_hdmi_qp.c +++ b/u-boot/drivers/video/drm/dw_hdmi_qp.c @@ -175,6 +175,9 @@ case MEDIA_BUS_FMT_UYVY8_1X16: case MEDIA_BUS_FMT_UYVY10_1X20: case MEDIA_BUS_FMT_UYVY12_1X24: + case MEDIA_BUS_FMT_YUYV8_1X16: + case MEDIA_BUS_FMT_YUYV10_1X20: + case MEDIA_BUS_FMT_YUYV12_1X24: return true; default: @@ -1047,6 +1050,9 @@ /* HDMI Initialization Step B.2 */ hdmi->phy.ops->set_pll(conn, hdmi->rk_hdmi, state); + /* Mark yuv422 10bit */ + if (hdmi->hdmi_data.enc_out_bus_format == MEDIA_BUS_FMT_YUYV10_1X20) + hdmi_writel(hdmi, BIT(20), VIDEO_INTERFACE_CONFIG0); rk3588_set_grf_cfg(hdmi->rk_hdmi); link_cfg = dw_hdmi_rockchip_get_link_cfg(hdmi->rk_hdmi); @@ -1094,6 +1100,9 @@ hdmi->phy.enabled = true; printf("%s DVI mode\n", __func__); } + + /* Mark uboot hdmi is enabled */ + hdmi_writel(hdmi, BIT(21), VIDEO_INTERFACE_CONFIG0); return 0; } @@ -1239,9 +1248,23 @@ return 0; } -int rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn, struct display_state *state) +static void rockchip_dw_hdmi_qp_mode_valid(struct dw_hdmi_qp *hdmi) { - int ret, i; + struct hdmi_edid_data *edid_data = &hdmi->edid_data; + int i; + + for (i = 0; i < edid_data->modes; i++) { + if (edid_data->mode_buf[i].invalid) + continue; + if (edid_data->mode_buf[i].clock <= 25000) + edid_data->mode_buf[i].invalid = true; + } +} + +static int _rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn, + struct display_state *state, int edid_status) +{ + int i; struct connector_state *conn_state = &state->conn_state; struct drm_display_mode *mode = &conn_state->mode; struct dw_hdmi_qp *hdmi = conn->data; @@ -1254,14 +1277,13 @@ if (!hdmi) return -EFAULT; - ret = drm_do_get_edid(&hdmi->adap, conn_state->edid); - if (!ret) { + if (!edid_status) { hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid); hdmi->sink_has_audio = drm_detect_monitor_audio(edid); - ret = drm_add_edid_modes(&hdmi->edid_data, conn_state->edid); + edid_status = drm_add_edid_modes(&hdmi->edid_data, conn_state->edid); } - if (ret < 0) { + if (edid_status < 0) { hdmi->sink_is_hdmi = true; hdmi->sink_has_audio = true; do_cea_modes(&hdmi->edid_data, def_modes_vic, @@ -1270,8 +1292,7 @@ printf("failed to get edid\n"); } drm_rk_filter_whitelist(&hdmi->edid_data); - if (hdmi->phy.ops->mode_valid) - hdmi->phy.ops->mode_valid(hdmi->rk_hdmi, state); + rockchip_dw_hdmi_qp_mode_valid(hdmi); drm_mode_max_resolution_filter(&hdmi->edid_data, &state->crtc_state.max_output); if (!drm_mode_prune_invalid(&hdmi->edid_data)) { @@ -1298,15 +1319,17 @@ hdmi->hdmi_data.enc_out_bus_format = bus_format; switch (bus_format) { - case MEDIA_BUS_FMT_UYVY10_1X20: - conn_state->bus_format = MEDIA_BUS_FMT_YUV10_1X30; + case MEDIA_BUS_FMT_YUYV10_1X20: + conn_state->bus_format = MEDIA_BUS_FMT_YUYV10_1X20; hdmi->hdmi_data.enc_in_bus_format = - MEDIA_BUS_FMT_YUV10_1X30; + MEDIA_BUS_FMT_YUYV10_1X20; + conn_state->output_mode = ROCKCHIP_OUT_MODE_YUV422; break; - case MEDIA_BUS_FMT_UYVY8_1X16: - conn_state->bus_format = MEDIA_BUS_FMT_YUV8_1X24; + case MEDIA_BUS_FMT_YUYV8_1X16: + conn_state->bus_format = MEDIA_BUS_FMT_YUYV8_1X16; hdmi->hdmi_data.enc_in_bus_format = - MEDIA_BUS_FMT_YUV8_1X24; + MEDIA_BUS_FMT_YUYV8_1X16; + conn_state->output_mode = ROCKCHIP_OUT_MODE_YUV422; break; case MEDIA_BUS_FMT_UYYVYY8_0_5X24: case MEDIA_BUS_FMT_UYYVYY10_0_5X30: @@ -1334,6 +1357,21 @@ return 0; } +int rockchip_dw_hdmi_qp_get_timing(struct rockchip_connector *conn, struct display_state *state) +{ + struct connector_state *conn_state = &state->conn_state; + struct dw_hdmi_qp *hdmi = conn->data; + int ret; + + ret = drm_do_get_edid(&hdmi->adap, conn_state->edid); + + if (conn_state->secondary) + _rockchip_dw_hdmi_qp_get_timing(conn_state->secondary, state, ret); + + return _rockchip_dw_hdmi_qp_get_timing(conn, state, ret); +} + + int rockchip_dw_hdmi_qp_detect(struct rockchip_connector *conn, struct display_state *state) { int ret; diff --git a/u-boot/drivers/video/drm/dw_mipi_dsi.c b/u-boot/drivers/video/drm/dw_mipi_dsi.c index 2a490d1..bf337f7 100644 --- a/u-boot/drivers/video/drm/dw_mipi_dsi.c +++ b/u-boot/drivers/video/drm/dw_mipi_dsi.c @@ -1489,6 +1489,21 @@ .max_bit_rate_per_lane = 1500000000UL, }; +static const u32 rk3562_dsi_grf_reg_fields[MAX_FIELDS] = { + [DPIUPDATECFG] = GRF_REG_FIELD(0x05d0, 2, 2), + [DPICOLORM] = GRF_REG_FIELD(0x05d0, 1, 1), + [DPISHUTDN] = GRF_REG_FIELD(0x05d0, 0, 0), + [SKEWCALHS] = GRF_REG_FIELD(0x05d4, 11, 15), + [FORCETXSTOPMODE] = GRF_REG_FIELD(0x05d4, 4, 7), + [TURNDISABLE] = GRF_REG_FIELD(0x05d4, 2, 2), + [FORCERXMODE] = GRF_REG_FIELD(0x05d4, 0, 0), +}; + +static const struct dw_mipi_dsi_plat_data rk3562_mipi_dsi_plat_data = { + .dsi0_grf_reg_fields = rk3562_dsi_grf_reg_fields, + .max_bit_rate_per_lane = 1200000000UL, +}; + static const u32 rk3568_dsi0_grf_reg_fields[MAX_FIELDS] = { [DPIUPDATECFG] = GRF_REG_FIELD(0x0360, 2, 2), [DPICOLORM] = GRF_REG_FIELD(0x0360, 1, 1), @@ -1573,6 +1588,10 @@ .data = (ulong)&rk3399_mipi_dsi_plat_data, }, { + .compatible = "rockchip,rk3562-mipi-dsi", + .data = (ulong)&rk3562_mipi_dsi_plat_data, + }, + { .compatible = "rockchip,rk3568-mipi-dsi", .data = (ulong)&rk3568_mipi_dsi_plat_data, }, diff --git a/u-boot/drivers/video/drm/dw_mipi_dsi2.c b/u-boot/drivers/video/drm/dw_mipi_dsi2.c index 1ee8652..42f3314 100644 --- a/u-boot/drivers/video/drm/dw_mipi_dsi2.c +++ b/u-boot/drivers/video/drm/dw_mipi_dsi2.c @@ -12,6 +12,7 @@ #include <common.h> #include <errno.h> #include <asm/unaligned.h> +#include <asm/gpio.h> #include <asm/io.h> #include <asm/hardware.h> #include <dm/device.h> @@ -22,7 +23,6 @@ #include <asm/arch-rockchip/clock.h> #include <linux/iopoll.h> -#include "rockchip_bridge.h" #include "rockchip_display.h" #include "rockchip_crtc.h" #include "rockchip_connector.h" @@ -289,6 +289,7 @@ struct drm_display_mode mode; bool data_swap; + struct gpio_desc te_gpio; struct mipi_dsi_device *device; struct mipi_dphy_configure mipi_dphy_cfg; const struct dw_mipi_dsi2_plat_data *pdata; @@ -693,42 +694,79 @@ static int dw_mipi_dsi2_connector_pre_init(struct rockchip_connector *conn, struct display_state *state) { + struct connector_state *conn_state = &state->conn_state; struct dw_mipi_dsi2 *dsi2 = dev_get_priv(conn->dev); struct mipi_dsi_host *host = dev_get_platdata(dsi2->dev); struct mipi_dsi_device *device; char name[20]; - struct udevice *dev; - device = calloc(1, sizeof(struct dw_mipi_dsi2)); - if (!device) - return -ENOMEM; + conn_state->type = DRM_MODE_CONNECTOR_DSI; - if (conn->bridge) - dev = conn->bridge->dev; - else if (conn->panel) - dev = conn->panel->dev; - else - return -ENODEV; + if (conn->bridge) { + device = dev_get_platdata(conn->bridge->dev); + if (!device) + return -ENODEV; - device->dev = dev; - device->host = host; - device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4); - device->channel = dev_read_u32_default(dev, "reg", 0); - device->format = dev_read_u32_default(dev, "dsi,format", - MIPI_DSI_FMT_RGB888); - device->mode_flags = dev_read_u32_default(dev, "dsi,flags", - MIPI_DSI_MODE_VIDEO | - MIPI_DSI_MODE_VIDEO_BURST | - MIPI_DSI_MODE_VIDEO_HBP | - MIPI_DSI_MODE_LPM | - MIPI_DSI_MODE_EOT_PACKET); + device->host = host; + sprintf(name, "%s.%d", host->dev->name, device->channel); + device_set_name(conn->bridge->dev, name); + mipi_dsi_attach(device); + } - sprintf(name, "%s.%d", host->dev->name, device->channel); - device_set_name(dev, name); - dsi2->device = device; - dev->parent_platdata = device; + return 0; +} - mipi_dsi_attach(dsi2->device); +static int dw_mipi_dsi2_get_dsc_params_from_sink(struct dw_mipi_dsi2 *dsi2) +{ + struct udevice *dev = dsi2->device->dev; + struct rockchip_cmd_header *header; + struct drm_dsc_picture_parameter_set *pps = NULL; + u8 *dsc_packed_pps; + const void *data; + int len; + + dsi2->c_option = dev_read_bool(dev, "phy-c-option"); + dsi2->scrambling_en = dev_read_bool(dev, "scrambling-enable"); + dsi2->dsc_enable = dev_read_bool(dev, "compressed-data"); + + if (dsi2->slave) { + dsi2->slave->c_option = dsi2->c_option; + dsi2->slave->scrambling_en = dsi2->scrambling_en; + dsi2->slave->dsc_enable = dsi2->dsc_enable; + } + + dsi2->slice_width = dev_read_u32_default(dev, "slice-width", 0); + dsi2->slice_height = dev_read_u32_default(dev, "slice-height", 0); + dsi2->version_major = dev_read_u32_default(dev, "version-major", 0); + dsi2->version_minor = dev_read_u32_default(dev, "version-minor", 0); + + data = dev_read_prop(dev, "panel-init-sequence", &len); + if (!data) + return -EINVAL; + + while (len > sizeof(*header)) { + header = (struct rockchip_cmd_header *)data; + data += sizeof(*header); + len -= sizeof(*header); + + if (header->payload_length > len) + return -EINVAL; + + if (header->data_type == MIPI_DSI_PICTURE_PARAMETER_SET) { + dsc_packed_pps = calloc(1, header->payload_length); + if (!dsc_packed_pps) + return -ENOMEM; + + memcpy(dsc_packed_pps, data, header->payload_length); + pps = (struct drm_dsc_picture_parameter_set *)dsc_packed_pps; + break; + } + + data += header->payload_length; + len -= header->payload_length; + } + + dsi2->pps = pps; return 0; } @@ -792,6 +830,13 @@ dsi2->slave->dcphy.phy = phy; if (phy->funcs && phy->funcs->init) return phy->funcs->init(phy); + } + + dw_mipi_dsi2_get_dsc_params_from_sink(dsi2); + + if (dm_gpio_is_valid(&dsi2->te_gpio)) { + cstate->soft_te = true; + conn_state->te_gpio = &dsi2->te_gpio; } if (dsi2->dsc_enable) { @@ -905,7 +950,7 @@ static void dw_mipi_dsi2_phy_clk_mode_cfg(struct dw_mipi_dsi2 *dsi2) { - u32 sys_clk = SYS_CLK / MSEC_PER_SEC; + u32 sys_clk = SYS_CLK / USEC_PER_SEC; u32 esc_clk_div; u32 val = 0; @@ -913,7 +958,7 @@ val |= NON_CONTINUOUS_CLK; /* The Escape clock ranges from 1MHz to 20MHz. */ - esc_clk_div = DIV_ROUND_UP(sys_clk, 10 * 2); + esc_clk_div = DIV_ROUND_UP(sys_clk, 20 * 2); val |= PHY_LPTX_CLK_DIV(esc_clk_div); dsi_write(dsi2, DSI2_PHY_CLK_CFG, val); @@ -1102,6 +1147,41 @@ return 0; } +static int dw_mipi_dsi2_connector_mode_valid(struct rockchip_connector *conn, + struct display_state *state) +{ + struct dw_mipi_dsi2 *dsi2 = dev_get_priv(conn->dev); + struct connector_state *conn_state = &state->conn_state; + u8 min_pixels = dsi2->slave ? 8 : 4; + struct videomode vm; + + drm_display_mode_to_videomode(&conn_state->mode, &vm); + + /* + * the minimum region size (HSA,HBP,HACT,HFP) is 4 pixels + * which is the ip known issues and limitations. + */ + if (!(vm.hsync_len < min_pixels || vm.hback_porch < min_pixels || + vm.hfront_porch < min_pixels || vm.hactive < min_pixels)) + return MODE_OK; + + if (vm.hsync_len < min_pixels) + vm.hsync_len = min_pixels; + + if (vm.hback_porch < min_pixels) + vm.hback_porch = min_pixels; + + if (vm.hfront_porch < min_pixels) + vm.hfront_porch = min_pixels; + + if (vm.hactive < min_pixels) + vm.hactive = min_pixels; + + drm_display_mode_from_videomode(&vm, &conn_state->mode); + + return MODE_OK; +} + static const struct rockchip_connector_funcs dw_mipi_dsi2_connector_funcs = { .pre_init = dw_mipi_dsi2_connector_pre_init, .init = dw_mipi_dsi2_connector_init, @@ -1109,6 +1189,7 @@ .unprepare = dw_mipi_dsi2_connector_unprepare, .enable = dw_mipi_dsi2_connector_enable, .disable = dw_mipi_dsi2_connector_disable, + .mode_valid = dw_mipi_dsi2_connector_mode_valid, }; static int dw_mipi_dsi2_probe(struct udevice *dev) @@ -1132,6 +1213,13 @@ id = of_alias_get_id(ofnode_to_np(dev->node), "dsi"); if (id < 0) id = 0; + + ret = gpio_request_by_name(dev, "te-gpios", 0, + &dsi2->te_gpio, GPIOD_IS_IN); + if (ret && ret != -ENOENT) { + printf("%s: Cannot get TE GPIO: %d\n", __func__, ret); + return ret; + } dsi2->dev = dev; dsi2->pdata = pdata; @@ -1185,61 +1273,6 @@ return dw_mipi_dsi2_transfer(dsi2, msg); } -static int dw_mipi_dsi2_get_dsc_params_from_sink(struct dw_mipi_dsi2 *dsi2) -{ - struct udevice *dev = dsi2->device->dev; - struct rockchip_cmd_header *header; - struct drm_dsc_picture_parameter_set *pps = NULL; - u8 *dsc_packed_pps; - const void *data; - int len; - - dsi2->c_option = dev_read_bool(dev, "phy-c-option"); - dsi2->scrambling_en = dev_read_bool(dev, "scrambling-enable"); - dsi2->dsc_enable = dev_read_bool(dev, "compressed-data"); - - if (dsi2->slave) { - dsi2->slave->c_option = dsi2->c_option; - dsi2->slave->scrambling_en = dsi2->scrambling_en; - dsi2->slave->dsc_enable = dsi2->dsc_enable; - } - - dsi2->slice_width = dev_read_u32_default(dev, "slice-width", 0); - dsi2->slice_height = dev_read_u32_default(dev, "slice-height", 0); - dsi2->version_major = dev_read_u32_default(dev, "version-major", 0); - dsi2->version_minor = dev_read_u32_default(dev, "version-minor", 0); - - data = dev_read_prop(dev, "panel-init-sequence", &len); - if (!data) - return -EINVAL; - - while (len > sizeof(*header)) { - header = (struct rockchip_cmd_header *)data; - data += sizeof(*header); - len -= sizeof(*header); - - if (header->payload_length > len) - return -EINVAL; - - if (header->data_type == MIPI_DSI_PICTURE_PARAMETER_SET) { - dsc_packed_pps = calloc(1, header->payload_length); - if (!dsc_packed_pps) - return -ENOMEM; - - memcpy(dsc_packed_pps, data, header->payload_length); - pps = (struct drm_dsc_picture_parameter_set *)dsc_packed_pps; - break; - } - - data += header->payload_length; - len -= header->payload_length; - } - - dsi2->pps = pps; - - return 0; -} - static int dw_mipi_dsi2_host_attach(struct mipi_dsi_host *host, struct mipi_dsi_device *device) { @@ -1252,8 +1285,7 @@ dsi2->channel = device->channel; dsi2->format = device->format; dsi2->mode_flags = device->mode_flags; - - dw_mipi_dsi2_get_dsc_params_from_sink(dsi2); + dsi2->device = device; return 0; } @@ -1273,6 +1305,45 @@ return dm_scan_fdt_dev(dev); } +static int dw_mipi_dsi2_child_post_bind(struct udevice *dev) +{ + struct mipi_dsi_host *host = dev_get_platdata(dev->parent); + struct mipi_dsi_device *device = dev_get_parent_platdata(dev); + char name[20]; + + sprintf(name, "%s.%d", host->dev->name, device->channel); + device_set_name(dev, name); + + device->dev = dev; + device->host = host; + device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4); + device->format = dev_read_u32_default(dev, "dsi,format", + MIPI_DSI_FMT_RGB888); + device->mode_flags = dev_read_u32_default(dev, "dsi,flags", + MIPI_DSI_MODE_VIDEO | + MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_VIDEO_HBP | + MIPI_DSI_MODE_LPM | + MIPI_DSI_MODE_EOT_PACKET); + device->channel = dev_read_u32_default(dev, "reg", 0); + + return 0; +} + +static int dw_mipi_dsi2_child_pre_probe(struct udevice *dev) +{ + struct mipi_dsi_device *device = dev_get_parent_platdata(dev); + int ret; + + ret = mipi_dsi_attach(device); + if (ret) { + dev_err(dev, "mipi_dsi_attach() failed: %d\n", ret); + return ret; + } + + return 0; +} + U_BOOT_DRIVER(dw_mipi_dsi2) = { .name = "dw_mipi_dsi2", .id = UCLASS_DISPLAY, @@ -1280,5 +1351,8 @@ .probe = dw_mipi_dsi2_probe, .bind = dw_mipi_dsi2_bind, .priv_auto_alloc_size = sizeof(struct dw_mipi_dsi2), + .per_child_platdata_auto_alloc_size = sizeof(struct mipi_dsi_device), .platdata_auto_alloc_size = sizeof(struct mipi_dsi_host), + .child_post_bind = dw_mipi_dsi2_child_post_bind, + .child_pre_probe = dw_mipi_dsi2_child_pre_probe, }; diff --git a/u-boot/drivers/video/drm/max96745.c b/u-boot/drivers/video/drm/max96745.c index c824e01..3750f4d 100644 --- a/u-boot/drivers/video/drm/max96745.c +++ b/u-boot/drivers/video/drm/max96745.c @@ -9,41 +9,111 @@ #include <i2c.h> #include <max96745.h> #include <video_bridge.h> +#include <linux/iopoll.h> #include "rockchip_bridge.h" #include "rockchip_display.h" #include "rockchip_panel.h" -struct max96745_bridge_priv { - struct gpio_desc lock_gpio; -}; - -static bool max96745_bridge_detect(struct rockchip_bridge *bridge) +static bool max96745_bridge_link_locked(struct udevice *dev) { - struct max96745_bridge_priv *priv = dev_get_priv(bridge->dev); + int ret; - if (!dm_gpio_get_value(&priv->lock_gpio)) + ret = dm_i2c_reg_read(dev->parent, 0x002a); + if (ret < 0) + return false; + + if (!FIELD_GET(LINK_LOCKED, ret)) return false; return true; } +static bool max96745_bridge_detect(struct rockchip_bridge *bridge) +{ + return max96745_bridge_link_locked(bridge->dev); +} + +static void max96745_bridge_enable(struct rockchip_bridge *bridge) +{ + struct udevice *dev = bridge->dev; + struct drm_display_mode *mode = &bridge->state->conn_state.mode; + u8 cxtp, tx_rate; + int ret; + + ret = dm_i2c_reg_read(dev->parent, 0x0011); + if (ret < 0) + return; + + cxtp = FIELD_GET(CXTP_A, ret); + + ret = dm_i2c_reg_read(dev->parent, 0x0028); + if (ret < 0) + return; + + tx_rate = FIELD_GET(TX_RATE, ret); + + if (!cxtp && mode->clock > 95000 && tx_rate == 1) { + ret = dm_i2c_reg_clrset(dev->parent, 0x0028, TX_RATE, + FIELD_PREP(TX_RATE, 2)); + if (ret < 0) + return; + + ret = dm_i2c_reg_clrset(dev->parent, 0x0029, RESET_ONESHOT, + FIELD_PREP(RESET_ONESHOT, 1)); + if (ret < 0) + return; + + if (readx_poll_timeout(max96745_bridge_link_locked, dev, ret, + ret, 200000)) + dev_err(dev, "%s: GMSL link not locked\n", __func__); + } +} + +static void max96745_bridge_post_disable(struct rockchip_bridge *bridge) +{ + struct udevice *dev = bridge->dev; + u8 cxtp, tx_rate; + int ret; + + ret = dm_i2c_reg_read(dev->parent, 0x0011); + if (ret < 0) + return; + + cxtp = FIELD_GET(CXTP_A, ret); + + ret = dm_i2c_reg_read(dev->parent, 0x0028); + if (ret < 0) + return; + + tx_rate = FIELD_GET(TX_RATE, ret); + + if (!cxtp && tx_rate == 2) { + ret = dm_i2c_reg_clrset(dev->parent, 0x0028, TX_RATE, + FIELD_PREP(TX_RATE, 1)); + if (ret < 0) + return; + + ret = dm_i2c_reg_clrset(dev->parent, 0x0029, RESET_ONESHOT, + FIELD_PREP(RESET_ONESHOT, 1)); + if (ret < 0) + return; + + if (readx_poll_timeout(max96745_bridge_link_locked, dev, ret, + ret, 200000)) + dev_err(dev, "%s: GMSL link not locked\n", __func__); + } +} + static const struct rockchip_bridge_funcs max96745_bridge_funcs = { - .detect = max96745_bridge_detect, + .detect = max96745_bridge_detect, + .enable = max96745_bridge_enable, + .post_disable = max96745_bridge_post_disable, }; static int max96745_bridge_probe(struct udevice *dev) { - struct max96745_bridge_priv *priv = dev_get_priv(dev); struct rockchip_bridge *bridge; - int ret; - - ret = gpio_request_by_name(dev, "lock-gpios", 0, &priv->lock_gpio, - GPIOD_IS_IN); - if (ret) { - dev_err(dev, "failed to get lock GPIO: %d\n", ret); - return ret; - } bridge = calloc(1, sizeof(*bridge)); if (!bridge) @@ -66,5 +136,4 @@ .id = UCLASS_VIDEO_BRIDGE, .of_match = max96745_bridge_of_match, .probe = max96745_bridge_probe, - .priv_auto_alloc_size = sizeof(struct max96745_bridge_priv), }; diff --git a/u-boot/drivers/video/drm/max96752f.c b/u-boot/drivers/video/drm/max96752f.c deleted file mode 100644 index e7553d1..0000000 --- a/u-boot/drivers/video/drm/max96752f.c +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2022 Rockchip Electronics Co., Ltd - */ - -#include <common.h> -#include <dm.h> -#include <errno.h> -#include <i2c.h> -#include <linux/media-bus-format.h> -#include <max96752f.h> -#include <video_bridge.h> - -#include "rockchip_bridge.h" -#include "rockchip_display.h" -#include "rockchip_panel.h" - -static void max96752f_bridge_pre_enable(struct rockchip_bridge *bridge) -{ - struct udevice *dev = bridge->dev; - struct connector_state *conn_state = &bridge->state->conn_state; - bool oldi_format, oldi_4th_lane; - - max96752f_init(dev->parent); - - switch (conn_state->bus_format) { - case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: - oldi_4th_lane = false; - oldi_format = 0x0; - break; - case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: - oldi_4th_lane = true; - oldi_format = 0x0; - break; - case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: - oldi_4th_lane = false; - oldi_format = 0x1; - break; - default: - oldi_4th_lane = false; - oldi_format = 0x1; - break; - } - - dm_i2c_reg_clrset(dev->parent, 0x01ce, OLDI_FORMAT | OLDI_4TH_LANE, - FIELD_PREP(OLDI_4TH_LANE, oldi_4th_lane) | - FIELD_PREP(OLDI_FORMAT, oldi_format)); -} - -static const struct rockchip_bridge_funcs max96752f_bridge_funcs = { - .pre_enable = max96752f_bridge_pre_enable, -}; - -static int max96752f_bridge_probe(struct udevice *dev) -{ - struct rockchip_bridge *bridge; - - bridge = calloc(1, sizeof(*bridge)); - if (!bridge) - return -ENOMEM; - - dev->driver_data = (ulong)bridge; - bridge->dev = dev; - bridge->funcs = &max96752f_bridge_funcs; - - return 0; -} - -static const struct udevice_id max96752f_bridge_of_match[] = { - { .compatible = "maxim,max96752f-bridge", }, - { } -}; - -U_BOOT_DRIVER(max96752f_bridge) = { - .name = "max96752f_bridge", - .id = UCLASS_VIDEO_BRIDGE, - .of_match = max96752f_bridge_of_match, - .probe = max96752f_bridge_probe, -}; diff --git a/u-boot/drivers/video/drm/max96755f.c b/u-boot/drivers/video/drm/max96755f.c index e09849f..1e0ec08 100644 --- a/u-boot/drivers/video/drm/max96755f.c +++ b/u-boot/drivers/video/drm/max96755f.c @@ -9,6 +9,7 @@ #include <i2c.h> #include <max96755f.h> #include <video_bridge.h> +#include <drm/drm_mipi_dsi.h> #include <dm/of_access.h> #include <linux/media-bus-format.h> @@ -21,9 +22,18 @@ struct drm_display_mode *mode = &priv->mode; u32 hfp, hsa, hbp, hact; u32 vact, vsa, vfp, vbp; + u8 lane_map; dm_i2c_reg_clrset(priv->dev, 0x0331, NUM_LANES, FIELD_PREP(NUM_LANES, priv->num_lanes - 1)); + + lane_map = (priv->dsi_lane_map[0] & 0xff) << 4 | + (priv->dsi_lane_map[1] & 0xff) << 6 | + (priv->dsi_lane_map[2] & 0xff) << 0 | + (priv->dsi_lane_map[3] & 0xff) << 2; + + dm_i2c_reg_write(priv->dev, 0x0332, lane_map); + if (!priv->dpi_deskew_en) return; @@ -148,11 +158,26 @@ .detect = max96755f_bridge_detect, }; +static int max96755f_bridge_bind(struct udevice *dev) +{ + struct mipi_dsi_device *device = dev_get_platdata(dev); + + device->dev = dev; + device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4); + device->format = dev_read_u32_default(dev, "dsi,format", + MIPI_DSI_FMT_RGB888); + device->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE; + device->channel = dev_read_u32_default(dev, "reg", 0); + + return 0; +} + static int max96755f_bridge_probe(struct udevice *dev) { struct rockchip_bridge *bridge; struct max96755f_priv *priv = dev_get_priv(dev->parent); - int ret; + const struct device_node *np = ofnode_to_np(dev->node); + int i, len, ret; bridge = calloc(1, sizeof(*bridge)); if (!bridge) @@ -165,6 +190,24 @@ priv->num_lanes = dev_read_u32_default(dev, "dsi,lanes", 4); priv->dv_swp_ab = dev_read_bool(dev, "vd-swap-ab"); priv->dpi_deskew_en = dev_read_bool(dev, "dpi-deskew-en"); + + for ( i = 0; i < priv->num_lanes; i++) + priv->dsi_lane_map[i] = i; + + if (of_find_property(np, "maxim,dsi-lane-map", &len)) { + len /= sizeof(u32); + if (priv->num_lanes != len) { + printf("invalid number of lane map\n"); + return -EINVAL; + } + } + + ret = of_read_u32_array(np, "maxim,dsi-lane-map", + priv->dsi_lane_map, priv->num_lanes); + if (ret) { + printf("get dsi lane map failed\n"); + return -EINVAL; + } ret = gpio_request_by_name(dev, "lock-gpios", 0, &priv->lock_gpio, GPIOD_IS_IN); @@ -186,4 +229,6 @@ .id = UCLASS_VIDEO_BRIDGE, .of_match = max96755f_bridge_of_match, .probe = max96755f_bridge_probe, + .bind = max96755f_bridge_bind, + .platdata_auto_alloc_size = sizeof(struct mipi_dsi_device), }; diff --git a/u-boot/drivers/video/drm/panel-maxim-deserializer.c b/u-boot/drivers/video/drm/panel-maxim-deserializer.c deleted file mode 100644 index 583f6a4..0000000 --- a/u-boot/drivers/video/drm/panel-maxim-deserializer.c +++ /dev/null @@ -1,300 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2022 Rockchip Electronics Co., Ltd - */ - -#include <config.h> -#include <common.h> -#include <backlight.h> -#include <errno.h> -#include <malloc.h> -#include <video.h> - -#include <asm/gpio.h> -#include <dm/device.h> -#include <dm/read.h> -#include <dm/pinctrl.h> -#include <dm/uclass-id.h> -#include <linux/media-bus-format.h> - -#include "rockchip_display.h" -#include "rockchip_panel.h" - -struct maxim_deserializer_panel; - -struct maxim_deserializer_panel_desc { - const char *name; - u16 id; - struct drm_display_mode mode; - u32 width_mm; - u32 height_mm; - - struct { - const char *name; - u8 addr; - u8 dev_id; - } deserializer; - - void (*prepare)(struct maxim_deserializer_panel *p); - void (*unprepare)(struct maxim_deserializer_panel *p); - void (*enable)(struct maxim_deserializer_panel *p); - void (*disable)(struct maxim_deserializer_panel *p); -}; - -struct maxim_deserializer_panel { - struct udevice *dev; - struct udevice *backlight; - struct gpio_desc enable_gpio; - - /* the panel desc as detected */ - const struct maxim_deserializer_panel_desc *desc; -}; - -static void maxim_max96752f_panel_prepare(struct maxim_deserializer_panel *p) -{ - pinctrl_select_state(p->dev, p->desc->name ? - p->desc->name : p->desc->deserializer.name); - - dm_i2c_reg_write(p->dev, 0x0002, 0x43); - dm_i2c_reg_write(p->dev, 0x0140, 0x20); - - dm_i2c_reg_write(p->dev, 0x01ce, 0x5e); /* oldi */ - dm_i2c_reg_write(p->dev, 0x020c, 0x84); /* bl_pwm */ - dm_i2c_reg_write(p->dev, 0x0206, 0x83); /* tp_int */ - - dm_i2c_reg_write(p->dev, 0x0215, 0x90); /* lcd_en */ - mdelay(20); -} - -static void maxim_max96752f_panel_unprepare(struct maxim_deserializer_panel *p) -{ - dm_i2c_reg_write(p->dev, 0x0215, 0x80); /* lcd_en */ -} - -static void maxim_max96752f_panel_enable(struct maxim_deserializer_panel *p) -{ - dm_i2c_reg_write(p->dev, 0x0227, 0x90); /* lcd_rst */ - mdelay(20); - dm_i2c_reg_write(p->dev, 0x020f, 0x90); /* tp_rst */ - mdelay(100); - dm_i2c_reg_write(p->dev, 0x0221, 0x90); /* lcd_stb */ - mdelay(60); - dm_i2c_reg_write(p->dev, 0x0212, 0x90); /* bl_current_ctl */ - dm_i2c_reg_write(p->dev, 0x0209, 0x90); /* bl_en */ -} - -static void maxim_max96752f_panel_disable(struct maxim_deserializer_panel *p) -{ - dm_i2c_reg_write(p->dev, 0x0209, 0x80); /* bl_en */ - dm_i2c_reg_write(p->dev, 0x0212, 0x80); /* bl_current_ctl */ - dm_i2c_reg_write(p->dev, 0x0221, 0x80); /* lcd_stb */ - dm_i2c_reg_write(p->dev, 0x020f, 0x80); /* tp_rst */ - dm_i2c_reg_write(p->dev, 0x0227, 0x80); /* lcd_rst */ -} - -static const struct maxim_deserializer_panel_desc maxim_deserializer_default_panels[] = { - { - .deserializer = { - .name = "max96752f", - .addr = 0x48, - .dev_id = 0x82, - }, - - .mode = { - .clock = 148500, - .hdisplay = 1920, - .hsync_start = 1920 + 20, - .hsync_end = 1920 + 20 + 20, - .htotal = 1920 + 20 + 20 + 20, - .vdisplay = 1080, - .vsync_start = 1080 + 250, - .vsync_end = 1080 + 250 + 2, - .vtotal = 1080 + 250 + 2 + 8, - .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, - }, - - .prepare = maxim_max96752f_panel_prepare, - .enable = maxim_max96752f_panel_enable, - .disable = maxim_max96752f_panel_disable, - .unprepare = maxim_max96752f_panel_unprepare, - }, -}; - -static void maxim_deserializer_panel_prepare(struct rockchip_panel *panel) -{ - struct maxim_deserializer_panel *p = dev_get_priv(panel->dev); - - if (!p->desc) - return; - - if (p->desc->prepare) - p->desc->prepare(p); -} - -static void maxim_deserializer_panel_unprepare(struct rockchip_panel *panel) -{ - struct maxim_deserializer_panel *p = dev_get_priv(panel->dev); - - if (!p->desc) - return; - - if (p->desc->unprepare) - p->desc->unprepare(p); -} - -static void maxim_deserializer_panel_enable(struct rockchip_panel *panel) -{ - struct maxim_deserializer_panel *p = dev_get_priv(panel->dev); - - if (!p->desc) - return; - - if (p->desc->enable) - p->desc->enable(p); - - if (p->backlight) - backlight_enable(p->backlight); -} - -static void maxim_deserializer_panel_disable(struct rockchip_panel *panel) -{ - struct maxim_deserializer_panel *p = dev_get_priv(panel->dev); - - if (!p->desc) - return; - - if (p->backlight) - backlight_disable(p->backlight); - - if (p->desc->disable) - p->desc->disable(p); -} - -static u16 maxim_deserializer_panel_get_id(struct maxim_deserializer_panel *p) -{ - /* TODO */ - return 0; -} - -static int maxim_deserializer_panel_detect(struct maxim_deserializer_panel *p) -{ - const struct maxim_deserializer_panel_desc *desc = NULL; - struct udevice *dev = p->dev; - struct dm_i2c_chip *chip = dev_get_parent_platdata(dev); - u16 id = maxim_deserializer_panel_get_id(p); - unsigned int i, ret; - - if (id) { - /* TODO */ - } else { - u8 dev_id; - - for (i = 0; i < ARRAY_SIZE(maxim_deserializer_default_panels); i++) { - chip->chip_addr = maxim_deserializer_default_panels[i].deserializer.addr; - - ret = dm_i2c_reg_read(dev, 0x000d); - if (ret < 0) - continue; - - dev_id = ret; - - if (maxim_deserializer_default_panels[i].deserializer.dev_id == dev_id) { - desc = &maxim_deserializer_default_panels[i]; - break; - } - } - } - - if (!desc) - return -ENODEV; - - p->desc = desc; - chip->chip_addr = desc->deserializer.addr; - - return 0; -} - -static int maxim_deserializer_panel_get_mode(struct rockchip_panel *panel, - struct drm_display_mode *mode) -{ - struct maxim_deserializer_panel *p = dev_get_priv(panel->dev); - int ret; - - ret = maxim_deserializer_panel_detect(p); - if (ret) - return ret; - - memcpy(mode, &p->desc->mode, sizeof(struct drm_display_mode)); - mode->vrefresh = drm_mode_vrefresh(mode); - - return 0; -} - -static const struct rockchip_panel_funcs maxim_deserializer_panel_funcs = { - .prepare = maxim_deserializer_panel_prepare, - .unprepare = maxim_deserializer_panel_unprepare, - .enable = maxim_deserializer_panel_enable, - .disable = maxim_deserializer_panel_disable, - .get_mode = maxim_deserializer_panel_get_mode, -}; - -static void maxim_deserializer_panel_power_on(struct maxim_deserializer_panel *p) -{ - if (dm_gpio_is_valid(&p->enable_gpio)) { - dm_gpio_set_value(&p->enable_gpio, 1); - mdelay(500); - } -} - -static int maxim_deserializer_panel_probe(struct udevice *dev) -{ - struct maxim_deserializer_panel *p = dev_get_priv(dev); - struct rockchip_panel *panel; - int ret; - - ret = i2c_set_chip_offset_len(dev, 2); - if (ret) - return ret; - - p->dev = dev; - - ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev, - "backlight", &p->backlight); - if (ret && ret != -ENOENT) { - dev_err(dev, "%s: Cannot get backlight: %d\n", __func__, ret); - return ret; - } - - ret = gpio_request_by_name(dev, "enable-gpios", 0, - &p->enable_gpio, GPIOD_IS_OUT); - if (ret && ret != -ENOENT) { - dev_err(dev, "%s: Cannot get enable GPIO: %d\n", __func__, ret); - return ret; - } - - maxim_deserializer_panel_power_on(p); - - panel = calloc(1, sizeof(*panel)); - if (!panel) - return -ENOMEM; - - dev->driver_data = (ulong)panel; - panel->dev = dev; - panel->bus_format = MEDIA_BUS_FMT_RGB888_1X24; - panel->funcs = &maxim_deserializer_panel_funcs; - - return 0; -} - -static const struct udevice_id maxim_deserializer_panel_of_match[] = { - { .compatible = "maxim,deserializer-panel", }, - {} -}; - -U_BOOT_DRIVER(maxim_deserializer_panel) = { - .name = "maxim_deserializer_panel", - .id = UCLASS_PANEL, - .of_match = maxim_deserializer_panel_of_match, - .probe = maxim_deserializer_panel_probe, - .priv_auto_alloc_size = sizeof(struct maxim_deserializer_panel), -}; diff --git a/u-boot/drivers/video/drm/panel-maxim-max96752f.c b/u-boot/drivers/video/drm/panel-maxim-max96752f.c new file mode 100644 index 0000000..0c28231 --- /dev/null +++ b/u-boot/drivers/video/drm/panel-maxim-max96752f.c @@ -0,0 +1,303 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Maxim MAX96752F GMSL2 Deserializer + * + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + */ + +#include <config.h> +#include <common.h> +#include <backlight.h> +#include <errno.h> +#include <malloc.h> +#include <video.h> + +#include <asm/gpio.h> +#include <dm/device.h> +#include <dm/read.h> +#include <dm/pinctrl.h> +#include <dm/uclass-id.h> +#include <linux/media-bus-format.h> + +#include "rockchip_display.h" +#include "rockchip_panel.h" + +struct max96752f; + +struct panel_desc { + const char *name; + int (*prepare)(struct max96752f *max96752f); + int (*unprepare)(struct max96752f *max96752f); + int (*enable)(struct max96752f *max96752f); + int (*disable)(struct max96752f *max96752f); + int (*backlight_enable)(struct max96752f *max96752f); + int (*backlight_disable)(struct max96752f *max96752f); +}; + +struct max96752f { + struct udevice *dev; + struct udevice *serializer; + struct udevice *backlight; + + const struct panel_desc *desc; +}; + +static void max96752f_panel_prepare(struct rockchip_panel *panel) +{ + struct max96752f *max96752f = dev_get_priv(panel->dev); + const struct panel_desc *desc = max96752f->desc; + + if (desc->prepare) + desc->prepare(max96752f); +} + +static void max96752f_panel_unprepare(struct rockchip_panel *panel) +{ + struct max96752f *max96752f = dev_get_priv(panel->dev); + const struct panel_desc *desc = max96752f->desc; + + if (desc->unprepare) + desc->unprepare(max96752f); +} + +static void max96752f_panel_enable(struct rockchip_panel *panel) +{ + struct max96752f *max96752f = dev_get_priv(panel->dev); + const struct panel_desc *desc = max96752f->desc; + + if (desc->enable) + desc->enable(max96752f); + + if (max96752f->backlight) + backlight_enable(max96752f->backlight); + + if (desc->backlight_enable) + desc->backlight_enable(max96752f); +} + +static void max96752f_panel_disable(struct rockchip_panel *panel) +{ + struct max96752f *max96752f = dev_get_priv(panel->dev); + const struct panel_desc *desc = max96752f->desc; + + if (desc->backlight_disable) + desc->backlight_disable(max96752f); + + if (max96752f->backlight) + backlight_disable(max96752f->backlight); + + if (desc->disable) + desc->disable(max96752f); +} + +static const struct rockchip_panel_funcs max96752f_panel_funcs = { + .prepare = max96752f_panel_prepare, + .unprepare = max96752f_panel_unprepare, + .enable = max96752f_panel_enable, + .disable = max96752f_panel_disable, +}; + +static int max96752f_probe(struct udevice *dev) +{ + struct max96752f *max96752f = dev_get_priv(dev); + struct rockchip_panel *panel; + int ret; + + ret = i2c_set_chip_offset_len(dev, 2); + if (ret) + return ret; + + max96752f->dev = dev; + max96752f->serializer = dev->parent->parent; + max96752f->desc = (const struct panel_desc *)dev_get_driver_data(dev); + + ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev, + "backlight", &max96752f->backlight); + if (ret && ret != -ENOENT) { + dev_err(dev, "%s: Cannot get backlight: %d\n", __func__, ret); + return ret; + } + + panel = calloc(1, sizeof(*panel)); + if (!panel) + return -ENOMEM; + + dev->driver_data = (ulong)panel; + panel->dev = dev; + panel->bus_format = MEDIA_BUS_FMT_RGB888_1X24; + panel->funcs = &max96752f_panel_funcs; + + return 0; +} + +#define maxim_serializer_write(max96752f, reg, val) do { \ + int ret; \ + ret = dm_i2c_reg_write(max96752f->serializer, \ + reg, val); \ + if (ret) \ + return ret; \ + } while (0) + +#define maxim_deserializer_write(max96752f, reg, val) do { \ + int ret; \ + ret = dm_i2c_reg_write(max96752f->dev, \ + reg, val); \ + if (ret) \ + return ret; \ + } while (0) + +static int boe_av156fht_l83_panel_prepare(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0002, 0x43); + maxim_deserializer_write(max96752f, 0x0140, 0x20); + + maxim_deserializer_write(max96752f, 0x01ce, 0x5e); /* oldi */ + maxim_deserializer_write(max96752f, 0x020c, 0x84); /* bl_pwm */ + maxim_deserializer_write(max96752f, 0x0206, 0x83); /* tp_int */ + + maxim_deserializer_write(max96752f, 0x0215, 0x90); /* lcd_en */ + mdelay(20); + + return 0; +} + +static int boe_av156fht_l83_panel_unprepare(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0215, 0x80); /* lcd_en */ + + return 0; +} + +static int boe_av156fht_l83_panel_enable(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0227, 0x90); /* lcd_rst */ + mdelay(20); + maxim_deserializer_write(max96752f, 0x020f, 0x90); /* tp_rst */ + mdelay(100); + maxim_deserializer_write(max96752f, 0x0221, 0x90); /* lcd_stb */ + mdelay(60); + maxim_deserializer_write(max96752f, 0x0212, 0x90); /* bl_current_ctl */ + maxim_deserializer_write(max96752f, 0x0209, 0x90); /* bl_en */ + + return 0; +} + +static int boe_av156fht_l83_panel_disable(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0209, 0x80); /* bl_en */ + maxim_deserializer_write(max96752f, 0x0212, 0x80); /* bl_current_ctl */ + maxim_deserializer_write(max96752f, 0x0221, 0x80); /* lcd_stb */ + maxim_deserializer_write(max96752f, 0x020f, 0x80); /* tp_rst */ + maxim_deserializer_write(max96752f, 0x0227, 0x80); /* lcd_rst */ + + return 0; +} + +static int boe_av156fht_l83_panel_backlight_enable(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0212, 0x90); /* bl_current_ctl */ + maxim_deserializer_write(max96752f, 0x0209, 0x90); /* bl_en */ + + return 0; +} + +static int boe_av156fht_l83_panel_backlight_disable(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0209, 0x80); /* bl_en */ + maxim_deserializer_write(max96752f, 0x0212, 0x80); /* bl_current_ctl */ + + return 0; +} + +static const struct panel_desc boe_av156fht_l83 = { + .name = "boe-av156fht-l83", + .prepare = boe_av156fht_l83_panel_prepare, + .unprepare = boe_av156fht_l83_panel_unprepare, + .enable = boe_av156fht_l83_panel_enable, + .disable = boe_av156fht_l83_panel_disable, + .backlight_enable = boe_av156fht_l83_panel_backlight_enable, + .backlight_disable = boe_av156fht_l83_panel_backlight_disable, +}; + +static int hannstar_hsd123jpw3_a15_prepare(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0002, 0x43); + maxim_deserializer_write(max96752f, 0x0140, 0x20); + maxim_deserializer_write(max96752f, 0x01ce, 0x5e); + + maxim_deserializer_write(max96752f, 0x0203, 0x83); /* GPIO1 <- TP_INT */ + maxim_deserializer_write(max96752f, 0x0206, 0x84); /* GPIO2 -> TP_RST */ + maxim_deserializer_write(max96752f, 0x0224, 0x84); /* GPIO12 -> LCD_BL_PWM */ + + return 0; +} + +static int hannstar_hsd123jpw3_a15_unprepare(struct max96752f *max96752f) +{ + return 0; +} + +static int hannstar_hsd123jpw3_a15_enable(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0221, 0x10); /* GPIO11 -> LCD_RESET */ + mdelay(20); + + return 0; +} + +static int hannstar_hsd123jpw3_a15_disable(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0221, 0x00); /* GPIO11 -> LCD_RESET */ + mdelay(20); + + return 0; +} + +static const struct panel_desc hannstar_hsd123jpw3_a15 = { + .name = "hannstar,hsd123jpw3-a15", + .prepare = hannstar_hsd123jpw3_a15_prepare, + .unprepare = hannstar_hsd123jpw3_a15_unprepare, + .enable = hannstar_hsd123jpw3_a15_enable, + .disable = hannstar_hsd123jpw3_a15_disable, +}; + +static int ogm_101fhbllm01_prepare(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x01ce, 0x5e); + + maxim_deserializer_write(max96752f, 0x0203, 0x84); /* GPIO1 -> BL_PWM */ + maxim_deserializer_write(max96752f, 0x0206, 0x84); /* GPIO2 -> TP_RST */ + maxim_deserializer_write(max96752f, 0x0209, 0x83); /* GPIO3 <- TP_INT */ + + maxim_deserializer_write(max96752f, 0x0001, 0x02); + + return 0; +} + +static int ogm_101fhbllm01_unprepare(struct max96752f *max96752f) +{ + maxim_deserializer_write(max96752f, 0x0001, 0x01); + + return 0; +} + +static const struct panel_desc ogm_101fhbllm01 = { + .name = "ogm,101fhbllm01", + .prepare = ogm_101fhbllm01_prepare, + .unprepare = ogm_101fhbllm01_unprepare, +}; + +static const struct udevice_id max96752f_of_match[] = { + { .compatible = "boe,av156fht-l83", .data = (ulong)&boe_av156fht_l83 }, + { .compatible = "hannstar,hsd123jpw3-a15", .data = (ulong)&hannstar_hsd123jpw3_a15 }, + { .compatible = "ogm,101fhbllm01", .data = (ulong)&ogm_101fhbllm01 }, + {} +}; + +U_BOOT_DRIVER(max96752f) = { + .name = "max96752f", + .id = UCLASS_PANEL, + .of_match = max96752f_of_match, + .probe = max96752f_probe, + .priv_auto_alloc_size = sizeof(struct max96752f), +}; diff --git a/u-boot/drivers/video/drm/panel-rohm-bu18rl82.c b/u-boot/drivers/video/drm/panel-rohm-bu18rl82.c new file mode 100644 index 0000000..24792ad --- /dev/null +++ b/u-boot/drivers/video/drm/panel-rohm-bu18rl82.c @@ -0,0 +1,349 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Rohm BU18RL82-based panel driver + * + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + */ + +#include <config.h> +#include <common.h> +#include <backlight.h> +#include <errno.h> +#include <malloc.h> +#include <video.h> + +#include <asm/gpio.h> +#include <dm/device.h> +#include <dm/read.h> +#include <dm/pinctrl.h> +#include <dm/uclass-id.h> +#include <linux/media-bus-format.h> + +#include "rockchip_display.h" +#include "rockchip_panel.h" + +struct bu18rl82; + +struct panel_desc { + const char *name; + int (*prepare)(struct bu18rl82 *rl82); + int (*unprepare)(struct bu18rl82 *rl82); + int (*enable)(struct bu18rl82 *rl82); + int (*disable)(struct bu18rl82 *rl82); + int (*backlight_enable)(struct bu18rl82 *rl82); + int (*backlight_disable)(struct bu18rl82 *rl82); +}; + +struct bu18rl82 { + struct udevice *dev; + struct udevice *backlight; + const struct panel_desc *desc; +}; + +static void bu18rl82_panel_prepare(struct rockchip_panel *panel) +{ + struct bu18rl82 *rl82 = dev_get_priv(panel->dev); + const struct panel_desc *desc = rl82->desc; + + if (desc->prepare) + desc->prepare(rl82); +} + +static void bu18rl82_panel_unprepare(struct rockchip_panel *panel) +{ + struct bu18rl82 *rl82 = dev_get_priv(panel->dev); + const struct panel_desc *desc = rl82->desc; + + if (desc->unprepare) + desc->unprepare(rl82); +} + +static void bu18rl82_panel_enable(struct rockchip_panel *panel) +{ + struct bu18rl82 *rl82 = dev_get_priv(panel->dev); + const struct panel_desc *desc = rl82->desc; + + if (desc->enable) + desc->enable(rl82); + + if (rl82->backlight) + backlight_enable(rl82->backlight); + + if (desc->backlight_enable) + desc->backlight_enable(rl82); +} + +static void bu18rl82_panel_disable(struct rockchip_panel *panel) +{ + struct bu18rl82 *rl82 = dev_get_priv(panel->dev); + const struct panel_desc *desc = rl82->desc; + + if (desc->backlight_disable) + desc->backlight_disable(rl82); + + if (rl82->backlight) + backlight_disable(rl82->backlight); + + if (desc->disable) + desc->disable(rl82); +} + +static const struct rockchip_panel_funcs bu18rl82_panel_funcs = { + .prepare = bu18rl82_panel_prepare, + .unprepare = bu18rl82_panel_unprepare, + .enable = bu18rl82_panel_enable, + .disable = bu18rl82_panel_disable, +}; + +static int bu18rl82_probe(struct udevice *dev) +{ + struct bu18rl82 *rl82 = dev_get_priv(dev); + struct rockchip_panel *panel; + int ret; + + ret = i2c_set_chip_offset_len(dev, 2); + if (ret) + return ret; + + rl82->dev = dev; + rl82->desc = (const struct panel_desc *)dev_get_driver_data(dev); + + ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev, + "backlight", &rl82->backlight); + if (ret && ret != -ENOENT) { + dev_err(dev, "%s: Cannot get backlight: %d\n", __func__, ret); + return ret; + } + + panel = calloc(1, sizeof(*panel)); + if (!panel) + return -ENOMEM; + + dev->driver_data = (ulong)panel; + panel->dev = dev; + panel->bus_format = MEDIA_BUS_FMT_RGB888_1X24; + panel->funcs = &bu18rl82_panel_funcs; + + return 0; +} + +#define rohm_deserializer_write(rl82, reg, val) do { \ + int ret; \ + ret = dm_i2c_reg_write(rl82->dev, reg, val); \ + if (ret) { \ + dev_err(rl82->dev, \ + "failed to set register 0x%04x\n", \ + reg); \ + return ret; \ + } \ + } while (0) + +static int csot_mg1561b01_prepare(struct bu18rl82 *rl82) +{ + const struct reg_sequence { + u16 reg; + u8 def; + } regs[] = { + { 0x0011, 0x03 }, { 0x0012, 0x03 }, + { 0x001f, 0x02 }, { 0x0020, 0x02 }, + { 0x0031, 0x41 }, { 0x0032, 0x41 }, + { 0x0073, 0x80 }, { 0x0074, 0x07 }, + { 0x007b, 0x38 }, { 0x007c, 0x04 }, + { 0x0079, 0x0a }, + { 0x0429, 0x0a }, { 0x045d, 0x01 }, + { 0x0529, 0x0a }, { 0x055d, 0x01 }, + { 0x060a, 0xb0 }, { 0x060b, 0xff }, { 0x060c, 0xff }, + { 0x0644, 0x18 }, { 0x0645, 0x01 }, { 0x0646, 0x2d }, + }; + int i; + + for (i = 0; i < ARRAY_SIZE(regs); i++) + rohm_deserializer_write(rl82, regs[i].reg, regs[i].def); + + /* BL_PWM - GPIO0 */ + rohm_deserializer_write(rl82, 0x0057, 0x00); + rohm_deserializer_write(rl82, 0x0058, 0x02); + + /* TP_INT - GPIO3 */ + rohm_deserializer_write(rl82, 0x0060, 0x08); + rohm_deserializer_write(rl82, 0x042e, 0x05); + + /* TP_RST - GPIO4 */ + rohm_deserializer_write(rl82, 0x0063, 0x00); + rohm_deserializer_write(rl82, 0x0064, 0x01); + + return 0; +} + +static int csot_mg1561b01_unprepare(struct bu18rl82 *rl82) +{ + /* TP_RST - GPIO4 */ + rohm_deserializer_write(rl82, 0x0064, 0x00); + + return 0; +} + +static int csot_mg1561b01_enable(struct bu18rl82 *rl82) +{ + rohm_deserializer_write(rl82, 0x0091, 0x03); + rohm_deserializer_write(rl82, 0x0090, 0x01); + + return 0; +} + +static int csot_mg1561b01_disable(struct bu18rl82 *rl82) +{ + rohm_deserializer_write(rl82, 0x0090, 0x00); + rohm_deserializer_write(rl82, 0x0091, 0x00); + + return 0; +} + +static int csot_mg1561b01_backlight_enable(struct bu18rl82 *rl82) +{ + /* BL_EN - GPIO1 */ + rohm_deserializer_write(rl82, 0x005a, 0x00); + rohm_deserializer_write(rl82, 0x005b, 0x01); + + return 0; +} + +static int csot_mg1561b01_backlight_disable(struct bu18rl82 *rl82) +{ + /* BL_EN - GPIO1 */ + rohm_deserializer_write(rl82, 0x005b, 0x00); + + return 0; +} + +static const struct panel_desc csot_mg1561b01 = { + .name = "csot,mg1561b01", + .prepare = csot_mg1561b01_prepare, + .unprepare = csot_mg1561b01_unprepare, + .enable = csot_mg1561b01_enable, + .disable = csot_mg1561b01_disable, + .backlight_enable = csot_mg1561b01_backlight_enable, + .backlight_disable = csot_mg1561b01_backlight_disable, +}; + +static int touch_china_v123awf3_r1_prepare(struct bu18rl82 *rl82) +{ + const struct reg_sequence { + u16 reg; + u8 def; + } regs[] = { + { 0x0011, 0x03 }, { 0x0012, 0x03 }, + { 0x001f, 0x02 }, { 0x0020, 0x02 }, + { 0x0031, 0x48 }, { 0x0032, 0x48 }, + { 0x0073, 0x80 }, { 0x0074, 0x07 }, + { 0x007b, 0xd0 }, { 0x007c, 0x02 }, + { 0x0079, 0x0a }, + { 0x0429, 0x0a }, { 0x045d, 0x01 }, + { 0x0529, 0x0a }, { 0x055d, 0x01 }, + { 0x060a, 0xb0 }, { 0x060b, 0xff }, { 0x060c, 0xff }, + { 0x0644, 0x90 }, { 0x0646, 0xd2 }, + }; + int i; + + for (i = 0; i < ARRAY_SIZE(regs); i++) + rohm_deserializer_write(rl82, regs[i].reg, regs[i].def); + + /* TP_INT - GPIO4 */ + rohm_deserializer_write(rl82, 0x0063, 0x08); + rohm_deserializer_write(rl82, 0x042f, 0x06); + + /* TP_RST - GPIO3 */ + rohm_deserializer_write(rl82, 0x0060, 0x00); + rohm_deserializer_write(rl82, 0x0061, 0x00); + + /* LCD_BIAS_EN - GPIO2 */ + rohm_deserializer_write(rl82, 0x005d, 0x00); + rohm_deserializer_write(rl82, 0x005e, 0x01); + mdelay(6); + + return 0; +} + +static int touch_china_v123awf3_r1_unprepare(struct bu18rl82 *rl82) +{ + /* LCD_BIAS_EN - GPIO2 */ + rohm_deserializer_write(rl82, 0x005e, 0x00); + + return 0; +} + +static int touch_china_v123awf3_r1_enable(struct bu18rl82 *rl82) +{ + rohm_deserializer_write(rl82, 0x0091, 0x03); + rohm_deserializer_write(rl82, 0x0090, 0x01); + + /* RSEX - GPIO5 */ + rohm_deserializer_write(rl82, 0x0066, 0x00); + rohm_deserializer_write(rl82, 0x0067, 0x01); + /* TP_RST - GPIO3 */ + rohm_deserializer_write(rl82, 0x0060, 0x00); + rohm_deserializer_write(rl82, 0x0061, 0x01); + mdelay(20); + /* LCD_PON - GPIO1 */ + rohm_deserializer_write(rl82, 0x005a, 0x00); + rohm_deserializer_write(rl82, 0x005b, 0x01); + + return 0; +} + +static int touch_china_v123awf3_r1_disable(struct bu18rl82 *rl82) +{ + rohm_deserializer_write(rl82, 0x0090, 0x00); + rohm_deserializer_write(rl82, 0x0091, 0x00); + + /* LCD_PON - GPIO1 */ + rohm_deserializer_write(rl82, 0x005b, 0x00); + mdelay(100); + /* TP_RST - GPIO3 */ + rohm_deserializer_write(rl82, 0x0061, 0x00); + /* RSEX - GPIO5 */ + rohm_deserializer_write(rl82, 0x0067, 0x00); + + return 0; +} + +static int touch_china_v123awf3_r1_backlight_enable(struct bu18rl82 *rl82) +{ + /* BL_PWM - GPIO0 */ + rohm_deserializer_write(rl82, 0x0057, 0x00); + rohm_deserializer_write(rl82, 0x0058, 0x02); + + return 0; +} + +static int touch_china_v123awf3_r1_backlight_disable(struct bu18rl82 *rl82) +{ + /* BL_PWM - GPIO0 */ + rohm_deserializer_write(rl82, 0x0058, 0x00); + + return 0; +} + +static const struct panel_desc touch_china_v123awf3_r1 = { + .name = "touch-china,v123awf3-r1", + .prepare = touch_china_v123awf3_r1_prepare, + .unprepare = touch_china_v123awf3_r1_unprepare, + .enable = touch_china_v123awf3_r1_enable, + .disable = touch_china_v123awf3_r1_disable, + .backlight_enable = touch_china_v123awf3_r1_backlight_enable, + .backlight_disable = touch_china_v123awf3_r1_backlight_disable, +}; + +static const struct udevice_id bu18rl82_of_match[] = { + { .compatible = "csot,mg1561b01", .data = (ulong)&csot_mg1561b01 }, + { .compatible = "touch-china,v123awf3-r1", .data = (ulong)&touch_china_v123awf3_r1 }, + {} +}; + +U_BOOT_DRIVER(panel_rohm_bu18rl82) = { + .name = "panel-rohm-bu18rl82", + .id = UCLASS_PANEL, + .of_match = bu18rl82_of_match, + .probe = bu18rl82_probe, + .priv_auto_alloc_size = sizeof(struct bu18rl82), +}; diff --git a/u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c b/u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c index 4a00253..f964ddb 100644 --- a/u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c +++ b/u-boot/drivers/video/drm/phy-rockchip-samsung-hdptx-hdmi.c @@ -1278,9 +1278,9 @@ hdptx_write(hdptx, CMN_REG0043, 0x00); hdptx_write(hdptx, CMN_REG0044, 0x46); hdptx_write(hdptx, CMN_REG0045, 0x24); - hdptx_write(hdptx, CMN_REG0046, 0xff); + hdptx_write(hdptx, CMN_REG0046, 0xdd); hdptx_write(hdptx, CMN_REG0047, 0x00); - hdptx_write(hdptx, CMN_REG0048, 0x44); + hdptx_write(hdptx, CMN_REG0048, 0x11); hdptx_write(hdptx, CMN_REG0049, 0xfa); hdptx_write(hdptx, CMN_REG004A, 0x08); hdptx_write(hdptx, CMN_REG004B, 0x00); @@ -1457,6 +1457,13 @@ hdptx_write(hdptx, LANE_REG0616, 0x02); hdptx_write(hdptx, LANE_REG061B, 0x01); hdptx_write(hdptx, LANE_REG061E, 0x08); + + /* fix Inter-Pair Skew exceed the limits */ + hdptx_write(hdptx, LANE_REG031E, 0x02); + hdptx_write(hdptx, LANE_REG041E, 0x02); + hdptx_write(hdptx, LANE_REG051E, 0x02); + hdptx_write(hdptx, LANE_REG061E, 0x0a); + hdptx_write(hdptx, LANE_REG061F, 0x15); hdptx_write(hdptx, LANE_REG0620, 0xa0); @@ -1705,6 +1712,33 @@ hdptx_write(hdptx, LANE_REG061F, 0x15); hdptx_write(hdptx, LANE_REG0620, 0xa0); + hdptx_write(hdptx, LANE_REG031E, 0x02); + hdptx_write(hdptx, LANE_REG041E, 0x02); + hdptx_write(hdptx, LANE_REG051E, 0x02); + hdptx_write(hdptx, LANE_REG061E, 0x02); + + hdptx_write(hdptx, LANE_REG0303, 0x2f); + hdptx_write(hdptx, LANE_REG0403, 0x2f); + hdptx_write(hdptx, LANE_REG0503, 0x2f); + hdptx_write(hdptx, LANE_REG0603, 0x2f); + hdptx_write(hdptx, LANE_REG0305, 0x03); + hdptx_write(hdptx, LANE_REG0405, 0x03); + hdptx_write(hdptx, LANE_REG0505, 0x03); + hdptx_write(hdptx, LANE_REG0605, 0x03); + hdptx_write(hdptx, LANE_REG0306, 0xfc); + hdptx_write(hdptx, LANE_REG0406, 0xfc); + hdptx_write(hdptx, LANE_REG0506, 0xfc); + hdptx_write(hdptx, LANE_REG0606, 0xfc); + + hdptx_write(hdptx, LANE_REG0305, 0x4f); + hdptx_write(hdptx, LANE_REG0405, 0x4f); + hdptx_write(hdptx, LANE_REG0505, 0x4f); + hdptx_write(hdptx, LANE_REG0605, 0x4f); + hdptx_write(hdptx, LANE_REG0304, 0x14); + hdptx_write(hdptx, LANE_REG0404, 0x14); + hdptx_write(hdptx, LANE_REG0504, 0x14); + hdptx_write(hdptx, LANE_REG0604, 0x14); + return hdptx_post_enable_lane(hdptx); } @@ -1774,6 +1808,33 @@ hdptx_write(hdptx, LANE_REG061B, 0x01); hdptx_write(hdptx, LANE_REG061F, 0x15); hdptx_write(hdptx, LANE_REG0620, 0xa0); + + hdptx_write(hdptx, LANE_REG031E, 0x02); + hdptx_write(hdptx, LANE_REG041E, 0x02); + hdptx_write(hdptx, LANE_REG051E, 0x02); + hdptx_write(hdptx, LANE_REG061E, 0x02); + + hdptx_write(hdptx, LANE_REG0303, 0x2f); + hdptx_write(hdptx, LANE_REG0403, 0x2f); + hdptx_write(hdptx, LANE_REG0503, 0x2f); + hdptx_write(hdptx, LANE_REG0603, 0x2f); + hdptx_write(hdptx, LANE_REG0305, 0x03); + hdptx_write(hdptx, LANE_REG0405, 0x03); + hdptx_write(hdptx, LANE_REG0505, 0x03); + hdptx_write(hdptx, LANE_REG0605, 0x03); + hdptx_write(hdptx, LANE_REG0306, 0xfc); + hdptx_write(hdptx, LANE_REG0406, 0xfc); + hdptx_write(hdptx, LANE_REG0506, 0xfc); + hdptx_write(hdptx, LANE_REG0606, 0xfc); + + hdptx_write(hdptx, LANE_REG0305, 0x4f); + hdptx_write(hdptx, LANE_REG0405, 0x4f); + hdptx_write(hdptx, LANE_REG0505, 0x4f); + hdptx_write(hdptx, LANE_REG0605, 0x4f); + hdptx_write(hdptx, LANE_REG0304, 0x14); + hdptx_write(hdptx, LANE_REG0404, 0x14); + hdptx_write(hdptx, LANE_REG0504, 0x14); + hdptx_write(hdptx, LANE_REG0604, 0x14); return hdptx_post_enable_lane(hdptx); } @@ -1951,12 +2012,14 @@ subnode = ofnode_find_subnode(parent->node, "clk-port"); if (!ofnode_valid(subnode)) { - printf("%s: no subnode for %s", __func__, parent->name); + free(str); + printf("%s: no subnode for %s\n", __func__, parent->name); return -ENXIO; } ret = device_bind_driver_to_node(parent, "clk_hdptx", str, subnode, &child); if (ret) { + free(str); printf("%s: clk-port cannot bind its driver\n", __func__); return ret; } @@ -2019,18 +2082,6 @@ new_rate = rate; priv->rate = rate; } - } - } else { - if (!hdptx_ropll_cmn_config(hdptx, rate)) { - new_rate = rate; - priv->rate = rate; - } - } - - if (rate > (HDMI20_MAX_RATE / 100)) { - if (!hdptx_lcpll_cmn_config(hdptx, rate)) { - new_rate = rate; - priv->rate = rate; } } else { if (!hdptx_ropll_cmn_config(hdptx, rate)) { diff --git a/u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c b/u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c index 71c710f..1f60e1f 100644 --- a/u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c +++ b/u-boot/drivers/video/drm/rockchip-inno-hdmi-phy.c @@ -3,6 +3,7 @@ * (C) Copyright 2008-2016 Fuzhou Rockchip Electronics Co., Ltd */ +#include <clk-uclass.h> #include <config.h> #include <common.h> #include <errno.h> @@ -11,7 +12,9 @@ #include <fdtdec.h> #include <fdt_support.h> #include <asm/unaligned.h> +#include <asm/arch/clock.h> #include <dm/device.h> +#include <dm/lists.h> #include <dm/read.h> #include <asm/io.h> #include <linux/list.h> @@ -20,6 +23,7 @@ #include "rockchip_display.h" #include "rockchip_crtc.h" +#include "rockchip_connector.h" #include "rockchip_phy.h" #define INNO_HDMI_PHY_TIMEOUT_LOOP_COUNT 1000 @@ -145,7 +149,8 @@ enum inno_hdmi_phy_type { INNO_HDMI_PHY_RK3228, - INNO_HDMI_PHY_RK3328 + INNO_HDMI_PHY_RK3328, + INNO_HDMI_PHY_RK3528 }; struct inno_hdmi_phy_drv_data; @@ -214,6 +219,14 @@ const void *data; }; +struct clk_inno_hdmi { + struct udevice *dev; + ulong rate; +}; + +/* global variables are used to pass reource from phy drivers to clk driver */ +static struct inno_hdmi_phy *g_inno; + static const struct pre_pll_config pre_pll_cfg_table[] = { { 27000000, 27000000, 1, 90, 3, 2, 2, 10, 3, 3, 4, 0, 0}, { 27000000, 33750000, 1, 90, 1, 3, 3, 10, 3, 3, 4, 0, 0}, @@ -249,9 +262,13 @@ {33750000, 1, 10, 2, 4}, {74250000, 1, 40, 8, 1}, {74250000, 18, 80, 8, 2}, + {74250000, 1, 20, 4, 8}, {148500000, 2, 40, 4, 3}, + {148500000, 1, 10, 2, 8}, {297000000, 4, 40, 2, 3}, + {297000000, 2, 20, 2, 8}, {594000000, 8, 40, 1, 3}, + {594000000, 4, 20, 1, 8}, { ~0UL, 0, 0, 0, 0} }; @@ -292,6 +309,30 @@ 594000000, { 0x10, 0x1a, 0x1a, 0x1a, 0x07, 0x15, 0x08, 0x08, 0x08, 0x00, 0xac, 0xcc, 0xcc, 0xcc, + }, + }, { + ~0UL, { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + }, + } +}; + +static const struct phy_config rk3528_phy_cfg[] = { + /* tmdsclk bias-clk bias-data voltage-clk voltage-data pre-emphasis-data */ + { 165000000, { + 0x03, 0x04, 0x0c, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + }, + }, { + 340000000, { + 0x03, 0x04, 0x0c, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + }, + }, { + 594000000, { + 0x02, 0x08, 0x0d, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, }, }, { ~0UL, { @@ -398,7 +439,11 @@ static int inno_hdmi_phy_power_on(struct rockchip_phy *phy) { +#ifdef CONFIG_SPL_BUILD + struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data; +#else struct inno_hdmi_phy *inno = dev_get_priv(phy->dev); +#endif const struct post_pll_config *cfg = post_pll_cfg_table; const struct phy_config *phy_cfg = inno->plat_data->phy_cfg_table; u32 tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, inno->pixclock); @@ -420,6 +465,8 @@ else if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3228 && tmdsclock <= 33750000) chipversion = 4; + else if (inno->plat_data->dev_type == INNO_HDMI_PHY_RK3528) + chipversion = 8; printf("tmdsclock = %d; chipversion = %d\n", tmdsclock, chipversion); @@ -444,7 +491,11 @@ static int inno_hdmi_phy_power_off(struct rockchip_phy *phy) { +#ifdef CONFIG_SPL_BUILD + struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data; +#else struct inno_hdmi_phy *inno = dev_get_priv(phy->dev); +#endif if (inno->plat_data->ops->power_off) inno->plat_data->ops->power_off(inno); @@ -858,6 +909,229 @@ return rate; } +static int +inno_hdmi_phy_rk3528_power_on(struct inno_hdmi_phy *inno, + const struct post_pll_config *cfg, + const struct phy_config *phy_cfg) +{ + u32 val; + u64 temp; + u32 tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, inno->pixclock); + + /* Power off post PLL */ + inno_update_bits(inno, 0xaa, 1, 0); + + val = cfg->prediv; + inno_write(inno, 0xab, val); + + if (cfg->postdiv == 1) { + inno_write(inno, 0xad, 0x8); + inno_write(inno, 0xaa, 2); + } else { + val = (cfg->postdiv / 2) - 1; + inno_write(inno, 0xad, val); + inno_write(inno, 0xaa, 0x0e); + } + + val = cfg->fbdiv & 0xff; + inno_write(inno, 0xac, val); + val = (cfg->fbdiv >> 8) & BIT(0); + inno_update_bits(inno, 0xad, BIT(4), val); + + /* current bias clk/data 2 */ + val = phy_cfg->regs[0] << 4 | phy_cfg->regs[1]; + inno_write(inno, 0xbf, val); + + /* current bias data 1/0 */ + val = phy_cfg->regs[1] << 4 | phy_cfg->regs[1]; + inno_write(inno, 0xc0, val); + + /* output voltage */ + inno_write(inno, 0xb5, phy_cfg->regs[2]); + inno_write(inno, 0xb6, phy_cfg->regs[3]); + inno_write(inno, 0xb7, phy_cfg->regs[3]); + inno_write(inno, 0xb8, phy_cfg->regs[3]); + + /* pre-emphasis */ + inno_write(inno, 0xbb, phy_cfg->regs[4]); + inno_write(inno, 0xbc, phy_cfg->regs[4]); + inno_write(inno, 0xbd, phy_cfg->regs[4]); + + /* enable LDO */ + inno_write(inno, 0xb4, 0x7); + + /* enable serializer */ + inno_write(inno, 0xbe, 0x70); + + inno_write(inno, 0xb2, 0x0f); + + for (val = 0; val < 5; val++) { + if (inno_read(inno, 0xaf) & 1) + break; + udelay(1000); + } + if (!(inno_read(inno, 0xaf) & 1)) { + dev_err(inno->dev, "HDMI PHY Post PLL unlock\n"); + return -ETIMEDOUT; + } + + /* set termination resistance */ + if (phy_cfg->tmdsclock > 340000000) { + inno_write(inno, 0xc7, 0x76); + inno_write(inno, 0xc5, 0x83); + inno_write(inno, 0xc8, 0x00); + inno_write(inno, 0xc9, 0x2f); + inno_write(inno, 0xca, 0x2f); + inno_write(inno, 0xcb, 0x2f); + } else { + inno_write(inno, 0xc7, 0x76); + inno_write(inno, 0xc5, 0x83); + inno_write(inno, 0xc8, 0x00); + inno_write(inno, 0xc9, 0x0f); + inno_write(inno, 0xca, 0x0f); + inno_write(inno, 0xcb, 0x0f); + } + + + /* set TMDS sync detection counter length */ + temp = 47520000000UL / tmdsclock; + inno_write(inno, 0xd8, (temp >> 8) & 0xff); + inno_write(inno, 0xd9, temp & 0xff); + + if (phy_cfg->tmdsclock > 340000000) + mdelay(100); + /* set pdata_en to 0/1 */ + inno_update_bits(inno, 0x02, 1, 0); + inno_update_bits(inno, 0x02, 1, 1); + + /* Enable PHY IRQ */ + inno_write(inno, 0x05, 0x22); + inno_write(inno, 0x07, 0x22); + inno_write(inno, 0xcc, 0x0f); + + return 0; +} + +static void inno_hdmi_phy_rk3528_power_off(struct inno_hdmi_phy *inno) +{ + /* Power off driver */ + inno_write(inno, 0xb2, 0); + /* Power off band gap */ + inno_update_bits(inno, 0xb0, 4, 0); + /* Power off post pll */ + inno_update_bits(inno, 0xaa, 1, 1); + + /* Disable PHY IRQ */ + inno_write(inno, 0x05, 0); + inno_write(inno, 0x07, 0); +} + +static void inno_hdmi_phy_rk3528_init(struct inno_hdmi_phy *inno) +{ + /* + * Use phy internal register control + * rxsense/poweron/pllpd/pdataen signal. + */ + inno_write(inno, 0x02, 0x81); +} + +static int +inno_hdmi_phy_rk3528_pre_pll_update(struct inno_hdmi_phy *inno, + const struct pre_pll_config *cfg) +{ + u32 val; + + inno_update_bits(inno, 0xb0, 4, 4); + inno_write(inno, 0xcc, 0x0f); + + /* Power on PLL */ + inno_update_bits(inno, 0xa0, 1, 0); + /* Configure pre-pll */ + inno_update_bits(inno, 0xa0, 2, (cfg->vco_div_5_en & 1) << 1); + inno_write(inno, 0xa1, cfg->prediv); + if (cfg->fracdiv) + val = ((cfg->fbdiv >> 8) & 0x0f) | 0xc0; + else + val = ((cfg->fbdiv >> 8) & 0x0f) | 0xf0; + inno_write(inno, 0xa2, val); + inno_write(inno, 0xa3, cfg->fbdiv & 0xff); + val = (cfg->pclk_div_a & 0x1f) | + ((cfg->pclk_div_b & 3) << 5); + inno_write(inno, 0xa5, val); + val = (cfg->pclk_div_d & 0x1f) | + ((cfg->pclk_div_c & 3) << 5); + inno_write(inno, 0xa6, val); + val = ((cfg->tmds_div_a & 3) << 4) | + ((cfg->tmds_div_b & 3) << 2) | + (cfg->tmds_div_c & 3); + inno_write(inno, 0xa4, val); + + if (cfg->fracdiv) { + val = cfg->fracdiv & 0xff; + inno_write(inno, 0xd3, val); + val = (cfg->fracdiv >> 8) & 0xff; + inno_write(inno, 0xd2, val); + val = (cfg->fracdiv >> 16) & 0xff; + inno_write(inno, 0xd1, val); + } else { + inno_write(inno, 0xd3, 0); + inno_write(inno, 0xd2, 0); + inno_write(inno, 0xd1, 0); + } + + /* Wait for PLL lock */ + for (val = 0; val < 5; val++) { + if (inno_read(inno, 0xa9) & 1) + break; + udelay(1000); + } + if (val == 5) { + dev_err(inno->dev, "Pre-PLL unlock\n"); + return -ETIMEDOUT; + } + + return 0; +} + +static unsigned long +inno_hdmi_rk3528_phy_pll_recalc_rate(struct inno_hdmi_phy *inno, + unsigned long parent_rate) +{ + unsigned long frac; + u8 nd, no_a, no_b, no_d; + u16 nf; + u64 vco = parent_rate; + + nd = inno_read(inno, 0xa1) & 0x3f; + nf = ((inno_read(inno, 0xa2) & 0x0f) << 8) | inno_read(inno, 0xa3); + vco *= nf; + if ((inno_read(inno, 0xa2) & 0x30) == 0) { + frac = inno_read(inno, 0xd3) | + (inno_read(inno, 0xd2) << 8) | + (inno_read(inno, 0xd1) << 16); + vco += DIV_ROUND_CLOSEST(parent_rate * frac, (1 << 24)); + } + if (inno_read(inno, 0xa0) & 2) { + do_div(vco, nd * 5); + } else { + no_a = inno_read(inno, 0xa5) & 0x1f; + no_b = ((inno_read(inno, 0xa5) >> 5) & 7) + 2; + no_d = inno_read(inno, 0xa6) & 0x1f; + if (no_a == 1) + do_div(vco, nd * no_b * no_d * 2); + else + do_div(vco, nd * no_a * no_d * 2); + } + + frac = vco; + inno->pixclock = DIV_ROUND_CLOSEST(frac, 1000) * 1000; + + dev_dbg(inno->dev, "%s rate %lu\n", __func__, inno->pixclock); + + return frac; +} + +#ifndef CONFIG_SPL_BUILD #define PHY_TAB_LEN 60 static @@ -889,6 +1163,7 @@ return 0; } +#endif static const struct inno_hdmi_phy_ops rk3228_hdmi_phy_ops = { .init = inno_hdmi_phy_rk3228_init, @@ -905,6 +1180,14 @@ .recalc_rate = inno_hdmi_3328_phy_pll_recalc_rate, }; +static const struct inno_hdmi_phy_ops rk3528_hdmi_phy_ops = { + .init = inno_hdmi_phy_rk3528_init, + .power_on = inno_hdmi_phy_rk3528_power_on, + .power_off = inno_hdmi_phy_rk3528_power_off, + .pre_pll_update = inno_hdmi_phy_rk3528_pre_pll_update, + .recalc_rate = inno_hdmi_rk3528_phy_pll_recalc_rate, +}; + static const struct inno_hdmi_phy_drv_data rk3228_hdmi_phy_drv_data = { .dev_type = INNO_HDMI_PHY_RK3228, .ops = &rk3228_hdmi_phy_ops, @@ -917,6 +1200,12 @@ .phy_cfg_table = rk3328_phy_cfg, }; +static const struct inno_hdmi_phy_drv_data rk3528_hdmi_phy_drv_data = { + .dev_type = INNO_HDMI_PHY_RK3528, + .ops = &rk3528_hdmi_phy_ops, + .phy_cfg_table = rk3528_phy_cfg, +}; + static const struct rockchip_inno_data inno_hdmi_phy_of_match[] = { { .compatible = "rockchip,rk3228-hdmi-phy", .data = &rk3228_hdmi_phy_drv_data @@ -924,26 +1213,41 @@ { .compatible = "rockchip,rk3328-hdmi-phy", .data = &rk3328_hdmi_phy_drv_data }, + { .compatible = "rockchip,rk3528-hdmi-phy", + .data = &rk3528_hdmi_phy_drv_data + }, {} }; static int inno_hdmi_phy_init(struct rockchip_phy *phy) { +#ifdef CONFIG_SPL_BUILD + struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data; +#else struct udevice *dev = phy->dev; struct inno_hdmi_phy *inno = dev_get_priv(phy->dev); - int i, val, phy_table_size, ret; - const char *name; + int val, phy_table_size, ret; u32 *phy_config; +#endif + int i; + const char *name; - inno->node = dev->node; - +#ifdef CONFIG_SPL_BUILD + inno->regs = (void *)RK3528_HDMIPHY_BASE; +#else inno->regs = dev_read_addr_ptr(dev); + inno->node = dev->node; +#endif if (!inno->regs) { printf("%s: failed to get phy address\n", __func__); return -ENOMEM; } +#ifdef CONFIG_SPL_BUILD + name = "rockchip,rk3528-hdmi-phy"; +#else name = dev_read_string(dev, "compatible"); +#endif for (i = 0; i < ARRAY_SIZE(inno_hdmi_phy_of_match); i++) { if (!strcmp(name, inno_hdmi_phy_of_match[i].compatible)) { inno->plat_data = inno_hdmi_phy_of_match[i].data; @@ -951,6 +1255,7 @@ } } +#ifndef CONFIG_SPL_BUILD dev_read_prop(dev, "rockchip,phy-table", &val); if (val >= 0) { @@ -986,6 +1291,7 @@ } else { printf("use default hdmi phy table\n"); } +#endif if (i >= ARRAY_SIZE(inno_hdmi_phy_of_match)) return 0; @@ -1002,8 +1308,16 @@ static unsigned long inno_hdmi_phy_set_pll(struct rockchip_phy *phy, unsigned long rate) { +#ifdef CONFIG_SPL_BUILD + struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data; +#else struct inno_hdmi_phy *inno = dev_get_priv(phy->dev); +#endif +#ifdef CONFIG_SPL_BUILD + if (!inno) + inno = g_inno; +#endif inno_hdmi_phy_clk_prepare(inno); inno_hdmi_phy_clk_is_prepared(inno); inno_hdmi_phy_clk_set_rate(inno, rate); @@ -1013,7 +1327,11 @@ static int inno_hdmi_phy_set_bus_width(struct rockchip_phy *phy, u32 bus_width) { +#ifdef CONFIG_SPL_BUILD + struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data; +#else struct inno_hdmi_phy *inno = dev_get_priv(phy->dev); +#endif inno->bus_width = bus_width; @@ -1023,7 +1341,11 @@ static long inno_hdmi_phy_clk_round_rate(struct rockchip_phy *phy, unsigned long rate) { +#ifdef CONFIG_SPL_BUILD + struct inno_hdmi_phy *inno = (struct inno_hdmi_phy *)phy->data; +#else struct inno_hdmi_phy *inno = dev_get_priv(phy->dev); +#endif int i; const struct pre_pll_config *cfg = pre_pll_cfg_table; u32 tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, rate); @@ -1082,9 +1404,26 @@ .compatible = "rockchip,rk3228-hdmi-phy", .data = (ulong)&inno_hdmi_phy_driver_data, }, + { + .compatible = "rockchip,rk3528-hdmi-phy", + .data = (ulong)&inno_hdmi_phy_driver_data, + }, {} }; +#ifdef CONFIG_SPL_BUILD +int inno_spl_hdmi_phy_probe(struct display_state *state) +{ + struct inno_hdmi_phy *inno = malloc(sizeof(struct inno_hdmi_phy)); + + memset(inno, 0, sizeof(*inno)); + g_inno = inno; + + state->conn_state.connector->phy = &inno_hdmi_phy_driver_data; + state->conn_state.connector->phy->data = (void *)inno; + return 0; +} +#else static int inno_hdmi_phy_probe(struct udevice *dev) { struct inno_hdmi_phy *inno = dev_get_priv(dev); @@ -1094,6 +1433,32 @@ inno->dev = dev; phy->dev = dev; + g_inno = inno; + dev->driver_data = (ulong)&inno_hdmi_phy_driver_data; + phy = &inno_hdmi_phy_driver_data; + + return 0; +} +#endif + +static int rockchip_inno_phy_hdmi_bind(struct udevice *parent) +{ + struct udevice *child; + ofnode subnode; + int ret; + + subnode = ofnode_find_subnode(parent->node, "clk-port"); + if (!ofnode_valid(subnode)) { + printf("%s: no subnode for %s\n", __func__, parent->name); + return -ENXIO; + } + + ret = device_bind_driver_to_node(parent, "clk_inno_hdmi", "inno_hdmi_pll_clk", subnode, &child); + if (ret) { + printf("%s: clk-port cannot bind its driver\n", __func__); + return ret; + } + return 0; } @@ -1101,6 +1466,57 @@ .name = "inno_hdmi_phy", .id = UCLASS_PHY, .of_match = inno_hdmi_phy_ids, +#ifndef CONFIG_SPL_BUILD .probe = inno_hdmi_phy_probe, +#endif + .bind = rockchip_inno_phy_hdmi_bind, .priv_auto_alloc_size = sizeof(struct inno_hdmi_phy), }; + + +static ulong inno_hdmi_clk_get_rate(struct clk *clk) +{ + struct clk_inno_hdmi *priv = dev_get_priv(clk->dev); + + return priv->rate; +} + +static ulong inno_hdmi_clk_set_rate(struct clk *clk, ulong rate) +{ + struct clk_inno_hdmi *priv = dev_get_priv(clk->dev); + int ret; + + inno_hdmi_phy_clk_prepare(g_inno); + inno_hdmi_phy_clk_is_prepared(g_inno); + ret = inno_hdmi_phy_clk_set_rate(g_inno, rate); + if (ret < 0) { + printf("inno hdmi set rate failed ret:%d\n", ret); + return ret; + } + + priv->rate = g_inno->pixclock; + + return priv->rate; +} + +static const struct clk_ops inno_hdmi_clk_ops = { + .get_rate = inno_hdmi_clk_get_rate, + .set_rate = inno_hdmi_clk_set_rate, +}; + +static int inno_hdmi_clk_probe(struct udevice *dev) +{ + return 0; +} + +/* + * In order for other display interfaces to use hdmiphy as source + * for dclk, hdmiphy must register a virtual clock driver + */ +U_BOOT_DRIVER(clk_inno_hdmi) = { + .name = "clk_inno_hdmi", + .id = UCLASS_CLK, + .priv_auto_alloc_size = sizeof(struct clk_inno_hdmi), + .ops = &inno_hdmi_clk_ops, + .probe = inno_hdmi_clk_probe, +}; diff --git a/u-boot/drivers/video/drm/rockchip_connector.c b/u-boot/drivers/video/drm/rockchip_connector.c index fb7adfa..2eb8319 100644 --- a/u-boot/drivers/video/drm/rockchip_connector.c +++ b/u-boot/drivers/video/drm/rockchip_connector.c @@ -15,6 +15,19 @@ #include "rockchip_connector.h" #include "rockchip_phy.h" +#ifdef CONFIG_SPL_BUILD +int rockchip_connector_bind(struct rockchip_connector *conn, struct udevice *dev, int id, + const struct rockchip_connector_funcs *funcs, void *data, int type) +{ + conn->id = id; + conn->funcs = funcs; + conn->data = data; + conn->type = type; + + return 0; +} + +#else static LIST_HEAD(rockchip_connector_list); int rockchip_connector_bind(struct rockchip_connector *conn, struct udevice *dev, int id, @@ -105,21 +118,6 @@ return ret; } -int rockchip_connector_deinit(struct display_state *state) -{ - struct rockchip_connector *conn; - - conn = state->conn_state.connector; - if (conn->funcs->deinit) { - conn->funcs->deinit(conn, state); - if (state->conn_state.secondary) { - conn = state->conn_state.secondary; - conn->funcs->deinit(conn, state); - } - } - - return 0; -} static bool rockchip_connector_path_detect(struct rockchip_connector *conn, struct display_state *state) @@ -322,3 +320,20 @@ return 0; } +#endif + +int rockchip_connector_deinit(struct display_state *state) +{ + struct rockchip_connector *conn; + + conn = state->conn_state.connector; + if (conn->funcs->deinit) { + conn->funcs->deinit(conn, state); + if (state->conn_state.secondary) { + conn = state->conn_state.secondary; + conn->funcs->deinit(conn, state); + } + } + + return 0; +} diff --git a/u-boot/drivers/video/drm/rockchip_connector.h b/u-boot/drivers/video/drm/rockchip_connector.h index 39a81e4..8c2ff75 100644 --- a/u-boot/drivers/video/drm/rockchip_connector.h +++ b/u-boot/drivers/video/drm/rockchip_connector.h @@ -7,6 +7,17 @@ #ifndef _ROCKCHIP_CONNECTOR_H_ #define _ROCKCHIP_CONNECTOR_H_ +#ifdef CONFIG_SPL_BUILD +struct rockchip_connector { + struct rockchip_phy *phy; + int id; + int type; + bool hpd; + + const struct rockchip_connector_funcs *funcs; + void *data; +}; +#else #include "rockchip_bridge.h" #include "rockchip_panel.h" @@ -18,10 +29,123 @@ struct list_head head; int id; int type; + bool hpd; const struct rockchip_connector_funcs *funcs; void *data; }; +#endif + +/** + * enum drm_bus_flags - bus_flags info for &drm_display_info + * + * This enum defines signal polarities and clock edge information for signals on + * a bus as bitmask flags. + * + * The clock edge information is conveyed by two sets of symbols, + * DRM_BUS_FLAGS_*_DRIVE_\* and DRM_BUS_FLAGS_*_SAMPLE_\*. When this enum is + * used to describe a bus from the point of view of the transmitter, the + * \*_DRIVE_\* flags should be used. When used from the point of view of the + * receiver, the \*_SAMPLE_\* flags should be used. The \*_DRIVE_\* and + * \*_SAMPLE_\* flags alias each other, with the \*_SAMPLE_POSEDGE and + * \*_SAMPLE_NEGEDGE flags being equal to \*_DRIVE_NEGEDGE and \*_DRIVE_POSEDGE + * respectively. This simplifies code as signals are usually sampled on the + * opposite edge of the driving edge. Transmitters and receivers may however + * need to take other signal timings into account to convert between driving + * and sample edges. + */ +enum drm_bus_flags { + /** + * @DRM_BUS_FLAG_DE_LOW: + * + * The Data Enable signal is active low + */ + DRM_BUS_FLAG_DE_LOW = BIT(0), + + /** + * @DRM_BUS_FLAG_DE_HIGH: + * + * The Data Enable signal is active high + */ + DRM_BUS_FLAG_DE_HIGH = BIT(1), + + /** + * @DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE: + * + * Data is driven on the rising edge of the pixel clock + */ + DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE = BIT(2), + + /** + * @DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE: + * + * Data is driven on the falling edge of the pixel clock + */ + DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE = BIT(3), + + /** + * @DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE: + * + * Data is sampled on the rising edge of the pixel clock + */ + DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, + + /** + * @DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE: + * + * Data is sampled on the falling edge of the pixel clock + */ + DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE = DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE, + + /** + * @DRM_BUS_FLAG_DATA_MSB_TO_LSB: + * + * Data is transmitted MSB to LSB on the bus + */ + DRM_BUS_FLAG_DATA_MSB_TO_LSB = BIT(4), + + /** + * @DRM_BUS_FLAG_DATA_LSB_TO_MSB: + * + * Data is transmitted LSB to MSB on the bus + */ + DRM_BUS_FLAG_DATA_LSB_TO_MSB = BIT(5), + + /** + * @DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE: + * + * Sync signals are driven on the rising edge of the pixel clock + */ + DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE = BIT(6), + + /** + * @DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE: + * + * Sync signals are driven on the falling edge of the pixel clock + */ + DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE = BIT(7), + + /** + * @DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE: + * + * Sync signals are sampled on the rising edge of the pixel clock + */ + DRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE = DRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE, + + /** + * @DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE: + * + * Sync signals are sampled on the falling edge of the pixel clock + */ + DRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE = DRM_BUS_FLAG_SYNC_DRIVE_POSEDGE, + + /** + * @DRM_BUS_FLAG_SHARP_SIGNALS: + * + * Set if the Sharp-specific signals (SPL, CLS, PS, REV) must be used + */ + DRM_BUS_FLAG_SHARP_SIGNALS = BIT(8), +}; struct rockchip_connector_funcs { /* diff --git a/u-boot/drivers/video/drm/rockchip_crtc.c b/u-boot/drivers/video/drm/rockchip_crtc.c index 1e7376d..447bbf6 100644 --- a/u-boot/drivers/video/drm/rockchip_crtc.c +++ b/u-boot/drivers/video/drm/rockchip_crtc.c @@ -20,6 +20,7 @@ #include "rockchip_crtc.h" #include "rockchip_connector.h" +#ifndef CONFIG_SPL_BUILD static const struct udevice_id rockchip_vp_ids[] = { { .compatible = "rockchip-vp" }, { } @@ -111,6 +112,16 @@ .data = &rk3328_vop, }; +static const struct rockchip_crtc rk3528_vop_data = { + .funcs = &rockchip_vop2_funcs, + .data = &rk3528_vop, +}; + +static const struct rockchip_crtc rk3562_vop_data = { + .funcs = &rockchip_vop2_funcs, + .data = &rk3562_vop, +}; + static const struct rockchip_crtc rk3568_vop_data = { .funcs = &rockchip_vop2_funcs, .data = &rk3568_vop, @@ -174,6 +185,12 @@ .compatible = "rockchip,rk3328-vop", .data = (ulong)&rk3328_vop_data, }, { + .compatible = "rockchip,rk3528-vop", + .data = (ulong)&rk3528_vop_data, + }, { + .compatible = "rockchip,rk3562-vop", + .data = (ulong)&rk3562_vop_data, + }, { .compatible = "rockchip,rk3568-vop", .data = (ulong)&rk3568_vop_data, }, { @@ -186,6 +203,13 @@ { struct udevice *child; int ret; + + /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ + ret = clk_set_defaults(dev); + if (ret) { + dev_err(dev, "%s clk_set_defaults failed %d\n", __func__, ret); + return ret; + } for (device_find_first_child(dev, &child); child; @@ -237,3 +261,19 @@ .id = UCLASS_VIDEO_CRTC, .name = "CRTC", }; + +#else +static struct rockchip_crtc rk3528_vop_data = { + .funcs = &rockchip_vop2_funcs, + .data = &rk3528_vop, +}; + +int rockchip_spl_vop_probe(struct crtc_state *crtc_state) +{ + + crtc_state->crtc = &rk3528_vop_data; + + return 0; +} +#endif + diff --git a/u-boot/drivers/video/drm/rockchip_crtc.h b/u-boot/drivers/video/drm/rockchip_crtc.h index b28e8dd..1078f8c 100644 --- a/u-boot/drivers/video/drm/rockchip_crtc.h +++ b/u-boot/drivers/video/drm/rockchip_crtc.h @@ -44,7 +44,11 @@ int (*send_mcu_cmd)(struct display_state *state, u32 type, u32 value); int (*check)(struct display_state *state); int (*mode_valid)(struct display_state *state); + int (*mode_fixup)(struct display_state *state); int (*plane_check)(struct display_state *state); + int (*regs_dump)(struct display_state *state); + int (*active_regs_dump)(struct display_state *state); + int (*apply_soft_te)(struct display_state *state); }; struct vop_data; @@ -67,6 +71,8 @@ extern const struct vop_data rv1106_vop; extern const struct vop_data rv1108_vop; extern const struct vop_data rv1126_vop; +extern const struct vop2_data rk3528_vop; +extern const struct vop2_data rk3562_vop; extern const struct vop2_data rk3568_vop; extern const struct vop2_data rk3588_vop; #endif diff --git a/u-boot/drivers/video/drm/rockchip_display.c b/u-boot/drivers/video/drm/rockchip_display.c index b6e8774..96ef65e 100644 --- a/u-boot/drivers/video/drm/rockchip_display.c +++ b/u-boot/drivers/video/drm/rockchip_display.c @@ -57,7 +57,7 @@ static unsigned long cubic_lut_memory_start; static unsigned long memory_end; static struct base2_info base_parameter; -static uint32_t crc32_table[256]; +static u32 align_size = PAGE_SIZE; /* * the phy types are used by different connectors in public. @@ -75,41 +75,6 @@ int public_phy_type; bool phy_init; }; - -void rockchip_display_make_crc32_table(void) -{ - uint32_t c; - int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static const char p[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26}; - - /* make exclusive-or pattern from polynomial (0xedb88320L) */ - poly = 0L; - for (n = 0; n < sizeof(p) / sizeof(char); n++) - poly |= 1L << (31 - p[n]); - - for (n = 0; n < 256; n++) { - c = (unsigned long)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc32_table[n] = cpu_to_le32(c); - } -} - -uint32_t rockchip_display_crc32c_cal(unsigned char *data, int length) -{ - int i; - uint32_t crc; - crc = 0xFFFFFFFF; - - for (i = 0; i < length; i++) { - crc = crc32_table[(crc ^ *data) & 0xff] ^ (crc >> 8); - data++; - } - - return crc ^ 0xffffffff; -} int rockchip_get_baseparameter(void) { @@ -152,6 +117,7 @@ struct base2_disp_header *disp_header; int i = 0, offset = -1; u32 crc_val; + u32 base2_length; void *base_parameter_addr = (void *)&base_parameter; for (i = 0; i < 8; i++) { @@ -178,11 +144,23 @@ if (strncasecmp(disp_info->disp_head_flag, "DISP", 4)) return NULL; - crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info, sizeof(struct base2_disp_info) - 4); - - if (crc_val != disp_info->crc) { - printf("error: connector type[%d], id[%d] disp info crc check error\n", type, id); - return NULL; + if (base_parameter.major_version == 3 && base_parameter.minor_version == 0) { + crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info, + sizeof(struct base2_disp_info) - 4); + if (crc_val != disp_info->crc2) { + printf("error: connector type[%d], id[%d] disp info crc2 check error\n", + type, id); + return NULL; + } + } else { + base2_length = sizeof(struct base2_disp_info) - sizeof(struct csc_info) - + sizeof(struct acm_data) - 10 * 1024 - 4; + crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info, base2_length - 4); + if (crc_val != disp_info->crc) { + printf("error: connector type[%d], id[%d] disp info crc check error\n", + type, id); + return NULL; + } } return disp_info; @@ -253,9 +231,9 @@ static void init_display_buffer(ulong base) { - memory_start = base + DRM_ROCKCHIP_FB_SIZE; + memory_start = ALIGN(base + DRM_ROCKCHIP_FB_SIZE, align_size); memory_end = memory_start; - cubic_lut_memory_start = memory_start + MEMORY_POOL_SIZE; + cubic_lut_memory_start = ALIGN(memory_start + MEMORY_POOL_SIZE, align_size); } void *get_display_buffer(int size) @@ -340,38 +318,15 @@ return 0; } -int drm_mode_vrefresh(const struct drm_display_mode *mode) -{ - int refresh = 0; - unsigned int calc_val; - - if (mode->vrefresh > 0) { - refresh = mode->vrefresh; - } else if (mode->htotal > 0 && mode->vtotal > 0) { - int vtotal; - - vtotal = mode->vtotal; - /* work out vrefresh the value will be x1000 */ - calc_val = (mode->clock * 1000); - calc_val /= mode->htotal; - refresh = (calc_val + vtotal / 2) / vtotal; - - if (mode->flags & DRM_MODE_FLAG_INTERLACE) - refresh *= 2; - if (mode->flags & DRM_MODE_FLAG_DBLSCAN) - refresh /= 2; - if (mode->vscan > 1) - refresh /= mode->vscan; - } - return refresh; -} - -int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode) +int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode, u32 *bus_flags) { int hactive, vactive, pixelclock; int hfront_porch, hback_porch, hsync_len; int vfront_porch, vback_porch, vsync_len; int val, flags = 0; + +#define FDT_GET_BOOL(val, name) \ + val = ofnode_read_bool(node, name); #define FDT_GET_INT(val, name) \ val = ofnode_read_s32_default(node, name, -1); \ @@ -396,8 +351,18 @@ flags |= val ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC; FDT_GET_INT(val, "vsync-active"); flags |= val ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; + + FDT_GET_BOOL(val, "interlaced"); + flags |= val ? DRM_MODE_FLAG_INTERLACE : 0; + FDT_GET_BOOL(val, "doublescan"); + flags |= val ? DRM_MODE_FLAG_DBLSCAN : 0; + FDT_GET_BOOL(val, "doubleclk"); + flags |= val ? DISPLAY_FLAGS_DOUBLECLK : 0; + + FDT_GET_INT(val, "de-active"); + *bus_flags |= val ? DRM_BUS_FLAG_DE_HIGH : DRM_BUS_FLAG_DE_LOW; FDT_GET_INT(val, "pixelclk-active"); - flags |= val ? DRM_MODE_FLAG_PPIXDATA : 0; + *bus_flags |= val ? DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE : DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE; FDT_GET_INT_DEFAULT(val, "screen-rotate", 0); if (val == DRM_MODE_FLAG_XMIRROR) { @@ -425,11 +390,13 @@ return 0; } -static int display_get_force_timing_from_dts(ofnode node, struct drm_display_mode *mode) +static int display_get_force_timing_from_dts(ofnode node, + struct drm_display_mode *mode, + u32 *bus_flags) { int ret = 0; - ret = rockchip_ofnode_get_display_mode(node, mode); + ret = rockchip_ofnode_get_display_mode(node, mode, bus_flags); if (ret) { mode->clock = 74250; @@ -456,14 +423,24 @@ } static int display_get_timing_from_dts(struct rockchip_panel *panel, - struct drm_display_mode *mode) + struct drm_display_mode *mode, + u32 *bus_flags) { struct ofnode_phandle_args args; - ofnode dt, timing; + ofnode dt, timing, mcu_panel; int ret; + mcu_panel = dev_read_subnode(panel->dev, "mcu-panel"); dt = dev_read_subnode(panel->dev, "display-timings"); if (ofnode_valid(dt)) { + ret = ofnode_parse_phandle_with_args(dt, "native-mode", NULL, + 0, 0, &args); + if (ret) + return ret; + + timing = args.node; + } else if (ofnode_valid(mcu_panel)) { + dt = ofnode_find_subnode(mcu_panel, "display-timings"); ret = ofnode_parse_phandle_with_args(dt, "native-mode", NULL, 0, 0, &args); if (ret) @@ -479,163 +456,26 @@ return -ENXIO; } - rockchip_ofnode_get_display_mode(timing, mode); + rockchip_ofnode_get_display_mode(timing, mode, bus_flags); + + if (IS_ENABLED(CONFIG_ROCKCHIP_RK3568) || IS_ENABLED(CONFIG_ROCKCHIP_RK3588)) { + if (mode->hdisplay % 4) { + int old_hdisplay = mode->hdisplay; + int align = 4 - (mode->hdisplay % 4); + + mode->hdisplay += align; + mode->hsync_start += align; + mode->hsync_end += align; + mode->htotal += align; + + ofnode_write_u32_array(timing, "hactive", (u32 *)&mode->hdisplay, 1); + + printf("WARN: hactive need to be aligned with 4-pixel, %d -> %d\n", + old_hdisplay, mode->hdisplay); + } + } return 0; -} - -/** - * drm_mode_max_resolution_filter - mark modes out of vop max resolution - * @edid_data: structure store mode list - * @max_output: vop max output resolution - */ -void drm_mode_max_resolution_filter(struct hdmi_edid_data *edid_data, - struct vop_rect *max_output) -{ - int i; - - for (i = 0; i < edid_data->modes; i++) { - if (edid_data->mode_buf[i].hdisplay > max_output->width || - edid_data->mode_buf[i].vdisplay > max_output->height) - edid_data->mode_buf[i].invalid = true; - } -} - -/** - * drm_mode_set_crtcinfo - set CRTC modesetting timing parameters - * @p: mode - * @adjust_flags: a combination of adjustment flags - * - * Setup the CRTC modesetting timing parameters for @p, adjusting if necessary. - * - * - The CRTC_INTERLACE_HALVE_V flag can be used to halve vertical timings of - * interlaced modes. - * - The CRTC_STEREO_DOUBLE flag can be used to compute the timings for - * buffers containing two eyes (only adjust the timings when needed, eg. for - * "frame packing" or "side by side full"). - * - The CRTC_NO_DBLSCAN and CRTC_NO_VSCAN flags request that adjustment *not* - * be performed for doublescan and vscan > 1 modes respectively. - */ -void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags) -{ - if ((p == NULL) || ((p->type & DRM_MODE_TYPE_CRTC_C) == DRM_MODE_TYPE_BUILTIN)) - return; - - if (p->flags & DRM_MODE_FLAG_DBLCLK) - p->crtc_clock = 2 * p->clock; - else - p->crtc_clock = p->clock; - p->crtc_hdisplay = p->hdisplay; - p->crtc_hsync_start = p->hsync_start; - p->crtc_hsync_end = p->hsync_end; - p->crtc_htotal = p->htotal; - p->crtc_hskew = p->hskew; - p->crtc_vdisplay = p->vdisplay; - p->crtc_vsync_start = p->vsync_start; - p->crtc_vsync_end = p->vsync_end; - p->crtc_vtotal = p->vtotal; - - if (p->flags & DRM_MODE_FLAG_INTERLACE) { - if (adjust_flags & CRTC_INTERLACE_HALVE_V) { - p->crtc_vdisplay /= 2; - p->crtc_vsync_start /= 2; - p->crtc_vsync_end /= 2; - p->crtc_vtotal /= 2; - } - } - - if (!(adjust_flags & CRTC_NO_DBLSCAN)) { - if (p->flags & DRM_MODE_FLAG_DBLSCAN) { - p->crtc_vdisplay *= 2; - p->crtc_vsync_start *= 2; - p->crtc_vsync_end *= 2; - p->crtc_vtotal *= 2; - } - } - - if (!(adjust_flags & CRTC_NO_VSCAN)) { - if (p->vscan > 1) { - p->crtc_vdisplay *= p->vscan; - p->crtc_vsync_start *= p->vscan; - p->crtc_vsync_end *= p->vscan; - p->crtc_vtotal *= p->vscan; - } - } - - if (adjust_flags & CRTC_STEREO_DOUBLE) { - unsigned int layout = p->flags & DRM_MODE_FLAG_3D_MASK; - - switch (layout) { - case DRM_MODE_FLAG_3D_FRAME_PACKING: - p->crtc_clock *= 2; - p->crtc_vdisplay += p->crtc_vtotal; - p->crtc_vsync_start += p->crtc_vtotal; - p->crtc_vsync_end += p->crtc_vtotal; - p->crtc_vtotal += p->crtc_vtotal; - break; - } - } - - p->crtc_vblank_start = min(p->crtc_vsync_start, p->crtc_vdisplay); - p->crtc_vblank_end = max(p->crtc_vsync_end, p->crtc_vtotal); - p->crtc_hblank_start = min(p->crtc_hsync_start, p->crtc_hdisplay); - p->crtc_hblank_end = max(p->crtc_hsync_end, p->crtc_htotal); -} - -/** - * drm_mode_is_420_only - if a given videomode can be only supported in YCBCR420 - * output format - * - * @connector: drm connector under action. - * @mode: video mode to be tested. - * - * Returns: - * true if the mode can be supported in YCBCR420 format - * false if not. - */ -bool drm_mode_is_420_only(const struct drm_display_info *display, - struct drm_display_mode *mode) -{ - u8 vic = drm_match_cea_mode(mode); - - return test_bit(vic, display->hdmi.y420_vdb_modes); -} - -/** - * drm_mode_is_420_also - if a given videomode can be supported in YCBCR420 - * output format also (along with RGB/YCBCR444/422) - * - * @display: display under action. - * @mode: video mode to be tested. - * - * Returns: - * true if the mode can be support YCBCR420 format - * false if not. - */ -bool drm_mode_is_420_also(const struct drm_display_info *display, - struct drm_display_mode *mode) -{ - u8 vic = drm_match_cea_mode(mode); - - return test_bit(vic, display->hdmi.y420_cmdb_modes); -} - -/** - * drm_mode_is_420 - if a given videomode can be supported in YCBCR420 - * output format - * - * @display: display under action. - * @mode: video mode to be tested. - * - * Returns: - * true if the mode can be supported in YCBCR420 format - * false if not. - */ -bool drm_mode_is_420(const struct drm_display_info *display, - struct drm_display_mode *mode) -{ - return drm_mode_is_420_only(display, mode) || - drm_mode_is_420_also(display, mode); } static int display_get_timing(struct display_state *state) @@ -649,7 +489,7 @@ return panel->funcs->get_mode(panel, mode); if (dev_of_valid(panel->dev) && - !display_get_timing_from_dts(panel, mode)) { + !display_get_timing_from_dts(panel, mode, &conn_state->bus_flags)) { printf("Using display timing dts\n"); return 0; } @@ -730,6 +570,47 @@ return ret; } +static int display_mode_valid(struct display_state *state) +{ + struct connector_state *conn_state = &state->conn_state; + struct rockchip_connector *conn = conn_state->connector; + const struct rockchip_connector_funcs *conn_funcs = conn->funcs; + struct crtc_state *crtc_state = &state->crtc_state; + const struct rockchip_crtc *crtc = crtc_state->crtc; + const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs; + int ret; + + if (conn_funcs->mode_valid && state->enabled_at_spl == false) { + ret = conn_funcs->mode_valid(conn, state); + if (ret) + return ret; + } + + if (crtc_funcs->mode_valid) { + ret = crtc_funcs->mode_valid(state); + if (ret) + return ret; + } + + return 0; +} + +static int display_mode_fixup(struct display_state *state) +{ + struct crtc_state *crtc_state = &state->crtc_state; + const struct rockchip_crtc *crtc = crtc_state->crtc; + const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs; + int ret; + + if (crtc_funcs->mode_fixup) { + ret = crtc_funcs->mode_fixup(state); + if (ret) + return ret; + } + + return 0; +} + static int display_init(struct display_state *state) { struct connector_state *conn_state = &state->conn_state; @@ -741,7 +622,9 @@ const char *compatible; int ret = 0; static bool __print_once = false; - +#ifdef CONFIG_SPL_BUILD + struct spl_display_info *spl_disp_info = (struct spl_display_info *)CONFIG_SPL_VIDEO_BUF; +#endif if (!__print_once) { __print_once = true; printf("Rockchip UBOOT DRM driver version: %s\n", DRIVER_VERSION); @@ -755,6 +638,12 @@ return -ENXIO; } +#ifdef CONFIG_SPL_BUILD + if (state->conn_state.type == DRM_MODE_CONNECTOR_HDMIA) + state->enabled_at_spl = spl_disp_info->enabled == 1 ? true : false; + if (state->enabled_at_spl) + printf("HDMI enabled at SPL\n"); +#endif if (crtc_state->crtc->active && !crtc_state->ports_node && memcmp(&crtc_state->crtc->active_mode, &conn_state->mode, sizeof(struct drm_display_mode))) { @@ -773,14 +662,16 @@ return ret; } - ret = rockchip_connector_init(state); - if (ret) - goto deinit; + if (state->enabled_at_spl == false) { + ret = rockchip_connector_init(state); + if (ret) + goto deinit; + } /* * support hotplug, but not connect; */ -#ifdef CONFIG_ROCKCHIP_DRM_TVE +#ifdef CONFIG_DRM_ROCKCHIP_TVE if (crtc->hdmi_hpd && conn_state->type == DRM_MODE_CONNECTOR_TV) { printf("hdmi plugin ,skip tve\n"); goto deinit; @@ -793,14 +684,27 @@ #endif ret = rockchip_connector_detect(state); -#if defined(CONFIG_ROCKCHIP_DRM_TVE) || defined(CONFIG_DRM_ROCKCHIP_RK1000) +#if defined(CONFIG_DRM_ROCKCHIP_TVE) || defined(CONFIG_DRM_ROCKCHIP_RK1000) if (conn_state->type == DRM_MODE_CONNECTOR_HDMIA) crtc->hdmi_hpd = ret; + if (state->enabled_at_spl) + crtc->hdmi_hpd = true; #endif if (!ret && !state->force_output) goto deinit; - if (conn->panel) { + ret = 0; + if (state->enabled_at_spl == true) { +#ifdef CONFIG_SPL_BUILD + struct drm_display_mode *mode = &conn_state->mode; + + memcpy(mode, &spl_disp_info->mode, sizeof(*mode)); + conn_state->bus_format = spl_disp_info->bus_format; + + printf("%s get display mode from spl:%dx%d, bus format:0x%x\n", + conn->dev->name, mode->hdisplay, mode->vdisplay, conn_state->bus_format); +#endif + } else if (conn->panel) { ret = display_get_timing(state); if (!ret) conn_state->bpc = conn->panel->bpc; @@ -853,10 +757,15 @@ if (state->force_output) display_use_force_mode(state); + if (display_mode_valid(state)) + goto deinit; + /* rk356x series drive mipi pixdata on posedge */ compatible = dev_read_string(conn->dev, "compatible"); - if (!strcmp(compatible, "rockchip,rk3568-mipi-dsi")) - conn_state->mode.flags |= DRM_MODE_FLAG_PPIXDATA; + if (!strcmp(compatible, "rockchip,rk3568-mipi-dsi")) { + conn_state->bus_flags &= ~DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE; + conn_state->bus_flags |= DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE; + } printf("%s: %s detailed mode clock %u kHz, flags[%x]\n" " H: %04d %04d %04d %04d\n" @@ -871,20 +780,13 @@ mode->vsync_end, mode->vtotal, conn_state->bus_format); - drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); - - if (conn_state->secondary) { - mode->crtc_clock *= 2; - mode->crtc_hdisplay *= 2; - mode->crtc_hsync_start *= 2; - mode->crtc_hsync_end *= 2; - mode->crtc_htotal *= 2; - } + if (display_mode_fixup(state)) + goto deinit; if (conn->bridge) rockchip_bridge_mode_set(conn->bridge, &conn_state->mode); - if (crtc_funcs->init) { + if (crtc_funcs->init && state->enabled_at_spl == false) { ret = crtc_funcs->init(state); if (ret) goto deinit; @@ -955,12 +857,17 @@ if (crtc_funcs->prepare) crtc_funcs->prepare(state); - rockchip_connector_pre_enable(state); + if (state->enabled_at_spl == false) + rockchip_connector_pre_enable(state); if (crtc_funcs->enable) crtc_funcs->enable(state); - rockchip_connector_enable(state); + if (state->enabled_at_spl == false) + rockchip_connector_enable(state); + + if (crtc_state->soft_te) + crtc_funcs->apply_soft_te(state); state->is_enable = true; @@ -990,54 +897,6 @@ state->is_init = 0; return 0; -} - -static int display_rect_calc_scale(int src, int dst) -{ - int scale = 0; - - if (WARN_ON(src < 0 || dst < 0)) - return -EINVAL; - - if (dst == 0) - return 0; - - src <<= 16; - - if (src > (dst << 16)) - return DIV_ROUND_UP(src, dst); - else - scale = src / dst; - - return scale; -} - -int display_rect_calc_hscale(struct display_rect *src, struct display_rect *dst, - int min_hscale, int max_hscale) -{ - int hscale = display_rect_calc_scale(src->w, dst->w); - - if (hscale < 0 || dst->w == 0) - return hscale; - - if (hscale < min_hscale || hscale > max_hscale) - return -ERANGE; - - return hscale; -} - -int display_rect_calc_vscale(struct display_rect *src, struct display_rect *dst, - int min_vscale, int max_vscale) -{ - int vscale = display_rect_calc_scale(src->h, dst->h); - - if (vscale < 0 || dst->h == 0) - return vscale; - - if (vscale < min_vscale || vscale > max_vscale) - return -ERANGE; - - return vscale; } static int display_check(struct display_state *state) @@ -1074,38 +933,6 @@ return 0; check_fail: - state->is_init = false; - return ret; -} - -static int display_mode_valid(struct display_state *state) -{ - struct connector_state *conn_state = &state->conn_state; - struct rockchip_connector *conn = conn_state->connector; - const struct rockchip_connector_funcs *conn_funcs = conn->funcs; - struct crtc_state *crtc_state = &state->crtc_state; - const struct rockchip_crtc *crtc = crtc_state->crtc; - const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs; - int ret; - - if (!state->is_init) - return 0; - - if (conn_funcs->mode_valid) { - ret = conn_funcs->mode_valid(conn, state); - if (ret) - goto invalid_mode; - } - - if (crtc_funcs->mode_valid) { - ret = crtc_funcs->mode_valid(state); - if (ret) - goto invalid_mode; - } - - return 0; - -invalid_mode: state->is_init = false; return ret; } @@ -1170,7 +997,6 @@ } } - display_mode_valid(state); display_check(state); display_set_plane(state); display_enable(state); @@ -1213,14 +1039,22 @@ return 0; } -static int get_crtc_mcu_mode(struct crtc_state *crtc_state) +static int get_crtc_mcu_mode(struct crtc_state *crtc_state, struct device_node *port_node, + bool is_ports_node) { - ofnode mcu_node; + ofnode mcu_node, vp_node; int total_pixel, cs_pst, cs_pend, rw_pst, rw_pend; - mcu_node = dev_read_subnode(crtc_state->dev, "mcu-timing"); - if (!ofnode_valid(mcu_node)) - return -ENODEV; + if (is_ports_node) { + vp_node = np_to_ofnode(port_node); + mcu_node = ofnode_find_subnode(vp_node, "mcu-timing"); + if (!ofnode_valid(mcu_node)) + return -ENODEV; + } else { + mcu_node = dev_read_subnode(crtc_state->dev, "mcu-timing"); + if (!ofnode_valid(mcu_node)) + return -ENODEV; + } #define FDT_GET_MCU_INT(val, name) \ do { \ @@ -1464,6 +1298,35 @@ return ret; } +int rockchip_vop_dump(const char *cmd) +{ + struct display_state *state; + struct crtc_state *crtc_state; + struct rockchip_crtc *crtc; + const struct rockchip_crtc_funcs *crtc_funcs; + int ret = -EINVAL; + + list_for_each_entry(state, &rockchip_display_list, head) { + if (!state->is_init) + continue; + crtc_state = &state->crtc_state; + crtc = crtc_state->crtc; + crtc_funcs = crtc->funcs; + + if (!cmd) + ret = crtc_funcs->active_regs_dump(state); + else if (!strcmp(cmd, "a") || !strcmp(cmd, "all")) + ret = crtc_funcs->regs_dump(state); + if (!ret) + break; + } + + if (ret) + ret = CMD_RET_USAGE; + + return ret; +} + enum { PORT_DIR_IN, PORT_DIR_OUT, @@ -1505,13 +1368,12 @@ return ofnode_to_np(parent); } -static const struct device_node *rockchip_of_graph_get_remote_node(ofnode node, int port, - int endpoint) +const struct device_node * +rockchip_of_graph_get_endpoint_by_regs(ofnode node, int port, int endpoint) { const struct device_node *port_node; ofnode ep; u32 reg; - uint phandle; port_node = rockchip_of_graph_get_port_by_id(node, port); if (!port_node) @@ -1527,7 +1389,21 @@ if (!ofnode_valid(ep)) return NULL; - if (ofnode_read_u32(ep, "remote-endpoint", &phandle)) + return ofnode_to_np(ep); +} + +static const struct device_node * +rockchip_of_graph_get_remote_node(ofnode node, int port, int endpoint) +{ + const struct device_node *ep_node; + ofnode ep; + uint phandle; + + ep_node = rockchip_of_graph_get_endpoint_by_regs(node, port, endpoint); + if (!ep_node) + return NULL; + + if (ofnode_read_u32(np_to_ofnode(ep_node), "remote-endpoint", &phandle)) return NULL; ep = ofnode_get_by_phandle(phandle); @@ -1611,6 +1487,10 @@ struct rockchip_bridge **bridge) { int ret = 0; + + if (*panel) + return 0; + *panel = NULL; *bridge = NULL; @@ -1952,7 +1832,9 @@ if (s->force_output) { timing_node = ofnode_find_subnode(node, "force_timing"); - ret = display_get_force_timing_from_dts(timing_node, &s->force_mode); + ret = display_get_force_timing_from_dts(timing_node, + &s->force_mode, + &s->conn_state.bus_flags); if (ofnode_read_u32(node, "force-bus-format", &s->force_bus_format)) s->force_bus_format = MEDIA_BUS_FMT_RGB888_1X24; } @@ -2002,10 +1884,11 @@ s->crtc_state.crtc->vps[vp_id].plane_mask = ret; s->crtc_state.crtc->assign_plane |= true; s->crtc_state.crtc->vps[vp_id].primary_plane_id = - ofnode_read_u32_default(vp_node, "rockchip,primary-plane", -1); + ofnode_read_u32_default(vp_node, "rockchip,primary-plane", U8_MAX); printf("get vp%d plane mask:0x%x, primary id:%d, cursor_plane:%d, from dts\n", vp_id, s->crtc_state.crtc->vps[vp_id].plane_mask, + s->crtc_state.crtc->vps[vp_id].primary_plane_id == U8_MAX ? -1 : s->crtc_state.crtc->vps[vp_id].primary_plane_id, cursor_plane); } @@ -2020,7 +1903,7 @@ } } - get_crtc_mcu_mode(&s->crtc_state); + get_crtc_mcu_mode(&s->crtc_state, port_node, is_ports_node); ret = ofnode_read_u32_default(s->crtc_state.node, "rockchip,dual-channel-swap", 0); @@ -2061,27 +1944,41 @@ const struct rockchip_crtc *crtc; struct display_state *s; int offset; + int ret; const struct device_node *np; const char *path; + const char *cacm_header; + u64 aligned_memory_size; if (fdt_node_offset_by_compatible(blob, 0, "rockchip,drm-logo") >= 0) { - list_for_each_entry(s, &rockchip_display_list, head) - load_bmp_logo(&s->logo, s->klogo_name); + list_for_each_entry(s, &rockchip_display_list, head) { + ret = load_bmp_logo(&s->logo, s->klogo_name); + if (ret < 0) { + s->is_klogo_valid = false; + printf("VP%d fail to load kernel logo\n", s->crtc_state.crtc_id); + } else { + s->is_klogo_valid = true; + } + } if (!get_display_size()) return; + aligned_memory_size = (u64)ALIGN(get_display_size(), align_size); offset = fdt_update_reserved_memory(blob, "rockchip,drm-logo", (u64)memory_start, - (u64)get_display_size()); + aligned_memory_size); if (offset < 0) printf("failed to reserve drm-loader-logo memory\n"); - offset = fdt_update_reserved_memory(blob, "rockchip,drm-cubic-lut", - (u64)cubic_lut_memory_start, - (u64)get_cubic_memory_size()); - if (offset < 0) - printf("failed to reserve drm-cubic-lut memory\n"); + if (get_cubic_memory_size()) { + aligned_memory_size = (u64)ALIGN(get_cubic_memory_size(), align_size); + offset = fdt_update_reserved_memory(blob, "rockchip,drm-cubic-lut", + (u64)cubic_lut_memory_start, + aligned_memory_size); + if (offset < 0) + printf("failed to reserve drm-cubic-lut memory\n"); + } } else { printf("can't found rockchip,drm-logo, use rockchip,fb-logo\n"); /* Compatible with rkfb display, only need reserve memory */ @@ -2097,7 +1994,14 @@ } list_for_each_entry(s, &rockchip_display_list, head) { - if (!s->is_init) + /* + * If plane mask is not set in dts, fixup dts to assign it + * whether crtc is initialized or not. + */ + if (s->crtc_state.crtc->funcs->fixup_dts && !s->crtc_state.crtc->assign_plane) + s->crtc_state.crtc->funcs->fixup_dts(s, blob); + + if (!s->is_init || !s->is_klogo_valid) continue; conn = s->conn_state.connector; @@ -2123,9 +2027,6 @@ printf("failed to get exist crtc\n"); continue; } - - if (crtc_funcs->fixup_dts) - crtc_funcs->fixup_dts(s, blob); np = ofnode_to_np(s->node); path = np->full_name; @@ -2155,10 +2056,37 @@ FDT_SET_U32("overscan,bottom_margin", s->conn_state.overscan.bottom_margin); if (s->conn_state.disp_info) { + cacm_header = (const char*)&s->conn_state.disp_info->cacm_header; + FDT_SET_U32("bcsh,brightness", s->conn_state.disp_info->bcsh_info.brightness); FDT_SET_U32("bcsh,contrast", s->conn_state.disp_info->bcsh_info.contrast); FDT_SET_U32("bcsh,saturation", s->conn_state.disp_info->bcsh_info.saturation); FDT_SET_U32("bcsh,hue", s->conn_state.disp_info->bcsh_info.hue); + + if (!strncasecmp(cacm_header, "CACM", 4)) { + FDT_SET_U32("post_csc,hue", + s->conn_state.disp_info->csc_info.hue); + FDT_SET_U32("post_csc,saturation", + s->conn_state.disp_info->csc_info.saturation); + FDT_SET_U32("post_csc,contrast", + s->conn_state.disp_info->csc_info.contrast); + FDT_SET_U32("post_csc,brightness", + s->conn_state.disp_info->csc_info.brightness); + FDT_SET_U32("post_csc,r_gain", + s->conn_state.disp_info->csc_info.r_gain); + FDT_SET_U32("post_csc,g_gain", + s->conn_state.disp_info->csc_info.g_gain); + FDT_SET_U32("post_csc,b_gain", + s->conn_state.disp_info->csc_info.b_gain); + FDT_SET_U32("post_csc,r_offset", + s->conn_state.disp_info->csc_info.r_offset); + FDT_SET_U32("post_csc,g_offset", + s->conn_state.disp_info->csc_info.g_offset); + FDT_SET_U32("post_csc,b_offset", + s->conn_state.disp_info->csc_info.b_offset); + FDT_SET_U32("post_csc,csc_enable", + s->conn_state.disp_info->csc_info.csc_enable); + } } if (s->conn_state.disp_info->cubic_lut_data.size && @@ -2213,6 +2141,19 @@ return 0; } +static int do_rockchip_vop_dump(cmd_tbl_t *cmdtp, int flag, int argc, + char *const argv[]) +{ + int ret; + + if (argc < 1 || argc > 2) + return CMD_RET_USAGE; + + ret = rockchip_vop_dump(argv[1]); + + return ret; +} + U_BOOT_CMD( rockchip_show_logo, 1, 1, do_rockchip_logo_show, "load and display log from resource partition", @@ -2224,3 +2165,9 @@ "load and display bmp from resource partition", " <bmp_name>" ); + +U_BOOT_CMD( + vop_dump, 2, 1, do_rockchip_vop_dump, + "dump vop regs", + " [a/all]" +); diff --git a/u-boot/drivers/video/drm/rockchip_display.h b/u-boot/drivers/video/drm/rockchip_display.h index 4d45e9d..8447871 100644 --- a/u-boot/drivers/video/drm/rockchip_display.h +++ b/u-boot/drivers/video/drm/rockchip_display.h @@ -7,22 +7,37 @@ #ifndef _ROCKCHIP_DISPLAY_H #define _ROCKCHIP_DISPLAY_H +#ifdef CONFIG_SPL_BUILD +#include <linux/hdmi.h> +#include <linux/media-bus-format.h> +#else #include <bmp_layout.h> -#include <drm_modes.h> #include <edid.h> +#endif +#include <drm_modes.h> #include <dm/ofnode.h> #include <drm/drm_dsc.h> +#include <spl_display.h> +#include <clk.h> /* - * major: IP major vertion, used for IP structure + * major: IP major version, used for IP structure * minor: big feature change under same structure + * build: RTL current SVN number */ -#define VOP_VERSION(major, minor) ((major) << 8 | (minor)) -#define VOP_MAJOR(version) ((version) >> 8) -#define VOP_MINOR(version) ((version) & 0xff) +#define VOP_VERSION(major, minor) ((major) << 8 | (minor)) +#define VOP_MAJOR(version) ((version) >> 8) +#define VOP_MINOR(version) ((version) & 0xff) -#define VOP_VERSION_RK3568 VOP_VERSION(0x40, 0x15) -#define VOP_VERSION_RK3588 VOP_VERSION(0x40, 0x17) +#define VOP2_VERSION(major, minor, build) ((major) << 24 | (minor) << 16 | (build)) +#define VOP2_MAJOR(version) (((version) >> 24) & 0xff) +#define VOP2_MINOR(version) (((version) >> 16) & 0xff) +#define VOP2_BUILD(version) ((version) & 0xffff) + +#define VOP_VERSION_RK3528 VOP2_VERSION(0x50, 0x17, 0x1263) +#define VOP_VERSION_RK3562 VOP2_VERSION(0x50, 0x17, 0x4350) +#define VOP_VERSION_RK3568 VOP2_VERSION(0x40, 0x15, 0x8023) +#define VOP_VERSION_RK3588 VOP2_VERSION(0x40, 0x17, 0x6786) #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE BIT(0) #define ROCKCHIP_OUTPUT_DUAL_CHANNEL_ODD_EVEN_MODE BIT(1) @@ -66,6 +81,7 @@ #define ROCKCHIP_OUT_MODE_P565 2 #define ROCKCHIP_OUT_MODE_BT656 5 #define ROCKCHIP_OUT_MODE_S888 8 +#define ROCKCHIP_OUT_MODE_YUV422 9 #define ROCKCHIP_OUT_MODE_S888_DUMMY 12 #define ROCKCHIP_OUT_MODE_YUV420 14 /* for use special outface */ @@ -141,6 +157,7 @@ void *private; ofnode node; struct device_node *ports_node; /* if (ports_node) it's vop2; */ + struct clk dclk; int crtc_id; int format; @@ -160,6 +177,7 @@ bool post_y2r_en; bool bcsh_en; bool splice_mode; + bool soft_te; u8 splice_crtc_id; u8 dsc_id; u8 dsc_enable; @@ -198,6 +216,7 @@ struct overscan overscan; u8 edid[EDID_SIZE * 4]; int bus_format; + u32 bus_flags; int output_mode; int type; int output_if; @@ -223,6 +242,8 @@ u64 dsc_cds_clk; struct rockchip_dsc_sink_cap dsc_sink_cap; struct drm_dsc_picture_parameter_set pps; + + struct gpio_desc *te_gpio; struct { u32 *lut; @@ -268,7 +289,9 @@ int enable; int is_init; int is_enable; + bool is_klogo_valid; bool force_output; + bool enabled_at_spl; struct drm_display_mode force_mode; u32 force_bus_format; }; @@ -282,11 +305,22 @@ void drm_mode_max_resolution_filter(struct hdmi_edid_data *edid_data, struct vop_rect *max_output); unsigned long get_cubic_lut_buffer(int crtc_id); -int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode); +int rockchip_ofnode_get_display_mode(ofnode node, struct drm_display_mode *mode, + u32 *bus_flags); +void rockchip_display_make_crc32_table(void); +uint32_t rockchip_display_crc32c_cal(unsigned char *data, int length); +void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags); int display_rect_calc_hscale(struct display_rect *src, struct display_rect *dst, int min_hscale, int max_hscale); int display_rect_calc_vscale(struct display_rect *src, struct display_rect *dst, int min_vscale, int max_vscale); +const struct device_node * +rockchip_of_graph_get_endpoint_by_regs(ofnode node, int port, int endpoint); +#ifdef CONFIG_SPL_BUILD +int rockchip_spl_vop_probe(struct crtc_state *crtc_state); +int rockchip_spl_dw_hdmi_probe(struct connector_state *conn_state); +int inno_spl_hdmi_phy_probe(struct display_state *state); +#endif #endif diff --git a/u-boot/drivers/video/drm/rockchip_display_helper.c b/u-boot/drivers/video/drm/rockchip_display_helper.c new file mode 100644 index 0000000..da34f4d --- /dev/null +++ b/u-boot/drivers/video/drm/rockchip_display_helper.c @@ -0,0 +1,279 @@ +/* + * (C) Copyright 2023 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <linux/hdmi.h> +#include <linux/compat.h> +#include "rockchip_display.h" +#include <spl_display.h> + +#define RK_BLK_SIZE 512 +#define BMP_PROCESSED_FLAG 8399 + +static uint32_t crc32_table[256]; + +void rockchip_display_make_crc32_table(void) +{ + uint32_t c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static const char p[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26}; + + /* make exclusive-or pattern from polynomial (0xedb88320L) */ + poly = 0L; + for (n = 0; n < sizeof(p) / sizeof(char); n++) + poly |= 1L << (31 - p[n]); + + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc32_table[n] = cpu_to_le32(c); + } +} + +uint32_t rockchip_display_crc32c_cal(unsigned char *data, int length) +{ + int i; + uint32_t crc; + crc = 0xFFFFFFFF; + + for (i = 0; i < length; i++) { + crc = crc32_table[(crc ^ *data) & 0xff] ^ (crc >> 8); + data++; + } + + return crc ^ 0xffffffff; +} + +/** + * drm_mode_max_resolution_filter - mark modes out of vop max resolution + * @edid_data: structure store mode list + * @max_output: vop max output resolution + */ +void drm_mode_max_resolution_filter(struct hdmi_edid_data *edid_data, + struct vop_rect *max_output) +{ + int i; + + for (i = 0; i < edid_data->modes; i++) { + if (edid_data->mode_buf[i].hdisplay > max_output->width || + edid_data->mode_buf[i].vdisplay > max_output->height) + edid_data->mode_buf[i].invalid = true; + } +} + +int drm_mode_vrefresh(const struct drm_display_mode *mode) +{ + int refresh = 0; + unsigned int calc_val; + + if (mode->vrefresh > 0) { + refresh = mode->vrefresh; + } else if (mode->htotal > 0 && mode->vtotal > 0) { + int vtotal; + + vtotal = mode->vtotal; + /* work out vrefresh the value will be x1000 */ + calc_val = (mode->clock * 1000); + calc_val /= mode->htotal; + refresh = (calc_val + vtotal / 2) / vtotal; + + if (mode->flags & DRM_MODE_FLAG_INTERLACE) + refresh *= 2; + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) + refresh /= 2; + if (mode->vscan > 1) + refresh /= mode->vscan; + } + return refresh; +} + +/** + * drm_mode_set_crtcinfo - set CRTC modesetting timing parameters + * @p: mode + * @adjust_flags: a combination of adjustment flags + * + * Setup the CRTC modesetting timing parameters for @p, adjusting if necessary. + * + * - The CRTC_INTERLACE_HALVE_V flag can be used to halve vertical timings of + * interlaced modes. + * - The CRTC_STEREO_DOUBLE flag can be used to compute the timings for + * buffers containing two eyes (only adjust the timings when needed, eg. for + * "frame packing" or "side by side full"). + * - The CRTC_NO_DBLSCAN and CRTC_NO_VSCAN flags request that adjustment *not* + * be performed for doublescan and vscan > 1 modes respectively. + */ +void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags) +{ + if ((p == NULL) || ((p->type & DRM_MODE_TYPE_CRTC_C) == DRM_MODE_TYPE_BUILTIN)) + return; + + if (p->flags & DRM_MODE_FLAG_DBLCLK) + p->crtc_clock = 2 * p->clock; + else + p->crtc_clock = p->clock; + p->crtc_hdisplay = p->hdisplay; + p->crtc_hsync_start = p->hsync_start; + p->crtc_hsync_end = p->hsync_end; + p->crtc_htotal = p->htotal; + p->crtc_hskew = p->hskew; + p->crtc_vdisplay = p->vdisplay; + p->crtc_vsync_start = p->vsync_start; + p->crtc_vsync_end = p->vsync_end; + p->crtc_vtotal = p->vtotal; + + if (p->flags & DRM_MODE_FLAG_INTERLACE) { + if (adjust_flags & CRTC_INTERLACE_HALVE_V) { + p->crtc_vdisplay /= 2; + p->crtc_vsync_start /= 2; + p->crtc_vsync_end /= 2; + p->crtc_vtotal /= 2; + } + } + + if (!(adjust_flags & CRTC_NO_DBLSCAN)) { + if (p->flags & DRM_MODE_FLAG_DBLSCAN) { + p->crtc_vdisplay *= 2; + p->crtc_vsync_start *= 2; + p->crtc_vsync_end *= 2; + p->crtc_vtotal *= 2; + } + } + + if (!(adjust_flags & CRTC_NO_VSCAN)) { + if (p->vscan > 1) { + p->crtc_vdisplay *= p->vscan; + p->crtc_vsync_start *= p->vscan; + p->crtc_vsync_end *= p->vscan; + p->crtc_vtotal *= p->vscan; + } + } + + if (adjust_flags & CRTC_STEREO_DOUBLE) { + unsigned int layout = p->flags & DRM_MODE_FLAG_3D_MASK; + + switch (layout) { + case DRM_MODE_FLAG_3D_FRAME_PACKING: + p->crtc_clock *= 2; + p->crtc_vdisplay += p->crtc_vtotal; + p->crtc_vsync_start += p->crtc_vtotal; + p->crtc_vsync_end += p->crtc_vtotal; + p->crtc_vtotal += p->crtc_vtotal; + break; + } + } + + p->crtc_vblank_start = min(p->crtc_vsync_start, p->crtc_vdisplay); + p->crtc_vblank_end = max(p->crtc_vsync_end, p->crtc_vtotal); + p->crtc_hblank_start = min(p->crtc_hsync_start, p->crtc_hdisplay); + p->crtc_hblank_end = max(p->crtc_hsync_end, p->crtc_htotal); +} + +/** + * drm_mode_is_420_only - if a given videomode can be only supported in YCBCR420 + * output format + * + * @connector: drm connector under action. + * @mode: video mode to be tested. + * + * Returns: + * true if the mode can be supported in YCBCR420 format + * false if not. + */ +static bool drm_mode_is_420_only(const struct drm_display_info *display, + struct drm_display_mode *mode) +{ + u8 vic = drm_match_cea_mode(mode); + + return test_bit(vic, display->hdmi.y420_vdb_modes); +} + +/** + * drm_mode_is_420_also - if a given videomode can be supported in YCBCR420 + * output format also (along with RGB/YCBCR444/422) + * + * @display: display under action. + * @mode: video mode to be tested. + * + * Returns: + * true if the mode can be support YCBCR420 format + * false if not. + */ +static bool drm_mode_is_420_also(const struct drm_display_info *display, + struct drm_display_mode *mode) +{ + u8 vic = drm_match_cea_mode(mode); + + return test_bit(vic, display->hdmi.y420_cmdb_modes); +} + +/** + * drm_mode_is_420 - if a given videomode can be supported in YCBCR420 + * output format + * + * @display: display under action. + * @mode: video mode to be tested. + * + * Returns: + * true if the mode can be supported in YCBCR420 format + * false if not. + */ +bool drm_mode_is_420(const struct drm_display_info *display, + struct drm_display_mode *mode) +{ + return drm_mode_is_420_only(display, mode) || + drm_mode_is_420_also(display, mode); +} + +static int display_rect_calc_scale(int src, int dst) +{ + int scale = 0; + + if (WARN_ON(src < 0 || dst < 0)) + return -EINVAL; + + if (dst == 0) + return 0; + + src <<= 16; + + if (src > (dst << 16)) + return DIV_ROUND_UP(src, dst); + else + scale = src / dst; + + return scale; +} + +int display_rect_calc_hscale(struct display_rect *src, struct display_rect *dst, + int min_hscale, int max_hscale) +{ + int hscale = display_rect_calc_scale(src->w, dst->w); + + if (hscale < 0 || dst->w == 0) + return hscale; + + if (hscale < min_hscale || hscale > max_hscale) + return -ERANGE; + + return hscale; +} + +int display_rect_calc_vscale(struct display_rect *src, struct display_rect *dst, + int min_vscale, int max_vscale) +{ + int vscale = display_rect_calc_scale(src->h, dst->h); + + if (vscale < 0 || dst->h == 0) + return vscale; + + if (vscale < min_vscale || vscale > max_vscale) + return -ERANGE; + + return vscale; +} + diff --git a/u-boot/drivers/video/drm/rockchip_drm_tve.c b/u-boot/drivers/video/drm/rockchip_drm_tve.c deleted file mode 100644 index a159bfe..0000000 --- a/u-boot/drivers/video/drm/rockchip_drm_tve.c +++ /dev/null @@ -1,578 +0,0 @@ -/* - * SPDX-License-Identifier: GPL-2.0+ - * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd - */ -#include <common.h> -#include <malloc.h> -#include <fdtdec.h> -#include <fdt_support.h> -#include <asm/io.h> -#include <linux/media-bus-format.h> -#include <asm/arch-rockchip/clock.h> -#include <dm/device.h> -#include <dm/read.h> -#include <dm/uclass-internal.h> -#include <linux/fb.h> -#include <edid.h> -#include <syscon.h> -#include <boot_rkimg.h> -#include <mapmem.h> -#include <misc.h> -#include "rockchip_drm_tve.h" -#include "rockchip_display.h" -#include "rockchip_crtc.h" -#include "rockchip_connector.h" -#include "rockchip_phy.h" - -DECLARE_GLOBAL_DATA_PTR; - -static struct drm_tve tve_s; - -#define tve_writel(offset, v) writel(v, tve_s.reg_phy_base + offset) -#define tve_readl(offset) readl(tve_s.reg_phy_base + offset) - -#define tve_dac_writel(offset, v) writel(v, tve_s.vdacbase + offset) -#define tve_dac_readl(offset) readl(tve_s.vdacbase + offset) - -#define RK322X_VDAC_STANDARD 0x15 - -#define TVE_REG_NUM 0x28 - -static const struct drm_display_mode tve_modes[] = { - /* 0 - 720x576i@50Hz */ - { DRM_MODE(DRM_MODE_TYPE_DRIVER, 13500, 720, 753, - 816, 864, 576, 580, 586, 625, 0, - DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), - .vrefresh = 50, }, - /* 1 - 720x480i@60Hz */ - { DRM_MODE(DRM_MODE_TYPE_DRIVER, 13500, 720, 753, - 815, 858, 480, 480, 486, 525, 0, - DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | - DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), - .vrefresh = 60, }, -}; - -static void dac_enable(int enable) -{ - u32 mask, val = 0; - u32 grfreg = 0; - -#if defined(CONFIG_ROCKCHIP_RK322X) || defined(CONFIG_ROCKCHIP_RK3328) - tve_dac_writel(VDAC_VDAC2, v_CUR_CTR(tve_s.daclevel)); - tve_dac_writel(VDAC_VDAC3, v_CAB_EN(0)); -#endif - if (enable) { - mask = m_VBG_EN | m_DAC_EN | m_DAC_GAIN; -#if defined(CONFIG_ROCKCHIP_RK3128) - val = m_VBG_EN | m_DAC_EN | v_DAC_GAIN(tve_s.daclevel); - grfreg = GRF_TVE_CON0; -#elif defined(CONFIG_ROCKCHIP_RK3036) - val = m_VBG_EN | m_DAC_EN | v_DAC_GAIN(tve_s.daclevel); - grfreg = GRF_SOC_CON3; -#endif - val |= mask << 16; - -#if defined(CONFIG_ROCKCHIP_RK322X) || defined(CONFIG_ROCKCHIP_RK3328) - val = v_CUR_REG(tve_s.dac1level) | - v_DR_PWR_DOWN(0) | v_BG_PWR_DOWN(0); -#endif - } else { - mask = m_VBG_EN | m_DAC_EN; - val = 0; -#if defined(CONFIG_ROCKCHIP_RK3128) - grfreg = GRF_TVE_CON0; -#elif defined(CONFIG_ROCKCHIP_RK3036) - grfreg = GRF_SOC_CON3; -#endif - val |= mask << 16; - -#if defined(CONFIG_ROCKCHIP_RK322X) || defined(CONFIG_ROCKCHIP_RK3328) - val = v_CUR_REG(tve_s.dac1level) | - m_DR_PWR_DOWN | m_BG_PWR_DOWN; - #endif - } - - if (grfreg) - writel(val, tve_s.grf + grfreg); - else if (tve_s.vdacbase) - tve_dac_writel(VDAC_VDAC1, val); -} - -static void tve_set_mode(int mode) -{ - if (tve_s.soctype != SOC_RK322X && - tve_s.soctype != SOC_RK322XH) { - tve_writel(TV_RESET, v_RESET(1)); - udelay(100); - tve_writel(TV_RESET, v_RESET(0)); - } - - if (tve_s.soctype == SOC_RK3036) - tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) | - v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) | - v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(0)); - else - tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) | - v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) | - v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(3)); - - tve_writel(TV_LUMA_FILTER0, tve_s.lumafilter0); - tve_writel(TV_LUMA_FILTER1, tve_s.lumafilter1); - tve_writel(TV_LUMA_FILTER2, tve_s.lumafilter2); - - if (mode == TVOUT_CVBS_NTSC) { - tve_writel(TV_ROUTING, v_DAC_SENSE_EN(0) | v_Y_IRE_7_5(1) | - v_Y_AGC_PULSE_ON(1) | v_Y_VIDEO_ON(1) | - v_Y_SYNC_ON(1) | v_PIC_MODE(mode)); - tve_writel(TV_BW_CTRL, v_CHROMA_BW(BP_FILTER_NTSC) | - v_COLOR_DIFF_BW(COLOR_DIFF_FILTER_BW_1_3)); - tve_writel(TV_SATURATION, 0x0052543C); - if (tve_s.test_mode) - tve_writel(TV_BRIGHTNESS_CONTRAST, 0x00008300); - else - tve_writel(TV_BRIGHTNESS_CONTRAST, 0x00007900); - - tve_writel(TV_FREQ_SC, 0x21F07BD7); - tve_writel(TV_SYNC_TIMING, 0x00C07a81); - tve_writel(TV_ADJ_TIMING, 0x96B40000); - tve_writel(TV_ACT_ST, 0x001500D6); - tve_writel(TV_ACT_TIMING, 0x169800FC | (1 << 12) | (1 << 28)); - - } else if (mode == TVOUT_CVBS_PAL) { - tve_writel(TV_ROUTING, v_DAC_SENSE_EN(0) | v_Y_IRE_7_5(0) | - v_Y_AGC_PULSE_ON(0) | v_Y_VIDEO_ON(1) | - v_YPP_MODE(1) | v_Y_SYNC_ON(1) | v_PIC_MODE(mode)); - tve_writel(TV_BW_CTRL, v_CHROMA_BW(BP_FILTER_PAL) | - v_COLOR_DIFF_BW(COLOR_DIFF_FILTER_BW_1_3)); - - tve_writel(TV_SATURATION, tve_s.saturation); - tve_writel(TV_BRIGHTNESS_CONTRAST, tve_s.brightcontrast); - - tve_writel(TV_FREQ_SC, 0x2A098ACB); - tve_writel(TV_SYNC_TIMING, 0x00C28381); - tve_writel(TV_ADJ_TIMING, (0xc << 28) | 0x06c00800 | 0x80); - tve_writel(TV_ACT_ST, 0x001500F6); - tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28)); - - tve_writel(TV_ADJ_TIMING, tve_s.adjtiming); - tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28)); - } -} - -static u8 rk_get_vdac_value(void) -{ - u8 value = 0; -#ifdef CONFIG_ROCKCHIP_EFUSE -#if defined(CONFIG_ROCKCHIP_RK322X) - struct udevice *dev; - u32 regs[2] = {0}; - u8 fuses[1]; - ofnode node; - int ret; - - ret = uclass_get_device_by_driver(UCLASS_MISC, - DM_GET_DRIVER(rockchip_efuse), &dev); - if (ret) { - printf("%s: no misc-device found\n", __func__); - return -EINVAL; - } - - node = dev_read_subnode(dev, "tve_dac"); - if (!ofnode_valid(node)) - return -EINVAL; - - ret = ofnode_read_u32_array(node, "reg", regs, 2); - if (ret) { - printf("Cannot get efuse reg\n"); - return -EINVAL; - } - - ret = misc_read(dev, regs[0], &fuses, regs[1]); - if (ret) { - printf("%s: misc_read failed\n", __func__); - return 0; - } - - value = fuses[0]; - value = (value >> 3) & 0x1f; -#endif -#endif /* CONFIG_RK_EFUSE */ - if (value > 0) - value += 5; - TVEDBG("%s value = 0x%x\n", __func__, value); - - return value; -} - -static int rockchip_drm_tve_init(struct rockchip_connector *conn, struct display_state *state) -{ - int node = 0; - int dac_value, getvdac; - fdt_addr_t addr; - - tve_s.grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); - if (tve_s.grf <= 0) { - printf("%s:Get syscon grf failed (ret=%p)\n", - __func__, tve_s.grf); - return -ENXIO; - } - -#if defined(CONFIG_ROCKCHIP_RK3036) - addr = dev_read_addr_index(conn->dev, 0); - if (addr == FDT_ADDR_T_NONE) - return -EINVAL; - - tve_s.reg_phy_base = (void *)addr; - tve_s.soctype = SOC_RK3036; - node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, - "rockchip,rk3036-tve"); - if (node < 0) { - printf("can't find dts node for rk3036-tve\n"); - goto err; - } -#elif defined(CONFIG_ROCKCHIP_RK3128) - addr = dev_read_addr_index(conn->dev, 0); - if (addr == FDT_ADDR_T_NONE) - return -EINVAL; - - tve_s.reg_phy_base = (void *)addr; - tve_s.soctype = SOC_RK312X; - tve_s.saturation = 0; - node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, - "rockchip,rk312x-tve"); - if (node < 0) { - printf("can't find dts node for rk312x-tve\n"); - goto err; - } -#elif defined(CONFIG_ROCKCHIP_RK322X) - addr = dev_read_addr_index(conn->dev, 0); - if (addr == FDT_ADDR_T_NONE) - return -EINVAL; - - tve_s.reg_phy_base = (void *)addr; - tve_s.soctype = SOC_RK322X; - tve_s.saturation = 0; - - addr = dev_read_addr_index(conn->dev, 1); - if (addr == FDT_ADDR_T_NONE) - return -EINVAL; - tve_s.vdacbase = (void *)addr; - node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, - "rockchip,rk3328-tve"); - if (node < 0) { - printf("can't find dts node for rk322x-tve\n"); - goto err; - } -#elif defined(CONFIG_ROCKCHIP_RK3328) - addr = dev_read_addr_index(conn->dev, 0); - if (addr == FDT_ADDR_T_NONE) - return -EINVAL; - - tve_s.reg_phy_base = (void *)addr; - tve_s.soctype = SOC_RK322XH; - - addr = dev_read_addr_index(conn->dev, 1); - if (addr == FDT_ADDR_T_NONE) - return -EINVAL; - tve_s.vdacbase = (void *)addr; - - node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, - "rockchip,rk3328-tve"); - if (node < 0) { - printf("can't find dts node for rk322xh-tve\n"); - goto err; - } -#endif - - if (!fdtdec_get_is_enabled(gd->fdt_blob, node)) { - printf("tve is disabled\n"); - goto err; - } - - if (tve_s.soctype == SOC_RK312X) - tve_s.test_mode = fdtdec_get_int(gd->fdt_blob, node, - "test_mode", 0); - - tve_s.preferred_mode = fdtdec_get_int(gd->fdt_blob, node, - "rockchip,tvemode", -1); - if (tve_s.preferred_mode < 0) { - tve_s.preferred_mode = 0; - } else if (tve_s.preferred_mode > 1) { - printf("tve mode value invalid\n"); - goto err; - } - - tve_s.saturation = fdtdec_get_int(gd->fdt_blob, node, - "rockchip,saturation", 0); - if (tve_s.saturation == 0) { - printf("tve saturation err\n"); - goto err; - } - - tve_s.brightcontrast = fdtdec_get_int(gd->fdt_blob, node, - "rockchip,brightcontrast", 0); - if (tve_s.brightcontrast == 0) { - printf("tve brightcontrast err\n"); - goto err; - } - - tve_s.adjtiming = fdtdec_get_int(gd->fdt_blob, node, - "rockchip,adjtiming", 0); - if (tve_s.adjtiming == 0) { - printf("tve adjtiming err\n"); - goto err; - } - - tve_s.lumafilter0 = fdtdec_get_int(gd->fdt_blob, node, - "rockchip,lumafilter0", 0); - if (tve_s.lumafilter0 == 0) { - printf("tve lumafilter0 err\n"); - goto err; - } - - tve_s.lumafilter1 = fdtdec_get_int(gd->fdt_blob, node, - "rockchip,lumafilter1", 0); - if (tve_s.lumafilter1 == 0) { - printf("tve lumafilter1 err\n"); - goto err; - } - - tve_s.lumafilter2 = fdtdec_get_int(gd->fdt_blob, node, - "rockchip,lumafilter2", 0); - if (tve_s.lumafilter2 == 0) { - printf("tve lumafilter2 err\n"); - goto err; - } - - dac_value = fdtdec_get_int(gd->fdt_blob, node, "rockchip,daclevel", 0); - if (dac_value == 0) { - printf("tve dac_value err\n"); - goto err; - } - - tve_s.daclevel = dac_value; - if (tve_s.soctype == SOC_RK322X) { - getvdac = rk_get_vdac_value(); - if (getvdac > 0) { - tve_s.daclevel = - dac_value + getvdac - RK322X_VDAC_STANDARD; - if (tve_s.daclevel > 0x3f || - tve_s.daclevel < 0) { - printf("rk322x daclevel error!\n"); - tve_s.daclevel = dac_value; - } - } else if (getvdac < 0) { - printf("get rk322x daclevel error\n"); - goto err; - } - } - - if (tve_s.soctype == SOC_RK322X || - tve_s.soctype == SOC_RK322XH) { - tve_s.dac1level = fdtdec_get_int(gd->fdt_blob, node, - "rockchip,dac1level", 0); - if (tve_s.dac1level == 0) { - printf("rk322x dac1level error!\n"); - goto err; - } - } - TVEDBG("tve_s.test_mode = 0x%x\n", tve_s.test_mode); - TVEDBG("tve_s.saturation = 0x%x\n", tve_s.saturation); - TVEDBG("tve_s.brightcontrast = 0x%x\n", tve_s.brightcontrast); - TVEDBG("tve_s.adjtiming = 0x%x\n", tve_s.adjtiming); - TVEDBG("tve_s.lumafilter0 = 0x%x\n", tve_s.lumafilter0); - TVEDBG("tve_s.lumafilter1 = 0x%x\n", tve_s.lumafilter1); - TVEDBG("tve_s.lumafilter2 = 0x%x\n", tve_s.lumafilter2); - TVEDBG("tve_s.daclevel = 0x%x\n", tve_s.daclevel); - - return 0; - -err: - dac_enable(0); - return -ENODEV; -} - -static int rockchip_drm_tve_enable(struct rockchip_connector *conn, struct display_state *state) -{ - struct connector_state *conn_state = &state->conn_state; - struct drm_display_mode *mode = &conn_state->mode; - int tve_type; - -#ifdef CONFIG_ROCKCHIP_INNO_HDMI_PHY - /* set inno hdmi phy clk. */ - rockchip_phy_set_pll(conn->phy, 27000000); -#endif - if (mode->vdisplay == 576) - tve_type = TVOUT_CVBS_PAL; - else - tve_type = TVOUT_CVBS_NTSC; - dac_enable(0); - tve_set_mode(tve_type); - dac_enable(1); - - return 0; -} - -static void rockchip_drm_tve_deinit(struct rockchip_connector *conn, struct display_state *state) -{ - dac_enable(0); -} - -static int rockchip_drm_tve_prepare(struct rockchip_connector *conn, struct display_state *state) -{ - return 0; -} - -static int rockchip_drm_tve_disable(struct rockchip_connector *conn, struct display_state *state) -{ - dac_enable(0); - return 0; -} - -static int rockchip_drm_tve_detect(struct rockchip_connector *conn, struct display_state *state) -{ - return 1; -} - -static void drm_tve_selete_output(struct overscan *overscan, - struct drm_display_mode *mode) -{ - int ret, i, screen_size; - struct base_screen_info *screen_info = NULL; - struct base_disp_info base_parameter; - struct drm_display_mode modes[2]; - const struct base_overscan *scan; - char baseparameter_buf[8 * RK_BLK_SIZE] __aligned(ARCH_DMA_MINALIGN); - struct blk_desc *dev_desc; - disk_partition_t part_info; - int max_scan = 100; - int min_scan = 50; - - overscan->left_margin = max_scan; - overscan->right_margin = max_scan; - overscan->top_margin = max_scan; - overscan->bottom_margin = max_scan; - - for (i = 0; i < 2; i++) { - modes[i] = tve_modes[i]; - if (i == tve_s.preferred_mode) - modes[i].type |= DRM_MODE_TYPE_PREFERRED; - } - *mode = modes[tve_s.preferred_mode]; - - dev_desc = rockchip_get_bootdev(); - if (!dev_desc) { - printf("%s: Could not find device\n", __func__); - return; - } - - if (part_get_info_by_name(dev_desc, "baseparameter", &part_info) < 0) { - printf("Could not find baseparameter partition\n"); - return; - } - - ret = blk_dread(dev_desc, part_info.start, 1, - (void *)baseparameter_buf); - if (ret < 0) { - printf("read baseparameter failed\n"); - return; - } - - memcpy(&base_parameter, baseparameter_buf, sizeof(base_parameter)); - scan = &base_parameter.scan; - - screen_size = sizeof(base_parameter.screen_list) / - sizeof(base_parameter.screen_list[0]); - - for (i = 0; i < screen_size; i++) { - if (base_parameter.screen_list[i].type == - DRM_MODE_CONNECTOR_TV) { - screen_info = &base_parameter.screen_list[i]; - break; - } - } - - if (scan->leftscale < min_scan && scan->leftscale > 0) - overscan->left_margin = min_scan; - else if (scan->leftscale < max_scan) - overscan->left_margin = scan->leftscale; - - if (scan->rightscale < min_scan && scan->rightscale > 0) - overscan->right_margin = min_scan; - else if (scan->rightscale < max_scan) - overscan->right_margin = scan->rightscale; - - if (scan->topscale < min_scan && scan->topscale > 0) - overscan->top_margin = min_scan; - else if (scan->topscale < max_scan) - overscan->top_margin = scan->topscale; - - if (scan->bottomscale < min_scan && scan->bottomscale > 0) - overscan->bottom_margin = min_scan; - else if (scan->bottomscale < max_scan) - overscan->bottom_margin = scan->bottomscale; - - if (screen_info && - (screen_info->mode.hdisplay == 720 && - screen_info->mode.vdisplay == 576 && - screen_info->mode.hsync_start == 753 && - screen_info->mode.hsync_end == 816)) - *mode = modes[0]; - else if (screen_info && - screen_info->mode.vdisplay == 480 && - screen_info->mode.vsync_start == 480 && - screen_info->mode.vsync_end == 486) - *mode = modes[1]; - - if (screen_info) - printf("base_parameter.mode:%dx%d\n", - screen_info->mode.hdisplay, - screen_info->mode.vdisplay); -} - -static int rockchip_drm_tve_get_timing(struct rockchip_connector *conn, struct display_state *state) -{ - struct connector_state *conn_state = &state->conn_state; - struct drm_display_mode *mode = &conn_state->mode; - - conn_state->output_mode = ROCKCHIP_OUT_MODE_P888; - conn_state->bus_format = MEDIA_BUS_FMT_YUV8_1X24; - drm_tve_selete_output(&conn_state->overscan, mode); - - return 0; -} - -const struct rockchip_connector_funcs rockchip_drm_tve_funcs = { - .init = rockchip_drm_tve_init, - .deinit = rockchip_drm_tve_deinit, - .prepare = rockchip_drm_tve_prepare, - .enable = rockchip_drm_tve_enable, - .disable = rockchip_drm_tve_disable, - .get_timing = rockchip_drm_tve_get_timing, - .detect = rockchip_drm_tve_detect, -}; - -static int rockchip_drm_tve_probe(struct udevice *dev) -{ - struct rockchip_connector *conn = dev_get_priv(dev); - - rockchip_connector_bind(conn, dev, 0, &rockchip_drm_tve_funcs, NULL, - DRM_MODE_CONNECTOR_TV); - - return 0; -} - -static const struct udevice_id rockchip_drm_tve_ids[] = { - { - .compatible = "rockchip,rk3328-tve", - }, {} -}; - -U_BOOT_DRIVER(rockchip_drm_tve) = { - .name = "rockchip_drm_tve", - .id = UCLASS_DISPLAY, - .of_match = rockchip_drm_tve_ids, - .probe = rockchip_drm_tve_probe, - .priv_auto_alloc_size = sizeof(struct rockchip_connector), -}; diff --git a/u-boot/drivers/video/drm/rockchip_drm_tve.h b/u-boot/drivers/video/drm/rockchip_drm_tve.h deleted file mode 100644 index 2d504a6..0000000 --- a/u-boot/drivers/video/drm/rockchip_drm_tve.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * SPDX-License-Identifier: GPL-2.0+ - * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd - */ -#ifndef __ROCKCHIP_DRM_TVE_H__ -#define __ROCKCHIP_DRM_TVE_H__ - -#include <lcd.h> - -#define TV_CTRL (0x00) - #define m_CVBS_MODE BIT(24) - #define m_CLK_UPSTREAM_EN (3 << 18) - #define m_TIMING_EN (3 << 16) - #define m_LUMA_FILTER_GAIN (3 << 9) - #define m_LUMA_FILTER_BW BIT(8) - #define m_CSC_PATH (3 << 1) - - #define v_CVBS_MODE(x) ((x & 1) << 24) - #define v_CLK_UPSTREAM_EN(x) ((x & 3) << 18) - #define v_TIMING_EN(x) ((x & 3) << 16) - #define v_LUMA_FILTER_GAIN(x) ((x & 3) << 9) - #define v_LUMA_FILTER_UPSAMPLE(x) ((x & 1) << 8) - #define v_CSC_PATH(x) ((x & 3) << 1) - -#define TV_SYNC_TIMING (0x04) -#define TV_ACT_TIMING (0x08) -#define TV_ADJ_TIMING (0x0c) -#define TV_FREQ_SC (0x10) -#define TV_LUMA_FILTER0 (0x14) -#define TV_LUMA_FILTER1 (0x18) -#define TV_LUMA_FILTER2 (0x1C) -#define TV_ACT_ST (0x34) -#define TV_ROUTING (0x38) - #define m_DAC_SENSE_EN BIT(27) - #define m_Y_IRE_7_5 BIT(19) - #define m_Y_AGC_PULSE_ON BIT(15) - #define m_Y_VIDEO_ON BIT(11) - #define m_Y_SYNC_ON BIT(7) - #define m_YPP_MODE BIT(3) - #define m_MONO_EN BIT(2) - #define m_PIC_MODE BIT(1) - - #define v_DAC_SENSE_EN(x) ((x & 1) << 27) - #define v_Y_IRE_7_5(x) ((x & 1) << 19) - #define v_Y_AGC_PULSE_ON(x) ((x & 1) << 15) - #define v_Y_VIDEO_ON(x) ((x & 1) << 11) - #define v_Y_SYNC_ON(x) ((x & 1) << 7) - #define v_YPP_MODE(x) ((x & 1) << 3) - #define v_MONO_EN(x) ((x & 1) << 2) - #define v_PIC_MODE(x) ((x & 1) << 1) - -#define TV_SYNC_ADJUST (0x50) -#define TV_STATUS (0x54) -#define TV_RESET (0x68) - #define m_RESET BIT(1) - #define v_RESET(x) ((x & 1) << 1) -#define TV_SATURATION (0x78) -#define TV_BW_CTRL (0x8C) - #define m_CHROMA_BW (3 << 4) - #define m_COLOR_DIFF_BW (0xf) - - enum { - BP_FILTER_PASS = 0, - BP_FILTER_NTSC, - BP_FILTER_PAL, - }; - enum { - COLOR_DIFF_FILTER_OFF = 0, - COLOR_DIFF_FILTER_BW_0_6, - COLOR_DIFF_FILTER_BW_1_3, - COLOR_DIFF_FILTER_BW_2_0 - }; - - #define v_CHROMA_BW(x) ((3 & x) << 4) - #define v_COLOR_DIFF_BW(x) (0xF & x) - -#define TV_BRIGHTNESS_CONTRAST (0x90) - -#define m_EXTREF_EN BIT(0) -#define m_VBG_EN BIT(1) -#define m_DAC_EN BIT(2) -#define m_SENSE_EN BIT(3) -#define m_BIAS_EN (7 << 4) -#define m_DAC_GAIN (0x3f << 7) -#define v_DAC_GAIN(x) ((x & 0x3f) << 7) - -#define VDAC_VDAC0 (0x00) - #define m_RST_ANA BIT(7) - #define m_RST_DIG BIT(6) - - #define v_RST_ANA(x) ((x & 1) << 7) - #define v_RST_DIG(x) ((x & 1) << 6) -#define VDAC_VDAC1 (0x280) - #define m_CUR_REG (0xf << 4) - #define m_DR_PWR_DOWN BIT(1) - #define m_BG_PWR_DOWN BIT(0) - - #define v_CUR_REG(x) ((x & 0xf) << 4) - #define v_DR_PWR_DOWN(x) ((x & 1) << 1) - #define v_BG_PWR_DOWN(x) ((x & 1) << 0) -#define VDAC_VDAC2 (0x284) - #define m_CUR_CTR (0X3f) - - #define v_CUR_CTR(x) ((x & 0X3f)) -#define VDAC_VDAC3 (0x288) - #define m_CAB_EN BIT(5) - #define m_CAB_REF BIT(4) - #define m_CAB_FLAG BIT(0) - - #define v_CAB_EN(x) ((x & 1) << 5) - #define v_CAB_REF(x) ((x & 1) << 4) - #define v_CAB_FLAG(x) ((x & 1) << 0) - -enum { - TVOUT_CVBS_NTSC = 0, - TVOUT_CVBS_PAL, -}; - -enum { - SOC_RK3036 = 0, - SOC_RK312X, - SOC_RK322X, - SOC_RK322XH -}; - -struct drm_tve { - void *reg_phy_base; - int soctype; - int test_mode; - int saturation; - void *vdacbase; - int brightcontrast; - int adjtiming; - int lumafilter0; - int lumafilter1; - int lumafilter2; - int daclevel; - int dac1level; - int preferred_mode; - void *grf; -}; - -#define RK30_TVE_REGBASE 0x10118000 + 0x200 -#define MAX_TVE_COUNT 2 - -#ifdef TVEDEBUG -#define TVEDBG(format, ...) \ - printf("TVE: " format, ## __VA_ARGS__) -#else -#define TVEDBG(format, ...) -#endif - -#endif /* __ROCKCHIP_DRM_TVE_H__*/ diff --git a/u-boot/drivers/video/drm/rockchip_dw_hdmi.c b/u-boot/drivers/video/drm/rockchip_dw_hdmi.c index 3a3169c..6e6139f 100644 --- a/u-boot/drivers/video/drm/rockchip_dw_hdmi.c +++ b/u-boot/drivers/video/drm/rockchip_dw_hdmi.c @@ -7,6 +7,7 @@ #include <common.h> #include <boot_rkimg.h> #include <asm/io.h> +#include <asm/gpio.h> #include <dm/of_access.h> #include <dm/device.h> #include <linux/dw_hdmi.h> @@ -35,6 +36,19 @@ #define RK3328_GRF_SOC_CON2 0x0408 #define RK3328_GRF_SOC_CON3 0x040c #define RK3328_GRF_SOC_CON4 0x0410 + +#define RK3528_GPIO0A_IOMUX_SEL_H 0x4 +#define RK3528_GPIO0A_PULL 0x200 +#define RK3528_DDC_PULL (0xf00 << 16) +#define RK3528_VO_GRF_HDMI_MASK 0x60014 +#define RK3528_HDMI_SNKDET_SEL ((BIT(6) << 16) | BIT(6)) +#define RK3528_HDMI_SNKDET BIT(21) +#define RK3528_HDMI_CECIN_MSK ((BIT(2) << 16) | BIT(2)) +#define RK3528_HDMI_SDAIN_MSK ((BIT(1) << 16) | BIT(1)) +#define RK3528_HDMI_SCLIN_MSK ((BIT(0) << 16) | BIT(0)) + +#define RK3528_GPIO_SWPORT_DR_L 0x0000 +#define RK3528_GPIO0_A2_DR ((BIT(2) << 16) | BIT(2)) #define RK3568_GRF_VO_CON1 0x0364 #define RK3568_HDMI_SDAIN_MSK ((1 << 15) | (1 << (15 + 16))) @@ -177,7 +191,7 @@ } }; -static const struct dw_hdmi_phy_config rockchip_phy_config[] = { +static struct dw_hdmi_phy_config rockchip_phy_config[] = { /*pixelclk symbol term vlev*/ { 74250000, 0x8009, 0x0004, 0x0272}, { 165000000, 0x802b, 0x0004, 0x0209}, @@ -334,19 +348,23 @@ enum dw_hdmi_devtype dev_type, bool output_bus_format_rgb) { - int ret, i, screen_size; - struct base_disp_info base_parameter; struct base2_disp_info *base2_parameter = conn_state->disp_info; const struct base_overscan *scan; struct base_screen_info *screen_info = NULL; struct base2_screen_info *screen_info2 = NULL; int max_scan = 100; int min_scan = 51; +#ifdef CONFIG_SPL_BUILD + int i, screen_size; +#else + int ret, i, screen_size; int offset = 0; bool found = false; struct blk_desc *dev_desc; disk_partition_t part_info; char baseparameter_buf[8 * RK_BLK_SIZE] __aligned(ARCH_DMA_MINALIGN); + struct base_disp_info base_parameter; +#endif overscan->left_margin = max_scan; overscan->right_margin = max_scan; @@ -358,6 +376,27 @@ else *bus_format = MEDIA_BUS_FMT_YUV8_1X24; +#ifdef CONFIG_SPL_BUILD + scan = &base2_parameter->overscan_info; + screen_size = sizeof(base2_parameter->screen_info) / + sizeof(base2_parameter->screen_info[0]); + + for (i = 0; i < screen_size; i++) { + if (base2_parameter->screen_info[i].type == + DRM_MODE_CONNECTOR_HDMIA) { + screen_info2 = + &base2_parameter->screen_info[i]; + break; + } + } + screen_info = malloc(sizeof(*screen_info)); + + screen_info->type = screen_info2->type; + screen_info->mode = screen_info2->resolution; + screen_info->format = screen_info2->format; + screen_info->depth = screen_info2->depthc; + screen_info->feature = screen_info2->feature; +#else if (!base2_parameter) { dev_desc = rockchip_get_bootdev(); if (!dev_desc) { @@ -422,6 +461,7 @@ screen_info->depth = screen_info2->depthc; screen_info->feature = screen_info2->feature; } +#endif if (scan->leftscale < min_scan && scan->leftscale > 0) overscan->left_margin = min_scan; @@ -443,7 +483,9 @@ else if (scan->bottomscale < max_scan && scan->bottomscale > 0) overscan->bottom_margin = scan->bottomscale; +#ifndef CONFIG_SPL_BUILD null_basep: +#endif if (screen_info) printf("base_parameter.mode:%dx%d\n", @@ -463,8 +505,15 @@ writel(RK3328_IO_3V_DOMAIN, grf + RK3328_GRF_SOC_CON4); } -void dw_hdmi_set_iomux(void *grf, int dev_type) +void dw_hdmi_set_iomux(void *grf, void *gpio_base, struct gpio_desc *hpd_gpiod, + int dev_type) { + u32 val = 0; + int i = 400; +#ifdef CONFIG_SPL_BUILD + void *gpio0_ioc = (void *)RK3528_GPIO0_IOC_BASE; +#endif + switch (dev_type) { case RK3328_HDMI: writel(RK3328_IO_DDC_IN_MSK, grf + RK3328_GRF_SOC_CON2); @@ -473,6 +522,49 @@ case RK3228_HDMI: writel(RK3228_IO_3V_DOMAIN, grf + RK3228_GRF_SOC_CON6); writel(RK3228_IO_DDC_IN_MSK, grf + RK3228_GRF_SOC_CON2); + break; + case RK3528_HDMI: + writel(RK3528_HDMI_SDAIN_MSK | RK3528_HDMI_SCLIN_MSK | + RK3528_HDMI_SNKDET_SEL, + grf + RK3528_VO_GRF_HDMI_MASK); + +#ifdef CONFIG_SPL_BUILD + val = (0x11 << 16) | 0x11; + writel(val, gpio0_ioc + RK3528_GPIO0A_IOMUX_SEL_H); + + writel(RK3528_DDC_PULL, gpio0_ioc + RK3528_GPIO0A_PULL); + + /* gpio0_a2's input enable is controlled by gpio output data bit */ + writel(RK3528_GPIO0_A2_DR, gpio_base + RK3528_GPIO_SWPORT_DR_L); + + while (i--) { + val = readl(gpio_base + 0x70) & BIT(2); + if (val) + break; + mdelay(5); + } +#else + writel(val, grf + RK3528_VO_GRF_HDMI_MASK); + + /* gpio0_a2's input enable is controlled by gpio output data bit */ + writel(RK3528_GPIO0_A2_DR, gpio_base + RK3528_GPIO_SWPORT_DR_L); + + if (dm_gpio_is_valid(hpd_gpiod)) { + while (i--) { + val = dm_gpio_get_value(hpd_gpiod); + if (val) + break; + mdelay(5); + } + } +#endif + + if (val) + val = RK3528_HDMI_SNKDET | BIT(5); + else + val = RK3528_HDMI_SNKDET; + writel(val, grf + RK3528_VO_GRF_HDMI_MASK); + break; case RK3568_HDMI: writel(RK3568_HDMI_SDAIN_MSK | RK3568_HDMI_SCLIN_MSK, @@ -544,6 +636,14 @@ .dev_type = RK3399_HDMI, }; +const struct dw_hdmi_plat_data rk3528_hdmi_drv_data = { + .vop_sel_bit = 0, + .grf_vop_sel_reg = 0, + .phy_ops = &inno_dw_hdmi_phy_ops, + .phy_name = "inno_dw_hdmi_phy2", + .dev_type = RK3528_HDMI, +}; + const struct dw_hdmi_plat_data rk3568_hdmi_drv_data = { .vop_sel_bit = 0, .grf_vop_sel_reg = 0, @@ -554,6 +654,19 @@ .dev_type = RK3568_HDMI, }; +#ifdef CONFIG_SPL_BUILD +int rockchip_spl_dw_hdmi_probe(struct connector_state *conn_state) +{ + conn_state->connector = malloc(sizeof(struct rockchip_connector)); + + memset(conn_state->connector, 0, sizeof(*conn_state->connector)); + rockchip_connector_bind(conn_state->connector, NULL, 0, &rockchip_dw_hdmi_funcs, + (void *)&rk3528_hdmi_drv_data, + DRM_MODE_CONNECTOR_HDMIA); + + return 0; +} +#else static int rockchip_dw_hdmi_probe(struct udevice *dev) { int id; @@ -568,9 +681,13 @@ return 0; } +#endif static const struct udevice_id rockchip_dw_hdmi_ids[] = { { + .compatible = "rockchip,rk3528-dw-hdmi", + .data = (ulong)&rk3528_hdmi_drv_data, + }, { .compatible = "rockchip,rk3568-dw-hdmi", .data = (ulong)&rk3568_hdmi_drv_data, }, { @@ -598,6 +715,8 @@ .name = "rockchip_dw_hdmi", .id = UCLASS_DISPLAY, .of_match = rockchip_dw_hdmi_ids, +#ifndef CONFIG_SPL_BUILD .probe = rockchip_dw_hdmi_probe, +#endif .priv_auto_alloc_size = sizeof(struct rockchip_connector), }; diff --git a/u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c b/u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c index 13c8f47..32dc484 100644 --- a/u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c +++ b/u-boot/drivers/video/drm/rockchip_dw_hdmi_qp.c @@ -50,6 +50,7 @@ #define RK3588_GRF_VO1_CON3 0x000c #define RK3588_COLOR_FORMAT_MASK 0xf +#define RK3588_YUV422 0x1 #define RK3588_YUV444 0x2 #define RK3588_YUV420 0x3 #define RK3588_COMPRESSED_DATA 0xb @@ -348,6 +349,9 @@ case MEDIA_BUS_FMT_UYVY8_1X16: case MEDIA_BUS_FMT_UYVY10_1X20: case MEDIA_BUS_FMT_UYVY12_1X24: + case MEDIA_BUS_FMT_YUYV8_1X16: + case MEDIA_BUS_FMT_YUYV10_1X20: + case MEDIA_BUS_FMT_YUYV12_1X24: return true; default: @@ -375,18 +379,21 @@ case MEDIA_BUS_FMT_RGB888_1X24: case MEDIA_BUS_FMT_YUV8_1X24: case MEDIA_BUS_FMT_UYVY8_1X16: + case MEDIA_BUS_FMT_YUYV8_1X16: case MEDIA_BUS_FMT_UYYVYY8_0_5X24: return 8; case MEDIA_BUS_FMT_RGB101010_1X30: case MEDIA_BUS_FMT_YUV10_1X30: case MEDIA_BUS_FMT_UYVY10_1X20: + case MEDIA_BUS_FMT_YUYV10_1X20: case MEDIA_BUS_FMT_UYYVYY10_0_5X30: return 10; case MEDIA_BUS_FMT_RGB121212_1X36: case MEDIA_BUS_FMT_YUV12_1X36: case MEDIA_BUS_FMT_UYVY12_1X24: + case MEDIA_BUS_FMT_YUYV12_1X24: case MEDIA_BUS_FMT_UYYVYY12_0_5X36: return 12; @@ -834,12 +841,8 @@ if (screen_info && screen_info->depth == 10) color_depth = screen_info->depth; - if (mode->clock >= 600000) { + if (mode->clock >= 600000) color_format = DRM_HDMI_OUTPUT_YCBCR420; - } else if (mode->clock >= 340000) { - if (drm_mode_is_420(info, mode)) - color_format = DRM_HDMI_OUTPUT_YCBCR420; - } if (color_format == DRM_HDMI_OUTPUT_YCBCR422 || color_depth == 8) tmdsclock = pixclock; @@ -876,7 +879,7 @@ case DRM_HDMI_OUTPUT_YCBCR444: return MEDIA_BUS_FMT_YUV10_1X30; case DRM_HDMI_OUTPUT_YCBCR422: - return MEDIA_BUS_FMT_UYVY10_1X20; + return MEDIA_BUS_FMT_YUYV10_1X20; case DRM_HDMI_OUTPUT_YCBCR420: return MEDIA_BUS_FMT_UYYVYY10_0_5X30; default: @@ -887,7 +890,7 @@ case DRM_HDMI_OUTPUT_YCBCR444: return MEDIA_BUS_FMT_YUV8_1X24; case DRM_HDMI_OUTPUT_YCBCR422: - return MEDIA_BUS_FMT_UYVY8_1X16; + return MEDIA_BUS_FMT_YUYV8_1X16; case DRM_HDMI_OUTPUT_YCBCR420: return MEDIA_BUS_FMT_UYYVYY8_0_5X24; default: @@ -1081,7 +1084,7 @@ if (hdmi_bus_fmt_is_yuv420(*bus_format)) hdmi->bus_width /= 2; - if (color_depth == 10) + if (color_depth == 10 && !hdmi_bus_fmt_is_yuv422(*bus_format)) hdmi->bus_width |= COLOR_DEPTH_10BIT; } @@ -1154,6 +1157,10 @@ case MEDIA_BUS_FMT_YUV10_1X30: val = HIWORD_UPDATE(RK3588_YUV444, RK3588_COLOR_FORMAT_MASK); break; + case MEDIA_BUS_FMT_YUYV10_1X20: + case MEDIA_BUS_FMT_YUYV8_1X16: + val = HIWORD_UPDATE(RK3588_YUV422, RK3588_COLOR_FORMAT_MASK); + break; default: dev_err(hdmi->dev, "can't set correct color format\n"); return; @@ -1162,7 +1169,7 @@ if (hdmi->link_cfg.dsc_mode) val = HIWORD_UPDATE(RK3588_COMPRESSED_DATA, RK3588_COLOR_FORMAT_MASK); - if (depth == 8) + if (depth == 8 || bus_format == MEDIA_BUS_FMT_YUYV10_1X20) val |= HIWORD_UPDATE(RK3588_8BPC, RK3588_COLOR_DEPTH_MASK); else val |= HIWORD_UPDATE(RK3588_10BPC, RK3588_COLOR_DEPTH_MASK); diff --git a/u-boot/drivers/video/drm/rockchip_lvds.c b/u-boot/drivers/video/drm/rockchip_lvds.c index ffacd49..d7acbe4 100644 --- a/u-boot/drivers/video/drm/rockchip_lvds.c +++ b/u-boot/drivers/video/drm/rockchip_lvds.c @@ -59,6 +59,9 @@ #define RK3368_LVDS_MSBSEL(x) HIWORD_UPDATE(x, 11, 11) #define RK3368_LVDS_P2S_EN(x) HIWORD_UPDATE(x, 6, 6) +#define RK3562_GRF_VO_CON0 0x05d0 +#define RK3562_GRF_VO_CON1 0x05d4 + #define RK3568_GRF_VO_CON0 0x0360 #define RK3568_LVDS1_SELECT(x) HIWORD_UPDATE(x, 13, 12) #define RK3568_LVDS1_MSBSEL(x) HIWORD_UPDATE(x, 11, 11) @@ -307,6 +310,25 @@ .disable = rk3368_lvds_disable, }; +static void rk3562_lvds_enable(struct rockchip_lvds *lvds, int pipe) +{ + regmap_write(lvds->grf, RK3562_GRF_VO_CON1, + RK3568_LVDS0_MODE_EN(1) | RK3568_LVDS0_P2S_EN(1) | + RK3568_LVDS0_DCLK_INV_SEL(1)); + regmap_write(lvds->grf, RK3562_GRF_VO_CON0, + RK3568_LVDS0_SELECT(lvds->format) | RK3568_LVDS0_MSBSEL(1)); +} + +static void rk3562_lvds_disable(struct rockchip_lvds *lvds) +{ + regmap_write(lvds->grf, RK3562_GRF_VO_CON1, RK3568_LVDS0_MODE_EN(0)); +} + +static const struct rockchip_lvds_funcs rk3562_lvds_funcs = { + .enable = rk3562_lvds_enable, + .disable = rk3562_lvds_disable, +}; + static void rk3568_lvds_enable(struct rockchip_lvds *lvds, int pipe) { regmap_write(lvds->grf, RK3568_GRF_VO_CON2, @@ -344,6 +366,10 @@ .data = (ulong)&rk3368_lvds_funcs, }, { + .compatible = "rockchip,rk3562-lvds", + .data = (ulong)&rk3562_lvds_funcs, + }, + { .compatible = "rockchip,rk3568-lvds", .data = (ulong)&rk3568_lvds_funcs, }, diff --git a/u-boot/drivers/video/drm/rockchip_panel.c b/u-boot/drivers/video/drm/rockchip_panel.c index 570bc99..5203371 100755 --- a/u-boot/drivers/video/drm/rockchip_panel.c +++ b/u-boot/drivers/video/drm/rockchip_panel.c @@ -12,6 +12,7 @@ #include <malloc.h> #include <video.h> #include <backlight.h> +#include <spi.h> #include <asm/gpio.h> #include <dm/device.h> #include <dm/read.h> @@ -65,6 +66,7 @@ bool enabled; struct udevice *power_supply; struct udevice *backlight; + struct spi_slave *spi_slave; struct gpio_desc enable_gpio; struct gpio_desc reset_gpio; struct gpio_desc edp_bl_on; @@ -197,24 +199,48 @@ { struct rockchip_panel_priv *priv = dev_get_priv(panel->dev); int i; + int ret; if (!cmds) return -EINVAL; + if (priv->spi_slave) { + ret = spi_claim_bus(priv->spi_slave); + if (ret) { + printf("%s: Failed to claim spi bus: %d\n", __func__, ret); + return -EINVAL; + } + } + for (i = 0; i < cmds->cmd_cnt; i++) { struct rockchip_cmd_desc *desc = &cmds->cmds[i]; int value = 0; + u16 mask = 0; + u16 data = 0; - if (desc->header.payload_length == 2) - value = (desc->payload[0] << 8) | desc->payload[1]; - else - value = desc->payload[0]; - rockchip_panel_write_spi_cmds(priv, - desc->header.data_type, value); + if (priv->spi_slave) { + mask = desc->header.data_type ? 0x100 : 0; + data = (mask | desc->payload[0]) << 7;; + data = ((data & 0xff) << 8) | (data >> 8); + value = mask | desc->payload[0]; + ret = spi_xfer(priv->spi_slave, 9, &data, NULL, SPI_XFER_ONCE); + if (ret) + printf("%s: Failed to xfer spi cmd 0x%x: %d\n", + __func__, desc->payload[0], ret); + } else { + if (desc->header.payload_length == 2) + value = (desc->payload[0] << 8) | desc->payload[1]; + else + value = desc->payload[0]; + rockchip_panel_write_spi_cmds(priv, desc->header.data_type, value); + } if (desc->header.delay_ms) mdelay(desc->header.delay_ms); } + + if (priv->spi_slave) + spi_release_bus(priv->spi_slave); return 0; } @@ -336,21 +362,24 @@ if (dm_gpio_is_valid(&priv->edp_bl_en)) dm_gpio_set_value(&priv->edp_bl_en, 1); - + if (dm_gpio_is_valid(&priv->enable_gpio)) dm_gpio_set_value(&priv->enable_gpio, 1); - + if (plat->delay.prepare) mdelay(plat->delay.prepare); - + if (dm_gpio_is_valid(&priv->reset_gpio)) dm_gpio_set_value(&priv->reset_gpio, 1); + + if (plat->delay.reset) + mdelay(plat->delay.reset); mdelay(50); if (dm_gpio_is_valid(&priv->reset_gpio)) dm_gpio_set_value(&priv->reset_gpio, 0); - - mdelay(200); + mdelay(200); + if (plat->delay.init) mdelay(plat->delay.init); @@ -556,7 +585,7 @@ printf("%s: Cannot get reset GPIO: %d\n", __func__, ret); return ret; } - + ret = gpio_request_by_name(dev, "lvds-gpio0", 0, &priv->lvds_gpio0, GPIOD_IS_OUT); if (ret && ret != -ENOENT) { @@ -584,7 +613,7 @@ printf("%s: Cannot get lvds-gpio3: %d\n", __func__, ret); return ret; } - + ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev, "backlight", &priv->backlight); if (ret && ret != -ENOENT) { @@ -606,31 +635,47 @@ priv->cmd_type = get_panel_cmd_type(cmd_type); if (priv->cmd_type == CMD_TYPE_SPI) { - ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0, - &priv->spi_sdi_gpio, GPIOD_IS_OUT); - if (ret && ret != -ENOENT) { - printf("%s: Cannot get spi sdi GPIO: %d\n", - __func__, ret); - return ret; + ofnode parent = ofnode_get_parent(dev->node); + + if (ofnode_valid(parent)) { + struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev); + struct udevice *spi = dev_get_parent(dev); + + if (spi->seq < 0) { + printf("%s: Failed to get spi bus num\n", __func__); + return -EINVAL; + } + + priv->spi_slave = spi_setup_slave(spi->seq, plat->cs, plat->max_hz, + plat->mode); + if (!priv->spi_slave) { + printf("%s: Failed to setup spi slave: %d\n", __func__, ret); + return -EINVAL; + } + } else { + ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0, + &priv->spi_sdi_gpio, GPIOD_IS_OUT); + if (ret && ret != -ENOENT) { + printf("%s: Cannot get spi sdi GPIO: %d\n", __func__, ret); + return ret; + } + ret = gpio_request_by_name(dev, "spi-scl-gpios", 0, + &priv->spi_scl_gpio, GPIOD_IS_OUT); + if (ret && ret != -ENOENT) { + printf("%s: Cannot get spi scl GPIO: %d\n", __func__, ret); + return ret; + } + ret = gpio_request_by_name(dev, "spi-cs-gpios", 0, + &priv->spi_cs_gpio, GPIOD_IS_OUT); + if (ret && ret != -ENOENT) { + printf("%s: Cannot get spi cs GPIO: %d\n", __func__, ret); + return ret; + } + dm_gpio_set_value(&priv->spi_sdi_gpio, 1); + dm_gpio_set_value(&priv->spi_scl_gpio, 1); + dm_gpio_set_value(&priv->spi_cs_gpio, 1); + dm_gpio_set_value(&priv->reset_gpio, 0); } - ret = gpio_request_by_name(dev, "spi-scl-gpios", 0, - &priv->spi_scl_gpio, GPIOD_IS_OUT); - if (ret && ret != -ENOENT) { - printf("%s: Cannot get spi scl GPIO: %d\n", - __func__, ret); - return ret; - } - ret = gpio_request_by_name(dev, "spi-cs-gpios", 0, - &priv->spi_cs_gpio, GPIOD_IS_OUT); - if (ret && ret != -ENOENT) { - printf("%s: Cannot get spi cs GPIO: %d\n", - __func__, ret); - return ret; - } - dm_gpio_set_value(&priv->spi_sdi_gpio, 1); - dm_gpio_set_value(&priv->spi_scl_gpio, 1); - dm_gpio_set_value(&priv->spi_cs_gpio, 1); - dm_gpio_set_value(&priv->reset_gpio, 0); } panel = calloc(1, sizeof(*panel)); @@ -649,6 +694,7 @@ static const struct udevice_id rockchip_panel_ids[] = { { .compatible = "simple-panel", }, { .compatible = "simple-panel-dsi", }, + { .compatible = "simple-panel-spi", }, {} }; diff --git a/u-boot/drivers/video/drm/rockchip_post_csc.c b/u-boot/drivers/video/drm/rockchip_post_csc.c new file mode 100755 index 0000000..2409103 --- /dev/null +++ b/u-boot/drivers/video/drm/rockchip_post_csc.c @@ -0,0 +1,1587 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + * Author: Zhang yubing <yubing.zhang@rock-chips.com> + */ + +#include <stdio.h> +#include <linux/errno.h> + +#include "rockchip_post_csc.h" + +#define PQ_CSC_HUE_TABLE_NUM 256 +#define PQ_CSC_MODE_COEF_COMMENT_LEN 32 +#define PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH 10 +#define PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM (1 << PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH) + +#define PQ_CALC_ENHANCE_BIT 6 +/* csc convert coef fixed-point num bit width */ +#define PQ_CSC_PARAM_FIX_BIT_WIDTH 10 +/* csc convert coef half fixed-point num bit width */ +#define PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH (PQ_CSC_PARAM_FIX_BIT_WIDTH - 1) +/* csc convert coef fixed-point num */ +#define PQ_CSC_PARAM_FIX_NUM (1 << PQ_CSC_PARAM_FIX_BIT_WIDTH) +#define PQ_CSC_PARAM_HALF_FIX_NUM (1 << PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH) +/* csc input param bit width */ +#define PQ_CSC_IN_PARAM_NORM_BIT_WIDTH 9 +/* csc input param normalization coef */ +#define PQ_CSC_IN_PARAM_NORM_COEF (1 << PQ_CSC_IN_PARAM_NORM_BIT_WIDTH) + +/* csc hue table range [0,255] */ +#define PQ_CSC_HUE_TABLE_DIV_COEF 2 +/* csc brightness offset */ +#define PQ_CSC_BRIGHTNESS_OFFSET 256 + +/* dc coef base bit width */ +#define PQ_CSC_DC_COEF_BASE_BIT_WIDTH 10 +/* input dc coef offset for 10bit data */ +#define PQ_CSC_DC_IN_OFFSET 64 +/* input and output dc coef offset for 10bit data u,v */ +#define PQ_CSC_DC_IN_OUT_DEFAULT 512 +/* r,g,b color temp div coef, range [-128,128] for 10bit data */ +#define PQ_CSC_TEMP_OFFSET_DIV_COEF 2 + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define CLIP(x, min_v, max_v) MIN(MAX(x, min_v), max_v) + +enum rk_pq_csc_mode { + RK_PQ_CSC_YUV2RGB_601 = 0, /* YCbCr_601 LIMIT-> RGB FULL */ + RK_PQ_CSC_YUV2RGB_709, /* YCbCr_709 LIMIT-> RGB FULL */ + RK_PQ_CSC_RGB2YUV_601, /* RGB FULL->YCbCr_601 LIMIT */ + RK_PQ_CSC_RGB2YUV_709, /* RGB FULL->YCbCr_709 LIMIT */ + RK_PQ_CSC_YUV2YUV_709_601, /* YCbCr_709 LIMIT->YCbCr_601 LIMIT */ + RK_PQ_CSC_YUV2YUV_601_709, /* YCbCr_601 LIMIT->YCbCr_709 LIMIT */ + RK_PQ_CSC_YUV2YUV, /* YCbCr LIMIT->YCbCr LIMIT */ + RK_PQ_CSC_YUV2RGB_601_FULL, /* YCbCr_601 FULL-> RGB FULL */ + RK_PQ_CSC_YUV2RGB_709_FULL, /* YCbCr_709 FULL-> RGB FULL */ + RK_PQ_CSC_RGB2YUV_601_FULL, /* RGB FULL->YCbCr_601 FULL */ + RK_PQ_CSC_RGB2YUV_709_FULL, /* RGB FULL->YCbCr_709 FULL */ + RK_PQ_CSC_YUV2YUV_709_601_FULL, /* YCbCr_709 FULL->YCbCr_601 FULL */ + RK_PQ_CSC_YUV2YUV_601_709_FULL, /* YCbCr_601 FULL->YCbCr_709 FULL */ + RK_PQ_CSC_YUV2YUV_FULL, /* YCbCr FULL->YCbCr FULL */ + RK_PQ_CSC_YUV2YUV_LIMIT2FULL, /* YCbCr LIMIT->YCbCr FULL */ + RK_PQ_CSC_YUV2YUV_601_709_LIMIT2FULL, /* YCbCr 601 LIMIT->YCbCr 709 FULL */ + RK_PQ_CSC_YUV2YUV_709_601_LIMIT2FULL, /* YCbCr 709 LIMIT->YCbCr 601 FULL */ + RK_PQ_CSC_YUV2YUV_FULL2LIMIT, /* YCbCr FULL->YCbCr LIMIT */ + RK_PQ_CSC_YUV2YUV_601_709_FULL2LIMIT, /* YCbCr 601 FULL->YCbCr 709 LIMIT */ + RK_PQ_CSC_YUV2YUV_709_601_FULL2LIMIT, /* YCbCr 709 FULL->YCbCr 601 LIMIT */ + RK_PQ_CSC_YUV2RGBL_601, /* YCbCr_601 LIMIT-> RGB LIMIT */ + RK_PQ_CSC_YUV2RGBL_709, /* YCbCr_709 LIMIT-> RGB LIMIT */ + RK_PQ_CSC_RGBL2YUV_601, /* RGB LIMIT->YCbCr_601 LIMIT */ + RK_PQ_CSC_RGBL2YUV_709, /* RGB LIMIT->YCbCr_709 LIMIT */ + RK_PQ_CSC_YUV2RGBL_601_FULL, /* YCbCr_601 FULL-> RGB LIMIT */ + RK_PQ_CSC_YUV2RGBL_709_FULL, /* YCbCr_709 FULL-> RGB LIMIT */ + RK_PQ_CSC_RGBL2YUV_601_FULL, /* RGB LIMIT->YCbCr_601 FULL */ + RK_PQ_CSC_RGBL2YUV_709_FULL, /* RGB LIMIT->YCbCr_709 FULL */ + RK_PQ_CSC_RGB2RGBL, /* RGB FULL->RGB LIMIT */ + RK_PQ_CSC_RGBL2RGB, /* RGB LIMIT->RGB FULL */ + RK_PQ_CSC_RGBL2RGBL, /* RGB LIMIT->RGB LIMIT */ + RK_PQ_CSC_RGB2RGB, /* RGB FULL->RGB FULL */ + RK_PQ_CSC_YUV2RGB_2020, /* YUV 2020 FULL->RGB 2020 FULL */ + RK_PQ_CSC_RGB2YUV2020_LIMIT2FULL, /* BT2020RGBLIMIT -> BT2020YUVFULL */ + RK_PQ_CSC_RGB2YUV2020_LIMIT, /* BT2020RGBLIMIT -> BT2020YUVLIMIT */ + RK_PQ_CSC_RGB2YUV2020_FULL2LIMIT, /* BT2020RGBFULL -> BT2020YUVLIMIT */ + RK_PQ_CSC_RGB2YUV2020_FULL, /* BT2020RGBFULL -> BT2020YUVFULL */ +}; + +enum color_space_type { + OPTM_CS_E_UNKNOWN = 0, + OPTM_CS_E_ITU_R_BT_709 = 1, + OPTM_CS_E_FCC = 4, + OPTM_CS_E_ITU_R_BT_470_2_BG = 5, + OPTM_CS_E_SMPTE_170_M = 6, + OPTM_CS_E_SMPTE_240_M = 7, + OPTM_CS_E_XV_YCC_709 = OPTM_CS_E_ITU_R_BT_709, + OPTM_CS_E_XV_YCC_601 = 8, + OPTM_CS_E_RGB = 9, + OPTM_CS_E_XV_YCC_2020 = 10, + OPTM_CS_E_RGB_2020 = 11, +}; + +enum vop_csc_format { + CSC_BT601L, + CSC_BT709L, + CSC_BT601F, + CSC_BT2020, + CSC_BT709L_13BIT, + CSC_BT709F_13BIT, + CSC_BT2020L_13BIT, + CSC_BT2020F_13BIT, +}; + +struct rk_pq_csc_coef { + s32 csc_coef00; + s32 csc_coef01; + s32 csc_coef02; + s32 csc_coef10; + s32 csc_coef11; + s32 csc_coef12; + s32 csc_coef20; + s32 csc_coef21; + s32 csc_coef22; +}; + +struct rk_pq_csc_ventor { + s32 csc_offset0; + s32 csc_offset1; + s32 csc_offset2; +}; + +struct rk_pq_csc_dc_coef { + s32 csc_in_dc0; + s32 csc_in_dc1; + s32 csc_in_dc2; + s32 csc_out_dc0; + s32 csc_out_dc1; + s32 csc_out_dc2; +}; + +/* color space param */ +struct rk_csc_colorspace_info { + enum color_space_type input_color_space; + enum color_space_type output_color_space; + bool in_full_range; + bool out_full_range; +}; + +struct rk_csc_mode_coef { + enum rk_pq_csc_mode csc_mode; + char c_csc_comment[PQ_CSC_MODE_COEF_COMMENT_LEN]; + const struct rk_pq_csc_coef *pst_csc_coef; + const struct rk_pq_csc_dc_coef *pst_csc_dc_coef; + struct rk_csc_colorspace_info st_csc_color_info; +}; + +/* + *CSC matrix + */ +/* xv_ycc BT.601 limit(i.e. SD) -> RGB full */ +static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full = { + 1196, 0, 1639, + 1196, -402, -835, + 1196, 2072, 0 +}; + +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full = { + -64, -512, -512, + 0, 0, 0 +}; + +/* BT.709 limit(i.e. HD) -> RGB full */ +static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_limit_to_rgb_full = { + 1196, 0, 1841, + 1196, -219, -547, + 1196, 2169, 0 +}; + +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_full = { + -64, -512, -512, + 0, 0, 0 +}; + +/* RGB full-> YUV601 (i.e. SD) limit */ +static const struct rk_pq_csc_coef rk_csc_table_rgb_to_xv_yccsdy_cb_cr = { + 262, 515, 100, + -151, -297, 448, + 448, -376, -73 +}; + +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr = { + 0, 0, 0, + 64, 512, 512 +}; + +/* RGB full-> YUV709 (i.e. SD) limit */ +static const struct rk_pq_csc_coef rk_csc_table_rgb_to_hdy_cb_cr = { + 186, 627, 63, + -103, -346, 448, + 448, -407, -41 +}; + +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_hdy_cb_cr = { + 0, 0, 0, + 64, 512, 512 +}; + +/* BT.709 (i.e. HD) -> to xv_ycc BT.601 (i.e. SD) */ +static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr = { + 1024, 104, 201, + 0, 1014, -113, + 0, -74, 1007 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr = { + -64, -512, -512, + 64, 512, 512 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full = { + 0, -512, -512, + 0, 512, 512 +}; + +/* xv_ycc BT.601 (i.e. SD) -> to BT.709 (i.e. HD) */ +static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr = { + 1024, -121, -218, + 0, 1043, 117, + 0, 77, 1050 +}; + +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr = { + -64, -512, -512, + 64, 512, 512 +}; + +/* xv_ycc BT.601 full(i.e. SD) -> RGB full */ +static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_rgb_full = { + 1024, 0, 1436, + 1024, -352, -731, + 1024, 1815, 0 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_full = { + 0, -512, -512, + 0, 0, 0 +}; + +/* BT.709 full(i.e. HD) -> RGB full */ +static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_rgb_full = { + 1024, 0, 1613, + 1024, -192, -479, + 1024, 1900, 0 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_rgb_full = { + 0, -512, -512, + 0, 0, 0 +}; + +/* RGB full-> YUV601 full(i.e. SD) */ +static const struct rk_pq_csc_coef rk_csc_table_rgb_to_xv_yccsdy_cb_cr_full = { + 306, 601, 117, + -173, -339, 512, + 512, -429, -83 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr_full = { + 0, 0, 0, + 0, 512, 512 +}; + +/* RGB full-> YUV709 full (i.e. SD) */ +static const struct rk_pq_csc_coef rk_csc_table_rgb_to_hdy_cb_cr_full = { + 218, 732, 74, + -117, -395, 512, + 512, -465, -47 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_to_hdy_cb_cr_full = { + 0, 0, 0, + 0, 512, 512 +}; + +/* limit -> full */ +static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full = { + 1196, 0, 0, + 0, 1169, 0, + 0, 0, 1169 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full = { + -64, -512, -512, + 0, 512, 512 +}; + +/* 601 limit -> 709 full */ +static const struct rk_pq_csc_coef rk_csc_table_identity_601_limit_to_709_full = { + 1196, -138, -249, + 0, 1191, 134, + 0, 88, 1199 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_601_limit_to_709_full = { + -64, -512, -512, + 0, 512, 512 +}; + +/* 709 limit -> 601 full */ +static const struct rk_pq_csc_coef rk_csc_table_identity_709_limit_to_601_full = { + 1196, 119, 229, + 0, 1157, -129, + 0, -85, 1150 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_709_limit_to_601_full = { + -64, -512, -512, + 0, 512, 512 +}; + +/* full -> limit */ +static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit = { + 877, 0, 0, + 0, 897, 0, + 0, 0, 897 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit = { + 0, -512, -512, + 64, 512, 512 +}; + +/* 601 full -> 709 limit */ +static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit = { + 877, -106, -191, + 0, 914, 103, + 0, 67, 920 +}; +static const struct rk_pq_csc_dc_coef +rk_dc_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit = { + 0, -512, -512, + 64, 512, 512 +}; + +/* 709 full -> 601 limit */ +static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit = { + 877, 91, 176, + 0, 888, -99, + 0, -65, 882 +}; +static const struct rk_pq_csc_dc_coef +rk_dc_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit = { + 0, -512, -512, + 64, 512, 512 +}; + +/* xv_ycc BT.601 limit(i.e. SD) -> RGB limit */ +static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit = { + 1024, 0, 1404, + 1024, -344, -715, + 1024, 1774, 0 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit = { + -64, -512, -512, + 64, 64, 64 +}; + +/* BT.709 limit(i.e. HD) -> RGB limit */ +static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_limit_to_rgb_limit = { + 1024, 0, 1577, + 1024, -188, -469, + 1024, 1858, 0 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_limit = { + -64, -512, -512, + 64, 64, 64 +}; + +/* RGB limit-> YUV601 (i.e. SD) limit */ +static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr = { + 306, 601, 117, + -177, -347, 524, + 524, -439, -85 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr = { + -64, -64, -64, + 64, 512, 512 +}; + +/* RGB limit -> YUV709 (i.e. SD) limit */ +static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_hdy_cb_cr = { + 218, 732, 74, + -120, -404, 524, + 524, -476, -48 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_hdy_cb_cr = { + -64, -64, -64, + 64, 512, 512 +}; + +/* xv_ycc BT.601 full(i.e. SD) -> RGB limit */ +static const struct rk_pq_csc_coef rk_csc_table_xv_yccsdy_cb_cr_to_rgb_limit = { + 877, 0, 1229, + 877, -302, -626, + 877, 1554, 0 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_limit = { + 0, -512, -512, + 64, 64, 64 +}; + +/* BT.709 full(i.e. HD) -> RGB limit */ +static const struct rk_pq_csc_coef rk_csc_table_hdy_cb_cr_to_rgb_limit = { + 877, 0, 1381, + 877, -164, -410, + 877, 1627, 0 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_hdy_cb_cr_to_rgb_limit = { + 0, -512, -512, + 64, 64, 64 +}; + +/* RGB limit-> YUV601 full(i.e. SD) */ +static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full = { + 358, 702, 136, + -202, -396, 598, + 598, -501, -97 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full = { + -64, -64, -64, + 0, 512, 512 +}; + +/* RGB limit-> YUV709 full (i.e. SD) */ +static const struct rk_pq_csc_coef rk_csc_table_rgb_limit_to_hdy_cb_cr_full = { + 254, 855, 86, + -137, -461, 598, + 598, -543, -55 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_rgb_limit_to_hdy_cb_cr_full = { + -64, -64, -64, + 0, 512, 512 +}; + +/* RGB full -> RGB limit */ +static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_to_rgb_limit = { + 877, 0, 0, + 0, 877, 0, + 0, 0, 877 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb_limit = { + 0, 0, 0, + 64, 64, 64 +}; + +/* RGB limit -> RGB full */ +static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_rgb = { + 1196, 0, 0, + 0, 1196, 0, + 0, 0, 1196 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_rgb = { + -64, -64, -64, + 0, 0, 0 +}; + +/* RGB limit/full -> RGB limit/full */ +static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_to_rgb = { + 1024, 0, 0, + 0, 1024, 0, + 0, 0, 1024 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb1 = { + -64, -64, -64, + 64, 64, 64 +}; + +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_to_rgb2 = { + 0, 0, 0, + 0, 0, 0 +}; + +static const struct rk_pq_csc_coef rk_csc_table_identity_yuv_to_rgb_2020 = { + 1024, 0, 1510, + 1024, -169, -585, + 1024, 1927, 0 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_yuv_to_rgb_2020 = { + 0, -512, -512, + 0, 0, 0 +}; + +/* 2020 RGB LIMIT ->YUV LIMIT */ +static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_yuv_limit_2020 = { + 269, 694, 61, + -146, -377, 524, + 524, -482, -42 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_yuv_limit_2020 = { + -64, -64, -64, + 64, 512, 512 +}; + +/* 2020 RGB LIMIT ->YUV FULL */ +static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_limit_to_yuv_full_2020 = { + 314, 811, 71, + -167, -431, 598, + 598, -550, -48 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_limit_to_yuv_full_2020 = { + -64, -64, -64, + 0, 512, 512 +}; + +/* 2020 RGB FULL ->YUV LIMIT */ +static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_full_to_yuv_limit_2020 = { + 230, 595, 52, + -125, -323, 448, + 448, -412, -36 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_full_to_yuv_limit_2020 = { + 0, 0, 0, + 64, 512, 512 +}; + +/* 2020 RGB FULL ->YUV FULL */ +static const struct rk_pq_csc_coef rk_csc_table_identity_rgb_full_to_yuv_full_2020 = { + 269, 694, 61, + -143, -369, 512, + 512, -471, -41 +}; +static const struct rk_pq_csc_dc_coef rk_dc_csc_table_identity_rgb_full_to_yuv_full_2020 = { + 0, 0, 0, + 0, 512, 512 +}; + +/* identity matrix */ +static const struct rk_pq_csc_coef rk_csc_table_identity_y_cb_cr_to_y_cb_cr = { + 1024, 0, 0, + 0, 1024, 0, + 0, 0, 1024 +}; + +/* 10bit Hue Sin Look Up Table -> range[-30, 30] */ +static const s32 g_hue_sin_table[PQ_CSC_HUE_TABLE_NUM] = { + 512, 508, 505, 501, 497, 494, 490, 486, + 483, 479, 475, 472, 468, 464, 460, 457, + 453, 449, 445, 442, 438, 434, 430, 426, + 423, 419, 415, 411, 407, 403, 400, 396, + 392, 388, 384, 380, 376, 372, 369, 365, + 361, 357, 353, 349, 345, 341, 337, 333, + 329, 325, 321, 317, 313, 309, 305, 301, + 297, 293, 289, 285, 281, 277, 273, 269, + 265, 261, 257, 253, 249, 245, 241, 237, + 233, 228, 224, 220, 216, 212, 208, 204, + 200, 196, 192, 187, 183, 179, 175, 171, + 167, 163, 159, 154, 150, 146, 142, 138, + 134, 130, 125, 121, 117, 113, 109, 105, + 100, 96, 92, 88, 84, 80, 75, 71, + 67, 63, 59, 54, 50, 46, 42, 38, + 34, 29, 25, 21, 17, 13, 8, 4, + 0, -4, -8, -13, -17, -21, -25, -29, + -34, -38, -42, -46, -50, -54, -59, -63, + -67, -71, -75, -80, -84, -88, -92, -96, + -100, -105, -109, -113, -117, -121, -125, -130, + -134, -138, -142, -146, -150, -154, -159, -163, + -167, -171, -175, -179, -183, -187, -192, -196, + -200, -204, -208, -212, -216, -220, -224, -228, + -233, -237, -241, -245, -249, -253, -257, -261, + -265, -269, -273, -277, -281, -285, -289, -293, + -297, -301, -305, -309, -313, -317, -321, -325, + -329, -333, -337, -341, -345, -349, -353, -357, + -361, -365, -369, -372, -376, -380, -384, -388, + -392, -396, -400, -403, -407, -411, -415, -419, + -423, -426, -430, -434, -438, -442, -445, -449, + -453, -457, -460, -464, -468, -472, -475, -479, + -483, -486, -490, -494, -497, -501, -505, -508, +}; + +/* 10bit Hue Cos Look Up Table -> range[-30, 30] */ +static const s32 g_hue_cos_table[PQ_CSC_HUE_TABLE_NUM] = { + 887, 889, 891, 893, 895, 897, 899, 901, + 903, 905, 907, 909, 911, 913, 915, 917, + 919, 920, 922, 924, 926, 928, 929, 931, + 933, 935, 936, 938, 940, 941, 943, 945, + 946, 948, 949, 951, 953, 954, 956, 957, + 959, 960, 962, 963, 964, 966, 967, 969, + 970, 971, 973, 974, 975, 976, 978, 979, + 980, 981, 983, 984, 985, 986, 987, 988, + 989, 990, 992, 993, 994, 995, 996, 997, + 998, 998, 999, 1000, 1001, 1002, 1003, 1004, + 1005, 1005, 1006, 1007, 1008, 1008, 1009, 1010, + 1011, 1011, 1012, 1013, 1013, 1014, 1014, 1015, + 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1019, + 1019, 1020, 1020, 1020, 1021, 1021, 1021, 1022, + 1022, 1022, 1022, 1023, 1023, 1023, 1023, 1023, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1023, 1023, 1023, 1023, 1023, 1022, 1022, 1022, + 1022, 1021, 1021, 1021, 1020, 1020, 1020, 1019, + 1019, 1018, 1018, 1017, 1017, 1016, 1016, 1015, + 1015, 1014, 1014, 1013, 1013, 1012, 1011, 1011, + 1010, 1009, 1008, 1008, 1007, 1006, 1005, 1005, + 1004, 1003, 1002, 1001, 1000, 999, 998, 998, + 997, 996, 995, 994, 993, 992, 990, 989, + 988, 987, 986, 985, 984, 983, 981, 980, + 979, 978, 976, 975, 974, 973, 971, 970, + 969, 967, 966, 964, 963, 962, 960, 959, + 957, 956, 954, 953, 951, 949, 948, 946, + 945, 943, 941, 940, 938, 936, 935, 933, + 931, 929, 928, 926, 924, 922, 920, 919, + 917, 915, 913, 911, 909, 907, 905, 903, + 901, 899, 897, 895, 893, 891, 889, 887 +}; + +/* + *CSC Param Struct + */ +static const struct rk_csc_mode_coef g_mode_csc_coef[] = { + { + RK_PQ_CSC_YUV2RGB_601, "YUV601 L->RGB F", + &rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full, + &rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_full, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, false, true + } + }, + { + RK_PQ_CSC_YUV2RGB_709, "YUV709 L->RGB F", + &rk_csc_table_hdy_cb_cr_limit_to_rgb_full, + &rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_full, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, false, true + } + }, + { + RK_PQ_CSC_RGB2YUV_601, "RGB F->YUV601 L", + &rk_csc_table_rgb_to_xv_yccsdy_cb_cr, + &rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr, + { + OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, true, false + } + }, + { + RK_PQ_CSC_RGB2YUV_709, "RGB F->YUV709 L", + &rk_csc_table_rgb_to_hdy_cb_cr, + &rk_dc_csc_table_rgb_to_hdy_cb_cr, + { + OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, true, false + } + }, + { + RK_PQ_CSC_YUV2YUV_709_601, "YUV709 L->YUV601 L", + &rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr, + &rk_dc_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, false, false + } + }, + { + RK_PQ_CSC_YUV2YUV_601_709, "YUV601 L->YUV709 L", + &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + &rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, false, false + } + }, + { + RK_PQ_CSC_YUV2YUV, "YUV L->YUV L", + &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + &rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, false, false + } + }, + { + RK_PQ_CSC_YUV2RGB_601_FULL, "YUV601 F->RGB F", + &rk_csc_table_xv_yccsdy_cb_cr_to_rgb_full, + &rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_full, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, true, true + } + }, + { + RK_PQ_CSC_YUV2RGB_709_FULL, "YUV709 F->RGB F", + &rk_csc_table_hdy_cb_cr_to_rgb_full, + &rk_dc_csc_table_hdy_cb_cr_to_rgb_full, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, true, true + } + }, + { + RK_PQ_CSC_RGB2YUV_601_FULL, "RGB F->YUV601 F", + &rk_csc_table_rgb_to_xv_yccsdy_cb_cr_full, + &rk_dc_csc_table_rgb_to_xv_yccsdy_cb_cr_full, + { + OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, true, true + } + }, + { + RK_PQ_CSC_RGB2YUV_709_FULL, "RGB F->YUV709 F", + &rk_csc_table_rgb_to_hdy_cb_cr_full, + &rk_dc_csc_table_rgb_to_hdy_cb_cr_full, + { + OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, true, true + } + }, + { + RK_PQ_CSC_YUV2YUV_709_601_FULL, "YUV709 F->YUV601 F", + &rk_csc_table_hdy_cb_cr_to_xv_yccsdy_cb_cr, + &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, true, true + } + }, + { + RK_PQ_CSC_YUV2YUV_601_709_FULL, "YUV601 F->YUV709 F", + &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, true, true + } + }, + { + RK_PQ_CSC_YUV2YUV_FULL, "YUV F->YUV F", + &rk_csc_table_identity_y_cb_cr_to_y_cb_cr, + &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, true, true + } + }, + { + RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV L->YUV F", + &rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full, + &rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, false, true + } + }, + { + RK_PQ_CSC_YUV2YUV_601_709_LIMIT2FULL, "YUV601 L->YUV709 F", + &rk_csc_table_identity_601_limit_to_709_full, + &rk_dc_csc_table_identity_601_limit_to_709_full, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, false, true + } + }, + { + RK_PQ_CSC_YUV2YUV_709_601_LIMIT2FULL, "YUV709 L->YUV601 F", + &rk_csc_table_identity_709_limit_to_601_full, + &rk_dc_csc_table_identity_709_limit_to_601_full, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, false, true + } + }, + { + RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV F->YUV L", + &rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit, + &rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_ITU_R_BT_709, true, false + } + }, + { + RK_PQ_CSC_YUV2YUV_601_709_FULL2LIMIT, "YUV601 F->YUV709 L", + &rk_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit, + &rk_dc_csc_table_identity_y_cb_cr_601_full_to_y_cb_cr_709_limit, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_ITU_R_BT_709, true, false + } + }, + { + RK_PQ_CSC_YUV2YUV_709_601_FULL2LIMIT, "YUV709 F->YUV601 L", + &rk_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit, + &rk_dc_csc_table_identity_y_cb_cr_709_full_to_y_cb_cr_601_limit, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_XV_YCC_601, true, false + } + }, + { + RK_PQ_CSC_YUV2RGBL_601, "YUV601 L->RGB L", + &rk_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit, + &rk_dc_csc_table_xv_yccsdy_cb_cr_limit_to_rgb_limit, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, false, false + } + }, + { + RK_PQ_CSC_YUV2RGBL_709, "YUV709 L->RGB L", + &rk_csc_table_hdy_cb_cr_limit_to_rgb_limit, + &rk_dc_csc_table_hdy_cb_cr_limit_to_rgb_limit, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, false, false + } + }, + { + RK_PQ_CSC_RGBL2YUV_601, "RGB L->YUV601 L", + &rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr, + &rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr, + { + OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, false, false + } + }, + { + RK_PQ_CSC_RGBL2YUV_709, "RGB L->YUV709 L", + &rk_csc_table_rgb_limit_to_hdy_cb_cr, + &rk_dc_csc_table_rgb_limit_to_hdy_cb_cr, + { + OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, false, false + } + }, + { + RK_PQ_CSC_YUV2RGBL_601_FULL, "YUV601 F->RGB L", + &rk_csc_table_xv_yccsdy_cb_cr_to_rgb_limit, + &rk_dc_csc_table_xv_yccsdy_cb_cr_to_rgb_limit, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_RGB, true, false + } + }, + { + RK_PQ_CSC_YUV2RGBL_709_FULL, "YUV709 F->RGB L", + &rk_csc_table_hdy_cb_cr_to_rgb_limit, + &rk_dc_csc_table_hdy_cb_cr_to_rgb_limit, + { + OPTM_CS_E_ITU_R_BT_709, OPTM_CS_E_RGB, true, false + } + }, + { + RK_PQ_CSC_RGBL2YUV_601_FULL, "RGB L->YUV601 F", + &rk_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full, + &rk_dc_csc_table_rgb_limit_to_xv_yccsdy_cb_cr_full, + { + OPTM_CS_E_RGB, OPTM_CS_E_XV_YCC_601, false, true + } + }, + { + RK_PQ_CSC_RGBL2YUV_709_FULL, "RGB L->YUV709 F", + &rk_csc_table_rgb_limit_to_hdy_cb_cr_full, + &rk_dc_csc_table_rgb_limit_to_hdy_cb_cr_full, + { + OPTM_CS_E_RGB, OPTM_CS_E_ITU_R_BT_709, false, true + } + }, + { + RK_PQ_CSC_RGB2RGBL, "RGB F->RGB L", + &rk_csc_table_identity_rgb_to_rgb_limit, + &rk_dc_csc_table_identity_rgb_to_rgb_limit, + { + OPTM_CS_E_RGB, OPTM_CS_E_RGB, true, false + } + }, + { + RK_PQ_CSC_RGBL2RGB, "RGB L->RGB F", + &rk_csc_table_identity_rgb_limit_to_rgb, + &rk_dc_csc_table_identity_rgb_limit_to_rgb, + { + OPTM_CS_E_RGB, OPTM_CS_E_RGB, false, true + } + }, + { + RK_PQ_CSC_RGBL2RGBL, "RGB L->RGB L", + &rk_csc_table_identity_rgb_to_rgb, + &rk_dc_csc_table_identity_rgb_to_rgb1, + { + OPTM_CS_E_RGB, OPTM_CS_E_RGB, false, false + } + }, + { + RK_PQ_CSC_RGB2RGB, "RGB F->RGB F", + &rk_csc_table_identity_rgb_to_rgb, + &rk_dc_csc_table_identity_rgb_to_rgb2, + { + OPTM_CS_E_RGB, OPTM_CS_E_RGB, true, true + } + }, + { + RK_PQ_CSC_YUV2RGB_2020, "YUV2020 F->RGB2020 F", + &rk_csc_table_identity_yuv_to_rgb_2020, + &rk_dc_csc_table_identity_yuv_to_rgb_2020, + { + OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_RGB_2020, true, true + } + }, + { + RK_PQ_CSC_RGB2YUV2020_LIMIT2FULL, "RGB2020 L->YUV2020 F", + &rk_csc_table_identity_rgb_limit_to_yuv_full_2020, + &rk_dc_csc_table_identity_rgb_limit_to_yuv_full_2020, + { + OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, false, true + } + }, + { + RK_PQ_CSC_RGB2YUV2020_LIMIT, "RGB2020 L->YUV2020 L", + &rk_csc_table_identity_rgb_limit_to_yuv_limit_2020, + &rk_dc_csc_table_identity_rgb_limit_to_yuv_limit_2020, + { + OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, false, false + } + }, + { + RK_PQ_CSC_RGB2YUV2020_FULL2LIMIT, "RGB2020 F->YUV2020 L", + &rk_csc_table_identity_rgb_full_to_yuv_limit_2020, + &rk_dc_csc_table_identity_rgb_full_to_yuv_limit_2020, + { + OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, true, false + } + }, + { + RK_PQ_CSC_RGB2YUV2020_FULL, "RGB2020 F->YUV2020 F", + &rk_csc_table_identity_rgb_full_to_yuv_full_2020, + &rk_dc_csc_table_identity_rgb_full_to_yuv_full_2020, + { + OPTM_CS_E_RGB_2020, OPTM_CS_E_XV_YCC_2020, true, true + } + }, + { + RK_PQ_CSC_YUV2YUV, "YUV 601 L->YUV 601 L", + &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + &rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, false, false + } + }, + { + RK_PQ_CSC_YUV2YUV_FULL, "YUV 601 F->YUV 601 F", + &rk_csc_table_identity_y_cb_cr_to_y_cb_cr, + &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, true, true + } + }, + { + RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV 601 L->YUV 601 F", + &rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full, + &rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, false, true + } + }, + { + RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV 601 F->YUV 601 L", + &rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit, + &rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit, + { + OPTM_CS_E_XV_YCC_601, OPTM_CS_E_XV_YCC_601, true, false + } + }, + { + RK_PQ_CSC_YUV2YUV, "YUV 2020 L->YUV 2020 L", + &rk_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + &rk_dc_csc_table_xv_yccsdy_cb_cr_to_hdy_cb_cr, + { + OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, false, false + } + }, + { + RK_PQ_CSC_YUV2YUV_FULL, "YUV 2020 F->YUV 2020 F", + &rk_csc_table_identity_y_cb_cr_to_y_cb_cr, + &rk_dc_csc_table_hdy_cb_cr_full_to_xv_yccsdy_cb_cr_full, + { + OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, true, true + } + }, + { + RK_PQ_CSC_YUV2YUV_LIMIT2FULL, "YUV 2020 L->YUV 2020 F", + &rk_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full, + &rk_dc_csc_table_identity_y_cb_cr_limit_to_y_cb_cr_full, + { + OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, false, true + } + }, + { + RK_PQ_CSC_YUV2YUV_FULL2LIMIT, "YUV 2020 F->YUV 2020 L", + &rk_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit, + &rk_dc_csc_table_identity_y_cb_cr_full_to_y_cb_cr_limit, + { + OPTM_CS_E_XV_YCC_2020, OPTM_CS_E_XV_YCC_2020, true, false + } + }, + { + RK_PQ_CSC_RGB2RGBL, "RGB 2020 F->RGB 2020 L", + &rk_csc_table_identity_rgb_to_rgb_limit, + &rk_dc_csc_table_identity_rgb_to_rgb_limit, + { + OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, true, false + } + }, + { + RK_PQ_CSC_RGBL2RGB, "RGB 2020 L->RGB 2020 F", + &rk_csc_table_identity_rgb_limit_to_rgb, + &rk_dc_csc_table_identity_rgb_limit_to_rgb, + { + OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, false, true + } + }, + { + RK_PQ_CSC_RGBL2RGBL, "RGB 2020 L->RGB 2020 L", + &rk_csc_table_identity_rgb_to_rgb, + &rk_dc_csc_table_identity_rgb_to_rgb1, + { + OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, false, false + } + }, + { + RK_PQ_CSC_RGB2RGB, "RGB 2020 F->RGB 2020 F", + &rk_csc_table_identity_rgb_to_rgb, + &rk_dc_csc_table_identity_rgb_to_rgb2, + { + OPTM_CS_E_RGB_2020, OPTM_CS_E_RGB_2020, true, true + } + }, +}; + +struct csc_mapping { + enum vop_csc_format csc_format; + enum color_space_type rgb_color_space; + enum color_space_type yuv_color_space; + bool rgb_full_range; + bool yuv_full_range; +}; + +static const struct csc_mapping csc_mapping_table[] = { + { + CSC_BT601L, + OPTM_CS_E_RGB, + OPTM_CS_E_XV_YCC_601, + true, + false, + }, + { + CSC_BT709L, + OPTM_CS_E_RGB, + OPTM_CS_E_XV_YCC_709, + true, + false, + }, + { + CSC_BT601F, + OPTM_CS_E_RGB, + OPTM_CS_E_XV_YCC_601, + true, + true, + }, + { + CSC_BT2020, + OPTM_CS_E_RGB_2020, + OPTM_CS_E_XV_YCC_2020, + true, + true, + }, + { + CSC_BT709L_13BIT, + OPTM_CS_E_RGB, + OPTM_CS_E_XV_YCC_709, + true, + false, + }, + { + CSC_BT709F_13BIT, + OPTM_CS_E_RGB, + OPTM_CS_E_XV_YCC_709, + true, + true, + }, + { + CSC_BT2020L_13BIT, + OPTM_CS_E_RGB_2020, + OPTM_CS_E_XV_YCC_2020, + true, + false, + }, + { + CSC_BT2020F_13BIT, + OPTM_CS_E_RGB_2020, + OPTM_CS_E_XV_YCC_2020, + true, + true, + }, +}; + +static const struct rk_pq_csc_coef r2y_for_y2y = { + 306, 601, 117, + -151, -296, 446, + 630, -527, -102, +}; + +static const struct rk_pq_csc_coef y2r_for_y2y = { + 1024, -0, 1167, + 1024, -404, -594, + 1024, 2081, -1, +}; + +static const struct rk_pq_csc_coef rgb_input_swap_matrix = { + 0, 0, 1, + 1, 0, 0, + 0, 1, 0, +}; + +static const struct rk_pq_csc_coef yuv_output_swap_matrix = { + 0, 0, 1, + 1, 0, 0, + 0, 1, 0, +}; + +static int csc_get_mode_index(int post_csc_mode, bool is_input_yuv, bool is_output_yuv) +{ + const struct rk_csc_colorspace_info *colorspace_info; + enum color_space_type input_color_space; + enum color_space_type output_color_space; + bool is_input_full_range; + bool is_output_full_range; + int i; + + for (i = 0; i < ARRAY_SIZE(csc_mapping_table); i++) { + if (post_csc_mode == csc_mapping_table[i].csc_format) { + input_color_space = is_input_yuv ? csc_mapping_table[i].yuv_color_space : + csc_mapping_table[i].rgb_color_space; + is_input_full_range = is_input_yuv ? csc_mapping_table[i].yuv_full_range : + csc_mapping_table[i].rgb_full_range; + output_color_space = is_output_yuv ? csc_mapping_table[i].yuv_color_space : + csc_mapping_table[i].rgb_color_space; + is_output_full_range = is_output_yuv ? csc_mapping_table[i].yuv_full_range : + csc_mapping_table[i].rgb_full_range; + break; + } + } + if (i >= ARRAY_SIZE(csc_mapping_table)) + return -EINVAL; + + for (i = 0; i < ARRAY_SIZE(g_mode_csc_coef); i++) { + colorspace_info = &g_mode_csc_coef[i].st_csc_color_info; + if (colorspace_info->input_color_space == input_color_space && + colorspace_info->output_color_space == output_color_space && + colorspace_info->in_full_range == is_input_full_range && + colorspace_info->out_full_range == is_output_full_range) + return i; + } + + return -EINVAL; +} + +static void csc_matrix_multiply(struct rk_pq_csc_coef *dst, const struct rk_pq_csc_coef *m0, + const struct rk_pq_csc_coef *m1) +{ + dst->csc_coef00 = m0->csc_coef00 * m1->csc_coef00 + + m0->csc_coef01 * m1->csc_coef10 + + m0->csc_coef02 * m1->csc_coef20; + + dst->csc_coef01 = m0->csc_coef00 * m1->csc_coef01 + + m0->csc_coef01 * m1->csc_coef11 + + m0->csc_coef02 * m1->csc_coef21; + + dst->csc_coef02 = m0->csc_coef00 * m1->csc_coef02 + + m0->csc_coef01 * m1->csc_coef12 + + m0->csc_coef02 * m1->csc_coef22; + + dst->csc_coef10 = m0->csc_coef10 * m1->csc_coef00 + + m0->csc_coef11 * m1->csc_coef10 + + m0->csc_coef12 * m1->csc_coef20; + + dst->csc_coef11 = m0->csc_coef10 * m1->csc_coef01 + + m0->csc_coef11 * m1->csc_coef11 + + m0->csc_coef12 * m1->csc_coef21; + + dst->csc_coef12 = m0->csc_coef10 * m1->csc_coef02 + + m0->csc_coef11 * m1->csc_coef12 + + m0->csc_coef12 * m1->csc_coef22; + + dst->csc_coef20 = m0->csc_coef20 * m1->csc_coef00 + + m0->csc_coef21 * m1->csc_coef10 + + m0->csc_coef22 * m1->csc_coef20; + + dst->csc_coef21 = m0->csc_coef20 * m1->csc_coef01 + + m0->csc_coef21 * m1->csc_coef11 + + m0->csc_coef22 * m1->csc_coef21; + + dst->csc_coef22 = m0->csc_coef20 * m1->csc_coef02 + + m0->csc_coef21 * m1->csc_coef12 + + m0->csc_coef22 * m1->csc_coef22; +} + +static void csc_matrix_ventor_multiply(struct rk_pq_csc_ventor *dst, + const struct rk_pq_csc_coef *m0, + const struct rk_pq_csc_ventor *v0) +{ + dst->csc_offset0 = m0->csc_coef00 * v0->csc_offset0 + + m0->csc_coef01 * v0->csc_offset1 + + m0->csc_coef02 * v0->csc_offset2; + + dst->csc_offset1 = m0->csc_coef10 * v0->csc_offset0 + + m0->csc_coef11 * v0->csc_offset1 + + m0->csc_coef12 * v0->csc_offset2; + + dst->csc_offset2 = m0->csc_coef20 * v0->csc_offset0 + + m0->csc_coef21 * v0->csc_offset1 + + m0->csc_coef22 * v0->csc_offset2; +} + +static void csc_matrix_element_left_shift(struct rk_pq_csc_coef *m, int n) +{ + m->csc_coef00 = m->csc_coef00 >> n; + m->csc_coef01 = m->csc_coef01 >> n; + m->csc_coef02 = m->csc_coef02 >> n; + m->csc_coef10 = m->csc_coef10 >> n; + m->csc_coef11 = m->csc_coef11 >> n; + m->csc_coef12 = m->csc_coef12 >> n; + m->csc_coef20 = m->csc_coef20 >> n; + m->csc_coef21 = m->csc_coef21 >> n; + m->csc_coef22 = m->csc_coef22 >> n; +} + +static struct rk_pq_csc_coef create_rgb_gain_matrix(s32 r_gain, s32 g_gain, s32 b_gain) +{ + struct rk_pq_csc_coef m; + + m.csc_coef00 = r_gain; + m.csc_coef01 = 0; + m.csc_coef02 = 0; + + m.csc_coef10 = 0; + m.csc_coef11 = g_gain; + m.csc_coef12 = 0; + + m.csc_coef20 = 0; + m.csc_coef21 = 0; + m.csc_coef22 = b_gain; + + return m; +} + +static struct rk_pq_csc_coef create_contrast_matrix(s32 contrast) +{ + struct rk_pq_csc_coef m; + + m.csc_coef00 = contrast; + m.csc_coef01 = 0; + m.csc_coef02 = 0; + + m.csc_coef10 = 0; + m.csc_coef11 = contrast; + m.csc_coef12 = 0; + + m.csc_coef20 = 0; + m.csc_coef21 = 0; + m.csc_coef22 = contrast; + + return m; +} + +static struct rk_pq_csc_coef create_hue_matrix(s32 hue) +{ + struct rk_pq_csc_coef m; + s32 hue_idx; + s32 sin_hue; + s32 cos_hue; + + hue_idx = CLIP(hue / PQ_CSC_HUE_TABLE_DIV_COEF, 0, PQ_CSC_HUE_TABLE_NUM - 1); + sin_hue = g_hue_sin_table[hue_idx]; + cos_hue = g_hue_cos_table[hue_idx]; + + m.csc_coef00 = 1024; + m.csc_coef01 = 0; + m.csc_coef02 = 0; + + m.csc_coef10 = 0; + m.csc_coef11 = cos_hue; + m.csc_coef12 = sin_hue; + + m.csc_coef20 = 0; + m.csc_coef21 = -sin_hue; + m.csc_coef22 = cos_hue; + + return m; +} + +static struct rk_pq_csc_coef create_saturation_matrix(s32 saturation) +{ + struct rk_pq_csc_coef m; + + m.csc_coef00 = 512; + m.csc_coef01 = 0; + m.csc_coef02 = 0; + + m.csc_coef10 = 0; + m.csc_coef11 = saturation; + m.csc_coef12 = 0; + + m.csc_coef20 = 0; + m.csc_coef21 = 0; + m.csc_coef22 = saturation; + + return m; +} + +static int csc_calc_adjust_output_coef(bool is_input_yuv, bool is_output_yuv, + struct csc_info *csc_input_cfg, + const struct rk_csc_mode_coef *csc_mode_cfg, + struct rk_pq_csc_coef *out_matrix, + struct rk_pq_csc_ventor *out_dc) +{ + struct rk_pq_csc_coef gain_matrix; + struct rk_pq_csc_coef contrast_matrix; + struct rk_pq_csc_coef hue_matrix; + struct rk_pq_csc_coef saturation_matrix; + struct rk_pq_csc_coef temp0, temp1; + const struct rk_pq_csc_coef *r2y_matrix; + const struct rk_pq_csc_coef *y2r_matrix; + struct rk_pq_csc_ventor dc_in_ventor; + struct rk_pq_csc_ventor dc_out_ventor; + struct rk_pq_csc_ventor v; + const struct rk_csc_colorspace_info *color_info; + s32 contrast, saturation, brightness; + s32 r_gain, g_gain, b_gain; + s32 r_offset, g_offset, b_offset; + s32 dc_in_offset, dc_out_offset; + + contrast = csc_input_cfg->contrast * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF; + saturation = csc_input_cfg->saturation * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF; + r_gain = csc_input_cfg->r_gain * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF; + g_gain = csc_input_cfg->g_gain * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF; + b_gain = csc_input_cfg->b_gain * PQ_CSC_PARAM_FIX_NUM / PQ_CSC_IN_PARAM_NORM_COEF; + r_offset = ((s32)csc_input_cfg->r_offset - PQ_CSC_BRIGHTNESS_OFFSET) / + PQ_CSC_TEMP_OFFSET_DIV_COEF; + g_offset = ((s32)csc_input_cfg->g_offset - PQ_CSC_BRIGHTNESS_OFFSET) / + PQ_CSC_TEMP_OFFSET_DIV_COEF; + b_offset = ((s32)csc_input_cfg->b_offset - PQ_CSC_BRIGHTNESS_OFFSET) / + PQ_CSC_TEMP_OFFSET_DIV_COEF; + + gain_matrix = create_rgb_gain_matrix(r_gain, g_gain, b_gain); + contrast_matrix = create_contrast_matrix(contrast); + hue_matrix = create_hue_matrix(csc_input_cfg->hue); + saturation_matrix = create_saturation_matrix(saturation); + + color_info = &csc_mode_cfg->st_csc_color_info; + brightness = (s32)csc_input_cfg->brightness - PQ_CSC_BRIGHTNESS_OFFSET; + dc_in_offset = color_info->in_full_range ? 0 : -PQ_CSC_DC_IN_OFFSET; + dc_out_offset = color_info->out_full_range ? 0 : PQ_CSC_DC_IN_OFFSET; + + /* + * M0 = hue_matrix * saturation_matrix, + * M1 = gain_matrix * constrast_matrix, + */ + + if (is_input_yuv && is_output_yuv) { + /* + * yuv2yuv: output = T * M0 * N_r2y * M1 * N_y2r, + * so output = T * hue_matrix * saturation_matrix * + * N_r2y * gain_matrix * contrast_matrix * N_y2r + */ + r2y_matrix = &r2y_for_y2y; + y2r_matrix = &y2r_for_y2y; + csc_matrix_multiply(&temp0, csc_mode_cfg->pst_csc_coef, &hue_matrix); + /* + * The value bits width is 32 bit, so every time 2 matirx multifly, + * left shift is necessary to avoid overflow. For enhancing the + * calculator precision, PQ_CALC_ENHANCE_BIT bits is reserved and + * left shift before get the final result. + */ + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_FIX_BIT_WIDTH - + PQ_CALC_ENHANCE_BIT); + csc_matrix_multiply(&temp1, &temp0, &saturation_matrix); + csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(&temp0, &temp1, r2y_matrix); + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_FIX_BIT_WIDTH); + csc_matrix_multiply(&temp1, &temp0, &gain_matrix); + csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(&temp0, &temp1, &contrast_matrix); + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(out_matrix, &temp0, y2r_matrix); + csc_matrix_element_left_shift(out_matrix, PQ_CSC_PARAM_FIX_BIT_WIDTH + + PQ_CALC_ENHANCE_BIT); + + dc_in_ventor.csc_offset0 = dc_in_offset; + dc_in_ventor.csc_offset1 = -PQ_CSC_DC_IN_OUT_DEFAULT; + dc_in_ventor.csc_offset2 = -PQ_CSC_DC_IN_OUT_DEFAULT; + dc_out_ventor.csc_offset0 = brightness + dc_out_offset; + dc_out_ventor.csc_offset1 = PQ_CSC_DC_IN_OUT_DEFAULT; + dc_out_ventor.csc_offset2 = PQ_CSC_DC_IN_OUT_DEFAULT; + } else if (is_input_yuv && !is_output_yuv) { + /* + * yuv2rgb: output = M1 * T * M0, + * so output = gain_matrix * contrast_matrix * T * + * hue_matrix * saturation_matrix + */ + csc_matrix_multiply(&temp0, csc_mode_cfg->pst_csc_coef, &hue_matrix); + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_FIX_BIT_WIDTH - + PQ_CALC_ENHANCE_BIT); + csc_matrix_multiply(&temp1, &temp0, &saturation_matrix); + csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(&temp0, &contrast_matrix, &temp1); + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(out_matrix, &gain_matrix, &temp0); + csc_matrix_element_left_shift(out_matrix, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH + + PQ_CALC_ENHANCE_BIT); + + dc_in_ventor.csc_offset0 = dc_in_offset; + dc_in_ventor.csc_offset1 = -PQ_CSC_DC_IN_OUT_DEFAULT; + dc_in_ventor.csc_offset2 = -PQ_CSC_DC_IN_OUT_DEFAULT; + dc_out_ventor.csc_offset0 = brightness + dc_out_offset + r_offset; + dc_out_ventor.csc_offset1 = brightness + dc_out_offset + g_offset; + dc_out_ventor.csc_offset2 = brightness + dc_out_offset + b_offset; + } else if (!is_input_yuv && is_output_yuv) { + /* + * rgb2yuv: output = M0 * T * M1, + * so output = hue_matrix * saturation_matrix * T * + * gain_matrix * contrast_matrix + */ + csc_matrix_multiply(&temp0, csc_mode_cfg->pst_csc_coef, &gain_matrix); + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH - + PQ_CALC_ENHANCE_BIT); + csc_matrix_multiply(&temp1, &temp0, &contrast_matrix); + csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(&temp0, &saturation_matrix, &temp1); + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(out_matrix, &hue_matrix, &temp0); + csc_matrix_element_left_shift(out_matrix, PQ_CSC_PARAM_FIX_BIT_WIDTH + + PQ_CALC_ENHANCE_BIT); + + dc_in_ventor.csc_offset0 = dc_in_offset; + dc_in_ventor.csc_offset1 = dc_in_offset; + dc_in_ventor.csc_offset2 = dc_in_offset; + dc_out_ventor.csc_offset0 = brightness + dc_out_offset; + dc_out_ventor.csc_offset1 = PQ_CSC_DC_IN_OUT_DEFAULT; + dc_out_ventor.csc_offset2 = PQ_CSC_DC_IN_OUT_DEFAULT; + } else { + /* + * rgb2rgb: output = T * M1 * N_y2r * M0 * N_r2y, + * so output = T * gain_matrix * contrast_matrix * + * N_y2r * hue_matrix * saturation_matrix * N_r2y + */ + if (!color_info->in_full_range && color_info->out_full_range) { + r2y_matrix = &rk_csc_table_rgb_limit_to_hdy_cb_cr; + y2r_matrix = &rk_csc_table_hdy_cb_cr_limit_to_rgb_full; + } else if (color_info->in_full_range && !color_info->out_full_range) { + r2y_matrix = &rk_csc_table_rgb_to_hdy_cb_cr; + y2r_matrix = &rk_csc_table_hdy_cb_cr_limit_to_rgb_limit; + } else if (color_info->in_full_range && color_info->out_full_range) { + r2y_matrix = &rk_csc_table_rgb_to_hdy_cb_cr_full; + y2r_matrix = &rk_csc_table_hdy_cb_cr_to_rgb_full; + } else { + r2y_matrix = &rk_csc_table_rgb_limit_to_hdy_cb_cr; + y2r_matrix = &rk_csc_table_hdy_cb_cr_limit_to_rgb_limit; + } + + csc_matrix_multiply(&temp0, &contrast_matrix, y2r_matrix); + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH - + PQ_CALC_ENHANCE_BIT); + csc_matrix_multiply(&temp1, &gain_matrix, &temp0); + csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(&temp0, &temp1, &hue_matrix); + csc_matrix_element_left_shift(&temp0, PQ_CSC_PARAM_FIX_BIT_WIDTH); + csc_matrix_multiply(&temp1, &temp0, &saturation_matrix); + csc_matrix_element_left_shift(&temp1, PQ_CSC_PARAM_HALF_FIX_BIT_WIDTH); + csc_matrix_multiply(out_matrix, &temp1, r2y_matrix); + csc_matrix_element_left_shift(out_matrix, PQ_CSC_PARAM_FIX_BIT_WIDTH + + PQ_CALC_ENHANCE_BIT); + + if (color_info->in_full_range && color_info->out_full_range) + out_matrix->csc_coef00 += 1; + + dc_in_ventor.csc_offset0 = dc_in_offset; + dc_in_ventor.csc_offset1 = dc_in_offset; + dc_in_ventor.csc_offset2 = dc_in_offset; + dc_out_ventor.csc_offset0 = brightness + dc_out_offset + r_offset; + dc_out_ventor.csc_offset1 = brightness + dc_out_offset + g_offset; + dc_out_ventor.csc_offset2 = brightness + dc_out_offset + b_offset; + } + + csc_matrix_ventor_multiply(&v, out_matrix, &dc_in_ventor); + out_dc->csc_offset0 = v.csc_offset0 + dc_out_ventor.csc_offset0 * + PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM; + out_dc->csc_offset1 = v.csc_offset1 + dc_out_ventor.csc_offset1 * + PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM; + out_dc->csc_offset2 = v.csc_offset2 + dc_out_ventor.csc_offset2 * + PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM; + + return 0; +} + +static int csc_calc_default_output_coef(const struct rk_csc_mode_coef *csc_mode_cfg, + struct rk_pq_csc_coef *out_matrix, + struct rk_pq_csc_ventor *out_dc) +{ + const struct rk_pq_csc_coef *csc_coef; + const struct rk_pq_csc_dc_coef *csc_dc_coef; + struct rk_pq_csc_ventor dc_in_ventor; + struct rk_pq_csc_ventor dc_out_ventor; + struct rk_pq_csc_ventor v; + + csc_coef = csc_mode_cfg->pst_csc_coef; + csc_dc_coef = csc_mode_cfg->pst_csc_dc_coef; + + out_matrix->csc_coef00 = csc_coef->csc_coef00; + out_matrix->csc_coef01 = csc_coef->csc_coef01; + out_matrix->csc_coef02 = csc_coef->csc_coef02; + out_matrix->csc_coef10 = csc_coef->csc_coef10; + out_matrix->csc_coef11 = csc_coef->csc_coef11; + out_matrix->csc_coef12 = csc_coef->csc_coef12; + out_matrix->csc_coef20 = csc_coef->csc_coef20; + out_matrix->csc_coef21 = csc_coef->csc_coef21; + out_matrix->csc_coef22 = csc_coef->csc_coef22; + + dc_in_ventor.csc_offset0 = csc_dc_coef->csc_in_dc0; + dc_in_ventor.csc_offset1 = csc_dc_coef->csc_in_dc1; + dc_in_ventor.csc_offset2 = csc_dc_coef->csc_in_dc2; + dc_out_ventor.csc_offset0 = csc_dc_coef->csc_out_dc0; + dc_out_ventor.csc_offset1 = csc_dc_coef->csc_out_dc1; + dc_out_ventor.csc_offset2 = csc_dc_coef->csc_out_dc2; + + csc_matrix_ventor_multiply(&v, csc_coef, &dc_in_ventor); + out_dc->csc_offset0 = v.csc_offset0 + dc_out_ventor.csc_offset0 * + PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM; + out_dc->csc_offset1 = v.csc_offset1 + dc_out_ventor.csc_offset1 * + PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM; + out_dc->csc_offset2 = v.csc_offset2 + dc_out_ventor.csc_offset2 * + PQ_CSC_SIMPLE_MAT_PARAM_FIX_NUM; + + return 0; +} + +static inline s32 pq_csc_simple_round(s32 x, s32 n) +{ + s32 value = 0; + + if (n == 0) + return x; + + value = (abs(x) + (1 << (n - 1))) >> (n); + return (((x) >= 0) ? value : -value); +} + +static void rockchip_swap_color_channel(bool is_input_yuv, bool is_output_yuv, + struct post_csc_coef *csc_simple_coef, + struct rk_pq_csc_coef *out_matrix, + struct rk_pq_csc_ventor *out_dc) +{ + struct rk_pq_csc_coef tmp_matrix; + struct rk_pq_csc_ventor tmp_v; + + if (!is_input_yuv) { + memcpy(&tmp_matrix, out_matrix, sizeof(struct rk_pq_csc_coef)); + csc_matrix_multiply(out_matrix, &tmp_matrix, &rgb_input_swap_matrix); + } + + if (is_output_yuv) { + memcpy(&tmp_matrix, out_matrix, sizeof(struct rk_pq_csc_coef)); + memcpy(&tmp_v, out_dc, sizeof(struct rk_pq_csc_ventor)); + csc_matrix_multiply(out_matrix, &yuv_output_swap_matrix, &tmp_matrix); + csc_matrix_ventor_multiply(out_dc, &yuv_output_swap_matrix, &tmp_v); + } + + csc_simple_coef->csc_coef00 = out_matrix->csc_coef00; + csc_simple_coef->csc_coef01 = out_matrix->csc_coef01; + csc_simple_coef->csc_coef02 = out_matrix->csc_coef02; + csc_simple_coef->csc_coef10 = out_matrix->csc_coef10; + csc_simple_coef->csc_coef11 = out_matrix->csc_coef11; + csc_simple_coef->csc_coef12 = out_matrix->csc_coef12; + csc_simple_coef->csc_coef20 = out_matrix->csc_coef20; + csc_simple_coef->csc_coef21 = out_matrix->csc_coef21; + csc_simple_coef->csc_coef22 = out_matrix->csc_coef22; + csc_simple_coef->csc_dc0 = out_dc->csc_offset0; + csc_simple_coef->csc_dc1 = out_dc->csc_offset1; + csc_simple_coef->csc_dc2 = out_dc->csc_offset2; +} + +int rockchip_calc_post_csc(struct csc_info *csc_cfg, struct post_csc_coef *csc_simple_coef, + int csc_mode, bool is_input_yuv, bool is_output_yuv) +{ + int ret = 0; + struct rk_pq_csc_coef out_matrix; + struct rk_pq_csc_ventor out_dc; + const struct rk_csc_mode_coef *csc_mode_cfg; + int bit_num = PQ_CSC_SIMPLE_MAT_PARAM_FIX_BIT_WIDTH; + + ret = csc_get_mode_index(csc_mode, is_input_yuv, is_output_yuv); + if (ret < 0) { + printf("invalid csc_mode:%d\n", csc_mode); + return ret; + } + + csc_mode_cfg = &g_mode_csc_coef[ret]; + + if (csc_cfg) + ret = csc_calc_adjust_output_coef(is_input_yuv, is_output_yuv, csc_cfg, + csc_mode_cfg, &out_matrix, &out_dc); + else + ret = csc_calc_default_output_coef(csc_mode_cfg, &out_matrix, &out_dc); + + rockchip_swap_color_channel(is_input_yuv, is_output_yuv, csc_simple_coef, &out_matrix, + &out_dc); + + csc_simple_coef->csc_dc0 = pq_csc_simple_round(csc_simple_coef->csc_dc0, bit_num); + csc_simple_coef->csc_dc1 = pq_csc_simple_round(csc_simple_coef->csc_dc1, bit_num); + csc_simple_coef->csc_dc2 = pq_csc_simple_round(csc_simple_coef->csc_dc2, bit_num); + csc_simple_coef->range_type = csc_mode_cfg->st_csc_color_info.out_full_range; + + return ret; +} diff --git a/u-boot/drivers/video/drm/rockchip_post_csc.h b/u-boot/drivers/video/drm/rockchip_post_csc.h new file mode 100755 index 0000000..f11e808 --- /dev/null +++ b/u-boot/drivers/video/drm/rockchip_post_csc.h @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +/* + * Copyright (C) Rockchip Electronics Co.Ltd + * Author: + * Zhang Yubing <yubing.zhang@rock-chips.com> + */ + +#ifndef _ROCKCHIP_POST_CSC_H +#define _ROCKCHIP_POST_CSC_H + +#include <linux/kernel.h> +#include <edid.h> + +struct post_csc_coef { + s32 csc_coef00; + s32 csc_coef01; + s32 csc_coef02; + s32 csc_coef10; + s32 csc_coef11; + s32 csc_coef12; + s32 csc_coef20; + s32 csc_coef21; + s32 csc_coef22; + + s32 csc_dc0; + s32 csc_dc1; + s32 csc_dc2; + + u32 range_type; +}; + +int rockchip_calc_post_csc(struct csc_info *csc, struct post_csc_coef *csc_coef, + int csc_mode, bool is_input_yuv, bool is_output_yuv); + +#endif diff --git a/u-boot/drivers/video/drm/rockchip_rgb.c b/u-boot/drivers/video/drm/rockchip_rgb.c index 53fb862..2b3b85c 100644 --- a/u-boot/drivers/video/drm/rockchip_rgb.c +++ b/u-boot/drivers/video/drm/rockchip_rgb.c @@ -13,11 +13,14 @@ #include <dm/read.h> #include <dm/pinctrl.h> #include <linux/media-bus-format.h> +#include <asm/gpio.h> +#include <backlight.h> #include "rockchip_display.h" #include "rockchip_crtc.h" #include "rockchip_connector.h" #include "rockchip_phy.h" +#include "rockchip_panel.h" #define HIWORD_UPDATE(v, h, l) (((v) << (l)) | (GENMASK(h, l) << 16)) @@ -48,6 +51,9 @@ #define RK3368_GRF_SOC_CON15 0x043c #define RK3368_FORCE_JETAG(v) HIWORD_UPDATE(v, 13, 13) +#define RK3562_GRF_IOC_VO_IO_CON 0x10500 +#define RK3562_RGB_DATA_BYPASS(v) HIWORD_UPDATE(v, 6, 6) + #define RK3568_GRF_VO_CON1 0X0364 #define RK3568_RGB_DATA_BYPASS(v) HIWORD_UPDATE(v, 6, 6) @@ -67,6 +73,64 @@ struct rockchip_phy *phy; const struct rockchip_rgb_funcs *funcs; }; + +struct mcu_cmd_header { + u8 data_type; + u8 delay; + u8 payload_length; +} __packed; + +struct mcu_cmd_desc { + struct mcu_cmd_header header; + const u8 *payload; +}; + +struct mcu_cmd_seq { + struct mcu_cmd_desc *cmds; + unsigned int cmd_cnt; +}; + +struct rockchip_mcu_panel_desc { + struct mcu_cmd_seq *init_seq; + struct mcu_cmd_seq *exit_seq; + + struct { + unsigned int width; + unsigned int height; + } size; + + struct { + unsigned int prepare; + unsigned int enable; + unsigned int disable; + unsigned int unprepare; + unsigned int reset; + unsigned int init; + } delay; + + unsigned int bpc; + u32 bus_format; + u32 bus_flags; + bool power_invert; +}; + +struct rockchip_mcu_panel { + struct rockchip_panel base; + struct rockchip_mcu_panel_desc *desc; + struct udevice *power_supply; + struct udevice *backlight; + + struct gpio_desc enable_gpio; + struct gpio_desc reset_gpio; + + bool prepared; + bool enabled; +}; + +static inline struct rockchip_mcu_panel *to_rockchip_mcu_panel(struct rockchip_panel *panel) +{ + return container_of(panel, struct rockchip_mcu_panel, base); +} static int rockchip_rgb_connector_prepare(struct rockchip_connector *conn, struct display_state *state) @@ -170,9 +234,254 @@ .unprepare = rockchip_rgb_connector_unprepare, }; +static int rockchip_mcu_panel_send_cmds(struct display_state *state, + struct mcu_cmd_seq *cmds) +{ + int i; + + if (!cmds) + return -EINVAL; + + display_send_mcu_cmd(state, MCU_SETBYPASS, 1); + for (i = 0; i < cmds->cmd_cnt; i++) { + struct mcu_cmd_desc *desc = &cmds->cmds[i]; + int value = 0; + + value = desc->payload[0]; + display_send_mcu_cmd(state, desc->header.data_type, value); + + if (desc->header.delay) + mdelay(desc->header.delay); + } + display_send_mcu_cmd(state, MCU_SETBYPASS, 0); + + return 0; +} + +static void rockchip_mcu_panel_prepare(struct rockchip_panel *panel) +{ + struct rockchip_mcu_panel *mcu_panel = to_rockchip_mcu_panel(panel); + int ret; + + if (mcu_panel->prepared) + return; + + if (dm_gpio_is_valid(&mcu_panel->enable_gpio)) + dm_gpio_set_value(&mcu_panel->enable_gpio, 1); + + if (mcu_panel->desc->delay.prepare) + mdelay(mcu_panel->desc->delay.prepare); + + if (dm_gpio_is_valid(&mcu_panel->reset_gpio)) + dm_gpio_set_value(&mcu_panel->reset_gpio, 1); + + if (mcu_panel->desc->delay.reset) + mdelay(mcu_panel->desc->delay.reset); + + if (dm_gpio_is_valid(&mcu_panel->reset_gpio)) + dm_gpio_set_value(&mcu_panel->reset_gpio, 0); + + if (mcu_panel->desc->delay.init) + mdelay(mcu_panel->desc->delay.init); + + if (mcu_panel->desc->init_seq) { + ret = rockchip_mcu_panel_send_cmds(panel->state, mcu_panel->desc->init_seq); + if (ret) + printf("failed to send mcu panel init cmds: %d\n", ret); + } + + mcu_panel->prepared = true; +} + +static void rockchip_mcu_panel_unprepare(struct rockchip_panel *panel) +{ + struct rockchip_mcu_panel *mcu_panel = to_rockchip_mcu_panel(panel); + int ret; + + if (!mcu_panel->prepared) + return; + + if (mcu_panel->desc->exit_seq) { + ret = rockchip_mcu_panel_send_cmds(panel->state, mcu_panel->desc->exit_seq); + if (ret) + printf("failed to send mcu panel exit cmds: %d\n", ret); + } + + if (dm_gpio_is_valid(&mcu_panel->reset_gpio)) + dm_gpio_set_value(&mcu_panel->reset_gpio, 1); + + if (dm_gpio_is_valid(&mcu_panel->enable_gpio)) + dm_gpio_set_value(&mcu_panel->enable_gpio, 0); + + if (mcu_panel->desc->delay.unprepare) + mdelay(mcu_panel->desc->delay.unprepare); + + mcu_panel->prepared = false; +} + +static void rockchip_mcu_panel_enable(struct rockchip_panel *panel) +{ + struct rockchip_mcu_panel *mcu_panel = to_rockchip_mcu_panel(panel); + + if (mcu_panel->enabled) + return; + + if (mcu_panel->desc->delay.enable) + mdelay(mcu_panel->desc->delay.enable); + + if (mcu_panel->backlight) + backlight_enable(mcu_panel->backlight); + + mcu_panel->enabled = true; +} + +static void rockchip_mcu_panel_disable(struct rockchip_panel *panel) +{ + struct rockchip_mcu_panel *mcu_panel = to_rockchip_mcu_panel(panel); + + if (!mcu_panel->enabled) + return; + + if (mcu_panel->backlight) + backlight_disable(mcu_panel->backlight); + + if (mcu_panel->desc->delay.disable) + mdelay(mcu_panel->desc->delay.disable); + + mcu_panel->enabled = false; +} + +static const struct rockchip_panel_funcs rockchip_mcu_panel_funcs = { + .prepare = rockchip_mcu_panel_prepare, + .unprepare = rockchip_mcu_panel_unprepare, + .enable = rockchip_mcu_panel_enable, + .disable = rockchip_mcu_panel_disable, +}; + +static int rockchip_mcu_panel_parse_cmds(const u8 *data, int length, + struct mcu_cmd_seq *pcmds) +{ + int len; + const u8 *buf; + const struct mcu_cmd_header *header; + int i, cnt = 0; + + /* scan commands */ + cnt = 0; + buf = data; + len = length; + while (len > sizeof(*header)) { + header = (const struct mcu_cmd_header *)buf; + buf += sizeof(*header) + header->payload_length; + len -= sizeof(*header) + header->payload_length; + cnt++; + } + + pcmds->cmds = calloc(cnt, sizeof(struct mcu_cmd_desc)); + if (!pcmds->cmds) + return -ENOMEM; + + pcmds->cmd_cnt = cnt; + + buf = data; + len = length; + for (i = 0; i < cnt; i++) { + struct mcu_cmd_desc *desc = &pcmds->cmds[i]; + + header = (const struct mcu_cmd_header *)buf; + length -= sizeof(*header); + buf += sizeof(*header); + desc->header.data_type = header->data_type; + desc->header.delay = header->delay; + desc->header.payload_length = header->payload_length; + desc->payload = buf; + buf += header->payload_length; + length -= header->payload_length; + } + + return 0; +} + +static int rockchip_mcu_panel_init(struct rockchip_mcu_panel *mcu_panel, ofnode mcu_panel_node) +{ + const void *data; + int len; + int ret; + + ret = gpio_request_by_name_nodev(mcu_panel_node, "enable-gpios", 0, + &mcu_panel->enable_gpio, GPIOD_IS_OUT); + if (ret && ret != -ENOENT) { + printf("%s: Cannot get mcu panel enable GPIO: %d\n", __func__, ret); + return ret; + } + + ret = gpio_request_by_name_nodev(mcu_panel_node, "reset-gpios", 0, + &mcu_panel->reset_gpio, GPIOD_IS_OUT); + if (ret && ret != -ENOENT) { + printf("%s: Cannot get mcu panel reset GPIO: %d\n", __func__, ret); + return ret; + } + + mcu_panel->desc = malloc(sizeof(struct rockchip_mcu_panel_desc)); + if (!mcu_panel->desc) + return -ENOMEM; + + mcu_panel->desc->power_invert = ofnode_read_bool(mcu_panel_node, "power-invert"); + + mcu_panel->desc->delay.prepare = ofnode_read_u32_default(mcu_panel_node, "prepare-delay-ms", 0); + mcu_panel->desc->delay.unprepare = ofnode_read_u32_default(mcu_panel_node, "unprepare-delay-ms", 0); + mcu_panel->desc->delay.enable = ofnode_read_u32_default(mcu_panel_node, "enable-delay-ms", 0); + mcu_panel->desc->delay.disable = ofnode_read_u32_default(mcu_panel_node, "disable-delay-ms", 0); + mcu_panel->desc->delay.init = ofnode_read_u32_default(mcu_panel_node, "init-delay-ms", 0); + mcu_panel->desc->delay.reset = ofnode_read_u32_default(mcu_panel_node, "reset-delay-ms", 0); + + mcu_panel->desc->bus_format = ofnode_read_u32_default(mcu_panel_node, "bus-format", + MEDIA_BUS_FMT_RBG888_1X24); + mcu_panel->desc->bpc = ofnode_read_u32_default(mcu_panel_node, "bpc", 8); + + data = ofnode_get_property(mcu_panel_node, "panel-init-sequence", &len); + if (data) { + mcu_panel->desc->init_seq = calloc(1, sizeof(*mcu_panel->desc->init_seq)); + if (!mcu_panel->desc->init_seq) + return -ENOMEM; + + ret = rockchip_mcu_panel_parse_cmds(data, len, mcu_panel->desc->init_seq); + if (ret) { + printf("failed to parse panel init sequence\n"); + goto free_on_cmds; + } + } + + data = ofnode_get_property(mcu_panel_node, "panel-exit-sequence", &len); + if (data) { + mcu_panel->desc->exit_seq = calloc(1, sizeof(*mcu_panel->desc->exit_seq)); + if (!mcu_panel->desc->exit_seq) { + ret = -ENOMEM; + goto free_on_cmds; + } + + ret = rockchip_mcu_panel_parse_cmds(data, len, mcu_panel->desc->exit_seq); + if (ret) { + printf("failed to parse panel exit sequence\n"); + goto free_cmds; + } + } + + return 0; + +free_cmds: + free(mcu_panel->desc->exit_seq); +free_on_cmds: + free(mcu_panel->desc->init_seq); + return ret; +} + static int rockchip_rgb_probe(struct udevice *dev) { struct rockchip_rgb *rgb = dev_get_priv(dev); + ofnode mcu_panel_node; + int phandle; + int ret; rgb->dev = dev; rgb->funcs = (const struct rockchip_rgb_funcs *)dev_get_driver_data(dev); @@ -181,6 +490,45 @@ rgb->id = of_alias_get_id(ofnode_to_np(dev->node), "rgb"); if (rgb->id < 0) rgb->id = 0; + + mcu_panel_node = dev_read_subnode(dev, "mcu-panel"); + if (ofnode_valid(mcu_panel_node) && ofnode_is_available(mcu_panel_node)) { + struct rockchip_mcu_panel *mcu_panel; + + mcu_panel = malloc(sizeof(struct rockchip_mcu_panel)); + if (!mcu_panel) { + printf("failed to alloc mcu_panel data\n"); + return -ENOMEM; + } + + ret = rockchip_mcu_panel_init(mcu_panel, mcu_panel_node); + if (ret < 0) { + printf("failed to init mcu_panel: %d\n", ret); + return ret; + } + + phandle = ofnode_read_u32_default(mcu_panel_node, "backlight", -1); + if (phandle < 0) { + printf("failed to find backlight phandle\n"); + return -EINVAL; + } + + ret = uclass_get_device_by_phandle_id(UCLASS_PANEL_BACKLIGHT, phandle, + &mcu_panel->backlight); + if (ret && ret != -ENOENT) { + printf("%s: failed to get backlight device: %d\n", __func__, ret); + return ret; + } + + mcu_panel->base.dev = dev; + mcu_panel->base.bus_format = mcu_panel->desc->bus_format; + mcu_panel->base.bpc = mcu_panel->desc->bpc; + mcu_panel->base.funcs = &rockchip_mcu_panel_funcs; + mcu_panel->enabled = false; + mcu_panel->prepared = false; + + rgb->connector.panel = &mcu_panel->base; + } rockchip_connector_bind(&rgb->connector, dev, rgb->id, &rockchip_rgb_connector_funcs, NULL, DRM_MODE_CONNECTOR_LVDS); @@ -260,6 +608,16 @@ .prepare = rk3368_rgb_prepare, }; +static void rk3562_rgb_prepare(struct rockchip_rgb *rgb, int pipe) +{ + regmap_write(rgb->grf, RK3562_GRF_IOC_VO_IO_CON, + RK3562_RGB_DATA_BYPASS(rgb->data_sync_bypass)); +} + +static const struct rockchip_rgb_funcs rk3562_rgb_funcs = { + .prepare = rk3562_rgb_prepare, +}; + static void rk3568_rgb_prepare(struct rockchip_rgb *rgb, int pipe) { regmap_write(rgb->grf, RK3568_GRF_VO_CON1, RK3568_RGB_DATA_BYPASS(rgb->data_sync_bypass)); @@ -296,6 +654,10 @@ .data = (ulong)&rk3368_rgb_funcs, }, { + .compatible = "rockchip,rk3562-rgb", + .data = (ulong)&rk3562_rgb_funcs, + }, + { .compatible = "rockchip,rk3568-rgb", .data = (ulong)&rk3568_rgb_funcs, }, diff --git a/u-boot/drivers/video/drm/rockchip_spl_display.c b/u-boot/drivers/video/drm/rockchip_spl_display.c new file mode 100644 index 0000000..c66815a --- /dev/null +++ b/u-boot/drivers/video/drm/rockchip_spl_display.c @@ -0,0 +1,265 @@ +/* + * (C) Copyright 2023 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <asm/io.h> +#include <malloc.h> +#include <mp_boot.h> +#include <spl.h> +#include <part.h> +#include <drm_modes.h> +#include <spl_display.h> +#include <linux/hdmi.h> + +#include "rockchip_display.h" +#include "rockchip_crtc.h" +#include "rockchip_connector.h" +#include "rockchip_phy.h" + +static struct base2_info base_parameter; + +struct display_state *rockchip_spl_display_drv_probe(void) +{ + struct display_state *state = malloc(sizeof(struct display_state)); + if (!state) + return NULL; + + memset(state, 0, sizeof(*state)); + + rockchip_spl_vop_probe(&state->crtc_state); + rockchip_spl_dw_hdmi_probe(&state->conn_state); + inno_spl_hdmi_phy_probe(state); + + return state; +} + +static int rockchip_spl_display_init(struct display_state *state) +{ + struct crtc_state *crtc_state = &state->crtc_state; + struct connector_state *conn_state = &state->conn_state; + struct rockchip_connector *conn = conn_state->connector; + const struct rockchip_crtc *crtc = crtc_state->crtc; + const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs; + const struct rockchip_connector_funcs *conn_funcs = conn->funcs; + struct drm_display_mode *mode = &state->conn_state.mode; + int ret = 0; + + if (!crtc_funcs) { + printf("failed to find crtc functions\n"); + return -ENXIO; + } + + if (crtc_funcs->preinit) { + ret = crtc_funcs->preinit(state); + if (ret) + return ret; + } + + rockchip_display_make_crc32_table(); + if (conn_funcs->pre_init) { + ret = conn_funcs->pre_init(conn, state); + if (ret) + return ret; + } + + if (conn_funcs->init) { + ret = conn_funcs->init(conn, state); + if (ret) + goto deinit; + } + + if (conn->phy) + rockchip_phy_init(conn->phy); + + if (conn_funcs->detect) { + conn->hpd = conn_funcs->detect(conn, state); + if (!conn->hpd) + goto deinit; + } + + if (conn_funcs->get_timing) { + ret = conn_funcs->get_timing(conn, state); + if (ret) + goto deinit; + } + + drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); + if (crtc_funcs->init) { + ret = crtc_funcs->init(state); + if (ret) + goto deinit; + } + + return 0; + +deinit: + rockchip_connector_deinit(state); + return ret; +} + +static int rockchip_spl_display_post_enable(struct display_state *state) +{ + struct crtc_state *crtc_state = &state->crtc_state; + struct connector_state *conn_state = &state->conn_state; + struct rockchip_connector *conn = conn_state->connector; + const struct rockchip_crtc *crtc = crtc_state->crtc; + const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs; + const struct rockchip_connector_funcs *conn_funcs = conn->funcs; + + if (crtc_funcs->enable) + crtc_funcs->enable(state); + state->crtc_state.crtc->active = true; + + if (conn_funcs->enable) + conn_funcs->enable(conn, state); + + return 0; +} + +static void rockchip_spl_display_transmit_info_to_uboot(struct display_state *state) +{ + struct connector_state *conn_state = &state->conn_state; + struct spl_display_info *spl_disp_info = (struct spl_display_info *)CONFIG_SPL_VIDEO_BUF; + + /* transmit mode and bus_format to uboot */ + memcpy(&spl_disp_info->mode, &conn_state->mode, sizeof(conn_state->mode)); + spl_disp_info->bus_format = state->conn_state.bus_format; + spl_disp_info->enabled = 1; + flush_dcache_all(); +} + +int spl_init_display(struct task_data *data) +{ + struct display_state *state = NULL; + struct drm_display_mode *mode; + int ret = 0; + + state = rockchip_spl_display_drv_probe(); + if (!state) { + printf("rockchip_spl_display_drv_probe failed\n"); + return -1; + } + + ret = rockchip_spl_display_init(state); + if (ret) { + printf("rockchip_spl_display_init failed ret:%d\n", ret); + return -1; + } + + if (!state->conn_state.connector->hpd) { + printf("HDMI is unplug and exit\n"); + return 0; + } + + ret = rockchip_spl_display_post_enable(state); + if (ret) { + printf("rockchip_spl_display_post_enable failed ret:%d\n", ret); + return -1; + } + + rockchip_spl_display_transmit_info_to_uboot(state); + + mode = &state->conn_state.mode; + printf("SPL enable hdmi, detailed mode clock %u kHz, flags[%x]\n" + " H: %04d %04d %04d %04d\n" + " V: %04d %04d %04d %04d\n" + "bus_format: %x\n", + mode->clock, mode->flags, + mode->hdisplay, mode->hsync_start, + mode->hsync_end, mode->htotal, + mode->vdisplay, mode->vsync_start, + mode->vsync_end, mode->vtotal, + state->conn_state.bus_format); + + return ret; +} + +struct base2_disp_info *rockchip_get_disp_info(int type, int id) +{ + struct base2_disp_info *disp_info; + struct base2_disp_header *disp_header; + int i = 0, offset = -1; + u32 crc_val; + u32 base2_length; + void *base_parameter_addr = (void *)&base_parameter; +#ifdef CONFIG_MP_BOOT + void *bp_addr = (void *)CONFIG_SPL_VIDEO_BUF; + ulong ret; + + /* make sure the baseparameter is ready */ + ret = mpb_post(6); + printf("SPL read baseparameter %s\n", ret < 0 ? "failed" : "success"); + memcpy(&base_parameter, bp_addr, sizeof(base_parameter)); +#endif + for (i = 0; i < 8; i++) { + disp_header = &base_parameter.disp_header[i]; + if (disp_header->connector_type == type && + disp_header->connector_id == id) { + printf("disp info %d, type:%d, id:%d\n", i, type, id); + offset = disp_header->offset; + break; + } + } + + if (offset < 0) + return NULL; + disp_info = base_parameter_addr + offset; + if (disp_info->screen_info[0].type != type || + disp_info->screen_info[0].id != id) { + printf("base2_disp_info couldn't be found, screen_info type[%d] or id[%d] mismatched\n", + disp_info->screen_info[0].type, + disp_info->screen_info[0].id); + return NULL; + } + + if (strncasecmp(disp_info->disp_head_flag, "DISP", 4)) + return NULL; + + if (base_parameter.major_version == 3 && base_parameter.minor_version == 0) { + crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info, + sizeof(struct base2_disp_info) - 4); + if (crc_val != disp_info->crc2) { + printf("error: connector type[%d], id[%d] disp info crc2 check error\n", + type, id); + return NULL; + } + } else { + base2_length = sizeof(struct base2_disp_info) - sizeof(struct csc_info) - + sizeof(struct acm_data) - 10 * 1024 - 4; + crc_val = rockchip_display_crc32c_cal((unsigned char *)disp_info, base2_length - 4); + if (crc_val != disp_info->crc) { + printf("error: connector type[%d], id[%d] disp info crc check error\n", + type, id); + return NULL; + } + } + + return disp_info; +} + +int spl_load_baseparamter(struct task_data *data) +{ + struct spl_load_info *info = &data->info; + ulong addr = CONFIG_SPL_VIDEO_BUF; + disk_partition_t part; + + debug("== Baseparam: start\n"); + + if (part_get_info_by_name(info->dev, "baseparameter", &part) < 0) { + printf("No baseparameter partition\n"); + return -ENOENT; + } else { + if (info->read(info, part.start, part.size, (void *)addr) != part.size) + return -EIO; + else + flush_dcache_range(addr, addr + part.size * info->bl_len); + } + + debug("== Baseparam: load OK\n"); + + return 0; +} + diff --git a/u-boot/drivers/video/drm/rockchip_tve.c b/u-boot/drivers/video/drm/rockchip_tve.c new file mode 100644 index 0000000..9664549 --- /dev/null +++ b/u-boot/drivers/video/drm/rockchip_tve.c @@ -0,0 +1,848 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd + */ +#include <common.h> +#include <malloc.h> +#include <fdtdec.h> +#include <fdt_support.h> +#include <asm/io.h> +#include <linux/media-bus-format.h> +#include <asm/arch-rockchip/clock.h> +#include <dm/device.h> +#include <dm/read.h> +#include <dm/uclass-internal.h> +#include <linux/fb.h> +#include <edid.h> +#include <syscon.h> +#include <boot_rkimg.h> +#include <mapmem.h> +#include <misc.h> + +#include "rockchip_display.h" +#include "rockchip_crtc.h" +#include "rockchip_connector.h" +#include "rockchip_phy.h" +#include "rockchip_tve.h" + +#define RK322X_VDAC_STANDARD 0x15 + +static const struct drm_display_mode tve_modes[] = { + /* 0 - 720x576i@50Hz */ + { DRM_MODE(DRM_MODE_TYPE_DRIVER, 13500, 720, 753, + 816, 864, 576, 580, 586, 625, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), + .vrefresh = 50, }, + /* 1 - 720x480i@60Hz */ + { DRM_MODE(DRM_MODE_TYPE_DRIVER, 13500, 720, 753, + 815, 858, 480, 483, 486, 525, 0, + DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC | + DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLCLK), + .vrefresh = 60, }, +}; + +struct env_config { + u32 offset; + u32 value; +}; + +static struct env_config ntsc_bt656_config[] = { + { BT656_DECODER_CROP, 0x00000000 }, + { BT656_DECODER_SIZE, 0x01e002d0 }, + { BT656_DECODER_HTOTAL_HS_END, 0x035a003e }, + { BT656_DECODER_VACT_ST_HACT_ST, 0x00160069 }, + { BT656_DECODER_VTOTAL_VS_END, 0x020d0003 }, + { BT656_DECODER_VS_ST_END_F1, 0x01060109 }, + { BT656_DECODER_DBG_REG, 0x024002d0 }, + { BT656_DECODER_CTRL, 0x00000009 }, +}; + +static struct env_config ntsc_tve_config[] = { + { TVE_MODE_CTRL, 0x000af906 }, + { TVE_HOR_TIMING1, 0x00c07a81 }, + { TVE_HOR_TIMING2, 0x169810fc }, + { TVE_HOR_TIMING3, 0x96b40000 }, + { TVE_SUB_CAR_FRQ, 0x21f07bd7 }, + { TVE_IMAGE_POSITION, 0x001500d6 }, + { TVE_ROUTING, 0x10088880 }, + { TVE_SYNC_ADJUST, 0x00000000 }, + { TVE_STATUS, 0x00000000 }, + { TVE_CTRL, 0x00000000 }, + { TVE_INTR_STATUS, 0x00000000 }, + { TVE_INTR_EN, 0x00000000 }, + { TVE_INTR_CLR, 0x00000000 }, + { TVE_COLOR_BUSRT_SAT, 0x0052543c }, + { TVE_CHROMA_BANDWIDTH, 0x00000002 }, + { TVE_BRIGHTNESS_CONTRAST, 0x00008300 }, + { TVE_CLAMP, 0x00000000 }, +}; + +static struct env_config pal_bt656_config[] = { + { BT656_DECODER_CROP, 0x00000000 }, + { BT656_DECODER_SIZE, 0x024002d0 }, + { BT656_DECODER_HTOTAL_HS_END, 0x0360003f }, + { BT656_DECODER_VACT_ST_HACT_ST, 0x0016006f }, + { BT656_DECODER_VTOTAL_VS_END, 0x02710003 }, + { BT656_DECODER_VS_ST_END_F1, 0x0138013b }, + { BT656_DECODER_DBG_REG, 0x024002d0 }, + { BT656_DECODER_CTRL, 0x00000009 }, +}; + +static struct env_config pal_tve_config[] = { + { TVE_MODE_CTRL, 0x010ab906 }, + { TVE_HOR_TIMING1, 0x00c28381 }, + { TVE_HOR_TIMING2, 0x267d111d }, + { TVE_HOR_TIMING3, 0x66c00880 }, + { TVE_SUB_CAR_FRQ, 0x2a098acb }, + { TVE_IMAGE_POSITION, 0x001500f6 }, + { TVE_ROUTING, 0x10008882 }, + { TVE_SYNC_ADJUST, 0x00000000 }, + { TVE_STATUS, 0x000000b0 }, + { TVE_CTRL, 0x00000000 }, + { TVE_INTR_STATUS, 0x00000000 }, + { TVE_INTR_EN, 0x00000000 }, + { TVE_INTR_CLR, 0x00000000 }, + { TVE_COLOR_BUSRT_SAT, 0x00356245 }, + { TVE_CHROMA_BANDWIDTH, 0x00000022 }, + { TVE_BRIGHTNESS_CONTRAST, 0x0000aa00 }, + { TVE_CLAMP, 0x00000000 }, +}; + +#define BT656_ENV_CONFIG_SIZE (sizeof(ntsc_bt656_config) / sizeof(struct env_config)) +#define TVE_ENV_CONFIG_SIZE (sizeof(ntsc_tve_config) / sizeof(struct env_config)) + +#define tve_writel(offset, v) writel(v, tve->reg_base + offset) +#define tve_readl(offset) readl(tve->reg_base + offset) + +#define tve_dac_writel(offset, v) writel(v, tve->vdac_base + offset) +#define tve_dac_readl(offset) readl(tve->vdac_base + offset) + +#define tve_grf_writel(offset, v) writel(v, tve->grf + offset) +#define tve_grf_readl(offset, v) readl(tve->grf + offset) + +struct rockchip_tve_data { + int input_format; + int soc_type; +}; + +struct rockchip_tve { + struct rockchip_connector connector; + struct udevice *dev; + void *reg_base; + void *vdac_base; + int soc_type; + int input_format; + int tv_format; + int test_mode; + int saturation; + int brightcontrast; + int adjtiming; + int lumafilter0; + int lumafilter1; + int lumafilter2; + int lumafilter3; + int lumafilter4; + int lumafilter5; + int lumafilter6; + int lumafilter7; + int daclevel; + int dac1level; + int preferred_mode; + int upsample_mode; + void *grf; +}; + +static void tve_write_block(struct rockchip_tve *tve, struct env_config *config, int len) +{ + int i; + + for (i = 0; i < len; i++) + tve_writel(config[i].offset, config[i].value); +} + +static void tve_set_mode(struct rockchip_tve *tve) +{ + struct env_config *bt656_cfg, *tve_cfg; + int mode = tve->tv_format; + + if (tve->soc_type == SOC_RK3528) { + tve_writel(TVE_LUMA_FILTER1, tve->lumafilter0); + tve_writel(TVE_LUMA_FILTER2, tve->lumafilter1); + tve_writel(TVE_LUMA_FILTER3, tve->lumafilter2); + tve_writel(TVE_LUMA_FILTER4, tve->lumafilter3); + tve_writel(TVE_LUMA_FILTER5, tve->lumafilter4); + tve_writel(TVE_LUMA_FILTER6, tve->lumafilter5); + tve_writel(TVE_LUMA_FILTER7, tve->lumafilter6); + tve_writel(TVE_LUMA_FILTER8, tve->lumafilter7); + } else { + if (tve->input_format == INPUT_FORMAT_RGB) + tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) | + v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) | + v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(0)); + else + tve_writel(TV_CTRL, v_CVBS_MODE(mode) | v_CLK_UPSTREAM_EN(2) | + v_TIMING_EN(2) | v_LUMA_FILTER_GAIN(0) | + v_LUMA_FILTER_UPSAMPLE(1) | v_CSC_PATH(3)); + + tve_writel(TV_LUMA_FILTER0, tve->lumafilter0); + tve_writel(TV_LUMA_FILTER1, tve->lumafilter1); + tve_writel(TV_LUMA_FILTER2, tve->lumafilter2); + } + + if (mode == TVOUT_CVBS_NTSC) { + TVEDBG("tve set ntsc mode\n"); + + if (tve->soc_type == SOC_RK3528) { + bt656_cfg = ntsc_bt656_config; + tve_cfg = ntsc_tve_config; + + tve_write_block(tve, bt656_cfg, BT656_ENV_CONFIG_SIZE); + tve_write_block(tve, tve_cfg, TVE_ENV_CONFIG_SIZE); + } else { + tve_writel(TV_ROUTING, v_DAC_SENSE_EN(0) | v_Y_IRE_7_5(1) | + v_Y_AGC_PULSE_ON(0) | v_Y_VIDEO_ON(1) | + v_YPP_MODE(1) | v_Y_SYNC_ON(1) | v_PIC_MODE(mode)); + tve_writel(TV_BW_CTRL, v_CHROMA_BW(BP_FILTER_NTSC) | + v_COLOR_DIFF_BW(COLOR_DIFF_FILTER_BW_1_3)); + tve_writel(TV_SATURATION, 0x0042543C); + if (tve->test_mode) + tve_writel(TV_BRIGHTNESS_CONTRAST, 0x00008300); + else + tve_writel(TV_BRIGHTNESS_CONTRAST, 0x00007900); + + tve_writel(TV_FREQ_SC, 0x21F07BD7); + tve_writel(TV_SYNC_TIMING, 0x00C07a81); + tve_writel(TV_ADJ_TIMING, 0x96B40000 | 0x70); + tve_writel(TV_ACT_ST, 0x001500D6); + tve_writel(TV_ACT_TIMING, 0x069800FC | (1 << 12) | (1 << 28)); + } + } else if (mode == TVOUT_CVBS_PAL) { + TVEDBG("tve set pal mode\n"); + + if (tve->soc_type == SOC_RK3528) { + bt656_cfg = pal_bt656_config; + tve_cfg = pal_tve_config; + + tve_write_block(tve, bt656_cfg, BT656_ENV_CONFIG_SIZE); + tve_write_block(tve, tve_cfg, TVE_ENV_CONFIG_SIZE); + } else { + tve_writel(TV_ROUTING, v_DAC_SENSE_EN(0) | v_Y_IRE_7_5(0) | + v_Y_AGC_PULSE_ON(0) | v_Y_VIDEO_ON(1) | + v_YPP_MODE(1) | v_Y_SYNC_ON(1) | v_PIC_MODE(mode)); + tve_writel(TV_BW_CTRL, v_CHROMA_BW(BP_FILTER_PAL) | + v_COLOR_DIFF_BW(COLOR_DIFF_FILTER_BW_1_3)); + + tve_writel(TV_SATURATION, tve->saturation); + tve_writel(TV_BRIGHTNESS_CONTRAST, tve->brightcontrast); + + tve_writel(TV_FREQ_SC, 0x2A098ACB); + tve_writel(TV_SYNC_TIMING, 0x00C28381); + tve_writel(TV_ADJ_TIMING, (0xc << 28) | 0x06c00800 | 0x80); + tve_writel(TV_ACT_ST, 0x001500F6); + tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28)); + + tve_writel(TV_ADJ_TIMING, tve->adjtiming); + tve_writel(TV_ACT_TIMING, 0x0694011D | (1 << 12) | (2 << 28)); + } + } + + if (tve->soc_type == SOC_RK3528) { + u32 upsample_mode = 0; + u32 mask = 0; + u32 val = 0; + bool upsample_en; + + upsample_en = tve->upsample_mode ? 1 : 0; + if (upsample_en) + upsample_mode = tve->upsample_mode - 1; + mask = m_TVE_DCLK_POL | m_TVE_DCLK_EN | m_DCLK_UPSAMPLE_2X4X | + m_DCLK_UPSAMPLE_EN | m_TVE_MODE | m_TVE_EN; + val = v_TVE_DCLK_POL(0) | v_TVE_DCLK_EN(1) | v_DCLK_UPSAMPLE_2X4X(upsample_mode) | + v_DCLK_UPSAMPLE_EN(upsample_en) | v_TVE_MODE(tve->tv_format) | v_TVE_EN(1); + + tve_grf_writel(RK3528_VO_GRF_CVBS_CON, (mask << 16) | val); + } +} + +static void dac_init(struct rockchip_tve *tve) +{ + tve_dac_writel(VDAC_VDAC1, v_CUR_REG(tve->dac1level) | + m_DR_PWR_DOWN | m_BG_PWR_DOWN); + tve_dac_writel(VDAC_VDAC2, v_CUR_CTR(tve->daclevel)); + tve_dac_writel(VDAC_VDAC3, v_CAB_EN(0)); +} + +static void dac_enable(struct rockchip_tve *tve, bool enable) +{ + u32 mask = 0; + u32 val = 0; + u32 grfreg = 0; + u32 offset = 0; + + if (enable) { + TVEDBG("tve enable\n"); + + if (tve->soc_type == SOC_RK3036) { + mask = m_VBG_EN | m_DAC_EN | m_DAC_GAIN; + val = m_VBG_EN | m_DAC_EN | v_DAC_GAIN(tve->daclevel); + grfreg = RK3036_GRF_SOC_CON3; + } else if (tve->soc_type == SOC_RK312X) { + mask = m_VBG_EN | m_DAC_EN | m_DAC_GAIN; + val = m_VBG_EN | m_DAC_EN | v_DAC_GAIN(tve->daclevel); + grfreg = RK312X_GRF_TVE_CON; + } else if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) { + val = v_CUR_REG(tve->dac1level) | v_DR_PWR_DOWN(0) | v_BG_PWR_DOWN(0); + } else if (tve->soc_type == SOC_RK3528) { + /* + * Reset the vdac + */ + tve_dac_writel(VDAC_CLK_RST, v_ANALOG_RST(0) | v_DIGITAL_RST(0)); + mdelay(20); + tve_dac_writel(VDAC_CLK_RST, v_ANALOG_RST(1) | v_DIGITAL_RST(1)); + + tve_dac_writel(VDAC_CURRENT_CTRL, v_OUT_CURRENT(0xd2)); + + val = v_REF_VOLTAGE(7) | v_DAC_PWN(1) | v_BIAS_PWN(1); + offset = VDAC_PWM_REF_CTRL; + } + } else { + TVEDBG("tve disable\n"); + + if (tve->soc_type == SOC_RK312X) { + mask = m_VBG_EN | m_DAC_EN; + grfreg = RK312X_GRF_TVE_CON; + } else if (tve->soc_type == SOC_RK3036) { + mask = m_VBG_EN | m_DAC_EN; + grfreg = RK3036_GRF_SOC_CON3; + } else if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) { + val = v_CUR_REG(tve->dac1level) | m_DR_PWR_DOWN | m_BG_PWR_DOWN; + offset = VDAC_VDAC1; + } else if (tve->soc_type == SOC_RK3528) { + val = v_DAC_PWN(0) | v_BIAS_PWN(0); + offset = VDAC_PWM_REF_CTRL; + } + } + + if (grfreg) + tve_grf_writel(grfreg, (mask << 16) | val); + else if (tve->vdac_base) + tve_dac_writel(offset, val); +} + +static u8 rk_get_vdac_value(void) +{ + u8 value = 0; +#ifdef CONFIG_ROCKCHIP_EFUSE +#if defined(CONFIG_ROCKCHIP_RK322X) + struct udevice *dev; + u32 regs[2] = {0}; + u8 fuses[1]; + ofnode node; + int ret; + + ret = uclass_get_device_by_driver(UCLASS_MISC, DM_GET_DRIVER(rockchip_efuse), &dev); + if (ret) { + printf("%s: no misc-device found\n", __func__); + return -EINVAL; + } + + node = dev_read_subnode(dev, "tve_dac"); + if (!ofnode_valid(node)) + return -EINVAL; + + ret = ofnode_read_u32_array(node, "reg", regs, 2); + if (ret) { + printf("Cannot get efuse reg\n"); + return -EINVAL; + } + + ret = misc_read(dev, regs[0], &fuses, regs[1]); + if (ret) { + printf("%s: misc_read failed\n", __func__); + return 0; + } + + value = fuses[0]; + value = (value >> 3) & 0x1f; +#endif +#endif /* CONFIG_RK_EFUSE */ + if (value > 0) + value += 5; + TVEDBG("%s value = 0x%x\n", __func__, value); + + return value; +} + +static int tve_parse_dt(struct rockchip_tve *tve) +{ + tve->preferred_mode = dev_read_u32_default(tve->dev, "rockchip,tvemode", -1); + if (tve->preferred_mode < 0) { + tve->preferred_mode = 0; + } else if (tve->preferred_mode > 1) { + printf("tve mode value invalid\n"); + return -EINVAL; + } + + tve->lumafilter0 = dev_read_u32_default(tve->dev, "rockchip,lumafilter0", 0); + if (tve->lumafilter0 == 0) { + printf("tve get lumafilter0 err\n"); + return -EINVAL; + } + + tve->lumafilter1 = dev_read_u32_default(tve->dev, "rockchip,lumafilter1", 0); + if (tve->lumafilter1 == 0) { + printf("tve get lumafilter1 err\n"); + return -EINVAL; + } + + tve->lumafilter2 = dev_read_u32_default(tve->dev, "rockchip,lumafilter2", 0); + if (tve->lumafilter2 == 0) { + printf("tve get lumafilter2 err\n"); + return -EINVAL; + } + + tve->lumafilter3 = dev_read_u32_default(tve->dev, "rockchip,lumafilter3", 0); + if (tve->lumafilter3 == 0) { + printf("tve get lumafilter3 err\n"); + return -EINVAL; + } + + tve->lumafilter4 = dev_read_u32_default(tve->dev, "rockchip,lumafilter4", 0); + if (tve->lumafilter4 == 0) { + printf("tve get lumafilter4 err\n"); + return -EINVAL; + } + + tve->lumafilter5 = dev_read_u32_default(tve->dev, "rockchip,lumafilter5", 0); + if (tve->lumafilter5 == 0) { + printf("tve get lumafilter5 err\n"); + return -EINVAL; + } + + tve->lumafilter6 = dev_read_u32_default(tve->dev, "rockchip,lumafilter6", 0); + if (tve->lumafilter6 == 0) { + printf("tve get lumafilter6 err\n"); + return -EINVAL; + } + + tve->lumafilter7 = dev_read_u32_default(tve->dev, "rockchip,lumafilter7", 0); + if (tve->lumafilter7 == 0) { + printf("tve get lumafilter7 err\n"); + return -EINVAL; + } + + tve->upsample_mode = dev_read_u32_default(tve->dev, "rockchip,tve-upsample", -1); + if (tve->upsample_mode < 0 || tve->upsample_mode > DCLK_UPSAMPLEx4) { + printf("tve get upsample_mode err\n"); + return -EINVAL; + } + + TVEDBG("tve->preferred_mode = 0x%x\n", tve->preferred_mode); + TVEDBG("tve->lumafilter0 = 0x%x\n", tve->lumafilter0); + TVEDBG("tve->lumafilter1 = 0x%x\n", tve->lumafilter1); + TVEDBG("tve->lumafilter2 = 0x%x\n", tve->lumafilter2); + TVEDBG("tve->lumafilter3 = 0x%x\n", tve->lumafilter3); + TVEDBG("tve->lumafilter4 = 0x%x\n", tve->lumafilter4); + TVEDBG("tve->lumafilter5 = 0x%x\n", tve->lumafilter5); + TVEDBG("tve->lumafilter6 = 0x%x\n", tve->lumafilter6); + TVEDBG("tve->lumafilter7 = 0x%x\n", tve->lumafilter7); + TVEDBG("tve->upsample_mode = 0x%x\n", tve->upsample_mode); + + return 0; +} + +static int tve_parse_dt_legacy(struct rockchip_tve *tve) +{ + int dac_value, getvdac; + + if (tve->soc_type == SOC_RK312X) + tve->test_mode = dev_read_u32_default(tve->dev, "test_mode", 0); + + tve->preferred_mode = dev_read_u32_default(tve->dev, "rockchip,tvemode", -1); + if (tve->preferred_mode < 0) { + tve->preferred_mode = 0; + } else if (tve->preferred_mode > 1) { + printf("tve mode value invalid\n"); + return -EINVAL; + } + + tve->saturation = dev_read_u32_default(tve->dev, "rockchip,saturation", 0); + if (tve->saturation == 0) { + printf("tve get saturation err\n"); + return -EINVAL; + } + + tve->brightcontrast = dev_read_u32_default(tve->dev, "rockchip,brightcontrast", 0); + if (tve->brightcontrast == 0) { + printf("tve get brightcontrast err\n"); + return -EINVAL; + } + + tve->adjtiming = dev_read_u32_default(tve->dev, "rockchip,adjtiming", 0); + if (tve->adjtiming == 0) { + printf("tve get adjtiming err\n"); + return -EINVAL; + } + + tve->lumafilter0 = dev_read_u32_default(tve->dev, "rockchip,lumafilter0", 0); + if (tve->lumafilter0 == 0) { + printf("tve get lumafilter0 err\n"); + return -EINVAL; + } + + tve->lumafilter1 = dev_read_u32_default(tve->dev, "rockchip,lumafilter1", 0); + if (tve->lumafilter1 == 0) { + printf("tve get lumafilter1 err\n"); + return -EINVAL; + } + + tve->lumafilter2 = dev_read_u32_default(tve->dev, "rockchip,lumafilter2", 0); + if (tve->lumafilter2 == 0) { + printf("tve get lumafilter2 err\n"); + return -EINVAL; + } + + dac_value = dev_read_u32_default(tve->dev, "rockchip,daclevel", 0); + if (dac_value == 0) { + printf("tve get dac_value err\n"); + return -EINVAL; + } + + tve->daclevel = dac_value; + if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) { + getvdac = rk_get_vdac_value(); + if (getvdac > 0) { + tve->daclevel = dac_value + getvdac - RK322X_VDAC_STANDARD; + if (tve->daclevel > 0x3f || tve->daclevel < 0) { + printf("rk322x daclevel error!\n"); + tve->daclevel = dac_value; + } + } else if (getvdac < 0) { + printf("get rk322x daclevel error\n"); + return -EINVAL; + } + } + + if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) { + tve->dac1level = dev_read_u32_default(tve->dev, "rockchip,dac1level", 0); + if (tve->dac1level == 0) { + printf("rk322x dac1level error!\n"); + return -EINVAL; + } + } + + TVEDBG("tve->test_mode = 0x%x\n", tve->test_mode); + TVEDBG("tve->saturation = 0x%x\n", tve->saturation); + TVEDBG("tve->brightcontrast = 0x%x\n", tve->brightcontrast); + TVEDBG("tve->adjtiming = 0x%x\n", tve->adjtiming); + TVEDBG("tve->lumafilter0 = 0x%x\n", tve->lumafilter0); + TVEDBG("tve->lumafilter1 = 0x%x\n", tve->lumafilter1); + TVEDBG("tve->lumafilter2 = 0x%x\n", tve->lumafilter2); + TVEDBG("tve->daclevel = 0x%x\n", tve->daclevel); + + return 0; +} + +static int rockchip_drm_tve_init(struct rockchip_connector *conn, struct display_state *state) +{ + struct rockchip_tve *tve = dev_get_priv(conn->dev); + struct connector_state *conn_state = &state->conn_state; + fdt_addr_t addr; + int ret; + + conn_state->output_mode = ROCKCHIP_OUT_MODE_P888; + conn_state->bus_format = MEDIA_BUS_FMT_YUV8_1X24; + if (tve->soc_type == SOC_RK3528) + conn_state->output_if |= VOP_OUTPUT_IF_BT656; + conn_state->color_space = V4L2_COLORSPACE_SMPTE170M; + + conn_state->disp_info = rockchip_get_disp_info(conn_state->type, 0); + + if (tve->soc_type == SOC_RK3528) + ret = tve_parse_dt(tve); + else + ret = tve_parse_dt_legacy(tve); + if (ret) { + printf("tve parse dts error\n"); + return -EINVAL; + } + + addr = dev_read_addr_index(conn->dev, 0); + if (addr == FDT_ADDR_T_NONE) { + printf("failed to get tve reg_base\n"); + return -EINVAL; + } + tve->reg_base = (void *)addr; + + if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328 || + tve->soc_type == SOC_RK3528) { + addr = dev_read_addr_index(conn->dev, 1); + if (addr == FDT_ADDR_T_NONE) { + printf("failed to get tve vdac_base\n"); + return -EINVAL; + } + tve->vdac_base = (void *)addr; + } + + tve->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); + + if (tve->soc_type == SOC_RK322X || tve->soc_type == SOC_RK3328) + dac_init(tve); + + return 0; +} + +static int rockchip_drm_tve_enable(struct rockchip_connector *conn, struct display_state *state) +{ + struct rockchip_tve *tve = dev_get_priv(conn->dev); + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + +#ifdef CONFIG_ROCKCHIP_INNO_HDMI_PHY + /* set inno hdmi phy clk. */ + if (tve->soc_type != SOC_RK3528) + rockchip_phy_set_pll(conn->phy, 27000000); +#endif + if (mode->vdisplay == 576) + tve->tv_format = TVOUT_CVBS_PAL; + else + tve->tv_format = TVOUT_CVBS_NTSC; + + tve_set_mode(tve); + mdelay(1000); + dac_enable(tve, true); + + return 0; +} + +static void rockchip_drm_tve_deinit(struct rockchip_connector *conn, struct display_state *state) +{ + struct rockchip_tve *tve = dev_get_priv(conn->dev); + + dac_enable(tve, false); +} + +static int rockchip_drm_tve_prepare(struct rockchip_connector *conn, struct display_state *state) +{ + return 0; +} + +static int rockchip_drm_tve_disable(struct rockchip_connector *conn, struct display_state *state) +{ + struct rockchip_tve *tve = dev_get_priv(conn->dev); + + dac_enable(tve, false); + + return 0; +} + +static int rockchip_drm_tve_detect(struct rockchip_connector *conn, struct display_state *state) +{ + return 1; +} + +static void tve_select_output(struct rockchip_tve *tve, struct connector_state *conn_state, + struct drm_display_mode *mode) +{ + int ret, i, screen_size; + struct base_screen_info *screen_info = NULL; + struct base2_screen_info *screen_info2 = NULL; + struct base_disp_info base_parameter; + struct base2_disp_info *base2_parameter = conn_state->disp_info; + struct drm_display_mode modes[2]; + const struct base_overscan *scan; + struct overscan *overscan = &conn_state->overscan; + char baseparameter_buf[8 * RK_BLK_SIZE] __aligned(ARCH_DMA_MINALIGN); + struct blk_desc *dev_desc; + disk_partition_t part_info; + int max_scan = 100; + int min_scan = 50; + int offset = 0; + bool found = false; + + for (i = 0; i < 2; i++) { + modes[i] = tve_modes[i]; + if (i == tve->preferred_mode) + modes[i].type |= DRM_MODE_TYPE_PREFERRED; + } + *mode = modes[tve->preferred_mode]; + + if (!base2_parameter) { + dev_desc = rockchip_get_bootdev(); + if (!dev_desc) { + printf("%s: Could not find device\n", __func__); + goto null_basep; + } + + ret = part_get_info_by_name(dev_desc, "baseparameter", + &part_info); + if (ret < 0) { + printf("Could not find baseparameter partition\n"); + goto null_basep; + } + +read_aux: + ret = blk_dread(dev_desc, part_info.start + offset, 1, + (void *)baseparameter_buf); + if (ret < 0) { + printf("read baseparameter failed\n"); + goto null_basep; + } + + memcpy(&base_parameter, baseparameter_buf, + sizeof(base_parameter)); + scan = &base_parameter.scan; + + screen_size = sizeof(base_parameter.screen_list) / + sizeof(base_parameter.screen_list[0]); + + for (i = 0; i < screen_size; i++) { + if (base_parameter.screen_list[i].type == + DRM_MODE_CONNECTOR_TV) { + found = true; + screen_info = &base_parameter.screen_list[i]; + break; + } + } + + if (!found && !offset) { + printf("cvbs info isn't saved in main block\n"); + offset += 16; + goto read_aux; + } + } else { + scan = &base2_parameter->overscan_info; + screen_size = sizeof(base2_parameter->screen_info) / + sizeof(base2_parameter->screen_info[0]); + + for (i = 0; i < screen_size; i++) { + if (base2_parameter->screen_info[i].type == + DRM_MODE_CONNECTOR_TV) { + screen_info2 = + &base2_parameter->screen_info[i]; + break; + } + } + screen_info = malloc(sizeof(*screen_info)); + + screen_info->type = screen_info2->type; + screen_info->mode = screen_info2->resolution; + screen_info->format = screen_info2->format; + screen_info->depth = screen_info2->depthc; + screen_info->feature = screen_info2->feature; + } + + if (scan->leftscale < min_scan && scan->leftscale > 0) + overscan->left_margin = min_scan; + else if (scan->leftscale < max_scan && scan->leftscale > 0) + overscan->left_margin = scan->leftscale; + + if (scan->rightscale < min_scan && scan->rightscale > 0) + overscan->right_margin = min_scan; + else if (scan->rightscale < max_scan && scan->rightscale > 0) + overscan->right_margin = scan->rightscale; + + if (scan->topscale < min_scan && scan->topscale > 0) + overscan->top_margin = min_scan; + else if (scan->topscale < max_scan && scan->topscale > 0) + overscan->top_margin = scan->topscale; + + if (scan->bottomscale < min_scan && scan->bottomscale > 0) + overscan->bottom_margin = min_scan; + else if (scan->bottomscale < max_scan && scan->bottomscale > 0) + overscan->bottom_margin = scan->bottomscale; + +null_basep: + + if (screen_info) + printf("cvbs base_parameter.mode:%dx%d\n", + screen_info->mode.hdisplay, + screen_info->mode.vdisplay); + + if (screen_info && + (screen_info->mode.hdisplay == 720 && + screen_info->mode.vdisplay == 576)) + *mode = modes[0]; + else if (screen_info && + (screen_info->mode.hdisplay == 720 && + screen_info->mode.vdisplay == 480)) + *mode = modes[1]; +} + +static int rockchip_drm_tve_get_timing(struct rockchip_connector *conn, struct display_state *state) +{ + struct rockchip_tve *tve = dev_get_priv(conn->dev); + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + + tve_select_output(tve, conn_state, mode); + + return 0; +} + +const struct rockchip_connector_funcs rockchip_drm_tve_funcs = { + .init = rockchip_drm_tve_init, + .deinit = rockchip_drm_tve_deinit, + .prepare = rockchip_drm_tve_prepare, + .enable = rockchip_drm_tve_enable, + .disable = rockchip_drm_tve_disable, + .get_timing = rockchip_drm_tve_get_timing, + .detect = rockchip_drm_tve_detect, +}; + +static int rockchip_drm_tve_probe(struct udevice *dev) +{ + struct rockchip_tve *tve = dev_get_priv(dev); + const struct rockchip_tve_data *data; + + tve->dev = dev; + data = (const struct rockchip_tve_data *)dev_get_driver_data(dev); + tve->soc_type = data->soc_type; + tve->input_format = data->input_format; + + rockchip_connector_bind(&tve->connector, dev, 0, &rockchip_drm_tve_funcs, NULL, DRM_MODE_CONNECTOR_TV); + + return 0; +} + +static const struct rockchip_tve_data rk3036_tve = { + .soc_type = SOC_RK3036, + .input_format = INPUT_FORMAT_RGB, +}; + +static const struct rockchip_tve_data rk312x_tve = { + .soc_type = SOC_RK312X, + .input_format = INPUT_FORMAT_RGB, +}; + +static const struct rockchip_tve_data rk322x_tve = { + .soc_type = SOC_RK322X, + .input_format = INPUT_FORMAT_YUV, +}; + +static const struct rockchip_tve_data rk3328_tve = { + .soc_type = SOC_RK3328, + .input_format = INPUT_FORMAT_YUV, +}; + +static const struct rockchip_tve_data rk3528_tve = { + .soc_type = SOC_RK3528, + .input_format = INPUT_FORMAT_YUV, +}; + +static const struct udevice_id rockchip_drm_tve_ids[] = { + { .compatible = "rockchip,rk3036-tve", .data = (ulong)&rk3036_tve }, + { .compatible = "rockchip,rk312x-tve", .data = (ulong)&rk312x_tve }, + { .compatible = "rockchip,rk322x-tve", .data = (ulong)&rk322x_tve }, + { .compatible = "rockchip,rk3328-tve", .data = (ulong)&rk3328_tve }, + { .compatible = "rockchip,rk3528-tve", .data = (ulong)&rk3528_tve }, +}; + +U_BOOT_DRIVER(rockchip_drm_tve) = { + .name = "rockchip_drm_tve", + .id = UCLASS_DISPLAY, + .of_match = rockchip_drm_tve_ids, + .probe = rockchip_drm_tve_probe, + .priv_auto_alloc_size = sizeof(struct rockchip_tve), +}; diff --git a/u-boot/drivers/video/drm/rockchip_tve.h b/u-boot/drivers/video/drm/rockchip_tve.h new file mode 100644 index 0000000..5cf5f21 --- /dev/null +++ b/u-boot/drivers/video/drm/rockchip_tve.h @@ -0,0 +1,253 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd + */ +#ifndef __ROCKCHIP_TVE_H__ +#define __ROCKCHIP_TVE_H__ + +#define RK3036_GRF_SOC_CON3 0x0154 +#define RK312X_GRF_TVE_CON 0x0170 + #define m_EXTREF_EN BIT(0) + #define m_VBG_EN BIT(1) + #define m_DAC_EN BIT(2) + #define m_SENSE_EN BIT(3) + #define m_BIAS_EN (7 << 4) + #define m_DAC_GAIN (0x3f << 7) + #define v_DAC_GAIN(x) (((x) & 0x3f) << 7) + +#define TV_CTRL (0x00) + #define m_CVBS_MODE BIT(24) + #define m_CLK_UPSTREAM_EN (3 << 18) + #define m_TIMING_EN (3 << 16) + #define m_LUMA_FILTER_GAIN (3 << 9) + #define m_LUMA_FILTER_BW BIT(8) + #define m_CSC_PATH (3 << 1) + + #define v_CVBS_MODE(x) (((x) & 1) << 24) + #define v_CLK_UPSTREAM_EN(x) (((x) & 3) << 18) + #define v_TIMING_EN(x) (((x) & 3) << 16) + #define v_LUMA_FILTER_GAIN(x) (((x) & 3) << 9) + #define v_LUMA_FILTER_UPSAMPLE(x) (((x) & 1) << 8) + #define v_CSC_PATH(x) (((x) & 3) << 1) + +#define TV_SYNC_TIMING (0x04) +#define TV_ACT_TIMING (0x08) +#define TV_ADJ_TIMING (0x0c) +#define TV_FREQ_SC (0x10) +#define TV_LUMA_FILTER0 (0x14) +#define TV_LUMA_FILTER1 (0x18) +#define TV_LUMA_FILTER2 (0x1C) +#define TV_ACT_ST (0x34) +#define TV_ROUTING (0x38) + #define m_DAC_SENSE_EN BIT(27) + #define m_Y_IRE_7_5 BIT(19) + #define m_Y_AGC_PULSE_ON BIT(15) + #define m_Y_VIDEO_ON BIT(11) + #define m_Y_SYNC_ON BIT(7) + #define m_YPP_MODE BIT(3) + #define m_MONO_EN BIT(2) + #define m_PIC_MODE BIT(1) + + #define v_DAC_SENSE_EN(x) (((x) & 1) << 27) + #define v_Y_IRE_7_5(x) (((x) & 1) << 19) + #define v_Y_AGC_PULSE_ON(x) (((x) & 1) << 15) + #define v_Y_VIDEO_ON(x) (((x) & 1) << 11) + #define v_Y_SYNC_ON(x) (((x) & 1) << 7) + #define v_YPP_MODE(x) (((x) & 1) << 3) + #define v_MONO_EN(x) (((x) & 1) << 2) + #define v_PIC_MODE(x) (((x) & 1) << 1) + +#define TV_SYNC_ADJUST (0x50) +#define TV_STATUS (0x54) +#define TV_RESET (0x68) + #define m_RESET BIT(1) + #define v_RESET(x) (((x) & 1) << 1) +#define TV_SATURATION (0x78) +#define TV_BW_CTRL (0x8C) + #define m_CHROMA_BW (3 << 4) + #define m_COLOR_DIFF_BW (0xf) + + enum { + BP_FILTER_PASS = 0, + BP_FILTER_NTSC, + BP_FILTER_PAL, + }; + enum { + COLOR_DIFF_FILTER_OFF = 0, + COLOR_DIFF_FILTER_BW_0_6, + COLOR_DIFF_FILTER_BW_1_3, + COLOR_DIFF_FILTER_BW_2_0 + }; + + #define v_CHROMA_BW(x) ((3 & (x)) << 4) + #define v_COLOR_DIFF_BW(x) (0xF & (x)) + +#define TV_BRIGHTNESS_CONTRAST (0x90) + +#define VDAC_VDAC0 (0x00) + #define m_RST_ANA BIT(7) + #define m_RST_DIG BIT(6) + + #define v_RST_ANA(x) (((x) & 1) << 7) + #define v_RST_DIG(x) (((x) & 1) << 6) +#define VDAC_VDAC1 (0x280) + #define m_CUR_REG (0xf << 4) + #define m_DR_PWR_DOWN BIT(1) + #define m_BG_PWR_DOWN BIT(0) + + #define v_CUR_REG(x) (((x) & 0xf) << 4) + #define v_DR_PWR_DOWN(x) (((x) & 1) << 1) + #define v_BG_PWR_DOWN(x) (((x) & 1) << 0) +#define VDAC_VDAC2 (0x284) + #define m_CUR_CTR (0X3f) + + #define v_CUR_CTR(x) (((x) & 0x3f)) +#define VDAC_VDAC3 (0x288) + #define m_CAB_EN BIT(5) + #define m_CAB_REF BIT(4) + #define m_CAB_FLAG BIT(0) + + #define v_CAB_EN(x) (((x) & 1) << 5) + #define v_CAB_REF(x) (((x) & 1) << 4) + #define v_CAB_FLAG(x) (((x) & 1) << 0) + +// RK3528 CVBS GRF +#define RK3528_VO_GRF_VDAC_DIS 0x60000 + #define m_VDAC_DIS_NEGE_ST BIT(2) + #define m_VDAC_DIS_POSE_ST BIT(1) + #define m_STAT_VDAC_DISDET BIT(0) + + #define v_VDAC_DIS_NEGE_ST(x) (((x) & 1) << 2) + #define v_VDAC_DIS_POSE_ST(x) (((x) & 1) << 1) + #define v_STAT_VDAC_DISDET(x) (((x) & 1) << 0) + +#define RK3528_VO_GRF_CVBS_CON 0x60010 + #define m_VDAC_DIS_INT_EN BIT(8) + #define m_VDAC_DIS_NEGE_MASK BIT(7) + #define m_VDAC_DIS_POSE_MASK BIT(6) + #define m_TVE_DCLK_POL BIT(5) + #define m_TVE_DCLK_EN BIT(4) + #define m_DCLK_UPSAMPLE_2X4X BIT(3) + #define m_DCLK_UPSAMPLE_EN BIT(2) + #define m_TVE_MODE BIT(1) + #define m_TVE_EN BIT(0) + + #define v_VDAC_DIS_INT_EN(x) (((x) & 1) << 8) + #define v_VDAC_DIS_NEGE_MASK(x) (((x) & 1) << 7) + #define v_VDAC_DIS_POSE_MASK(x) (((x) & 1) << 6) + #define v_TVE_DCLK_POL(x) (((x) & 1) << 5) + #define v_TVE_DCLK_EN(x) (((x) & 1) << 4) + #define v_DCLK_UPSAMPLE_2X4X(x) (((x) & 1) << 3) + #define v_DCLK_UPSAMPLE_EN(x) (((x) & 1) << 2) + #define v_TVE_MODE(x) (((x) & 1) << 1) + #define v_TVE_EN(x) (((x) & 1) << 0) + +// RK3528 CVBS TVE +#define BT656_DECODER_CTRL (0x3D00) +#define BT656_DECODER_CROP (0x3D04) +#define BT656_DECODER_SIZE (0x3D08) +#define BT656_DECODER_HTOTAL_HS_END (0x3D0C) +#define BT656_DECODER_VACT_ST_HACT_ST (0x3D10) +#define BT656_DECODER_VTOTAL_VS_END (0x3D14) +#define BT656_DECODER_VS_ST_END_F1 (0x3D18) +#define BT656_DECODER_DBG_REG (0x3D1C) +#define TVE_MODE_CTRL (0x3E00) +#define TVE_HOR_TIMING1 (0x3E04) +#define TVE_HOR_TIMING2 (0x3E08) +#define TVE_HOR_TIMING3 (0x3E0C) +#define TVE_SUB_CAR_FRQ (0x3E10) +#define TVE_LUMA_FILTER1 (0x3E14) +#define TVE_LUMA_FILTER2 (0x3E18) +#define TVE_LUMA_FILTER3 (0x3E1C) +#define TVE_LUMA_FILTER4 (0x3E20) +#define TVE_LUMA_FILTER5 (0x3E24) +#define TVE_LUMA_FILTER6 (0x3E28) +#define TVE_LUMA_FILTER7 (0x3E2C) +#define TVE_LUMA_FILTER8 (0x3E30) +#define TVE_IMAGE_POSITION (0x3E34) +#define TVE_ROUTING (0x3E38) +#define TVE_SYNC_ADJUST (0x3E50) +#define TVE_STATUS (0x3E54) +#define TVE_CTRL (0x3E68) +#define TVE_INTR_STATUS (0x3E6C) +#define TVE_INTR_EN (0x3E70) +#define TVE_INTR_CLR (0x3E74) +#define TVE_COLOR_BUSRT_SAT (0x3E78) +#define TVE_CHROMA_BANDWIDTH (0x3E8C) +#define TVE_BRIGHTNESS_CONTRAST (0x3E90) +#define TVE_ID (0x3E98) +#define TVE_REVISION (0x3E9C) +#define TVE_CLAMP (0x3EA0) + +// RK3528 CVBS VDAC +#define VDAC_CLK_RST (0x0000) + #define m_ANALOG_RST BIT(7) + #define m_DIGITAL_RST BIT(6) + #define m_INPUT_CLK_INV BIT(0) + + #define v_ANALOG_RST(x) (((x) & 1) << 7) + #define v_DIGITAL_RST(x) (((x) & 1) << 6) + #define v_INPUT_CLK_INV(x) (((x) & 1) << 0) +#define VDAC_SINE_CTRL (0x0004) +#define VDAC_SQUARE_CTRL (0x0008) +#define VDAC_LEVEL_CTRL0 (0x0018) +#define VDAC_LEVEL_CTRL1 (0x001C) +#define VDAC_PWM_REF_CTRL (0x0280) + #define m_REF_VOLTAGE (0xf << 4) + #define m_REF_RESISTOR BIT(3) + #define m_SMP_CLK_INV BIT(2) + #define m_DAC_PWN BIT(1) + #define m_BIAS_PWN BIT(0) + + #define v_REF_VOLTAGE(x) (((x) & 0xf) << 4) + #define v_SMP_CLK_INV(x) (((x) & 1) << 2) + #define v_REF_RESISTOR(x) (((x) & 1) << 3) + #define v_DAC_PWN(x) (((x) & 1) << 1) + #define v_BIAS_PWN(x) (((x) & 1) << 0) +#define VDAC_CURRENT_CTRL (0x0284) + #define m_OUT_CURRENT (0xff << 0) + + #define v_OUT_CURRENT(x) (((x) & 0xff) << 0) +#define VDAC_CABLE_CTRL (0x0288) +#define VDAC_VOLTAGE_CTRL (0x028C) +#define VDAC_BIAS_CLK_CTRL0 (0x0290) +#define VDAC_BIAS_CLK_CTRL1 (0x0294) +#define VDAC_AUTO_CLK_CTRL0 (0x0298) +#define VDAC_AUTO_CLK_CTRL1 (0x029C) + +enum { + TVOUT_CVBS_NTSC = 0, + TVOUT_CVBS_PAL, +}; + +enum { + INPUT_FORMAT_RGB = 0, + INPUT_FORMAT_YUV +}; + +enum { + SOC_RK3036 = 0, + SOC_RK312X, + SOC_RK322X, + SOC_RK3328, + SOC_RK3528 +}; + + +enum { + DCLK_UPSAMPLEx1 = 0, + DCLK_UPSAMPLEx2, + DCLK_UPSAMPLEx4 +}; + +#define RK30_TVE_REGBASE 0x10118000 + 0x200 +#define MAX_TVE_COUNT 2 + +#ifdef TVEDEBUG +#define TVEDBG(format, ...) \ + printf("TVE: " format, ## __VA_ARGS__) +#else +#define TVEDBG(format, ...) +#endif + +#endif /* __ROCKCHIP_TVE_H__ */ diff --git a/u-boot/drivers/video/drm/rockchip_vop.c b/u-boot/drivers/video/drm/rockchip_vop.c index e0ce7cf..fb90de8 100644 --- a/u-boot/drivers/video/drm/rockchip_vop.c +++ b/u-boot/drivers/video/drm/rockchip_vop.c @@ -97,6 +97,19 @@ return false; } +static bool is_rb_swap(uint32_t bus_format, uint32_t output_mode) +{ + /* + * The default component order of serial rgb3x8 formats + * is BGR. So it is needed to enable RB swap. + */ + if (bus_format == MEDIA_BUS_FMT_SRGB888_3X8 || + bus_format == MEDIA_BUS_FMT_SRGB888_DUMMY_4X8) + return true; + else + return false; +} + static int rockchip_vop_init_gamma(struct vop *vop, struct display_state *state) { struct crtc_state *crtc_state = &state->crtc_state; @@ -298,7 +311,7 @@ VOP_CTRL_SET(vop, win_channel[2], 0x56); VOP_CTRL_SET(vop, dsp_blank, 0); - dclk_inv = (mode->flags & DRM_MODE_FLAG_PPIXDATA) ? 0 : 1; + dclk_inv = (conn_state->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) ? 1 : 0; /* For improving signal quality, dclk need to be inverted by default on rv1106. */ if ((VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) == 12)) dclk_inv = !dclk_inv; @@ -403,8 +416,9 @@ VOP_CTRL_SET(vop, hdmi_dclk_out_en, conn_state->output_mode == ROCKCHIP_OUT_MODE_YUV420 ? 1 : 0); - if (is_uv_swap(conn_state->bus_format, conn_state->output_mode)) - VOP_CTRL_SET(vop, dsp_data_swap, DSP_RB_SWAP); + if (is_uv_swap(conn_state->bus_format, conn_state->output_mode) || + is_rb_swap(conn_state->bus_format, conn_state->output_mode)) + VOP_CTRL_SET(vop, dsp_rb_swap, 1); else VOP_CTRL_SET(vop, dsp_data_swap, 0); @@ -888,6 +902,16 @@ return 0; } +static int rockchip_vop_mode_fixup(struct display_state *state) +{ + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + + drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V | CRTC_STEREO_DOUBLE); + + return 0; +} + const struct rockchip_crtc_funcs rockchip_vop_funcs = { .preinit = rockchip_vop_preinit, .init = rockchip_vop_init, @@ -899,4 +923,5 @@ .send_mcu_cmd = rockchip_vop_send_mcu_cmd, .mode_valid = rockchip_vop_mode_valid, .plane_check = rockchip_vop_plane_check, + .mode_fixup = rockchip_vop_mode_fixup, }; diff --git a/u-boot/drivers/video/drm/rockchip_vop.h b/u-boot/drivers/video/drm/rockchip_vop.h index c75550d..aa2209d 100644 --- a/u-boot/drivers/video/drm/rockchip_vop.h +++ b/u-boot/drivers/video/drm/rockchip_vop.h @@ -298,6 +298,11 @@ struct vop_reg dsp_out_yuv; struct vop_reg dsp_data_swap; + struct vop_reg dsp_bg_swap; + struct vop_reg dsp_rb_swap; + struct vop_reg dsp_rg_swap; + struct vop_reg dsp_delta_swap; + struct vop_reg dsp_dummy_swap; struct vop_reg dsp_ccir656_avg; struct vop_reg dsp_black; struct vop_reg dsp_blank; diff --git a/u-boot/drivers/video/drm/rockchip_vop2.c b/u-boot/drivers/video/drm/rockchip_vop2.c index 4015101..040b54d 100644 --- a/u-boot/drivers/video/drm/rockchip_vop2.c +++ b/u-boot/drivers/video/drm/rockchip_vop2.c @@ -17,20 +17,24 @@ #include <linux/list.h> #include <linux/log2.h> #include <linux/media-bus-format.h> -#include <clk.h> #include <asm/arch/clock.h> +#include <asm/gpio.h> #include <linux/err.h> #include <linux/ioport.h> #include <dm/device.h> #include <dm/read.h> +#include <dm/ofnode.h> #include <fixp-arith.h> #include <syscon.h> #include <linux/iopoll.h> #include <dm/uclass-internal.h> +#include <stdlib.h> #include "rockchip_display.h" #include "rockchip_crtc.h" #include "rockchip_connector.h" +#include "rockchip_phy.h" +#include "rockchip_post_csc.h" /* System registers definition */ #define RK3568_REG_CFG_DONE 0x000 @@ -40,9 +44,12 @@ #define EN_MASK 1 #define RK3568_AUTO_GATING_CTRL 0x008 +#define AUTO_GATING_EN_SHIFT 31 +#define PORT_DCLK_AUTO_GATING_EN_SHIFT 14 #define RK3568_SYS_AXI_LUT_CTRL 0x024 #define LUT_DMA_EN_SHIFT 0 +#define DSP_VS_T_SEL_SHIFT 16 #define RK3568_DSP_IF_EN 0x028 #define RGB_EN_SHIFT 0 @@ -81,6 +88,9 @@ #define LVDS_DUAL_EN_SHIFT 0 #define LVDS_DUAL_LEFT_RIGHT_EN_SHIFT 1 #define LVDS_DUAL_SWAP_EN_SHIFT 2 +#define BT656_UV_SWAP 4 +#define BT656_YC_SWAP 5 +#define BT656_DCLK_POL 6 #define RK3588_HDMI_DUAL_EN_SHIFT 8 #define RK3588_EDP_DUAL_EN_SHIFT 8 #define RK3588_DP_DUAL_EN_SHIFT 9 @@ -93,15 +103,22 @@ #define IF_CTRL_REG_DONE_IMD_SHIFT 28 #define IF_CRTL_MIPI_DCLK_POL_SHIT 19 #define IF_CRTL_EDP_DCLK_POL_SHIT 15 +#define IF_CTRL_EDP_PIN_POL_MASK 0x7 +#define IF_CTRL_EDP_PIN_POL_SHIFT 12 #define IF_CRTL_HDMI_DCLK_POL_SHIT 7 #define IF_CRTL_HDMI_PIN_POL_MASK 0x7 #define IF_CRTL_HDMI_PIN_POL_SHIT 4 +#define IF_CTRL_RGB_LVDS_DCLK_POL_SHIFT 3 +#define IF_CTRL_RGB_LVDS_PIN_POL_MASK 0x7 +#define IF_CTRL_RGB_LVDS_PIN_POL_SHIFT 0 + +#define RK3562_MIPI_DCLK_POL_SHIFT 15 +#define RK3562_MIPI_PIN_POL_SHIFT 12 +#define RK3562_IF_PIN_POL_MASK 0x7 #define RK3588_DP0_PIN_POL_SHIFT 8 #define RK3588_DP1_PIN_POL_SHIFT 12 #define RK3588_IF_PIN_POL_MASK 0x7 - -#define IF_CRTL_RGB_LVDS_DCLK_POL_SHIT 3 #define HDMI_EDP0_DCLK_DIV_SHIFT 16 #define HDMI_EDP0_PIXCLK_DIV_SHIFT 18 @@ -118,6 +135,8 @@ #define GAMMA_AHB_WRITE_SEL_MASK 0x3 #define GAMMA_AHB_WRITE_SEL_SHIFT 12 #define PORT_MERGE_EN_SHIFT 16 +#define ESMART_LB_MODE_SEL_MASK 0x3 +#define ESMART_LB_MODE_SEL_SHIFT 26 #define RK3568_SYS_PD_CTRL 0x034 #define RK3568_VP0_LINE_FLAG 0x70 @@ -145,6 +164,11 @@ #define RK3588_DSC_8K_PD_EN_SHIFT 5 #define RK3588_DSC_4K_PD_EN_SHIFT 6 #define RK3588_ESMART_PD_EN_SHIFT 7 + +#define RK3588_SYS_VAR_FREQ_CTRL 0x038 +#define RK3588_VP0_LINE_FLAG_OR_EN_SHIFT 20 +#define RK3588_VP0_DSP_HOLD_OR_EN_SHIFT 24 +#define RK3588_VP0_ALMOST_FULL_OR_EN_SHIFT 28 #define RK3568_SYS_STATUS0 0x60 #define RK3588_CLUSTER0_PD_STATUS_SHIFT 8 @@ -212,10 +236,27 @@ #define RK3588_DSC_8K_STATUS 0x220 /* Overlay registers definition */ +#define RK3528_OVL_SYS 0x500 +#define RK3528_OVL_SYS_PORT_SEL_IMD 0x504 +#define RK3528_OVL_SYS_GATING_EN_IMD 0x508 +#define RK3528_OVL_SYS_CLUSTER0_CTRL 0x510 +#define RK3528_OVL_SYS_ESMART0_CTRL 0x520 +#define ESMART_DLY_NUM_MASK 0xff +#define ESMART_DLY_NUM_SHIFT 0 +#define RK3528_OVL_SYS_ESMART1_CTRL 0x524 +#define RK3528_OVL_SYS_ESMART2_CTRL 0x528 +#define RK3528_OVL_SYS_ESMART3_CTRL 0x52C +#define RK3528_CLUSTER0_MIX_SRC_COLOR_CTRL 0x530 +#define RK3528_CLUSTER0_MIX_DST_COLOR_CTRL 0x534 +#define RK3528_CLUSTER0_MIX_SRC_ALPHA_CTRL 0x538 +#define RK3528_CLUSTER0_MIX_DST_ALPHA_CTRL 0x53c + +#define RK3528_OVL_PORT0_CTRL 0x600 #define RK3568_OVL_CTRL 0x600 #define OVL_MODE_SEL_MASK 0x1 #define OVL_MODE_SEL_SHIFT 0 #define OVL_PORT_MUX_REG_DONE_IMD_SHIFT 28 +#define RK3528_OVL_PORT0_LAYER_SEL 0x604 #define RK3568_OVL_LAYER_SEL 0x604 #define LAYER_SEL_MASK 0xf @@ -229,10 +270,27 @@ #define RK3568_CLUSTER0_MIX_DST_COLOR_CTRL 0x614 #define RK3568_CLUSTER0_MIX_SRC_ALPHA_CTRL 0x618 #define RK3568_CLUSTER0_MIX_DST_ALPHA_CTRL 0x61C +#define RK3528_OVL_PORT0_MIX0_SRC_COLOR_CTRL 0x620 +#define RK3528_OVL_PORT0_MIX0_DST_COLOR_CTRL 0x624 +#define RK3528_OVL_PORT0_MIX0_SRC_ALPHA_CTRL 0x628 +#define RK3528_OVL_PORT0_MIX0_DST_ALPHA_CTRL 0x62C +#define RK3528_OVL_PORT0_MIX1_SRC_COLOR_CTRL 0x630 +#define RK3528_OVL_PORT0_MIX1_DST_COLOR_CTRL 0x634 +#define RK3528_OVL_PORT0_MIX1_SRC_ALPHA_CTRL 0x638 +#define RK3528_OVL_PORT0_MIX1_DST_ALPHA_CTRL 0x63C +#define RK3528_OVL_PORT0_MIX2_SRC_COLOR_CTRL 0x640 +#define RK3528_OVL_PORT0_MIX2_DST_COLOR_CTRL 0x644 +#define RK3528_OVL_PORT0_MIX2_SRC_ALPHA_CTRL 0x648 +#define RK3528_OVL_PORT0_MIX2_DST_ALPHA_CTRL 0x64C #define RK3568_MIX0_SRC_COLOR_CTRL 0x650 #define RK3568_MIX0_DST_COLOR_CTRL 0x654 #define RK3568_MIX0_SRC_ALPHA_CTRL 0x658 #define RK3568_MIX0_DST_ALPHA_CTRL 0x65C +#define RK3528_HDR_SRC_COLOR_CTRL 0x660 +#define RK3528_HDR_DST_COLOR_CTRL 0x664 +#define RK3528_HDR_SRC_ALPHA_CTRL 0x668 +#define RK3528_HDR_DST_ALPHA_CTRL 0x66C +#define RK3528_OVL_PORT0_BG_MIX_CTRL 0x670 #define RK3568_HDR0_SRC_COLOR_CTRL 0x6C0 #define RK3568_HDR0_DST_COLOR_CTRL 0x6C4 #define RK3568_HDR0_SRC_ALPHA_CTRL 0x6C8 @@ -244,6 +302,22 @@ #define RK3568_VP2_BG_MIX_CTRL 0x6E8 #define RK3568_CLUSTER_DLY_NUM 0x6F0 #define RK3568_SMART_DLY_NUM 0x6F8 + +#define RK3528_OVL_PORT1_CTRL 0x700 +#define RK3528_OVL_PORT1_LAYER_SEL 0x704 +#define RK3528_OVL_PORT1_MIX0_SRC_COLOR_CTRL 0x720 +#define RK3528_OVL_PORT1_MIX0_DST_COLOR_CTRL 0x724 +#define RK3528_OVL_PORT1_MIX0_SRC_ALPHA_CTRL 0x728 +#define RK3528_OVL_PORT1_MIX0_DST_ALPHA_CTRL 0x72C +#define RK3528_OVL_PORT1_MIX1_SRC_COLOR_CTRL 0x730 +#define RK3528_OVL_PORT1_MIX1_DST_COLOR_CTRL 0x734 +#define RK3528_OVL_PORT1_MIX1_SRC_ALPHA_CTRL 0x738 +#define RK3528_OVL_PORT1_MIX1_DST_ALPHA_CTRL 0x73C +#define RK3528_OVL_PORT1_MIX2_SRC_COLOR_CTRL 0x740 +#define RK3528_OVL_PORT1_MIX2_DST_COLOR_CTRL 0x744 +#define RK3528_OVL_PORT1_MIX2_SRC_ALPHA_CTRL 0x748 +#define RK3528_OVL_PORT1_MIX2_DST_ALPHA_CTRL 0x74C +#define RK3528_OVL_PORT1_BG_MIX_CTRL 0x770 /* Video Port registers definition */ #define RK3568_VP0_DSP_CTRL 0xC00 @@ -263,6 +337,7 @@ #define POST_DSP_OUT_R2Y_SHIFT 15 #define PRE_DITHER_DOWN_EN_SHIFT 16 #define DITHER_DOWN_EN_SHIFT 17 +#define DITHER_DOWN_MODE_SHIFT 20 #define GAMMA_UPDATE_EN_SHIFT 22 #define DSP_LUT_EN_SHIFT 28 @@ -279,6 +354,9 @@ #define RK3568_VP0_COLOR_BAR_CTRL 0xC08 + +#define RK3568_VP0_DCLK_SEL 0xC0C + #define RK3568_VP0_3D_LUT_CTRL 0xC10 #define VP0_3D_LUT_EN_SHIFT 0 #define VP0_3D_LUT_UPDATE_SHIFT 2 @@ -333,6 +411,50 @@ #define BCSH_EN_SHIFT 31 #define BCSH_EN_MASK 1 +#define RK3528_VP0_ACM_CTRL 0xCD0 +#define POST_CSC_COE00_MASK 0xFFFF +#define POST_CSC_COE00_SHIFT 16 +#define POST_R2Y_MODE_MASK 0x7 +#define POST_R2Y_MODE_SHIFT 8 +#define POST_CSC_MODE_MASK 0x7 +#define POST_CSC_MODE_SHIFT 3 +#define POST_R2Y_EN_MASK 0x1 +#define POST_R2Y_EN_SHIFT 2 +#define POST_CSC_EN_MASK 0x1 +#define POST_CSC_EN_SHIFT 1 +#define POST_ACM_BYPASS_EN_MASK 0x1 +#define POST_ACM_BYPASS_EN_SHIFT 0 +#define RK3528_VP0_CSC_COE01_02 0xCD4 +#define RK3528_VP0_CSC_COE10_11 0xCD8 +#define RK3528_VP0_CSC_COE12_20 0xCDC +#define RK3528_VP0_CSC_COE21_22 0xCE0 +#define RK3528_VP0_CSC_OFFSET0 0xCE4 +#define RK3528_VP0_CSC_OFFSET1 0xCE8 +#define RK3528_VP0_CSC_OFFSET2 0xCEC + +#define RK3562_VP0_MCU_CTRL 0xCF8 +#define MCU_TYPE_SHIFT 31 +#define MCU_BYPASS_SHIFT 30 +#define MCU_RS_SHIFT 29 +#define MCU_FRAME_ST_SHIFT 28 +#define MCU_HOLD_MODE_SHIFT 27 +#define MCU_CLK_SEL_SHIFT 26 +#define MCU_CLK_SEL_MASK 0x1 +#define MCU_RW_PEND_SHIFT 20 +#define MCU_RW_PEND_MASK 0x3F +#define MCU_RW_PST_SHIFT 16 +#define MCU_RW_PST_MASK 0xF +#define MCU_CS_PEND_SHIFT 10 +#define MCU_CS_PEND_MASK 0x3F +#define MCU_CS_PST_SHIFT 6 +#define MCU_CS_PST_MASK 0xF +#define MCU_PIX_TOTAL_SHIFT 0 +#define MCU_PIX_TOTAL_MASK 0x3F + +#define RK3562_VP0_MCU_RW_BYPASS_PORT 0xCFC +#define MCU_WRITE_DATA_BYPASS_SHIFT 0 +#define MCU_WRITE_DATA_BYPASS_MASK 0xFFFFFFFF + #define RK3568_VP1_DSP_CTRL 0xD00 #define RK3568_VP1_MIPI_CTRL 0xD04 #define RK3568_VP1_COLOR_BAR_CTRL 0xD08 @@ -374,9 +496,20 @@ #define CLUSTER_YUV2RGB_EN_SHIFT 8 #define CLUSTER_RGB2YUV_EN_SHIFT 9 #define CLUSTER_CSC_MODE_SHIFT 10 -#define CLUSTER_YRGB_XSCL_MODE_SHIFT 12 -#define CLUSTER_YRGB_YSCL_MODE_SHIFT 14 +#define CLUSTER_DITHER_UP_EN_SHIFT 18 #define RK3568_CLUSTER0_WIN0_CTRL1 0x1004 +#define RK3568_CLUSTER_YRGB_XSCL_MODE_SHIFT 12 +#define RK3568_CLUSTER_YRGB_YSCL_MODE_SHIFT 14 +#define RK3528_CLUSTER_YRGB_YSCL_MODE_SHIFT 14 +#define AVG2_MASK 0x1 +#define CLUSTER_AVG2_SHIFT 18 +#define AVG4_MASK 0x1 +#define CLUSTER_AVG4_SHIFT 19 +#define RK3528_CLUSTER_YRGB_XSCL_MODE_SHIFT 22 +#define CLUSTER_XGT_EN_SHIFT 24 +#define XGT_MODE_MASK 0x3 +#define CLUSTER_XGT_MODE_SHIFT 25 +#define CLUSTER_XAVG_EN_SHIFT 27 #define CLUSTER_YRGB_GT2_SHIFT 28 #define CLUSTER_YRGB_GT4_SHIFT 29 #define RK3568_CLUSTER0_WIN0_CTRL2 0x1008 @@ -399,6 +532,7 @@ #define RK3568_CLUSTER0_WIN0_AFBCD_PIC_OFFSET 0x1064 #define RK3568_CLUSTER0_WIN0_AFBCD_DSP_OFFSET 0x1068 #define RK3568_CLUSTER0_WIN0_AFBCD_CTRL 0x106C +#define CLUSTER_AFBCD_HALF_BLOCK_SHIFT 7 #define RK3568_CLUSTER0_WIN1_CTRL0 0x1080 #define RK3568_CLUSTER0_WIN1_CTRL1 0x1084 @@ -463,6 +597,8 @@ #define RGB2YUV_EN_SHIFT 1 #define CSC_MODE_SHIFT 2 #define CSC_MODE_MASK 0x3 +#define ESMART_LB_SELECT_SHIFT 12 +#define ESMART_LB_SELECT_MASK 0x3 #define RK3568_ESMART0_CTRL1 0x1804 #define ESMART_AXI_YRGB_ID_MASK 0x1f @@ -476,10 +612,14 @@ #define ESMART_AXI_ID_SHIFT 1 #define RK3568_ESMART0_REGION0_CTRL 0x1810 -#define REGION0_RB_SWAP_SHIFT 14 #define WIN_EN_SHIFT 0 #define WIN_FORMAT_MASK 0x1f #define WIN_FORMAT_SHIFT 1 +#define REGION0_DITHER_UP_EN_SHIFT 12 +#define REGION0_RB_SWAP_SHIFT 14 +#define ESMART_XAVG_EN_SHIFT 20 +#define ESMART_XGT_EN_SHIFT 21 +#define ESMART_XGT_MODE_SHIFT 22 #define RK3568_ESMART0_REGION0_YRGB_MST 0x1814 #define RK3568_ESMART0_REGION0_CBR_MST 0x1818 @@ -680,6 +820,13 @@ #define RK3568_SMART1_REGION3_SCL_FACTOR_CBR 0x1EC8 #define RK3568_SMART1_REGION3_SCL_OFFSET 0x1ECC +/* HDR register definition */ +#define RK3568_HDR_LUT_CTRL 0x2000 + +#define RK3588_VP3_DSP_CTRL 0xF00 +#define RK3588_CLUSTER2_WIN0_CTRL0 0x1400 +#define RK3588_CLUSTER3_WIN0_CTRL0 0x1600 + /* DSC 8K/4K register definition */ #define RK3588_DSC_8K_PPS0_3 0x4000 #define RK3588_DSC_8K_CTRL0 0x40A0 @@ -690,10 +837,14 @@ #define DSC_MER_SHIFT 5 #define DSC_EPB_SHIFT 6 #define DSC_EPL_SHIFT 7 +#define DSC_NSLC_MASK 0x7 #define DSC_NSLC_SHIFT 16 #define DSC_SBO_SHIFT 28 #define DSC_IFEP_SHIFT 29 #define DSC_PPS_UPD_SHIFT 31 +#define DSC_CTRL0_DEF_CON ((1 << DSC_EN_SHIFT) | (1 << DSC_RBIT_SHIFT) | (0 << DSC_RBYT_SHIFT) | \ + (1 << DSC_FLAL_SHIFT) | (1 << DSC_MER_SHIFT) | (0 << DSC_EPB_SHIFT) | \ + (1 << DSC_EPL_SHIFT) | (1 << DSC_SBO_SHIFT)) #define RK3588_DSC_8K_CTRL1 0x40A4 #define RK3588_DSC_8K_STS0 0x40A8 @@ -705,8 +856,24 @@ #define RK3588_DSC_4K_STS0 0x41A8 #define RK3588_DSC_4K_ERS 0x41C4 +/* RK3528 HDR register definition */ +#define RK3528_HDR_LUT_CTRL 0x2000 + +/* RK3528 ACM register definition */ +#define RK3528_ACM_CTRL 0x6400 +#define RK3528_ACM_DELTA_RANGE 0x6404 +#define RK3528_ACM_FETCH_START 0x6408 +#define RK3528_ACM_FETCH_DONE 0x6420 +#define RK3528_ACM_YHS_DEL_HY_SEG0 0x6500 +#define RK3528_ACM_YHS_DEL_HY_SEG152 0x6760 +#define RK3528_ACM_YHS_DEL_HS_SEG0 0x6764 +#define RK3528_ACM_YHS_DEL_HS_SEG220 0x6ad4 +#define RK3528_ACM_YHS_DEL_HGAIN_SEG0 0x6ad8 +#define RK3528_ACM_YHS_DEL_HGAIN_SEG64 0x6bd8 + #define RK3568_MAX_REG 0x1ED0 +#define RK3562_GRF_IOC_VO_IO_CON 0x10500 #define RK3568_GRF_VO_CON1 0x0364 #define GRF_BT656_CLK_INV_SHIFT 1 #define GRF_BT1120_CLK_INV_SHIFT 2 @@ -771,11 +938,52 @@ #define VOP2_PLANE_NO_SCALING BIT(16) -enum vop2_csc_format { +#define VOP_FEATURE_OUTPUT_10BIT BIT(0) +#define VOP_FEATURE_AFBDC BIT(1) +#define VOP_FEATURE_ALPHA_SCALE BIT(2) +#define VOP_FEATURE_HDR10 BIT(3) +#define VOP_FEATURE_NEXT_HDR BIT(4) +/* a feature to splice two windows and two vps to support resolution > 4096 */ +#define VOP_FEATURE_SPLICE BIT(5) +#define VOP_FEATURE_OVERSCAN BIT(6) +#define VOP_FEATURE_VIVID_HDR BIT(7) +#define VOP_FEATURE_POST_ACM BIT(8) +#define VOP_FEATURE_POST_CSC BIT(9) + +#define WIN_FEATURE_HDR2SDR BIT(0) +#define WIN_FEATURE_SDR2HDR BIT(1) +#define WIN_FEATURE_PRE_OVERLAY BIT(2) +#define WIN_FEATURE_AFBDC BIT(3) +#define WIN_FEATURE_CLUSTER_MAIN BIT(4) +#define WIN_FEATURE_CLUSTER_SUB BIT(5) +/* a mirror win can only get fb address + * from source win: + * Cluster1---->Cluster0 + * Esmart1 ---->Esmart0 + * Smart1 ---->Smart0 + * This is a feather on rk3566 + */ +#define WIN_FEATURE_MIRROR BIT(6) +#define WIN_FEATURE_MULTI_AREA BIT(7) +#define WIN_FEATURE_Y2R_13BIT_DEPTH BIT(8) + +#define V4L2_COLORSPACE_BT709F 0xfe +#define V4L2_COLORSPACE_BT2020F 0xff + +enum vop_csc_format { CSC_BT601L, CSC_BT709L, CSC_BT601F, CSC_BT2020, + CSC_BT709L_13BIT, + CSC_BT709F_13BIT, + CSC_BT2020L_13BIT, + CSC_BT2020F_13BIT, +}; + +enum vop_csc_bit_depth { + CSC_10BIT_DEPTH, + CSC_13BIT_DEPTH, }; enum vop2_pol { @@ -861,6 +1069,19 @@ VOP_DSC_IF_MIPI_VIDEO_MODE = 3, }; +enum vop3_pre_scale_down_mode { + VOP3_PRE_SCALE_UNSPPORT, + VOP3_PRE_SCALE_DOWN_GT, + VOP3_PRE_SCALE_DOWN_AVG, +}; + +enum vop3_esmart_lb_mode { + VOP3_ESMART_8K_MODE, + VOP3_ESMART_4K_4K_MODE, + VOP3_ESMART_4K_2K_2K_MODE, + VOP3_ESMART_2K_2K_2K_2K_MODE, +}; + struct vop2_layer { u8 id; /** @@ -886,12 +1107,19 @@ u8 phys_id; enum vop2_layer_type type; u8 win_sel_port_offset; - u8 layer_sel_win_id; + u8 layer_sel_win_id[VOP2_VP_MAX]; u8 axi_id; u8 axi_uv_id; u8 axi_yrgb_id; u8 splice_win_id; u8 pd_id; + u8 hsu_filter_mode; + u8 hsd_filter_mode; + u8 vsu_filter_mode; + u8 vsd_filter_mode; + u8 hsd_pre_filter_mode; + u8 vsd_pre_filter_mode; + u8 scale_engine_num; u32 reg_offset; u32 max_upscale_factor; u32 max_downscale_factor; @@ -901,6 +1129,9 @@ struct vop2_vp_data { u32 feature; u8 pre_scan_max_dly; + u8 layer_mix_dly; + u8 hdr_mix_dly; + u8 win_dly; u8 splice_vp_id; struct vop_rect max_output; u32 max_dclk; @@ -936,8 +1167,18 @@ char dsc_error_info[50]; }; +struct vop2_dump_regs { + u32 offset; + const char *name; + u32 state_base; + u32 state_mask; + u32 state_shift; + bool enable_state; +}; + struct vop2_data { u32 version; + u32 esmart_lb_mode; struct vop2_vp_data *vp_data; struct vop2_win_data *win_data; struct vop2_vp_plane_mask *plane_mask; @@ -946,6 +1187,8 @@ struct vop2_dsc_data *dsc; struct dsc_error_info *dsc_error_ecw; struct dsc_error_info *dsc_error_buffer_flow; + struct vop2_dump_regs *dump_regs; + u8 *vp_primary_plane_order; u8 nr_vps; u8 nr_layers; u8 nr_mixers; @@ -955,6 +1198,7 @@ u8 nr_dsc_ecw; u8 nr_dsc_buffer_flow; u32 reg_len; + u32 dump_regs_size; }; struct vop2 { @@ -966,12 +1210,22 @@ void *sys_pmu; u32 reg_len; u32 version; + u32 esmart_lb_mode; bool global_init; const struct vop2_data *data; struct vop2_vp_plane_mask vp_plane_mask[VOP2_VP_MAX]; }; static struct vop2 *rockchip_vop2; + +static inline bool is_vop3(struct vop2 *vop2) +{ + if (vop2->version == VOP_VERSION_RK3568 || vop2->version == VOP_VERSION_RK3588) + return false; + else + return true; +} + /* * bli_sd_factor = (src - 1) / (dst - 1) << 12; * avg_sd_factor: @@ -979,8 +1233,8 @@ * bic_su_factor: * = (src - 1) / (dst - 1) << 16; * - * gt2 enable: dst get one line from two line of the src - * gt4 enable: dst get one line from four line of the src. + * ygt2 enable: dst get one line from two line of the src + * ygt4 enable: dst get one line from four line of the src. * */ #define VOP2_BILI_SCL_DN(src, dst) (((src - 1) << 12) / (dst - 1)) @@ -989,6 +1243,8 @@ #define VOP2_BILI_SCL_FAC_CHECK(src, dst, fac) \ (fac * (dst - 1) >> 12 < (src - 1)) #define VOP2_COMMON_SCL_FAC_CHECK(src, dst, fac) \ + (fac * (dst - 1) >> 16 < (src - 1)) +#define VOP3_COMMON_HOR_SCL_FAC_CHECK(src, dst, fac) \ (fac * (dst - 1) >> 16 < (src - 1)) static uint16_t vop2_scale_factor(enum scale_mode mode, @@ -1030,6 +1286,51 @@ return fac; } +static bool vop3_scale_up_fac_check(uint32_t src, uint32_t dst, uint32_t fac, bool is_hor) +{ + if (is_hor) + return VOP3_COMMON_HOR_SCL_FAC_CHECK(src, dst, fac); + return VOP2_COMMON_SCL_FAC_CHECK(src, dst, fac); +} + +static uint16_t vop3_scale_factor(enum scale_mode mode, + uint32_t src, uint32_t dst, bool is_hor) +{ + uint32_t fac = 0; + int i = 0; + + if (mode == SCALE_NONE) + return 0; + + /* + * A workaround to avoid zero div. + */ + if ((dst == 1) || (src == 1)) { + dst = dst + 1; + src = src + 1; + } + + if (mode == SCALE_DOWN) { + fac = VOP2_BILI_SCL_DN(src, dst); + for (i = 0; i < 100; i++) { + if (VOP2_BILI_SCL_FAC_CHECK(src, dst, fac)) + break; + fac -= 1; + printf("down fac cali: src:%d, dst:%d, fac:0x%x\n", src, dst, fac); + } + } else { + fac = VOP2_COMMON_SCL(src, dst); + for (i = 0; i < 100; i++) { + if (vop3_scale_up_fac_check(src, dst, fac, is_hor)) + break; + fac -= 1; + printf("up fac cali: src:%d, dst:%d, fac:0x%x\n", src, dst, fac); + } + } + + return fac; +} + static inline enum scale_mode scl_get_scl_mode(int src, int dst) { if (src < dst) @@ -1040,19 +1341,6 @@ return SCALE_NONE; } -static u8 rk3588_vop2_vp_primary_plane_order[VOP2_VP_MAX] = { - ROCKCHIP_VOP2_ESMART0, - ROCKCHIP_VOP2_ESMART1, - ROCKCHIP_VOP2_ESMART2, - ROCKCHIP_VOP2_ESMART3, -}; - -static u8 rk3568_vop2_vp_primary_plane_order[VOP2_VP_MAX] = { - ROCKCHIP_VOP2_SMART0, - ROCKCHIP_VOP2_SMART1, - ROCKCHIP_VOP2_ESMART1, -}; - static inline int interpolate(int x1, int y1, int x2, int y2, int x) { return y1 + (y2 - y1) * (x - x1) / (x2 - x1); @@ -1061,23 +1349,13 @@ static int vop2_get_primary_plane(struct vop2 *vop2, u32 plane_mask) { int i = 0; - u8 *vop2_vp_primary_plane_order; - u8 default_primary_plane; - if (vop2->version == VOP_VERSION_RK3588) { - vop2_vp_primary_plane_order = rk3588_vop2_vp_primary_plane_order; - default_primary_plane = ROCKCHIP_VOP2_ESMART0; - } else { - vop2_vp_primary_plane_order = rk3568_vop2_vp_primary_plane_order; - default_primary_plane = ROCKCHIP_VOP2_SMART0; + for (i = 0; i < vop2->data->nr_layers; i++) { + if (plane_mask & BIT(vop2->data->vp_primary_plane_order[i])) + return vop2->data->vp_primary_plane_order[i]; } - for (i = 0; i < vop2->data->nr_vps; i++) { - if (plane_mask & BIT(vop2_vp_primary_plane_order[i])) - return vop2_vp_primary_plane_order[i]; - } - - return default_primary_plane; + return vop2->data->vp_primary_plane_order[0]; } static inline u16 scl_cal_scale(int src, int dst, int shift) @@ -1210,6 +1488,7 @@ switch (bus_format) { case MEDIA_BUS_FMT_YUV8_1X24: case MEDIA_BUS_FMT_YUV10_1X30: + case MEDIA_BUS_FMT_YUYV10_1X20: case MEDIA_BUS_FMT_UYYVYY8_0_5X24: case MEDIA_BUS_FMT_UYYVYY10_0_5X30: case MEDIA_BUS_FMT_YUYV8_2X8: @@ -1226,7 +1505,7 @@ } } -static int vop2_convert_csc_mode(int csc_mode) +static int vop2_convert_csc_mode(int csc_mode, int bit_depth) { switch (csc_mode) { case V4L2_COLORSPACE_SMPTE170M: @@ -1236,11 +1515,31 @@ case V4L2_COLORSPACE_REC709: case V4L2_COLORSPACE_SMPTE240M: case V4L2_COLORSPACE_DEFAULT: - return CSC_BT709L; + if (bit_depth == CSC_13BIT_DEPTH) + return CSC_BT709L_13BIT; + else + return CSC_BT709L; case V4L2_COLORSPACE_JPEG: return CSC_BT601F; case V4L2_COLORSPACE_BT2020: - return CSC_BT2020; + if (bit_depth == CSC_13BIT_DEPTH) + return CSC_BT2020L_13BIT; + else + return CSC_BT2020; + case V4L2_COLORSPACE_BT709F: + if (bit_depth == CSC_10BIT_DEPTH) { + printf("WARN: Unsupported bt709f at 10bit csc depth, use bt601f instead\n"); + return CSC_BT601F; + } else { + return CSC_BT709F_13BIT; + } + case V4L2_COLORSPACE_BT2020F: + if (bit_depth == CSC_10BIT_DEPTH) { + printf("WARN: Unsupported bt2020f at 10bit csc depth, use bt601f instead\n"); + return CSC_BT601F; + } else { + return CSC_BT2020F_13BIT; + } default: return CSC_BT709L; } @@ -1265,6 +1564,19 @@ bus_format == MEDIA_BUS_FMT_YUV10_1X30) && (output_mode == ROCKCHIP_OUT_MODE_AAAA || output_mode == ROCKCHIP_OUT_MODE_P888))) + return true; + else + return false; +} + +static bool is_rb_swap(u32 bus_format, u32 output_mode) +{ + /* + * The default component order of serial rgb3x8 formats + * is BGR. So it is needed to enable RB swap. + */ + if (bus_format == MEDIA_BUS_FMT_SRGB888_3X8 || + bus_format == MEDIA_BUS_FMT_SRGB888_DUMMY_4X8) return true; else return false; @@ -1533,7 +1845,7 @@ cstate->post_y2r_en = 1; } - cstate->post_csc_mode = vop2_convert_csc_mode(conn_state->color_space); + cstate->post_csc_mode = vop2_convert_csc_mode(conn_state->color_space, CSC_10BIT_DEPTH); if (cstate->feature & VOP_FEATURE_OUTPUT_10BIT) brightness = interpolate(0, -128, 100, 127, @@ -1578,7 +1890,7 @@ u16 hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; bg_ovl_dly = cstate->crtc->vps[crtc_id].bg_ovl_dly; - bg_dly = vop2->data->vp_data[crtc_id].pre_scan_max_dly; + bg_dly = vop2->data->vp_data[crtc_id].pre_scan_max_dly; bg_dly -= bg_ovl_dly; if (cstate->splice_mode) @@ -1590,6 +1902,33 @@ hsync_len = 8; pre_scan_dly = (pre_scan_dly << 16) | hsync_len; vop2_mask_write(vop2, RK3568_VP0_BG_MIX_CTRL + crtc_id * 4, + BG_MIX_CTRL_MASK, BG_MIX_CTRL_SHIFT, bg_dly, false); + vop2_writel(vop2, RK3568_VP0_PRE_SCAN_HTIMING + (crtc_id * 0x100), pre_scan_dly); +} + +static void vop3_setup_pipe_dly(struct display_state *state, struct vop2 *vop2, int crtc_id) +{ + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + struct crtc_state *cstate = &state->crtc_state; + struct vop2_win_data *win_data; + u32 bg_dly, pre_scan_dly; + u16 hdisplay = mode->crtc_hdisplay; + u16 hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start; + u8 primary_plane_id = vop2->vp_plane_mask[cstate->crtc_id].primary_plane_id; + u8 win_id; + + win_data = vop2_find_win_by_phys_id(vop2, primary_plane_id); + win_id = atoi(&win_data->name[strlen(win_data->name) - 1]); + vop2_mask_write(vop2, RK3528_OVL_SYS_ESMART0_CTRL + win_id * 4, + ESMART_DLY_NUM_MASK, ESMART_DLY_NUM_SHIFT, 0, false); + + bg_dly = vop2->data->vp_data[crtc_id].win_dly + + vop2->data->vp_data[crtc_id].layer_mix_dly + + vop2->data->vp_data[crtc_id].hdr_mix_dly; + pre_scan_dly = bg_dly + (hdisplay >> 1) - 1; + pre_scan_dly = (pre_scan_dly << 16) | hsync_len; + vop2_mask_write(vop2, RK3528_OVL_PORT0_BG_MIX_CTRL + crtc_id * 0x100, BG_MIX_CTRL_MASK, BG_MIX_CTRL_SHIFT, bg_dly, false); vop2_writel(vop2, RK3568_VP0_PRE_SCAN_HTIMING + (crtc_id * 0x100), pre_scan_dly); } @@ -1644,9 +1983,176 @@ vop2_writel(vop2, RK3568_VP0_POST_DSP_VACT_INFO_F1 + vp_offset, val); } - vop2_setup_dly_for_vp(state, vop2, cstate->crtc_id); - if (cstate->splice_mode) - vop2_setup_dly_for_vp(state, vop2, cstate->splice_crtc_id); + if (is_vop3(vop2)) { + vop3_setup_pipe_dly(state, vop2, cstate->crtc_id); + } else { + vop2_setup_dly_for_vp(state, vop2, cstate->crtc_id); + if (cstate->splice_mode) + vop2_setup_dly_for_vp(state, vop2, cstate->splice_crtc_id); + } +} + +static void vop3_post_acm_config(struct display_state *state, struct vop2 *vop2) +{ + struct connector_state *conn_state = &state->conn_state; + struct crtc_state *cstate = &state->crtc_state; + struct acm_data *acm = &conn_state->disp_info->acm_data; + struct drm_display_mode *mode = &conn_state->mode; + u32 vp_offset = (cstate->crtc_id * 0x100); + s16 *lut_y; + s16 *lut_h; + s16 *lut_s; + u32 value; + int i; + + vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset, + POST_ACM_BYPASS_EN_MASK, POST_ACM_BYPASS_EN_SHIFT, 0, false); + if (!acm->acm_enable) { + writel(0, vop2->regs + RK3528_ACM_CTRL); + return; + } + + printf("post acm enable\n"); + + writel(1, vop2->regs + RK3528_ACM_FETCH_START); + + value = (acm->acm_enable & 0x1) + ((mode->hdisplay & 0xfff) << 8) + + ((mode->vdisplay & 0xfff) << 20); + writel(value, vop2->regs + RK3528_ACM_CTRL); + + value = (acm->y_gain & 0x3ff) + ((acm->h_gain << 10) & 0xffc00) + + ((acm->s_gain << 20) & 0x3ff00000); + writel(value, vop2->regs + RK3528_ACM_DELTA_RANGE); + + lut_y = &acm->gain_lut_hy[0]; + lut_h = &acm->gain_lut_hy[ACM_GAIN_LUT_HY_LENGTH]; + lut_s = &acm->gain_lut_hy[ACM_GAIN_LUT_HY_LENGTH * 2]; + for (i = 0; i < ACM_GAIN_LUT_HY_LENGTH; i++) { + value = (lut_y[i] & 0xff) + ((lut_h[i] << 8) & 0xff00) + + ((lut_s[i] << 16) & 0xff0000); + writel(value, vop2->regs + RK3528_ACM_YHS_DEL_HY_SEG0 + (i << 2)); + } + + lut_y = &acm->gain_lut_hs[0]; + lut_h = &acm->gain_lut_hs[ACM_GAIN_LUT_HS_LENGTH]; + lut_s = &acm->gain_lut_hs[ACM_GAIN_LUT_HS_LENGTH * 2]; + for (i = 0; i < ACM_GAIN_LUT_HS_LENGTH; i++) { + value = (lut_y[i] & 0xff) + ((lut_h[i] << 8) & 0xff00) + + ((lut_s[i] << 16) & 0xff0000); + writel(value, vop2->regs + RK3528_ACM_YHS_DEL_HS_SEG0 + (i << 2)); + } + + lut_y = &acm->delta_lut_h[0]; + lut_h = &acm->delta_lut_h[ACM_DELTA_LUT_H_LENGTH]; + lut_s = &acm->delta_lut_h[ACM_DELTA_LUT_H_LENGTH * 2]; + for (i = 0; i < ACM_DELTA_LUT_H_LENGTH; i++) { + value = (lut_y[i] & 0x3ff) + ((lut_h[i] << 12) & 0xff000) + + ((lut_s[i] << 20) & 0x3ff00000); + writel(value, vop2->regs + RK3528_ACM_YHS_DEL_HGAIN_SEG0 + (i << 2)); + } + + writel(1, vop2->regs + RK3528_ACM_FETCH_DONE); +} + +static void vop3_post_csc_config(struct display_state *state, struct vop2 *vop2) +{ + struct connector_state *conn_state = &state->conn_state; + struct crtc_state *cstate = &state->crtc_state; + struct acm_data *acm = &conn_state->disp_info->acm_data; + struct csc_info *csc = &conn_state->disp_info->csc_info; + struct post_csc_coef csc_coef; + bool is_input_yuv = false; + bool is_output_yuv = false; + bool post_r2y_en = false; + bool post_csc_en = false; + u32 vp_offset = (cstate->crtc_id * 0x100); + u32 value; + int range_type; + + printf("post csc enable\n"); + + if (acm->acm_enable) { + if (!cstate->yuv_overlay) + post_r2y_en = true; + + /* do y2r in csc module */ + if (!is_yuv_output(conn_state->bus_format)) + post_csc_en = true; + } else { + if (!cstate->yuv_overlay && is_yuv_output(conn_state->bus_format)) + post_r2y_en = true; + + /* do y2r in csc module */ + if (cstate->yuv_overlay && !is_yuv_output(conn_state->bus_format)) + post_csc_en = true; + } + + if (csc->csc_enable) + post_csc_en = true; + + if (cstate->yuv_overlay || post_r2y_en) + is_input_yuv = true; + + if (is_yuv_output(conn_state->bus_format)) + is_output_yuv = true; + + cstate->post_csc_mode = vop2_convert_csc_mode(conn_state->color_space, CSC_13BIT_DEPTH); + + if (post_csc_en) { + rockchip_calc_post_csc(csc, &csc_coef, cstate->post_csc_mode, is_input_yuv, + is_output_yuv); + + vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset, + POST_CSC_COE00_MASK, POST_CSC_COE00_SHIFT, + csc_coef.csc_coef00, false); + value = csc_coef.csc_coef01 & 0xffff; + value |= (csc_coef.csc_coef02 << 16) & 0xffff0000; + writel(value, vop2->regs + RK3528_VP0_CSC_COE01_02); + value = csc_coef.csc_coef10 & 0xffff; + value |= (csc_coef.csc_coef11 << 16) & 0xffff0000; + writel(value, vop2->regs + RK3528_VP0_CSC_COE10_11); + value = csc_coef.csc_coef12 & 0xffff; + value |= (csc_coef.csc_coef20 << 16) & 0xffff0000; + writel(value, vop2->regs + RK3528_VP0_CSC_COE12_20); + value = csc_coef.csc_coef21 & 0xffff; + value |= (csc_coef.csc_coef22 << 16) & 0xffff0000; + writel(value, vop2->regs + RK3528_VP0_CSC_COE21_22); + writel(csc_coef.csc_dc0, vop2->regs + RK3528_VP0_CSC_OFFSET0); + writel(csc_coef.csc_dc1, vop2->regs + RK3528_VP0_CSC_OFFSET1); + writel(csc_coef.csc_dc2, vop2->regs + RK3528_VP0_CSC_OFFSET2); + + range_type = csc_coef.range_type ? 0 : 1; + range_type <<= is_input_yuv ? 0 : 1; + vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset, + POST_CSC_MODE_MASK, POST_CSC_MODE_SHIFT, range_type, false); + } + + vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset, + POST_R2Y_EN_MASK, POST_R2Y_EN_SHIFT, post_r2y_en ? 1 : 0, false); + vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset, + POST_CSC_EN_MASK, POST_CSC_EN_SHIFT, post_csc_en ? 1 : 0, false); + vop2_mask_write(vop2, RK3528_VP0_ACM_CTRL + vp_offset, + POST_R2Y_MODE_MASK, POST_R2Y_MODE_SHIFT, cstate->post_csc_mode, false); +} + +static void vop3_post_config(struct display_state *state, struct vop2 *vop2) +{ + struct connector_state *conn_state = &state->conn_state; + struct base2_disp_info *disp_info = conn_state->disp_info; + const char *enable_flag; + if (!disp_info) { + printf("disp_info is empty\n"); + return; + } + + enable_flag = (const char *)&disp_info->cacm_header; + if (strncasecmp(enable_flag, "CACM", 4)) { + printf("acm and csc is not support\n"); + return; + } + + vop3_post_acm_config(state, vop2); + vop3_post_csc_config(state, vop2); } /* @@ -1731,112 +2237,55 @@ vop2->regsbak[i] = base[i]; } -static void vop2_global_initial(struct vop2 *vop2, struct display_state *state) +static void vop3_overlay_init(struct vop2 *vop2, struct display_state *state) +{ + struct vop2_win_data *win_data; + int layer_phy_id = 0; + int i, j; + u32 ovl_port_offset = 0; + u32 layer_nr = 0; + u8 shift = 0; + + /* layer sel win id */ + for (i = 0; i < vop2->data->nr_vps; i++) { + shift = 0; + ovl_port_offset = 0x100 * i; + layer_nr = vop2->vp_plane_mask[i].attached_layers_nr; + for (j = 0; j < layer_nr; j++) { + layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j]; + win_data = vop2_find_win_by_phys_id(vop2, layer_phy_id); + vop2_mask_write(vop2, RK3528_OVL_PORT0_LAYER_SEL + ovl_port_offset, LAYER_SEL_MASK, + shift, win_data->layer_sel_win_id[i], false); + shift += 4; + } + } + + /* win sel port */ + for (i = 0; i < vop2->data->nr_vps; i++) { + layer_nr = vop2->vp_plane_mask[i].attached_layers_nr; + for (j = 0; j < layer_nr; j++) { + if (!vop2->vp_plane_mask[i].attached_layers[j]) + continue; + layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j]; + win_data = vop2_find_win_by_phys_id(vop2, layer_phy_id); + shift = win_data->win_sel_port_offset * 2; + vop2_mask_write(vop2, RK3528_OVL_SYS_PORT_SEL_IMD, LAYER_SEL_PORT_MASK, + shift, i, false); + } + } +} + +static void vop2_overlay_init(struct vop2 *vop2, struct display_state *state) { struct crtc_state *cstate = &state->crtc_state; - int i, j, port_mux = 0, total_used_layer = 0; - u8 shift = 0; - int layer_phy_id = 0; - u32 layer_nr = 0; struct vop2_win_data *win_data; - struct vop2_vp_plane_mask *plane_mask; + int layer_phy_id = 0; + int total_used_layer = 0; + int port_mux = 0; + int i, j; + u32 layer_nr = 0; + u8 shift = 0; - if (vop2->global_init) - return; - - /* OTP must enable at the first time, otherwise mirror layer register is error */ - if (soc_is_rk3566()) - vop2_mask_write(vop2, RK3568_SYS_OTP_WIN_EN, EN_MASK, - OTP_WIN_EN_SHIFT, 1, false); - - if (cstate->crtc->assign_plane) {/* dts assign plane */ - u32 plane_mask; - int primary_plane_id; - - for (i = 0; i < vop2->data->nr_vps; i++) { - plane_mask = cstate->crtc->vps[i].plane_mask; - vop2->vp_plane_mask[i].plane_mask = plane_mask; - layer_nr = hweight32(plane_mask); /* use bitmap to store plane mask */ - vop2->vp_plane_mask[i].attached_layers_nr = layer_nr; - primary_plane_id = cstate->crtc->vps[i].primary_plane_id; - if (primary_plane_id < 0) - primary_plane_id = vop2_get_primary_plane(vop2, plane_mask); - vop2->vp_plane_mask[i].primary_plane_id = primary_plane_id; - vop2->vp_plane_mask[i].plane_mask = plane_mask; - - /* plane mask[bitmap] convert into layer phy id[enum vop2_layer_phy_id]*/ - for (j = 0; j < layer_nr; j++) { - vop2->vp_plane_mask[i].attached_layers[j] = ffs(plane_mask) - 1; - plane_mask &= ~BIT(vop2->vp_plane_mask[i].attached_layers[j]); - } - } - } else {/* need soft assign plane mask */ - /* find the first unplug devices and set it as main display */ - int main_vp_index = -1; - int active_vp_num = 0; - - for (i = 0; i < vop2->data->nr_vps; i++) { - if (cstate->crtc->vps[i].enable) - active_vp_num++; - } - printf("VOP have %d active VP\n", active_vp_num); - - if (soc_is_rk3566() && active_vp_num > 2) - printf("ERROR: rk3566 only support 2 display output!!\n"); - plane_mask = vop2->data->plane_mask; - plane_mask += (active_vp_num - 1) * VOP2_VP_MAX; - - for (i = 0; i < vop2->data->nr_vps; i++) { - if (!is_hot_plug_devices(cstate->crtc->vps[i].output_type)) { - vop2->vp_plane_mask[i] = plane_mask[0]; /* the first store main display plane mask*/ - main_vp_index = i; - break; - } - } - - /* if no find unplug devices, use vp0 as main display */ - if (main_vp_index < 0) { - main_vp_index = 0; - vop2->vp_plane_mask[0] = plane_mask[0]; - } - - j = 1; /* plane_mask[0] store main display, so we from plane_mask[1] */ - - /* init other display except main display */ - for (i = 0; i < vop2->data->nr_vps; i++) { - if (i == main_vp_index || !cstate->crtc->vps[i].enable) /* main display or no connect devices */ - continue; - vop2->vp_plane_mask[i] = plane_mask[j++]; - } - - /* store plane mask for vop2_fixup_dts */ - for (i = 0; i < vop2->data->nr_vps; i++) { - layer_nr = vop2->vp_plane_mask[i].attached_layers_nr; - for (j = 0; j < layer_nr; j++) { - layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j]; - vop2->vp_plane_mask[i].plane_mask |= BIT(layer_phy_id); - } - } - } - - if (vop2->version == VOP_VERSION_RK3588) - rk3588_vop2_regsbak(vop2); - else - memcpy(vop2->regsbak, vop2->regs, vop2->reg_len); - - vop2_mask_write(vop2, RK3568_OVL_CTRL, EN_MASK, - OVL_PORT_MUX_REG_DONE_IMD_SHIFT, 1, false); - vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK, - IF_CTRL_REG_DONE_IMD_SHIFT, 1, false); - - for (i = 0; i < vop2->data->nr_vps; i++) { - printf("vp%d have layer nr:%d[", i, vop2->vp_plane_mask[i].attached_layers_nr); - for (j = 0; j < vop2->vp_plane_mask[i].attached_layers_nr; j++) - printf("%d ", vop2->vp_plane_mask[i].attached_layers[j]); - printf("], primary plane: %d\n", vop2->vp_plane_mask[i].primary_plane_id); - } - - shift = 0; /* layer sel win id */ for (i = 0; i < vop2->data->nr_vps; i++) { layer_nr = vop2->vp_plane_mask[i].attached_layers_nr; @@ -1844,7 +2293,7 @@ layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j]; win_data = vop2_find_win_by_phys_id(vop2, layer_phy_id); vop2_mask_write(vop2, RK3568_OVL_LAYER_SEL, LAYER_SEL_MASK, - shift, win_data->layer_sel_win_id, false); + shift, win_data->layer_sel_win_id[i], false); shift += 4; } } @@ -1882,6 +2331,190 @@ vop2_mask_write(vop2, RK3568_OVL_PORT_SEL, PORT_MUX_MASK, PORT_MUX_SHIFT + shift, port_mux, false); } +} + +static bool vop3_ignore_plane(struct vop2 *vop2, struct vop2_win_data *win) +{ + if (!is_vop3(vop2)) + return false; + + if (vop2->esmart_lb_mode == VOP3_ESMART_8K_MODE && + win->phys_id != ROCKCHIP_VOP2_ESMART0) + return true; + else if (vop2->esmart_lb_mode == VOP3_ESMART_4K_4K_MODE && + (win->phys_id == ROCKCHIP_VOP2_ESMART1 || win->phys_id == ROCKCHIP_VOP2_ESMART3)) + return true; + else if (vop2->esmart_lb_mode == VOP3_ESMART_4K_2K_2K_MODE && + win->phys_id == ROCKCHIP_VOP2_ESMART1) + return true; + else + return false; +} + +static void vop3_init_esmart_scale_engine(struct vop2 *vop2) +{ + struct vop2_win_data *win_data; + int i; + u8 scale_engine_num = 0; + + /* store plane mask for vop2_fixup_dts */ + for (i = 0; i < vop2->data->nr_layers; i++) { + win_data = &vop2->data->win_data[i]; + if (win_data->type == CLUSTER_LAYER || vop3_ignore_plane(vop2, win_data)) + continue; + + win_data->scale_engine_num = scale_engine_num++; + } +} + +static void vop2_global_initial(struct vop2 *vop2, struct display_state *state) +{ + struct crtc_state *cstate = &state->crtc_state; + struct vop2_vp_plane_mask *plane_mask; + int layer_phy_id = 0; + int i, j; + int ret; + u32 layer_nr = 0; + + if (vop2->global_init) + return; + + /* OTP must enable at the first time, otherwise mirror layer register is error */ + if (soc_is_rk3566()) + vop2_mask_write(vop2, RK3568_SYS_OTP_WIN_EN, EN_MASK, + OTP_WIN_EN_SHIFT, 1, false); + + if (cstate->crtc->assign_plane) {/* dts assign plane */ + u32 plane_mask; + int primary_plane_id; + + for (i = 0; i < vop2->data->nr_vps; i++) { + plane_mask = cstate->crtc->vps[i].plane_mask; + vop2->vp_plane_mask[i].plane_mask = plane_mask; + layer_nr = hweight32(plane_mask); /* use bitmap to store plane mask */ + vop2->vp_plane_mask[i].attached_layers_nr = layer_nr; + primary_plane_id = cstate->crtc->vps[i].primary_plane_id; + if (primary_plane_id >= ROCKCHIP_VOP2_LAYER_MAX) + primary_plane_id = vop2_get_primary_plane(vop2, plane_mask); + vop2->vp_plane_mask[i].primary_plane_id = primary_plane_id; + vop2->vp_plane_mask[i].plane_mask = plane_mask; + + /* plane mask[bitmap] convert into layer phy id[enum vop2_layer_phy_id]*/ + for (j = 0; j < layer_nr; j++) { + vop2->vp_plane_mask[i].attached_layers[j] = ffs(plane_mask) - 1; + plane_mask &= ~BIT(vop2->vp_plane_mask[i].attached_layers[j]); + } + } + } else {/* need soft assign plane mask */ + /* find the first unplug devices and set it as main display */ + int main_vp_index = -1; + int active_vp_num = 0; + + for (i = 0; i < vop2->data->nr_vps; i++) { + if (cstate->crtc->vps[i].enable) + active_vp_num++; + } + printf("VOP have %d active VP\n", active_vp_num); + + if (soc_is_rk3566() && active_vp_num > 2) + printf("ERROR: rk3566 only support 2 display output!!\n"); + plane_mask = vop2->data->plane_mask; + plane_mask += (active_vp_num - 1) * VOP2_VP_MAX; + /* + * For rk3528, one display policy for hdmi store in plane_mask[0], and the other + * for cvbs store in plane_mask[2]. + */ + if (vop2->version == VOP_VERSION_RK3528 && active_vp_num == 1 && + cstate->crtc->vps[1].output_type == DRM_MODE_CONNECTOR_TV) + plane_mask += 2 * VOP2_VP_MAX; + + if (vop2->version == VOP_VERSION_RK3528) { + /* + * For rk3528, the plane mask of vp is limited, only esmart2 can be selected + * by both vp0 and vp1. + */ + j = 0; + } else { + for (i = 0; i < vop2->data->nr_vps; i++) { + if (!is_hot_plug_devices(cstate->crtc->vps[i].output_type)) { + vop2->vp_plane_mask[i] = plane_mask[0]; /* the first store main display plane mask*/ + main_vp_index = i; + break; + } + } + + /* if no find unplug devices, use vp0 as main display */ + if (main_vp_index < 0) { + main_vp_index = 0; + vop2->vp_plane_mask[0] = plane_mask[0]; + } + + j = 1; /* plane_mask[0] store main display, so we from plane_mask[1] */ + } + + /* init other display except main display */ + for (i = 0; i < vop2->data->nr_vps; i++) { + if (i == main_vp_index || !cstate->crtc->vps[i].enable) /* main display or no connect devices */ + continue; + vop2->vp_plane_mask[i] = plane_mask[j++]; + } + + /* store plane mask for vop2_fixup_dts */ + for (i = 0; i < vop2->data->nr_vps; i++) { + layer_nr = vop2->vp_plane_mask[i].attached_layers_nr; + for (j = 0; j < layer_nr; j++) { + layer_phy_id = vop2->vp_plane_mask[i].attached_layers[j]; + vop2->vp_plane_mask[i].plane_mask |= BIT(layer_phy_id); + } + } + } + + if (vop2->version == VOP_VERSION_RK3588) + rk3588_vop2_regsbak(vop2); + else + memcpy(vop2->regsbak, vop2->regs, vop2->reg_len); + + vop2_mask_write(vop2, RK3568_OVL_CTRL, EN_MASK, + OVL_PORT_MUX_REG_DONE_IMD_SHIFT, 1, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK, + IF_CTRL_REG_DONE_IMD_SHIFT, 1, false); + + for (i = 0; i < vop2->data->nr_vps; i++) { + printf("vp%d have layer nr:%d[", i, vop2->vp_plane_mask[i].attached_layers_nr); + for (j = 0; j < vop2->vp_plane_mask[i].attached_layers_nr; j++) + printf("%d ", vop2->vp_plane_mask[i].attached_layers[j]); + printf("], primary plane: %d\n", vop2->vp_plane_mask[i].primary_plane_id); + } + + if (is_vop3(vop2)) + vop3_overlay_init(vop2, state); + else + vop2_overlay_init(vop2, state); + + if (is_vop3(vop2)) { + /* + * you can rewrite at dts vop node: + * + * VOP3_ESMART_8K_MODE = 0, + * VOP3_ESMART_4K_4K_MODE = 1, + * VOP3_ESMART_4K_2K_2K_MODE = 2, + * VOP3_ESMART_2K_2K_2K_2K_MODE = 3, + * + * &vop { + * esmart_lb_mode = /bits/ 8 <2>; + * }; + */ + ret = ofnode_read_u32(cstate->node, "esmart_lb_mode", &vop2->esmart_lb_mode); + if (ret < 0) + vop2->esmart_lb_mode = vop2->data->esmart_lb_mode; + vop2_mask_write(vop2, RK3568_SYS_LUT_PORT_SEL, ESMART_LB_MODE_SEL_MASK, + ESMART_LB_MODE_SEL_SHIFT, vop2->esmart_lb_mode, false); + + vop3_init_esmart_scale_engine(vop2); + + vop2_mask_write(vop2, RK3568_SYS_AXI_LUT_CTRL, EN_MASK, + DSP_VS_T_SEL_SHIFT, 0, false); + } if (vop2->version == VOP_VERSION_RK3568) vop2_writel(vop2, RK3568_AUTO_GATING_CTRL, 0); @@ -1891,14 +2524,6 @@ static int vop2_initial(struct vop2 *vop2, struct display_state *state) { - struct crtc_state *cstate = &state->crtc_state; - int ret; - - /* Process 'assigned-{clocks/clock-parents/clock-rates}' properties */ - ret = clk_set_defaults(cstate->dev); - if (ret) - debug("%s clk_set_defaults failed %d\n", __func__, ret); - rockchip_vop2_gamma_lut_init(vop2, state); rockchip_vop2_cubic_lut_init(vop2, state); @@ -1918,12 +2543,17 @@ rockchip_vop2 = calloc(1, sizeof(struct vop2)); if (!rockchip_vop2) return -ENOMEM; - rockchip_vop2->regs = dev_read_addr_ptr(cstate->dev); + memset(rockchip_vop2, 0, sizeof(struct vop2)); rockchip_vop2->regsbak = malloc(RK3568_MAX_REG); rockchip_vop2->reg_len = RK3568_MAX_REG; +#ifdef CONFIG_SPL_BUILD + rockchip_vop2->regs = (void *)RK3528_VOP_BASE; +#else + rockchip_vop2->regs = dev_read_addr_ptr(cstate->dev); rockchip_vop2->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF); if (rockchip_vop2->grf <= 0) printf("%s: Get syscon grf failed (ret=%p)\n", __func__, rockchip_vop2->grf); +#endif rockchip_vop2->version = vop2_data->version; rockchip_vop2->data = vop2_data; if (rockchip_vop2->version == VOP_VERSION_RK3588) { @@ -2021,11 +2651,12 @@ } if (v_pixclk > VOP2_MAX_DCLK_RATE) - dclk_rate = vop2_calc_dclk(dclk_core_rate, vop2->data->vp_data->max_dclk); + dclk_rate = vop2_calc_dclk(dclk_core_rate, + vop2->data->vp_data[cstate->crtc_id].max_dclk); if (!dclk_rate) { printf("DP if_pixclk_rate out of range(max_dclk: %d KHZ, dclk_core: %lld KHZ)\n", - vop2->data->vp_data->max_dclk, if_pixclk_rate); + vop2->data->vp_data[cstate->crtc_id].max_dclk, if_pixclk_rate); return -EINVAL; } *if_pixclk_div = dclk_rate / if_pixclk_rate; @@ -2045,10 +2676,11 @@ dclk_out_rate = v_pixclk >> 2; dclk_out_rate = dclk_out_rate / K; - dclk_rate = vop2_calc_dclk(dclk_out_rate, vop2->data->vp_data->max_dclk); + dclk_rate = vop2_calc_dclk(dclk_out_rate, + vop2->data->vp_data[cstate->crtc_id].max_dclk); if (!dclk_rate) { printf("DP dclk_core out of range(max_dclk: %d KHZ, dclk_core: %ld KHZ)\n", - vop2->data->vp_data->max_dclk, dclk_core_rate); + vop2->data->vp_data[cstate->crtc_id].max_dclk, dclk_core_rate); return -EINVAL; } *dclk_out_div = dclk_rate / dclk_out_rate; @@ -2064,21 +2696,22 @@ /* dclk_core = dclk_out * K = if_pixclk * K = v_pixclk / 4 */ dclk_out_rate = dclk_core_rate / K; /* dclk_rate = N * dclk_core_rate N = (1,2,4 ), we get a little factor here */ - dclk_rate = vop2_calc_dclk(dclk_out_rate, vop2->data->vp_data->max_dclk); + dclk_rate = vop2_calc_dclk(dclk_out_rate, + vop2->data->vp_data[cstate->crtc_id].max_dclk); if (!dclk_rate) { printf("MIPI dclk out of range(max_dclk: %d KHZ, dclk_rate: %ld KHZ)\n", - vop2->data->vp_data->max_dclk, dclk_rate); + vop2->data->vp_data[cstate->crtc_id].max_dclk, dclk_rate); return -EINVAL; } if (cstate->dsc_enable) - dclk_rate = dclk_rate >> 1; + dclk_rate /= cstate->dsc_slice_num; *dclk_out_div = dclk_rate / dclk_out_rate; *dclk_core_div = dclk_rate / dclk_core_rate; *if_pixclk_div = 1; /*mipi pixclk == dclk_out*/ if (cstate->dsc_enable) - *if_pixclk_div = dclk_out_rate / if_pixclk_rate; + *if_pixclk_div = dclk_out_rate * 1000LL / if_pixclk_rate; } else if (output_type == DRM_MODE_CONNECTOR_DPI) { dclk_rate = v_pixclk; @@ -2098,7 +2731,7 @@ struct connector_state *conn_state = &state->conn_state; struct drm_display_mode *mode = &conn_state->mode; struct crtc_state *cstate = &state->crtc_state; - u64 v_pixclk = mode->clock; /* video timing pixclk */ + u64 v_pixclk = mode->crtc_clock * 1000LL; /* video timing pixclk */ u8 k = 1; if (conn_state->output_flags & ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE) @@ -2201,8 +2834,7 @@ if (conn_state->hold_mode) { vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset, - EN_MASK, EDPI_TE_EN, 1, false); - + EN_MASK, EDPI_TE_EN, !cstate->soft_te, false); vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset, EN_MASK, EDPI_WMS_HOLD_EN, 1, false); } @@ -2227,14 +2859,8 @@ if_pixclk_div, false); if (conn_state->hold_mode) { - /* UNDO: RK3588 VP1->DSC1->DSI1 only can support soft TE mode */ - if (vop2->version == VOP_VERSION_RK3588 && val == 3) - vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset, - EN_MASK, EDPI_TE_EN, 0, false); - else - vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset, - EN_MASK, EDPI_TE_EN, 1, false); - + vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset, + EN_MASK, EDPI_TE_EN, !cstate->soft_te, false); vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset, EN_MASK, EDPI_WMS_HOLD_EN, 1, false); } @@ -2371,7 +2997,7 @@ bool dclk_inv; u32 val; - dclk_inv = (mode->flags & DRM_MODE_FLAG_PPIXDATA) ? 0 : 1; + dclk_inv = (conn_state->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) ? 1 : 0; val = (mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : BIT(HSYNC_POSITIVE); val |= (mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : BIT(VSYNC_POSITIVE); @@ -2380,6 +3006,8 @@ 1, false); vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK, RGB_MUX_SHIFT, cstate->crtc_id, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, IF_CTRL_RGB_LVDS_PIN_POL_MASK, + IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false); vop2_grf_writel(vop2, vop2->grf, RK3568_GRF_VO_CON1, EN_MASK, GRF_RGB_DCLK_INV_SHIFT, dclk_inv); } @@ -2409,8 +3037,10 @@ 1, false); vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK, LVDS0_MUX_SHIFT, cstate->crtc_id, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, IF_CTRL_RGB_LVDS_PIN_POL_MASK, + IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false); vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK, - IF_CRTL_RGB_LVDS_DCLK_POL_SHIT, dclk_inv, false); + IF_CTRL_RGB_LVDS_DCLK_POL_SHIFT, dclk_inv, false); } if (conn_state->output_if & VOP_OUTPUT_IF_LVDS1) { @@ -2418,8 +3048,10 @@ 1, false); vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK, LVDS1_MUX_SHIFT, cstate->crtc_id, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, IF_CTRL_RGB_LVDS_PIN_POL_MASK, + IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false); vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK, - IF_CRTL_RGB_LVDS_DCLK_POL_SHIT, dclk_inv, false); + IF_CTRL_RGB_LVDS_DCLK_POL_SHIFT, dclk_inv, false); } if (conn_state->output_flags & @@ -2472,6 +3104,8 @@ EDP0_MUX_SHIFT, cstate->crtc_id, false); vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK, IF_CRTL_EDP_DCLK_POL_SHIT, dclk_inv, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, IF_CTRL_EDP_PIN_POL_MASK, + IF_CTRL_EDP_PIN_POL_SHIFT, val, false); } if (conn_state->output_if & VOP_OUTPUT_IF_HDMI0) { @@ -2489,6 +3123,88 @@ return mode->clock; } +static unsigned long rk3528_vop2_if_cfg(struct display_state *state) +{ + struct crtc_state *cstate = &state->crtc_state; + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + struct vop2 *vop2 = cstate->private; + u32 val; + + val = (mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : BIT(HSYNC_POSITIVE); + val |= (mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : BIT(VSYNC_POSITIVE); + + if (conn_state->output_if & VOP_OUTPUT_IF_BT656) { + vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, BT656_EN_SHIFT, + 1, false); + vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK, + RGB_MUX_SHIFT, cstate->crtc_id, false); + } + + if (conn_state->output_if & VOP_OUTPUT_IF_HDMI0) { + vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, HDMI0_EN_SHIFT, + 1, false); + vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK, + HDMI0_MUX_SHIFT, cstate->crtc_id, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK, + IF_CRTL_HDMI_DCLK_POL_SHIT, 1, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, + IF_CRTL_HDMI_PIN_POL_MASK, + IF_CRTL_HDMI_PIN_POL_SHIT, val, false); + } + + return mode->crtc_clock; +} + +static unsigned long rk3562_vop2_if_cfg(struct display_state *state) +{ + struct crtc_state *cstate = &state->crtc_state; + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + struct vop2 *vop2 = cstate->private; + bool dclk_inv; + u32 val; + + dclk_inv = (conn_state->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) ? 1 : 0; + val = (mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : BIT(HSYNC_POSITIVE); + val |= (mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : BIT(VSYNC_POSITIVE); + + if (conn_state->output_if & VOP_OUTPUT_IF_RGB) { + vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, RGB_EN_SHIFT, + 1, false); + vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK, + RGB_MUX_SHIFT, cstate->crtc_id, false); + vop2_grf_writel(vop2, vop2->grf, RK3562_GRF_IOC_VO_IO_CON, EN_MASK, + GRF_RGB_DCLK_INV_SHIFT, dclk_inv); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, RK3562_IF_PIN_POL_MASK, + IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false); + } + + if (conn_state->output_if & VOP_OUTPUT_IF_LVDS0) { + vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, LVDS0_EN_SHIFT, + 1, false); + vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK, + LVDS0_MUX_SHIFT, cstate->crtc_id, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK, + IF_CTRL_RGB_LVDS_DCLK_POL_SHIFT, dclk_inv, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, RK3562_IF_PIN_POL_MASK, + IF_CTRL_RGB_LVDS_PIN_POL_SHIFT, val, false); + } + + if (conn_state->output_if & VOP_OUTPUT_IF_MIPI0) { + vop2_mask_write(vop2, RK3568_DSP_IF_EN, EN_MASK, MIPI0_EN_SHIFT, + 1, false); + vop2_mask_write(vop2, RK3568_DSP_IF_EN, IF_MUX_MASK, + MIPI0_MUX_SHIFT, cstate->crtc_id, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, EN_MASK, + RK3562_MIPI_DCLK_POL_SHIFT, dclk_inv, false); + vop2_mask_write(vop2, RK3568_DSP_IF_POL, RK3562_IF_PIN_POL_MASK, + RK3562_MIPI_PIN_POL_SHIFT, val, false); + } + + return mode->crtc_clock; +} + static void vop2_post_color_swap(struct display_state *state) { struct crtc_state *cstate = &state->crtc_state; @@ -2498,7 +3214,8 @@ u32 output_type = conn_state->type; u32 data_swap = 0; - if (is_uv_swap(conn_state->bus_format, conn_state->output_mode)) + if (is_uv_swap(conn_state->bus_format, conn_state->output_mode) || + is_rb_swap(conn_state->bus_format, conn_state->output_mode)) data_swap = DSP_RB_SWAP; if (vop2->version == VOP_VERSION_RK3588 && @@ -2603,10 +3320,10 @@ u16 vact_end = vact_st + vdisplay; u32 ctrl_regs_offset = (dsc_id * 0x30); u32 decoder_regs_offset = (dsc_id * 0x100); - u32 backup_regs_offset = 0; int dsc_txp_clk_div = 0; int dsc_pxl_clk_div = 0; int dsc_cds_clk_div = 0; + int val = 0; if (!vop2->data->nr_dscs) { printf("Unsupported DSC\n"); @@ -2678,21 +3395,42 @@ * dly_num = delay_line_num * T(one-line) / T (dsc_cds) * T (one-line) = 1/v_pixclk_mhz * htotal = htotal/v_pixclk_mhz * T (dsc_cds) = 1 / dsc_cds_rate_mhz + * + * HDMI: * delay_line_num: according the pps initial_xmit_delay to adjust vop dsc delay * delay_line_num = 4 - BPP / 8 * = (64 - target_bpp / 8) / 16 - * * dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * (64 - target_bpp / 8) / 16; + * + * MIPI DSI[4320 and 9216 is buffer size for DSC]: + * DSC0:delay_line_num = 4320 * 8 / slince_num / chunk_size; + * delay_line_num = delay_line_num > 5 ? 5 : delay_line_num; + * DSC1:delay_line_num = 9216 * 2 / slince_num / chunk_size; + * delay_line_num = delay_line_num > 5 ? 5 : delay_line_num; + * dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * delay_line_num */ do_div(dsc_cds_rate, 1000000); /* hz to Mhz */ dsc_cds_rate_mhz = dsc_cds_rate; - dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * (64 - target_bpp / 8) / 16; + dsc_hsync = hsync_len / 2; + if (dsc_interface_mode == VOP_DSC_IF_HDMI) { + dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * (64 - target_bpp / 8) / 16; + } else { + int dsc_buf_size = dsc_id == 0 ? 4320 * 8 : 9216 * 2; + int delay_line_num = dsc_buf_size / cstate->dsc_slice_num / + be16_to_cpu(cstate->pps.chunk_size); + + delay_line_num = delay_line_num > 5 ? 5 : delay_line_num; + dly_num = htotal * dsc_cds_rate_mhz / v_pixclk_mhz * delay_line_num; + + /* The dsc mipi video mode dsc_hsync minimum size is 8 pixels */ + if (dsc_hsync < 8) + dsc_hsync = 8; + } vop2_mask_write(vop2, RK3588_DSC_8K_INIT_DLY + ctrl_regs_offset, DSC_INIT_DLY_MODE_MASK, DSC_INIT_DLY_MODE_SHIFT, 0, false); vop2_mask_write(vop2, RK3588_DSC_8K_INIT_DLY + ctrl_regs_offset, DSC_INIT_DLY_NUM_MASK, DSC_INIT_DLY_NUM_SHIFT, dly_num, false); - dsc_hsync = hsync_len / 2; /* * htotal / dclk_core = dsc_htotal /cds_clk * @@ -2724,34 +3462,15 @@ vop2_mask_write(vop2, RK3588_DSC_8K_RST + ctrl_regs_offset, RST_DEASSERT_MASK, RST_DEASSERT_SHIFT, 1, false); udelay(10); - /* read current dsc core register and backup to regsbak */ - backup_regs_offset = RK3588_DSC_8K_CTRL0; - vop2->regsbak[backup_regs_offset >> 2] = vop2_readl(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_EN_SHIFT, 1, false); + val |= DSC_CTRL0_DEF_CON | (ilog2(cstate->dsc_slice_num) << DSC_NSLC_SHIFT) | + ((dsc_sink_cap->version_minor == 2 ? 1 : 0) << DSC_IFEP_SHIFT); + vop2_writel(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, val); + vop2_load_pps(state, vop2, dsc_id); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_RBIT_SHIFT, 1, false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_RBYT_SHIFT, 0, false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_FLAL_SHIFT, 1, false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_MER_SHIFT, 1, false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_EPB_SHIFT, 0, false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_EPL_SHIFT, 1, false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_NSLC_SHIFT, ilog2(cstate->dsc_slice_num), false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_SBO_SHIFT, 1, false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_IFEP_SHIFT, dsc_sink_cap->version_minor == 2 ? 1 : 0, false); - vop2_mask_write(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, EN_MASK, - DSC_PPS_UPD_SHIFT, 1, false); + val |= (1 << DSC_PPS_UPD_SHIFT); + vop2_writel(vop2, RK3588_DSC_8K_CTRL0 + decoder_regs_offset, val); printf("DSC%d: txp:%lld div:%d, pxl:%lld div:%d, dsc:%lld div:%d\n", dsc_id, @@ -2800,6 +3519,133 @@ return false; } +static void vop3_mcu_mode_setup(struct display_state *state) +{ + struct crtc_state *cstate = &state->crtc_state; + struct vop2 *vop2 = cstate->private; + u32 vp_offset = (cstate->crtc_id * 0x100); + + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_TYPE_SHIFT, 1, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_HOLD_MODE_SHIFT, 1, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_PIX_TOTAL_MASK, + MCU_PIX_TOTAL_SHIFT, cstate->mcu_timing.mcu_pix_total, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_CS_PST_MASK, + MCU_CS_PST_SHIFT, cstate->mcu_timing.mcu_cs_pst, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_CS_PEND_MASK, + MCU_CS_PEND_SHIFT, cstate->mcu_timing.mcu_cs_pend, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_RW_PST_MASK, + MCU_RW_PST_SHIFT, cstate->mcu_timing.mcu_rw_pst, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_RW_PEND_MASK, + MCU_RW_PEND_SHIFT, cstate->mcu_timing.mcu_rw_pend, false); +} + +static void vop3_mcu_bypass_mode_setup(struct display_state *state) +{ + struct crtc_state *cstate = &state->crtc_state; + struct vop2 *vop2 = cstate->private; + u32 vp_offset = (cstate->crtc_id * 0x100); + + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_TYPE_SHIFT, 1, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_HOLD_MODE_SHIFT, 1, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_PIX_TOTAL_MASK, + MCU_PIX_TOTAL_SHIFT, 53, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_CS_PST_MASK, + MCU_CS_PST_SHIFT, 6, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_CS_PEND_MASK, + MCU_CS_PEND_SHIFT, 48, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_RW_PST_MASK, + MCU_RW_PST_SHIFT, 12, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, MCU_RW_PEND_MASK, + MCU_RW_PEND_SHIFT, 30, false); +} + +static int rockchip_vop2_send_mcu_cmd(struct display_state *state, u32 type, u32 value) +{ + struct crtc_state *cstate = &state->crtc_state; + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + struct vop2 *vop2 = cstate->private; + u32 vp_offset = (cstate->crtc_id * 0x100); + u32 cfg_done = CFG_DONE_EN | BIT(cstate->crtc_id) | (BIT(cstate->crtc_id) << 16); + + /* + * 1.disable port dclk auto gating. + * 2.set mcu bypass mode timing to adapt to the mode of sending cmds. + * 3.make setting of output mode take effect. + * 4.set dclk rate to 150M, in order to sync with hclk in sending cmds. + */ + if (type == MCU_SETBYPASS && value) { + vop2_mask_write(vop2, RK3568_AUTO_GATING_CTRL, EN_MASK, + AUTO_GATING_EN_SHIFT, 0, false); + vop2_mask_write(vop2, RK3568_AUTO_GATING_CTRL, EN_MASK, + PORT_DCLK_AUTO_GATING_EN_SHIFT, 0, false); + vop3_mcu_bypass_mode_setup(state); + vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, + STANDBY_EN_SHIFT, 0, false); + vop2_writel(vop2, RK3568_REG_CFG_DONE, cfg_done); + vop2_clk_set_rate(&cstate->dclk, 150000000); + } + + switch (type) { + case MCU_WRCMD: + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_RS_SHIFT, 0, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_RW_BYPASS_PORT + vp_offset, + MCU_WRITE_DATA_BYPASS_MASK, MCU_WRITE_DATA_BYPASS_SHIFT, + value, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_RS_SHIFT, 1, false); + break; + case MCU_WRDATA: + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_RS_SHIFT, 1, false); + vop2_mask_write(vop2, RK3562_VP0_MCU_RW_BYPASS_PORT + vp_offset, + MCU_WRITE_DATA_BYPASS_MASK, MCU_WRITE_DATA_BYPASS_SHIFT, + value, false); + break; + case MCU_SETBYPASS: + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_BYPASS_SHIFT, value ? 1 : 0, false); + break; + default: + break; + } + + /* + * 1.restore port dclk auto gating. + * 2.restore mcu data mode timing. + * 3.restore dclk rate to crtc_clock. + */ + if (type == MCU_SETBYPASS && !value) { + vop2_mask_write(vop2, RK3568_AUTO_GATING_CTRL, EN_MASK, + AUTO_GATING_EN_SHIFT, 1, false); + vop2_mask_write(vop2, RK3568_AUTO_GATING_CTRL, EN_MASK, + PORT_DCLK_AUTO_GATING_EN_SHIFT, 1, false); + vop3_mcu_mode_setup(state); + vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, + STANDBY_EN_SHIFT, 1, false); + vop2_clk_set_rate(&cstate->dclk, mode->crtc_clock * 1000); + } + + return 0; +} + +static int vop2_get_vrefresh(struct display_state *state) +{ + struct crtc_state *cstate = &state->crtc_state; + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + + if (cstate->mcu_timing.mcu_pix_total) + return mode->vrefresh / cstate->mcu_timing.mcu_pix_total; + else + return mode->vrefresh; +} + static int rockchip_vop2_init(struct display_state *state) { struct crtc_state *cstate = &state->crtc_state; @@ -2822,22 +3668,24 @@ u32 line_flag_offset = (cstate->crtc_id * 4); u32 val, act_end; u8 dither_down_en = 0; + u8 dither_down_mode = 0; u8 pre_dither_down_en = 0; u8 dclk_div_factor = 0; char output_type_name[30] = {0}; +#ifndef CONFIG_SPL_BUILD char dclk_name[9]; - struct clk dclk; +#endif struct clk hdmi0_phy_pll; struct clk hdmi1_phy_pll; struct clk hdmi_phy_pll; struct udevice *disp_dev; - unsigned long dclk_rate; + unsigned long dclk_rate = 0; int ret; printf("VOP update mode to: %dx%d%s%d, type:%s for VP%d\n", mode->crtc_hdisplay, mode->vdisplay, mode->flags & DRM_MODE_FLAG_INTERLACE ? "i" : "p", - mode->vrefresh, + vop2_get_vrefresh(state), get_output_if_name(conn_state->output_if, output_type_name), cstate->crtc_id); @@ -2854,11 +3702,20 @@ PORT_MERGE_EN_SHIFT, 1, false); } + vop2_mask_write(vop2, RK3588_SYS_VAR_FREQ_CTRL, EN_MASK, + RK3588_VP0_LINE_FLAG_OR_EN_SHIFT + cstate->crtc_id, 1, false); + vop2_mask_write(vop2, RK3588_SYS_VAR_FREQ_CTRL, EN_MASK, + RK3588_VP0_ALMOST_FULL_OR_EN_SHIFT + cstate->crtc_id, 1, false); + vop2_initial(vop2, state); if (vop2->version == VOP_VERSION_RK3588) dclk_rate = rk3588_vop2_if_cfg(state); - else + else if (vop2->version == VOP_VERSION_RK3568) dclk_rate = rk3568_vop2_if_cfg(state); + else if (vop2->version == VOP_VERSION_RK3528) + dclk_rate = rk3528_vop2_if_cfg(state); + else if (vop2->version == VOP_VERSION_RK3562) + dclk_rate = rk3562_vop2_if_cfg(state); if (conn_state->output_mode == ROCKCHIP_OUT_MODE_AAAA && !(cstate->feature & VOP_FEATURE_OUTPUT_10BIT)) @@ -2872,12 +3729,16 @@ switch (conn_state->bus_format) { case MEDIA_BUS_FMT_RGB565_1X16: dither_down_en = 1; + dither_down_mode = RGB888_TO_RGB565; + pre_dither_down_en = 1; break; case MEDIA_BUS_FMT_RGB666_1X18: case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG: case MEDIA_BUS_FMT_RGB666_1X7X3_JEIDA: dither_down_en = 1; + dither_down_mode = RGB888_TO_RGB666; + pre_dither_down_en = 1; break; case MEDIA_BUS_FMT_YUV8_1X24: case MEDIA_BUS_FMT_UYYVYY8_0_5X24: @@ -2886,23 +3747,28 @@ break; case MEDIA_BUS_FMT_YUV10_1X30: case MEDIA_BUS_FMT_UYYVYY10_0_5X30: - case MEDIA_BUS_FMT_RGB888_1X24: - case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: - case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: - default: dither_down_en = 0; pre_dither_down_en = 0; break; + case MEDIA_BUS_FMT_YUYV10_1X20: + case MEDIA_BUS_FMT_RGB888_1X24: + case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG: + case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA: + case MEDIA_BUS_FMT_RGB101010_1X30: + default: + dither_down_en = 0; + pre_dither_down_en = 1; + break; } - if (conn_state->output_mode == ROCKCHIP_OUT_MODE_AAAA) - pre_dither_down_en = 0; - else - pre_dither_down_en = 1; vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, DITHER_DOWN_EN_SHIFT, dither_down_en, false); vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, + DITHER_DOWN_MODE_SHIFT, dither_down_mode, false); + vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, PRE_DITHER_DOWN_EN_SHIFT, pre_dither_down_en, false); + vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, + DITHER_DOWN_MODE_SHIFT, dither_down_mode, false); yuv_overlay = is_yuv_output(conn_state->bus_format) ? 1 : 0; vop2_mask_write(vop2, RK3568_OVL_CTRL, EN_MASK, cstate->crtc_id, @@ -2946,15 +3812,13 @@ vop2_writel(vop2, RK3568_VP0_DSP_VTOTAL_VS_END + vp_offset, (vtotal << 16) | vsync_len); - if (vop2->version == VOP_VERSION_RK3568) { - if (mode->flags & DRM_MODE_FLAG_DBLCLK || - conn_state->output_if & VOP_OUTPUT_IF_BT656) - vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, - CORE_DCLK_DIV_EN_SHIFT, 1, false); - else - vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, - CORE_DCLK_DIV_EN_SHIFT, 0, false); - } + if (mode->flags & DRM_MODE_FLAG_DBLCLK || + conn_state->output_if & VOP_OUTPUT_IF_BT656) + vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, + CORE_DCLK_DIV_EN_SHIFT, 1, false); + else + vop2_mask_write(vop2, RK3568_VP0_DSP_CTRL + vp_offset, EN_MASK, + CORE_DCLK_DIV_EN_SHIFT, 0, false); if (conn_state->output_mode == ROCKCHIP_OUT_MODE_YUV420) vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset, @@ -2987,22 +3851,26 @@ vop2_tv_config_update(state, vop2); vop2_post_config(state, vop2); + if (cstate->feature & (VOP_FEATURE_POST_ACM | VOP_FEATURE_POST_CSC)) + vop3_post_config(state, vop2); if (cstate->dsc_enable) { if (conn_state->output_flags & ROCKCHIP_OUTPUT_DUAL_CHANNEL_LEFT_RIGHT_MODE) { - vop2_dsc_enable(state, vop2, 0, dclk_rate); - vop2_dsc_enable(state, vop2, 1, dclk_rate); + vop2_dsc_enable(state, vop2, 0, dclk_rate * 1000LL); + vop2_dsc_enable(state, vop2, 1, dclk_rate * 1000LL); } else { - vop2_dsc_enable(state, vop2, cstate->dsc_id, dclk_rate); + vop2_dsc_enable(state, vop2, cstate->dsc_id, dclk_rate * 1000LL); } } +#ifndef CONFIG_SPL_BUILD snprintf(dclk_name, sizeof(dclk_name), "dclk_vp%d", cstate->crtc_id); - ret = clk_get_by_name(cstate->dev, dclk_name, &dclk); + ret = clk_get_by_name(cstate->dev, dclk_name, &cstate->dclk); if (ret) { printf("%s: Failed to get dclk ret=%d\n", __func__, ret); return ret; } +#endif ret = uclass_get_device_by_name(UCLASS_VIDEO, "display-subsystem", &disp_dev); if (!ret) { @@ -3018,11 +3886,27 @@ debug("%s: Faile to find display-subsystem node\n", __func__); } + if (vop2->version == VOP_VERSION_RK3528) { + struct ofnode_phandle_args args; + + ret = dev_read_phandle_with_args(cstate->dev, "assigned-clock-parents", + "#clock-cells", 0, 0, &args); + if (!ret) { + ret = uclass_find_device_by_ofnode(UCLASS_CLK, args.node, &hdmi0_phy_pll.dev); + if (ret) { + debug("warn: can't get clk device\n"); + return ret; + } + } else { + debug("assigned-clock-parents's node not define\n"); + } + } + if (mode->crtc_clock < VOP2_MAX_DCLK_RATE) { if (conn_state->output_if & VOP_OUTPUT_IF_HDMI0) - vop2_clk_set_parent(&dclk, &hdmi0_phy_pll); + vop2_clk_set_parent(&cstate->dclk, &hdmi0_phy_pll); else if (conn_state->output_if & VOP_OUTPUT_IF_HDMI1) - vop2_clk_set_parent(&dclk, &hdmi1_phy_pll); + vop2_clk_set_parent(&cstate->dclk, &hdmi1_phy_pll); /* * uboot clk driver won't set dclk parent's rate when use @@ -3035,16 +3919,28 @@ } else if ((conn_state->output_if & VOP_OUTPUT_IF_HDMI1) && hdmi1_phy_pll.dev) { ret = vop2_clk_set_rate(&hdmi1_phy_pll, dclk_rate * 1000); } else { - if (is_extend_pll(state, &hdmi_phy_pll.dev)) + if (is_extend_pll(state, &hdmi_phy_pll.dev)) { ret = vop2_clk_set_rate(&hdmi_phy_pll, dclk_rate * 1000); - else - ret = vop2_clk_set_rate(&dclk, dclk_rate * 1000); + } else { +#ifndef CONFIG_SPL_BUILD + ret = vop2_clk_set_rate(&cstate->dclk, dclk_rate * 1000); +#else + if (vop2->version == VOP_VERSION_RK3528) { + void *cru_base = (void *)RK3528_CRU_BASE; + + /* dclk src switch to hdmiphy pll */ + writel((BIT(0) << 16) | BIT(0), cru_base + 0x450); + rockchip_phy_set_pll(conn_state->connector->phy, dclk_rate * 1000); + ret = dclk_rate * 1000; + } +#endif + } } } else { if (is_extend_pll(state, &hdmi_phy_pll.dev)) ret = vop2_clk_set_rate(&hdmi_phy_pll, dclk_rate * 1000); else - ret = vop2_clk_set_rate(&dclk, dclk_rate * 1000); + ret = vop2_clk_set_rate(&cstate->dclk, dclk_rate * 1000); } if (IS_ERR_VALUE(ret)) { @@ -3053,7 +3949,11 @@ return ret; } else { dclk_div_factor = mode->clock / dclk_rate; - mode->crtc_clock = ret * dclk_div_factor / 1000; + if (vop2->version == VOP_VERSION_RK3528 && + conn_state->output_if & VOP_OUTPUT_IF_BT656) + mode->crtc_clock = ret / 4 / 1000; + else + mode->crtc_clock = ret * dclk_div_factor / 1000; printf("VP%d set crtc_clock to %dKHz\n", cstate->crtc_id, mode->crtc_clock); } @@ -3061,6 +3961,9 @@ RK3568_DSP_LINE_FLAG_NUM0_SHIFT, act_end, false); vop2_mask_write(vop2, RK3568_SYS_CTRL_LINE_FLAG0 + line_flag_offset, LINE_FLAG_NUM_MASK, RK3568_DSP_LINE_FLAG_NUM1_SHIFT, act_end, false); + + if (cstate->mcu_timing.mcu_pix_total) + vop3_mcu_mode_setup(state); return 0; } @@ -3071,71 +3974,129 @@ { uint16_t yrgb_hor_scl_mode, yrgb_ver_scl_mode; uint16_t hscl_filter_mode, vscl_filter_mode; - uint8_t gt2 = 0, gt4 = 0; + uint8_t xgt2 = 0, xgt4 = 0; + uint8_t ygt2 = 0, ygt4 = 0; uint32_t xfac = 0, yfac = 0; - uint16_t hsu_filter_mode = VOP2_SCALE_UP_BIC; - uint16_t hsd_filter_mode = VOP2_SCALE_DOWN_BIL; - uint16_t vsu_filter_mode = VOP2_SCALE_UP_BIL; - uint16_t vsd_filter_mode = VOP2_SCALE_DOWN_BIL; u32 win_offset = win->reg_offset; + bool xgt_en = false; + bool xavg_en = false; - if (src_h >= (4 * dst_h)) - gt4 = 1; - else if (src_h >= (2 * dst_h)) - gt2 = 1; + if (is_vop3(vop2)) { + if (src_w >= (4 * dst_w)) { + xgt4 = 1; + src_w >>= 2; + } else if (src_w >= (2 * dst_w)) { + xgt2 = 1; + src_w >>= 1; + } + } - if (gt4) + if (src_h >= (4 * dst_h)) { + ygt4 = 1; src_h >>= 2; - else if (gt2) + } else if (src_h >= (2 * dst_h)) { + ygt2 = 1; src_h >>= 1; + } yrgb_hor_scl_mode = scl_get_scl_mode(src_w, dst_w); yrgb_ver_scl_mode = scl_get_scl_mode(src_h, dst_h); if (yrgb_hor_scl_mode == SCALE_UP) - hscl_filter_mode = hsu_filter_mode; + hscl_filter_mode = win->hsu_filter_mode; else - hscl_filter_mode = hsd_filter_mode; + hscl_filter_mode = win->hsd_filter_mode; if (yrgb_ver_scl_mode == SCALE_UP) - vscl_filter_mode = vsu_filter_mode; + vscl_filter_mode = win->vsu_filter_mode; else - vscl_filter_mode = vsd_filter_mode; + vscl_filter_mode = win->vsd_filter_mode; /* * RK3568 VOP Esmart/Smart dsp_w should be even pixel * at scale down mode */ - if ((yrgb_hor_scl_mode == SCALE_DOWN) && (dst_w & 0x1)) { + if ((yrgb_hor_scl_mode == SCALE_DOWN) && (dst_w & 0x1) && !is_vop3(vop2)) { printf("win dst_w[%d] should align as 2 pixel\n", dst_w); dst_w += 1; } - xfac = vop2_scale_factor(yrgb_hor_scl_mode, hscl_filter_mode, src_w, dst_w); - yfac = vop2_scale_factor(yrgb_ver_scl_mode, vscl_filter_mode, src_h, dst_h); + if (is_vop3(vop2)) { + xfac = vop3_scale_factor(yrgb_hor_scl_mode, src_w, dst_w, true); + yfac = vop3_scale_factor(yrgb_ver_scl_mode, src_h, dst_h, false); + + if (win->hsd_pre_filter_mode == VOP3_PRE_SCALE_DOWN_AVG) + xavg_en = xgt2 || xgt4; + else + xgt_en = xgt2 || xgt4; + } else { + xfac = vop2_scale_factor(yrgb_hor_scl_mode, hscl_filter_mode, src_w, dst_w); + yfac = vop2_scale_factor(yrgb_ver_scl_mode, vscl_filter_mode, src_h, dst_h); + } if (win->type == CLUSTER_LAYER) { vop2_writel(vop2, RK3568_CLUSTER0_WIN0_SCL_FACTOR_YRGB + win_offset, yfac << 16 | xfac); - vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, - YRGB_GT2_MASK, CLUSTER_YRGB_GT2_SHIFT, gt2, false); - vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, - YRGB_GT4_MASK, CLUSTER_YRGB_GT4_SHIFT, gt4, false); + if (is_vop3(vop2)) { + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + EN_MASK, CLUSTER_XGT_EN_SHIFT, xgt_en, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + EN_MASK, CLUSTER_XAVG_EN_SHIFT, xavg_en, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + XGT_MODE_MASK, CLUSTER_XGT_MODE_SHIFT, xgt2 ? 0 : 1, false); - vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, - YRGB_XSCL_MODE_MASK, CLUSTER_YRGB_XSCL_MODE_SHIFT, yrgb_hor_scl_mode, false); - vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, - YRGB_YSCL_MODE_MASK, CLUSTER_YRGB_YSCL_MODE_SHIFT, yrgb_ver_scl_mode, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + YRGB_XSCL_MODE_MASK, RK3528_CLUSTER_YRGB_XSCL_MODE_SHIFT, + yrgb_hor_scl_mode, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + YRGB_YSCL_MODE_MASK, RK3528_CLUSTER_YRGB_YSCL_MODE_SHIFT, + yrgb_ver_scl_mode, false); + } else { + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + YRGB_XSCL_MODE_MASK, RK3568_CLUSTER_YRGB_XSCL_MODE_SHIFT, + yrgb_hor_scl_mode, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + YRGB_YSCL_MODE_MASK, RK3568_CLUSTER_YRGB_YSCL_MODE_SHIFT, + yrgb_ver_scl_mode, false); + } + if (!is_vop3(vop2) || win->vsd_pre_filter_mode == VOP3_PRE_SCALE_DOWN_GT) { + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + YRGB_GT2_MASK, CLUSTER_YRGB_GT2_SHIFT, ygt2, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + YRGB_GT4_MASK, CLUSTER_YRGB_GT4_SHIFT, ygt4, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + AVG2_MASK, CLUSTER_AVG2_SHIFT, 0, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + AVG4_MASK, CLUSTER_AVG4_SHIFT, 0, false); + } else { + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + YRGB_GT2_MASK, CLUSTER_YRGB_GT2_SHIFT, 0, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + YRGB_GT4_MASK, CLUSTER_YRGB_GT4_SHIFT, 0, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + AVG2_MASK, CLUSTER_AVG2_SHIFT, ygt2, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL1 + win_offset, + AVG4_MASK, CLUSTER_AVG4_SHIFT, ygt4, false); + } } else { vop2_writel(vop2, RK3568_ESMART0_REGION0_SCL_FACTOR_YRGB + win_offset, yfac << 16 | xfac); + if (is_vop3(vop2)) { + vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, + EN_MASK, ESMART_XGT_EN_SHIFT, xgt_en, false); + vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, + EN_MASK, ESMART_XAVG_EN_SHIFT, xavg_en, false); + vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, + XGT_MODE_MASK, ESMART_XGT_MODE_SHIFT, xgt2 ? 0 : 1, false); + } + vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, - YRGB_GT2_MASK, YRGB_GT2_SHIFT, gt2, false); + YRGB_GT2_MASK, YRGB_GT2_SHIFT, ygt2, false); vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, - YRGB_GT4_MASK, YRGB_GT4_SHIFT, gt4, false); + YRGB_GT4_MASK, YRGB_GT4_SHIFT, ygt4, false); vop2_mask_write(vop2, RK3568_ESMART0_REGION0_SCL_CTRL + win_offset, YRGB_XSCL_MODE_MASK, YRGB_XSCL_MODE_SHIFT, yrgb_hor_scl_mode, false); @@ -3172,6 +4133,16 @@ } } +static bool vop2_win_dither_up(uint32_t format) +{ + switch (format) { + case ROCKCHIP_FMT_RGB565: + return true; + default: + return false; + } +} + static void vop2_set_cluster_win(struct display_state *state, struct vop2_win_data *win) { struct crtc_state *cstate = &state->crtc_state; @@ -3193,6 +4164,7 @@ u32 splice_yrgb_offset = 0; u32 win_offset = win->reg_offset; u32 cfg_done = CFG_DONE_EN | BIT(cstate->crtc_id) | (BIT(cstate->crtc_id) << 16); + bool dither_up; if (win->splice_mode_right) { src_w = cstate->right_src_rect.w; @@ -3223,11 +4195,17 @@ vop2_setup_scale(vop2, win, src_w, src_h, crtc_w, crtc_h); - if (vop2->version == VOP_VERSION_RK3588) + if (vop2->version == VOP_VERSION_RK3588 || vop2->version == VOP_VERSION_RK3528 || + vop2->version == VOP_VERSION_RK3562) vop2_axi_config(vop2, win); if (y_mirror) printf("WARN: y mirror is unsupported by cluster window\n"); + + /* rk3588 should set half_blocK_en to 1 in line and tile mode */ + if (vop2->version == VOP_VERSION_RK3588) + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_AFBCD_CTRL + win_offset, + EN_MASK, CLUSTER_AFBCD_HALF_BLOCK_SHIFT, 1, false); vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, WIN_FORMAT_MASK, WIN_FORMAT_SHIFT, cstate->format, @@ -3242,12 +4220,17 @@ vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, EN_MASK, WIN_EN_SHIFT, 1, false); - csc_mode = vop2_convert_csc_mode(conn_state->color_space); + csc_mode = vop2_convert_csc_mode(conn_state->color_space, CSC_10BIT_DEPTH); vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, EN_MASK, CLUSTER_RGB2YUV_EN_SHIFT, is_yuv_output(conn_state->bus_format), false); vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, CSC_MODE_MASK, CLUSTER_CSC_MODE_SHIFT, csc_mode, false); + + dither_up = vop2_win_dither_up(cstate->format); + vop2_mask_write(vop2, RK3568_CLUSTER0_WIN0_CTRL0 + win_offset, EN_MASK, + CLUSTER_DITHER_UP_EN_SHIFT, dither_up, false); + vop2_mask_write(vop2, RK3568_CLUSTER0_CTRL + win_offset, EN_MASK, CLUSTER_EN_SHIFT, 1, false); vop2_writel(vop2, RK3568_REG_CFG_DONE, cfg_done); @@ -3274,6 +4257,7 @@ u32 splice_yrgb_offset = 0; u32 win_offset = win->reg_offset; u32 cfg_done = CFG_DONE_EN | BIT(cstate->crtc_id) | (BIT(cstate->crtc_id) << 16); + bool dither_up; if (win->splice_mode_right) { src_w = cstate->right_src_rect.w; @@ -3311,9 +4295,14 @@ else y_mirror = 0; + if (is_vop3(vop2)) + vop2_mask_write(vop2, RK3568_ESMART0_CTRL0 + win_offset, ESMART_LB_SELECT_MASK, + ESMART_LB_SELECT_SHIFT, win->scale_engine_num, false); + vop2_setup_scale(vop2, win, src_w, src_h, crtc_w, crtc_h); - if (vop2->version == VOP_VERSION_RK3588) + if (vop2->version == VOP_VERSION_RK3588 || vop2->version == VOP_VERSION_RK3528 || + vop2->version == VOP_VERSION_RK3562) vop2_axi_config(vop2, win); if (y_mirror) @@ -3337,12 +4326,16 @@ vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, EN_MASK, WIN_EN_SHIFT, 1, false); - csc_mode = vop2_convert_csc_mode(conn_state->color_space); + csc_mode = vop2_convert_csc_mode(conn_state->color_space, CSC_10BIT_DEPTH); vop2_mask_write(vop2, RK3568_ESMART0_CTRL0 + win_offset, EN_MASK, RGB2YUV_EN_SHIFT, is_yuv_output(conn_state->bus_format), false); vop2_mask_write(vop2, RK3568_ESMART0_CTRL0 + win_offset, CSC_MODE_MASK, CSC_MODE_SHIFT, csc_mode, false); + + dither_up = vop2_win_dither_up(cstate->format); + vop2_mask_write(vop2, RK3568_ESMART0_REGION0_CTRL + win_offset, EN_MASK, + REGION0_DITHER_UP_EN_SHIFT, dither_up, false); vop2_writel(vop2, RK3568_REG_CFG_DONE, cfg_done); } @@ -3412,6 +4405,10 @@ printf("invalid win id %d\n", primary_plane_id); return -ENODEV; } + + /* ignore some plane register according vop3 esmart lb mode */ + if (vop3_ignore_plane(vop2, win_data)) + return -EACCES; if (vop2->version == VOP_VERSION_RK3588) { if (vop2_power_domain_on(vop2, win_data->pd_id)) @@ -3494,6 +4491,10 @@ if (cstate->dsc_enable) vop2_dsc_cfg_done(state); + if (cstate->mcu_timing.mcu_pix_total) + vop2_mask_write(vop2, RK3562_VP0_MCU_CTRL + vp_offset, EN_MASK, + MCU_HOLD_MODE_SHIFT, 0, false); + return 0; } @@ -3570,7 +4571,7 @@ int vp_id = 0; int cursor_plane_id = -1; - if (vop_fix_dts) + if (vop_fix_dts || vop2->version == VOP_VERSION_RK3528) return 0; ofnode_for_each_subnode(vp_node, np_to_ofnode(port_parent_node)) { @@ -3638,6 +4639,53 @@ return 0; } +static int rockchip_vop2_mode_fixup(struct display_state *state) +{ + struct connector_state *conn_state = &state->conn_state; + struct drm_display_mode *mode = &conn_state->mode; + struct crtc_state *cstate = &state->crtc_state; + struct vop2 *vop2 = cstate->private; + + drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V | CRTC_STEREO_DOUBLE); + + if (mode->flags & DRM_MODE_FLAG_DBLCLK || conn_state->output_if & VOP_OUTPUT_IF_BT656) + mode->crtc_clock *= 2; + + /* + * For RK3528, the path of CVBS output is like: + * VOP BT656 ENCODER -> CVBS BT656 DECODER -> CVBS ENCODER -> CVBS VDAC + * The vop2 dclk should be four times crtc_clock for CVBS sampling + * clock needs. + */ + if (vop2->version == VOP_VERSION_RK3528 && conn_state->output_if & VOP_OUTPUT_IF_BT656) + mode->crtc_clock *= 4; + + if (cstate->mcu_timing.mcu_pix_total) { + if (conn_state->output_mode == ROCKCHIP_OUT_MODE_S888) + /* + * For serial output_mode rgb3x8, one pixel need 3 cycles. + * So dclk should be three times mode clock. + */ + mode->crtc_clock *= 3; + else if (conn_state->output_mode == ROCKCHIP_OUT_MODE_S888_DUMMY) + /* + * For serial output_mode argb4x8, one pixel need 4 cycles. + * So dclk should be four times mode clock. + */ + mode->crtc_clock *= 4; + } + + if (conn_state->secondary) { + mode->crtc_clock *= 2; + mode->crtc_hdisplay *= 2; + mode->crtc_hsync_start *= 2; + mode->crtc_hsync_end *= 2; + mode->crtc_htotal *= 2; + } + + return 0; +} + #define FRAC_16_16(mult, div) (((mult) << 16) / (div)) static int rockchip_vop2_plane_check(struct display_state *state) @@ -3665,10 +4713,526 @@ if (hscale < 0 || vscale < 0) { printf("ERROR: VP%d %s: scale factor is out of range\n", cstate->crtc_id, win_data->name); return -ERANGE; + } + + return 0; +} + +static int rockchip_vop2_apply_soft_te(struct display_state *state) +{ + __maybe_unused struct connector_state *conn_state = &state->conn_state; + struct crtc_state *cstate = &state->crtc_state; + struct vop2 *vop2 = cstate->private; + u32 vp_offset = (cstate->crtc_id * 0x100); + int val = 0; + int ret = 0; + + ret = readl_poll_timeout(vop2->regs + RK3568_VP0_MIPI_CTRL + vp_offset, val, + (val >> EDPI_WMS_FS) & 0x1, 50 * 1000); + if (!ret) { +#ifndef CONFIG_SPL_BUILD + ret = readx_poll_timeout(dm_gpio_get_value, conn_state->te_gpio, val, + !val, 50 * 1000); + if (!ret) { + ret = readx_poll_timeout(dm_gpio_get_value, conn_state->te_gpio, val, + val, 50 * 1000); + if (!ret) { + vop2_mask_write(vop2, RK3568_VP0_MIPI_CTRL + vp_offset, + EN_MASK, EDPI_WMS_FS, 1, false); + } else { + printf("ERROR: vp%d wait for active TE signal timeout\n", + cstate->crtc_id); + return ret; + } + } else { + printf("ERROR: vp%d TE signal maybe always high\n", cstate->crtc_id); + return ret; + } +#endif + } else { + printf("ERROR: vp%d wait vop2 frame start timeout in hold mode\n", cstate->crtc_id); + return ret; } return 0; } + +static int rockchip_vop2_regs_dump(struct display_state *state) +{ + struct crtc_state *cstate = &state->crtc_state; + struct vop2 *vop2 = cstate->private; + const struct vop2_data *vop2_data = vop2->data; + const struct vop2_dump_regs *regs = vop2_data->dump_regs; + u32 n, i, j; + u32 base; + + if (!cstate->crtc->active) + return -EINVAL; + + n = vop2_data->dump_regs_size; + for (i = 0; i < n; i++) { + base = regs[i].offset; + printf("\n%s:\n", regs[i].name); + for (j = 0; j < 68;) { + printf("%08lx: %08x %08x %08x %08x\n", (uintptr_t)vop2->regs + base + j * 4, + vop2_readl(vop2, base + (4 * j)), + vop2_readl(vop2, base + (4 * (j + 1))), + vop2_readl(vop2, base + (4 * (j + 2))), + vop2_readl(vop2, base + (4 * (j + 3)))); + j += 4; + } + } + + return 0; +} + +static int rockchip_vop2_active_regs_dump(struct display_state *state) +{ + struct crtc_state *cstate = &state->crtc_state; + struct vop2 *vop2 = cstate->private; + const struct vop2_data *vop2_data = vop2->data; + const struct vop2_dump_regs *regs = vop2_data->dump_regs; + u32 n, i, j; + u32 base; + bool enable_state; + + if (!cstate->crtc->active) + return -EINVAL; + + n = vop2_data->dump_regs_size; + for (i = 0; i < n; i++) { + if (regs[i].state_mask) { + enable_state = (vop2_readl(vop2, regs[i].state_base) >> regs[i].state_shift) & + regs[i].state_mask; + if (enable_state != regs[i].enable_state) + continue; + } + + base = regs[i].offset; + printf("\n%s:\n", regs[i].name); + for (j = 0; j < 68;) { + printf("%08lx: %08x %08x %08x %08x\n", (uintptr_t)vop2->regs + base + j * 4, + vop2_readl(vop2, base + (4 * j)), + vop2_readl(vop2, base + (4 * (j + 1))), + vop2_readl(vop2, base + (4 * (j + 2))), + vop2_readl(vop2, base + (4 * (j + 3)))); + j += 4; + } + } + + return 0; +} + +static struct vop2_dump_regs rk3528_dump_regs[] = { + { RK3568_REG_CFG_DONE, "SYS", 0, 0, 0, 0 }, + { RK3528_OVL_SYS, "OVL_SYS", 0, 0, 0, 0 }, + { RK3528_OVL_PORT0_CTRL, "OVL_VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 }, + { RK3528_OVL_PORT1_CTRL, "OVL_VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_VP0_DSP_CTRL, "VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_VP1_DSP_CTRL, "VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_CLUSTER0_WIN0_CTRL0, "Cluster0", RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0, 1 }, + { RK3568_ESMART0_CTRL0, "Esmart0", RK3568_ESMART0_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_ESMART1_CTRL0, "Esmart1", RK3568_ESMART1_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_SMART0_CTRL0, "Esmart2", RK3568_SMART0_CTRL0, 0x1, 0, 1 }, + { RK3568_SMART1_CTRL0, "Esmart3", RK3568_SMART1_CTRL0, 0x1, 0, 1 }, + { RK3528_HDR_LUT_CTRL, "HDR", 0, 0, 0, 0 }, + { RK3528_ACM_CTRL, "ACM", RK3528_ACM_CTRL, 0x1, 0, 1}, +}; + +static u8 rk3528_vp_primary_plane_order[ROCKCHIP_VOP2_LAYER_MAX] = { + ROCKCHIP_VOP2_ESMART0, + ROCKCHIP_VOP2_ESMART1, + ROCKCHIP_VOP2_ESMART2, + ROCKCHIP_VOP2_ESMART3, +}; + +static struct vop2_plane_table rk3528_plane_table[ROCKCHIP_VOP2_LAYER_MAX] = { + {ROCKCHIP_VOP2_CLUSTER0, CLUSTER_LAYER}, + {ROCKCHIP_VOP2_ESMART0, ESMART_LAYER}, + {ROCKCHIP_VOP2_ESMART1, ESMART_LAYER}, + {ROCKCHIP_VOP2_ESMART2, ESMART_LAYER}, + {ROCKCHIP_VOP2_ESMART3, ESMART_LAYER}, +}; + +static struct vop2_vp_plane_mask rk3528_vp_plane_mask[VOP2_VP_MAX][VOP2_VP_MAX] = { + { /* one display policy for hdmi */ + {/* main display */ + .primary_plane_id = ROCKCHIP_VOP2_ESMART0, + .attached_layers_nr = 4, + .attached_layers = { + ROCKCHIP_VOP2_CLUSTER0, + ROCKCHIP_VOP2_ESMART0, ROCKCHIP_VOP2_ESMART1, ROCKCHIP_VOP2_ESMART2 + }, + }, + {/* second display */}, + {/* third display */}, + {/* fourth display */}, + }, + + { /* two display policy */ + {/* main display */ + .primary_plane_id = ROCKCHIP_VOP2_ESMART0, + .attached_layers_nr = 3, + .attached_layers = { + ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_ESMART0, ROCKCHIP_VOP2_ESMART1 + }, + }, + + {/* second display */ + .primary_plane_id = ROCKCHIP_VOP2_ESMART3, + .attached_layers_nr = 2, + .attached_layers = { + ROCKCHIP_VOP2_ESMART2, ROCKCHIP_VOP2_ESMART3 + }, + }, + {/* third display */}, + {/* fourth display */}, + }, + + { /* one display policy for cvbs */ + {/* main display */ + .primary_plane_id = ROCKCHIP_VOP2_ESMART3, + .attached_layers_nr = 2, + .attached_layers = { + ROCKCHIP_VOP2_ESMART2, ROCKCHIP_VOP2_ESMART3 + }, + }, + {/* second display */}, + {/* third display */}, + {/* fourth display */}, + }, + + {/* reserved */}, +}; + +static struct vop2_win_data rk3528_win_data[5] = { + { + .name = "Esmart0", + .phys_id = ROCKCHIP_VOP2_ESMART0, + .type = ESMART_LAYER, + .win_sel_port_offset = 8, + .layer_sel_win_id = { 1, 0xff, 0xff, 0xff }, + .reg_offset = 0, + .axi_id = 0, + .axi_yrgb_id = 0x06, + .axi_uv_id = 0x07, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG, /* gt or avg */ + .vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_GT, /* gt only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, + + { + .name = "Esmart1", + .phys_id = ROCKCHIP_VOP2_ESMART1, + .type = ESMART_LAYER, + .win_sel_port_offset = 10, + .layer_sel_win_id = { 2, 0xff, 0xff, 0xff }, + .reg_offset = 0x200, + .axi_id = 0, + .axi_yrgb_id = 0x08, + .axi_uv_id = 0x09, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG, /* gt or avg */ + .vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_GT, /* gt only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, + + { + .name = "Esmart2", + .phys_id = ROCKCHIP_VOP2_ESMART2, + .type = ESMART_LAYER, + .win_sel_port_offset = 12, + .layer_sel_win_id = { 3, 0, 0xff, 0xff }, + .reg_offset = 0x400, + .axi_id = 0, + .axi_yrgb_id = 0x0a, + .axi_uv_id = 0x0b, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG, /* gt or avg */ + .vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_GT, /* gt only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, + + { + .name = "Esmart3", + .phys_id = ROCKCHIP_VOP2_ESMART3, + .type = ESMART_LAYER, + .win_sel_port_offset = 14, + .layer_sel_win_id = { 0xff, 1, 0xff, 0xff }, + .reg_offset = 0x600, + .axi_id = 0, + .axi_yrgb_id = 0x0c, + .axi_uv_id = 0x0d, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG, /* gt or avg */ + .vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_GT, /* gt only */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, + + { + .name = "Cluster0", + .phys_id = ROCKCHIP_VOP2_CLUSTER0, + .type = CLUSTER_LAYER, + .win_sel_port_offset = 0, + .layer_sel_win_id = { 0, 0xff, 0xff, 0xff }, + .reg_offset = 0, + .axi_id = 0, + .axi_yrgb_id = 0x02, + .axi_uv_id = 0x03, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .hsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG, /* gt or avg */ + .vsd_pre_filter_mode = VOP3_PRE_SCALE_DOWN_AVG, /* gt or avg */ + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, +}; + +static struct vop2_vp_data rk3528_vp_data[2] = { + { + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN | VOP_FEATURE_POST_ACM | + VOP_FEATURE_POST_CSC, + .max_output = {4096, 4096}, + .layer_mix_dly = 6, + .hdr_mix_dly = 2, + .win_dly = 8, + }, + { + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, + .max_output = {1920, 1080}, + .layer_mix_dly = 2, + .hdr_mix_dly = 0, + .win_dly = 8, + }, +}; + +const struct vop2_data rk3528_vop = { + .version = VOP_VERSION_RK3528, + .nr_vps = 2, + .vp_data = rk3528_vp_data, + .win_data = rk3528_win_data, + .plane_mask = rk3528_vp_plane_mask[0], + .plane_table = rk3528_plane_table, + .vp_primary_plane_order = rk3528_vp_primary_plane_order, + .nr_layers = 5, + .nr_mixers = 3, + .nr_gammas = 2, + .esmart_lb_mode = VOP3_ESMART_4K_2K_2K_MODE, + .dump_regs = rk3528_dump_regs, + .dump_regs_size = ARRAY_SIZE(rk3528_dump_regs), +}; + +static struct vop2_dump_regs rk3562_dump_regs[] = { + { RK3568_REG_CFG_DONE, "SYS", 0, 0, 0, 0 }, + { RK3528_OVL_SYS, "OVL_SYS", 0, 0, 0, 0 }, + { RK3528_OVL_PORT0_CTRL, "OVL_VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 }, + { RK3528_OVL_PORT1_CTRL, "OVL_VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_VP0_DSP_CTRL, "VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_VP1_DSP_CTRL, "VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_ESMART0_CTRL0, "Esmart0", RK3568_ESMART0_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_ESMART1_CTRL0, "Esmart1", RK3568_ESMART1_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_SMART0_CTRL0, "Esmart2", RK3568_SMART0_CTRL0, 0x1, 0, 1 }, + { RK3568_SMART1_CTRL0, "Esmart3", RK3568_SMART1_CTRL0, 0x1, 0, 1 }, +}; + +static u8 rk3562_vp_primary_plane_order[ROCKCHIP_VOP2_LAYER_MAX] = { + ROCKCHIP_VOP2_ESMART0, + ROCKCHIP_VOP2_ESMART1, + ROCKCHIP_VOP2_ESMART2, + ROCKCHIP_VOP2_ESMART3, +}; + +static struct vop2_plane_table rk3562_plane_table[ROCKCHIP_VOP2_LAYER_MAX] = { + {ROCKCHIP_VOP2_ESMART0, ESMART_LAYER}, + {ROCKCHIP_VOP2_ESMART1, ESMART_LAYER}, + {ROCKCHIP_VOP2_ESMART2, ESMART_LAYER}, + {ROCKCHIP_VOP2_ESMART3, ESMART_LAYER}, +}; + +static struct vop2_vp_plane_mask rk3562_vp_plane_mask[VOP2_VP_MAX][VOP2_VP_MAX] = { + { /* one display policy for hdmi */ + {/* main display */ + .primary_plane_id = ROCKCHIP_VOP2_ESMART0, + .attached_layers_nr = 4, + .attached_layers = { + ROCKCHIP_VOP2_ESMART0, ROCKCHIP_VOP2_ESMART1, + ROCKCHIP_VOP2_ESMART2, ROCKCHIP_VOP2_ESMART3 + }, + }, + {/* second display */}, + {/* third display */}, + {/* fourth display */}, + }, + + { /* two display policy */ + {/* main display */ + .primary_plane_id = ROCKCHIP_VOP2_ESMART0, + .attached_layers_nr = 2, + .attached_layers = { + ROCKCHIP_VOP2_ESMART0, ROCKCHIP_VOP2_ESMART1 + }, + }, + + {/* second display */ + .primary_plane_id = ROCKCHIP_VOP2_ESMART2, + .attached_layers_nr = 2, + .attached_layers = { + ROCKCHIP_VOP2_ESMART2, ROCKCHIP_VOP2_ESMART3 + }, + }, + {/* third display */}, + {/* fourth display */}, + }, + + {/* reserved */}, +}; + +static struct vop2_win_data rk3562_win_data[4] = { + { + .name = "Esmart0", + .phys_id = ROCKCHIP_VOP2_ESMART0, + .type = ESMART_LAYER, + .win_sel_port_offset = 8, + .layer_sel_win_id = { 0, 0, 0xff, 0xff }, + .reg_offset = 0, + .axi_id = 0, + .axi_yrgb_id = 0x02, + .axi_uv_id = 0x03, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, + + { + .name = "Esmart1", + .phys_id = ROCKCHIP_VOP2_ESMART1, + .type = ESMART_LAYER, + .win_sel_port_offset = 10, + .layer_sel_win_id = { 1, 1, 0xff, 0xff }, + .reg_offset = 0x200, + .axi_id = 0, + .axi_yrgb_id = 0x04, + .axi_uv_id = 0x05, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, + + { + .name = "Esmart2", + .phys_id = ROCKCHIP_VOP2_ESMART2, + .type = ESMART_LAYER, + .win_sel_port_offset = 12, + .layer_sel_win_id = { 2, 2, 0xff, 0xff }, + .reg_offset = 0x400, + .axi_id = 0, + .axi_yrgb_id = 0x06, + .axi_uv_id = 0x07, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, + + { + .name = "Esmart3", + .phys_id = ROCKCHIP_VOP2_ESMART3, + .type = ESMART_LAYER, + .win_sel_port_offset = 14, + .layer_sel_win_id = { 3, 3, 0xff, 0xff }, + .reg_offset = 0x600, + .axi_id = 0, + .axi_yrgb_id = 0x08, + .axi_uv_id = 0x0d, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .max_upscale_factor = 8, + .max_downscale_factor = 8, + }, +}; + +static struct vop2_vp_data rk3562_vp_data[2] = { + { + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, + .max_output = {2048, 4096}, + .win_dly = 8, + .layer_mix_dly = 8, + }, + { + .feature = VOP_FEATURE_ALPHA_SCALE | VOP_FEATURE_OVERSCAN, + .max_output = {2048, 1080}, + .win_dly = 8, + .layer_mix_dly = 8, + }, +}; + +const struct vop2_data rk3562_vop = { + .version = VOP_VERSION_RK3562, + .nr_vps = 2, + .vp_data = rk3562_vp_data, + .win_data = rk3562_win_data, + .plane_mask = rk3562_vp_plane_mask[0], + .plane_table = rk3562_plane_table, + .vp_primary_plane_order = rk3562_vp_primary_plane_order, + .nr_layers = 4, + .nr_mixers = 3, + .nr_gammas = 2, + .esmart_lb_mode = VOP3_ESMART_2K_2K_2K_2K_MODE, + .dump_regs = rk3562_dump_regs, + .dump_regs_size = ARRAY_SIZE(rk3562_dump_regs), +}; + +static struct vop2_dump_regs rk3568_dump_regs[] = { + { RK3568_REG_CFG_DONE, "SYS", 0, 0, 0, 0 }, + { RK3568_OVL_CTRL, "OVL", 0, 0, 0, 0 }, + { RK3568_VP0_DSP_CTRL, "VP0", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_VP1_DSP_CTRL, "VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_VP2_DSP_CTRL, "VP2", RK3568_VP2_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_CLUSTER0_WIN0_CTRL0, "Cluster0", RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0, 1 }, + { RK3568_CLUSTER1_WIN0_CTRL0, "Cluster1", RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 0, 1 }, + { RK3568_ESMART0_CTRL0, "Esmart0", RK3568_ESMART0_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_ESMART1_CTRL0, "Esmart1", RK3568_ESMART1_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_SMART0_CTRL0, "Smart0", RK3568_SMART0_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_SMART1_CTRL0, "Smart1", RK3568_SMART1_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_HDR_LUT_CTRL, "HDR", 0, 0, 0, 0 }, +}; + +static u8 rk3568_vp_primary_plane_order[ROCKCHIP_VOP2_LAYER_MAX] = { + ROCKCHIP_VOP2_SMART0, + ROCKCHIP_VOP2_SMART1, + ROCKCHIP_VOP2_ESMART0, + ROCKCHIP_VOP2_ESMART1, +}; + static struct vop2_plane_table rk356x_plane_table[ROCKCHIP_VOP2_LAYER_MAX] = { {ROCKCHIP_VOP2_CLUSTER0, CLUSTER_LAYER}, {ROCKCHIP_VOP2_CLUSTER1, CLUSTER_LAYER}, @@ -3748,8 +5312,12 @@ .phys_id = ROCKCHIP_VOP2_CLUSTER0, .type = CLUSTER_LAYER, .win_sel_port_offset = 0, - .layer_sel_win_id = 0, + .layer_sel_win_id = { 0, 0, 0, 0xff }, .reg_offset = 0, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 4, .max_downscale_factor = 4, }, @@ -3759,8 +5327,12 @@ .phys_id = ROCKCHIP_VOP2_CLUSTER1, .type = CLUSTER_LAYER, .win_sel_port_offset = 1, - .layer_sel_win_id = 1, + .layer_sel_win_id = { 1, 1, 1, 0xff }, .reg_offset = 0x200, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 4, .max_downscale_factor = 4, }, @@ -3770,8 +5342,12 @@ .phys_id = ROCKCHIP_VOP2_ESMART0, .type = ESMART_LAYER, .win_sel_port_offset = 4, - .layer_sel_win_id = 2, + .layer_sel_win_id = { 2, 2, 2, 0xff }, .reg_offset = 0, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 8, .max_downscale_factor = 8, }, @@ -3781,8 +5357,12 @@ .phys_id = ROCKCHIP_VOP2_ESMART1, .type = ESMART_LAYER, .win_sel_port_offset = 5, - .layer_sel_win_id = 6, + .layer_sel_win_id = { 6, 6, 6, 0xff }, .reg_offset = 0x200, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 8, .max_downscale_factor = 8, }, @@ -3792,8 +5372,12 @@ .phys_id = ROCKCHIP_VOP2_SMART0, .type = SMART_LAYER, .win_sel_port_offset = 6, - .layer_sel_win_id = 3, + .layer_sel_win_id = { 3, 3, 3, 0xff }, .reg_offset = 0x400, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 8, .max_downscale_factor = 8, }, @@ -3803,8 +5387,12 @@ .phys_id = ROCKCHIP_VOP2_SMART1, .type = SMART_LAYER, .win_sel_port_offset = 7, - .layer_sel_win_id = 7, + .layer_sel_win_id = { 7, 7, 7, 0xff }, .reg_offset = 0x600, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 8, .max_downscale_factor = 8, }, @@ -3835,9 +5423,23 @@ .win_data = rk3568_win_data, .plane_mask = rk356x_vp_plane_mask[0], .plane_table = rk356x_plane_table, + .vp_primary_plane_order = rk3568_vp_primary_plane_order, .nr_layers = 6, .nr_mixers = 5, .nr_gammas = 1, + .dump_regs = rk3568_dump_regs, + .dump_regs_size = ARRAY_SIZE(rk3568_dump_regs), +}; + +static u8 rk3588_vp_primary_plane_order[ROCKCHIP_VOP2_LAYER_MAX] = { + ROCKCHIP_VOP2_ESMART0, + ROCKCHIP_VOP2_ESMART1, + ROCKCHIP_VOP2_ESMART2, + ROCKCHIP_VOP2_ESMART3, + ROCKCHIP_VOP2_CLUSTER0, + ROCKCHIP_VOP2_CLUSTER1, + ROCKCHIP_VOP2_CLUSTER2, + ROCKCHIP_VOP2_CLUSTER3, }; static struct vop2_plane_table rk3588_plane_table[ROCKCHIP_VOP2_LAYER_MAX] = { @@ -3851,10 +5453,28 @@ {ROCKCHIP_VOP2_ESMART3, ESMART_LAYER}, }; +static struct vop2_dump_regs rk3588_dump_regs[] = { + { RK3568_REG_CFG_DONE, "SYS", 0, 0, 0, 0 }, + { RK3568_OVL_CTRL, "OVL", 0, 0, 0, 0 }, + { RK3568_VP0_DSP_CTRL, "VP0", RK3568_VP0_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_VP1_DSP_CTRL, "VP1", RK3568_VP1_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_VP2_DSP_CTRL, "VP2", RK3568_VP2_DSP_CTRL, 0x1, 31, 0 }, + { RK3588_VP3_DSP_CTRL, "VP3", RK3588_VP3_DSP_CTRL, 0x1, 31, 0 }, + { RK3568_CLUSTER0_WIN0_CTRL0, "Cluster0", RK3568_CLUSTER0_WIN0_CTRL0, 0x1, 0, 1 }, + { RK3568_CLUSTER1_WIN0_CTRL0, "Cluster1", RK3568_CLUSTER1_WIN0_CTRL0, 0x1, 0, 1 }, + { RK3588_CLUSTER2_WIN0_CTRL0, "Cluster2", RK3588_CLUSTER2_WIN0_CTRL0, 0x1, 0, 1 }, + { RK3588_CLUSTER3_WIN0_CTRL0, "Cluster3", RK3588_CLUSTER3_WIN0_CTRL0, 0x1, 0, 1 }, + { RK3568_ESMART0_CTRL0, "Esmart0", RK3568_ESMART0_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_ESMART1_CTRL0, "Esmart1", RK3568_ESMART1_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_SMART0_CTRL0, "Esmart2", RK3568_SMART0_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_SMART1_CTRL0, "Esmart3", RK3568_SMART1_REGION0_CTRL, 0x1, 0, 1 }, + { RK3568_HDR_LUT_CTRL, "HDR", 0, 0, 0, 0 }, +}; + static struct vop2_vp_plane_mask rk3588_vp_plane_mask[VOP2_VP_MAX][VOP2_VP_MAX] = { { /* one display policy */ {/* main display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER0, + .primary_plane_id = ROCKCHIP_VOP2_ESMART0, .attached_layers_nr = 8, .attached_layers = { ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_ESMART0, ROCKCHIP_VOP2_ESMART2, @@ -3869,7 +5489,7 @@ { /* two display policy */ {/* main display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER0, + .primary_plane_id = ROCKCHIP_VOP2_ESMART0, .attached_layers_nr = 4, .attached_layers = { ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_ESMART0, @@ -3878,7 +5498,7 @@ }, {/* second display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER2, + .primary_plane_id = ROCKCHIP_VOP2_ESMART2, .attached_layers_nr = 4, .attached_layers = { ROCKCHIP_VOP2_CLUSTER2, ROCKCHIP_VOP2_ESMART2, @@ -3891,7 +5511,7 @@ { /* three display policy */ {/* main display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER0, + .primary_plane_id = ROCKCHIP_VOP2_ESMART0, .attached_layers_nr = 3, .attached_layers = { ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_CLUSTER1, ROCKCHIP_VOP2_ESMART0 @@ -3899,7 +5519,7 @@ }, {/* second display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER2, + .primary_plane_id = ROCKCHIP_VOP2_ESMART1, .attached_layers_nr = 3, .attached_layers = { ROCKCHIP_VOP2_CLUSTER2, ROCKCHIP_VOP2_CLUSTER3, ROCKCHIP_VOP2_ESMART1 @@ -3917,25 +5537,25 @@ { /* four display policy */ {/* main display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER0, + .primary_plane_id = ROCKCHIP_VOP2_ESMART0, .attached_layers_nr = 2, .attached_layers = { ROCKCHIP_VOP2_CLUSTER0, ROCKCHIP_VOP2_ESMART0 }, }, {/* second display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER1, + .primary_plane_id = ROCKCHIP_VOP2_ESMART1, .attached_layers_nr = 2, .attached_layers = { ROCKCHIP_VOP2_CLUSTER1, ROCKCHIP_VOP2_ESMART1 }, }, {/* third display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER2, + .primary_plane_id = ROCKCHIP_VOP2_ESMART2, .attached_layers_nr = 2, .attached_layers = { ROCKCHIP_VOP2_CLUSTER2, ROCKCHIP_VOP2_ESMART2 }, }, {/* fourth display */ - .primary_plane_id = ROCKCHIP_VOP2_CLUSTER3, + .primary_plane_id = ROCKCHIP_VOP2_ESMART3, .attached_layers_nr = 2, .attached_layers = { ROCKCHIP_VOP2_CLUSTER3, ROCKCHIP_VOP2_ESMART3 }, }, @@ -3950,12 +5570,16 @@ .splice_win_id = ROCKCHIP_VOP2_CLUSTER1, .type = CLUSTER_LAYER, .win_sel_port_offset = 0, - .layer_sel_win_id = 0, + .layer_sel_win_id = { 0, 0, 0, 0 }, .reg_offset = 0, .axi_id = 0, .axi_yrgb_id = 2, .axi_uv_id = 3, .pd_id = VOP2_PD_CLUSTER0, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 4, .max_downscale_factor = 4, }, @@ -3965,12 +5589,16 @@ .phys_id = ROCKCHIP_VOP2_CLUSTER1, .type = CLUSTER_LAYER, .win_sel_port_offset = 1, - .layer_sel_win_id = 1, + .layer_sel_win_id = { 1, 1, 1, 1 }, .reg_offset = 0x200, .axi_id = 0, .axi_yrgb_id = 6, .axi_uv_id = 7, .pd_id = VOP2_PD_CLUSTER1, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 4, .max_downscale_factor = 4, }, @@ -3981,12 +5609,16 @@ .splice_win_id = ROCKCHIP_VOP2_CLUSTER3, .type = CLUSTER_LAYER, .win_sel_port_offset = 2, - .layer_sel_win_id = 4, + .layer_sel_win_id = { 4, 4, 4, 4 }, .reg_offset = 0x400, .axi_id = 1, .axi_yrgb_id = 2, .axi_uv_id = 3, .pd_id = VOP2_PD_CLUSTER2, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 4, .max_downscale_factor = 4, }, @@ -3996,12 +5628,16 @@ .phys_id = ROCKCHIP_VOP2_CLUSTER3, .type = CLUSTER_LAYER, .win_sel_port_offset = 3, - .layer_sel_win_id = 5, + .layer_sel_win_id = { 5, 5, 5, 5 }, .reg_offset = 0x600, .axi_id = 1, .axi_yrgb_id = 6, .axi_uv_id = 7, .pd_id = VOP2_PD_CLUSTER3, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 4, .max_downscale_factor = 4, }, @@ -4012,11 +5648,15 @@ .splice_win_id = ROCKCHIP_VOP2_ESMART1, .type = ESMART_LAYER, .win_sel_port_offset = 4, - .layer_sel_win_id = 2, + .layer_sel_win_id = { 2, 2, 2, 2 }, .reg_offset = 0, .axi_id = 0, .axi_yrgb_id = 0x0a, .axi_uv_id = 0x0b, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 8, .max_downscale_factor = 8, }, @@ -4026,12 +5666,16 @@ .phys_id = ROCKCHIP_VOP2_ESMART1, .type = ESMART_LAYER, .win_sel_port_offset = 5, - .layer_sel_win_id = 3, + .layer_sel_win_id = { 3, 3, 3, 3 }, .reg_offset = 0x200, .axi_id = 0, .axi_yrgb_id = 0x0c, .axi_uv_id = 0x0d, .pd_id = VOP2_PD_ESMART, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 8, .max_downscale_factor = 8, }, @@ -4042,12 +5686,16 @@ .splice_win_id = ROCKCHIP_VOP2_ESMART3, .type = ESMART_LAYER, .win_sel_port_offset = 6, - .layer_sel_win_id = 6, + .layer_sel_win_id = { 6, 6, 6, 6 }, .reg_offset = 0x400, .axi_id = 1, .axi_yrgb_id = 0x0a, .axi_uv_id = 0x0b, .pd_id = VOP2_PD_ESMART, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 8, .max_downscale_factor = 8, }, @@ -4057,12 +5705,16 @@ .phys_id = ROCKCHIP_VOP2_ESMART3, .type = ESMART_LAYER, .win_sel_port_offset = 7, - .layer_sel_win_id = 7, + .layer_sel_win_id = { 7, 7, 7, 7 }, .reg_offset = 0x600, .axi_id = 1, .axi_yrgb_id = 0x0c, .axi_uv_id = 0x0d, .pd_id = VOP2_PD_ESMART, + .hsu_filter_mode = VOP2_SCALE_UP_BIC, + .hsd_filter_mode = VOP2_SCALE_DOWN_BIL, + .vsu_filter_mode = VOP2_SCALE_UP_BIL, + .vsd_filter_mode = VOP2_SCALE_DOWN_BIL, .max_upscale_factor = 8, .max_downscale_factor = 8, }, @@ -4218,6 +5870,7 @@ .dsc = rk3588_dsc_data, .dsc_error_ecw = dsc_ecw, .dsc_error_buffer_flow = dsc_buffer_flow, + .vp_primary_plane_order = rk3588_vp_primary_plane_order, .nr_layers = 8, .nr_mixers = 7, .nr_gammas = 4, @@ -4225,6 +5878,8 @@ .nr_dscs = 2, .nr_dsc_ecw = ARRAY_SIZE(dsc_ecw), .nr_dsc_buffer_flow = ARRAY_SIZE(dsc_buffer_flow), + .dump_regs = rk3588_dump_regs, + .dump_regs_size = ARRAY_SIZE(rk3588_dump_regs), }; const struct rockchip_crtc_funcs rockchip_vop2_funcs = { @@ -4235,7 +5890,12 @@ .enable = rockchip_vop2_enable, .disable = rockchip_vop2_disable, .fixup_dts = rockchip_vop2_fixup_dts, + .send_mcu_cmd = rockchip_vop2_send_mcu_cmd, .check = rockchip_vop2_check, .mode_valid = rockchip_vop2_mode_valid, + .mode_fixup = rockchip_vop2_mode_fixup, .plane_check = rockchip_vop2_plane_check, + .regs_dump = rockchip_vop2_regs_dump, + .active_regs_dump = rockchip_vop2_active_regs_dump, + .apply_soft_te = rockchip_vop2_apply_soft_te, }; diff --git a/u-boot/drivers/video/drm/rockchip_vop_reg.c b/u-boot/drivers/video/drm/rockchip_vop_reg.c index 710ba20..4bfb85f 100644 --- a/u-boot/drivers/video/drm/rockchip_vop_reg.c +++ b/u-boot/drivers/video/drm/rockchip_vop_reg.c @@ -140,6 +140,11 @@ .dsp_out_yuv = VOP_REG_VER(RK3399_POST_SCL_CTRL, 0x1, 2, 3, 5, -1), .dsp_data_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1f, 12), + .dsp_bg_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 12), + .dsp_rb_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 13), + .dsp_rg_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 14), + .dsp_delta_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 15), + .dsp_dummy_swap = VOP_REG(RK3288_DSP_CTRL0, 0x1, 16), .dsp_ccir656_avg = VOP_REG(RK3288_DSP_CTRL0, 0x1, 20), .dsp_blank = VOP_REG(RK3288_DSP_CTRL0, 0x3, 18), .dsp_lut_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 0), @@ -383,6 +388,11 @@ .dither_up = VOP_REG(RK3328_DSP_CTRL1, 0x1, 6), .dsp_data_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1f, 12), + .dsp_bg_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 12), + .dsp_rb_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 13), + .dsp_rg_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 14), + .dsp_delta_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 15), + .dsp_dummy_swap = VOP_REG(RK3328_DSP_CTRL0, 0x1, 16), .dsp_ccir656_avg = VOP_REG(RK3328_DSP_CTRL0, 0x1, 20), .dsp_blank = VOP_REG(RK3328_DSP_CTRL0, 0x3, 18), .dsp_lut_en = VOP_REG(RK3328_DSP_CTRL1, 0x1, 0), @@ -544,6 +554,9 @@ .dither_up = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2), .dither_down = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x7, 6), .dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9), + .dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9), + .dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11), + .dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12), .dsp_ccir656_avg = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 5), .dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15), .dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14), @@ -642,6 +655,9 @@ .dither_up = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2), .dither_down = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x7, 6), .dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9), + .dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9), + .dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11), + .dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12), .dsp_ccir656_avg = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 5), .dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15), .dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14), @@ -754,6 +770,9 @@ .dither_down = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 8), .dither_up = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2), .dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9), + .dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9), + .dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11), + .dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12), .dsp_ccir656_avg = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 5), .dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15), .dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14), @@ -826,6 +845,9 @@ .dither_down = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 8), .dither_up = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 2), .dsp_data_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1f, 9), + .dsp_bg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 9), + .dsp_rb_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 11), + .dsp_rg_swap = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 12), .dsp_black = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 15), .dsp_blank = VOP_REG(RK3366_LIT_DSP_CTRL2, 0x1, 14), .dsp_outzero = VOP_REG(RK3366_LIT_SYS_CTRL2, 0x1, 3), diff --git a/u-boot/drivers/video/drm/rohm-bu18rl82.c b/u-boot/drivers/video/drm/rohm-bu18rl82.c index 020d369..db35848 100644 --- a/u-boot/drivers/video/drm/rohm-bu18rl82.c +++ b/u-boot/drivers/video/drm/rohm-bu18rl82.c @@ -47,6 +47,7 @@ (BU18RL82_SWRST_REG | BU18RL82_SWRST_EXCREG | BU18RL82_SWRST_ALL)); if (ret < 0) printf("failed to reset bu18rl82(%s) ret=%d\n", bus->name, ret); + mdelay(5); } static int bu18rl82_serdes_init_sequence_write(struct bu18rl82_priv *priv) diff --git a/u-boot/drivers/video/drm/rohm-bu18tl82.c b/u-boot/drivers/video/drm/rohm-bu18tl82.c index bda247e..04b44e5 100644 --- a/u-boot/drivers/video/drm/rohm-bu18tl82.c +++ b/u-boot/drivers/video/drm/rohm-bu18tl82.c @@ -7,6 +7,7 @@ #include <dm.h> #include <errno.h> #include <i2c.h> +#include <drm/drm_mipi_dsi.h> #include <video_bridge.h> #include <asm/unaligned.h> #include <linux/media-bus-format.h> @@ -31,6 +32,7 @@ struct udevice *power_supply; struct gpio_desc enable_gpio; struct serdes_init_seq *serdes_init_seq; + bool sel_mipi; }; static void bu18tl82_bridge_reset(struct rockchip_bridge *bridge) @@ -216,6 +218,20 @@ return ret; } + priv->sel_mipi = dev_read_bool(dev, "sel-mipi"); + if (priv->sel_mipi) { + struct mipi_dsi_device *device = dev_get_platdata(dev); + + device->dev = dev; + device->lanes = dev_read_u32_default(dev, "dsi,lanes", 4); + device->format = dev_read_u32_default(dev, "dsi,format", + MIPI_DSI_FMT_RGB888); + device->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | + MIPI_DSI_MODE_VIDEO_HBP | MIPI_DSI_MODE_LPM | + MIPI_DSI_MODE_EOT_PACKET; + device->channel = dev_read_u32_default(dev, "reg", 0); + } + bridge = calloc(1, sizeof(*bridge)); if (!bridge) return -ENOMEM; @@ -250,4 +266,5 @@ .of_match = bu18tl82_of_match, .probe = bu18tl82_probe, .priv_auto_alloc_size = sizeof(struct bu18tl82_priv), + .platdata_auto_alloc_size = sizeof(struct mipi_dsi_device), }; diff --git a/u-boot/drivers/watchdog/rockchip_wdt.c b/u-boot/drivers/watchdog/rockchip_wdt.c index f2962d9..0c2398f 100644 --- a/u-boot/drivers/watchdog/rockchip_wdt.c +++ b/u-boot/drivers/watchdog/rockchip_wdt.c @@ -86,7 +86,8 @@ printf("Rockchip watchdog timeout: %lld sec\n", timeout / 1000); - reset_deassert(&priv->rst); + if (priv->rst.dev) + reset_deassert(&priv->rst); rockchip_wdt_reset(dev); rockchip_wdt_settimeout(timeout, priv); @@ -100,8 +101,10 @@ { struct rockchip_wdt_priv *priv = dev_get_priv(dev); - reset_assert(&priv->rst); - reset_deassert(&priv->rst); + if (priv->rst.dev) { + reset_assert(&priv->rst); + reset_deassert(&priv->rst); + } printf("Rockchip watchdog stop\n"); @@ -133,7 +136,7 @@ ret = reset_get_by_name(dev, "reset", &priv->rst); if (ret) { pr_err("reset_get_by_name(reset) failed: %d\n", ret); - return ret; + priv->rst.dev = NULL; } ret = clk_get_by_index(dev, 0, &priv->clk); diff --git a/u-boot/env/envf.c b/u-boot/env/envf.c index b469bd2..fc55afd 100644 --- a/u-boot/env/envf.c +++ b/u-boot/env/envf.c @@ -44,16 +44,6 @@ #endif #ifdef CONFIG_DM_MMC -static int pmbr_part_valid(struct partition *part) -{ - if (part->sys_ind == EFI_PMBR_OSTYPE_EFI_GPT && - get_unaligned_le32(&part->start_sect) == 1UL) { - return 1; - } - - return 0; -} - static int is_pmbr_valid(legacy_mbr * mbr) { int i = 0; @@ -62,10 +52,10 @@ return 0; for (i = 0; i < 4; i++) { - if (pmbr_part_valid(&mbr->partition_record[i])) { + if (mbr->partition_record[i].sys_ind == 0xc) return 1; - } } + return 0; } @@ -76,10 +66,10 @@ /* Read legacy MBR from block 0 and validate it */ if ((blk_dread(dev_desc, 0, 1, (ulong *)legacymbr) != 1) || (is_pmbr_valid(legacymbr) != 1)) { - return -1; + return 0; } - return 0; + return 1; } #endif @@ -262,35 +252,6 @@ return envf_num; } -#ifdef CONFIG_ENV_PARTITION -static int envf_add_partition_bootargs(void) -{ - char *part_list; - char *bootargs; - int i; - - for (i = 0; i < ARRAY_SIZE(part_type); i++) { - part_list = env_get(part_type[i]); - if (part_list) - break; - } - if (!part_list) - return -EINVAL; - - bootargs = calloc(1, strlen(part_list) + strlen(part_type[i]) + 2); - if (!bootargs) - return -ENOMEM; - - strcat(bootargs, part_type[i]); - strcat(bootargs, "="); - strcat(bootargs, part_list); - env_update("bootargs", bootargs); - free(bootargs); - - return 0; -} -#endif - static int envf_load(void) { struct blk_desc *desc; @@ -313,10 +274,6 @@ return -EINTR; } } - -#ifdef CONFIG_ENV_PARTITION - envf_add_partition_bootargs(); -#endif return 0; } diff --git a/u-boot/examples/standalone/Makefile b/u-boot/examples/standalone/Makefile index c9d6206..cd870f6 100644 --- a/u-boot/examples/standalone/Makefile +++ b/u-boot/examples/standalone/Makefile @@ -10,6 +10,7 @@ extra-$(CONFIG_SMC911X) += smc911x_eeprom extra-$(CONFIG_SPI_FLASH_ATMEL) += atmel_df_pow2 extra-$(CONFIG_PPC) += sched +extra-$(CONFIG_ROCKCHIP_SPI) += rkspi # # Some versions of make do not handle trailing white spaces properly; diff --git a/u-boot/examples/standalone/README_rkspi.md b/u-boot/examples/standalone/README_rkspi.md new file mode 100644 index 0000000..7cb986b --- /dev/null +++ b/u-boot/examples/standalone/README_rkspi.md @@ -0,0 +1,126 @@ +# RK SPI Standalone Bin + +This is the readme for the Das U-Boot standalone program rkspi + + +How To Use +------------------------ +### Compile + +1.Define the standalone load address in includes/configs/rkxxxxx_common.h + +```shell +#define CONFIG_STANDALONE_LOAD_ADDR 0x40000000 +``` + +2.Enable rkspi in defconfig + +``` +CONFIG_ROCKCHIP_SPI=y +``` + +### Setting SPI hardware + +1.Setting the iomux and spiclk through: + +- u-boot shell command +- define it in rkspi.c spi_hw_init + +Note: + +- spiclk is the clock for spi controller, output to IO after internal frequency division of the controller. + +### Load And Executable + +1. load the bin by serial or tftp, take tftp as example: + +```shell +setenv ipaddr 172.16.12.157 +setenv serverip 172.16.12.167 +tftp 0x40000000 rkspi.bin # 0x40000000 is define by CONFIG_STANDALONE_LOAD_ADDR +``` + +2. execute it + +```shell +go 0x40000000 # 0x40000000 is define by CONFIG_STANDALONE_LOAD_ADDR +``` + +## Abort Codes + +### Introduction + +```c +int rockchip_spi_probe(u8 bus, uintptr_t base_addr, u32 rsd, u32 clock_div, u32 mode); +``` + +- bus: spi bus +- base_addr: spi register base address +- rsd: read sample clock shift with spiclk which is controller working rate +- clock_div: internal frequency division of the controller +- mode: spi mode, support: + +```c +#define SPI_CPHA BIT(0) /* clock phase */ +#define SPI_CPOL BIT(1) /* clock polarity */ +#define SPI_MODE_0 (0 | 0) /* (original MicroWire) */ +#define SPI_MODE_1 (0 | SPI_CPHA) +#define SPI_MODE_2 (SPI_CPOL | 0) +#define SPI_MODE_3 (SPI_CPOL | SPI_CPHA) +``` + + + +```c +int rockchip_spi_claim_bus(u8 bus); +``` + +- bus: spi bus + + + +```c +void rockchip_spi_release_bus(u8 bus); +``` + +- bus: spi bus + + + +```c +int rockchip_spi_xfer(u8 bus, u8 cs, unsigned int bitlen, const void *dout, void *din, unsigned long flags); +``` + +- bus: spi bus +- cs: spi cs +- bitlen: the transfer length in bits +- dout: write buffer (if exits) +- din: read buffer (if exits), if the dout and din both defined, spi work in duplex mode +- flags: operation chip select, support: + +```c +#define SPI_XFER_BEGIN BIT(0) /* Assert CS before transfer */ +#define SPI_XFER_END BIT(1) /* Deassert CS after transfer */ +#define SPI_XFER_ONCE (SPI_XFER_BEGIN | SPI_XFER_END) +``` + + + +```c +int rockchip_spi_write_then_read(u8 bus, u8 cs, + const u8 *opcode, size_t n_opcode, + const u8 *txbuf, u8 *rxbuf, size_t n_buf); +``` + +- bus: spi bus +- cs: spi cs +- opcode: command code +- n_opcode: the numbers of command code in bytes +- txbuf: write buffer (if exits) +- rxbuf: read buffer (if exits), if the dout and din both defined, spi work in duplex mode +- n_buf: the transfer length in bytes + +### Demo + +Is right in the main function of rkspi. + diff --git a/u-boot/examples/standalone/rkspi.c b/u-boot/examples/standalone/rkspi.c new file mode 100644 index 0000000..e2e2bef --- /dev/null +++ b/u-boot/examples/standalone/rkspi.c @@ -0,0 +1,454 @@ +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <exports.h> + +#include "rkspi.h" + +/* Change to 1 to output registers at the start of each transaction */ +#define DEBUG_RK_SPI 0 + +struct rockchip_spi_priv { + struct rockchip_spi *regs; + unsigned int mode; + u8 bits_per_word; /* max 16 bits per word */ + u8 n_bytes; + unsigned int clock_div; + uint cr0; + u32 rsd; /* Rx sample delay cycles */ +}; + +#define RK_SPI_BUS_MAX 5 +static struct rockchip_spi_priv spi_bus[RK_SPI_BUS_MAX]; + +static inline struct rockchip_spi_priv *get_spi_bus(u8 bus) +{ + return &spi_bus[bus]; +} + +#define SPI_FIFO_DEPTH 32 +#define SPI_CR0_RSD_MAX 0x3 + +static inline void writel(u32 val, void *addr) +{ + *(volatile u32 *)addr = val; +} + +static inline u32 readl(void *addr) +{ + return *(volatile u32 *)addr; +} + +static void rkspi_dump_regs(struct rockchip_spi *regs) +{ + debug("ctrl0: \t\t0x%08x\n", readl(®s->ctrlr0)); + debug("ctrl1: \t\t0x%08x\n", readl(®s->ctrlr1)); + debug("ssienr: \t\t0x%08x\n", readl(®s->enr)); + debug("ser: \t\t0x%08x\n", readl(®s->ser)); + debug("baudr: \t\t0x%08x\n", readl(®s->baudr)); + debug("txftlr: \t\t0x%08x\n", readl(®s->txftlr)); + debug("rxftlr: \t\t0x%08x\n", readl(®s->rxftlr)); + debug("txflr: \t\t0x%08x\n", readl(®s->txflr)); + debug("rxflr: \t\t0x%08x\n", readl(®s->rxflr)); + debug("sr: \t\t0x%08x\n", readl(®s->sr)); + debug("imr: \t\t0x%08x\n", readl(®s->imr)); + debug("isr: \t\t0x%08x\n", readl(®s->isr)); + debug("dmacr: \t\t0x%08x\n", readl(®s->dmacr)); + debug("dmatdlr: \t0x%08x\n", readl(®s->dmatdlr)); + debug("dmardlr: \t0x%08x\n", readl(®s->dmardlr)); +} + +static void rkspi_enable_chip(struct rockchip_spi *regs, bool enable) +{ + writel(enable ? 1 : 0, ®s->enr); +} + +static void rkspi_set_baudr(struct rockchip_spi_priv *priv, uint clk_div) +{ + writel(clk_div, &priv->regs->baudr); +} + +static int rkspi_wait_till_not_busy(struct rockchip_spi *regs) +{ + unsigned long start; + + start = get_timer(0); + while (readl(®s->sr) & SR_BUSY) { + if (get_timer(start) > ROCKCHIP_SPI_TIMEOUT_MS) { + debug("RK SPI: Status keeps busy for 1000us after a read/write!\n"); + return -ETIMEDOUT; + } + } + + return 0; +} + +static void spi_cs_activate(u8 bus, u8 cs) +{ + struct rockchip_spi_priv *priv = get_spi_bus(bus); + struct rockchip_spi *regs = priv->regs; + + debug("activate cs%u\n", cs); + writel(1 << cs, ®s->ser); +} + +static void spi_cs_deactivate(u8 bus, u8 cs) +{ + struct rockchip_spi_priv *priv = get_spi_bus(bus); + struct rockchip_spi *regs = priv->regs; + + debug("deactivate cs%u\n", cs); + writel(0, ®s->ser); +} + +int rockchip_spi_probe(u8 bus, uintptr_t base_addr, u32 rsd, u32 clock_div, u32 mode) +{ + struct rockchip_spi_priv *priv; + + if (bus >= RK_SPI_BUS_MAX) { + printf("%s bus %d is out of max num(%d)\n", __func__, bus, RK_SPI_BUS_MAX); + return -1; + } + + debug("%s: probe\n", __func__); + + priv = &spi_bus[bus]; + + priv->regs = (struct rockchip_spi *)base_addr; + priv->rsd = rsd; + priv->mode = mode; + if (clock_div % 2 || clock_div < 2) { + printf("%s div should be even num, and at least 2\n", __func__); + + return -1; + } + priv->clock_div = clock_div; + priv->bits_per_word = 8; + + return 0; +} + +int rockchip_spi_claim_bus(u8 bus) +{ + struct rockchip_spi_priv *priv = get_spi_bus(bus); + struct rockchip_spi *regs = priv->regs; + u8 spi_dfs, spi_tf; + uint ctrlr0; + + /* Disable the SPI hardware */ + rkspi_enable_chip(regs, 0); + + switch (priv->bits_per_word) { + case 8: + priv->n_bytes = 1; + spi_dfs = DFS_8BIT; + spi_tf = HALF_WORD_OFF; + break; + case 16: + priv->n_bytes = 2; + spi_dfs = DFS_16BIT; + spi_tf = HALF_WORD_ON; + break; + default: + debug("%s: unsupported bits: %dbits\n", __func__, + priv->bits_per_word); + return -EPROTONOSUPPORT; + } + + rkspi_set_baudr(priv, priv->clock_div); + + /* Operation Mode */ + ctrlr0 = OMOD_MASTER << OMOD_SHIFT; + + /* Data Frame Size */ + ctrlr0 |= spi_dfs << DFS_SHIFT; + + /* set SPI mode 0..3 */ + if (priv->mode & SPI_CPOL) + ctrlr0 |= SCOL_HIGH << SCOL_SHIFT; + if (priv->mode & SPI_CPHA) + ctrlr0 |= SCPH_TOGSTA << SCPH_SHIFT; + + /* Chip Select Mode */ + ctrlr0 |= CSM_KEEP << CSM_SHIFT; + + /* SSN to Sclk_out delay */ + ctrlr0 |= SSN_DELAY_ONE << SSN_DELAY_SHIFT; + + /* Serial Endian Mode */ + ctrlr0 |= SEM_LITTLE << SEM_SHIFT; + + /* First Bit Mode */ + ctrlr0 |= FBM_MSB << FBM_SHIFT; + + /* Byte and Halfword Transform */ + ctrlr0 |= spi_tf << HALF_WORD_TX_SHIFT; + + /* Rxd Sample Delay */ + ctrlr0 |= priv->rsd << RXDSD_SHIFT; + + /* Frame Format */ + ctrlr0 |= FRF_SPI << FRF_SHIFT; + + /* Save static configuration */ + priv->cr0 = ctrlr0; + + writel(ctrlr0, ®s->ctrlr0); + + return 0; +} + +int rockchip_spi_config(struct rockchip_spi_priv *priv, const void *dout) +{ + struct rockchip_spi *regs = priv->regs; + uint ctrlr0 = priv->cr0; + u32 tmod; + + if (dout) + tmod = TMOD_TR; + else + tmod = TMOD_RO; + + ctrlr0 |= (tmod & TMOD_MASK) << TMOD_SHIFT; + writel(ctrlr0, ®s->ctrlr0); + + return 0; +} + +void rockchip_spi_release_bus(u8 bus) +{ + struct rockchip_spi_priv *priv = get_spi_bus(bus); + + rkspi_enable_chip(priv->regs, false); +} + +int rockchip_spi_xfer(u8 bus, u8 cs, unsigned int bitlen, const void *dout, void *din, unsigned long flags) +{ + struct rockchip_spi_priv *priv = get_spi_bus(bus); + struct rockchip_spi *regs = priv->regs; + int len = bitlen >> 3; + const u8 *out = dout; + u8 *in = din; + int toread, towrite; + int ret; + + rockchip_spi_config(priv, dout); + + debug("%s: dout=%p, din=%p, len=%x, flags=%lx\n", __func__, dout, din, + len, flags); + if (DEBUG_RK_SPI) + rkspi_dump_regs(regs); + + /* Assert CS before transfer */ + if (flags & SPI_XFER_BEGIN) + spi_cs_activate(bus, cs); + + while (len > 0) { + int todo = min(len, 0xffff); + + rkspi_enable_chip(regs, false); + writel(todo - 1, ®s->ctrlr1); + rkspi_enable_chip(regs, true); + + toread = todo; + towrite = todo; + while (toread || towrite) { + u32 status = readl(®s->sr); + + if (towrite && !(status & SR_TF_FULL)) { + if (out) + writel(out ? *out++ : 0, regs->txdr); + towrite--; + } + if (toread && !(status & SR_RF_EMPT)) { + u32 byte = readl(regs->rxdr); + + if (in) + *in++ = byte; + toread--; + } + } + ret = rkspi_wait_till_not_busy(regs); + if (ret) + break; + len -= todo; + } + + /* Deassert CS after transfer */ + if (flags & SPI_XFER_END) + spi_cs_deactivate(bus, cs); + + rkspi_enable_chip(regs, false); + + return ret; +} + +int rockchip_spi_write_then_read(u8 bus, u8 cs, const u8 *opcode, + size_t n_opcode, const u8 *txbuf, u8 *rxbuf, + size_t n_buf) +{ + unsigned long flags = SPI_XFER_BEGIN; + int ret; + + if (n_buf == 0) + flags |= SPI_XFER_END; + + ret = rockchip_spi_xfer(bus, cs, n_opcode * 8, opcode, NULL, flags); + if (ret) { + debug("spi: failed to send command (%zu bytes): %d\n", + n_opcode, ret); + } else if (n_buf != 0) { + ret = rockchip_spi_xfer(bus, cs, n_buf * 8, txbuf, rxbuf, SPI_XFER_END); + if (ret) + debug("spi: failed to transfer %zu bytes of data: %d\n", + n_buf, ret); + } + + return ret; +} + +void dbg_print_hex(char *s, void *buf, u32 width, u32 len) +{ + u32 i, j; + unsigned char *p8 = (unsigned char *)buf; + unsigned short *p16 = (unsigned short *)buf; + u32 *p32 = (u32 *)buf; + + j = 0; + + for (i = 0; i < len; i++) { + if (j == 0) + printf("%s %p + 0x%x:", s, buf, i * width); + + if (width == 4) + printf("0x%08x,", p32[i]); + else if (width == 2) + printf("0x%04x,", p16[i]); + else + printf("0x%02x,", p8[i]); + + if (++j >= (16 / width)) { + j = 0; + printf("\n"); + } + } + + printf("\n"); +} + +static void spi_hw_init(void) +{ + /* Setting the clock and iomux */ + /* todo */ +} + +int main(int argc, char * const argv[]) +{ + int i; + + /* Print the ABI version */ + app_startup(argv); + printf("Example expects ABI version %d\n", XF_VERSION); + printf("Actual U-Boot ABI version %d\n", (int)get_version()); + + printf("rk_spi standalone version\n"); + + printf("argc = %d\n", argc); + + for (i = 0; i <= argc; ++i) { + printf("argv[%d] = \"%s\"\n", + i, + argv[i] ? argv[i] : "<NULL>"); + } + + /* + * spi test demo + */ +#if 1 + u8 bus, cs; + unsigned char *pread, *pwrite; + u32 test_size = 0x100; + int ret; + + pread = malloc(test_size); + if (!pread) + printf("%s pread malloc fail\n", __func__); + pwrite = malloc(test_size); + if (!pwrite) { + printf("%s pwrite malloc fail\n", __func__); + free(pwrite); + + return -1; + } + + for (i = 0; i < test_size; i++) + pwrite[i] = i; + + bus = 4; + cs = 0; + + spi_hw_init(); + + rockchip_spi_probe(bus, 0xfecb0000, 0, 20, SPI_MODE_3); + rockchip_spi_claim_bus(bus); + + /* + * SPI write + */ + ret = rockchip_spi_xfer(bus, cs, test_size * 8, pwrite, NULL, SPI_XFER_ONCE); + if (ret) { + printf("rockchip_spi_xfer fail ret=%d\n", ret); + + return ret; + } + + /* + * SPI read + */ + rockchip_spi_xfer(bus, cs, test_size * 8, NULL, pread, SPI_XFER_ONCE); + if (ret) { + printf("rockchip_spi_xfer fail ret=%d\n", ret); + + return ret; + } + dbg_print_hex("spi_read:", pread, 4, test_size / 4); + + /* + * SPI duplex + */ + rockchip_spi_xfer(bus, cs, test_size * 8, pwrite, pread, SPI_XFER_ONCE); + if (ret) { + printf("rockchip_spi_xfer fail ret=%d\n", ret); + + return ret; + } + dbg_print_hex("spi_duplex:", pread, 4, test_size / 4); + + /* + * SPI write then read + */ + rockchip_spi_write_then_read(bus, cs, pwrite, 1, NULL, pread, test_size); + if (ret) { + printf("rockchip_spi_xfer fail ret=%d\n", ret); + + return ret; + } + dbg_print_hex("spi_write_then_read:", pread, 4, test_size / 4); + + rockchip_spi_release_bus(bus); +#endif + + printf("Hit any key to exit ... "); + while (!tstc()) + ; + /* consume input */ + (void)getc(); + + printf("\n\n"); + + return 0; +} diff --git a/u-boot/examples/standalone/rkspi.h b/u-boot/examples/standalone/rkspi.h new file mode 100644 index 0000000..a836cfc --- /dev/null +++ b/u-boot/examples/standalone/rkspi.h @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef _DRIVER_SPI_H_ +#define _DRIVER_SPI_H_ + +struct rockchip_spi { + u32 ctrlr0; + u32 ctrlr1; + u32 enr; + u32 ser; + u32 baudr; + u32 txftlr; + u32 rxftlr; + u32 txflr; + u32 rxflr; + u32 sr; + u32 ipr; + u32 imr; + u32 isr; + u32 risr; + u32 icr; + u32 dmacr; + u32 dmatdlr; + u32 dmardlr; /* 0x44 */ + u32 reserved[0xef]; + u32 txdr[0x100]; /* 0x400 */ + u32 rxdr[0x100]; /* 0x800 */ +}; + +/* CTRLR0 */ +enum { + DFS_SHIFT = 0, /* Data Frame Size */ + DFS_MASK = 3, + DFS_4BIT = 0, + DFS_8BIT, + DFS_16BIT, + DFS_RESV, + + CFS_SHIFT = 2, /* Control Frame Size */ + CFS_MASK = 0xf, + + SCPH_SHIFT = 6, /* Serial Clock Phase */ + SCPH_MASK = 1, + SCPH_TOGMID = 0, /* SCLK toggles in middle of first data bit */ + SCPH_TOGSTA, /* SCLK toggles at start of first data bit */ + + SCOL_SHIFT = 7, /* Serial Clock Polarity */ + SCOL_MASK = 1, + SCOL_LOW = 0, /* Inactive state of serial clock is low */ + SCOL_HIGH, /* Inactive state of serial clock is high */ + + CSM_SHIFT = 8, /* Chip Select Mode */ + CSM_MASK = 0x3, + CSM_KEEP = 0, /* ss_n stays low after each frame */ + CSM_HALF, /* ss_n high for half sclk_out cycles */ + CSM_ONE, /* ss_n high for one sclk_out cycle */ + CSM_RESV, + + SSN_DELAY_SHIFT = 10, /* SSN to Sclk_out delay */ + SSN_DELAY_MASK = 1, + SSN_DELAY_HALF = 0, /* 1/2 sclk_out cycle */ + SSN_DELAY_ONE = 1, /* 1 sclk_out cycle */ + + SEM_SHIFT = 11, /* Serial Endian Mode */ + SEM_MASK = 1, + SEM_LITTLE = 0, /* little endian */ + SEM_BIG, /* big endian */ + + FBM_SHIFT = 12, /* First Bit Mode */ + FBM_MASK = 1, + FBM_MSB = 0, /* first bit is MSB */ + FBM_LSB, /* first bit in LSB */ + + HALF_WORD_TX_SHIFT = 13, /* Byte and Halfword Transform */ + HALF_WORD_MASK = 1, + HALF_WORD_ON = 0, /* apb 16bit write/read, spi 8bit write/read */ + HALF_WORD_OFF, /* apb 8bit write/read, spi 8bit write/read */ + + RXDSD_SHIFT = 14, /* Rxd Sample Delay, in cycles */ + RXDSD_MASK = 3, + + FRF_SHIFT = 16, /* Frame Format */ + FRF_MASK = 3, + FRF_SPI = 0, /* Motorola SPI */ + FRF_SSP, /* Texas Instruments SSP*/ + FRF_MICROWIRE, /* National Semiconductors Microwire */ + FRF_RESV, + + TMOD_SHIFT = 18, /* Transfer Mode */ + TMOD_MASK = 3, + TMOD_TR = 0, /* xmit & recv */ + TMOD_TO, /* xmit only */ + TMOD_RO, /* recv only */ + TMOD_RESV, + + OMOD_SHIFT = 20, /* Operation Mode */ + OMOD_MASK = 1, + OMOD_MASTER = 0, /* Master Mode */ + OMOD_SLAVE, /* Slave Mode */ +}; + +/* SR */ +enum { + SR_MASK = 0x7f, + SR_BUSY = 1 << 0, + SR_TF_FULL = 1 << 1, + SR_TF_EMPT = 1 << 2, + SR_RF_EMPT = 1 << 3, + SR_RF_FULL = 1 << 4, +}; + +#define ROCKCHIP_SPI_TIMEOUT_MS 1000 + +#define SPI_XFER_BEGIN BIT(0) /* Assert CS before transfer */ +#define SPI_XFER_END BIT(1) /* Deassert CS after transfer */ +#define SPI_XFER_ONCE (SPI_XFER_BEGIN | SPI_XFER_END) + +/* SPI mode flags */ +#define SPI_CPHA BIT(0) /* clock phase */ +#define SPI_CPOL BIT(1) /* clock polarity */ +#define SPI_MODE_0 (0 | 0) /* (original MicroWire) */ +#define SPI_MODE_1 (0 | SPI_CPHA) +#define SPI_MODE_2 (SPI_CPOL | 0) +#define SPI_MODE_3 (SPI_CPOL | SPI_CPHA) + +int rockchip_spi_probe(u8 bus, uintptr_t base_addr, u32 rsd, u32 clock_div, u32 mode); +int rockchip_spi_claim_bus(u8 bus); +void rockchip_spi_release_bus(u8 bus); +int rockchip_spi_xfer(u8 bus, u8 cs, unsigned int bitlen, const void *dout, void *din, unsigned long flags); +int rockchip_spi_write_then_read(u8 bus, u8 cs, + const u8 *opcode, size_t n_opcode, + const u8 *txbuf, u8 *rxbuf, size_t n_buf); + +#endif diff --git a/u-boot/fs/ubifs/debug.h b/u-boot/fs/ubifs/debug.h index 0d8ed57..87a13f2 100644 --- a/u-boot/fs/ubifs/debug.h +++ b/u-boot/fs/ubifs/debug.h @@ -166,40 +166,22 @@ dbg_snprintf_key(c, key, __tmp_key_buf, DBG_KEY_BUF_LEN)); \ } while (0) #else -#define ubifs_assert(expr) do { \ - if (unlikely(!(expr))) { \ - pr_debug("UBIFS assert failed in %s at %u\n", \ - __func__, __LINE__); \ - dump_stack(); \ - } \ -} while (0) -#define ubifs_assert_cmt_locked(c) do { \ - if (unlikely(down_write_trylock(&(c)->commit_sem))) { \ - up_write(&(c)->commit_sem); \ - pr_debug("commit lock is not locked!\n"); \ - ubifs_assert(0); \ - } \ -} while (0) +#include <log.h> +#define ubifs_assert(expr) assert(expr) +#define ubifs_assert_cmt_locked(c) do { } while (0) #define ubifs_dbg_msg(type, fmt, ...) \ pr_debug("UBIFS DBG " type ": " fmt "\n", \ ##__VA_ARGS__) #define DBG_KEY_BUF_LEN 48 -#if defined CONFIG_MTD_DEBUG #define ubifs_dbg_msg_key(type, key, fmt, ...) do { \ char __tmp_key_buf[DBG_KEY_BUF_LEN]; \ pr_debug("UBIFS DBG " type ": " fmt "%s\n", \ ##__VA_ARGS__, \ dbg_snprintf_key(c, key, __tmp_key_buf, DBG_KEY_BUF_LEN)); \ } while (0) -#else -#define ubifs_dbg_msg_key(type, key, fmt, ...) do { \ - pr_debug("UBIFS DBG\n"); \ -} while (0) - -#endif #endif diff --git a/u-boot/fs/ubifs/io.c b/u-boot/fs/ubifs/io.c index 51a95bb..cad7587 100644 --- a/u-boot/fs/ubifs/io.c +++ b/u-boot/fs/ubifs/io.c @@ -111,7 +111,7 @@ int ubifs_leb_write(struct ubifs_info *c, int lnum, const void *buf, int offs, int len) { - int err; + int err = 0; ubifs_assert(!c->ro_media && !c->ro_mount); if (c->ro_error) @@ -133,7 +133,7 @@ int ubifs_leb_change(struct ubifs_info *c, int lnum, const void *buf, int len) { - int err; + int err = 0; ubifs_assert(!c->ro_media && !c->ro_mount); if (c->ro_error) @@ -155,7 +155,7 @@ int ubifs_leb_unmap(struct ubifs_info *c, int lnum) { - int err; + int err = 0; ubifs_assert(!c->ro_media && !c->ro_mount); if (c->ro_error) @@ -176,7 +176,7 @@ int ubifs_leb_map(struct ubifs_info *c, int lnum) { - int err; + int err = 0; ubifs_assert(!c->ro_media && !c->ro_mount); if (c->ro_error) diff --git a/u-boot/fs/ubifs/super.c b/u-boot/fs/ubifs/super.c index effa8d9..b7f39cc 100644 --- a/u-boot/fs/ubifs/super.c +++ b/u-boot/fs/ubifs/super.c @@ -1749,6 +1749,8 @@ kfree(c->bottom_up_buf); ubifs_debugging_exit(c); #ifdef __UBOOT__ + ubi_close_volume(c->ubi); + mutex_unlock(&c->umount_mutex); /* Finally free U-Boot's global copy of superblock */ if (ubifs_sb != NULL) { free(ubifs_sb->s_fs_info); @@ -2050,9 +2052,9 @@ ubifs_umount(c); #ifndef __UBOOT__ bdi_destroy(&c->bdi); -#endif ubi_close_volume(c->ubi); mutex_unlock(&c->umount_mutex); +#endif } #endif @@ -2319,6 +2321,9 @@ out_umount: ubifs_umount(c); +#ifdef __UBOOT__ + goto out; +#endif out_unlock: mutex_unlock(&c->umount_mutex); #ifndef __UBOOT__ @@ -2356,7 +2361,9 @@ return ERR_PTR(err); } +#ifndef __UBOOT__ INIT_HLIST_NODE(&s->s_instances); +#endif INIT_LIST_HEAD(&s->s_inodes); s->s_time_gran = 1000000000; s->s_flags = flags; @@ -2425,14 +2432,12 @@ #ifndef __UBOOT__ strlcpy(s->s_id, type->name, sizeof(s->s_id)); list_add_tail(&s->s_list, &super_blocks); -#else - strncpy(s->s_id, type->name, sizeof(s->s_id)); -#endif hlist_add_head(&s->s_instances, &type->fs_supers); -#ifndef __UBOOT__ spin_unlock(&sb_lock); get_filesystem(type); register_shrinker(&s->s_shrink); +#else + strncpy(s->s_id, type->name, sizeof(s->s_id)); #endif return s; } @@ -2457,7 +2462,7 @@ */ ubi = open_ubi(name, UBI_READONLY); if (IS_ERR(ubi)) { - pr_err("UBIFS error (pid: %d): cannot open \"%s\", error %d", + pr_err("UBIFS error (pid: %d): cannot open \"%s\", error %d\n", current->pid, name, (int)PTR_ERR(ubi)); return ERR_CAST(ubi); } @@ -2599,7 +2604,7 @@ * UBIFS_BLOCK_SIZE. It is assumed that both are powers of 2. */ if (PAGE_CACHE_SIZE < UBIFS_BLOCK_SIZE) { - pr_err("UBIFS error (pid %d): VFS page cache size is %u bytes, but UBIFS requires at least 4096 bytes", + pr_err("UBIFS error (pid %d): VFS page cache size is %u bytes, but UBIFS requires at least 4096 bytes\n", current->pid, (unsigned int)PAGE_CACHE_SIZE); return -EINVAL; } @@ -2628,7 +2633,7 @@ err = register_filesystem(&ubifs_fs_type); if (err) { - pr_err("UBIFS error (pid %d): cannot register file system, error %d", + pr_err("UBIFS error (pid %d): cannot register file system, error %d\n", current->pid, err); goto out_dbg; } diff --git a/u-boot/fs/ubifs/tnc.c b/u-boot/fs/ubifs/tnc.c index f6316a3..77811ca 100644 --- a/u-boot/fs/ubifs/tnc.c +++ b/u-boot/fs/ubifs/tnc.c @@ -46,6 +46,11 @@ NOT_ON_MEDIA = 3, }; +static int try_read_node(const struct ubifs_info *c, void *buf, int type, + int len, int lnum, int offs); +static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key, + struct ubifs_zbranch *zbr, void *node); + /** * insert_old_idx - record an index node obsoleted since the last commit start. * @c: UBIFS file-system description object @@ -398,7 +403,19 @@ return 0; } - err = ubifs_tnc_read_node(c, zbr, node); + if (c->replaying) { + err = fallible_read_node(c, &zbr->key, zbr, node); + /* + * When the node was not found, return -ENOENT, 0 otherwise. + * Negative return codes stay as-is. + */ + if (err == 0) + err = -ENOENT; + else if (err == 1) + err = 0; + } else { + err = ubifs_tnc_read_node(c, zbr, node); + } if (err) return err; @@ -2766,7 +2783,11 @@ if (nm->name) { if (err) { /* Handle collisions */ - err = resolve_collision(c, key, &znode, &n, nm); + if (c->replaying) + err = fallible_resolve_collision(c, key, &znode, &n, + nm, 0); + else + err = resolve_collision(c, key, &znode, &n, nm); dbg_tnc("rc returned %d, znode %p, n %d", err, znode, n); if (unlikely(err < 0)) diff --git a/u-boot/fs/ubifs/ubifs.c b/u-boot/fs/ubifs/ubifs.c index 739df5d..a9ca923 100644 --- a/u-boot/fs/ubifs/ubifs.c +++ b/u-boot/fs/ubifs/ubifs.c @@ -126,6 +126,7 @@ { struct ubifs_compressor *compr = ubifs_compressors[tfm->compressor]; int err; + size_t tmp_len = *dlen; if (compr->compr_type == UBIFS_COMPR_NONE) { memcpy(dst, src, slen); @@ -133,11 +134,12 @@ return 0; } - err = compr->decompress(src, slen, dst, (size_t *)dlen); + err = compr->decompress(src, slen, dst, &tmp_len); if (err) ubifs_err(c, "cannot decompress %d bytes, compressor %s, " "error %d", slen, compr->name, err); + *dlen = tmp_len; return err; return 0; @@ -466,14 +468,10 @@ dbg_gen("cannot find next direntry, error %d", err); out_free: - if (file->private_data) - kfree(file->private_data); - if (file) - free(file); - if (dentry) - free(dentry); - if (dir) - free(dir); + kfree(file->private_data); + free(file); + free(dentry); + free(dir); return ret; } @@ -801,6 +799,8 @@ if (last_block_size) dlen = last_block_size; + else if (ret) + dlen = UBIFS_BLOCK_SIZE; else dlen = le32_to_cpu(dn->size); diff --git a/u-boot/fs/ubifs/ubifs.h b/u-boot/fs/ubifs/ubifs.h index 1d89465..7fc6e41 100644 --- a/u-boot/fs/ubifs/ubifs.h +++ b/u-boot/fs/ubifs/ubifs.h @@ -317,8 +317,8 @@ struct backing_dev_info *s_bdi; #endif struct mtd_info *s_mtd; - struct hlist_node s_instances; #ifndef __UBOOT__ + struct hlist_node s_instances; struct quota_info s_dquot; /* Diskquota specific options */ #endif @@ -611,16 +611,20 @@ /* misc.h */ #define mutex_lock_nested(...) #define mutex_unlock_nested(...) -#define mutex_is_locked(...) 0 +#define mutex_is_locked(...) 1 #endif /* Version of this UBIFS implementation */ #define UBIFS_VERSION 1 /* Normal UBIFS messages */ +#ifdef CONFIG_UBIFS_SILENCE_MSG +#define ubifs_msg(c, fmt, ...) +#else #define ubifs_msg(c, fmt, ...) \ pr_notice("UBIFS (ubi%d:%d): " fmt "\n", \ (c)->vi.ubi_num, (c)->vi.vol_id, ##__VA_ARGS__) +#endif /* UBIFS error messages */ #ifndef __UBOOT__ #define ubifs_err(c, fmt, ...) \ diff --git a/u-boot/include/android_ab.h b/u-boot/include/android_ab.h index aa621ca..15be4b8 100644 --- a/u-boot/include/android_ab.h +++ b/u-boot/include/android_ab.h @@ -47,7 +47,7 @@ int read_misc_virtual_ab_message(struct misc_virtual_ab_message *message); int write_misc_virtual_ab_message(struct misc_virtual_ab_message *message); -void ab_update_root_uuid(void); +void ab_update_root_partition(void); int ab_get_slot_suffix(char *slot_suffix); int ab_is_support_dynamic_partition(struct blk_desc *dev_desc); int ab_decrease_tries(void); diff --git a/u-boot/include/android_avb/avb_ops_user.h b/u-boot/include/android_avb/avb_ops_user.h index 36a98da..28e807b 100755 --- a/u-boot/include/android_avb/avb_ops_user.h +++ b/u-boot/include/android_avb/avb_ops_user.h @@ -63,6 +63,22 @@ /* Frees an AvbOps instance previously allocated with avb_ops_device_new(). */ void avb_ops_user_free(AvbOps* ops); +struct preloaded_partition { + uint8_t *addr; + size_t size; // 0 means the partition hasn't yet been preloaded +}; + +struct AvbOpsData { + struct AvbOps *ops; + const char *iface; + const char *devnum; + const char *slot_suffix; + struct preloaded_partition boot; + struct preloaded_partition vendor_boot; + struct preloaded_partition init_boot; + struct preloaded_partition resource; +}; + #ifdef __cplusplus } #endif diff --git a/u-boot/include/android_image.h b/u-boot/include/android_image.h index 8af0998..8ebd10d 100644 --- a/u-boot/include/android_image.h +++ b/u-boot/include/android_image.h @@ -13,8 +13,10 @@ #define ANDROID_PARTITION_BOOT "boot" #define ANDROID_PARTITION_VENDOR_BOOT "vendor_boot" +#define ANDROID_PARTITION_INIT_BOOT "init_boot" #define ANDROID_PARTITION_MISC "misc" #define ANDROID_PARTITION_OEM "oem" +#define ANDROID_PARTITION_RESOURCE "resource" #define ANDROID_PARTITION_RECOVERY "recovery" #define ANDROID_PARTITION_SYSTEM "system" #define ANDROID_PARTITION_VBMETA "vbmeta" @@ -117,7 +119,6 @@ * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34 * into this structure to compatible with boot_img_hdr_v012. */ - u32 boot_ramdisk_size; /* size in bytes */ u32 vendor_ramdisk_size; /* size in bytes */ u32 vendor_page_size; u32 vendor_header_version; @@ -135,6 +136,9 @@ u32 vendor_ramdisk_table_entry_size; u32 vendor_bootconfig_size; /* size in bytes for bootconfig image */ + void *init_boot_buf; + void *vendor_boot_buf; + /* * Don't define 'char total_cmdline[TOTAL_BOOT_ARGS_SIZE]' to avoid * this structrue is over size than page_size. diff --git a/u-boot/include/asm-generic/atomic-long.h b/u-boot/include/asm-generic/atomic-long.h index d0469ef..32f288b 100644 --- a/u-boot/include/asm-generic/atomic-long.h +++ b/u-boot/include/asm-generic/atomic-long.h @@ -66,6 +66,7 @@ atomic64_sub(i, v); } +#ifndef __UBOOT__ static inline int atomic_long_sub_and_test(long i, atomic_long_t *l) { atomic64_t *v = (atomic64_t *)l; @@ -135,6 +136,7 @@ (atomic64_cmpxchg((atomic64_t *)(l), (old), (new))) #define atomic_long_xchg(v, new) \ (atomic64_xchg((atomic64_t *)(v), (new))) +#endif /* __UBOOT__ */ #else /* BITS_PER_LONG == 64 */ diff --git a/u-boot/include/asm-generic/u-boot.h b/u-boot/include/asm-generic/u-boot.h index 17493cb..43775c5 100644 --- a/u-boot/include/asm-generic/u-boot.h +++ b/u-boot/include/asm-generic/u-boot.h @@ -87,8 +87,6 @@ ulong bi_arch_number; /* unique id for this board */ ulong bi_boot_params; /* where this board expects params */ - /* same as android image header 'os_version' */ - unsigned int bi_andr_version; #ifdef CONFIG_NR_DRAM_BANKS struct { /* RAM configuration */ u64 start; diff --git a/u-boot/include/boot_rkimg.h b/u-boot/include/boot_rkimg.h index cb57818..eb8b1ef 100644 --- a/u-boot/include/boot_rkimg.h +++ b/u-boot/include/boot_rkimg.h @@ -19,6 +19,7 @@ BOOT_MODE_PANIC, BOOT_MODE_WATCHDOG, BOOT_MODE_DFU, + BOOT_MODE_QUIESCENT, BOOT_MODE_UNDEFINE, }; diff --git a/u-boot/include/charset.h b/u-boot/include/charset.h index 39279f7..0d06b03 100644 --- a/u-boot/include/charset.h +++ b/u-boot/include/charset.h @@ -9,6 +9,9 @@ #ifndef __CHARSET_H_ #define __CHARSET_H_ +#include <linux/kernel.h> +#include <linux/types.h> + #define MAX_UTF8_PER_UTF16 4 /** diff --git a/u-boot/include/configs/evb_rk3528.h b/u-boot/include/configs/evb_rk3528.h new file mode 100644 index 0000000..f315482 --- /dev/null +++ b/u-boot/include/configs/evb_rk3528.h @@ -0,0 +1,26 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + * + * Copyright (c) 2020 Rockchip Electronics Co., Ltd + */ + +#ifndef __CONFIGS_RK3528_EVB_H +#define __CONFIGS_RK3528_EVB_H + +#include <configs/rk3528_common.h> + +#ifndef CONFIG_SPL_BUILD + +#undef ROCKCHIP_DEVICE_SETTINGS +#define ROCKCHIP_DEVICE_SETTINGS \ + "stdin=serial,usbkbd\0" \ + "stdout=serial,vidconsole\0" \ + "stderr=serial,vidconsole\0" + +#define CONFIG_SYS_MMC_ENV_DEV 0 + +#undef CONFIG_BOOTCOMMAND +#define CONFIG_BOOTCOMMAND RKIMG_BOOTCOMMAND +#endif + +#endif /* __CONFIGS_RK3528_EVB_H */ diff --git a/u-boot/include/configs/evb_rk3562.h b/u-boot/include/configs/evb_rk3562.h new file mode 100644 index 0000000..8f555ac --- /dev/null +++ b/u-boot/include/configs/evb_rk3562.h @@ -0,0 +1,26 @@ +/* + * SPDX-License-Identifier: GPL-2.0+ + * + * Copyright (c) 2022 Rockchip Electronics Co., Ltd + */ + +#ifndef __CONFIGS_RK3562_EVB_H +#define __CONFIGS_RK3562_EVB_H + +#include <configs/rk3562_common.h> + +#ifndef CONFIG_SPL_BUILD + +#undef ROCKCHIP_DEVICE_SETTINGS +#define ROCKCHIP_DEVICE_SETTINGS \ + "stdin=serial,usbkbd\0" \ + "stdout=serial,vidconsole\0" \ + "stderr=serial,vidconsole\0" + +#define CONFIG_SYS_MMC_ENV_DEV 0 + +#undef CONFIG_BOOTCOMMAND +#define CONFIG_BOOTCOMMAND RKIMG_BOOTCOMMAND +#endif + +#endif /* __CONFIGS_RK3562_EVB_H */ diff --git a/u-boot/include/configs/rk3288_common.h b/u-boot/include/configs/rk3288_common.h index 1ffa23e..be29922 100644 --- a/u-boot/include/configs/rk3288_common.h +++ b/u-boot/include/configs/rk3288_common.h @@ -59,7 +59,7 @@ #define ENV_MEM_LAYOUT_SETTINGS \ "scriptaddr=0x00000000\0" \ "pxefile_addr_r=0x00100000\0" \ - "fdt_addr_r=0x08300000\0" \ + "fdt_addr_r=0x08100000\0" \ "kernel_addr_r=0x02008000\0" \ "ramdisk_addr_r=0x0a200000\0" diff --git a/u-boot/include/configs/rk3528_common.h b/u-boot/include/configs/rk3528_common.h new file mode 100644 index 0000000..ad81095 --- /dev/null +++ b/u-boot/include/configs/rk3528_common.h @@ -0,0 +1,109 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * (C) Copyright 2020 Rockchip Electronics Co., Ltd + * + */ + +#ifndef __CONFIG_RK3528_COMMON_H +#define __CONFIG_RK3528_COMMON_H + +#include "rockchip-common.h" + +#define CONFIG_SPL_FRAMEWORK +#define CONFIG_SPL_TEXT_BASE 0x00000000 +#define CONFIG_SPL_MAX_SIZE 0x00040000 +#define CONFIG_SPL_BSS_START_ADDR 0x03fe0000 +#define CONFIG_SPL_BSS_MAX_SIZE 0x00010000 +#define CONFIG_SPL_STACK 0x03fe0000 + +#define CONFIG_SYS_MALLOC_LEN (32 << 20) +#define CONFIG_SYS_CBSIZE 1024 +#define CONFIG_SKIP_LOWLEVEL_INIT + +#ifdef CONFIG_SUPPORT_USBPLUG +#define CONFIG_SYS_TEXT_BASE 0x00000000 +#else +#define CONFIG_SYS_TEXT_BASE 0x00200000 +#endif + +#define CONFIG_SYS_INIT_SP_ADDR 0x00c00000 +#define CONFIG_SYS_LOAD_ADDR 0x00c00800 +#define CONFIG_SYS_BOOTM_LEN (64 << 20) /* 64M */ +#define COUNTER_FREQUENCY 24000000 + +#define GICD_BASE 0xfed01000 +#define GICC_BASE 0xfed02000 + +#ifdef CONFIG_SPL_DM_VIDEO +#undef CONFIG_SPL_MAX_SIZE +#undef CONFIG_SPL_BSS_MAX_SIZE +#define CONFIG_SPL_MAX_SIZE 0x00140000 +#define CONFIG_SPL_BSS_MAX_SIZE 0x00080000 +#endif + +#ifdef CONFIG_ARM_SMP +#define SMP_CPU1 0x1 +#define SMP_CPU1_STACK 0x04fe0000 +#define SMP_CPU2 0x2 +#define SMP_CPU2_STACK 0x05fe0000 +#endif + +/* secure otp */ +#define OTP_UBOOT_ROLLBACK_OFFSET 0x350 +#define OTP_UBOOT_ROLLBACK_WORDS 2 /* 64 bits, 2 words */ +#define OTP_ALL_ONES_NUM_BITS 32 +#define OTP_SECURE_BOOT_ENABLE_ADDR 0x20 +#define OTP_SECURE_BOOT_ENABLE_SIZE 1 +#define OTP_RSA_HASH_ADDR 0x180 +#define OTP_RSA_HASH_SIZE 32 + +/* MMC/SD IP block */ +#define CONFIG_BOUNCE_BUFFER + +#define CONFIG_SYS_SDRAM_BASE 0 +#define SDRAM_MAX_SIZE 0xfc000000 +#define CONFIG_PREBOOT +#define CONFIG_SYS_NONCACHED_MEMORY (1 << 20) /* 1 MiB */ + +#define CONFIG_SPL_LOAD_FIT_ADDRESS 0x2000000 + +#ifndef CONFIG_SPL_BUILD +/* usb mass storage */ +#define CONFIG_USB_FUNCTION_MASS_STORAGE +#define CONFIG_ROCKUSB_G_DNL_PID 0x350c + +#ifdef CONFIG_ARM64 +#define ENV_MEM_LAYOUT_SETTINGS \ + "scriptaddr=0x00c00000\0" \ + "pxefile_addr_r=0x00e00000\0" \ + "fdt_addr_r=0x08300000\0" \ + "kernel_addr_r=0x00280000\0" \ + "kernel_addr_c=0x04080000\0" \ + "ramdisk_addr_r=0x0a200000\0" +#else +#define ENV_MEM_LAYOUT_SETTINGS \ + "scriptaddr=0x00000000\0" \ + "pxefile_addr_r=0x00100000\0" \ + "fdt_addr_r=0x08300000\0" \ + "kernel_addr_c=0x02008000\0" \ + "kernel_addr_r=0x00208000\0" \ + "ramdisk_addr_r=0x0a200000\0" +#endif + +#include <config_distro_bootcmd.h> + +#define CONFIG_EXTRA_ENV_SETTINGS \ + ENV_MEM_LAYOUT_SETTINGS \ + "partitions=" PARTS_RKIMG \ + ROCKCHIP_DEVICE_SETTINGS \ + RKIMG_DET_BOOTDEV \ + BOOTENV +#endif + +/* rockchip ohci host driver */ +#define CONFIG_USB_OHCI_NEW +#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS 1 + +#define CONFIG_LIB_HW_RAND + +#endif diff --git a/u-boot/include/configs/rk3562_common.h b/u-boot/include/configs/rk3562_common.h new file mode 100644 index 0000000..b076f90 --- /dev/null +++ b/u-boot/include/configs/rk3562_common.h @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * (C) Copyright 2022 Rockchip Electronics Co., Ltd + * + */ + +#ifndef __CONFIG_RK3562_COMMON_H +#define __CONFIG_RK3562_COMMON_H + +#include "rockchip-common.h" + +#define CONFIG_SPL_FRAMEWORK +#define CONFIG_SPL_TEXT_BASE 0x00000000 +#define CONFIG_SPL_MAX_SIZE 0x00040000 +#define CONFIG_SPL_BSS_START_ADDR 0x03fe0000 +#define CONFIG_SPL_BSS_MAX_SIZE 0x00010000 +#define CONFIG_SPL_STACK 0x03fe0000 + +#define CONFIG_SYS_MALLOC_LEN (32 << 20) +#define CONFIG_SYS_CBSIZE 1024 +#define CONFIG_SKIP_LOWLEVEL_INIT + +#ifdef CONFIG_SUPPORT_USBPLUG +#define CONFIG_SYS_TEXT_BASE 0x00000000 +#else +#define CONFIG_SYS_TEXT_BASE 0x00200000 +#endif + +#define CONFIG_SYS_INIT_SP_ADDR 0x00c00000 +#define CONFIG_SYS_LOAD_ADDR 0x00c00800 +#define CONFIG_SYS_BOOTM_LEN (64 << 20) /* 64M */ +#define COUNTER_FREQUENCY 24000000 + +#define GICD_BASE 0xfe901000 +#define GICC_BASE 0xfe902000 + +/* secure otp */ +#define OTP_UBOOT_ROLLBACK_OFFSET 0x350 +#define OTP_UBOOT_ROLLBACK_WORDS 2 /* 64 bits, 2 words */ +#define OTP_ALL_ONES_NUM_BITS 32 +#define OTP_SECURE_BOOT_ENABLE_ADDR 0x20 +#define OTP_SECURE_BOOT_ENABLE_SIZE 1 +#define OTP_RSA_HASH_ADDR 0x180 +#define OTP_RSA_HASH_SIZE 32 + +/* MMC/SD IP block */ +#define CONFIG_BOUNCE_BUFFER + +#define CONFIG_SYS_SDRAM_BASE 0 +#define SDRAM_MAX_SIZE 0xfc000000 +#define CONFIG_PREBOOT +#define CONFIG_SYS_NONCACHED_MEMORY (1 << 20) /* 1 MiB */ + +#define CONFIG_SPL_LOAD_FIT_ADDRESS 0x2000000 + +#ifndef CONFIG_SPL_BUILD +/* usb mass storage */ +#define CONFIG_USB_FUNCTION_MASS_STORAGE +#define CONFIG_ROCKUSB_G_DNL_PID 0x350d + +#define ENV_MEM_LAYOUT_SETTINGS \ + "scriptaddr=0x00c00000\0" \ + "pxefile_addr_r=0x00e00000\0" \ + "fdt_addr_r=0x08300000\0" \ + "kernel_addr_r=0x00400000\0" \ + "kernel_addr_c=0x04080000\0" \ + "ramdisk_addr_r=0x0a200000\0" + +#include <config_distro_bootcmd.h> + +#define CONFIG_EXTRA_ENV_SETTINGS \ + ENV_MEM_LAYOUT_SETTINGS \ + "partitions=" PARTS_RKIMG \ + ROCKCHIP_DEVICE_SETTINGS \ + RKIMG_DET_BOOTDEV \ + BOOTENV +#endif + +/* rockchip ohci host driver */ +#define CONFIG_USB_OHCI_NEW +#define CONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS 1 +#define CONFIG_LIB_HW_RAND + +#endif diff --git a/u-boot/include/configs/rk3588_common.h b/u-boot/include/configs/rk3588_common.h index 5bb057a..1399468 100644 --- a/u-boot/include/configs/rk3588_common.h +++ b/u-boot/include/configs/rk3588_common.h @@ -15,14 +15,18 @@ #define CONFIG_SPL_BSS_START_ADDR 0x03fe0000 #define CONFIG_SPL_BSS_MAX_SIZE 0x00010000 #define CONFIG_SPL_STACK 0x03fe0000 +#ifdef CONFIG_SPL_LOAD_FIT_ADDRESS +#undef CONFIG_SPL_LOAD_FIT_ADDRESS +#endif +#define CONFIG_SPL_LOAD_FIT_ADDRESS 0x10000000 #define CONFIG_SYS_MALLOC_LEN (32 << 20) #define CONFIG_SYS_CBSIZE 1024 #define CONFIG_SKIP_LOWLEVEL_INIT #define CONFIG_SYS_TEXT_BASE 0x00200000 -#define CONFIG_SYS_INIT_SP_ADDR 0x00400000 -#define CONFIG_SYS_LOAD_ADDR 0x00400800 +#define CONFIG_SYS_INIT_SP_ADDR 0x00600000 +#define CONFIG_SYS_LOAD_ADDR 0x00600800 #define CONFIG_SYS_BOOTM_LEN (64 << 20) /* 64M */ #define COUNTER_FREQUENCY 24000000 diff --git a/u-boot/include/configs/rockchip-common.h b/u-boot/include/configs/rockchip-common.h index 870da94..002dcd6 100644 --- a/u-boot/include/configs/rockchip-common.h +++ b/u-boot/include/configs/rockchip-common.h @@ -158,7 +158,7 @@ "setenv devtype spinand; setenv devnum 0;" \ "elif rksfc dev 1; then " \ "setenv devtype spinor; setenv devnum 1;" \ - "else" \ + "else;" \ "setenv devtype ramdisk; setenv devnum 0;" \ "fi; \0" diff --git a/u-boot/include/configs/rv1106_common.h b/u-boot/include/configs/rv1106_common.h index 4974d55..1a03803 100644 --- a/u-boot/include/configs/rv1106_common.h +++ b/u-boot/include/configs/rv1106_common.h @@ -12,7 +12,6 @@ #define COUNTER_FREQUENCY 24000000 #define CONFIG_SYS_MALLOC_LEN (16 << 20) #define CONFIG_SYS_CBSIZE 1024 -#define CONFIG_SKIP_LOWLEVEL_INIT #define CONFIG_SYS_NS16550_MEM32 #define CONFIG_SYS_TEXT_BASE 0x00200000 diff --git a/u-boot/include/configs/rv1126_common.h b/u-boot/include/configs/rv1126_common.h index ac173a9..8f7e94e 100644 --- a/u-boot/include/configs/rv1126_common.h +++ b/u-boot/include/configs/rv1126_common.h @@ -12,7 +12,6 @@ #define COUNTER_FREQUENCY 24000000 #define CONFIG_SYS_MALLOC_LEN (32 << 20) #define CONFIG_SYS_CBSIZE 1024 -#define CONFIG_SKIP_LOWLEVEL_INIT #define CONFIG_SYS_NS16550_MEM32 #ifdef CONFIG_SUPPORT_USBPLUG @@ -106,6 +105,7 @@ #endif #endif +#define CONFIG_LIB_HW_RAND #define CONFIG_PREBOOT #endif diff --git a/u-boot/include/configs/woodburn_common.h b/u-boot/include/configs/woodburn_common.h index 9794f2d..1c66615 100644 --- a/u-boot/include/configs/woodburn_common.h +++ b/u-boot/include/configs/woodburn_common.h @@ -168,10 +168,6 @@ #define CONFIG_MXC_NAND_HWECC #define CONFIG_SYS_NAND_LARGEPAGE -#if 0 -#define CONFIG_MTD_DEBUG -#define CONFIG_MTD_DEBUG_VERBOSE 7 -#endif #define CONFIG_SYS_NAND_ONFI_DETECTION /* diff --git a/u-boot/include/dm/fdtaddr.h b/u-boot/include/dm/fdtaddr.h index c46f0e9..9265677 100644 --- a/u-boot/include/dm/fdtaddr.h +++ b/u-boot/include/dm/fdtaddr.h @@ -35,6 +35,18 @@ void *devfdt_get_addr_ptr(struct udevice *dev); /** + * devfdt_remap_addr_index() - Return indexed pointer to the memory-mapped + * I/O address of the reg property of a device + * @index: the 'reg' property can hold a list of <addr, size> pairs + * and @index is used to select which one is required + * + * @dev: Pointer to a device + * + * Return: Pointer to addr, or NULL if there is no such property + */ +void *devfdt_remap_addr_index(struct udevice *dev, int index); + +/** * devfdt_map_physmem() - Read device address from reg property of the * device node and map the address into CPU address * space. diff --git a/u-boot/include/dm/read.h b/u-boot/include/dm/read.h index 5f3738f..7c1d2f6 100644 --- a/u-boot/include/dm/read.h +++ b/u-boot/include/dm/read.h @@ -271,6 +271,18 @@ int dev_read_addr_cells(struct udevice *dev); /** + * dev_remap_addr_index() - Get the indexed reg property of a device + * as a memory-mapped I/O pointer + * + * @dev: Device to read from + * @index: the 'reg' property can hold a list of <addr, size> pairs + * and @index is used to select which one is required + * + * Return: pointer or NULL if not found + */ +void *dev_remap_addr_index(struct udevice *dev, int index); + +/** * dev_read_size_cells() - Get the number of size cells for a device's node * * This walks back up the tree to find the closest #size-cells property @@ -588,6 +600,11 @@ return fdt_address_cells(gd->fdt_blob, dev_of_offset(dev)); } +static inline void *dev_remap_addr_index(struct udevice *dev, int index) +{ + return devfdt_remap_addr_index(dev, index); +} + static inline int dev_read_size_cells(struct udevice *dev) { /* NOTE: this call should walk up the parent stack */ diff --git a/u-boot/include/dm/uclass-id.h b/u-boot/include/dm/uclass-id.h index b4c0c64..c2e12d4 100644 --- a/u-boot/include/dm/uclass-id.h +++ b/u-boot/include/dm/uclass-id.h @@ -89,6 +89,7 @@ UCLASS_THERMAL, /* Thermal sensor */ UCLASS_TIMER, /* Timer device */ UCLASS_TPM, /* Trusted Platform Module TIS interface */ + UCLASS_UFS, /* Universal Flash Storage */ UCLASS_USB, /* USB bus */ UCLASS_USB_DEV_GENERIC, /* USB generic device */ UCLASS_USB_HUB, /* USB hub */ diff --git a/u-boot/include/drm_modes.h b/u-boot/include/drm_modes.h index eda5c94..a79dfdf 100644 --- a/u-boot/include/drm_modes.h +++ b/u-boot/include/drm_modes.h @@ -38,7 +38,6 @@ #define DRM_MODE_FLAG_PIXMUX (1 << 11) #define DRM_MODE_FLAG_DBLCLK (1 << 12) #define DRM_MODE_FLAG_CLKDIV2 (1 << 13) -#define DRM_MODE_FLAG_PPIXDATA BIT(31) /* * When adding a new stereo mode don't forget to adjust DRM_MODE_FLAGS_3D_MAX * (define not exposed to user space). @@ -212,6 +211,95 @@ bool invalid; }; +/** + * enum drm_mode_status - hardware support status of a mode + * @MODE_OK: Mode OK + * @MODE_HSYNC: hsync out of range + * @MODE_VSYNC: vsync out of range + * @MODE_H_ILLEGAL: mode has illegal horizontal timings + * @MODE_V_ILLEGAL: mode has illegal vertical timings + * @MODE_BAD_WIDTH: requires an unsupported linepitch + * @MODE_NOMODE: no mode with a matching name + * @MODE_NO_INTERLACE: interlaced mode not supported + * @MODE_NO_DBLESCAN: doublescan mode not supported + * @MODE_NO_VSCAN: multiscan mode not supported + * @MODE_MEM: insufficient video memory + * @MODE_VIRTUAL_X: mode width too large for specified virtual size + * @MODE_VIRTUAL_Y: mode height too large for specified virtual size + * @MODE_MEM_VIRT: insufficient video memory given virtual size + * @MODE_NOCLOCK: no fixed clock available + * @MODE_CLOCK_HIGH: clock required is too high + * @MODE_CLOCK_LOW: clock required is too low + * @MODE_CLOCK_RANGE: clock/mode isn't in a ClockRange + * @MODE_BAD_HVALUE: horizontal timing was out of range + * @MODE_BAD_VVALUE: vertical timing was out of range + * @MODE_BAD_VSCAN: VScan value out of range + * @MODE_HSYNC_NARROW: horizontal sync too narrow + * @MODE_HSYNC_WIDE: horizontal sync too wide + * @MODE_HBLANK_NARROW: horizontal blanking too narrow + * @MODE_HBLANK_WIDE: horizontal blanking too wide + * @MODE_VSYNC_NARROW: vertical sync too narrow + * @MODE_VSYNC_WIDE: vertical sync too wide + * @MODE_VBLANK_NARROW: vertical blanking too narrow + * @MODE_VBLANK_WIDE: vertical blanking too wide + * @MODE_PANEL: exceeds panel dimensions + * @MODE_INTERLACE_WIDTH: width too large for interlaced mode + * @MODE_ONE_WIDTH: only one width is supported + * @MODE_ONE_HEIGHT: only one height is supported + * @MODE_ONE_SIZE: only one resolution is supported + * @MODE_NO_REDUCED: monitor doesn't accept reduced blanking + * @MODE_NO_STEREO: stereo modes not supported + * @MODE_NO_420: ycbcr 420 modes not supported + * @MODE_STALE: mode has become stale + * @MODE_BAD: unspecified reason + * @MODE_ERROR: error condition + * + * This enum is used to filter out modes not supported by the driver/hardware + * combination. + */ +enum drm_mode_status { + MODE_OK = 0, + MODE_HSYNC, + MODE_VSYNC, + MODE_H_ILLEGAL, + MODE_V_ILLEGAL, + MODE_BAD_WIDTH, + MODE_NOMODE, + MODE_NO_INTERLACE, + MODE_NO_DBLESCAN, + MODE_NO_VSCAN, + MODE_MEM, + MODE_VIRTUAL_X, + MODE_VIRTUAL_Y, + MODE_MEM_VIRT, + MODE_NOCLOCK, + MODE_CLOCK_HIGH, + MODE_CLOCK_LOW, + MODE_CLOCK_RANGE, + MODE_BAD_HVALUE, + MODE_BAD_VVALUE, + MODE_BAD_VSCAN, + MODE_HSYNC_NARROW, + MODE_HSYNC_WIDE, + MODE_HBLANK_NARROW, + MODE_HBLANK_WIDE, + MODE_VSYNC_NARROW, + MODE_VSYNC_WIDE, + MODE_VBLANK_NARROW, + MODE_VBLANK_WIDE, + MODE_PANEL, + MODE_INTERLACE_WIDTH, + MODE_ONE_WIDTH, + MODE_ONE_HEIGHT, + MODE_ONE_SIZE, + MODE_NO_REDUCED, + MODE_NO_STEREO, + MODE_NO_420, + MODE_STALE = -3, + MODE_BAD = -2, + MODE_ERROR = -1 +}; + /* * Subsystem independent description of a videomode. * Can be generated from struct display_timing. @@ -233,12 +321,16 @@ }; struct drm_display_mode *drm_mode_create(void); +void drm_mode_copy(struct drm_display_mode *dst, + const struct drm_display_mode *src); void drm_mode_destroy(struct drm_display_mode *mode); bool drm_mode_match(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2, unsigned int match_flags); bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2); +void drm_display_mode_from_videomode(const struct videomode *vm, + struct drm_display_mode *dmode); void drm_display_mode_to_videomode(const struct drm_display_mode *dmode, struct videomode *vm); diff --git a/u-boot/include/dt-bindings/clock/rk3528-cru.h b/u-boot/include/dt-bindings/clock/rk3528-cru.h new file mode 100644 index 0000000..807f19c --- /dev/null +++ b/u-boot/include/dt-bindings/clock/rk3528-cru.h @@ -0,0 +1,754 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +/* + * Copyright (c) 2022 Rockchip Electronics Co. Ltd. + * Author: Joseph Chen <chenjh@rock-chips.com> + */ + +#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3528_H +#define _DT_BINDINGS_CLK_ROCKCHIP_RK3528_H + +/* cru-clocks indices */ + +/* core clocks */ +#define PLL_APLL 1 +#define PLL_CPLL 2 +#define PLL_GPLL 3 +#define PLL_PPLL 4 +#define PLL_DPLL 5 +#define ARMCLK 6 + +#define XIN_OSC0_HALF 8 +#define CLK_MATRIX_50M_SRC 9 +#define CLK_MATRIX_100M_SRC 10 +#define CLK_MATRIX_150M_SRC 11 +#define CLK_MATRIX_200M_SRC 12 +#define CLK_MATRIX_250M_SRC 13 +#define CLK_MATRIX_300M_SRC 14 +#define CLK_MATRIX_339M_SRC 15 +#define CLK_MATRIX_400M_SRC 16 +#define CLK_MATRIX_500M_SRC 17 +#define CLK_MATRIX_600M_SRC 18 +#define CLK_UART0_SRC 19 +#define CLK_UART0_FRAC 20 +#define SCLK_UART0 21 +#define CLK_UART1_SRC 22 +#define CLK_UART1_FRAC 23 +#define SCLK_UART1 24 +#define CLK_UART2_SRC 25 +#define CLK_UART2_FRAC 26 +#define SCLK_UART2 27 +#define CLK_UART3_SRC 28 +#define CLK_UART3_FRAC 29 +#define SCLK_UART3 30 +#define CLK_UART4_SRC 31 +#define CLK_UART4_FRAC 32 +#define SCLK_UART4 33 +#define CLK_UART5_SRC 34 +#define CLK_UART5_FRAC 35 +#define SCLK_UART5 36 +#define CLK_UART6_SRC 37 +#define CLK_UART6_FRAC 38 +#define SCLK_UART6 39 +#define CLK_UART7_SRC 40 +#define CLK_UART7_FRAC 41 +#define SCLK_UART7 42 +#define CLK_I2S0_2CH_SRC 43 +#define CLK_I2S0_2CH_FRAC 44 +#define MCLK_I2S0_2CH_SAI_SRC 45 +#define CLK_I2S3_8CH_SRC 46 +#define CLK_I2S3_8CH_FRAC 47 +#define MCLK_I2S3_8CH_SAI_SRC 48 +#define CLK_I2S1_8CH_SRC 49 +#define CLK_I2S1_8CH_FRAC 50 +#define MCLK_I2S1_8CH_SAI_SRC 51 +#define CLK_I2S2_2CH_SRC 52 +#define CLK_I2S2_2CH_FRAC 53 +#define MCLK_I2S2_2CH_SAI_SRC 54 +#define CLK_SPDIF_SRC 55 +#define CLK_SPDIF_FRAC 56 +#define MCLK_SPDIF_SRC 57 +#define DCLK_VOP_SRC0 58 +#define DCLK_VOP_SRC1 59 +#define CLK_HSM 60 +#define CLK_CORE_SRC_ACS 63 +#define CLK_CORE_SRC_PVTMUX 65 +#define CLK_CORE_SRC 66 +#define CLK_CORE 67 +#define ACLK_M_CORE_BIU 68 +#define CLK_CORE_PVTPLL_SRC 69 +#define PCLK_DBG 70 +#define SWCLKTCK 71 +#define CLK_SCANHS_CORE 72 +#define CLK_SCANHS_ACLKM_CORE 73 +#define CLK_SCANHS_PCLK_DBG 74 +#define CLK_SCANHS_PCLK_CPU_BIU 76 +#define PCLK_CPU_ROOT 77 +#define PCLK_CORE_GRF 78 +#define PCLK_DAPLITE_BIU 79 +#define PCLK_CPU_BIU 80 +#define CLK_REF_PVTPLL_CORE 81 +#define ACLK_BUS_VOPGL_ROOT 85 +#define ACLK_BUS_VOPGL_BIU 86 +#define ACLK_BUS_H_ROOT 87 +#define ACLK_BUS_H_BIU 88 +#define ACLK_BUS_ROOT 89 +#define HCLK_BUS_ROOT 90 +#define PCLK_BUS_ROOT 91 +#define ACLK_BUS_M_ROOT 92 +#define ACLK_SYSMEM_BIU 93 +#define CLK_TIMER_ROOT 95 +#define ACLK_BUS_BIU 96 +#define HCLK_BUS_BIU 97 +#define PCLK_BUS_BIU 98 +#define PCLK_DFT2APB 99 +#define PCLK_BUS_GRF 100 +#define ACLK_BUS_M_BIU 101 +#define ACLK_GIC 102 +#define ACLK_SPINLOCK 103 +#define ACLK_DMAC 104 +#define PCLK_TIMER 105 +#define CLK_TIMER0 106 +#define CLK_TIMER1 107 +#define CLK_TIMER2 108 +#define CLK_TIMER3 109 +#define CLK_TIMER4 110 +#define CLK_TIMER5 111 +#define PCLK_JDBCK_DAP 112 +#define CLK_JDBCK_DAP 113 +#define PCLK_WDT_NS 114 +#define TCLK_WDT_NS 115 +#define HCLK_TRNG_NS 116 +#define PCLK_UART0 117 +#define CLK_CORE_CRYPTO 119 +#define CLK_PKA_CRYPTO 120 +#define ACLK_CRYPTO 121 +#define HCLK_CRYPTO 122 +#define PCLK_DMA2DDR 123 +#define ACLK_DMA2DDR 124 +#define PCLK_PWM0 126 +#define CLK_PWM0 127 +#define CLK_CAPTURE_PWM0 128 +#define PCLK_PWM1 129 +#define CLK_PWM1 130 +#define CLK_CAPTURE_PWM1 131 +#define PCLK_SCR 134 +#define ACLK_DCF 135 +#define PCLK_INTMUX 138 +#define CLK_PPLL_I 141 +#define CLK_PPLL_MUX 142 +#define CLK_PPLL_100M_MATRIX 143 +#define CLK_PPLL_50M_MATRIX 144 +#define CLK_REF_PCIE_INNER_PHY 145 +#define CLK_REF_PCIE_100M_PHY 146 +#define ACLK_VPU_L_ROOT 147 +#define CLK_GMAC1_VPU_25M 148 +#define CLK_PPLL_125M_MATRIX 149 +#define ACLK_VPU_ROOT 150 +#define HCLK_VPU_ROOT 151 +#define PCLK_VPU_ROOT 152 +#define ACLK_VPU_BIU 153 +#define HCLK_VPU_BIU 154 +#define PCLK_VPU_BIU 155 +#define ACLK_VPU 156 +#define HCLK_VPU 157 +#define PCLK_CRU_PCIE 158 +#define PCLK_VPU_GRF 159 +#define HCLK_SFC 160 +#define SCLK_SFC 161 +#define CCLK_SRC_EMMC 163 +#define HCLK_EMMC 164 +#define ACLK_EMMC 165 +#define BCLK_EMMC 166 +#define TCLK_EMMC 167 +#define PCLK_GPIO1 168 +#define DBCLK_GPIO1 169 +#define ACLK_VPU_L_BIU 172 +#define PCLK_VPU_IOC 173 +#define HCLK_SAI_I2S0 174 +#define MCLK_SAI_I2S0 175 +#define HCLK_SAI_I2S2 176 +#define MCLK_SAI_I2S2 177 +#define PCLK_ACODEC 178 +#define MCLK_ACODEC_TX 179 +#define PCLK_GPIO3 186 +#define DBCLK_GPIO3 187 +#define PCLK_SPI1 189 +#define CLK_SPI1 190 +#define SCLK_IN_SPI1 191 +#define PCLK_UART2 192 +#define PCLK_UART5 194 +#define PCLK_UART6 196 +#define PCLK_UART7 198 +#define PCLK_I2C3 200 +#define CLK_I2C3 201 +#define PCLK_I2C5 202 +#define CLK_I2C5 203 +#define PCLK_I2C6 204 +#define CLK_I2C6 205 +#define ACLK_MAC_VPU 206 +#define PCLK_MAC_VPU 207 +#define CLK_GMAC1_RMII_VPU 209 +#define CLK_GMAC1_SRC_VPU 210 +#define PCLK_PCIE 215 +#define CLK_PCIE_AUX 216 +#define ACLK_PCIE 217 +#define HCLK_PCIE_SLV 218 +#define HCLK_PCIE_DBI 219 +#define PCLK_PCIE_PHY 220 +#define PCLK_PIPE_GRF 221 +#define CLK_PIPE_USB3OTG_COMBO 230 +#define CLK_UTMI_USB3OTG 232 +#define CLK_PCIE_PIPE_PHY 235 +#define CCLK_SRC_SDIO0 240 +#define HCLK_SDIO0 241 +#define CCLK_SRC_SDIO1 244 +#define HCLK_SDIO1 245 +#define CLK_TS_0 246 +#define CLK_TS_1 247 +#define PCLK_CAN2 250 +#define CLK_CAN2 251 +#define PCLK_CAN3 252 +#define CLK_CAN3 253 +#define PCLK_SARADC 256 +#define CLK_SARADC 257 +#define PCLK_TSADC 258 +#define CLK_TSADC 259 +#define CLK_TSADC_TSEN 260 +#define ACLK_USB3OTG 261 +#define CLK_REF_USB3OTG 262 +#define CLK_SUSPEND_USB3OTG 263 +#define ACLK_GPU_ROOT 269 +#define PCLK_GPU_ROOT 270 +#define ACLK_GPU_BIU 271 +#define PCLK_GPU_BIU 272 +#define ACLK_GPU 273 +#define CLK_GPU_PVTPLL_SRC 274 +#define ACLK_GPU_MALI 275 +#define HCLK_RKVENC_ROOT 281 +#define ACLK_RKVENC_ROOT 282 +#define PCLK_RKVENC_ROOT 283 +#define HCLK_RKVENC_BIU 284 +#define ACLK_RKVENC_BIU 285 +#define PCLK_RKVENC_BIU 286 +#define HCLK_RKVENC 287 +#define ACLK_RKVENC 288 +#define CLK_CORE_RKVENC 289 +#define HCLK_SAI_I2S1 290 +#define MCLK_SAI_I2S1 291 +#define PCLK_I2C1 292 +#define CLK_I2C1 293 +#define PCLK_I2C0 294 +#define CLK_I2C0 295 +#define CLK_UART_JTAG 296 +#define PCLK_SPI0 297 +#define CLK_SPI0 298 +#define SCLK_IN_SPI0 299 +#define PCLK_GPIO4 300 +#define DBCLK_GPIO4 301 +#define PCLK_RKVENC_IOC 302 +#define HCLK_SPDIF 308 +#define MCLK_SPDIF 309 +#define HCLK_PDM 310 +#define MCLK_PDM 311 +#define PCLK_UART1 315 +#define PCLK_UART3 317 +#define PCLK_RKVENC_GRF 319 +#define PCLK_CAN0 320 +#define CLK_CAN0 321 +#define PCLK_CAN1 322 +#define CLK_CAN1 323 +#define ACLK_VO_ROOT 324 +#define HCLK_VO_ROOT 325 +#define PCLK_VO_ROOT 326 +#define ACLK_VO_BIU 327 +#define HCLK_VO_BIU 328 +#define PCLK_VO_BIU 329 +#define HCLK_RGA2E 330 +#define ACLK_RGA2E 331 +#define CLK_CORE_RGA2E 332 +#define HCLK_VDPP 333 +#define ACLK_VDPP 334 +#define CLK_CORE_VDPP 335 +#define PCLK_VO_GRF 336 +#define PCLK_CRU 337 +#define ACLK_VOP_ROOT 338 +#define ACLK_VOP_BIU 339 +#define HCLK_VOP 340 +#define DCLK_VOP0 341 +#define DCLK_VOP1 342 +#define ACLK_VOP 343 +#define PCLK_HDMI 344 +#define CLK_SFR_HDMI 345 +#define CLK_CEC_HDMI 346 +#define CLK_SPDIF_HDMI 347 +#define CLK_HDMIPHY_TMDSSRC 348 +#define CLK_HDMIPHY_PREP 349 +#define PCLK_HDMIPHY 352 +#define HCLK_HDCP_KEY 354 +#define ACLK_HDCP 355 +#define HCLK_HDCP 356 +#define PCLK_HDCP 357 +#define HCLK_CVBS 358 +#define DCLK_CVBS 359 +#define DCLK_4X_CVBS 360 +#define ACLK_JPEG_DECODER 361 +#define HCLK_JPEG_DECODER 362 +#define ACLK_VO_L_ROOT 375 +#define ACLK_VO_L_BIU 376 +#define ACLK_MAC_VO 377 +#define PCLK_MAC_VO 378 +#define CLK_GMAC0_SRC 379 +#define CLK_GMAC0_RMII_50M 380 +#define CLK_GMAC0_TX 381 +#define CLK_GMAC0_RX 382 +#define ACLK_JPEG_ROOT 385 +#define ACLK_JPEG_BIU 386 +#define HCLK_SAI_I2S3 387 +#define MCLK_SAI_I2S3 388 +#define CLK_MACPHY 398 +#define PCLK_VCDCPHY 399 +#define PCLK_GPIO2 404 +#define DBCLK_GPIO2 405 +#define PCLK_VO_IOC 406 +#define CCLK_SRC_SDMMC0 407 +#define HCLK_SDMMC0 408 +#define PCLK_OTPC_NS 411 +#define CLK_SBPI_OTPC_NS 412 +#define CLK_USER_OTPC_NS 413 +#define CLK_HDMIHDP0 415 +#define HCLK_USBHOST 416 +#define HCLK_USBHOST_ARB 417 +#define CLK_USBHOST_OHCI 418 +#define CLK_USBHOST_UTMI 419 +#define PCLK_UART4 420 +#define PCLK_I2C4 422 +#define CLK_I2C4 423 +#define PCLK_I2C7 424 +#define CLK_I2C7 425 +#define PCLK_USBPHY 426 +#define CLK_REF_USBPHY 427 +#define HCLK_RKVDEC_ROOT 433 +#define ACLK_RKVDEC_ROOT_NDFT 434 +#define PCLK_DDRPHY_CRU 435 +#define HCLK_RKVDEC_BIU 436 +#define ACLK_RKVDEC_BIU 437 +#define ACLK_RKVDEC 439 +#define HCLK_RKVDEC 440 +#define CLK_HEVC_CA_RKVDEC 441 +#define ACLK_RKVDEC_PVTMUX_ROOT 442 +#define CLK_RKVDEC_PVTPLL_SRC 443 +#define PCLK_DDR_ROOT 449 +#define PCLK_DDR_BIU 450 +#define PCLK_DDRC 451 +#define PCLK_DDRMON 452 +#define CLK_TIMER_DDRMON 453 +#define PCLK_MSCH_BIU 454 +#define PCLK_DDR_GRF 455 +#define PCLK_DDR_HWLP 456 +#define PCLK_DDRPHY 457 +#define CLK_MSCH_BIU 463 +#define ACLK_DDR_UPCTL 464 +#define CLK_DDR_UPCTL 465 +#define CLK_DDRMON 466 +#define ACLK_DDR_SCRAMBLE 467 +#define ACLK_SPLIT 468 +#define CLK_DDRC_SRC 470 +#define CLK_DDR_PHY 471 +#define PCLK_OTPC_S 472 +#define CLK_SBPI_OTPC_S 473 +#define CLK_USER_OTPC_S 474 +#define PCLK_KEYREADER 475 +#define PCLK_BUS_SGRF 476 +#define PCLK_STIMER 477 +#define CLK_STIMER0 478 +#define CLK_STIMER1 479 +#define PCLK_WDT_S 480 +#define TCLK_WDT_S 481 +#define HCLK_TRNG_S 482 +#define PCLK_KLAD 483 +#define HCLK_CRYPTO_S 484 +#define HCLK_KLAD 485 +#define HCLK_BOOTROM 486 +#define PCLK_DCF 487 +#define ACLK_SYSMEM 488 +#define HCLK_TSP 489 +#define ACLK_TSP 490 +#define CLK_CORE_TSP 491 +#define CLK_OTPC_ARB 492 +#define PCLK_OTP_MASK 493 +#define CLK_PMC_OTP 494 +#define PCLK_PMU_ROOT 495 +#define HCLK_PMU_ROOT 496 +#define PCLK_I2C2 497 +#define CLK_I2C2 498 +#define HCLK_PMU_BIU 500 +#define PCLK_PMU_BIU 501 +#define FCLK_MCU 502 +#define RTC_CLK_MCU 504 +#define PCLK_OSCCHK 505 +#define CLK_PMU_MCU_JTAG 506 +#define PCLK_PMU 508 +#define PCLK_GPIO0 509 +#define DBCLK_GPIO0 510 +#define XIN_OSC0_DIV 511 +#define CLK_DEEPSLOW 512 +#define CLK_DDR_FAIL_SAFE 513 +#define PCLK_PMU_HP_TIMER 514 +#define CLK_PMU_HP_TIMER 515 +#define CLK_PMU_32K_HP_TIMER 516 +#define PCLK_PMU_IOC 517 +#define PCLK_PMU_CRU 518 +#define PCLK_PMU_GRF 519 +#define PCLK_PMU_WDT 520 +#define TCLK_PMU_WDT 521 +#define PCLK_PMU_MAILBOX 522 +#define PCLK_SCRKEYGEN 524 +#define CLK_SCRKEYGEN 525 +#define CLK_PVTM_OSCCHK 526 +#define CLK_REFOUT 530 +#define CLK_PVTM_PMU 532 +#define PCLK_PVTM_PMU 533 +#define PCLK_PMU_SGRF 534 +#define HCLK_PMU_SRAM 535 +#define CLK_UART0 536 +#define CLK_UART1 537 +#define CLK_UART2 538 +#define CLK_UART3 539 +#define CLK_UART4 540 +#define CLK_UART5 541 +#define CLK_UART6 542 +#define CLK_UART7 543 +#define MCLK_I2S0_2CH_SAI_SRC_PRE 544 +#define MCLK_I2S1_8CH_SAI_SRC_PRE 545 +#define MCLK_I2S2_2CH_SAI_SRC_PRE 546 +#define MCLK_I2S3_8CH_SAI_SRC_PRE 547 +#define MCLK_SDPDIF_SRC_PRE 548 +#define CLK_NR_CLKS (MCLK_SDPDIF_SRC_PRE + 1) + +/* grf-clocks indices */ +#define SCLK_SDMMC_DRV 1 +#define SCLK_SDMMC_SAMPLE 2 +#define SCLK_SDIO0_DRV 3 +#define SCLK_SDIO0_SAMPLE 4 +#define SCLK_SDIO1_DRV 5 +#define SCLK_SDIO1_SAMPLE 6 +#define CLK_NR_GRF_CLKS (SCLK_SDIO1_SAMPLE + 1) + +/* scmi-clocks indices */ +#define SCMI_PCLK_KEYREADER 0 +#define SCMI_HCLK_KLAD 1 +#define SCMI_PCLK_KLAD 2 +#define SCMI_HCLK_TRNG_S 3 +#define SCMI_HCLK_CRYPTO_S 4 +#define SCMI_PCLK_WDT_S 5 +#define SCMI_TCLK_WDT_S 6 +#define SCMI_PCLK_STIMER 7 +#define SCMI_CLK_STIMER0 8 +#define SCMI_CLK_STIMER1 9 +#define SCMI_PCLK_OTP_MASK 10 +#define SCMI_PCLK_OTPC_S 11 +#define SCMI_CLK_SBPI_OTPC_S 12 +#define SCMI_CLK_USER_OTPC_S 13 +#define SCMI_CLK_PMC_OTP 14 +#define SCMI_CLK_OTPC_ARB 15 +#define SCMI_CLK_CORE_TSP 16 +#define SCMI_ACLK_TSP 17 +#define SCMI_HCLK_TSP 18 +#define SCMI_PCLK_DCF 19 +#define SCMI_CLK_DDR 20 +#define SCMI_CLK_CPU 21 +#define SCMI_CLK_GPU 22 +#define SCMI_CORE_CRYPTO 23 +#define SCMI_ACLK_CRYPTO 24 +#define SCMI_PKA_CRYPTO 25 +#define SCMI_HCLK_CRYPTO 26 +#define SCMI_CORE_CRYPTO_S 27 +#define SCMI_ACLK_CRYPTO_S 28 +#define SCMI_PKA_CRYPTO_S 29 +#define SCMI_CORE_KLAD 30 +#define SCMI_ACLK_KLAD 31 +#define SCMI_HCLK_TRNG 32 + +// CRU_SOFTRST_CON03(Offset:0xA0C) +#define SRST_NCOREPORESET0 0x00000030 +#define SRST_NCOREPORESET1 0x00000031 +#define SRST_NCOREPORESET2 0x00000032 +#define SRST_NCOREPORESET3 0x00000033 +#define SRST_NCORESET0 0x00000034 +#define SRST_NCORESET1 0x00000035 +#define SRST_NCORESET2 0x00000036 +#define SRST_NCORESET3 0x00000037 +#define SRST_NL2RESET 0x00000038 +#define SRST_ARESETN_M_CORE_BIU 0x00000039 +#define SRST_RESETN_CORE_CRYPTO 0x0000003A + +// CRU_SOFTRST_CON05(Offset:0xA14) +#define SRST_PRESETN_DBG 0x0000005D +#define SRST_POTRESETN_DBG 0x0000005E +#define SRST_NTRESETN_DBG 0x0000005F + +// CRU_SOFTRST_CON06(Offset:0xA18) +#define SRST_PRESETN_CORE_GRF 0x00000062 +#define SRST_PRESETN_DAPLITE_BIU 0x00000063 +#define SRST_PRESETN_CPU_BIU 0x00000064 +#define SRST_RESETN_REF_PVTPLL_CORE 0x00000067 + +// CRU_SOFTRST_CON08(Offset:0xA20) +#define SRST_ARESETN_BUS_VOPGL_BIU 0x00000081 +#define SRST_ARESETN_BUS_H_BIU 0x00000083 +#define SRST_ARESETN_SYSMEM_BIU 0x00000088 +#define SRST_ARESETN_BUS_BIU 0x0000008A +#define SRST_HRESETN_BUS_BIU 0x0000008B +#define SRST_PRESETN_BUS_BIU 0x0000008C +#define SRST_PRESETN_DFT2APB 0x0000008D +#define SRST_PRESETN_BUS_GRF 0x0000008F + +// CRU_SOFTRST_CON09(Offset:0xA24) +#define SRST_ARESETN_BUS_M_BIU 0x00000090 +#define SRST_ARESETN_GIC 0x00000091 +#define SRST_ARESETN_SPINLOCK 0x00000092 +#define SRST_ARESETN_DMAC 0x00000094 +#define SRST_PRESETN_TIMER 0x00000095 +#define SRST_RESETN_TIMER0 0x00000096 +#define SRST_RESETN_TIMER1 0x00000097 +#define SRST_RESETN_TIMER2 0x00000098 +#define SRST_RESETN_TIMER3 0x00000099 +#define SRST_RESETN_TIMER4 0x0000009A +#define SRST_RESETN_TIMER5 0x0000009B +#define SRST_PRESETN_JDBCK_DAP 0x0000009C +#define SRST_RESETN_JDBCK_DAP 0x0000009D +#define SRST_PRESETN_WDT_NS 0x0000009F + +// CRU_SOFTRST_CON10(Offset:0xA28) +#define SRST_TRESETN_WDT_NS 0x000000A0 +#define SRST_HRESETN_TRNG_NS 0x000000A3 +#define SRST_PRESETN_UART0 0x000000A7 +#define SRST_SRESETN_UART0 0x000000A8 +#define SRST_RESETN_PKA_CRYPTO 0x000000AA +#define SRST_ARESETN_CRYPTO 0x000000AB +#define SRST_HRESETN_CRYPTO 0x000000AC +#define SRST_PRESETN_DMA2DDR 0x000000AD +#define SRST_ARESETN_DMA2DDR 0x000000AE + +// CRU_SOFTRST_CON11(Offset:0xA2C) +#define SRST_PRESETN_PWM0 0x000000B4 +#define SRST_RESETN_PWM0 0x000000B5 +#define SRST_PRESETN_PWM1 0x000000B7 +#define SRST_RESETN_PWM1 0x000000B8 +#define SRST_PRESETN_SCR 0x000000BA +#define SRST_ARESETN_DCF 0x000000BB +#define SRST_PRESETN_INTMUX 0x000000BC + +// CRU_SOFTRST_CON25(Offset:0xA64) +#define SRST_ARESETN_VPU_BIU 0x00000196 +#define SRST_HRESETN_VPU_BIU 0x00000197 +#define SRST_PRESETN_VPU_BIU 0x00000198 +#define SRST_ARESETN_VPU 0x00000199 +#define SRST_HRESETN_VPU 0x0000019A +#define SRST_PRESETN_CRU_PCIE 0x0000019B +#define SRST_PRESETN_VPU_GRF 0x0000019C +#define SRST_HRESETN_SFC 0x0000019D +#define SRST_SRESETN_SFC 0x0000019E +#define SRST_CRESETN_EMMC 0x0000019F + +// CRU_SOFTRST_CON26(Offset:0xA68) +#define SRST_HRESETN_EMMC 0x000001A0 +#define SRST_ARESETN_EMMC 0x000001A1 +#define SRST_BRESETN_EMMC 0x000001A2 +#define SRST_TRESETN_EMMC 0x000001A3 +#define SRST_PRESETN_GPIO1 0x000001A4 +#define SRST_DBRESETN_GPIO1 0x000001A5 +#define SRST_ARESETN_VPU_L_BIU 0x000001A6 +#define SRST_PRESETN_VPU_IOC 0x000001A8 +#define SRST_HRESETN_SAI_I2S0 0x000001A9 +#define SRST_MRESETN_SAI_I2S0 0x000001AA +#define SRST_HRESETN_SAI_I2S2 0x000001AB +#define SRST_MRESETN_SAI_I2S2 0x000001AC +#define SRST_PRESETN_ACODEC 0x000001AD + +// CRU_SOFTRST_CON27(Offset:0xA6C) +#define SRST_PRESETN_GPIO3 0x000001B0 +#define SRST_DBRESETN_GPIO3 0x000001B1 +#define SRST_PRESETN_SPI1 0x000001B4 +#define SRST_RESETN_SPI1 0x000001B5 +#define SRST_PRESETN_UART2 0x000001B7 +#define SRST_SRESETN_UART2 0x000001B8 +#define SRST_PRESETN_UART5 0x000001B9 +#define SRST_SRESETN_UART5 0x000001BA +#define SRST_PRESETN_UART6 0x000001BB +#define SRST_SRESETN_UART6 0x000001BC +#define SRST_PRESETN_UART7 0x000001BD +#define SRST_SRESETN_UART7 0x000001BE +#define SRST_PRESETN_I2C3 0x000001BF + +// CRU_SOFTRST_CON28(Offset:0xA70) +#define SRST_RESETN_I2C3 0x000001C0 +#define SRST_PRESETN_I2C5 0x000001C1 +#define SRST_RESETN_I2C5 0x000001C2 +#define SRST_PRESETN_I2C6 0x000001C3 +#define SRST_RESETN_I2C6 0x000001C4 +#define SRST_ARESETN_MAC 0x000001C5 + +// CRU_SOFTRST_CON30(Offset:0xA78) +#define SRST_PRESETN_PCIE 0x000001E1 +#define SRST_RESETN_PCIE_PIPE_PHY 0x000001E2 +#define SRST_RESETN_PCIE_POWER_UP 0x000001E3 +#define SRST_PRESETN_PCIE_PHY 0x000001E6 +#define SRST_PRESETN_PIPE_GRF 0x000001E7 + +// CRU_SOFTRST_CON32(Offset:0xA80) +#define SRST_HRESETN_SDIO0 0x00000202 +#define SRST_HRESETN_SDIO1 0x00000204 +#define SRST_RESETN_TS_0 0x00000205 +#define SRST_RESETN_TS_1 0x00000206 +#define SRST_PRESETN_CAN2 0x00000207 +#define SRST_RESETN_CAN2 0x00000208 +#define SRST_PRESETN_CAN3 0x00000209 +#define SRST_RESETN_CAN3 0x0000020A +#define SRST_PRESETN_SARADC 0x0000020B +#define SRST_RESETN_SARADC 0x0000020C +#define SRST_RESETN_SARADC_PHY 0x0000020D +#define SRST_PRESETN_TSADC 0x0000020E +#define SRST_RESETN_TSADC 0x0000020F + +// CRU_SOFTRST_CON33(Offset:0xA84) +#define SRST_ARESETN_USB3OTG 0x00000211 + +// CRU_SOFTRST_CON34(Offset:0xA88) +#define SRST_ARESETN_GPU_BIU 0x00000223 +#define SRST_PRESETN_GPU_BIU 0x00000225 +#define SRST_ARESETN_GPU 0x00000228 +#define SRST_RESETN_REF_PVTPLL_GPU 0x00000229 + +// CRU_SOFTRST_CON36(Offset:0xA90) +#define SRST_HRESETN_RKVENC_BIU 0x00000243 +#define SRST_ARESETN_RKVENC_BIU 0x00000244 +#define SRST_PRESETN_RKVENC_BIU 0x00000245 +#define SRST_HRESETN_RKVENC 0x00000246 +#define SRST_ARESETN_RKVENC 0x00000247 +#define SRST_RESETN_CORE_RKVENC 0x00000248 +#define SRST_HRESETN_SAI_I2S1 0x00000249 +#define SRST_MRESETN_SAI_I2S1 0x0000024A +#define SRST_PRESETN_I2C1 0x0000024B +#define SRST_RESETN_I2C1 0x0000024C +#define SRST_PRESETN_I2C0 0x0000024D +#define SRST_RESETN_I2C0 0x0000024E + +// CRU_SOFTRST_CON37(Offset:0xA94) +#define SRST_PRESETN_SPI0 0x00000252 +#define SRST_RESETN_SPI0 0x00000253 +#define SRST_PRESETN_GPIO4 0x00000258 +#define SRST_DBRESETN_GPIO4 0x00000259 +#define SRST_PRESETN_RKVENC_IOC 0x0000025A +#define SRST_HRESETN_SPDIF 0x0000025E +#define SRST_MRESETN_SPDIF 0x0000025F + +// CRU_SOFTRST_CON38(Offset:0xA98) +#define SRST_HRESETN_PDM 0x00000260 +#define SRST_MRESETN_PDM 0x00000261 +#define SRST_PRESETN_UART1 0x00000262 +#define SRST_SRESETN_UART1 0x00000263 +#define SRST_PRESETN_UART3 0x00000264 +#define SRST_SRESETN_UART3 0x00000265 +#define SRST_PRESETN_RKVENC_GRF 0x00000266 +#define SRST_PRESETN_CAN0 0x00000267 +#define SRST_RESETN_CAN0 0x00000268 +#define SRST_PRESETN_CAN1 0x00000269 +#define SRST_RESETN_CAN1 0x0000026A + +// CRU_SOFTRST_CON39(Offset:0xA9C) +#define SRST_ARESETN_VO_BIU 0x00000273 +#define SRST_HRESETN_VO_BIU 0x00000274 +#define SRST_PRESETN_VO_BIU 0x00000275 +#define SRST_HRESETN_RGA2E 0x00000277 +#define SRST_ARESETN_RGA2E 0x00000278 +#define SRST_RESETN_CORE_RGA2E 0x00000279 +#define SRST_HRESETN_VDPP 0x0000027A +#define SRST_ARESETN_VDPP 0x0000027B +#define SRST_RESETN_CORE_VDPP 0x0000027C +#define SRST_PRESETN_VO_GRF 0x0000027D +#define SRST_PRESETN_CRU 0x0000027F + +// CRU_SOFTRST_CON40(Offset:0xAA0) +#define SRST_ARESETN_VOP_BIU 0x00000281 +#define SRST_HRESETN_VOP 0x00000282 +#define SRST_DRESETN_VOP0 0x00000283 +#define SRST_DRESETN_VOP1 0x00000284 +#define SRST_ARESETN_VOP 0x00000285 +#define SRST_PRESETN_HDMI 0x00000286 +#define SRST_HDMI_RESETN 0x00000287 +#define SRST_PRESETN_HDMIPHY 0x0000028E +#define SRST_HRESETN_HDCP_KEY 0x0000028F + +// CRU_SOFTRST_CON41(Offset:0xAA4) +#define SRST_ARESETN_HDCP 0x00000290 +#define SRST_HRESETN_HDCP 0x00000291 +#define SRST_PRESETN_HDCP 0x00000292 +#define SRST_HRESETN_CVBS 0x00000293 +#define SRST_DRESETN_CVBS_VOP 0x00000294 +#define SRST_DRESETN_4X_CVBS_VOP 0x00000295 +#define SRST_ARESETN_JPEG_DECODER 0x00000296 +#define SRST_HRESETN_JPEG_DECODER 0x00000297 +#define SRST_ARESETN_VO_L_BIU 0x00000299 +#define SRST_ARESETN_MAC_VO 0x0000029A + +// CRU_SOFTRST_CON42(Offset:0xAA8) +#define SRST_ARESETN_JPEG_BIU 0x000002A0 +#define SRST_HRESETN_SAI_I2S3 0x000002A1 +#define SRST_MRESETN_SAI_I2S3 0x000002A2 +#define SRST_RESETN_MACPHY 0x000002A3 +#define SRST_PRESETN_VCDCPHY 0x000002A4 +#define SRST_PRESETN_GPIO2 0x000002A5 +#define SRST_DBRESETN_GPIO2 0x000002A6 +#define SRST_PRESETN_VO_IOC 0x000002A7 +#define SRST_HRESETN_SDMMC0 0x000002A9 +#define SRST_PRESETN_OTPC_NS 0x000002AB +#define SRST_RESETN_SBPI_OTPC_NS 0x000002AC +#define SRST_RESETN_USER_OTPC_NS 0x000002AD + +// CRU_SOFTRST_CON43(Offset:0xAAC) +#define SRST_RESETN_HDMIHDP0 0x000002B2 +#define SRST_HRESETN_USBHOST 0x000002B3 +#define SRST_HRESETN_USBHOST_ARB 0x000002B4 +#define SRST_RESETN_HOST_UTMI 0x000002B6 +#define SRST_PRESETN_UART4 0x000002B7 +#define SRST_SRESETN_UART4 0x000002B8 +#define SRST_PRESETN_I2C4 0x000002B9 +#define SRST_RESETN_I2C4 0x000002BA +#define SRST_PRESETN_I2C7 0x000002BB +#define SRST_RESETN_I2C7 0x000002BC +#define SRST_PRESETN_USBPHY 0x000002BD +#define SRST_RESETN_USBPHY_POR 0x000002BE +#define SRST_RESETN_USBPHY_OTG 0x000002BF + +// CRU_SOFTRST_CON44(Offset:0xAB0) +#define SRST_RESETN_USBPHY_HOST 0x000002C0 +#define SRST_PRESETN_DDRPHY_CRU 0x000002C4 +#define SRST_HRESETN_RKVDEC_BIU 0x000002C6 +#define SRST_ARESETN_RKVDEC_BIU 0x000002C7 +#define SRST_ARESETN_RKVDEC 0x000002C8 +#define SRST_HRESETN_RKVDEC 0x000002C9 +#define SRST_RESETN_HEVC_CA_RKVDEC 0x000002CB +#define SRST_RESETN_REF_PVTPLL_RKVDEC 0x000002CC + +// CRU_SOFTRST_CON45(Offset:0xAB4) +#define SRST_PRESETN_DDR_BIU 0x000002D1 +#define SRST_PRESETN_DDRC 0x000002D2 +#define SRST_PRESETN_DDRMON 0x000002D3 +#define SRST_RESETN_TIMER_DDRMON 0x000002D4 +#define SRST_PRESETN_MSCH_BIU 0x000002D5 +#define SRST_PRESETN_DDR_GRF 0x000002D6 +#define SRST_PRESETN_DDR_HWLP 0x000002D8 +#define SRST_PRESETN_DDRPHY 0x000002D9 +#define SRST_RESETN_MSCH_BIU 0x000002DA +#define SRST_ARESETN_DDR_UPCTL 0x000002DB +#define SRST_RESETN_DDR_UPCTL 0x000002DC +#define SRST_RESETN_DDRMON 0x000002DD +#define SRST_ARESETN_DDR_SCRAMBLE 0x000002DE +#define SRST_ARESETN_SPLIT 0x000002DF + +// CRU_SOFTRST_CON46(Offset:0xAB8) +#define SRST_RESETN_DDR_PHY 0x000002E0 + +#endif + diff --git a/u-boot/include/dt-bindings/clock/rk3562-cru.h b/u-boot/include/dt-bindings/clock/rk3562-cru.h new file mode 100644 index 0000000..3bdbed5 --- /dev/null +++ b/u-boot/include/dt-bindings/clock/rk3562-cru.h @@ -0,0 +1,733 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +/* + * Copyright (c) 2022 Rockchip Electronics Co. Ltd. + * Author: Finley Xiao <finley.xiao@rock-chips.com> + */ + +#ifndef _DT_BINDINGS_CLK_ROCKCHIP_RK3562_H +#define _DT_BINDINGS_CLK_ROCKCHIP_RK3562_H + +/* cru-clocks indices */ + +/* cru plls */ +#define PLL_APLL 1 +#define PLL_GPLL 2 +#define PLL_VPLL 3 +#define PLL_HPLL 4 +#define PLL_CPLL 5 +#define PLL_DPLL 6 + +/* cru clocks */ +#define ARMCLK 8 +#define CLK_GPU 9 +#define ACLK_RKNN 10 +#define CLK_DDR 11 +#define CLK_MATRIX_50M_SRC 12 +#define CLK_MATRIX_100M_SRC 13 +#define CLK_MATRIX_125M_SRC 14 +#define CLK_MATRIX_200M_SRC 15 +#define CLK_MATRIX_300M_SRC 16 +#define ACLK_TOP 17 +#define ACLK_TOP_VIO 18 +#define CLK_CAM0_OUT2IO 19 +#define CLK_CAM1_OUT2IO 20 +#define CLK_CAM2_OUT2IO 21 +#define CLK_CAM3_OUT2IO 22 +#define ACLK_BUS 23 +#define HCLK_BUS 24 +#define PCLK_BUS 25 +#define PCLK_I2C1 26 +#define PCLK_I2C2 27 +#define PCLK_I2C3 28 +#define PCLK_I2C4 29 +#define PCLK_I2C5 30 +#define CLK_I2C 31 +#define CLK_I2C1 32 +#define CLK_I2C2 33 +#define CLK_I2C3 34 +#define CLK_I2C4 35 +#define CLK_I2C5 36 +#define DCLK_BUS_GPIO 37 +#define DCLK_BUS_GPIO3 38 +#define DCLK_BUS_GPIO4 39 +#define PCLK_TIMER 40 +#define CLK_TIMER0 41 +#define CLK_TIMER1 42 +#define CLK_TIMER2 43 +#define CLK_TIMER3 44 +#define CLK_TIMER4 45 +#define CLK_TIMER5 46 +#define PCLK_STIMER 47 +#define CLK_STIMER0 48 +#define CLK_STIMER1 49 +#define PCLK_WDTNS 50 +#define CLK_WDTNS 51 +#define PCLK_GRF 52 +#define PCLK_SGRF 53 +#define PCLK_MAILBOX 54 +#define PCLK_INTC 55 +#define ACLK_BUS_GIC400 56 +#define ACLK_BUS_SPINLOCK 57 +#define ACLK_DCF 58 +#define PCLK_DCF 59 +#define FCLK_BUS_CM0_CORE 60 +#define CLK_BUS_CM0_RTC 61 +#define HCLK_ICACHE 62 +#define HCLK_DCACHE 63 +#define PCLK_TSADC 64 +#define CLK_TSADC 65 +#define CLK_TSADC_TSEN 66 +#define PCLK_DFT2APB 67 +#define CLK_SARADC_VCCIO156 68 +#define PCLK_GMAC 69 +#define ACLK_GMAC 70 +#define CLK_GMAC_125M_CRU_I 71 +#define CLK_GMAC_50M_CRU_I 72 +#define CLK_GMAC_50M_O 73 +#define CLK_GMAC_ETH_OUT2IO 74 +#define PCLK_APB2ASB_VCCIO156 75 +#define PCLK_TO_VCCIO156 76 +#define PCLK_DSIPHY 77 +#define PCLK_DSITX 78 +#define PCLK_CPU_EMA_DET 79 +#define PCLK_HASH 80 +#define PCLK_TOPCRU 81 +#define PCLK_ASB2APB_VCCIO156 82 +#define PCLK_IOC_VCCIO156 83 +#define PCLK_GPIO3_VCCIO156 84 +#define PCLK_GPIO4_VCCIO156 85 +#define PCLK_SARADC_VCCIO156 86 +#define PCLK_MAC100 87 +#define ACLK_MAC100 89 +#define CLK_MAC100_50M_MATRIX 90 +#define HCLK_CORE 91 +#define PCLK_DDR 92 +#define CLK_MSCH_BRG_BIU 93 +#define PCLK_DDR_HWLP 94 +#define PCLK_DDR_UPCTL 95 +#define PCLK_DDR_PHY 96 +#define PCLK_DDR_DFICTL 97 +#define PCLK_DDR_DMA2DDR 98 +#define PCLK_DDR_MON 99 +#define TMCLK_DDR_MON 100 +#define PCLK_DDR_GRF 101 +#define PCLK_DDR_CRU 102 +#define PCLK_SUBDDR_CRU 103 +#define CLK_GPU_PRE 104 +#define ACLK_GPU_PRE 105 +#define CLK_GPU_BRG 107 +#define CLK_NPU_PRE 108 +#define HCLK_NPU_PRE 109 +#define HCLK_RKNN 111 +#define ACLK_PERI 112 +#define HCLK_PERI 113 +#define PCLK_PERI 114 +#define PCLK_PERICRU 115 +#define HCLK_SAI0 116 +#define CLK_SAI0_SRC 117 +#define CLK_SAI0_FRAC 118 +#define CLK_SAI0 119 +#define MCLK_SAI0 120 +#define MCLK_SAI0_OUT2IO 121 +#define HCLK_SAI1 122 +#define CLK_SAI1_SRC 123 +#define CLK_SAI1_FRAC 124 +#define CLK_SAI1 125 +#define MCLK_SAI1 126 +#define MCLK_SAI1_OUT2IO 127 +#define HCLK_SAI2 128 +#define CLK_SAI2_SRC 129 +#define CLK_SAI2_FRAC 130 +#define CLK_SAI2 131 +#define MCLK_SAI2 132 +#define MCLK_SAI2_OUT2IO 133 +#define HCLK_DSM 134 +#define CLK_DSM 135 +#define HCLK_PDM 136 +#define MCLK_PDM 137 +#define HCLK_SPDIF 138 +#define CLK_SPDIF_SRC 139 +#define CLK_SPDIF_FRAC 140 +#define CLK_SPDIF 141 +#define MCLK_SPDIF 142 +#define HCLK_SDMMC0 143 +#define CCLK_SDMMC0 144 +#define HCLK_SDMMC1 145 +#define CCLK_SDMMC1 146 +#define SCLK_SDMMC0_DRV 147 +#define SCLK_SDMMC0_SAMPLE 148 +#define SCLK_SDMMC1_DRV 149 +#define SCLK_SDMMC1_SAMPLE 150 +#define HCLK_EMMC 151 +#define ACLK_EMMC 152 +#define CCLK_EMMC 153 +#define BCLK_EMMC 154 +#define TMCLK_EMMC 155 +#define SCLK_SFC 156 +#define HCLK_SFC 157 +#define HCLK_USB2HOST 158 +#define HCLK_USB2HOST_ARB 159 +#define PCLK_SPI1 160 +#define CLK_SPI1 161 +#define SCLK_IN_SPI1 162 +#define PCLK_SPI2 163 +#define CLK_SPI2 164 +#define SCLK_IN_SPI2 165 +#define PCLK_UART1 166 +#define PCLK_UART2 167 +#define PCLK_UART3 168 +#define PCLK_UART4 169 +#define PCLK_UART5 170 +#define PCLK_UART6 171 +#define PCLK_UART7 172 +#define PCLK_UART8 173 +#define PCLK_UART9 174 +#define CLK_UART1_SRC 175 +#define CLK_UART1_FRAC 176 +#define CLK_UART1 177 +#define SCLK_UART1 178 +#define CLK_UART2_SRC 179 +#define CLK_UART2_FRAC 180 +#define CLK_UART2 181 +#define SCLK_UART2 182 +#define CLK_UART3_SRC 183 +#define CLK_UART3_FRAC 184 +#define CLK_UART3 185 +#define SCLK_UART3 186 +#define CLK_UART4_SRC 187 +#define CLK_UART4_FRAC 188 +#define CLK_UART4 189 +#define SCLK_UART4 190 +#define CLK_UART5_SRC 191 +#define CLK_UART5_FRAC 192 +#define CLK_UART5 193 +#define SCLK_UART5 194 +#define CLK_UART6_SRC 195 +#define CLK_UART6_FRAC 196 +#define CLK_UART6 197 +#define SCLK_UART6 198 +#define CLK_UART7_SRC 199 +#define CLK_UART7_FRAC 200 +#define CLK_UART7 201 +#define SCLK_UART7 202 +#define CLK_UART8_SRC 203 +#define CLK_UART8_FRAC 204 +#define CLK_UART8 205 +#define SCLK_UART8 206 +#define CLK_UART9_SRC 207 +#define CLK_UART9_FRAC 208 +#define CLK_UART9 209 +#define SCLK_UART9 210 +#define PCLK_PWM1_PERI 211 +#define CLK_PWM1_PERI 212 +#define CLK_CAPTURE_PWM1_PERI 213 +#define PCLK_PWM2_PERI 214 +#define CLK_PWM2_PERI 215 +#define CLK_CAPTURE_PWM2_PERI 216 +#define PCLK_PWM3_PERI 217 +#define CLK_PWM3_PERI 218 +#define CLK_CAPTURE_PWM3_PERI 219 +#define PCLK_CAN0 220 +#define CLK_CAN0 221 +#define PCLK_CAN1 222 +#define CLK_CAN1 223 +#define ACLK_CRYPTO 224 +#define HCLK_CRYPTO 225 +#define PCLK_CRYPTO 226 +#define CLK_CORE_CRYPTO 227 +#define CLK_PKA_CRYPTO 228 +#define HCLK_KLAD 229 +#define PCLK_KEY_READER 230 +#define HCLK_RK_RNG_NS 231 +#define HCLK_RK_RNG_S 232 +#define HCLK_TRNG_NS 233 +#define HCLK_TRNG_S 234 +#define HCLK_CRYPTO_S 235 +#define PCLK_PERI_WDT 236 +#define TCLK_PERI_WDT 237 +#define ACLK_SYSMEM 238 +#define HCLK_BOOTROM 239 +#define PCLK_PERI_GRF 240 +#define ACLK_DMAC 241 +#define ACLK_RKDMAC 242 +#define PCLK_OTPC_NS 243 +#define CLK_SBPI_OTPC_NS 244 +#define CLK_USER_OTPC_NS 245 +#define PCLK_OTPC_S 246 +#define CLK_SBPI_OTPC_S 247 +#define CLK_USER_OTPC_S 248 +#define CLK_OTPC_ARB 249 +#define PCLK_OTPPHY 250 +#define PCLK_USB2PHY 251 +#define PCLK_PIPEPHY 252 +#define PCLK_SARADC 253 +#define CLK_SARADC 254 +#define PCLK_IOC_VCCIO234 255 +#define PCLK_PERI_GPIO1 256 +#define PCLK_PERI_GPIO2 257 +#define DCLK_PERI_GPIO 258 +#define DCLK_PERI_GPIO1 259 +#define DCLK_PERI_GPIO2 260 +#define ACLK_PHP 261 +#define PCLK_PHP 262 +#define ACLK_PCIE20_MST 263 +#define ACLK_PCIE20_SLV 264 +#define ACLK_PCIE20_DBI 265 +#define PCLK_PCIE20 266 +#define CLK_PCIE20_AUX 267 +#define ACLK_USB3OTG 268 +#define CLK_USB3OTG_SUSPEND 269 +#define CLK_USB3OTG_REF 270 +#define CLK_PIPEPHY_REF_FUNC 271 +#define CLK_200M_PMU 272 +#define CLK_RTC_32K 273 +#define CLK_RTC32K_FRAC 274 +#define BUSCLK_PDPMU0 275 +#define PCLK_PMU0_CRU 276 +#define PCLK_PMU0_PMU 277 +#define CLK_PMU0_PMU 278 +#define PCLK_PMU0_HP_TIMER 279 +#define CLK_PMU0_HP_TIMER 280 +#define CLK_PMU0_32K_HP_TIMER 281 +#define PCLK_PMU0_PVTM 282 +#define CLK_PMU0_PVTM 283 +#define PCLK_IOC_PMUIO 284 +#define PCLK_PMU0_GPIO0 285 +#define DBCLK_PMU0_GPIO0 286 +#define PCLK_PMU0_GRF 287 +#define PCLK_PMU0_SGRF 288 +#define CLK_DDR_FAIL_SAFE 289 +#define PCLK_PMU0_SCRKEYGEN 290 +#define PCLK_PMU1_CRU 291 +#define HCLK_PMU1_MEM 292 +#define PCLK_PMU0_I2C0 293 +#define CLK_PMU0_I2C0 294 +#define PCLK_PMU1_UART0 295 +#define CLK_PMU1_UART0_SRC 296 +#define CLK_PMU1_UART0_FRAC 297 +#define CLK_PMU1_UART0 298 +#define SCLK_PMU1_UART0 299 +#define PCLK_PMU1_SPI0 300 +#define CLK_PMU1_SPI0 301 +#define SCLK_IN_PMU1_SPI0 302 +#define PCLK_PMU1_PWM0 303 +#define CLK_PMU1_PWM0 304 +#define CLK_CAPTURE_PMU1_PWM0 305 +#define CLK_PMU1_WIFI 306 +#define FCLK_PMU1_CM0_CORE 307 +#define CLK_PMU1_CM0_RTC 308 +#define PCLK_PMU1_WDTNS 309 +#define CLK_PMU1_WDTNS 310 +#define PCLK_PMU1_MAILBOX 311 +#define CLK_PIPEPHY_DIV 312 +#define CLK_PIPEPHY_XIN24M 313 +#define CLK_PIPEPHY_REF 314 +#define CLK_24M_SSCSRC 315 +#define CLK_USB2PHY_XIN24M 316 +#define CLK_USB2PHY_REF 317 +#define CLK_MIPIDSIPHY_XIN24M 318 +#define CLK_MIPIDSIPHY_REF 319 +#define ACLK_RGA_PRE 320 +#define HCLK_RGA_PRE 321 +#define ACLK_RGA 322 +#define HCLK_RGA 323 +#define CLK_RGA_CORE 324 +#define ACLK_JDEC 325 +#define HCLK_JDEC 326 +#define ACLK_VDPU_PRE 327 +#define CLK_RKVDEC_HEVC_CA 328 +#define HCLK_VDPU_PRE 329 +#define ACLK_RKVDEC 330 +#define HCLK_RKVDEC 331 +#define CLK_RKVENC_CORE 332 +#define ACLK_VEPU_PRE 333 +#define HCLK_VEPU_PRE 334 +#define ACLK_RKVENC 335 +#define HCLK_RKVENC 336 +#define ACLK_VI 337 +#define HCLK_VI 338 +#define PCLK_VI 339 +#define ACLK_ISP 340 +#define HCLK_ISP 341 +#define CLK_ISP 342 +#define ACLK_VICAP 343 +#define HCLK_VICAP 344 +#define DCLK_VICAP 345 +#define CSIRX0_CLK_DATA 346 +#define CSIRX1_CLK_DATA 347 +#define CSIRX2_CLK_DATA 348 +#define CSIRX3_CLK_DATA 349 +#define PCLK_CSIHOST0 350 +#define PCLK_CSIHOST1 351 +#define PCLK_CSIHOST2 352 +#define PCLK_CSIHOST3 353 +#define PCLK_CSIPHY0 354 +#define PCLK_CSIPHY1 355 +#define ACLK_VO_PRE 356 +#define HCLK_VO_PRE 357 +#define ACLK_VOP 358 +#define HCLK_VOP 359 +#define DCLK_VOP 360 +#define DCLK_VOP1 361 +#define ACLK_CRYPTO_S 362 +#define PCLK_CRYPTO_S 363 +#define CLK_CORE_CRYPTO_S 364 +#define CLK_PKA_CRYPTO_S 365 + +#define CLK_NR_CLKS (CLK_PKA_CRYPTO_S + 1) + +/* soft-reset indices */ + +/********Name=SOFTRST_CON01,Offset=0x404********/ +#define SRST_A_TOP_BIU 16 +#define SRST_A_TOP_VIO_BIU 17 +#define SRST_REF_PVTPLL_LOGIC 18 +/********Name=SOFTRST_CON03,Offset=0x40C********/ +#define SRST_NCOREPORESET0 48 +#define SRST_NCOREPORESET1 49 +#define SRST_NCOREPORESET2 50 +#define SRST_NCOREPORESET3 51 +#define SRST_NCORESET0 52 +#define SRST_NCORESET1 53 +#define SRST_NCORESET2 54 +#define SRST_NCORESET3 55 +#define SRST_NL2RESET 56 +/********Name=SOFTRST_CON04,Offset=0x410********/ +#define SRST_DAP 73 +#define SRST_P_DBG_DAPLITE 74 +#define SRST_REF_PVTPLL_CORE 77 +/********Name=SOFTRST_CON05,Offset=0x414********/ +#define SRST_A_CORE_BIU 80 +#define SRST_P_CORE_BIU 81 +#define SRST_H_CORE_BIU 82 +/********Name=SOFTRST_CON06,Offset=0x418********/ +#define SRST_A_NPU_BIU 98 +#define SRST_H_NPU_BIU 99 +#define SRST_A_RKNN 100 +#define SRST_H_RKNN 101 +#define SRST_REF_PVTPLL_NPU 102 +/********Name=SOFTRST_CON08,Offset=0x420********/ +#define SRST_A_GPU_BIU 131 +#define SRST_GPU 132 +#define SRST_REF_PVTPLL_GPU 133 +#define SRST_GPU_BRG_BIU 134 +/********Name=SOFTRST_CON09,Offset=0x424********/ +#define SRST_RKVENC_CORE 144 +#define SRST_A_VEPU_BIU 147 +#define SRST_H_VEPU_BIU 148 +#define SRST_A_RKVENC 149 +#define SRST_H_RKVENC 150 +/********Name=SOFTRST_CON10,Offset=0x428********/ +#define SRST_RKVDEC_HEVC_CA 162 +#define SRST_A_VDPU_BIU 165 +#define SRST_H_VDPU_BIU 166 +#define SRST_A_RKVDEC 167 +#define SRST_H_RKVDEC 168 +/********Name=SOFTRST_CON11,Offset=0x42C********/ +#define SRST_A_VI_BIU 179 +#define SRST_H_VI_BIU 180 +#define SRST_P_VI_BIU 181 +#define SRST_ISP 184 +#define SRST_A_VICAP 185 +#define SRST_H_VICAP 186 +#define SRST_D_VICAP 187 +#define SRST_I0_VICAP 188 +#define SRST_I1_VICAP 189 +#define SRST_I2_VICAP 190 +#define SRST_I3_VICAP 191 +/********Name=SOFTRST_CON12,Offset=0x430********/ +#define SRST_P_CSIHOST0 192 +#define SRST_P_CSIHOST1 193 +#define SRST_P_CSIHOST2 194 +#define SRST_P_CSIHOST3 195 +#define SRST_P_CSIPHY0 196 +#define SRST_P_CSIPHY1 197 +/********Name=SOFTRST_CON13,Offset=0x434********/ +#define SRST_A_VO_BIU 211 +#define SRST_H_VO_BIU 212 +#define SRST_A_VOP 214 +#define SRST_H_VOP 215 +#define SRST_D_VOP 216 +#define SRST_D_VOP1 217 +/********Name=SOFTRST_CON14,Offset=0x438********/ +#define SRST_A_RGA_BIU 227 +#define SRST_H_RGA_BIU 228 +#define SRST_A_RGA 230 +#define SRST_H_RGA 231 +#define SRST_RGA_CORE 232 +#define SRST_A_JDEC 233 +#define SRST_H_JDEC 234 +/********Name=SOFTRST_CON15,Offset=0x43C********/ +#define SRST_B_EBK_BIU 242 +#define SRST_P_EBK_BIU 243 +#define SRST_AHB2AXI_EBC 244 +#define SRST_H_EBC 245 +#define SRST_D_EBC 246 +#define SRST_H_EINK 247 +#define SRST_P_EINK 248 +/********Name=SOFTRST_CON16,Offset=0x440********/ +#define SRST_P_PHP_BIU 258 +#define SRST_A_PHP_BIU 259 +#define SRST_P_PCIE20 263 +#define SRST_PCIE20_POWERUP 264 +#define SRST_USB3OTG 266 +/********Name=SOFTRST_CON17,Offset=0x444********/ +#define SRST_PIPEPHY 275 +/********Name=SOFTRST_CON18,Offset=0x448********/ +#define SRST_A_BUS_BIU 291 +#define SRST_H_BUS_BIU 292 +#define SRST_P_BUS_BIU 293 +/********Name=SOFTRST_CON19,Offset=0x44C********/ +#define SRST_P_I2C1 304 +#define SRST_P_I2C2 305 +#define SRST_P_I2C3 306 +#define SRST_P_I2C4 307 +#define SRST_P_I2C5 308 +#define SRST_I2C1 310 +#define SRST_I2C2 311 +#define SRST_I2C3 312 +#define SRST_I2C4 313 +#define SRST_I2C5 314 +/********Name=SOFTRST_CON20,Offset=0x450********/ +#define SRST_BUS_GPIO3 325 +#define SRST_BUS_GPIO4 326 +/********Name=SOFTRST_CON21,Offset=0x454********/ +#define SRST_P_TIMER 336 +#define SRST_TIMER0 337 +#define SRST_TIMER1 338 +#define SRST_TIMER2 339 +#define SRST_TIMER3 340 +#define SRST_TIMER4 341 +#define SRST_TIMER5 342 +#define SRST_P_STIMER 343 +#define SRST_STIMER0 344 +#define SRST_STIMER1 345 +/********Name=SOFTRST_CON22,Offset=0x458********/ +#define SRST_P_WDTNS 352 +#define SRST_WDTNS 353 +#define SRST_P_GRF 354 +#define SRST_P_SGRF 355 +#define SRST_P_MAILBOX 356 +#define SRST_P_INTC 357 +#define SRST_A_BUS_GIC400 358 +#define SRST_A_BUS_GIC400_DEBUG 359 +/********Name=SOFTRST_CON23,Offset=0x45C********/ +#define SRST_A_BUS_SPINLOCK 368 +#define SRST_A_DCF 369 +#define SRST_P_DCF 370 +#define SRST_F_BUS_CM0_CORE 371 +#define SRST_T_BUS_CM0_JTAG 373 +#define SRST_H_ICACHE 376 +#define SRST_H_DCACHE 377 +/********Name=SOFTRST_CON24,Offset=0x460********/ +#define SRST_P_TSADC 384 +#define SRST_TSADC 385 +#define SRST_TSADCPHY 386 +#define SRST_P_DFT2APB 388 +/********Name=SOFTRST_CON25,Offset=0x464********/ +#define SRST_A_GMAC 401 +#define SRST_P_APB2ASB_VCCIO156 405 +#define SRST_P_DSIPHY 408 +#define SRST_P_DSITX 409 +#define SRST_P_CPU_EMA_DET 410 +#define SRST_P_HASH 411 +#define SRST_P_TOPCRU 415 +/********Name=SOFTRST_CON26,Offset=0x468********/ +#define SRST_P_ASB2APB_VCCIO156 416 +#define SRST_P_IOC_VCCIO156 417 +#define SRST_P_GPIO3_VCCIO156 418 +#define SRST_P_GPIO4_VCCIO156 419 +#define SRST_P_SARADC_VCCIO156 420 +#define SRST_SARADC_VCCIO156 421 +#define SRST_SARADC_VCCIO156_PHY 422 +/********Name=SOFTRST_CON27,Offset=0x46c********/ +#define SRST_A_MAC100 433 + +/* (0x10200 - 0x400) / 4 * 16 = 260096 */ +/********Name=PMU0SOFTRST_CON00,Offset=0x10200********/ +#define SRST_P_PMU0_CRU 260096 +#define SRST_P_PMU0_PMU 260097 +#define SRST_PMU0_PMU 260098 +#define SRST_P_PMU0_HP_TIMER 260099 +#define SRST_PMU0_HP_TIMER 260100 +#define SRST_PMU0_32K_HP_TIMER 260101 +#define SRST_P_PMU0_PVTM 260102 +#define SRST_PMU0_PVTM 260103 +#define SRST_P_IOC_PMUIO 260104 +#define SRST_P_PMU0_GPIO0 260105 +#define SRST_PMU0_GPIO0 260106 +#define SRST_P_PMU0_GRF 260107 +#define SRST_P_PMU0_SGRF 260108 +/********Name=PMU0SOFTRST_CON01,Offset=0x10204********/ +#define SRST_DDR_FAIL_SAFE 260112 +#define SRST_P_PMU0_SCRKEYGEN 260113 +/********Name=PMU0SOFTRST_CON02,Offset=0x10208********/ +#define SRST_P_PMU0_I2C0 260136 +#define SRST_PMU0_I2C0 260137 + +/* (0x18200 - 0x400) / 4 * 16 = 391168 */ +/********Name=PMU1SOFTRST_CON00,Offset=0x18200********/ +#define SRST_P_PMU1_CRU 391168 +#define SRST_H_PMU1_MEM 391170 +#define SRST_H_PMU1_BIU 391171 +#define SRST_P_PMU1_BIU 391172 +#define SRST_P_PMU1_UART0 391175 +#define SRST_S_PMU1_UART0 391178 +/********Name=PMU1SOFTRST_CON01,Offset=0x18204********/ +#define SRST_P_PMU1_SPI0 391184 +#define SRST_PMU1_SPI0 391185 +#define SRST_P_PMU1_PWM0 391187 +#define SRST_PMU1_PWM0 391188 +/********Name=PMU1SOFTRST_CON02,Offset=0x18208********/ +#define SRST_F_PMU1_CM0_CORE 391200 +#define SRST_T_PMU1_CM0_JTAG 391202 +#define SRST_P_PMU1_WDTNS 391203 +#define SRST_PMU1_WDTNS 391204 +#define SRST_PMU1_MAILBOX 391208 + +/* (0x20200 - 0x400) / 4 * 16 = 522240 */ +/********Name=DDRSOFTRST_CON00,Offset=0x20200********/ +#define SRST_MSCH_BRG_BIU 522244 +#define SRST_P_MSCH_BIU 522245 +#define SRST_P_DDR_HWLP 522246 +#define SRST_P_DDR_PHY 522248 +#define SRST_P_DDR_DFICTL 522249 +#define SRST_P_DDR_DMA2DDR 522250 +/********Name=DDRSOFTRST_CON01,Offset=0x20204********/ +#define SRST_P_DDR_MON 522256 +#define SRST_TM_DDR_MON 522257 +#define SRST_P_DDR_GRF 522258 +#define SRST_P_DDR_CRU 522259 +#define SRST_P_SUBDDR_CRU 522260 + +/* (0x28200 - 0x400) / 4 * 16 = 653312 */ +/********Name=SUBDDRSOFTRST_CON00,Offset=0x28200********/ +#define SRST_MSCH_BIU 653313 +#define SRST_DDR_PHY 653316 +#define SRST_DDR_DFICTL 653317 +#define SRST_DDR_SCRAMBLE 653318 +#define SRST_DDR_MON 653319 +#define SRST_A_DDR_SPLIT 653320 +#define SRST_DDR_DMA2DDR 653321 + +/* (0x30400 - 0x400) / 4 * 16 = 786432 */ +/********Name=PERISOFTRST_CON01,Offset=0x30404********/ +#define SRST_A_PERI_BIU 786451 +#define SRST_H_PERI_BIU 786452 +#define SRST_P_PERI_BIU 786453 +#define SRST_P_PERICRU 786454 +/********Name=PERISOFTRST_CON02,Offset=0x30408********/ +#define SRST_H_SAI0_8CH 786464 +#define SRST_M_SAI0_8CH 786467 +#define SRST_H_SAI1_8CH 786469 +#define SRST_M_SAI1_8CH 786472 +#define SRST_H_SAI2_2CH 786474 +#define SRST_M_SAI2_2CH 786477 +/********Name=PERISOFTRST_CON03,Offset=0x3040C********/ +#define SRST_H_DSM 786481 +#define SRST_DSM 786482 +#define SRST_H_PDM 786484 +#define SRST_M_PDM 786485 +#define SRST_H_SPDIF 786488 +#define SRST_M_SPDIF 786491 +/********Name=PERISOFTRST_CON04,Offset=0x30410********/ +#define SRST_H_SDMMC0 786496 +#define SRST_H_SDMMC1 786498 +#define SRST_H_EMMC 786504 +#define SRST_A_EMMC 786505 +#define SRST_C_EMMC 786506 +#define SRST_B_EMMC 786507 +#define SRST_T_EMMC 786508 +#define SRST_S_SFC 786509 +#define SRST_H_SFC 786510 +/********Name=PERISOFTRST_CON05,Offset=0x30414********/ +#define SRST_H_USB2HOST 786512 +#define SRST_H_USB2HOST_ARB 786513 +#define SRST_USB2HOST_UTMI 786514 +/********Name=PERISOFTRST_CON06,Offset=0x30418********/ +#define SRST_P_SPI1 786528 +#define SRST_SPI1 786529 +#define SRST_P_SPI2 786531 +#define SRST_SPI2 786532 +/********Name=PERISOFTRST_CON07,Offset=0x3041C********/ +#define SRST_P_UART1 786544 +#define SRST_P_UART2 786545 +#define SRST_P_UART3 786546 +#define SRST_P_UART4 786547 +#define SRST_P_UART5 786548 +#define SRST_P_UART6 786549 +#define SRST_P_UART7 786550 +#define SRST_P_UART8 786551 +#define SRST_P_UART9 786552 +#define SRST_S_UART1 786555 +#define SRST_S_UART2 786558 +/********Name=PERISOFTRST_CON08,Offset=0x30420********/ +#define SRST_S_UART3 786561 +#define SRST_S_UART4 786564 +#define SRST_S_UART5 786567 +#define SRST_S_UART6 786570 +#define SRST_S_UART7 786573 +/********Name=PERISOFTRST_CON09,Offset=0x30424********/ +#define SRST_S_UART8 786576 +#define SRST_S_UART9 786579 +/********Name=PERISOFTRST_CON10,Offset=0x30428********/ +#define SRST_P_PWM1_PERI 786592 +#define SRST_PWM1_PERI 786593 +#define SRST_P_PWM2_PERI 786595 +#define SRST_PWM2_PERI 786596 +#define SRST_P_PWM3_PERI 786598 +#define SRST_PWM3_PERI 786599 +/********Name=PERISOFTRST_CON11,Offset=0x3042C********/ +#define SRST_P_CAN0 786608 +#define SRST_CAN0 786609 +#define SRST_P_CAN1 786610 +#define SRST_CAN1 786611 +/********Name=PERISOFTRST_CON12,Offset=0x30430********/ +#define SRST_A_CRYPTO 786624 +#define SRST_H_CRYPTO 786625 +#define SRST_P_CRYPTO 786626 +#define SRST_CORE_CRYPTO 786627 +#define SRST_PKA_CRYPTO 786628 +#define SRST_H_KLAD 786629 +#define SRST_P_KEY_READER 786630 +#define SRST_H_RK_RNG_NS 786631 +#define SRST_H_RK_RNG_S 786632 +#define SRST_H_TRNG_NS 786633 +#define SRST_H_TRNG_S 786634 +#define SRST_H_CRYPTO_S 786635 +/********Name=PERISOFTRST_CON13,Offset=0x30434********/ +#define SRST_P_PERI_WDT 786640 +#define SRST_T_PERI_WDT 786641 +#define SRST_A_SYSMEM 786642 +#define SRST_H_BOOTROM 786643 +#define SRST_P_PERI_GRF 786644 +#define SRST_A_DMAC 786645 +#define SRST_A_RKDMAC 786646 +/********Name=PERISOFTRST_CON14,Offset=0x30438********/ +#define SRST_P_OTPC_NS 786656 +#define SRST_SBPI_OTPC_NS 786657 +#define SRST_USER_OTPC_NS 786658 +#define SRST_P_OTPC_S 786659 +#define SRST_SBPI_OTPC_S 786660 +#define SRST_USER_OTPC_S 786661 +#define SRST_OTPC_ARB 786662 +#define SRST_P_OTPPHY 786663 +#define SRST_OTP_NPOR 786664 +/********Name=PERISOFTRST_CON15,Offset=0x3043C********/ +#define SRST_P_USB2PHY 786672 +#define SRST_USB2PHY_POR 786676 +#define SRST_USB2PHY_OTG 786677 +#define SRST_USB2PHY_HOST 786678 +#define SRST_P_PIPEPHY 786679 +/********Name=PERISOFTRST_CON16,Offset=0x30440********/ +#define SRST_P_SARADC 786692 +#define SRST_SARADC 786693 +#define SRST_SARADC_PHY 786694 +#define SRST_P_IOC_VCCIO234 786700 +/********Name=PERISOFTRST_CON17,Offset=0x30444********/ +#define SRST_P_PERI_GPIO1 786704 +#define SRST_P_PERI_GPIO2 786705 +#define SRST_PERI_GPIO1 786706 +#define SRST_PERI_GPIO2 786707 + +#endif diff --git a/u-boot/include/dt-bindings/display/rockchip-tve.h b/u-boot/include/dt-bindings/display/rockchip-tve.h new file mode 100644 index 0000000..d72d692 --- /dev/null +++ b/u-boot/include/dt-bindings/display/rockchip-tve.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ + + +#ifndef _DT_BINDINGS_ROCKCHIP_TVE_H +#define _DT_BINDINGS_ROCKCHIP_TVE_H + +/* tve dclk upsample mode */ +#define DCLK_UPSAMPLEx1 0 +#define DCLK_UPSAMPLEx2 1 +#define DCLK_UPSAMPLEx4 2 + +#endif diff --git a/u-boot/include/dt-bindings/power/rk3528-power.h b/u-boot/include/dt-bindings/power/rk3528-power.h new file mode 100644 index 0000000..4f7c978 --- /dev/null +++ b/u-boot/include/dt-bindings/power/rk3528-power.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +#ifndef __DT_BINDINGS_POWER_RK3528_POWER_H__ +#define __DT_BINDINGS_POWER_RK3528_POWER_H__ + +/* + * RK3528 idle id Summary. + */ +#define RK3528_PD_PMU 0 +#define RK3528_PD_BUS 1 +#define RK3528_PD_DDR 2 +#define RK3528_PD_MSCH 3 +#define RK3528_PD_GPU 4 +#define RK3528_PD_RKVDEC 5 +#define RK3528_PD_RKVENC 6 +#define RK3528_PD_VO 7 +#define RK3528_PD_VPU 8 + +#endif diff --git a/u-boot/include/dt-bindings/power/rk3562-power.h b/u-boot/include/dt-bindings/power/rk3562-power.h new file mode 100644 index 0000000..ed57c40 --- /dev/null +++ b/u-boot/include/dt-bindings/power/rk3562-power.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __DT_BINDINGS_POWER_RK3562_POWER_H__ +#define __DT_BINDINGS_POWER_RK3562_POWER_H__ + +/* VD_CORE */ +#define RK3562_PD_CPU_0 0 +#define RK3562_PD_CPU_1 1 +#define RK3562_PD_CPU_2 2 +#define RK3562_PD_CPU_3 3 +#define RK3562_PD_CORE_ALIVE 4 + +/* VD_PMU */ +#define RK3562_PD_PMU 5 +#define RK3562_PD_PMU_ALIVE 6 + +/* VD_NPU */ +#define RK3562_PD_NPU 7 + +/* VD_GPU */ +#define RK3562_PD_GPU 8 + +/* VD_LOGIC */ +#define RK3562_PD_DDR 9 +#define RK3562_PD_VEPU 10 +#define RK3562_PD_VDPU 11 +#define RK3562_PD_VI 12 +#define RK3562_PD_VO 13 +#define RK3562_PD_RGA 14 +#define RK3562_PD_EBK 15 +#define RK3562_PD_PHP 16 +#define RK3562_PD_LOGIC_ALIVE 17 + +#endif diff --git a/u-boot/include/dt-bindings/soc/rockchip,boot-mode.h b/u-boot/include/dt-bindings/soc/rockchip,boot-mode.h index 1436e1d..ec4e5dd 100644 --- a/u-boot/include/dt-bindings/soc/rockchip,boot-mode.h +++ b/u-boot/include/dt-bindings/soc/rockchip,boot-mode.h @@ -20,5 +20,7 @@ #define BOOT_CHARGING (REBOOT_FLAG + 11) /* enter usb mass storage mode */ #define BOOT_UMS (REBOOT_FLAG + 12) +/* reboot system quiescent */ +#define BOOT_QUIESCENT (REBOOT_FLAG + 14) #endif diff --git a/u-boot/include/dt-bindings/suspend/rockchip-rk3528.h b/u-boot/include/dt-bindings/suspend/rockchip-rk3528.h new file mode 100644 index 0000000..7f81bf8 --- /dev/null +++ b/u-boot/include/dt-bindings/suspend/rockchip-rk3528.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +/* + * Header providing constants for Rockchip suspend bindings. + * + * Copyright (C) 2022, Rockchip Electronics Co., Ltd + * Author: XiaoDong.Huang + */ + +#ifndef __DT_BINDINGS_RK3528_PM_H__ +#define __DT_BINDINGS_RK3528_PM_H__ +/******************************bits ops************************************/ + +#ifndef BIT +#define BIT(nr) (1 << (nr)) +#endif + +#define RKPM_SLP_ARMPD BIT(0) +#define RKPM_SLP_ARMOFF BIT(1) +#define RKPM_SLP_ARMOFF_DDRPD BIT(2) +#define RKPM_SLP_ARMOFF_LOGOFF BIT(3) + +/* all plls except ddr's pll*/ +#define RKPM_SLP_PMU_HW_PLLS_PD BIT(8) +#define RKPM_SLP_PMU_PMUALIVE_32K BIT(9) +#define RKPM_SLP_PMU_DIS_OSC BIT(10) + +#define RKPM_SLP_CLK_GT BIT(16) +#define RKPM_SLP_PMIC_LP BIT(17) + +#define RKPM_SLP_32K_EXT BIT(24) +#define RKPM_SLP_TIME_OUT_WKUP BIT(25) +#define RKPM_SLP_PMU_DBG BIT(26) + +/* the wake up source */ +#define RKPM_CPU0_WKUP_EN BIT(0) +#define RKPM_CPU1_WKUP_EN BIT(1) +#define RKPM_CPU2_WKUP_EN BIT(2) +#define RKPM_CPU3_WKUP_EN BIT(3) +#define RKPM_GPIO_WKUP_EN BIT(4) +#define RKPM_HDMI_HDP_WKUP_EN BIT(5) +#define RKPM_HDMI_CEC_WKUP_EN BIT(6) +#define RKPM_PWMIR_WKUP_EN BIT(7) +#define RKPM_GMAC_WKUP_EN BIT(8) +#define RKPM_TIMER_WKUP_EN BIT(9) +#define RKPM_USBDEV_WKUP_EN BIT(10) +#define RKPM_SYSINT_WKUP_EN BIT(11) +#define RKPM_TIME_OUT_WKUP_EN BIT(12) + +/* the pwm regulator */ +#define RKPM_PWM0_M0_REGULATOR_EN BIT(0) +#define RKPM_PWM1_M0_REGULATOR_EN BIT(1) +#define RKPM_PWM2_M0_REGULATOR_EN BIT(2) + +#endif diff --git a/u-boot/include/edid.h b/u-boot/include/edid.h index 6cfc308..0967912 100644 --- a/u-boot/include/edid.h +++ b/u-boot/include/edid.h @@ -882,6 +882,38 @@ u32 fps; }; +struct csc_info { + u16 hue; + u16 saturation; + u16 contrast; + u16 brightness; + u16 r_gain; + u16 g_gain; + u16 b_gain; + u16 r_offset; + u16 g_offset; + u16 b_offset; + u16 csc_enable; +}; + + +#define ACM_GAIN_LUT_HY_LENGTH (9*17) +#define ACM_GAIN_LUT_HY_TOTAL_LENGTH (ACM_GAIN_LUT_HY_LENGTH * 3) +#define ACM_GAIN_LUT_HS_LENGTH (13*17) +#define ACM_GAIN_LUT_HS_TOTAL_LENGTH (ACM_GAIN_LUT_HS_LENGTH * 3) +#define ACM_DELTA_LUT_H_LENGTH 65 +#define ACM_DELTA_LUT_H_TOTAL_LENGTH (ACM_DELTA_LUT_H_LENGTH * 3) + +struct acm_data { + s16 delta_lut_h[ACM_DELTA_LUT_H_TOTAL_LENGTH]; + s16 gain_lut_hy[ACM_GAIN_LUT_HY_TOTAL_LENGTH]; + s16 gain_lut_hs[ACM_GAIN_LUT_HS_TOTAL_LENGTH]; + u16 y_gain; + u16 h_gain; + u16 s_gain; + u16 acm_enable; +}; + struct base2_disp_info { char disp_head_flag[6]; struct base2_screen_info screen_info[4]; @@ -890,8 +922,15 @@ struct base2_gamma_lut_data gamma_lut_data; struct base2_cubic_lut_data cubic_lut_data; struct framebuffer_info framebuffer_info; - u32 reserved[244]; + u32 cacm_header; + u32 reserved[243]; u32 crc; + /* baseparameter version 3.0 add */ + struct csc_info csc_info; + struct acm_data acm_data; + u8 resv2[10*1024]; /* */ + u32 crc2; + /* baseparameter version 3.0 add */ }; struct base2_disp_header { diff --git a/u-boot/include/image.h b/u-boot/include/image.h index 449bd36..88009cc 100644 --- a/u-boot/include/image.h +++ b/u-boot/include/image.h @@ -703,6 +703,7 @@ bootm_headers_t *images, char **of_flat_tree, ulong *of_size); void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob); +void boot_mem_rsv_regions(struct lmb *lmb, void *fdt_blob); #ifdef CONFIG_SYSMEM int boot_fdt_add_sysmem_rsv_regions(void *fdt_blob); #else @@ -1347,9 +1348,13 @@ #endif /* CONFIG_FIT */ #if defined(CONFIG_ANDROID_BOOT_IMAGE) +#include <android_image.h> + struct andr_img_hdr; u32 android_bcb_msg_sector_offset(void); -u32 android_image_major_version(void); +int android_image_init_resource(struct blk_desc *desc, + disk_partition_t *out_part, + ulong *out_blk_offset); int android_image_check_header(const struct andr_img_hdr *hdr); int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, ulong *os_data, ulong *os_len); @@ -1368,6 +1373,10 @@ struct andr_img_hdr *populate_andr_img_hdr(struct blk_desc *dev_desc, disk_partition_t *part_boot); +int populate_boot_info(const struct boot_img_hdr_v34 *boot_hdr, + const struct vendor_boot_img_hdr_v34 *vendor_boot_hdr, + const struct boot_img_hdr_v34 *init_boot_hdr, + struct andr_img_hdr *hdr, bool save_hdr); /** android_image_load - Load an Android Image from storage. * @@ -1392,6 +1401,9 @@ int android_image_load_by_partname(struct blk_desc *dev_desc, const char *boot_partname, unsigned long *load_address); + +int android_image_verify_resource(const char *boot_part, ulong *resc_buf); + #endif /* CONFIG_ANDROID_BOOT_IMAGE */ int bootm_parse_comp(const unsigned char *hdr); diff --git a/u-boot/include/irq-platform.h b/u-boot/include/irq-platform.h index 222d5c7..53516fc 100644 --- a/u-boot/include/irq-platform.h +++ b/u-boot/include/irq-platform.h @@ -241,6 +241,46 @@ #define IRQ_GPIO3 69 #define IRQ_GPIO4 70 +#elif defined(CONFIG_ROCKCHIP_RK3528) +#define GPIO0_PHYS 0xff610000 +#define GPIO1_PHYS 0xffaf0000 +#define GPIO2_PHYS 0xffb00000 +#define GPIO3_PHYS 0xffb10000 +#define GPIO4_PHYS 0xffb20000 + +#define GIC_IRQS_NR (5 * 32) +#define GPIO_IRQS_NR (5 * 32) + +#define GPIO_BANK_NUM 5 +#define GPIO_BANK_PINS 32 + +#define IRQ_TIMER0 63 +#define IRQ_GPIO0 103 +#define IRQ_GPIO1 105 +#define IRQ_GPIO2 107 +#define IRQ_GPIO3 108 +#define IRQ_GPIO4 110 + +#elif defined(CONFIG_ROCKCHIP_RK3562) +#define GPIO0_PHYS 0xff260000 +#define GPIO1_PHYS 0xff620000 +#define GPIO2_PHYS 0xff630000 +#define GPIO3_PHYS 0xffac0000 +#define GPIO4_PHYS 0xffad0000 + +#define GIC_IRQS_NR (5 * 32) +#define GPIO_IRQS_NR (5 * 32) + +#define GPIO_BANK_NUM 5 +#define GPIO_BANK_PINS 32 + +#define IRQ_TIMER0 77 +#define IRQ_GPIO0 32 +#define IRQ_GPIO1 34 +#define IRQ_GPIO2 36 +#define IRQ_GPIO3 38 +#define IRQ_GPIO4 40 + #elif defined(CONFIG_ROCKCHIP_RK3568) #define GPIO0_PHYS 0xfdd60000 #define GPIO1_PHYS 0xfe740000 diff --git a/u-boot/include/key.h b/u-boot/include/key.h index 7a9f9e4..0ccf7b1 100644 --- a/u-boot/include/key.h +++ b/u-boot/include/key.h @@ -33,9 +33,10 @@ /* ADC key */ u8 channel; - u32 adcval; - u32 min; - u32 max; + int in_volt; + int center; + int min; + int max; /* GPIO key */ u32 irq; diff --git a/u-boot/include/linux/dw_hdmi.h b/u-boot/include/linux/dw_hdmi.h index 18433ea..3d15ead 100644 --- a/u-boot/include/linux/dw_hdmi.h +++ b/u-boot/include/linux/dw_hdmi.h @@ -92,6 +92,7 @@ RK3366_HDMI, RK3368_HDMI, RK3399_HDMI, + RK3528_HDMI, RK3568_HDMI, }; @@ -177,7 +178,7 @@ const struct dw_hdmi_mpll_config *mpll_cfg; const struct dw_hdmi_mpll_config *mpll_cfg_420; const struct dw_hdmi_curr_ctrl *cur_ctr; - const struct dw_hdmi_phy_config *phy_config; + struct dw_hdmi_phy_config *phy_config; int (*configure_phy)(struct dw_hdmi *hdmi, const struct dw_hdmi_plat_data *pdata, unsigned long mpixelclock); diff --git a/u-boot/include/linux/mtd/mtd.h b/u-boot/include/linux/mtd/mtd.h index b848c0d..c5c9c41 100644 --- a/u-boot/include/linux/mtd/mtd.h +++ b/u-boot/include/linux/mtd/mtd.h @@ -551,30 +551,6 @@ } #endif -#ifdef __UBOOT__ -/* - * Debugging macro and defines - */ -#define MTD_DEBUG_LEVEL0 (0) /* Quiet */ -#define MTD_DEBUG_LEVEL1 (1) /* Audible */ -#define MTD_DEBUG_LEVEL2 (2) /* Loud */ -#define MTD_DEBUG_LEVEL3 (3) /* Noisy */ - -#ifdef CONFIG_MTD_DEBUG -#define MTDDEBUG(n, args...) \ - do { \ - if (n <= CONFIG_MTD_DEBUG_VERBOSE) \ - printk(KERN_INFO args); \ - } while(0) -#else /* CONFIG_MTD_DEBUG */ -#define MTDDEBUG(n, args...) \ - do { \ - if (0) \ - printk(KERN_INFO args); \ - } while(0) -#endif /* CONFIG_MTD_DEBUG */ -#endif - static inline int mtd_is_bitflip(int err) { return err == -EUCLEAN; } diff --git a/u-boot/include/linux/mtd/spinand.h b/u-boot/include/linux/mtd/spinand.h index 99024f7..cc905f8 100644 --- a/u-boot/include/linux/mtd/spinand.h +++ b/u-boot/include/linux/mtd/spinand.h @@ -252,6 +252,7 @@ extern const struct spinand_manufacturer winbond_spinand_manufacturer; extern const struct spinand_manufacturer dosilicon_spinand_manufacturer; extern const struct spinand_manufacturer esmt_spinand_manufacturer; +extern const struct spinand_manufacturer xincun_spinand_manufacturer; extern const struct spinand_manufacturer xtx_spinand_manufacturer; extern const struct spinand_manufacturer hyf_spinand_manufacturer; extern const struct spinand_manufacturer fmsh_spinand_manufacturer; @@ -262,6 +263,7 @@ extern const struct spinand_manufacturer silicongo_spinand_manufacturer; extern const struct spinand_manufacturer unim_spinand_manufacturer; extern const struct spinand_manufacturer skyhigh_spinand_manufacturer; +extern const struct spinand_manufacturer gsto_spinand_manufacturer; /** * struct spinand_op_variants - SPI NAND operation variants diff --git a/u-boot/include/max96745.h b/u-boot/include/max96745.h index b69e011..2eb0450 100644 --- a/u-boot/include/max96745.h +++ b/u-boot/include/max96745.h @@ -17,6 +17,21 @@ #define RESET_ALL BIT(7) #define SLEEP BIT(3) +/* 0011h */ +#define CXTP_B BIT(2) +#define CXTP_A BIT(0) + +/* 0028h, 0032h */ +#define LINK_EN BIT(7) +#define TX_RATE GENMASK(3, 2) + +/* 0029h, 0033h */ +#define RESET_LINK BIT(0) +#define RESET_ONESHOT BIT(1) + +/* 002Ah, 0034h */ +#define LINK_LOCKED BIT(0) + /* 0076h, 0086h */ #define DIS_REM_CC BIT(7) diff --git a/u-boot/include/max96752f.h b/u-boot/include/max96752f.h deleted file mode 100644 index cda7291..0000000 --- a/u-boot/include/max96752f.h +++ /dev/null @@ -1,66 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * (C) Copyright 2022 Rockchip Electronics Co., Ltd - */ - -#ifndef _MAX96752F_H_ -#define _MAX96752F_H_ - -#include <linux/bitfield.h> - -#define GPIO_A_REG(gpio) (0x0200 + ((gpio) * 3)) -#define GPIO_B_REG(gpio) (0x0201 + ((gpio) * 3)) -#define GPIO_C_REG(gpio) (0x0202 + ((gpio) * 3)) -#define OLDI_REG(x) (0x01cd + (x)) - -/* 0002h */ -#define AUD_TX_EN BIT(2) - -/* 0010h */ -#define RESET_ALL BIT(7) -#define RESET_LINK BIT(6) -#define RESET_ONESHOT BIT(5) -#define AUTO_LINK BIT(4) -#define SLEEP BIT(3) -#define LINK_CFG GENMASK(1, 0) - -/* 0050h */ -#define STR_SEL GENMASK(1, 0) - -/* 0073h */ -#define TX_SRC_ID GENMASK(2, 0) - -/* 0140h */ -#define AUD_RX_EN BIT(0) - -/* 0200h */ -#define RES_CFG BIT(7) -#define TX_PRIO BIT(6) -#define TX_COMP_EN BIT(5) -#define GPIO_OUT BIT(4) -#define GPIO_IN BIT(3) -#define GPIO_RX_EN BIT(2) -#define GPIO_TX_EN BIT(1) -#define GPIO_OUT_DIS BIT(0) - -/* 0201h */ -#define PULL_UPDN_SEL GENMASK(7, 6) -#define OUT_TYPE BIT(5) -#define GPIO_TX_ID GENMASK(4, 0) - -/* 0202h */ -#define OVR_RES_CFG BIT(7) -#define GPIO_RX_ID GENMASK(4, 0) - -/* 01CEh */ -#define OLDI_OUTSEL BIT(7) -#define OLDI_FORMAT BIT(6) -#define OLDI_4TH_LANE BIT(5) -#define OLDI_SWAP_AB BIT(4) -#define OLDI_SPL_EN BIT(3) -#define OLDI_SPL_MODE GENMASK(2, 1) -#define OLDI_SPL_POL BIT(0) - -void max96752f_init(struct udevice *dev); - -#endif diff --git a/u-boot/include/max96755f.h b/u-boot/include/max96755f.h index deea4ce..de33ab6 100644 --- a/u-boot/include/max96755f.h +++ b/u-boot/include/max96755f.h @@ -181,6 +181,7 @@ struct drm_display_mode mode; u32 num_lanes; struct gpio_desc lock_gpio; + u32 dsi_lane_map[4]; }; #endif diff --git a/u-boot/include/mmc.h b/u-boot/include/mmc.h index 0d23e40..45b77ec 100644 --- a/u-boot/include/mmc.h +++ b/u-boot/include/mmc.h @@ -192,6 +192,8 @@ #define EXT_CSD_HS_TIMING 185 /* R/W */ #define EXT_CSD_REV 192 /* RO */ #define EXT_CSD_CARD_TYPE 196 /* RO */ +#define EXT_CSD_CARD_TYPE 196 /* RO */ +#define EXT_CSD_DRIVER_STRENGTH 197 /* RO */ #define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */ #define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */ #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */ @@ -231,6 +233,7 @@ #define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */ #define EXT_CSD_DDR_BUS_WIDTH_4 5 /* Card is in 4 bit DDR mode */ #define EXT_CSD_DDR_BUS_WIDTH_8 6 /* Card is in 8 bit DDR mode */ +#define EXT_CSD_BUS_WIDTH_STROBE BIT(7) /* Enhanced strobe mode */ #define EXT_CSD_TIMING_BC 0 /* Backwards compatility */ #define EXT_CSD_TIMING_HS 1 /* High speed */ @@ -470,6 +473,8 @@ * @return 0 if write-enabled, 1 if write-protected, -ve on error */ int (*execute_tuning)(struct udevice *dev, u32 opcode); + /* set_enhanced_strobe() - set HS400 enhanced strobe */ + int (*set_enhanced_strobe)(struct udevice *dev); }; #define mmc_get_ops(dev) ((struct dm_mmc_ops *)(dev)->driver->ops) @@ -487,6 +492,7 @@ int mmc_getcd(struct mmc *mmc); int mmc_getwp(struct mmc *mmc); +int mmc_set_enhanced_strobe(struct mmc *mmc); #else struct mmc_ops { bool (*card_busy)(struct mmc *mmc); @@ -511,6 +517,7 @@ uint f_max; uint b_max; unsigned char part_type; + u8 fixed_drv_type; }; struct sd_ssr { @@ -598,6 +605,7 @@ #if CONFIG_IS_ENABLED(DM_MMC) struct udevice *dev; /* Device for this MMC controller */ #endif + u8 raw_driver_strength; }; struct mmc_hwpart_conf { @@ -785,5 +793,7 @@ */ void mmc_gpio_init_direct(void); +#define mmc_driver_type_mask(n) (1 << (n)) + #endif /* _MMC_H_ */ diff --git a/u-boot/include/mp_boot.h b/u-boot/include/mp_boot.h new file mode 100644 index 0000000..44a16c6 --- /dev/null +++ b/u-boot/include/mp_boot.h @@ -0,0 +1,25 @@ +/* + * (C) Copyright 2023 Rockchip Electronics Co., Ltd + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef _MP_BOOT_H_ +#define _MP_BOOT_H_ + +#include <spl.h> + +struct task_data { + struct spl_load_info info; + + /* to be filled by smp task */ + void *boot_addr; + ulong boot_size; +}; + +void mpb_init_1(struct spl_load_info info); +void mpb_init_x(int evt); +ulong mpb_post(int evt); + +#endif + diff --git a/u-boot/include/power/rk8xx_pmic.h b/u-boot/include/power/rk8xx_pmic.h index aa51e88..84d1104 100644 --- a/u-boot/include/power/rk8xx_pmic.h +++ b/u-boot/include/power/rk8xx_pmic.h @@ -206,6 +206,7 @@ #define RK817_ID_LSB 0xee #define RK8XX_ID_MSK 0xfff0 +#define RK817_PMIC_CHRG_TERM 0xe6 #define RK817_PMIC_SYS_CFG1 0xf1 #define RK817_PMIC_SYS_CFG3 0xf4 #define RK817_GPIO_INT_CFG 0xfe @@ -287,6 +288,7 @@ uint8_t sleep_pin; uint8_t rst_fun; int not_save_power_en; + int sys_can_sd; }; int rk8xx_spl_configure_buck(struct udevice *pmic, int buck, int uvolt); diff --git a/u-boot/include/rk_timer_irq.h b/u-boot/include/rk_timer_irq.h index 44fc395..69f9ee3 100644 --- a/u-boot/include/rk_timer_irq.h +++ b/u-boot/include/rk_timer_irq.h @@ -66,6 +66,12 @@ #elif defined(CONFIG_ROCKCHIP_RV1126) #define TIMER_BASE (0xFF660000 + 0x20) /* TIMER 1 */ #define TIMER_IRQ IRQ_TIMER1 +#elif defined(CONFIG_ROCKCHIP_RK3528) +#define TIMER_BASE (0xFFAB0000 + 0x00) /* TIMER 0 */ +#define TIMER_IRQ IRQ_TIMER0 +#elif defined(CONFIG_ROCKCHIP_RK3562) +#define TIMER_BASE (0xFFA50000 + 0x00) /* TIMER 0 */ +#define TIMER_IRQ IRQ_TIMER0 #elif defined(CONFIG_ROCKCHIP_RK3568) /* Only timer0 can wakeup system suspend */ #define TIMER_BASE (0xFE5F0000 + 0x00) /* TIMER 1 */ diff --git a/u-boot/include/rockchip/crypto_v2.h b/u-boot/include/rockchip/crypto_v2.h index 9469266..41d1e83 100644 --- a/u-boot/include/rockchip/crypto_v2.h +++ b/u-boot/include/rockchip/crypto_v2.h @@ -564,7 +564,7 @@ #define LLI_DMA_CTRL_DST_DONE _BIT(9) #define LLI_DMA_CTRL_SRC_DONE _BIT(10) -#define LLI_USER_CPIHER_START _BIT(0) +#define LLI_USER_CIPHER_START _BIT(0) #define LLI_USER_STRING_START _BIT(1) #define LLI_USER_STRING_LAST _BIT(2) #define LLI_USER_STRING_AAD _BIT(3) diff --git a/u-boot/include/scsi.h b/u-boot/include/scsi.h index 7173912..23a275f 100644 --- a/u-boot/include/scsi.h +++ b/u-boot/include/scsi.h @@ -7,6 +7,9 @@ #ifndef _SCSI_H #define _SCSI_H +#include <asm/cache.h> +#include <linux/dma-direction.h> + struct scsi_cmd { unsigned char cmd[16]; /* command */ /* for request sense */ @@ -27,6 +30,7 @@ unsigned long trans_bytes; /* tranfered bytes */ unsigned int priv; + enum dma_data_direction dma_dir; }; /*----------------------------------------------------------- diff --git a/u-boot/include/sdhci.h b/u-boot/include/sdhci.h index 354f1e7..ebbca24 100644 --- a/u-boot/include/sdhci.h +++ b/u-boot/include/sdhci.h @@ -256,6 +256,18 @@ void (*set_ios_post)(struct sdhci_host *host); int (*set_clock)(struct sdhci_host *host, unsigned int clock); void (*set_clock_ext)(struct sdhci_host *host, u32 div); + + /** + * set_enhanced_strobe() - Set HS400 Enhanced Strobe config + * + * This is called after setting the card speed and mode to + * HS400 ES, and should set any host-specific configuration + * necessary for it. + * + * @host: SDHCI host structure + * Return: 0 if successful, -ve on error + */ + int (*set_enhanced_strobe)(struct sdhci_host *host); }; struct sdhci_host { @@ -280,6 +292,7 @@ struct mmc_config cfg; }; +void sdhci_enable_clk(struct sdhci_host *host, u16 clk); int sdhci_set_clock(struct sdhci_host *host, unsigned int clock); #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS diff --git a/u-boot/include/spl_ab.h b/u-boot/include/spl_ab.h index 6075555..f24d3ff 100644 --- a/u-boot/include/spl_ab.h +++ b/u-boot/include/spl_ab.h @@ -6,6 +6,7 @@ #ifndef _SPL_AB_H_ #define _SPL_AB_H_ +#include <spl.h> #include <android_avb/libavb_ab.h> #include <android_avb/avb_ab_flow.h> @@ -45,4 +46,13 @@ */ int spl_ab_decrease_tries(struct blk_desc *dev_desc); +/* + * spl_ab_decrease_reset + * + * @dev_desc: block description + * + * return: 0 success, others fail. + */ +int spl_ab_decrease_reset(struct blk_desc *dev_desc); + #endif diff --git a/u-boot/include/spl_display.h b/u-boot/include/spl_display.h new file mode 100644 index 0000000..3cb7fe2 --- /dev/null +++ b/u-boot/include/spl_display.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * (C) Copyright 2023 Rockchip Electronics Co., Ltd + * + */ + +#ifndef _SPL_DISPLAY_H_ +#define _SPL_DISPLAY_H_ + +#include <common.h> +#include <drm_modes.h> +#include <mp_boot.h> + +/* SPL display */ +#define RK3528_VOP_BASE 0xff840000 +#define RK3528_HDMI_BASE 0xff8d0000 +#define RK3528_HDMIPHY_BASE 0xffe00000 +#define RK3528_CRU_BASE 0xff4a0000 +#define RK3528_GPIO0_IOC_BASE 0xff540000 +#define RK3528_GPIO_BASE 0xff610000 + +struct spl_display_info { + struct drm_display_mode mode; + u32 bus_format; + u32 enabled; +}; +#endif + diff --git a/u-boot/include/u-boot/sha1.h b/u-boot/include/u-boot/sha1.h index 2634a29..3bb6e62 100644 --- a/u-boot/include/u-boot/sha1.h +++ b/u-boot/include/u-boot/sha1.h @@ -31,7 +31,7 @@ typedef struct { unsigned long total[2]; /*!< number of bytes processed */ - unsigned long state[5]; /*!< intermediate digest state */ + uint32_t state[5]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ } sha1_context; diff --git a/u-boot/lib/avb/libavb/avb_sha512.c b/u-boot/lib/avb/libavb/avb_sha512.c index d3e437b..2cdd6ca 100644 --- a/u-boot/lib/avb/libavb/avb_sha512.c +++ b/u-boot/lib/avb/libavb/avb_sha512.c @@ -38,33 +38,6 @@ #include <android_avb/avb_sha.h> #include <android_avb/avb_util.h> -/* Crypto-v1 is not support sha512 */ -#ifdef CONFIG_ROCKCHIP_CRYPTO_V2 -void avb_sha512_init(AvbSHA512Ctx* ctx) { - ctx->crypto_ctx.algo = CRYPTO_SHA512; - ctx->crypto_ctx.length = ctx->tot_len; - memset(ctx->buf, 0, sizeof(ctx->buf)); - - ctx->crypto_dev = crypto_get_device(ctx->crypto_ctx.algo); - if (!ctx->crypto_dev) - avb_error("Can't get sha512 crypto device\n"); - else - crypto_sha_init(ctx->crypto_dev, &ctx->crypto_ctx); -} - -void avb_sha512_update(AvbSHA512Ctx* ctx, const uint8_t* data, size_t len) { - if (ctx->crypto_dev) - crypto_sha_update(ctx->crypto_dev, (u32 *)data, len); -} - -uint8_t* avb_sha512_final(AvbSHA512Ctx* ctx) { - if (ctx->crypto_dev) - crypto_sha_final(ctx->crypto_dev, &ctx->crypto_ctx, ctx->buf); - - return ctx->buf; -} - -#else #define SHFR(x, n) (x >> n) #define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) #define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) @@ -160,6 +133,19 @@ /* SHA-512 implementation */ void avb_sha512_init(AvbSHA512Ctx* ctx) { +/* Crypto-v1 is not support sha512 */ +#ifdef CONFIG_ROCKCHIP_CRYPTO_V2 + ctx->crypto_ctx.algo = CRYPTO_SHA512; + ctx->crypto_ctx.length = ctx->tot_len; + memset(ctx->buf, 0, sizeof(ctx->buf)); + + ctx->crypto_dev = crypto_get_device(ctx->crypto_ctx.algo); + /* If there is no available crypto device, calculate in software instead. */ + if (ctx->crypto_dev) { + crypto_sha_init(ctx->crypto_dev, &ctx->crypto_ctx); + return; + } +#endif #ifdef UNROLL_LOOPS_SHA512 ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1]; @@ -347,6 +333,15 @@ } void avb_sha512_update(AvbSHA512Ctx* ctx, const uint8_t* data, size_t len) { +/* Crypto-v1 is not support sha512 */ +#ifdef CONFIG_ROCKCHIP_CRYPTO_V2 + /* If there is no available crypto device, calculate in software instead. */ + if (ctx->crypto_dev) { + crypto_sha_update(ctx->crypto_dev, (u32 *)data, len); + return; + } +#endif + size_t block_nb; size_t new_len, rem_len, tmp_len; const uint8_t* shifted_data; @@ -378,6 +373,15 @@ } uint8_t* avb_sha512_final(AvbSHA512Ctx* ctx) { +/* Crypto-v1 is not support sha512 */ +#ifdef CONFIG_ROCKCHIP_CRYPTO_V2 + /* If there is no available crypto device, calculate in software instead. */ + if (ctx->crypto_dev) { + crypto_sha_final(ctx->crypto_dev, &ctx->crypto_ctx, ctx->buf); + return ctx->buf; + } +#endif + size_t block_nb; size_t pm_len; uint64_t len_b; @@ -414,4 +418,3 @@ return ctx->buf; } -#endif diff --git a/u-boot/lib/avb/libavb/avb_slot_verify.c b/u-boot/lib/avb/libavb/avb_slot_verify.c index af556e5..be3ff38 100644 --- a/u-boot/lib/avb/libavb/avb_slot_verify.c +++ b/u-boot/lib/avb/libavb/avb_slot_verify.c @@ -22,7 +22,7 @@ * SOFTWARE. */ #include <common.h> -#include <sysmem.h> +#include <android_image.h> #include <android_avb/avb_slot_verify.h> #include <android_avb/avb_chain_partition_descriptor.h> #include <android_avb/avb_cmdline.h> @@ -30,6 +30,7 @@ #include <android_avb/avb_hash_descriptor.h> #include <android_avb/avb_hashtree_descriptor.h> #include <android_avb/avb_kernel_cmdline_descriptor.h> +#include <android_avb/avb_ops_user.h> #include <android_avb/avb_sha.h> #include <android_avb/avb_util.h> #include <android_avb/avb_vbmeta_image.h> @@ -118,7 +119,7 @@ /* Allocate and copy the partition. */ if (!*out_image_preloaded) { - *out_image_buf = sysmem_alloc(MEM_AVB_ANDROID, image_size); + *out_image_buf = avb_malloc(image_size); if (*out_image_buf == NULL) { return AVB_SLOT_VERIFY_RESULT_ERROR_OOM; } @@ -296,7 +297,7 @@ bool image_preloaded = false; uint8_t* digest; size_t digest_len; - const char* found; + const char* found = NULL; uint64_t image_size; size_t expected_digest_len = 0; uint8_t expected_digest_buf[AVB_SHA512_DIGEST_SIZE]; @@ -388,7 +389,7 @@ allow_verification_error); if (ret != AVB_SLOT_VERIFY_RESULT_OK) { goto out; - } else if (image_preloaded) { + } else if (allow_verification_error) { goto out; } @@ -482,7 +483,7 @@ fail: if (image_buf != NULL && !image_preloaded) { - sysmem_free((phys_addr_t)image_buf); + avb_free(image_buf); } return ret; } @@ -556,7 +557,7 @@ out: /* Free the current buffer if any. */ if (image_buf != NULL && !image_preloaded) { - sysmem_free((phys_addr_t)image_buf); + avb_free(image_buf); } /* Buffers that are already saved in slot_data will be handled by the caller * even on failure. */ @@ -1662,7 +1663,7 @@ avb_free(loaded_partition->partition_name); } if (loaded_partition->data != NULL && !loaded_partition->preloaded) { - sysmem_free((phys_addr_t)loaded_partition->data); + avb_free(loaded_partition->data); } } avb_free(data->loaded_partitions); diff --git a/u-boot/lib/avb/libavb_user/Kconfig b/u-boot/lib/avb/libavb_user/Kconfig index 3892094..249263e 100755 --- a/u-boot/lib/avb/libavb_user/Kconfig +++ b/u-boot/lib/avb/libavb_user/Kconfig @@ -16,7 +16,6 @@ - only allow "boot_android" as bootcmd; - enter rockusb or fastboot when boot failed; - not allow ctrl+c to enter hush; - only the CONFIG_BOOTDELAY can interrupt the bootflow. config SPL_AVB_LIBAVB_USER bool "Android AVB read/write hardware for spl" diff --git a/u-boot/lib/avb/libavb_user/avb_ops_user.c b/u-boot/lib/avb/libavb_user/avb_ops_user.c index f7b2ac7..18c0c1f 100644 --- a/u-boot/lib/avb/libavb_user/avb_ops_user.c +++ b/u-boot/lib/avb/libavb_user/avb_ops_user.c @@ -81,10 +81,9 @@ return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; } - if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) { - printf("Could not find \"%s\" partition\n", partition); + if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; - } + *out_size_in_bytes = (part_info.size) * 512; return AVB_IO_RESULT_OK; } @@ -281,6 +280,7 @@ { if (out_is_unlocked) { #ifdef CONFIG_OPTEE_CLIENT + uint8_t vboot_flag = 0; int ret; ret = trusty_read_lock_state((uint8_t *)out_is_unlocked); @@ -291,7 +291,16 @@ case TEE_ERROR_GENERIC: case TEE_ERROR_NO_DATA: case TEE_ERROR_ITEM_NOT_FOUND: - *out_is_unlocked = 1; + if (trusty_read_vbootkey_enable_flag(&vboot_flag)) { + printf("Can't read vboot flag\n"); + return AVB_IO_RESULT_ERROR_IO; + } + + if (vboot_flag) + *out_is_unlocked = 0; + else + *out_is_unlocked = 1; + if (trusty_write_lock_state(*out_is_unlocked)) { printf("%s: init lock state error\n", __FILE__); ret = AVB_IO_RESULT_ERROR_IO; @@ -429,30 +438,111 @@ size_t* out_num_bytes_preloaded, int allow_verification_error) { + struct preloaded_partition *preload_info = NULL; + struct AvbOpsData *data = ops->user_data; struct blk_desc *dev_desc; + disk_partition_t part_info; ulong load_addr; - int ret; + AvbIOResult ret; + int full_preload = 0; - /* no need go further */ - if (!allow_verification_error) - return AVB_IO_RESULT_OK; - - printf("get image from preloaded partition...\n"); dev_desc = rockchip_get_bootdev(); if (!dev_desc) - return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; + return AVB_IO_RESULT_ERROR_IO; - load_addr = env_get_ulong("kernel_addr_r", 16, 0); - if (!load_addr) - return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE; + if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) { + printf("Could not find \"%s\" partition\n", partition); + return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; + } - ret = android_image_load_by_partname(dev_desc, partition, &load_addr); - if (!ret) { - *out_pointer = (u8 *)load_addr; - *out_num_bytes_preloaded = num_bytes; /* return what it expects */ + if (!allow_verification_error) { + if (!strncmp(partition, ANDROID_PARTITION_BOOT, 4) || + !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8)) + preload_info = &data->boot; + else if (!strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11)) + preload_info = &data->vendor_boot; + else if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9)) + preload_info = &data->init_boot; + else if (!strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) + preload_info = &data->resource; + + if (!preload_info) { + printf("Error: unknown full load partition '%s'\n", partition); + return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; + } + + printf("preloaded(s): %sfull image from '%s' at 0x%08lx - 0x%08lx\n", + preload_info->size ? "pre-" : "", partition, + (ulong)preload_info->addr, + (ulong)preload_info->addr + num_bytes); + + /* If the partition hasn't yet been preloaded, do it now.*/ + if (preload_info->size == 0) { + ret = ops->read_from_partition(ops, partition, + 0, num_bytes, + preload_info->addr, + &preload_info->size); + if (ret != AVB_IO_RESULT_OK) + return ret; + } + *out_pointer = preload_info->addr; + *out_num_bytes_preloaded = preload_info->size; ret = AVB_IO_RESULT_OK; } else { - ret = AVB_IO_RESULT_ERROR_IO; + if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9) || + !strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11) || + !strncmp(partition, ANDROID_PARTITION_BOOT, 4) || + !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8) || + !strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) { + /* If already full preloaded, just use it */ + if (!strncmp(partition, ANDROID_PARTITION_BOOT, 4) || + !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8)) { + preload_info = &data->boot; + if (preload_info->size) { + *out_pointer = preload_info->addr; + *out_num_bytes_preloaded = num_bytes; + full_preload = 1; + } + } + printf("preloaded: %s image from '%s\n", + full_preload ? "pre-full" : "distribute", partition); + } else { + printf("Error: unknown preloaded partition '%s'\n", partition); + return AVB_IO_RESULT_ERROR_OOM; + } + + /* + * Already preloaded during boot/recovery loading, + * here we just return a dummy buffer. + */ + if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9) || + !strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11) || + !strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) { + *out_pointer = (u8 *)avb_malloc(ARCH_DMA_MINALIGN); + *out_num_bytes_preloaded = num_bytes; /* return what it expects */ + return AVB_IO_RESULT_OK; + } + + /* If already full preloaded, there is nothing to do and just return */ + if (full_preload) + return AVB_IO_RESULT_OK; + + /* + * only boot/recovery partition can reach here + * and init/vendor_boot are loaded at this round. + */ + load_addr = env_get_ulong("kernel_addr_r", 16, 0); + if (!load_addr) + return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE; + + ret = android_image_load_by_partname(dev_desc, partition, &load_addr); + if (!ret) { + *out_pointer = (u8 *)load_addr; + *out_num_bytes_preloaded = num_bytes; /* return what it expects */ + ret = AVB_IO_RESULT_OK; + } else { + ret = AVB_IO_RESULT_ERROR_IO; + } } return ret; @@ -489,7 +579,8 @@ AvbOps *avb_ops_user_new(void) { - AvbOps *ops; + AvbOps *ops = NULL; + struct AvbOpsData *ops_data = NULL; ops = calloc(1, sizeof(AvbOps)); if (!ops) { @@ -510,8 +601,20 @@ free(ops); goto out; } + + ops_data = calloc(1, sizeof(struct AvbOpsData)); + if (!ops_data) { + printf("Error allocating memory for AvbOpsData.\n"); + free(ops->atx_ops); + free(ops->ab_ops); + free(ops); + goto out; + } + ops->ab_ops->ops = ops; ops->atx_ops->ops = ops; + ops_data->ops = ops; + ops->user_data = ops_data; ops->read_from_partition = read_from_partition; ops->write_to_partition = write_to_partition; @@ -533,12 +636,14 @@ ops->atx_ops->set_key_version = avb_set_key_version; ops->atx_ops->get_random = rk_get_random; -out: return ops; +out: + return NULL; } void avb_ops_user_free(AvbOps *ops) { + free(ops->user_data); free(ops->ab_ops); free(ops->atx_ops); free(ops); diff --git a/u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c b/u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c index a536fd9..78e0d9a 100644 --- a/u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c +++ b/u-boot/lib/avb/rk_avb_user/rk_avb_ops_user.c @@ -158,6 +158,7 @@ int rk_avb_read_lock_state(uint8_t *lock_state) { #ifdef CONFIG_OPTEE_CLIENT + uint8_t vboot_flag = 0; int ret; ret = trusty_read_lock_state(lock_state); @@ -167,7 +168,16 @@ case TEE_ERROR_GENERIC: case TEE_ERROR_NO_DATA: case TEE_ERROR_ITEM_NOT_FOUND: - *lock_state = 1; + if (trusty_read_vbootkey_enable_flag(&vboot_flag)) { + printf("Can't read vboot flag\n"); + return -1; + } + + if (vboot_flag) + *lock_state = 0; + else + *lock_state = 1; + if (rk_avb_write_lock_state(*lock_state)) { printf("avb_write_lock_state error!"); ret = -1; diff --git a/u-boot/lib/optee_clientApi/OpteeClientInterface.c b/u-boot/lib/optee_clientApi/OpteeClientInterface.c index c16a460..9f2022b 100644 --- a/u-boot/lib/optee_clientApi/OpteeClientInterface.c +++ b/u-boot/lib/optee_clientApi/OpteeClientInterface.c @@ -73,6 +73,20 @@ flush_cache(aligned_input, aligned_len); } +static void crypto_invalidate_cacheline(uint32_t addr, uint32_t size) +{ + ulong alignment = CONFIG_SYS_CACHELINE_SIZE; + ulong aligned_input, aligned_len; + + if (!addr || !size) + return; + + /* Must invalidate dcache after crypto DMA write data region */ + aligned_input = round_down(addr, alignment); + aligned_len = round_up(size + (addr - aligned_input), alignment); + invalidate_dcache_range(aligned_input, aligned_input + aligned_len); +} + static uint32_t trusty_base_write_security_data(char *filename, uint32_t filename_size, uint8_t *data, @@ -1014,6 +1028,8 @@ &TeecOperation, &ErrorOrigin); + crypto_invalidate_cacheline(dst_phys_addr, len); + exit: TEEC_ReleaseSharedMemory(&SharedMem_config); TEEC_CloseSession(&TeecSession); diff --git a/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c b/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c index ca60698..414f5f4 100644 --- a/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c +++ b/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v1.c @@ -528,7 +528,7 @@ { unsigned char *cp, *vp; struct rkss_file_verification *verify; - int ret, i; + int ret, i, write_table_flag = 0; for (i = 0; i < RKSS_PARTITION_TABLE_COUNT; i++) { cp = table_data + (i * RKSS_DATA_SECTION_LEN); @@ -541,12 +541,15 @@ memset(cp, 0, RKSS_DATA_SECTION_LEN); verify->checkstr = RKSS_CHECK_STR; verify->version = RKSS_VERSION_V1; + write_table_flag = 1; } } - ret = rkss_write_multi_sections(table_data, 0, RKSS_PARTITION_TABLE_COUNT); - if (ret < 0) { - printf("TEEC: rkss_write_multi_sections failed!!! ret: %d.\n", ret); - return TEEC_ERROR_GENERIC; + if (write_table_flag == 1) { + ret = rkss_write_multi_sections(table_data, 0, RKSS_PARTITION_TABLE_COUNT); + if (ret < 0) { + printf("TEEC: rkss_write_multi_sections failed!!! ret: %d.\n", ret); + return TEEC_ERROR_GENERIC; + } } debug("TEEC: verify ptable success.\n"); return TEEC_SUCCESS; diff --git a/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c b/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c index ff34e4e..d204a31 100644 --- a/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c +++ b/u-boot/lib/optee_clientApi/OpteeClientRkNewFs_v2.c @@ -1384,7 +1384,6 @@ case OPTEE_MRF_CLOSE: debug(">>>>>>> [%d] OPTEE_MRF_CLOSE!\n", rkss_step++); ret = ree_fs_new_close(num_params, params); - rkss_storage_write(); break; case OPTEE_MRF_READ: debug(">>>>>>> [%d] OPTEE_MRF_READ!\n", rkss_step++); @@ -1401,12 +1400,10 @@ case OPTEE_MRF_REMOVE: debug(">>>>>>> [%d] OPTEE_MRF_REMOVE!\n", rkss_step++); ret = ree_fs_new_remove(num_params, params); - rkss_storage_write(); break; case OPTEE_MRF_RENAME: debug(">>>>>>> [%d] OPTEE_MRF_RENAME!\n", rkss_step++); ret = ree_fs_new_rename(num_params, params); - rkss_storage_write(); break; case OPTEE_MRF_OPENDIR: debug(">>>>>>> [%d] OPTEE_MRF_OPENDIR!\n", rkss_step++); @@ -1424,5 +1421,6 @@ ret = TEEC_ERROR_BAD_PARAMETERS; break; } + rkss_storage_write(); return ret; } diff --git a/u-boot/lib/rsa/rsa-sign.c b/u-boot/lib/rsa/rsa-sign.c index fed64d5..71a940c 100644 --- a/u-boot/lib/rsa/rsa-sign.c +++ b/u-boot/lib/rsa/rsa-sign.c @@ -610,7 +610,7 @@ BIGNUM **modulusp, BIGNUM **exponent_BN, BIGNUM **r_squaredp, BIGNUM **c_factorp, BIGNUM **np_factorp) { - BIGNUM *big1, *big2, *big32, *big2_32, *big4100, *big2180; + BIGNUM *big1, *big2, *big32, *big2_32, *big4100, *big2180, *big4228; BIGNUM *n, *e, *r, *r_squared, *tmp, *c_factor, *np_factor; const BIGNUM *key_n, *key_e; BN_CTX *bn_ctx = BN_CTX_new(); @@ -622,6 +622,7 @@ big32 = BN_new(); big4100 = BN_new(); big2180 = BN_new(); + big4228 = BN_new(); r = BN_new(); r_squared = BN_new(); @@ -631,7 +632,7 @@ big2_32 = BN_new(); n = BN_new(); e = BN_new(); - if (!big1 || !big2 || !big32 || !big4100 || !big2180 || !r || + if (!big1 || !big2 || !big32 || !big4100 || !big2180 || !big4228 || !r || !r_squared || !tmp || !big2_32 || !n || !e || !c_factor || !np_factor) { fprintf(stderr, "Out of memory (bignum)\n"); @@ -645,7 +646,8 @@ if (!BN_copy(n, key_n) || !BN_copy(e, key_e) || !BN_set_word(big1, 1L) || !BN_set_word(big2, 2L) || !BN_set_word(big32, 32L) || - !BN_set_word(big4100, 4100L) || !BN_set_word(big2180, 2180L)) + !BN_set_word(big4100, 4100L) || !BN_set_word(big2180, 2180L) || + !BN_set_word(big4228, 4228L)) ret = -1; /* big2_32 = 2^32 */ @@ -675,9 +677,15 @@ ret = -1; /* Calculate np_factor = 2^2180 div n */ - if (!BN_exp(tmp, big2, big2180, bn_ctx) || - !BN_div(np_factor, NULL, tmp, n, bn_ctx)) - ret = -1; + if (BN_num_bits(n) == 2048) { + if (!BN_exp(tmp, big2, big2180, bn_ctx) || + !BN_div(np_factor, NULL, tmp, n, bn_ctx)) + ret = -1; + } else {/* Calculate 4096 np_factor = 2^4228 div n */ + if (!BN_exp(tmp, big2, big4228, bn_ctx) || + !BN_div(np_factor, NULL, tmp, n, bn_ctx)) + ret = -1; + } *modulusp = n; *exponent_BN = e; @@ -690,6 +698,7 @@ BN_free(big32); BN_free(big4100); BN_free(big2180); + BN_free(big4228); BN_free(r); BN_free(tmp); BN_free(big2_32); diff --git a/u-boot/lib/rsa/rsa-verify.c b/u-boot/lib/rsa/rsa-verify.c index 18b9ff9..fe15293 100644 --- a/u-boot/lib/rsa/rsa-verify.c +++ b/u-boot/lib/rsa/rsa-verify.c @@ -86,11 +86,17 @@ uint8_t buf[sig_len]; rsa_key rsa_key; int i, ret; +#ifdef CONFIG_FIT_ENABLE_RSA4096_SUPPORT + if (key_len != RSA4096_BYTES) + return -EINVAL; + rsa_key.algo = CRYPTO_RSA4096; +#else if (key_len != RSA2048_BYTES) return -EINVAL; rsa_key.algo = CRYPTO_RSA2048; +#endif rsa_key.n = malloc(key_len); rsa_key.e = malloc(key_len); rsa_key.c = malloc(key_len); @@ -599,7 +605,7 @@ struct udevice *dev; struct key_prop prop; char name[100] = {0}; - u16 secure_boot_enable = 0; + u16 secure_flags = 0; const void *blob = info->fdt_blob; uint8_t digest[FIT_MAX_HASH_LEN]; uint8_t digest_read[FIT_MAX_HASH_LEN]; @@ -610,11 +616,11 @@ return -ENODEV; ret = misc_otp_read(dev, OTP_SECURE_BOOT_ENABLE_ADDR, - &secure_boot_enable, OTP_SECURE_BOOT_ENABLE_SIZE); + &secure_flags, OTP_SECURE_BOOT_ENABLE_SIZE); if (ret) return ret; - if (secure_boot_enable) + if (secure_flags == 0xff) return 0; sig_node = fdt_subnode_offset(blob, 0, FIT_SIG_NODENAME); @@ -701,9 +707,9 @@ goto error; } - secure_boot_enable = 0xff; + secure_flags = 0xff; ret = misc_otp_write(dev, OTP_SECURE_BOOT_ENABLE_ADDR, - &secure_boot_enable, OTP_SECURE_BOOT_ENABLE_SIZE); + &secure_flags, OTP_SECURE_BOOT_ENABLE_SIZE); if (ret) goto error; diff --git a/u-boot/lib/sha1.c b/u-boot/lib/sha1.c index f54bb5b..399607a 100644 --- a/u-boot/lib/sha1.c +++ b/u-boot/lib/sha1.c @@ -26,6 +26,15 @@ #include <watchdog.h> #include <u-boot/sha1.h> +#include <linux/compiler.h> + +#ifdef USE_HOSTCC +#undef __weak +#define __weak +#undef __maybe_unused +#define __maybe_unused +#endif + const uint8_t sha1_der_prefix[SHA1_DER_LEN] = { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 @@ -66,7 +75,7 @@ ctx->state[4] = 0xC3D2E1F0; } -static void sha1_process(sha1_context *ctx, const unsigned char data[64]) +static void __maybe_unused sha1_process_one(sha1_context *ctx, const unsigned char data[64]) { unsigned long temp, W[16], A, B, C, D, E; @@ -220,6 +229,18 @@ ctx->state[4] += E; } +__weak void sha1_process(sha1_context *ctx, const unsigned char *data, + unsigned int blocks) +{ + if (!blocks) + return; + + while (blocks--) { + sha1_process_one(ctx, data); + data += 64; + } +} + /* * SHA-1 process buffer */ @@ -243,17 +264,15 @@ if (left && ilen >= fill) { memcpy ((void *) (ctx->buffer + left), (void *) input, fill); - sha1_process (ctx, ctx->buffer); + sha1_process(ctx, ctx->buffer, 1); input += fill; ilen -= fill; left = 0; } - while (ilen >= 64) { - sha1_process (ctx, input); - input += 64; - ilen -= 64; - } + sha1_process(ctx, input, ilen / 64); + input += ilen / 64 * 64; + ilen = ilen % 64; if (ilen > 0) { memcpy ((void *) (ctx->buffer + left), (void *) input, ilen); diff --git a/u-boot/lib/sha256.c b/u-boot/lib/sha256.c index 251825c..ef20b40 100644 --- a/u-boot/lib/sha256.c +++ b/u-boot/lib/sha256.c @@ -15,6 +15,13 @@ #include <watchdog.h> #include <u-boot/sha256.h> +#include <linux/compiler.h> + +#ifdef USE_HOSTCC +#undef __weak +#define __weak +#endif + const uint8_t sha256_der_prefix[SHA256_DER_LEN] = { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, @@ -56,7 +63,7 @@ ctx->state[7] = 0x5BE0CD19; } -static void sha256_process(sha256_context *ctx, const uint8_t data[64]) +static void sha256_process_one(sha256_context *ctx, const uint8_t data[64]) { uint32_t temp1, temp2; uint32_t W[64]; @@ -187,6 +194,18 @@ ctx->state[7] += H; } +__weak void sha256_process(sha256_context *ctx, const unsigned char *data, + unsigned int blocks) +{ + if (!blocks) + return; + + while (blocks--) { + sha256_process_one(ctx, data); + data += 64; + } +} + void sha256_update(sha256_context *ctx, const uint8_t *input, uint32_t length) { uint32_t left, fill; @@ -205,17 +224,15 @@ if (left && length >= fill) { memcpy((void *) (ctx->buffer + left), (void *) input, fill); - sha256_process(ctx, ctx->buffer); + sha256_process(ctx, ctx->buffer, 1); length -= fill; input += fill; left = 0; } - while (length >= 64) { - sha256_process(ctx, input); - length -= 64; - input += 64; - } + sha256_process(ctx, input, length / 64); + input += length / 64 * 64; + length = length % 64; if (length) memcpy((void *) (ctx->buffer + left), (void *) input, length); diff --git a/u-boot/make.sh b/u-boot/make.sh index 233bc9a..de6d978 100755 --- a/u-boot/make.sh +++ b/u-boot/make.sh @@ -13,7 +13,7 @@ ########################################### User can modify ############################################# RKBIN_TOOLS=../rkbin/tools CROSS_COMPILE_ARM32=../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -CROSS_COMPILE_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- +CROSS_COMPILE_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ########################################### User not touch ############################################# # Declare global INI file searching index name for every chip, update in select_chip_info() RKCHIP= @@ -48,6 +48,7 @@ SCRIPT_UBOOT="${SRCTREE}/scripts/uboot.sh" SCRIPT_LOADER="${SRCTREE}/scripts/loader.sh" SCRIPT_DECOMP="${SRCTREE}/scripts/decomp.sh" +SCRIPT_CHECKCONFIG="${SRCTREE}/scripts/check-rkconfig.sh" CC_FILE=".cc" REP_DIR="./rep" ######################################################################################################### @@ -268,7 +269,7 @@ CROSS_COMPILE_ARM64=`cat ${CC_FILE}` else if grep -q '^CONFIG_ARM64=y' .config ; then - CROSS_COMPILE_ARM64=$(cd `dirname ${CROSS_COMPILE_ARM64}`; pwd)"/aarch64-linux-gnu-" + CROSS_COMPILE_ARM64=$(cd `dirname ${CROSS_COMPILE_ARM64}`; pwd)"/aarch64-none-linux-gnu-" else CROSS_COMPILE_ARM32=$(cd `dirname ${CROSS_COMPILE_ARM32}`; pwd)"/arm-linux-gnueabihf-" fi @@ -768,6 +769,9 @@ function finish() { + # check special config + ${SCRIPT_CHECKCONFIG} + echo if [ "${ARG_BOARD}" == "" ]; then echo "Platform ${RKCHIP_LABEL} is build OK, with exist .config" diff --git a/u-boot/scripts/README.rockchip b/u-boot/scripts/README.rockchip index 907e376..8c8ea31 100644 --- a/u-boot/scripts/README.rockchip +++ b/u-boot/scripts/README.rockchip @@ -33,7 +33,7 @@ ./scripts/stacktrace.sh dump.txt tpl # avbtool.py - ./avbtool.py info_image --image vbmeta.img + ./scripts/avbtool.py info_image --image vbmeta.img [tools] # resource_tool diff --git a/u-boot/scripts/android2fit.sh b/u-boot/scripts/android2fit.sh index cb7d2c9..b2ef05c 100755 --- a/u-boot/scripts/android2fit.sh +++ b/u-boot/scripts/android2fit.sh @@ -61,9 +61,9 @@ rm images/ -rf && mkdir -p images/ cp ${OUT}/kernel images/ - cp ${OUT}/resource images/ + cp ${OUT}/resource images/second cp ${OUT}/ramdisk images/ - cp ${OUT}/rk-kernel.dtb images/ + cp ${OUT}/rk-kernel.dtb images/dtb rm ${OUT}/ -rf ./make.sh fit diff --git a/u-boot/scripts/check-rkconfig.sh b/u-boot/scripts/check-rkconfig.sh new file mode 100755 index 0000000..fcf2f55 --- /dev/null +++ b/u-boot/scripts/check-rkconfig.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# +# Copyright (c) 2023 Rockchip Electronics Co., Ltd +# +# SPDX-License-Identifier: GPL-2.0 +# + +set -e + +if [ -f dts/kern.dtb ]; then + if ! grep -Eq 'CONFIG_EMBED_KERNEL_DTB=y' .config ; then + echo "ERROR: dts/kern.dtb was found, but CONFIG_EMBED_KERNEL_DTB is disabled." + exit 1 + fi +fi + +if grep -Eq 'CONFIG_EMBED_KERNEL_DTB=y' .config ; then + KDTB=`sed -n "/CONFIG_EMBED_KERNEL_DTB_PATH=/s/CONFIG_EMBED_KERNEL_DTB_PATH=//p" .config | tr -d '\r' | tr -d '"'` + if [ ! -f ${KDTB} ]; then + echo "ERROR: '${KDTB}' was not found assigned by CONFIG_EMBED_KERNEL_DTB_PATH." + exit 1 + fi +fi diff --git a/u-boot/scripts/fit-core.sh b/u-boot/scripts/fit-core.sh index ecfd40d..1136ecb 100644 --- a/u-boot/scripts/fit-core.sh +++ b/u-boot/scripts/fit-core.sh @@ -18,9 +18,11 @@ SIG_BOOT="${FIT_DIR}/boot.data2sign" SIG_RECOVERY="${FIT_DIR}/recovery.data2sign" # offs -OFFS_DATA="0x1000" -# file -CHIP_FILE="arch/arm/lib/.asm-offsets.s.cmd" +if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then + OFFS_DATA="0x1200" +else + OFFS_DATA="0x1000" +fi # placeholder address FDT_ADDR_PLACEHOLDER="0xffffff00" KERNEL_ADDR_PLACEHOLDER="0xffffff01" @@ -94,6 +96,19 @@ exit 1 fi done +} + +function check_rsa_algo() +{ + if grep -q '^CONFIG_FIT_ENABLE_RSA4096_SUPPORT=y' .config ; then + rsa_algo="rsa4096" + else + rsa_algo="rsa2048" + fi + if ! grep -qr ${rsa_algo} $1 ; then + echo "ERROR: Wrong rsa_algo in its file. It should be ${rsa_algo}." + exit 1 + fi } function check_rsa_keys() @@ -378,6 +393,8 @@ else check_rsa_keys + check_rsa_algo ${ITS_BOOT} + if ! grep -q '^CONFIG_FIT_SIGNATURE=y' .config ; then echo "ERROR: CONFIG_FIT_SIGNATURE is disabled" exit 1 @@ -396,10 +413,9 @@ fi # fixup - COMMON_FILE=`sed -n "/_common.h/p" ${CHIP_FILE} | awk '{ print $1 }'` - FDT_ADDR_R=`awk /fdt_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` - KERNEL_ADDR_R=`awk /kernel_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` - RMADISK_ADDR_R=`awk /ramdisk_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` + FDT_ADDR_R=`strings env/built-in.o | grep 'fdt_addr_r=' | awk -F "=" '{ print $2 }'` + KERNEL_ADDR_R=`strings env/built-in.o | grep 'kernel_addr_r=' | awk -F "=" '{ print $2 }'` + RMADISK_ADDR_R=`strings env/built-in.o | grep 'ramdisk_addr_r=' | awk -F "=" '{ print $2 }'` sed -i "s/${FDT_ADDR_PLACEHOLDER}/${FDT_ADDR_R}/g" ${ITS_BOOT} sed -i "s/${KERNEL_ADDR_PLACEHOLDER}/${KERNEL_ADDR_R}/g" ${ITS_BOOT} sed -i "s/${RAMDISK_ADDR_PLACEHOLDER}/${RMADISK_ADDR_R}/g" ${ITS_BOOT} @@ -464,6 +480,8 @@ else check_rsa_keys + check_rsa_algo ${ITS_RECOVERY} + if ! grep -q '^CONFIG_FIT_SIGNATURE=y' .config ; then echo "ERROR: CONFIG_FIT_SIGNATURE is disabled" exit 1 @@ -482,10 +500,9 @@ fi # fixup - COMMON_FILE=`sed -n "/_common.h/p" ${CHIP_FILE} | awk '{ print $1 }'` - FDT_ADDR_R=`awk /fdt_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` - KERNEL_ADDR_R=`awk /kernel_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` - RMADISK_ADDR_R=`awk /ramdisk_addr_r/ ${COMMON_FILE} | awk -F '=' '{ print $2 }' | awk -F '\\' '{ print $1 }'` + FDT_ADDR_R=`strings env/built-in.o | grep 'fdt_addr_r=' | awk -F "=" '{ print $2 }'` + KERNEL_ADDR_R=`strings env/built-in.o | grep 'kernel_addr_r=' | awk -F "=" '{ print $2 }'` + RMADISK_ADDR_R=`strings env/built-in.o | grep 'ramdisk_addr_r=' | awk -F "=" '{ print $2 }'` sed -i "s/${FDT_ADDR_PLACEHOLDER}/${FDT_ADDR_R}/g" ${ITS_RECOVERY} sed -i "s/${KERNEL_ADDR_PLACEHOLDER}/${KERNEL_ADDR_R}/g" ${ITS_RECOVERY} sed -i "s/${RAMDISK_ADDR_PLACEHOLDER}/${RMADISK_ADDR_R}/g" ${ITS_RECOVERY} diff --git a/u-boot/scripts/setlocalversion b/u-boot/scripts/setlocalversion index a3014ca..6b433f0 100755 --- a/u-boot/scripts/setlocalversion +++ b/u-boot/scripts/setlocalversion @@ -60,8 +60,6 @@ # "v2.6.30-rc5-302-g72357d5"), we pretty print it. if atag="`git describe 2>/dev/null`"; then echo "$atag" | awk -F- '{printf("-%s", $(NF))}' - date=`git log -1 --author='@rock-chips' --date=format:%y%m%d | sed -n '/Date:/p' | awk '{ print "-"$2 }'` - printf '%s' $date # If we don't have a tag at all we print -g{commitish}. else @@ -74,11 +72,16 @@ printf -- '-svn%s' "`git svn find-rev $head`" fi + # Check submit date of the last rockchip commit + date=`git log -1 --author='@rock-chips' --date=format:%y%m%d | sed -n '/Date:/p' | awk '{ print "-"$2 }'` + printf '%s' $date + # Check for uncommitted changes if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then printf '%s' -dirty fi + # Print build user printf ' \#%s' $USER # All done with git diff --git a/u-boot/tools/Makefile b/u-boot/tools/Makefile index 2bc097f..354b449 100644 --- a/u-boot/tools/Makefile +++ b/u-boot/tools/Makefile @@ -59,15 +59,9 @@ # Rockchip pack tools ifdef CONFIG_ARCH_ROCKCHIP -hostprogs-y += boot_merger -hostprogs-y += trust_merger -hostprogs-y += loaderimage hostprogs-y += resource_tool hostprogs-y += bmp2gray16 -boot_merger-objs := rockchip/boot_merger.o rockchip/sha2.o lib/sha256.o -trust_merger-objs := rockchip/trust_merger.o rockchip/sha2.o lib/sha256.o -loaderimage-objs := rockchip/loaderimage.o rockchip/sha.o lib/sha256.o rockchip/crc32_rk.o resource_tool-objs := rockchip/resource_tool.o bmp2gray16-objs := rockchip/bmp2gray16.o endif diff --git a/u-boot/tools/rkcommon.c b/u-boot/tools/rkcommon.c index 7650fa5..dc62d9c 100644 --- a/u-boot/tools/rkcommon.c +++ b/u-boot/tools/rkcommon.c @@ -138,6 +138,8 @@ { "rv1108", "RK11", 0x1800, false, RK_HEADER_V1 }, { "rv1126", "110B", 0x10000 - 0x1000, false, RK_HEADER_V1 }, { "rk1808", "RK18", 0x200000 - 0x2000, false, RK_HEADER_V1 }, + { "rk3528", "RK35", 0x10000 - 0x1000, false, RK_HEADER_V2 }, + { "rk3562", "RK35", 0x10000 - 0x1000, false, RK_HEADER_V2 }, { "rk3568", "RK35", 0x10000 - 0x1000, false, RK_HEADER_V2 }, { "rk3588", "RK35", 0x100000 - 0x1000, false, RK_HEADER_V2 }, }; diff --git a/u-boot/usb_update.txt b/u-boot/usb_update.txt new file mode 100644 index 0000000..fee7683 --- /dev/null +++ b/u-boot/usb_update.txt @@ -0,0 +1,4 @@ +# script file start +echo "this is usb update script!" + +% script file end \ No newline at end of file -- Gitblit v1.6.2